aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/moto
diff options
context:
space:
mode:
authornkozlovskiy <nmk@ydb.tech>2023-09-29 12:24:06 +0300
committernkozlovskiy <nmk@ydb.tech>2023-09-29 12:41:34 +0300
commite0e3e1717e3d33762ce61950504f9637a6e669ed (patch)
treebca3ff6939b10ed60c3d5c12439963a1146b9711 /contrib/python/moto
parent38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff)
downloadydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz
add ydb deps
Diffstat (limited to 'contrib/python/moto')
-rw-r--r--contrib/python/moto/bin/ya.make13
-rw-r--r--contrib/python/moto/py2/moto/__init__.py23
-rw-r--r--contrib/python/moto/py2/moto/backends.py90
-rw-r--r--contrib/python/moto/py2/moto/compat.py5
-rw-r--r--contrib/python/moto/py2/moto/core/__init__.py4
-rw-r--r--contrib/python/moto/py2/moto/core/exceptions.py67
-rw-r--r--contrib/python/moto/py2/moto/core/models.py586
-rw-r--r--contrib/python/moto/py2/moto/core/responses.py852
-rw-r--r--contrib/python/moto/py2/moto/core/urls.py14
-rw-r--r--contrib/python/moto/py2/moto/core/utils.py299
-rw-r--r--contrib/python/moto/py2/moto/ec2/__init__.py7
-rw-r--r--contrib/python/moto/py2/moto/ec2/exceptions.py422
-rw-r--r--contrib/python/moto/py2/moto/ec2/models.py4008
-rw-r--r--contrib/python/moto/py2/moto/ec2/resources/amis.json580
-rw-r--r--contrib/python/moto/py2/moto/ec2/resources/instance_types.json1
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/__init__.py79
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/account_attributes.py69
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/amazon_dev_pay.py9
-rwxr-xr-xcontrib/python/moto/py2/moto/ec2/responses/amis.py185
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/availability_zones_and_regions.py43
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/customer_gateways.py84
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/dhcp_options.py147
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/elastic_block_store.py323
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/elastic_ip_addresses.py148
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/elastic_network_interfaces.py214
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/general.py32
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/instances.py681
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/internet_gateways.py118
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/ip_addresses.py16
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/key_pairs.py69
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/monitoring.py15
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/nat_gateways.py74
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/network_acls.py195
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/placement_groups.py19
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/reserved_instances.py32
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/route_tables.py233
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/security_groups.py253
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/spot_fleets.py161
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/spot_instances.py233
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/subnets.py105
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/tags.py56
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/virtual_private_gateways.py124
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/vm_export.py17
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/vm_import.py21
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/vpc_peering_connections.py140
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/vpcs.py247
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/vpn_connections.py324
-rw-r--r--contrib/python/moto/py2/moto/ec2/responses/windows.py21
-rw-r--r--contrib/python/moto/py2/moto/ec2/urls.py11
-rw-r--r--contrib/python/moto/py2/moto/ec2/utils.py537
-rw-r--r--contrib/python/moto/py2/moto/iam/__init__.py6
-rw-r--r--contrib/python/moto/py2/moto/iam/aws_managed_policies.py12944
-rw-r--r--contrib/python/moto/py2/moto/iam/exceptions.py26
-rw-r--r--contrib/python/moto/py2/moto/iam/models.py941
-rw-r--r--contrib/python/moto/py2/moto/iam/responses.py1487
-rw-r--r--contrib/python/moto/py2/moto/iam/urls.py10
-rw-r--r--contrib/python/moto/py2/moto/iam/utils.py34
-rw-r--r--contrib/python/moto/py2/moto/instance_metadata/__init__.py4
-rw-r--r--contrib/python/moto/py2/moto/instance_metadata/models.py8
-rw-r--r--contrib/python/moto/py2/moto/instance_metadata/responses.py49
-rw-r--r--contrib/python/moto/py2/moto/instance_metadata/urls.py12
-rw-r--r--contrib/python/moto/py2/moto/kms/__init__.py7
-rw-r--r--contrib/python/moto/py2/moto/kms/models.py175
-rw-r--r--contrib/python/moto/py2/moto/kms/responses.py297
-rw-r--r--contrib/python/moto/py2/moto/kms/urls.py10
-rw-r--r--contrib/python/moto/py2/moto/kms/utils.py7
-rw-r--r--contrib/python/moto/py2/moto/packages/__init__.py0
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/__init__.py61
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/compat.py103
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/core.py1116
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/errors.py40
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/http.py154
-rw-r--r--contrib/python/moto/py2/moto/packages/httpretty/utils.py48
-rw-r--r--contrib/python/moto/py2/moto/route53/__init__.py6
-rw-r--r--contrib/python/moto/py2/moto/route53/models.py314
-rw-r--r--contrib/python/moto/py2/moto/route53/responses.py369
-rw-r--r--contrib/python/moto/py2/moto/route53/urls.py26
-rw-r--r--contrib/python/moto/py2/moto/s3/__init__.py6
-rw-r--r--contrib/python/moto/py2/moto/s3/exceptions.py201
-rw-r--r--contrib/python/moto/py2/moto/s3/models.py997
-rw-r--r--contrib/python/moto/py2/moto/s3/responses.py1697
-rw-r--r--contrib/python/moto/py2/moto/s3/urls.py27
-rw-r--r--contrib/python/moto/py2/moto/s3/utils.py145
-rw-r--r--contrib/python/moto/py2/moto/s3bucket_path/__init__.py1
-rw-r--r--contrib/python/moto/py2/moto/s3bucket_path/utils.py24
-rw-r--r--contrib/python/moto/py2/moto/server.py231
-rw-r--r--contrib/python/moto/py2/moto/settings.py3
-rw-r--r--contrib/python/moto/py2/moto/sts/__init__.py6
-rw-r--r--contrib/python/moto/py2/moto/sts/models.py50
-rw-r--r--contrib/python/moto/py2/moto/sts/responses.py113
-rw-r--r--contrib/python/moto/py2/moto/sts/urls.py10
-rw-r--r--contrib/python/moto/py2/ya.make129
-rw-r--r--contrib/python/moto/py3/.dist-info/METADATA275
-rw-r--r--contrib/python/moto/py3/.dist-info/entry_points.txt2
-rw-r--r--contrib/python/moto/py3/.dist-info/top_level.txt1
-rw-r--r--contrib/python/moto/py3/AUTHORS.md64
-rw-r--r--contrib/python/moto/py3/LICENSE202
-rw-r--r--contrib/python/moto/py3/README.md68
-rw-r--r--contrib/python/moto/py3/moto/__init__.py225
-rw-r--r--contrib/python/moto/py3/moto/acm/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/acm/models.py581
-rw-r--r--contrib/python/moto/py3/moto/acm/responses.py259
-rw-r--r--contrib/python/moto/py3/moto/acm/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/acm/utils.py9
-rw-r--r--contrib/python/moto/py3/moto/apigateway/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/apigateway/exceptions.py285
-rw-r--r--contrib/python/moto/py3/moto/apigateway/integration_parsers/__init__.py7
-rw-r--r--contrib/python/moto/py3/moto/apigateway/integration_parsers/aws_parser.py26
-rw-r--r--contrib/python/moto/py3/moto/apigateway/integration_parsers/http_parser.py15
-rw-r--r--contrib/python/moto/py3/moto/apigateway/integration_parsers/unknown_parser.py11
-rw-r--r--contrib/python/moto/py3/moto/apigateway/models.py2098
-rw-r--r--contrib/python/moto/py3/moto/apigateway/responses.py829
-rw-r--r--contrib/python/moto/py3/moto/apigateway/urls.py45
-rw-r--r--contrib/python/moto/py3/moto/apigateway/utils.py26
-rw-r--r--contrib/python/moto/py3/moto/apigatewayv2/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/apigatewayv2/exceptions.py95
-rw-r--r--contrib/python/moto/py3/moto/apigatewayv2/models.py1475
-rw-r--r--contrib/python/moto/py3/moto/apigatewayv2/responses.py751
-rw-r--r--contrib/python/moto/py3/moto/apigatewayv2/urls.py32
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/exceptions.py6
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/models.py488
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/responses.py234
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/urls.py7
-rw-r--r--contrib/python/moto/py3/moto/applicationautoscaling/utils.py10
-rw-r--r--contrib/python/moto/py3/moto/appsync/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/appsync/exceptions.py14
-rw-r--r--contrib/python/moto/py3/moto/appsync/models.py305
-rw-r--r--contrib/python/moto/py3/moto/appsync/responses.py230
-rw-r--r--contrib/python/moto/py3/moto/appsync/urls.py20
-rw-r--r--contrib/python/moto/py3/moto/athena/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/athena/exceptions.py17
-rw-r--r--contrib/python/moto/py3/moto/athena/models.py187
-rw-r--r--contrib/python/moto/py3/moto/athena/responses.py146
-rw-r--r--contrib/python/moto/py3/moto/athena/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/athena/utils.py0
-rw-r--r--contrib/python/moto/py3/moto/autoscaling/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/autoscaling/exceptions.py27
-rw-r--r--contrib/python/moto/py3/moto/autoscaling/models.py1271
-rw-r--r--contrib/python/moto/py3/moto/autoscaling/responses.py1221
-rw-r--r--contrib/python/moto/py3/moto/autoscaling/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/awslambda/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/awslambda/exceptions.py66
-rw-r--r--contrib/python/moto/py3/moto/awslambda/models.py1669
-rw-r--r--contrib/python/moto/py3/moto/awslambda/policy.py143
-rw-r--r--contrib/python/moto/py3/moto/awslambda/responses.py541
-rw-r--r--contrib/python/moto/py3/moto/awslambda/urls.py28
-rw-r--r--contrib/python/moto/py3/moto/awslambda/utils.py34
-rw-r--r--contrib/python/moto/py3/moto/backend_index.py164
-rw-r--r--contrib/python/moto/py3/moto/backends.py58
-rw-r--r--contrib/python/moto/py3/moto/batch/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/batch/exceptions.py23
-rw-r--r--contrib/python/moto/py3/moto/batch/models.py1621
-rw-r--r--contrib/python/moto/py3/moto/batch/responses.py269
-rw-r--r--contrib/python/moto/py3/moto/batch/urls.py24
-rw-r--r--contrib/python/moto/py3/moto/batch/utils.py31
-rw-r--r--contrib/python/moto/py3/moto/batch_simple/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/batch_simple/models.py82
-rw-r--r--contrib/python/moto/py3/moto/batch_simple/responses.py12
-rw-r--r--contrib/python/moto/py3/moto/batch_simple/urls.py6
-rw-r--r--contrib/python/moto/py3/moto/budgets/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/budgets/exceptions.py29
-rw-r--r--contrib/python/moto/py3/moto/budgets/models.py129
-rw-r--r--contrib/python/moto/py3/moto/budgets/responses.py68
-rw-r--r--contrib/python/moto/py3/moto/budgets/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/custom_model.py95
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/exceptions.py62
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/models.py923
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/parsing.py866
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/responses.py1282
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/cloudformation/utils.py92
-rw-r--r--contrib/python/moto/py3/moto/cloudfront/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/cloudfront/exceptions.py81
-rw-r--r--contrib/python/moto/py3/moto/cloudfront/models.py258
-rw-r--r--contrib/python/moto/py3/moto/cloudfront/responses.py526
-rw-r--r--contrib/python/moto/py3/moto/cloudfront/urls.py14
-rw-r--r--contrib/python/moto/py3/moto/cloudtrail/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/cloudtrail/exceptions.py72
-rw-r--r--contrib/python/moto/py3/moto/cloudtrail/models.py407
-rw-r--r--contrib/python/moto/py3/moto/cloudtrail/responses.py190
-rw-r--r--contrib/python/moto/py3/moto/cloudtrail/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/exceptions.py43
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/models.py706
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/responses.py737
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/cloudwatch/utils.py6
-rw-r--r--contrib/python/moto/py3/moto/codecommit/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/codecommit/exceptions.py35
-rw-r--r--contrib/python/moto/py3/moto/codecommit/models.py74
-rw-r--r--contrib/python/moto/py3/moto/codecommit/responses.py56
-rw-r--r--contrib/python/moto/py3/moto/codecommit/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/codepipeline/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/codepipeline/exceptions.py38
-rw-r--r--contrib/python/moto/py3/moto/codepipeline/models.py215
-rw-r--r--contrib/python/moto/py3/moto/codepipeline/responses.py62
-rw-r--r--contrib/python/moto/py3/moto/codepipeline/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/exceptions.py25
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/models.py196
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/responses.py83
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/cognitoidentity/utils.py5
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/exceptions.py67
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/models.py1863
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/resources/jwks-private.json9
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/resources/jwks-public.json12
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/responses.py640
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/cognitoidp/utils.py68
-rw-r--r--contrib/python/moto/py3/moto/config/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/config/exceptions.py377
-rw-r--r--contrib/python/moto/py3/moto/config/models.py1934
-rw-r--r--contrib/python/moto/py3/moto/config/resources/aws_managed_rules.json2310
-rw-r--r--contrib/python/moto/py3/moto/config/responses.py236
-rw-r--r--contrib/python/moto/py3/moto/config/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/core/__init__.py10
-rw-r--r--contrib/python/moto/py3/moto/core/base_backend.py166
-rw-r--r--contrib/python/moto/py3/moto/core/botocore_stubber.py65
-rw-r--r--contrib/python/moto/py3/moto/core/common_models.py176
-rw-r--r--contrib/python/moto/py3/moto/core/custom_responses_mock.py189
-rw-r--r--contrib/python/moto/py3/moto/core/exceptions.py159
-rw-r--r--contrib/python/moto/py3/moto/core/models.py405
-rw-r--r--contrib/python/moto/py3/moto/core/responses.py1054
-rw-r--r--contrib/python/moto/py3/moto/core/responses_custom_registry.py40
-rw-r--r--contrib/python/moto/py3/moto/core/utils.py534
-rw-r--r--contrib/python/moto/py3/moto/databrew/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/databrew/exceptions.py53
-rw-r--r--contrib/python/moto/py3/moto/databrew/models.py463
-rw-r--r--contrib/python/moto/py3/moto/databrew/responses.py300
-rw-r--r--contrib/python/moto/py3/moto/databrew/urls.py15
-rw-r--r--contrib/python/moto/py3/moto/datapipeline/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/datapipeline/models.py153
-rw-r--r--contrib/python/moto/py3/moto/datapipeline/responses.py108
-rw-r--r--contrib/python/moto/py3/moto/datapipeline/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/datapipeline/utils.py22
-rw-r--r--contrib/python/moto/py3/moto/datasync/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/datasync/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/datasync/models.py229
-rw-r--r--contrib/python/moto/py3/moto/datasync/responses.py160
-rw-r--r--contrib/python/moto/py3/moto/datasync/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/dax/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/dax/exceptions.py13
-rw-r--r--contrib/python/moto/py3/moto/dax/models.py262
-rw-r--r--contrib/python/moto/py3/moto/dax/responses.py112
-rw-r--r--contrib/python/moto/py3/moto/dax/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/dax/utils.py8
-rw-r--r--contrib/python/moto/py3/moto/dms/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/dms/exceptions.py20
-rw-r--r--contrib/python/moto/py3/moto/dms/models.py190
-rw-r--r--contrib/python/moto/py3/moto/dms/responses.py66
-rw-r--r--contrib/python/moto/py3/moto/dms/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/dms/utils.py46
-rw-r--r--contrib/python/moto/py3/moto/ds/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ds/exceptions.py105
-rw-r--r--contrib/python/moto/py3/moto/ds/models.py505
-rw-r--r--contrib/python/moto/py3/moto/ds/responses.py163
-rw-r--r--contrib/python/moto/py3/moto/ds/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/ds/utils.py16
-rw-r--r--contrib/python/moto/py3/moto/ds/validations.py147
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/comparisons.py1222
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/exceptions.py318
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/limits.py5
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/models/__init__.py1867
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/models/dynamo_type.py240
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/models/utilities.py2
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/ast_nodes.py370
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/executors.py298
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/expressions.py1043
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.py27
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.txt573
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/tokens.py215
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/parsing/validators.py415
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/responses.py1070
-rw-r--r--contrib/python/moto/py3/moto/dynamodb/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/dynamodb_v20111205/__init__.py9
-rw-r--r--contrib/python/moto/py3/moto/dynamodb_v20111205/comparisons.py22
-rw-r--r--contrib/python/moto/py3/moto/dynamodb_v20111205/models.py400
-rw-r--r--contrib/python/moto/py3/moto/dynamodb_v20111205/responses.py294
-rw-r--r--contrib/python/moto/py3/moto/dynamodb_v20111205/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/dynamodbstreams/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/dynamodbstreams/models.py135
-rw-r--r--contrib/python/moto/py3/moto/dynamodbstreams/responses.py37
-rw-r--r--contrib/python/moto/py3/moto/dynamodbstreams/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/ebs/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ebs/models.py124
-rw-r--r--contrib/python/moto/py3/moto/ebs/responses.py146
-rw-r--r--contrib/python/moto/py3/moto/ebs/urls.py16
-rw-r--r--contrib/python/moto/py3/moto/ec2/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ec2/exceptions.py773
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/__init__.py247
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/amis.py331
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/availability_zones_and_regions.py314
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/carrier_gateways.py65
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/core.py39
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/customer_gateways.py92
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/dhcp_options.py132
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/elastic_block_store.py420
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/elastic_ip_addresses.py242
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/elastic_network_interfaces.py395
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/flow_logs.py299
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/iam_instance_profile.py124
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/instance_types.py71
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/instances.py847
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/internet_gateways.py166
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/key_pairs.py80
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/launch_templates.py119
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/managed_prefixes.py170
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/nat_gateways.py144
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/network_acls.py273
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/route_tables.py442
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/security_groups.py1121
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/spot_requests.py507
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/subnets.py443
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/tags.py126
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/transit_gateway.py119
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/transit_gateway_attachments.py320
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/transit_gateway_route_tables.py360
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/vpc_peering_connections.py164
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/vpc_service_configuration.py131
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/vpcs.py782
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/vpn_connections.py96
-rw-r--r--contrib/python/moto/py3/moto/ec2/models/vpn_gateway.py161
-rw-r--r--contrib/python/moto/py3/moto/ec2/regions.py0
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/amis.json682
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json1370
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-east-1.json1754
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json4418
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json3586
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-3.json1066
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json3630
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json4526
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json4006
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json2870
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json4262
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json1798
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json2018
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json5670
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json3438
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json2846
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-south-1.json1506
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json3006
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json9362
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json4802
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json2530
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json6894
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json1370
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-east-1.json1754
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json4418
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json3586
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-3.json1066
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json3630
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json4526
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json4006
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-3.json1
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json2870
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json4262
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json1798
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json2018
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json5670
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json3438
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json2846
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/me-south-1.json1506
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json3006
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json9362
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json4802
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json2530
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json6894
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/af-south-1.json478
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-east-1.json594
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json1678
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json1210
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-3.json474
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json1290
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json1622
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json1418
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-3.json1
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ca-central-1.json1118
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json1518
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json610
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json690
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json1950
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json1190
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json966
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/me-south-1.json518
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json1142
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-1.json1982
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-2.json1658
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-1.json1266
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-2.json1970
-rw-r--r--contrib/python/moto/py3/moto/ec2/resources/instance_types.json46518
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/__init__.py97
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/_base_response.py16
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/account_attributes.py67
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/amazon_dev_pay.py8
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/amis.py200
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/availability_zones_and_regions.py45
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/carrier_gateways.py94
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/customer_gateways.py85
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/dhcp_options.py142
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/egress_only_internet_gateways.py84
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/elastic_block_store.py404
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/elastic_ip_addresses.py178
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/elastic_network_interfaces.py412
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/flow_logs.py120
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/general.py30
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/iam_instance_profiles.py88
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/instances.py930
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/internet_gateways.py116
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/ip_addresses.py15
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/key_pairs.py66
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/launch_templates.py307
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/monitoring.py15
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/nat_gateways.py122
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/network_acls.py210
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/placement_groups.py20
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/reserved_instances.py36
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/route_tables.py328
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/security_groups.py570
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/settings.py47
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/spot_fleets.py174
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/spot_instances.py257
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/subnets.py210
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/tags.py53
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/transit_gateway_attachments.py477
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/transit_gateway_route_tables.py263
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/transit_gateways.py174
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/virtual_private_gateways.py129
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vm_export.py16
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vm_import.py19
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vpc_peering_connections.py245
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vpc_service_configuration.py223
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vpcs.py871
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/vpn_connections.py250
-rw-r--r--contrib/python/moto/py3/moto/ec2/responses/windows.py17
-rw-r--r--contrib/python/moto/py3/moto/ec2/urls.py6
-rw-r--r--contrib/python/moto/py3/moto/ec2/utils.py788
-rw-r--r--contrib/python/moto/py3/moto/ec2instanceconnect/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/ec2instanceconnect/models.py13
-rw-r--r--contrib/python/moto/py3/moto/ec2instanceconnect/responses.py11
-rw-r--r--contrib/python/moto/py3/moto/ec2instanceconnect/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/ecr/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ecr/exceptions.py133
-rw-r--r--contrib/python/moto/py3/moto/ecr/models.py952
-rw-r--r--contrib/python/moto/py3/moto/ecr/policy_validation.py233
-rw-r--r--contrib/python/moto/py3/moto/ecr/responses.py315
-rw-r--r--contrib/python/moto/py3/moto/ecr/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/ecs/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ecs/exceptions.py67
-rw-r--r--contrib/python/moto/py3/moto/ecs/models.py1866
-rw-r--r--contrib/python/moto/py3/moto/ecs/responses.py492
-rw-r--r--contrib/python/moto/py3/moto/ecs/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/efs/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/efs/exceptions.py109
-rw-r--r--contrib/python/moto/py3/moto/efs/models.py663
-rw-r--r--contrib/python/moto/py3/moto/efs/responses.py188
-rw-r--r--contrib/python/moto/py3/moto/efs/urls.py24
-rw-r--r--contrib/python/moto/py3/moto/eks/__init__.py6
-rw-r--r--contrib/python/moto/py3/moto/eks/exceptions.py34
-rw-r--r--contrib/python/moto/py3/moto/eks/models.py710
-rw-r--r--contrib/python/moto/py3/moto/eks/responses.py192
-rw-r--r--contrib/python/moto/py3/moto/eks/urls.py18
-rw-r--r--contrib/python/moto/py3/moto/eks/utils.py48
-rw-r--r--contrib/python/moto/py3/moto/elasticache/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/elasticache/exceptions.py63
-rw-r--r--contrib/python/moto/py3/moto/elasticache/models.py90
-rw-r--r--contrib/python/moto/py3/moto/elasticache/responses.py119
-rw-r--r--contrib/python/moto/py3/moto/elasticache/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/models.py137
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/responses.py1386
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/urls.py9
-rw-r--r--contrib/python/moto/py3/moto/elasticbeanstalk/utils.py11
-rw-r--r--contrib/python/moto/py3/moto/elastictranscoder/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/elastictranscoder/models.py115
-rw-r--r--contrib/python/moto/py3/moto/elastictranscoder/responses.py131
-rw-r--r--contrib/python/moto/py3/moto/elastictranscoder/urls.py14
-rw-r--r--contrib/python/moto/py3/moto/elb/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/elb/exceptions.py86
-rw-r--r--contrib/python/moto/py3/moto/elb/models.py613
-rw-r--r--contrib/python/moto/py3/moto/elb/policies.py24
-rw-r--r--contrib/python/moto/py3/moto/elb/responses.py893
-rw-r--r--contrib/python/moto/py3/moto/elb/urls.py39
-rw-r--r--contrib/python/moto/py3/moto/elbv2/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/elbv2/exceptions.py187
-rw-r--r--contrib/python/moto/py3/moto/elbv2/models.py1650
-rw-r--r--contrib/python/moto/py3/moto/elbv2/responses.py1730
-rw-r--r--contrib/python/moto/py3/moto/elbv2/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/elbv2/utils.py10
-rw-r--r--contrib/python/moto/py3/moto/emr/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/emr/exceptions.py16
-rw-r--r--contrib/python/moto/py3/moto/emr/models.py707
-rw-r--r--contrib/python/moto/py3/moto/emr/responses.py1414
-rw-r--r--contrib/python/moto/py3/moto/emr/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/emr/utils.py458
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/__init__.py6
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/exceptions.py9
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/models.py369
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/responses.py139
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/urls.py14
-rw-r--r--contrib/python/moto/py3/moto/emrcontainers/utils.py50
-rw-r--r--contrib/python/moto/py3/moto/es/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/es/exceptions.py25
-rw-r--r--contrib/python/moto/py3/moto/es/models.py141
-rw-r--r--contrib/python/moto/py3/moto/es/responses.py94
-rw-r--r--contrib/python/moto/py3/moto/es/urls.py12
-rw-r--r--contrib/python/moto/py3/moto/events/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/events/exceptions.py40
-rw-r--r--contrib/python/moto/py3/moto/events/models.py1830
-rw-r--r--contrib/python/moto/py3/moto/events/notifications.py67
-rw-r--r--contrib/python/moto/py3/moto/events/responses.py514
-rw-r--r--contrib/python/moto/py3/moto/events/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/events/utils.py16
-rw-r--r--contrib/python/moto/py3/moto/firehose/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/firehose/exceptions.py56
-rw-r--r--contrib/python/moto/py3/moto/firehose/models.py668
-rw-r--r--contrib/python/moto/py3/moto/firehose/responses.py110
-rw-r--r--contrib/python/moto/py3/moto/firehose/urls.py6
-rw-r--r--contrib/python/moto/py3/moto/forecast/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/forecast/exceptions.py25
-rw-r--r--contrib/python/moto/py3/moto/forecast/models.py162
-rw-r--r--contrib/python/moto/py3/moto/forecast/responses.py77
-rw-r--r--contrib/python/moto/py3/moto/forecast/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/glacier/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/glacier/models.py232
-rw-r--r--contrib/python/moto/py3/moto/glacier/responses.py163
-rw-r--r--contrib/python/moto/py3/moto/glacier/urls.py15
-rw-r--r--contrib/python/moto/py3/moto/glacier/utils.py12
-rw-r--r--contrib/python/moto/py3/moto/glue/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/glue/exceptions.py99
-rw-r--r--contrib/python/moto/py3/moto/glue/models.py632
-rw-r--r--contrib/python/moto/py3/moto/glue/responses.py454
-rw-r--r--contrib/python/moto/py3/moto/glue/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/glue/utils.py354
-rw-r--r--contrib/python/moto/py3/moto/greengrass/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/greengrass/models.py99
-rw-r--r--contrib/python/moto/py3/moto/greengrass/responses.py31
-rw-r--r--contrib/python/moto/py3/moto/greengrass/urls.py14
-rw-r--r--contrib/python/moto/py3/moto/guardduty/__init__.py7
-rw-r--r--contrib/python/moto/py3/moto/guardduty/exceptions.py31
-rw-r--r--contrib/python/moto/py3/moto/guardduty/models.py200
-rw-r--r--contrib/python/moto/py3/moto/guardduty/responses.py156
-rw-r--r--contrib/python/moto/py3/moto/guardduty/urls.py18
-rw-r--r--contrib/python/moto/py3/moto/iam/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/iam/access_control.py402
-rw-r--r--contrib/python/moto/py3/moto/iam/aws_managed_policies.py65212
-rw-r--r--contrib/python/moto/py3/moto/iam/config.py321
-rw-r--r--contrib/python/moto/py3/moto/iam/exceptions.py142
-rw-r--r--contrib/python/moto/py3/moto/iam/models.py2927
-rw-r--r--contrib/python/moto/py3/moto/iam/policy_validation.py523
-rw-r--r--contrib/python/moto/py3/moto/iam/responses.py2760
-rw-r--r--contrib/python/moto/py3/moto/iam/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/iam/utils.py27
-rw-r--r--contrib/python/moto/py3/moto/instance_metadata/__init__.py3
-rw-r--r--contrib/python/moto/py3/moto/instance_metadata/models.py8
-rw-r--r--contrib/python/moto/py3/moto/instance_metadata/responses.py46
-rw-r--r--contrib/python/moto/py3/moto/instance_metadata/urls.py7
-rw-r--r--contrib/python/moto/py3/moto/iot/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/iot/exceptions.py84
-rw-r--r--contrib/python/moto/py3/moto/iot/models.py1684
-rw-r--r--contrib/python/moto/py3/moto/iot/responses.py772
-rw-r--r--contrib/python/moto/py3/moto/iot/urls.py24
-rw-r--r--contrib/python/moto/py3/moto/iot/utils.py8
-rw-r--r--contrib/python/moto/py3/moto/iotdata/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/iotdata/exceptions.py25
-rw-r--r--contrib/python/moto/py3/moto/iotdata/models.py197
-rw-r--r--contrib/python/moto/py3/moto/iotdata/responses.py46
-rw-r--r--contrib/python/moto/py3/moto/iotdata/urls.py27
-rw-r--r--contrib/python/moto/py3/moto/kinesis/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/kinesis/exceptions.py80
-rw-r--r--contrib/python/moto/py3/moto/kinesis/models.py793
-rw-r--r--contrib/python/moto/py3/moto/kinesis/responses.py278
-rw-r--r--contrib/python/moto/py3/moto/kinesis/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/kinesis/utils.py61
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideo/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideo/exceptions.py20
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideo/models.py134
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideo/responses.py54
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideo/urls.py17
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/exceptions.py1
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/models.py43
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/responses.py40
-rw-r--r--contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/urls.py13
-rw-r--r--contrib/python/moto/py3/moto/kms/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/kms/exceptions.py49
-rw-r--r--contrib/python/moto/py3/moto/kms/models.py520
-rw-r--r--contrib/python/moto/py3/moto/kms/responses.py605
-rw-r--r--contrib/python/moto/py3/moto/kms/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/kms/utils.py182
-rw-r--r--contrib/python/moto/py3/moto/logs/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/logs/exceptions.py39
-rw-r--r--contrib/python/moto/py3/moto/logs/metric_filters.py65
-rw-r--r--contrib/python/moto/py3/moto/logs/models.py950
-rw-r--r--contrib/python/moto/py3/moto/logs/responses.py391
-rw-r--r--contrib/python/moto/py3/moto/logs/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/logs/utils.py15
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/exceptions.py89
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/models.py1084
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/responses.py417
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/urls.py21
-rw-r--r--contrib/python/moto/py3/moto/managedblockchain/utils.py145
-rw-r--r--contrib/python/moto/py3/moto/mediaconnect/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/mediaconnect/exceptions.py8
-rw-r--r--contrib/python/moto/py3/moto/mediaconnect/models.py247
-rw-r--r--contrib/python/moto/py3/moto/mediaconnect/responses.py113
-rw-r--r--contrib/python/moto/py3/moto/mediaconnect/urls.py21
-rw-r--r--contrib/python/moto/py3/moto/medialive/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/medialive/exceptions.py0
-rw-r--r--contrib/python/moto/py3/moto/medialive/models.py289
-rw-r--r--contrib/python/moto/py3/moto/medialive/responses.py151
-rw-r--r--contrib/python/moto/py3/moto/medialive/urls.py18
-rw-r--r--contrib/python/moto/py3/moto/mediapackage/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/mediapackage/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/mediapackage/models.py218
-rw-r--r--contrib/python/moto/py3/moto/mediapackage/responses.py114
-rw-r--r--contrib/python/moto/py3/moto/mediapackage/urls.py16
-rw-r--r--contrib/python/moto/py3/moto/mediastore/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/mediastore/exceptions.py31
-rw-r--r--contrib/python/moto/py3/moto/mediastore/models.py128
-rw-r--r--contrib/python/moto/py3/moto/mediastore/responses.py85
-rw-r--r--contrib/python/moto/py3/moto/mediastore/urls.py7
-rw-r--r--contrib/python/moto/py3/moto/mediastoredata/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/mediastoredata/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/mediastoredata/models.py72
-rw-r--r--contrib/python/moto/py3/moto/mediastoredata/responses.py34
-rw-r--r--contrib/python/moto/py3/moto/mediastoredata/urls.py9
-rw-r--r--contrib/python/moto/py3/moto/moto_api/__init__.py7
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/managed_state_model.py67
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/models.py34
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/responses.py108
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/state_manager.py42
-rw-r--r--contrib/python/moto/py3/moto/moto_api/_internal/urls.py15
-rw-r--r--contrib/python/moto/py3/moto/moto_server/templates/dashboard.html188
-rw-r--r--contrib/python/moto/py3/moto/moto_server/threaded_moto_server.py48
-rw-r--r--contrib/python/moto/py3/moto/moto_server/utilities.py36
-rw-r--r--contrib/python/moto/py3/moto/moto_server/werkzeug_app.py295
-rw-r--r--contrib/python/moto/py3/moto/mq/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/mq/configuration.py183
-rw-r--r--contrib/python/moto/py3/moto/mq/exceptions.py71
-rw-r--r--contrib/python/moto/py3/moto/mq/models.py521
-rw-r--r--contrib/python/moto/py3/moto/mq/responses.py262
-rw-r--r--contrib/python/moto/py3/moto/mq/urls.py22
-rw-r--r--contrib/python/moto/py3/moto/opsworks/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/opsworks/exceptions.py18
-rw-r--r--contrib/python/moto/py3/moto/opsworks/models.py672
-rw-r--r--contrib/python/moto/py3/moto/opsworks/responses.py140
-rw-r--r--contrib/python/moto/py3/moto/opsworks/urls.py7
-rw-r--r--contrib/python/moto/py3/moto/organizations/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/organizations/exceptions.py111
-rw-r--r--contrib/python/moto/py3/moto/organizations/models.py923
-rw-r--r--contrib/python/moto/py3/moto/organizations/responses.py248
-rw-r--r--contrib/python/moto/py3/moto/organizations/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/organizations/utils.py116
-rw-r--r--contrib/python/moto/py3/moto/packages/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/blockdevicemapping.py99
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/ec2object.py48
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/image.py25
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/instance.py217
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/instancetype.py50
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/launchspecification.py49
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/spotinstancerequest.py85
-rw-r--r--contrib/python/moto/py3/moto/packages/boto/ec2/tag.py35
-rw-r--r--contrib/python/moto/py3/moto/packages/cfnresponse/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/packages/cfnresponse/cfnresponse.py59
-rw-r--r--contrib/python/moto/py3/moto/pinpoint/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/pinpoint/exceptions.py20
-rw-r--r--contrib/python/moto/py3/moto/pinpoint/models.py147
-rw-r--r--contrib/python/moto/py3/moto/pinpoint/responses.py144
-rw-r--r--contrib/python/moto/py3/moto/pinpoint/urls.py18
-rw-r--r--contrib/python/moto/py3/moto/polly/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/polly/models.py114
-rw-r--r--contrib/python/moto/py3/moto/polly/resources.py418
-rw-r--r--contrib/python/moto/py3/moto/polly/responses.py198
-rw-r--r--contrib/python/moto/py3/moto/polly/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/polly/utils.py2
-rw-r--r--contrib/python/moto/py3/moto/quicksight/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/quicksight/exceptions.py7
-rw-r--r--contrib/python/moto/py3/moto/quicksight/models.py216
-rw-r--r--contrib/python/moto/py3/moto/quicksight/responses.py199
-rw-r--r--contrib/python/moto/py3/moto/quicksight/urls.py21
-rw-r--r--contrib/python/moto/py3/moto/ram/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ram/exceptions.py34
-rw-r--r--contrib/python/moto/py3/moto/ram/models.py235
-rw-r--r--contrib/python/moto/py3/moto/ram/responses.py38
-rw-r--r--contrib/python/moto/py3/moto/ram/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/rds/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/rds/exceptions.py193
-rw-r--r--contrib/python/moto/py3/moto/rds/models.py2218
-rw-r--r--contrib/python/moto/py3/moto/rds/responses.py1143
-rw-r--r--contrib/python/moto/py3/moto/rds/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/rds/utils.py137
-rw-r--r--contrib/python/moto/py3/moto/redshift/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/redshift/exceptions.py167
-rw-r--r--contrib/python/moto/py3/moto/redshift/models.py1045
-rw-r--r--contrib/python/moto/py3/moto/redshift/responses.py778
-rw-r--r--contrib/python/moto/py3/moto/redshift/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/redshift/utils.py0
-rw-r--r--contrib/python/moto/py3/moto/redshiftdata/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/redshiftdata/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/redshiftdata/models.py208
-rw-r--r--contrib/python/moto/py3/moto/redshiftdata/responses.py60
-rw-r--r--contrib/python/moto/py3/moto/redshiftdata/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/rekognition/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/rekognition/exceptions.py1
-rw-r--r--contrib/python/moto/py3/moto/rekognition/models.py339
-rw-r--r--contrib/python/moto/py3/moto/rekognition/responses.py73
-rw-r--r--contrib/python/moto/py3/moto/rekognition/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/resourcegroups/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/resourcegroups/exceptions.py13
-rw-r--r--contrib/python/moto/py3/moto/resourcegroups/models.py369
-rw-r--r--contrib/python/moto/py3/moto/resourcegroups/responses.py181
-rw-r--r--contrib/python/moto/py3/moto/resourcegroups/urls.py18
-rw-r--r--contrib/python/moto/py3/moto/resourcegroupstaggingapi/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/resourcegroupstaggingapi/models.py733
-rw-r--r--contrib/python/moto/py3/moto/resourcegroupstaggingapi/responses.py89
-rw-r--r--contrib/python/moto/py3/moto/resourcegroupstaggingapi/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/route53/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/route53/exceptions.py102
-rw-r--r--contrib/python/moto/py3/moto/route53/models.py691
-rw-r--r--contrib/python/moto/py3/moto/route53/responses.py699
-rw-r--r--contrib/python/moto/py3/moto/route53/urls.py32
-rw-r--r--contrib/python/moto/py3/moto/route53/utils.py12
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/exceptions.py104
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/models.py833
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/responses.py259
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/utils.py38
-rw-r--r--contrib/python/moto/py3/moto/route53resolver/validations.py151
-rw-r--r--contrib/python/moto/py3/moto/s3/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/s3/cloud_formation.py33
-rw-r--r--contrib/python/moto/py3/moto/s3/config.py122
-rw-r--r--contrib/python/moto/py3/moto/s3/exceptions.py615
-rw-r--r--contrib/python/moto/py3/moto/s3/models.py2152
-rw-r--r--contrib/python/moto/py3/moto/s3/notifications.py108
-rw-r--r--contrib/python/moto/py3/moto/s3/responses.py2781
-rw-r--r--contrib/python/moto/py3/moto/s3/urls.py22
-rw-r--r--contrib/python/moto/py3/moto/s3/utils.py170
-rw-r--r--contrib/python/moto/py3/moto/s3bucket_path/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/s3bucket_path/utils.py25
-rw-r--r--contrib/python/moto/py3/moto/s3control/__init__.py6
-rw-r--r--contrib/python/moto/py3/moto/s3control/config.py155
-rw-r--r--contrib/python/moto/py3/moto/s3control/exceptions.py44
-rw-r--r--contrib/python/moto/py3/moto/s3control/models.py132
-rw-r--r--contrib/python/moto/py3/moto/s3control/responses.py223
-rw-r--r--contrib/python/moto/py3/moto/s3control/urls.py14
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/exceptions.py40
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/models.py2077
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/responses.py589
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/urls.py9
-rw-r--r--contrib/python/moto/py3/moto/sagemaker/validators.py20
-rw-r--r--contrib/python/moto/py3/moto/sdb/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/sdb/exceptions.py45
-rw-r--r--contrib/python/moto/py3/moto/sdb/models.py96
-rw-r--r--contrib/python/moto/py3/moto/sdb/responses.py90
-rw-r--r--contrib/python/moto/py3/moto/sdb/urls.py7
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/exceptions.py55
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/list_secrets/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/list_secrets/filters.py44
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/models.py816
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/responses.py192
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/secretsmanager/utils.py99
-rw-r--r--contrib/python/moto/py3/moto/server.py94
-rw-r--r--contrib/python/moto/py3/moto/servicediscovery/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/servicediscovery/exceptions.py22
-rw-r--r--contrib/python/moto/py3/moto/servicediscovery/models.py328
-rw-r--r--contrib/python/moto/py3/moto/servicediscovery/responses.py169
-rw-r--r--contrib/python/moto/py3/moto/servicediscovery/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/ses/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/ses/exceptions.py95
-rw-r--r--contrib/python/moto/py3/moto/ses/feedback.py67
-rw-r--r--contrib/python/moto/py3/moto/ses/models.py543
-rw-r--r--contrib/python/moto/py3/moto/ses/responses.py716
-rw-r--r--contrib/python/moto/py3/moto/ses/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/ses/utils.py27
-rw-r--r--contrib/python/moto/py3/moto/settings.py127
-rw-r--r--contrib/python/moto/py3/moto/sns/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/sns/exceptions.py91
-rw-r--r--contrib/python/moto/py3/moto/sns/models.py944
-rw-r--r--contrib/python/moto/py3/moto/sns/responses.py1249
-rw-r--r--contrib/python/moto/py3/moto/sns/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/sns/utils.py17
-rw-r--r--contrib/python/moto/py3/moto/sqs/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/sqs/exceptions.py130
-rw-r--r--contrib/python/moto/py3/moto/sqs/models.py1100
-rw-r--r--contrib/python/moto/py3/moto/sqs/responses.py821
-rw-r--r--contrib/python/moto/py3/moto/sqs/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/sqs/utils.py84
-rw-r--r--contrib/python/moto/py3/moto/ssm/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/ssm/exceptions.py141
-rw-r--r--contrib/python/moto/py3/moto/ssm/models.py1951
-rw-r--r--contrib/python/moto/py3/moto/ssm/resources/regions.json42769
-rw-r--r--contrib/python/moto/py3/moto/ssm/resources/services.json45693
-rw-r--r--contrib/python/moto/py3/moto/ssm/responses.py424
-rw-r--r--contrib/python/moto/py3/moto/ssm/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/ssm/utils.py45
-rw-r--r--contrib/python/moto/py3/moto/ssoadmin/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/ssoadmin/exceptions.py7
-rw-r--r--contrib/python/moto/py3/moto/ssoadmin/models.py136
-rw-r--r--contrib/python/moto/py3/moto/ssoadmin/responses.py67
-rw-r--r--contrib/python/moto/py3/moto/ssoadmin/urls.py11
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/exceptions.py47
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/models.py620
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/responses.py185
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/stepfunctions/utils.py24
-rw-r--r--contrib/python/moto/py3/moto/sts/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/sts/exceptions.py10
-rw-r--r--contrib/python/moto/py3/moto/sts/models.py144
-rw-r--r--contrib/python/moto/py3/moto/sts/responses.py213
-rw-r--r--contrib/python/moto/py3/moto/sts/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/sts/utils.py37
-rw-r--r--contrib/python/moto/py3/moto/support/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/support/exceptions.py0
-rw-r--r--contrib/python/moto/py3/moto/support/models.py235
-rw-r--r--contrib/python/moto/py3/moto/support/resources/describe_trusted_advisor_checks.json1491
-rw-r--r--contrib/python/moto/py3/moto/support/responses.py64
-rw-r--r--contrib/python/moto/py3/moto/support/urls.py8
-rw-r--r--contrib/python/moto/py3/moto/swf/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/swf/constants.py83
-rw-r--r--contrib/python/moto/py3/moto/swf/exceptions.py118
-rw-r--r--contrib/python/moto/py3/moto/swf/models/__init__.py433
-rw-r--r--contrib/python/moto/py3/moto/swf/models/activity_task.py94
-rw-r--r--contrib/python/moto/py3/moto/swf/models/activity_type.py16
-rw-r--r--contrib/python/moto/py3/moto/swf/models/decision_task.py78
-rw-r--r--contrib/python/moto/py3/moto/swf/models/domain.py131
-rw-r--r--contrib/python/moto/py3/moto/swf/models/generic_type.py61
-rw-r--r--contrib/python/moto/py3/moto/swf/models/history_event.py75
-rw-r--r--contrib/python/moto/py3/moto/swf/models/timeout.py13
-rw-r--r--contrib/python/moto/py3/moto/swf/models/timer.py16
-rw-r--r--contrib/python/moto/py3/moto/swf/models/workflow_execution.py754
-rw-r--r--contrib/python/moto/py3/moto/swf/models/workflow_type.py17
-rw-r--r--contrib/python/moto/py3/moto/swf/responses.py553
-rw-r--r--contrib/python/moto/py3/moto/swf/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/swf/utils.py2
-rw-r--r--contrib/python/moto/py3/moto/textract/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/textract/exceptions.py29
-rw-r--r--contrib/python/moto/py3/moto/textract/models.py66
-rw-r--r--contrib/python/moto/py3/moto/textract/responses.py28
-rw-r--r--contrib/python/moto/py3/moto/textract/urls.py10
-rw-r--r--contrib/python/moto/py3/moto/timestreamwrite/__init__.py4
-rw-r--r--contrib/python/moto/py3/moto/timestreamwrite/exceptions.py9
-rw-r--r--contrib/python/moto/py3/moto/timestreamwrite/models.py222
-rw-r--r--contrib/python/moto/py3/moto/timestreamwrite/responses.py131
-rw-r--r--contrib/python/moto/py3/moto/timestreamwrite/urls.py12
-rw-r--r--contrib/python/moto/py3/moto/transcribe/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/transcribe/exceptions.py11
-rw-r--r--contrib/python/moto/py3/moto/transcribe/models.py810
-rw-r--r--contrib/python/moto/py3/moto/transcribe/responses.py206
-rw-r--r--contrib/python/moto/py3/moto/transcribe/urls.py5
-rw-r--r--contrib/python/moto/py3/moto/utilities/__init__.py0
-rw-r--r--contrib/python/moto/py3/moto/utilities/distutils_version.py233
-rw-r--r--contrib/python/moto/py3/moto/utilities/docker_utilities.py60
-rw-r--r--contrib/python/moto/py3/moto/utilities/paginator.py182
-rw-r--r--contrib/python/moto/py3/moto/utilities/tagging_service.py175
-rw-r--r--contrib/python/moto/py3/moto/utilities/utils.py100
-rw-r--r--contrib/python/moto/py3/moto/wafv2/__init__.py5
-rw-r--r--contrib/python/moto/py3/moto/wafv2/exceptions.py13
-rw-r--r--contrib/python/moto/py3/moto/wafv2/models.py112
-rw-r--r--contrib/python/moto/py3/moto/wafv2/responses.py48
-rw-r--r--contrib/python/moto/py3/moto/wafv2/urls.py9
-rw-r--r--contrib/python/moto/py3/moto/wafv2/utils.py21
-rw-r--r--contrib/python/moto/py3/moto/xray/__init__.py7
-rw-r--r--contrib/python/moto/py3/moto/xray/exceptions.py19
-rw-r--r--contrib/python/moto/py3/moto/xray/mock_client.py102
-rw-r--r--contrib/python/moto/py3/moto/xray/models.py294
-rw-r--r--contrib/python/moto/py3/moto/xray/responses.py176
-rw-r--r--contrib/python/moto/py3/moto/xray/urls.py12
-rw-r--r--contrib/python/moto/py3/ya.make846
-rw-r--r--contrib/python/moto/ya.make19
885 files changed, 564439 insertions, 0 deletions
diff --git a/contrib/python/moto/bin/ya.make b/contrib/python/moto/bin/ya.make
new file mode 100644
index 0000000000..2073e02863
--- /dev/null
+++ b/contrib/python/moto/bin/ya.make
@@ -0,0 +1,13 @@
+PY3_PROGRAM(moto_server)
+
+LICENSE(Apache-2.0)
+
+PEERDIR(
+ contrib/python/Flask
+ contrib/python/Flask-Cors
+ contrib/python/moto
+)
+
+PY_MAIN(moto.server:main)
+
+END()
diff --git a/contrib/python/moto/py2/moto/__init__.py b/contrib/python/moto/py2/moto/__init__.py
new file mode 100644
index 0000000000..4f09e301ce
--- /dev/null
+++ b/contrib/python/moto/py2/moto/__init__.py
@@ -0,0 +1,23 @@
+from __future__ import unicode_literals
+import logging
+# logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+__title__ = 'moto'
+__version__ = '1.3.7'
+
+from .ec2 import mock_ec2, mock_ec2_deprecated # flake8: noqa
+from .iam import mock_iam, mock_iam_deprecated # flake8: noqa
+from .kms import mock_kms, mock_kms_deprecated # flake8: noqa
+from .route53 import mock_route53, mock_route53_deprecated # flake8: noqa
+from .s3 import mock_s3, mock_s3_deprecated # flake8: noqa
+from .sts import mock_sts, mock_sts_deprecated # flake8: noqa
+
+
+try:
+ # Need to monkey-patch botocore requests back to underlying urllib3 classes
+ from botocore.awsrequest import HTTPSConnectionPool, HTTPConnectionPool, HTTPConnection, VerifiedHTTPSConnection
+except ImportError:
+ pass
+else:
+ HTTPSConnectionPool.ConnectionCls = VerifiedHTTPSConnection
+ HTTPConnectionPool.ConnectionCls = HTTPConnection
diff --git a/contrib/python/moto/py2/moto/backends.py b/contrib/python/moto/py2/moto/backends.py
new file mode 100644
index 0000000000..35a584d253
--- /dev/null
+++ b/contrib/python/moto/py2/moto/backends.py
@@ -0,0 +1,90 @@
+from __future__ import unicode_literals
+
+from moto.instance_metadata import instance_metadata_backends
+from moto.s3 import s3_backends
+from moto.core import moto_api_backends
+from moto.iam import iam_backends
+from moto.kms import kms_backends
+from moto.route53 import route53_backends
+from moto.sts import sts_backends
+
+
+BACKENDS = {
+ 'iam': iam_backends,
+ 'instance_metadata': instance_metadata_backends,
+ 'kms': kms_backends,
+ 'moto_api': moto_api_backends,
+ 'route53': route53_backends,
+ 's3': s3_backends,
+ 'sts': sts_backends,
+}
+
+'''
+from moto.apigateway import apigateway_backends
+from moto.autoscaling import autoscaling_backends
+from moto.awslambda import lambda_backends
+from moto.cloudformation import cloudformation_backends
+from moto.cloudwatch import cloudwatch_backends
+from moto.core import moto_api_backends
+from moto.datapipeline import datapipeline_backends
+from moto.dynamodb import dynamodb_backends
+from moto.dynamodb2 import dynamodb_backends2
+from moto.ec2 import ec2_backends
+from moto.ecr import ecr_backends
+from moto.ecs import ecs_backends
+from moto.elb import elb_backends
+from moto.elbv2 import elbv2_backends
+from moto.emr import emr_backends
+from moto.events import events_backends
+from moto.glacier import glacier_backends
+from moto.instance_metadata import instance_metadata_backends
+from moto.kinesis import kinesis_backends
+from moto.opsworks import opsworks_backends
+from moto.rds2 import rds2_backends
+from moto.redshift import redshift_backends
+from moto.s3 import s3_backends
+from moto.ses import ses_backends
+from moto.sns import sns_backends
+from moto.sqs import sqs_backends
+from moto.ssm import ssm_backends
+
+BACKENDS = {
+ 'apigateway': apigateway_backends,
+ 'autoscaling': autoscaling_backends,
+ 'cloudformation': cloudformation_backends,
+ 'cloudwatch': cloudwatch_backends,
+ 'datapipeline': datapipeline_backends,
+ 'dynamodb': dynamodb_backends,
+ 'dynamodb2': dynamodb_backends2,
+ 'ec2': ec2_backends,
+ 'ecr': ecr_backends,
+ 'ecs': ecs_backends,
+ 'elb': elb_backends,
+ 'elbv2': elbv2_backends,
+ 'events': events_backends,
+ 'emr': emr_backends,
+ 'glacier': glacier_backends,
+ 'moto_api': moto_api_backends,
+ 'instance_metadata': instance_metadata_backends,
+ 'opsworks': opsworks_backends,
+ 'kinesis': kinesis_backends,
+ 'redshift': redshift_backends,
+ 'rds': rds2_backends,
+ 's3': s3_backends,
+ 's3bucket_path': s3_backends,
+ 'ses': ses_backends,
+ 'sns': sns_backends,
+ 'sqs': sqs_backends,
+ 'ssm': ssm_backends,
+ 'lambda': lambda_backends,
+}
+'''
+
+
+def get_model(name, region_name):
+ for backends in BACKENDS.values():
+ for region, backend in backends.items():
+ if region == region_name:
+ models = getattr(backend.__class__, '__models__', {})
+ if name in models:
+ return list(getattr(backend, models[name])())
diff --git a/contrib/python/moto/py2/moto/compat.py b/contrib/python/moto/py2/moto/compat.py
new file mode 100644
index 0000000000..a92a5f67b6
--- /dev/null
+++ b/contrib/python/moto/py2/moto/compat.py
@@ -0,0 +1,5 @@
+try:
+ from collections import OrderedDict # flake8: noqa
+except ImportError:
+ # python 2.6 or earlier, use backport
+ from ordereddict import OrderedDict # flake8: noqa
diff --git a/contrib/python/moto/py2/moto/core/__init__.py b/contrib/python/moto/py2/moto/core/__init__.py
new file mode 100644
index 0000000000..9e2c1e70f0
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/__init__.py
@@ -0,0 +1,4 @@
+from __future__ import unicode_literals
+from .models import BaseModel, BaseBackend, moto_api_backend # flake8: noqa
+
+moto_api_backends = {"global": moto_api_backend}
diff --git a/contrib/python/moto/py2/moto/core/exceptions.py b/contrib/python/moto/py2/moto/core/exceptions.py
new file mode 100644
index 0000000000..40202f7bd3
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/exceptions.py
@@ -0,0 +1,67 @@
+from __future__ import unicode_literals
+
+from werkzeug.exceptions import HTTPException
+from jinja2 import DictLoader, Environment
+
+
+SINGLE_ERROR_RESPONSE = u"""<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>{{error_type}}</Code>
+ <Message>{{message}}</Message>
+ {% block extra %}{% endblock %}
+ <RequestID>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestID>
+</Error>
+"""
+
+ERROR_RESPONSE = u"""<?xml version="1.0" encoding="UTF-8"?>
+ <Response>
+ <Errors>
+ <Error>
+ <Code>{{error_type}}</Code>
+ <Message>{{message}}</Message>
+ {% block extra %}{% endblock %}
+ </Error>
+ </Errors>
+ <RequestID>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestID>
+</Response>
+"""
+
+ERROR_JSON_RESPONSE = u"""{
+ "message": "{{message}}",
+ "__type": "{{error_type}}"
+}
+"""
+
+
+class RESTError(HTTPException):
+ code = 400
+
+ templates = {
+ 'single_error': SINGLE_ERROR_RESPONSE,
+ 'error': ERROR_RESPONSE,
+ 'error_json': ERROR_JSON_RESPONSE,
+ }
+
+ def __init__(self, error_type, message, template='error', **kwargs):
+ super(RESTError, self).__init__()
+ env = Environment(loader=DictLoader(self.templates))
+ self.error_type = error_type
+ self.message = message
+ self.description = env.get_template(template).render(
+ error_type=error_type, message=message, **kwargs)
+
+
+class DryRunClientError(RESTError):
+ code = 400
+
+
+class JsonRESTError(RESTError):
+ def __init__(self, error_type, message, template='error_json', **kwargs):
+ super(JsonRESTError, self).__init__(
+ error_type, message, template, **kwargs)
+
+ def get_headers(self, *args, **kwargs):
+ return [('Content-Type', 'application/json')]
+
+ def get_body(self, *args, **kwargs):
+ return self.description
diff --git a/contrib/python/moto/py2/moto/core/models.py b/contrib/python/moto/py2/moto/core/models.py
new file mode 100644
index 0000000000..9fe1e96bd3
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/models.py
@@ -0,0 +1,586 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from __future__ import absolute_import
+
+import functools
+import inspect
+import os
+import re
+import six
+from io import BytesIO
+from collections import defaultdict
+from botocore.handlers import BUILTIN_HANDLERS
+from botocore.awsrequest import AWSResponse
+
+from moto import settings
+import responses
+from moto.packages.httpretty import HTTPretty
+from .utils import (
+ convert_httpretty_response,
+ convert_regex_to_flask_path,
+ convert_flask_to_responses_response,
+)
+
+
+# "Mock" the AWS credentials as they can't be mocked in Botocore currently
+os.environ.setdefault("AWS_ACCESS_KEY_ID", "foobar_key")
+os.environ.setdefault("AWS_SECRET_ACCESS_KEY", "foobar_secret")
+
+
+class BaseMockAWS(object):
+ nested_count = 0
+
+ def __init__(self, backends):
+ self.backends = backends
+
+ self.backends_for_urls = {}
+ from moto.backends import BACKENDS
+ default_backends = {
+ "instance_metadata": BACKENDS['instance_metadata']['global'],
+ "moto_api": BACKENDS['moto_api']['global'],
+ }
+ self.backends_for_urls.update(self.backends)
+ self.backends_for_urls.update(default_backends)
+
+ if self.__class__.nested_count == 0:
+ self.reset()
+
+ def __call__(self, func, reset=True):
+ if inspect.isclass(func):
+ return self.decorate_class(func)
+ return self.decorate_callable(func, reset)
+
+ def __enter__(self):
+ self.start()
+
+ def __exit__(self, *args):
+ self.stop()
+
+ def start(self, reset=True):
+ self.__class__.nested_count += 1
+ if reset:
+ for backend in self.backends.values():
+ backend.reset()
+
+ self.enable_patching()
+
+ def stop(self):
+ self.__class__.nested_count -= 1
+
+ if self.__class__.nested_count < 0:
+ raise RuntimeError('Called stop() before start().')
+
+ if self.__class__.nested_count == 0:
+ self.disable_patching()
+
+ def decorate_callable(self, func, reset):
+ def wrapper(*args, **kwargs):
+ self.start(reset=reset)
+ try:
+ result = func(*args, **kwargs)
+ finally:
+ self.stop()
+ return result
+ functools.update_wrapper(wrapper, func)
+ wrapper.__wrapped__ = func
+ return wrapper
+
+ def decorate_class(self, klass):
+ for attr in dir(klass):
+ if attr.startswith("_"):
+ continue
+
+ attr_value = getattr(klass, attr)
+ if not hasattr(attr_value, "__call__"):
+ continue
+
+ # Check if this is a classmethod. If so, skip patching
+ if inspect.ismethod(attr_value) and attr_value.__self__ is klass:
+ continue
+
+ # Check if this is a staticmethod. If so, skip patching
+ for cls in inspect.getmro(klass):
+ if attr_value.__name__ not in cls.__dict__:
+ continue
+ bound_attr_value = cls.__dict__[attr_value.__name__]
+ if not isinstance(bound_attr_value, staticmethod):
+ break
+ else:
+ # It is a staticmethod, skip patching
+ continue
+
+ try:
+ setattr(klass, attr, self(attr_value, reset=False))
+ except TypeError:
+ # Sometimes we can't set this for built-in types
+ continue
+ return klass
+
+
+class HttprettyMockAWS(BaseMockAWS):
+
+ def reset(self):
+ HTTPretty.reset()
+
+ def enable_patching(self):
+ if not HTTPretty.is_enabled():
+ HTTPretty.enable()
+
+ for method in HTTPretty.METHODS:
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ HTTPretty.register_uri(
+ method=method,
+ uri=re.compile(key),
+ body=convert_httpretty_response(value),
+ )
+
+ def disable_patching(self):
+ HTTPretty.disable()
+ HTTPretty.reset()
+
+
+RESPONSES_METHODS = [responses.GET, responses.DELETE, responses.HEAD,
+ responses.OPTIONS, responses.PATCH, responses.POST, responses.PUT]
+
+
+class CallbackResponse(responses.CallbackResponse):
+ '''
+ Need to subclass so we can change a couple things
+ '''
+ def get_response(self, request):
+ '''
+ Need to override this so we can pass decode_content=False
+ '''
+ headers = self.get_headers()
+
+ result = self.callback(request)
+ if isinstance(result, Exception):
+ raise result
+
+ status, r_headers, body = result
+ body = responses._handle_body(body)
+ headers.update(r_headers)
+
+ return responses.HTTPResponse(
+ status=status,
+ reason=six.moves.http_client.responses.get(status),
+ body=body,
+ headers=headers,
+ preload_content=False,
+ # Need to not decode_content to mimic requests
+ decode_content=False,
+ )
+
+ def _url_matches(self, url, other, match_querystring=False):
+ '''
+ Need to override this so we can fix querystrings breaking regex matching
+ '''
+ if not match_querystring:
+ other = other.split('?', 1)[0]
+
+ if responses._is_string(url):
+ if responses._has_unicode(url):
+ url = responses._clean_unicode(url)
+ if not isinstance(other, six.text_type):
+ other = other.encode('ascii').decode('utf8')
+ return self._url_matches_strict(url, other)
+ elif isinstance(url, responses.Pattern) and url.match(other):
+ return True
+ else:
+ return False
+
+
+botocore_mock = responses.RequestsMock(assert_all_requests_are_fired=False, target='botocore.vendored.requests.adapters.HTTPAdapter.send')
+responses_mock = responses._default_mock
+
+
+class ResponsesMockAWS(BaseMockAWS):
+ def reset(self):
+ botocore_mock.reset()
+ responses_mock.reset()
+
+ def enable_patching(self):
+ if not hasattr(botocore_mock, '_patcher') or not hasattr(botocore_mock._patcher, 'target'):
+ # Check for unactivated patcher
+ botocore_mock.start()
+
+ if not hasattr(responses_mock, '_patcher') or not hasattr(responses_mock._patcher, 'target'):
+ responses_mock.start()
+
+ for method in RESPONSES_METHODS:
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ responses_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(key),
+ callback=convert_flask_to_responses_response(value),
+ stream=True,
+ match_querystring=False,
+ )
+ )
+ botocore_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(key),
+ callback=convert_flask_to_responses_response(value),
+ stream=True,
+ match_querystring=False,
+ )
+ )
+
+ def disable_patching(self):
+ try:
+ botocore_mock.stop()
+ except RuntimeError:
+ pass
+
+ try:
+ responses_mock.stop()
+ except RuntimeError:
+ pass
+
+
+BOTOCORE_HTTP_METHODS = [
+ 'GET', 'DELETE', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'
+]
+
+
+class MockRawResponse(BytesIO):
+ def __init__(self, input):
+ if isinstance(input, six.text_type):
+ input = input.encode('utf-8')
+ super(MockRawResponse, self).__init__(input)
+
+ def stream(self, **kwargs):
+ contents = self.read()
+ while contents:
+ yield contents
+ contents = self.read()
+
+
+class BotocoreStubber(object):
+ def __init__(self):
+ self.enabled = False
+ self.methods = defaultdict(list)
+
+ def reset(self):
+ self.methods.clear()
+
+ def register_response(self, method, pattern, response):
+ matchers = self.methods[method]
+ matchers.append((pattern, response))
+
+ def __call__(self, event_name, request, **kwargs):
+ if not self.enabled:
+ return None
+
+ response = None
+ response_callback = None
+ found_index = None
+ matchers = self.methods.get(request.method)
+
+ base_url = request.url.split('?', 1)[0]
+ for i, (pattern, callback) in enumerate(matchers):
+ if pattern.match(base_url):
+ if found_index is None:
+ found_index = i
+ response_callback = callback
+ else:
+ matchers.pop(found_index)
+ break
+
+ if response_callback is not None:
+ for header, value in request.headers.items():
+ if isinstance(value, six.binary_type):
+ request.headers[header] = value.decode('utf-8')
+ status, headers, body = response_callback(request, request.url, request.headers)
+ body = MockRawResponse(body)
+ response = AWSResponse(request.url, status, headers, body)
+
+ return response
+
+
+botocore_stubber = BotocoreStubber()
+BUILTIN_HANDLERS.append(('before-send', botocore_stubber))
+
+
+class BotocoreEventMockAWS(BaseMockAWS):
+ def reset(self):
+ botocore_stubber.reset()
+ responses_mock.reset()
+
+ def enable_patching(self):
+ botocore_stubber.enabled = True
+ for method in BOTOCORE_HTTP_METHODS:
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ pattern = re.compile(key)
+ botocore_stubber.register_response(method, pattern, value)
+
+ if not hasattr(responses_mock, '_patcher') or not hasattr(responses_mock._patcher, 'target'):
+ responses_mock.start()
+
+ for method in RESPONSES_METHODS:
+ # for backend in default_backends.values():
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ responses_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(key),
+ callback=convert_flask_to_responses_response(value),
+ stream=True,
+ match_querystring=False,
+ )
+ )
+
+ def disable_patching(self):
+ botocore_stubber.enabled = False
+ self.reset()
+
+ try:
+ responses_mock.stop()
+ except RuntimeError:
+ pass
+
+
+MockAWS = BotocoreEventMockAWS
+
+
+class ServerModeMockAWS(BaseMockAWS):
+
+ def reset(self):
+ import requests
+ requests.post("http://localhost:5000/moto-api/reset")
+
+ def enable_patching(self):
+ if self.__class__.nested_count == 1:
+ # Just started
+ self.reset()
+
+ from boto3 import client as real_boto3_client, resource as real_boto3_resource
+ import mock
+
+ def fake_boto3_client(*args, **kwargs):
+ if 'endpoint_url' not in kwargs:
+ kwargs['endpoint_url'] = "http://localhost:5000"
+ return real_boto3_client(*args, **kwargs)
+
+ def fake_boto3_resource(*args, **kwargs):
+ if 'endpoint_url' not in kwargs:
+ kwargs['endpoint_url'] = "http://localhost:5000"
+ return real_boto3_resource(*args, **kwargs)
+
+ def fake_httplib_send_output(self, message_body=None, *args, **kwargs):
+ def _convert_to_bytes(mixed_buffer):
+ bytes_buffer = []
+ for chunk in mixed_buffer:
+ if isinstance(chunk, six.text_type):
+ bytes_buffer.append(chunk.encode('utf-8'))
+ else:
+ bytes_buffer.append(chunk)
+ msg = b"\r\n".join(bytes_buffer)
+ return msg
+
+ self._buffer.extend((b"", b""))
+ msg = _convert_to_bytes(self._buffer)
+ del self._buffer[:]
+ if isinstance(message_body, bytes):
+ msg += message_body
+ message_body = None
+ self.send(msg)
+ # if self._expect_header_set:
+ # read, write, exc = select.select([self.sock], [], [self.sock], 1)
+ # if read:
+ # self._handle_expect_response(message_body)
+ # return
+ if message_body is not None:
+ self.send(message_body)
+
+ self._client_patcher = mock.patch('boto3.client', fake_boto3_client)
+ self._resource_patcher = mock.patch('boto3.resource', fake_boto3_resource)
+ if six.PY2:
+ self._httplib_patcher = mock.patch('httplib.HTTPConnection._send_output', fake_httplib_send_output)
+
+ self._client_patcher.start()
+ self._resource_patcher.start()
+ if six.PY2:
+ self._httplib_patcher.start()
+
+ def disable_patching(self):
+ if self._client_patcher:
+ self._client_patcher.stop()
+ self._resource_patcher.stop()
+ if six.PY2:
+ self._httplib_patcher.stop()
+
+
+class Model(type):
+
+ def __new__(self, clsname, bases, namespace):
+ cls = super(Model, self).__new__(self, clsname, bases, namespace)
+ cls.__models__ = {}
+ for name, value in namespace.items():
+ model = getattr(value, "__returns_model__", False)
+ if model is not False:
+ cls.__models__[model] = name
+ for base in bases:
+ cls.__models__.update(getattr(base, "__models__", {}))
+ return cls
+
+ @staticmethod
+ def prop(model_name):
+ """ decorator to mark a class method as returning model values """
+ def dec(f):
+ f.__returns_model__ = model_name
+ return f
+ return dec
+
+
+model_data = defaultdict(dict)
+
+
+class InstanceTrackerMeta(type):
+ def __new__(meta, name, bases, dct):
+ cls = super(InstanceTrackerMeta, meta).__new__(meta, name, bases, dct)
+ if name == 'BaseModel':
+ return cls
+
+ service = cls.__module__.split(".")[1]
+ if name not in model_data[service]:
+ model_data[service][name] = cls
+ cls.instances = []
+ return cls
+
+
+@six.add_metaclass(InstanceTrackerMeta)
+class BaseModel(object):
+ def __new__(cls, *args, **kwargs):
+ instance = super(BaseModel, cls).__new__(cls)
+ cls.instances.append(instance)
+ return instance
+
+
+class BaseBackend(object):
+
+ def reset(self):
+ for service, models in model_data.items():
+ for model_name, model in models.items():
+ model.instances = []
+ self.__dict__ = {}
+ self.__init__()
+
+ @property
+ def _url_module(self):
+ backend_module = self.__class__.__module__
+ backend_urls_module_name = backend_module.replace("models", "urls")
+ backend_urls_module = __import__(backend_urls_module_name, fromlist=[
+ 'url_bases', 'url_paths'])
+ return backend_urls_module
+
+ @property
+ def urls(self):
+ """
+ A dictionary of the urls to be mocked with this service and the handlers
+ that should be called in their place
+ """
+ url_bases = self._url_module.url_bases
+ unformatted_paths = self._url_module.url_paths
+
+ urls = {}
+ for url_base in url_bases:
+ for url_path, handler in unformatted_paths.items():
+ url = url_path.format(url_base)
+ urls[url] = handler
+
+ return urls
+
+ @property
+ def url_paths(self):
+ """
+ A dictionary of the paths of the urls to be mocked with this service and
+ the handlers that should be called in their place
+ """
+ unformatted_paths = self._url_module.url_paths
+
+ paths = {}
+ for unformatted_path, handler in unformatted_paths.items():
+ path = unformatted_path.format("")
+ paths[path] = handler
+
+ return paths
+
+ @property
+ def url_bases(self):
+ """
+ A list containing the url_bases extracted from urls.py
+ """
+ return self._url_module.url_bases
+
+ @property
+ def flask_paths(self):
+ """
+ The url paths that will be used for the flask server
+ """
+ paths = {}
+ for url_path, handler in self.url_paths.items():
+ url_path = convert_regex_to_flask_path(url_path)
+ paths[url_path] = handler
+
+ return paths
+
+ def decorator(self, func=None):
+ if settings.TEST_SERVER_MODE:
+ mocked_backend = ServerModeMockAWS({'global': self})
+ else:
+ mocked_backend = MockAWS({'global': self})
+
+ if func:
+ return mocked_backend(func)
+ else:
+ return mocked_backend
+
+ def deprecated_decorator(self, func=None):
+ if func:
+ return HttprettyMockAWS({'global': self})(func)
+ else:
+ return HttprettyMockAWS({'global': self})
+
+
+class base_decorator(object):
+ mock_backend = MockAWS
+
+ def __init__(self, backends):
+ self.backends = backends
+
+ def __call__(self, func=None):
+ if self.mock_backend != HttprettyMockAWS and settings.TEST_SERVER_MODE:
+ mocked_backend = ServerModeMockAWS(self.backends)
+ else:
+ mocked_backend = self.mock_backend(self.backends)
+
+ if func:
+ return mocked_backend(func)
+ else:
+ return mocked_backend
+
+
+class deprecated_base_decorator(base_decorator):
+ mock_backend = HttprettyMockAWS
+
+
+class MotoAPIBackend(BaseBackend):
+
+ def reset(self):
+ from moto.backends import BACKENDS
+ for name, backends in BACKENDS.items():
+ if name == "moto_api":
+ continue
+ for region_name, backend in backends.items():
+ backend.reset()
+ self.__init__()
+
+
+moto_api_backend = MotoAPIBackend()
diff --git a/contrib/python/moto/py2/moto/core/responses.py b/contrib/python/moto/py2/moto/core/responses.py
new file mode 100644
index 0000000000..8fb247f75b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/responses.py
@@ -0,0 +1,852 @@
+from __future__ import unicode_literals
+
+from collections import defaultdict
+import datetime
+import json
+import logging
+import re
+import io
+
+import pytz
+from moto.core.exceptions import DryRunClientError
+
+from jinja2 import Environment, DictLoader, TemplateNotFound
+
+import six
+from six.moves.urllib.parse import parse_qs, urlparse
+
+import xmltodict
+from pkg_resources import resource_filename
+from werkzeug.exceptions import HTTPException
+
+import boto3
+from moto.compat import OrderedDict
+from moto.core.utils import camelcase_to_underscores, method_names_from_class
+
+
+log = logging.getLogger(__name__)
+
+
+def _decode_dict(d):
+ decoded = {}
+ for key, value in d.items():
+ if isinstance(key, six.binary_type):
+ newkey = key.decode("utf-8")
+ elif isinstance(key, (list, tuple)):
+ newkey = []
+ for k in key:
+ if isinstance(k, six.binary_type):
+ newkey.append(k.decode('utf-8'))
+ else:
+ newkey.append(k)
+ else:
+ newkey = key
+
+ if isinstance(value, six.binary_type):
+ newvalue = value.decode("utf-8")
+ elif isinstance(value, (list, tuple)):
+ newvalue = []
+ for v in value:
+ if isinstance(v, six.binary_type):
+ newvalue.append(v.decode('utf-8'))
+ else:
+ newvalue.append(v)
+ else:
+ newvalue = value
+
+ decoded[newkey] = newvalue
+ return decoded
+
+
+class DynamicDictLoader(DictLoader):
+ """
+ Note: There's a bug in jinja2 pre-2.7.3 DictLoader where caching does not work.
+ Including the fixed (current) method version here to ensure performance benefit
+ even for those using older jinja versions.
+ """
+
+ def get_source(self, environment, template):
+ if template in self.mapping:
+ source = self.mapping[template]
+ return source, None, lambda: source == self.mapping.get(template)
+ raise TemplateNotFound(template)
+
+ def update(self, mapping):
+ self.mapping.update(mapping)
+
+ def contains(self, template):
+ return bool(template in self.mapping)
+
+
+class _TemplateEnvironmentMixin(object):
+
+ def __init__(self):
+ super(_TemplateEnvironmentMixin, self).__init__()
+ self.loader = DynamicDictLoader({})
+ self.environment = Environment(
+ loader=self.loader, autoescape=self.should_autoescape)
+
+ @property
+ def should_autoescape(self):
+ # Allow for subclass to overwrite
+ return False
+
+ def contains_template(self, template_id):
+ return self.loader.contains(template_id)
+
+ def response_template(self, source):
+ template_id = id(source)
+ if not self.contains_template(template_id):
+ self.loader.update({template_id: source})
+ self.environment = Environment(loader=self.loader, autoescape=self.should_autoescape, trim_blocks=True,
+ lstrip_blocks=True)
+ return self.environment.get_template(template_id)
+
+
+class BaseResponse(_TemplateEnvironmentMixin):
+
+ default_region = 'us-east-1'
+ # to extract region, use [^.]
+ region_regex = re.compile(r'\.(?P<region>[a-z]{2}-[a-z]+-\d{1})\.amazonaws\.com')
+ param_list_regex = re.compile(r'(.*)\.(\d+)\.')
+ access_key_regex = re.compile(r'AWS.*(?P<access_key>(?<![A-Z0-9])[A-Z0-9]{20}(?![A-Z0-9]))[:/]')
+ aws_service_spec = None
+
+ @classmethod
+ def dispatch(cls, *args, **kwargs):
+ return cls()._dispatch(*args, **kwargs)
+
+ def setup_class(self, request, full_url, headers):
+ querystring = {}
+ if hasattr(request, 'body'):
+ # Boto
+ self.body = request.body
+ else:
+ # Flask server
+
+ # FIXME: At least in Flask==0.10.1, request.data is an empty string
+ # and the information we want is in request.form. Keeping self.body
+ # definition for back-compatibility
+ self.body = request.data
+
+ querystring = {}
+ for key, value in request.form.items():
+ querystring[key] = [value, ]
+
+ raw_body = self.body
+ if isinstance(self.body, six.binary_type):
+ self.body = self.body.decode('utf-8')
+
+ if not querystring:
+ querystring.update(
+ parse_qs(urlparse(full_url).query, keep_blank_values=True))
+ if not querystring:
+ if 'json' in request.headers.get('content-type', []) and self.aws_service_spec:
+ decoded = json.loads(self.body)
+
+ target = request.headers.get(
+ 'x-amz-target') or request.headers.get('X-Amz-Target')
+ service, method = target.split('.')
+ input_spec = self.aws_service_spec.input_spec(method)
+ flat = flatten_json_request_body('', decoded, input_spec)
+ for key, value in flat.items():
+ querystring[key] = [value]
+ elif self.body:
+ querystring.update(parse_qs(raw_body, keep_blank_values=True))
+ if not querystring:
+ querystring.update(headers)
+
+ querystring = _decode_dict(querystring)
+ self.uri = full_url
+ self.path = urlparse(full_url).path
+ self.querystring = querystring
+ self.method = request.method
+ self.region = self.get_region_from_url(request, full_url)
+ self.uri_match = None
+
+ self.headers = request.headers
+ if 'host' not in self.headers:
+ self.headers['host'] = urlparse(full_url).netloc
+ self.response_headers = {"server": "amazon.com"}
+
+ def get_region_from_url(self, request, full_url):
+ match = self.region_regex.search(full_url)
+ if match:
+ region = match.group(1)
+ elif 'Authorization' in request.headers and 'AWS4' in request.headers['Authorization']:
+ region = request.headers['Authorization'].split(",")[
+ 0].split("/")[2]
+ else:
+ region = self.default_region
+ return region
+
+ def get_current_user(self):
+ """
+ Returns the access key id used in this request as the current user id
+ """
+ if 'Authorization' in self.headers:
+ match = self.access_key_regex.search(self.headers['Authorization'])
+ if match:
+ return match.group(1)
+
+ if self.querystring.get('AWSAccessKeyId'):
+ return self.querystring.get('AWSAccessKeyId')
+ else:
+ # Should we raise an unauthorized exception instead?
+ return '111122223333'
+
+ def _dispatch(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self.call_action()
+
+ def uri_to_regexp(self, uri):
+ """converts uri w/ placeholder to regexp
+ '/cars/{carName}/drivers/{DriverName}'
+ -> '^/cars/.*/drivers/[^/]*$'
+
+ '/cars/{carName}/drivers/{DriverName}/drive'
+ -> '^/cars/.*/drivers/.*/drive$'
+
+ """
+ def _convert(elem, is_last):
+ if not re.match('^{.*}$', elem):
+ return elem
+ name = elem.replace('{', '').replace('}', '')
+ if is_last:
+ return '(?P<%s>[^/]*)' % name
+ return '(?P<%s>.*)' % name
+
+ elems = uri.split('/')
+ num_elems = len(elems)
+ regexp = '^{}$'.format('/'.join([_convert(elem, (i == num_elems - 1)) for i, elem in enumerate(elems)]))
+ return regexp
+
+ def _get_action_from_method_and_request_uri(self, method, request_uri):
+ """basically used for `rest-json` APIs
+ You can refer to example from link below
+ https://github.com/boto/botocore/blob/develop/botocore/data/iot/2015-05-28/service-2.json
+ """
+
+ # service response class should have 'SERVICE_NAME' class member,
+ # if you want to get action from method and url
+ if not hasattr(self, 'SERVICE_NAME'):
+ return None
+ service = self.SERVICE_NAME
+ conn = boto3.client(service, region_name=self.region)
+
+ # make cache if it does not exist yet
+ if not hasattr(self, 'method_urls'):
+ self.method_urls = defaultdict(lambda: defaultdict(str))
+ op_names = conn._service_model.operation_names
+ for op_name in op_names:
+ op_model = conn._service_model.operation_model(op_name)
+ _method = op_model.http['method']
+ uri_regexp = self.uri_to_regexp(op_model.http['requestUri'])
+ self.method_urls[_method][uri_regexp] = op_model.name
+ regexp_and_names = self.method_urls[method]
+ for regexp, name in regexp_and_names.items():
+ match = re.match(regexp, request_uri)
+ self.uri_match = match
+ if match:
+ return name
+ return None
+
+ def _get_action(self):
+ action = self.querystring.get('Action', [""])[0]
+ if not action: # Some services use a header for the action
+ # Headers are case-insensitive. Probably a better way to do this.
+ match = self.headers.get(
+ 'x-amz-target') or self.headers.get('X-Amz-Target')
+ if match:
+ action = match.split(".")[-1]
+ # get action from method and uri
+ if not action:
+ return self._get_action_from_method_and_request_uri(self.method, self.path)
+ return action
+
+ def call_action(self):
+ headers = self.response_headers
+ action = camelcase_to_underscores(self._get_action())
+ method_names = method_names_from_class(self.__class__)
+ if action in method_names:
+ method = getattr(self, action)
+ try:
+ response = method()
+ except HTTPException as http_error:
+ response = http_error.description, dict(status=http_error.code)
+
+ if isinstance(response, six.string_types):
+ return 200, headers, response
+ else:
+ if len(response) == 2:
+ body, new_headers = response
+ else:
+ status, new_headers, body = response
+ status = new_headers.get('status', 200)
+ headers.update(new_headers)
+ # Cast status to string
+ if "status" in headers:
+ headers['status'] = str(headers['status'])
+ return status, headers, body
+
+ if not action:
+ return 404, headers, ''
+
+ raise NotImplementedError(
+ "The {0} action has not been implemented".format(action))
+
+ def _get_param(self, param_name, if_none=None):
+ val = self.querystring.get(param_name)
+ if val is not None:
+ return val[0]
+
+ # try to get json body parameter
+ if self.body is not None:
+ try:
+ return json.loads(self.body)[param_name]
+ except ValueError:
+ pass
+ except KeyError:
+ pass
+ # try to get path parameter
+ if self.uri_match:
+ try:
+ return self.uri_match.group(param_name)
+ except IndexError:
+ # do nothing if param is not found
+ pass
+ return if_none
+
+ def _get_int_param(self, param_name, if_none=None):
+ val = self._get_param(param_name)
+ if val is not None:
+ return int(val)
+ return if_none
+
+ def _get_bool_param(self, param_name, if_none=None):
+ val = self._get_param(param_name)
+ if val is not None:
+ if val.lower() == 'true':
+ return True
+ elif val.lower() == 'false':
+ return False
+ return if_none
+
+ def _get_multi_param_helper(self, param_prefix):
+ value_dict = dict()
+ tracked_prefixes = set() # prefixes which have already been processed
+
+ def is_tracked(name_param):
+ for prefix_loop in tracked_prefixes:
+ if name_param.startswith(prefix_loop):
+ return True
+ return False
+
+ for name, value in self.querystring.items():
+ if is_tracked(name) or not name.startswith(param_prefix):
+ continue
+
+ if len(name) > len(param_prefix) and \
+ not name[len(param_prefix):].startswith('.'):
+ continue
+
+ match = self.param_list_regex.search(name[len(param_prefix):]) if len(name) > len(param_prefix) else None
+ if match:
+ prefix = param_prefix + match.group(1)
+ value = self._get_multi_param(prefix)
+ tracked_prefixes.add(prefix)
+ name = prefix
+ value_dict[name] = value
+ else:
+ value_dict[name] = value[0]
+
+ if not value_dict:
+ return None
+
+ if len(value_dict) > 1:
+ # strip off period prefix
+ value_dict = {name[len(param_prefix) + 1:]: value for name, value in value_dict.items()}
+ else:
+ value_dict = list(value_dict.values())[0]
+
+ return value_dict
+
+ def _get_multi_param(self, param_prefix):
+ """
+ Given a querystring of ?LaunchConfigurationNames.member.1=my-test-1&LaunchConfigurationNames.member.2=my-test-2
+ this will return ['my-test-1', 'my-test-2']
+ """
+ if param_prefix.endswith("."):
+ prefix = param_prefix
+ else:
+ prefix = param_prefix + "."
+ values = []
+ index = 1
+ while True:
+ value_dict = self._get_multi_param_helper(prefix + str(index))
+ if not value_dict:
+ break
+
+ values.append(value_dict)
+ index += 1
+
+ return values
+
+ def _get_dict_param(self, param_prefix):
+ """
+ Given a parameter dict of
+ {
+ 'Instances.SlaveInstanceType': ['m1.small'],
+ 'Instances.InstanceCount': ['1']
+ }
+
+ returns
+ {
+ "SlaveInstanceType": "m1.small",
+ "InstanceCount": "1",
+ }
+ """
+ params = {}
+ for key, value in self.querystring.items():
+ if key.startswith(param_prefix):
+ params[camelcase_to_underscores(
+ key.replace(param_prefix, ""))] = value[0]
+ return params
+
+ def _get_list_prefix(self, param_prefix):
+ """
+ Given a query dict like
+ {
+ 'Steps.member.1.Name': ['example1'],
+ 'Steps.member.1.ActionOnFailure': ['TERMINATE_JOB_FLOW'],
+ 'Steps.member.1.HadoopJarStep.Jar': ['streaming1.jar'],
+ 'Steps.member.2.Name': ['example2'],
+ 'Steps.member.2.ActionOnFailure': ['TERMINATE_JOB_FLOW'],
+ 'Steps.member.2.HadoopJarStep.Jar': ['streaming2.jar'],
+ }
+
+ returns
+ [{
+ 'name': u'example1',
+ 'action_on_failure': u'TERMINATE_JOB_FLOW',
+ 'hadoop_jar_step._jar': u'streaming1.jar',
+ }, {
+ 'name': u'example2',
+ 'action_on_failure': u'TERMINATE_JOB_FLOW',
+ 'hadoop_jar_step._jar': u'streaming2.jar',
+ }]
+ """
+ results = []
+ param_index = 1
+ while True:
+ index_prefix = "{0}.{1}.".format(param_prefix, param_index)
+ new_items = {}
+ for key, value in self.querystring.items():
+ if key.startswith(index_prefix):
+ new_items[camelcase_to_underscores(
+ key.replace(index_prefix, ""))] = value[0]
+ if not new_items:
+ break
+ results.append(new_items)
+ param_index += 1
+ return results
+
+ def _get_map_prefix(self, param_prefix, key_end='.key', value_end='.value'):
+ results = {}
+ param_index = 1
+ while 1:
+ index_prefix = '{0}.{1}.'.format(param_prefix, param_index)
+
+ k, v = None, None
+ for key, value in self.querystring.items():
+ if key.startswith(index_prefix):
+ if key.endswith(key_end):
+ k = value[0]
+ elif key.endswith(value_end):
+ v = value[0]
+
+ if not (k and v):
+ break
+
+ results[k] = v
+ param_index += 1
+
+ return results
+
+ def _parse_tag_specification(self, param_prefix):
+ tags = self._get_list_prefix(param_prefix)
+
+ results = defaultdict(dict)
+ for tag in tags:
+ resource_type = tag.pop("resource_type")
+
+ param_index = 1
+ while True:
+ key_name = 'tag.{0}._key'.format(param_index)
+ value_name = 'tag.{0}._value'.format(param_index)
+
+ try:
+ results[resource_type][tag[key_name]] = tag[value_name]
+ except KeyError:
+ break
+ param_index += 1
+
+ return results
+
+ def _get_object_map(self, prefix, name='Name', value='Value'):
+ """
+ Given a query dict like
+ {
+ Prefix.1.Name: [u'event'],
+ Prefix.1.Value.StringValue: [u'order_cancelled'],
+ Prefix.1.Value.DataType: [u'String'],
+ Prefix.2.Name: [u'store'],
+ Prefix.2.Value.StringValue: [u'example_corp'],
+ Prefix.2.Value.DataType [u'String'],
+ }
+
+ returns
+ {
+ 'event': {
+ 'DataType': 'String',
+ 'StringValue': 'example_corp'
+ },
+ 'store': {
+ 'DataType': 'String',
+ 'StringValue': 'order_cancelled'
+ }
+ }
+ """
+ object_map = {}
+ index = 1
+ while True:
+ # Loop through looking for keys representing object name
+ name_key = '{0}.{1}.{2}'.format(prefix, index, name)
+ obj_name = self.querystring.get(name_key)
+ if not obj_name:
+ # Found all keys
+ break
+
+ obj = {}
+ value_key_prefix = '{0}.{1}.{2}.'.format(
+ prefix, index, value)
+ for k, v in self.querystring.items():
+ if k.startswith(value_key_prefix):
+ _, value_key = k.split(value_key_prefix, 1)
+ obj[value_key] = v[0]
+
+ object_map[obj_name[0]] = obj
+
+ index += 1
+
+ return object_map
+
+ @property
+ def request_json(self):
+ return 'JSON' in self.querystring.get('ContentType', [])
+
+ def is_not_dryrun(self, action):
+ if 'true' in self.querystring.get('DryRun', ['false']):
+ message = 'An error occurred (DryRunOperation) when calling the %s operation: Request would have succeeded, but DryRun flag is set' % action
+ raise DryRunClientError(
+ error_type="DryRunOperation", message=message)
+ return True
+
+
+class MotoAPIResponse(BaseResponse):
+
+ def reset_response(self, request, full_url, headers):
+ if request.method == "POST":
+ from .models import moto_api_backend
+ moto_api_backend.reset()
+ return 200, {}, json.dumps({"status": "ok"})
+ return 400, {}, json.dumps({"Error": "Need to POST to reset Moto"})
+
+ def model_data(self, request, full_url, headers):
+ from moto.core.models import model_data
+
+ results = {}
+ for service in sorted(model_data):
+ models = model_data[service]
+ results[service] = {}
+ for name in sorted(models):
+ model = models[name]
+ results[service][name] = []
+ for instance in model.instances:
+ inst_result = {}
+ for attr in dir(instance):
+ if not attr.startswith("_"):
+ try:
+ json.dumps(getattr(instance, attr))
+ except TypeError:
+ pass
+ else:
+ inst_result[attr] = getattr(instance, attr)
+ results[service][name].append(inst_result)
+ return 200, {"Content-Type": "application/javascript"}, json.dumps(results)
+
+ def dashboard(self, request, full_url, headers):
+ from flask import render_template
+ return render_template('dashboard.html')
+
+
+class _RecursiveDictRef(object):
+ """Store a recursive reference to dict."""
+
+ def __init__(self):
+ self.key = None
+ self.dic = {}
+
+ def __repr__(self):
+ return '{!r}'.format(self.dic)
+
+ def __getattr__(self, key):
+ return self.dic.__getattr__(key)
+
+ def __getitem__(self, key):
+ return self.dic.__getitem__(key)
+
+ def set_reference(self, key, dic):
+ """Set the RecursiveDictRef object to keep reference to dict object
+ (dic) at the key.
+
+ """
+ self.key = key
+ self.dic = dic
+
+
+class AWSServiceSpec(object):
+ """Parse data model from botocore. This is used to recover type info
+ for fields in AWS API XML response.
+
+ """
+
+ def __init__(self, path):
+ self.path = resource_filename('botocore', path)
+ with io.open(self.path, 'r', encoding='utf-8') as f:
+ spec = json.load(f)
+ self.metadata = spec['metadata']
+ self.operations = spec['operations']
+ self.shapes = spec['shapes']
+
+ def input_spec(self, operation):
+ try:
+ op = self.operations[operation]
+ except KeyError:
+ raise ValueError('Invalid operation: {}'.format(operation))
+ if 'input' not in op:
+ return {}
+ shape = self.shapes[op['input']['shape']]
+ return self._expand(shape)
+
+ def output_spec(self, operation):
+ """Produce a JSON with a valid API response syntax for operation, but
+ with type information. Each node represented by a key has the
+ value containing field type, e.g.,
+
+ output_spec["SomeBooleanNode"] => {"type": "boolean"}
+
+ """
+ try:
+ op = self.operations[operation]
+ except KeyError:
+ raise ValueError('Invalid operation: {}'.format(operation))
+ if 'output' not in op:
+ return {}
+ shape = self.shapes[op['output']['shape']]
+ return self._expand(shape)
+
+ def _expand(self, shape):
+ def expand(dic, seen=None):
+ seen = seen or {}
+ if dic['type'] == 'structure':
+ nodes = {}
+ for k, v in dic['members'].items():
+ seen_till_here = dict(seen)
+ if k in seen_till_here:
+ nodes[k] = seen_till_here[k]
+ continue
+ seen_till_here[k] = _RecursiveDictRef()
+ nodes[k] = expand(self.shapes[v['shape']], seen_till_here)
+ seen_till_here[k].set_reference(k, nodes[k])
+ nodes['type'] = 'structure'
+ return nodes
+
+ elif dic['type'] == 'list':
+ seen_till_here = dict(seen)
+ shape = dic['member']['shape']
+ if shape in seen_till_here:
+ return seen_till_here[shape]
+ seen_till_here[shape] = _RecursiveDictRef()
+ expanded = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, expanded)
+ return {'type': 'list', 'member': expanded}
+
+ elif dic['type'] == 'map':
+ seen_till_here = dict(seen)
+ node = {'type': 'map'}
+
+ if 'shape' in dic['key']:
+ shape = dic['key']['shape']
+ seen_till_here[shape] = _RecursiveDictRef()
+ node['key'] = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, node['key'])
+ else:
+ node['key'] = dic['key']['type']
+
+ if 'shape' in dic['value']:
+ shape = dic['value']['shape']
+ seen_till_here[shape] = _RecursiveDictRef()
+ node['value'] = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, node['value'])
+ else:
+ node['value'] = dic['value']['type']
+
+ return node
+
+ else:
+ return {'type': dic['type']}
+
+ return expand(shape)
+
+
+def to_str(value, spec):
+ vtype = spec['type']
+ if vtype == 'boolean':
+ return 'true' if value else 'false'
+ elif vtype == 'integer':
+ return str(value)
+ elif vtype == 'float':
+ return str(value)
+ elif vtype == 'double':
+ return str(value)
+ elif vtype == 'timestamp':
+ return datetime.datetime.utcfromtimestamp(
+ value).replace(tzinfo=pytz.utc).isoformat()
+ elif vtype == 'string':
+ return str(value)
+ elif value is None:
+ return 'null'
+ else:
+ raise TypeError('Unknown type {}'.format(vtype))
+
+
+def from_str(value, spec):
+ vtype = spec['type']
+ if vtype == 'boolean':
+ return True if value == 'true' else False
+ elif vtype == 'integer':
+ return int(value)
+ elif vtype == 'float':
+ return float(value)
+ elif vtype == 'double':
+ return float(value)
+ elif vtype == 'timestamp':
+ return value
+ elif vtype == 'string':
+ return value
+ raise TypeError('Unknown type {}'.format(vtype))
+
+
+def flatten_json_request_body(prefix, dict_body, spec):
+ """Convert a JSON request body into query params."""
+ if len(spec) == 1 and 'type' in spec:
+ return {prefix: to_str(dict_body, spec)}
+
+ flat = {}
+ for key, value in dict_body.items():
+ node_type = spec[key]['type']
+ if node_type == 'list':
+ for idx, v in enumerate(value, 1):
+ pref = key + '.member.' + str(idx)
+ flat.update(flatten_json_request_body(
+ pref, v, spec[key]['member']))
+ elif node_type == 'map':
+ for idx, (k, v) in enumerate(value.items(), 1):
+ pref = key + '.entry.' + str(idx)
+ flat.update(flatten_json_request_body(
+ pref + '.key', k, spec[key]['key']))
+ flat.update(flatten_json_request_body(
+ pref + '.value', v, spec[key]['value']))
+ else:
+ flat.update(flatten_json_request_body(key, value, spec[key]))
+
+ if prefix:
+ prefix = prefix + '.'
+ return dict((prefix + k, v) for k, v in flat.items())
+
+
+def xml_to_json_response(service_spec, operation, xml, result_node=None):
+ """Convert rendered XML response to JSON for use with boto3."""
+
+ def transform(value, spec):
+ """Apply transformations to make the output JSON comply with the
+ expected form. This function applies:
+
+ (1) Type cast to nodes with "type" property (e.g., 'true' to
+ True). XML field values are all in text so this step is
+ necessary to convert it to valid JSON objects.
+
+ (2) Squashes "member" nodes to lists.
+
+ """
+ if len(spec) == 1:
+ return from_str(value, spec)
+
+ od = OrderedDict()
+ for k, v in value.items():
+ if k.startswith('@'):
+ continue
+
+ if k not in spec:
+ # this can happen when with an older version of
+ # botocore for which the node in XML template is not
+ # defined in service spec.
+ log.warning(
+ 'Field %s is not defined by the botocore version in use', k)
+ continue
+
+ if spec[k]['type'] == 'list':
+ if v is None:
+ od[k] = []
+ elif len(spec[k]['member']) == 1:
+ if isinstance(v['member'], list):
+ od[k] = transform(v['member'], spec[k]['member'])
+ else:
+ od[k] = [transform(v['member'], spec[k]['member'])]
+ elif isinstance(v['member'], list):
+ od[k] = [transform(o, spec[k]['member'])
+ for o in v['member']]
+ elif isinstance(v['member'], OrderedDict):
+ od[k] = [transform(v['member'], spec[k]['member'])]
+ else:
+ raise ValueError('Malformatted input')
+ elif spec[k]['type'] == 'map':
+ if v is None:
+ od[k] = {}
+ else:
+ items = ([v['entry']] if not isinstance(v['entry'], list) else
+ v['entry'])
+ for item in items:
+ key = from_str(item['key'], spec[k]['key'])
+ val = from_str(item['value'], spec[k]['value'])
+ if k not in od:
+ od[k] = {}
+ od[k][key] = val
+ else:
+ if v is None:
+ od[k] = None
+ else:
+ od[k] = transform(v, spec[k])
+ return od
+
+ dic = xmltodict.parse(xml)
+ output_spec = service_spec.output_spec(operation)
+ try:
+ for k in (result_node or (operation + 'Response', operation + 'Result')):
+ dic = dic[k]
+ except KeyError:
+ return None
+ else:
+ return transform(dic, output_spec)
+ return None
diff --git a/contrib/python/moto/py2/moto/core/urls.py b/contrib/python/moto/py2/moto/core/urls.py
new file mode 100644
index 0000000000..4d4906d770
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/urls.py
@@ -0,0 +1,14 @@
+from __future__ import unicode_literals
+from .responses import MotoAPIResponse
+
+url_bases = [
+ "https?://motoapi.amazonaws.com"
+]
+
+response_instance = MotoAPIResponse()
+
+url_paths = {
+ '{0}/moto-api/$': response_instance.dashboard,
+ '{0}/moto-api/data.json': response_instance.model_data,
+ '{0}/moto-api/reset': response_instance.reset_response,
+}
diff --git a/contrib/python/moto/py2/moto/core/utils.py b/contrib/python/moto/py2/moto/core/utils.py
new file mode 100644
index 0000000000..777a03752b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/core/utils.py
@@ -0,0 +1,299 @@
+from __future__ import unicode_literals
+from functools import wraps
+
+import binascii
+import datetime
+import inspect
+import random
+import re
+import six
+import string
+from six.moves.urllib.parse import urlparse
+
+
+REQUEST_ID_LONG = string.digits + string.ascii_uppercase
+
+
+def camelcase_to_underscores(argument):
+ ''' Converts a camelcase param like theNewAttribute to the equivalent
+ python underscore variable like the_new_attribute'''
+ result = ''
+ prev_char_title = True
+ if not argument:
+ return argument
+ for index, char in enumerate(argument):
+ try:
+ next_char_title = argument[index + 1].istitle()
+ except IndexError:
+ next_char_title = True
+
+ upper_to_lower = char.istitle() and not next_char_title
+ lower_to_upper = char.istitle() and not prev_char_title
+
+ if index and (upper_to_lower or lower_to_upper):
+ # Only add underscore if char is capital, not first letter, and next
+ # char is not capital
+ result += "_"
+ prev_char_title = char.istitle()
+ if not char.isspace(): # Only add non-whitespace
+ result += char.lower()
+ return result
+
+
+def underscores_to_camelcase(argument):
+ ''' Converts a camelcase param like the_new_attribute to the equivalent
+ camelcase version like theNewAttribute. Note that the first letter is
+ NOT capitalized by this function '''
+ result = ''
+ previous_was_underscore = False
+ for char in argument:
+ if char != '_':
+ if previous_was_underscore:
+ result += char.upper()
+ else:
+ result += char
+ previous_was_underscore = char == '_'
+ return result
+
+
+def method_names_from_class(clazz):
+ # On Python 2, methods are different from functions, and the `inspect`
+ # predicates distinguish between them. On Python 3, methods are just
+ # regular functions, and `inspect.ismethod` doesn't work, so we have to
+ # use `inspect.isfunction` instead
+ if six.PY2:
+ predicate = inspect.ismethod
+ else:
+ predicate = inspect.isfunction
+ return [x[0] for x in inspect.getmembers(clazz, predicate=predicate)]
+
+
+def get_random_hex(length=8):
+ chars = list(range(10)) + ['a', 'b', 'c', 'd', 'e', 'f']
+ return ''.join(six.text_type(random.choice(chars)) for x in range(length))
+
+
+def get_random_message_id():
+ return '{0}-{1}-{2}-{3}-{4}'.format(get_random_hex(8), get_random_hex(4), get_random_hex(4), get_random_hex(4), get_random_hex(12))
+
+
+def convert_regex_to_flask_path(url_path):
+ """
+ Converts a regex matching url to one that can be used with flask
+ """
+ for token in ["$"]:
+ url_path = url_path.replace(token, "")
+
+ def caller(reg):
+ match_name, match_pattern = reg.groups()
+ return '<regex("{0}"):{1}>'.format(match_pattern, match_name)
+
+ url_path = re.sub("\(\?P<(.*?)>(.*?)\)", caller, url_path)
+
+ if url_path.endswith("/?"):
+ # Flask does own handling of trailing slashes
+ url_path = url_path.rstrip("/?")
+ return url_path
+
+
+class convert_httpretty_response(object):
+
+ def __init__(self, callback):
+ self.callback = callback
+
+ @property
+ def __name__(self):
+ # For instance methods, use class and method names. Otherwise
+ # use module and method name
+ if inspect.ismethod(self.callback):
+ outer = self.callback.__self__.__class__.__name__
+ else:
+ outer = self.callback.__module__
+ return "{0}.{1}".format(outer, self.callback.__name__)
+
+ def __call__(self, request, url, headers, **kwargs):
+ result = self.callback(request, url, headers)
+ status, headers, response = result
+ if 'server' not in headers:
+ headers["server"] = "amazon.com"
+ return status, headers, response
+
+
+class convert_flask_to_httpretty_response(object):
+
+ def __init__(self, callback):
+ self.callback = callback
+
+ @property
+ def __name__(self):
+ # For instance methods, use class and method names. Otherwise
+ # use module and method name
+ if inspect.ismethod(self.callback):
+ outer = self.callback.__self__.__class__.__name__
+ else:
+ outer = self.callback.__module__
+ return "{0}.{1}".format(outer, self.callback.__name__)
+
+ def __call__(self, args=None, **kwargs):
+ from flask import request, Response
+
+ result = self.callback(request, request.url, {})
+ # result is a status, headers, response tuple
+ if len(result) == 3:
+ status, headers, content = result
+ else:
+ status, headers, content = 200, {}, result
+
+ response = Response(response=content, status=status, headers=headers)
+ if request.method == "HEAD" and 'content-length' in headers:
+ response.headers['Content-Length'] = headers['content-length']
+ return response
+
+
+class convert_flask_to_responses_response(object):
+
+ def __init__(self, callback):
+ self.callback = callback
+
+ @property
+ def __name__(self):
+ # For instance methods, use class and method names. Otherwise
+ # use module and method name
+ if inspect.ismethod(self.callback):
+ outer = self.callback.__self__.__class__.__name__
+ else:
+ outer = self.callback.__module__
+ return "{0}.{1}".format(outer, self.callback.__name__)
+
+ def __call__(self, request, *args, **kwargs):
+ for key, val in request.headers.items():
+ if isinstance(val, six.binary_type):
+ request.headers[key] = val.decode("utf-8")
+
+ result = self.callback(request, request.url, request.headers)
+ status, headers, response = result
+ return status, headers, response
+
+
+def iso_8601_datetime_with_milliseconds(datetime):
+ return datetime.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z'
+
+
+def iso_8601_datetime_without_milliseconds(datetime):
+ return datetime.strftime("%Y-%m-%dT%H:%M:%S") + 'Z'
+
+
+RFC1123 = '%a, %d %b %Y %H:%M:%S GMT'
+
+
+def rfc_1123_datetime(datetime):
+ return datetime.strftime(RFC1123)
+
+
+def str_to_rfc_1123_datetime(str):
+ return datetime.datetime.strptime(str, RFC1123)
+
+
+def unix_time(dt=None):
+ dt = dt or datetime.datetime.utcnow()
+ epoch = datetime.datetime.utcfromtimestamp(0)
+ delta = dt - epoch
+ return (delta.days * 86400) + (delta.seconds + (delta.microseconds / 1e6))
+
+
+def unix_time_millis(dt=None):
+ return unix_time(dt) * 1000.0
+
+
+def gen_amz_crc32(response, headerdict=None):
+ if not isinstance(response, bytes):
+ response = response.encode()
+
+ crc = str(binascii.crc32(response))
+
+ if headerdict is not None and isinstance(headerdict, dict):
+ headerdict.update({'x-amz-crc32': crc})
+
+ return crc
+
+
+def gen_amzn_requestid_long(headerdict=None):
+ req_id = ''.join([random.choice(REQUEST_ID_LONG) for _ in range(0, 52)])
+
+ if headerdict is not None and isinstance(headerdict, dict):
+ headerdict.update({'x-amzn-requestid': req_id})
+
+ return req_id
+
+
+def amz_crc32(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ response = f(*args, **kwargs)
+
+ headers = {}
+ status = 200
+
+ if isinstance(response, six.string_types):
+ body = response
+ else:
+ if len(response) == 2:
+ body, new_headers = response
+ status = new_headers.get('status', 200)
+ else:
+ status, new_headers, body = response
+ headers.update(new_headers)
+ # Cast status to string
+ if "status" in headers:
+ headers['status'] = str(headers['status'])
+
+ try:
+ # Doesnt work on python2 for some odd unicode strings
+ gen_amz_crc32(body, headers)
+ except Exception:
+ pass
+
+ return status, headers, body
+
+ return _wrapper
+
+
+def amzn_request_id(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ response = f(*args, **kwargs)
+
+ headers = {}
+ status = 200
+
+ if isinstance(response, six.string_types):
+ body = response
+ else:
+ if len(response) == 2:
+ body, new_headers = response
+ status = new_headers.get('status', 200)
+ else:
+ status, new_headers, body = response
+ headers.update(new_headers)
+
+ request_id = gen_amzn_requestid_long(headers)
+
+ # Update request ID in XML
+ try:
+ body = body.replace('{{ requestid }}', request_id)
+ except Exception: # Will just ignore if it cant work on bytes (which are str's on python2)
+ pass
+
+ return status, headers, body
+
+ return _wrapper
+
+
+def path_url(url):
+ parsed_url = urlparse(url)
+ path = parsed_url.path
+ if not path:
+ path = '/'
+ if parsed_url.query:
+ path = path + '?' + parsed_url.query
+ return path
diff --git a/contrib/python/moto/py2/moto/ec2/__init__.py b/contrib/python/moto/py2/moto/ec2/__init__.py
new file mode 100644
index 0000000000..ba8cbe0a0c
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/__init__.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+from .models import ec2_backends
+from ..core.models import base_decorator, deprecated_base_decorator
+
+ec2_backend = ec2_backends['us-east-1']
+mock_ec2 = base_decorator(ec2_backends)
+mock_ec2_deprecated = deprecated_base_decorator(ec2_backends)
diff --git a/contrib/python/moto/py2/moto/ec2/exceptions.py b/contrib/python/moto/py2/moto/ec2/exceptions.py
new file mode 100644
index 0000000000..f747c9cd5d
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/exceptions.py
@@ -0,0 +1,422 @@
+from __future__ import unicode_literals
+from moto.core.exceptions import RESTError
+
+
+class EC2ClientError(RESTError):
+ code = 400
+
+
+class DependencyViolationError(EC2ClientError):
+
+ def __init__(self, message):
+ super(DependencyViolationError, self).__init__(
+ "DependencyViolation", message)
+
+
+class MissingParameterError(EC2ClientError):
+
+ def __init__(self, parameter):
+ super(MissingParameterError, self).__init__(
+ "MissingParameter",
+ "The request must contain the parameter {0}"
+ .format(parameter))
+
+
+class InvalidDHCPOptionsIdError(EC2ClientError):
+
+ def __init__(self, dhcp_options_id):
+ super(InvalidDHCPOptionsIdError, self).__init__(
+ "InvalidDhcpOptionID.NotFound",
+ "DhcpOptionID {0} does not exist."
+ .format(dhcp_options_id))
+
+
+class MalformedDHCPOptionsIdError(EC2ClientError):
+
+ def __init__(self, dhcp_options_id):
+ super(MalformedDHCPOptionsIdError, self).__init__(
+ "InvalidDhcpOptionsId.Malformed",
+ "Invalid id: \"{0}\" (expecting \"dopt-...\")"
+ .format(dhcp_options_id))
+
+
+class InvalidKeyPairNameError(EC2ClientError):
+
+ def __init__(self, key):
+ super(InvalidKeyPairNameError, self).__init__(
+ "InvalidKeyPair.NotFound",
+ "The keypair '{0}' does not exist."
+ .format(key))
+
+
+class InvalidKeyPairDuplicateError(EC2ClientError):
+
+ def __init__(self, key):
+ super(InvalidKeyPairDuplicateError, self).__init__(
+ "InvalidKeyPair.Duplicate",
+ "The keypair '{0}' already exists."
+ .format(key))
+
+
+class InvalidVPCIdError(EC2ClientError):
+
+ def __init__(self, vpc_id):
+ super(InvalidVPCIdError, self).__init__(
+ "InvalidVpcID.NotFound",
+ "VpcID {0} does not exist."
+ .format(vpc_id))
+
+
+class InvalidSubnetIdError(EC2ClientError):
+
+ def __init__(self, subnet_id):
+ super(InvalidSubnetIdError, self).__init__(
+ "InvalidSubnetID.NotFound",
+ "The subnet ID '{0}' does not exist"
+ .format(subnet_id))
+
+
+class InvalidNetworkAclIdError(EC2ClientError):
+
+ def __init__(self, network_acl_id):
+ super(InvalidNetworkAclIdError, self).__init__(
+ "InvalidNetworkAclID.NotFound",
+ "The network acl ID '{0}' does not exist"
+ .format(network_acl_id))
+
+
+class InvalidVpnGatewayIdError(EC2ClientError):
+
+ def __init__(self, network_acl_id):
+ super(InvalidVpnGatewayIdError, self).__init__(
+ "InvalidVpnGatewayID.NotFound",
+ "The virtual private gateway ID '{0}' does not exist"
+ .format(network_acl_id))
+
+
+class InvalidVpnConnectionIdError(EC2ClientError):
+
+ def __init__(self, network_acl_id):
+ super(InvalidVpnConnectionIdError, self).__init__(
+ "InvalidVpnConnectionID.NotFound",
+ "The vpnConnection ID '{0}' does not exist"
+ .format(network_acl_id))
+
+
+class InvalidCustomerGatewayIdError(EC2ClientError):
+
+ def __init__(self, customer_gateway_id):
+ super(InvalidCustomerGatewayIdError, self).__init__(
+ "InvalidCustomerGatewayID.NotFound",
+ "The customer gateway ID '{0}' does not exist"
+ .format(customer_gateway_id))
+
+
+class InvalidNetworkInterfaceIdError(EC2ClientError):
+
+ def __init__(self, eni_id):
+ super(InvalidNetworkInterfaceIdError, self).__init__(
+ "InvalidNetworkInterfaceID.NotFound",
+ "The network interface ID '{0}' does not exist"
+ .format(eni_id))
+
+
+class InvalidNetworkAttachmentIdError(EC2ClientError):
+
+ def __init__(self, attachment_id):
+ super(InvalidNetworkAttachmentIdError, self).__init__(
+ "InvalidAttachmentID.NotFound",
+ "The network interface attachment ID '{0}' does not exist"
+ .format(attachment_id))
+
+
+class InvalidSecurityGroupDuplicateError(EC2ClientError):
+
+ def __init__(self, name):
+ super(InvalidSecurityGroupDuplicateError, self).__init__(
+ "InvalidGroup.Duplicate",
+ "The security group '{0}' already exists"
+ .format(name))
+
+
+class InvalidSecurityGroupNotFoundError(EC2ClientError):
+
+ def __init__(self, name):
+ super(InvalidSecurityGroupNotFoundError, self).__init__(
+ "InvalidGroup.NotFound",
+ "The security group '{0}' does not exist"
+ .format(name))
+
+
+class InvalidPermissionNotFoundError(EC2ClientError):
+
+ def __init__(self):
+ super(InvalidPermissionNotFoundError, self).__init__(
+ "InvalidPermission.NotFound",
+ "The specified rule does not exist in this security group")
+
+
+class InvalidPermissionDuplicateError(EC2ClientError):
+
+ def __init__(self):
+ super(InvalidPermissionDuplicateError, self).__init__(
+ "InvalidPermission.Duplicate",
+ "The specified rule already exists")
+
+
+class InvalidRouteTableIdError(EC2ClientError):
+
+ def __init__(self, route_table_id):
+ super(InvalidRouteTableIdError, self).__init__(
+ "InvalidRouteTableID.NotFound",
+ "The routeTable ID '{0}' does not exist"
+ .format(route_table_id))
+
+
+class InvalidRouteError(EC2ClientError):
+
+ def __init__(self, route_table_id, cidr):
+ super(InvalidRouteError, self).__init__(
+ "InvalidRoute.NotFound",
+ "no route with destination-cidr-block {0} in route table {1}"
+ .format(cidr, route_table_id))
+
+
+class InvalidInstanceIdError(EC2ClientError):
+
+ def __init__(self, instance_id):
+ super(InvalidInstanceIdError, self).__init__(
+ "InvalidInstanceID.NotFound",
+ "The instance ID '{0}' does not exist"
+ .format(instance_id))
+
+
+class InvalidAMIIdError(EC2ClientError):
+
+ def __init__(self, ami_id):
+ super(InvalidAMIIdError, self).__init__(
+ "InvalidAMIID.NotFound",
+ "The image id '[{0}]' does not exist"
+ .format(ami_id))
+
+
+class InvalidAMIAttributeItemValueError(EC2ClientError):
+
+ def __init__(self, attribute, value):
+ super(InvalidAMIAttributeItemValueError, self).__init__(
+ "InvalidAMIAttributeItemValue",
+ "Invalid attribute item value \"{0}\" for {1} item type."
+ .format(value, attribute))
+
+
+class MalformedAMIIdError(EC2ClientError):
+
+ def __init__(self, ami_id):
+ super(MalformedAMIIdError, self).__init__(
+ "InvalidAMIID.Malformed",
+ "Invalid id: \"{0}\" (expecting \"ami-...\")"
+ .format(ami_id))
+
+
+class InvalidSnapshotIdError(EC2ClientError):
+
+ def __init__(self, snapshot_id):
+ super(InvalidSnapshotIdError, self).__init__(
+ "InvalidSnapshot.NotFound",
+ "") # Note: AWS returns empty message for this, as of 2014.08.22.
+
+
+class InvalidVolumeIdError(EC2ClientError):
+
+ def __init__(self, volume_id):
+ super(InvalidVolumeIdError, self).__init__(
+ "InvalidVolume.NotFound",
+ "The volume '{0}' does not exist."
+ .format(volume_id))
+
+
+class InvalidVolumeAttachmentError(EC2ClientError):
+
+ def __init__(self, volume_id, instance_id):
+ super(InvalidVolumeAttachmentError, self).__init__(
+ "InvalidAttachment.NotFound",
+ "Volume {0} can not be detached from {1} because it is not attached"
+ .format(volume_id, instance_id))
+
+
+class InvalidDomainError(EC2ClientError):
+
+ def __init__(self, domain):
+ super(InvalidDomainError, self).__init__(
+ "InvalidParameterValue",
+ "Invalid value '{0}' for domain."
+ .format(domain))
+
+
+class InvalidAddressError(EC2ClientError):
+
+ def __init__(self, ip):
+ super(InvalidAddressError, self).__init__(
+ "InvalidAddress.NotFound",
+ "Address '{0}' not found."
+ .format(ip))
+
+
+class InvalidAllocationIdError(EC2ClientError):
+
+ def __init__(self, allocation_id):
+ super(InvalidAllocationIdError, self).__init__(
+ "InvalidAllocationID.NotFound",
+ "Allocation ID '{0}' not found."
+ .format(allocation_id))
+
+
+class InvalidAssociationIdError(EC2ClientError):
+
+ def __init__(self, association_id):
+ super(InvalidAssociationIdError, self).__init__(
+ "InvalidAssociationID.NotFound",
+ "Association ID '{0}' not found."
+ .format(association_id))
+
+
+class InvalidVpcCidrBlockAssociationIdError(EC2ClientError):
+
+ def __init__(self, association_id):
+ super(InvalidVpcCidrBlockAssociationIdError, self).__init__(
+ "InvalidVpcCidrBlockAssociationIdError.NotFound",
+ "The vpc CIDR block association ID '{0}' does not exist"
+ .format(association_id))
+
+
+class InvalidVPCPeeringConnectionIdError(EC2ClientError):
+
+ def __init__(self, vpc_peering_connection_id):
+ super(InvalidVPCPeeringConnectionIdError, self).__init__(
+ "InvalidVpcPeeringConnectionId.NotFound",
+ "VpcPeeringConnectionID {0} does not exist."
+ .format(vpc_peering_connection_id))
+
+
+class InvalidVPCPeeringConnectionStateTransitionError(EC2ClientError):
+
+ def __init__(self, vpc_peering_connection_id):
+ super(InvalidVPCPeeringConnectionStateTransitionError, self).__init__(
+ "InvalidStateTransition",
+ "VpcPeeringConnectionID {0} is not in the correct state for the request."
+ .format(vpc_peering_connection_id))
+
+
+class InvalidParameterValueError(EC2ClientError):
+
+ def __init__(self, parameter_value):
+ super(InvalidParameterValueError, self).__init__(
+ "InvalidParameterValue",
+ "Value {0} is invalid for parameter."
+ .format(parameter_value))
+
+
+class InvalidParameterValueErrorTagNull(EC2ClientError):
+
+ def __init__(self):
+ super(InvalidParameterValueErrorTagNull, self).__init__(
+ "InvalidParameterValue",
+ "Tag value cannot be null. Use empty string instead.")
+
+
+class InvalidInternetGatewayIdError(EC2ClientError):
+
+ def __init__(self, internet_gateway_id):
+ super(InvalidInternetGatewayIdError, self).__init__(
+ "InvalidInternetGatewayID.NotFound",
+ "InternetGatewayID {0} does not exist."
+ .format(internet_gateway_id))
+
+
+class GatewayNotAttachedError(EC2ClientError):
+
+ def __init__(self, internet_gateway_id, vpc_id):
+ super(GatewayNotAttachedError, self).__init__(
+ "Gateway.NotAttached",
+ "InternetGatewayID {0} is not attached to a VPC {1}."
+ .format(internet_gateway_id, vpc_id))
+
+
+class ResourceAlreadyAssociatedError(EC2ClientError):
+
+ def __init__(self, resource_id):
+ super(ResourceAlreadyAssociatedError, self).__init__(
+ "Resource.AlreadyAssociated",
+ "Resource {0} is already associated."
+ .format(resource_id))
+
+
+class TagLimitExceeded(EC2ClientError):
+
+ def __init__(self):
+ super(TagLimitExceeded, self).__init__(
+ "TagLimitExceeded",
+ "The maximum number of Tags for a resource has been reached.")
+
+
+class InvalidID(EC2ClientError):
+
+ def __init__(self, resource_id):
+ super(InvalidID, self).__init__(
+ "InvalidID",
+ "The ID '{0}' is not valid"
+ .format(resource_id))
+
+
+class InvalidCIDRSubnetError(EC2ClientError):
+
+ def __init__(self, cidr):
+ super(InvalidCIDRSubnetError, self).__init__(
+ "InvalidParameterValue",
+ "invalid CIDR subnet specification: {0}"
+ .format(cidr))
+
+
+class RulesPerSecurityGroupLimitExceededError(EC2ClientError):
+
+ def __init__(self):
+ super(RulesPerSecurityGroupLimitExceededError, self).__init__(
+ "RulesPerSecurityGroupLimitExceeded",
+ 'The maximum number of rules per security group '
+ 'has been reached.')
+
+
+class MotoNotImplementedError(NotImplementedError):
+
+ def __init__(self, blurb):
+ super(MotoNotImplementedError, self).__init__(
+ "{0} has not been implemented in Moto yet."
+ " Feel free to open an issue at"
+ " https://github.com/spulec/moto/issues".format(blurb))
+
+
+class FilterNotImplementedError(MotoNotImplementedError):
+
+ def __init__(self, filter_name, method_name):
+ super(FilterNotImplementedError, self).__init__(
+ "The filter '{0}' for {1}".format(
+ filter_name, method_name))
+
+
+class CidrLimitExceeded(EC2ClientError):
+
+ def __init__(self, vpc_id, max_cidr_limit):
+ super(CidrLimitExceeded, self).__init__(
+ "CidrLimitExceeded",
+ "This network '{0}' has met its maximum number of allowed CIDRs: {1}".format(vpc_id, max_cidr_limit)
+ )
+
+
+class OperationNotPermitted(EC2ClientError):
+
+ def __init__(self, association_id):
+ super(OperationNotPermitted, self).__init__(
+ "OperationNotPermitted",
+ "The vpc CIDR block with association ID {} may not be disassociated. "
+ "It is the primary IPv4 CIDR block of the VPC".format(association_id)
+ )
diff --git a/contrib/python/moto/py2/moto/ec2/models.py b/contrib/python/moto/py2/moto/ec2/models.py
new file mode 100644
index 0000000000..ff9fd71b61
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/models.py
@@ -0,0 +1,4008 @@
+from __future__ import unicode_literals
+
+import copy
+import itertools
+import ipaddress
+import json
+import os
+import re
+import six
+import warnings
+from pkg_resources import resource_filename
+
+import boto.ec2
+
+from collections import defaultdict
+import weakref
+from datetime import datetime
+from boto.ec2.instance import Instance as BotoInstance, Reservation
+from boto.ec2.blockdevicemapping import BlockDeviceMapping, BlockDeviceType
+from boto.ec2.spotinstancerequest import SpotInstanceRequest as BotoSpotRequest
+from boto.ec2.launchspecification import LaunchSpecification
+
+from moto.compat import OrderedDict
+from moto.core import BaseBackend
+from moto.core.models import Model, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, camelcase_to_underscores
+from .exceptions import (
+ CidrLimitExceeded,
+ DependencyViolationError,
+ EC2ClientError,
+ FilterNotImplementedError,
+ GatewayNotAttachedError,
+ InvalidAddressError,
+ InvalidAllocationIdError,
+ InvalidAMIIdError,
+ InvalidAMIAttributeItemValueError,
+ InvalidAssociationIdError,
+ InvalidCIDRSubnetError,
+ InvalidCustomerGatewayIdError,
+ InvalidDHCPOptionsIdError,
+ InvalidDomainError,
+ InvalidID,
+ InvalidInstanceIdError,
+ InvalidInternetGatewayIdError,
+ InvalidKeyPairDuplicateError,
+ InvalidKeyPairNameError,
+ InvalidNetworkAclIdError,
+ InvalidNetworkAttachmentIdError,
+ InvalidNetworkInterfaceIdError,
+ InvalidParameterValueError,
+ InvalidParameterValueErrorTagNull,
+ InvalidPermissionNotFoundError,
+ InvalidPermissionDuplicateError,
+ InvalidRouteTableIdError,
+ InvalidRouteError,
+ InvalidSecurityGroupDuplicateError,
+ InvalidSecurityGroupNotFoundError,
+ InvalidSnapshotIdError,
+ InvalidSubnetIdError,
+ InvalidVolumeIdError,
+ InvalidVolumeAttachmentError,
+ InvalidVpcCidrBlockAssociationIdError,
+ InvalidVPCPeeringConnectionIdError,
+ InvalidVPCPeeringConnectionStateTransitionError,
+ InvalidVPCIdError,
+ InvalidVpnGatewayIdError,
+ InvalidVpnConnectionIdError,
+ MalformedAMIIdError,
+ MalformedDHCPOptionsIdError,
+ MissingParameterError,
+ MotoNotImplementedError,
+ OperationNotPermitted,
+ ResourceAlreadyAssociatedError,
+ RulesPerSecurityGroupLimitExceededError,
+ TagLimitExceeded)
+from .utils import (
+ EC2_RESOURCE_TO_PREFIX,
+ EC2_PREFIX_TO_RESOURCE,
+ random_ami_id,
+ random_dhcp_option_id,
+ random_eip_allocation_id,
+ random_eip_association_id,
+ random_eni_attach_id,
+ random_eni_id,
+ random_instance_id,
+ random_internet_gateway_id,
+ random_ip,
+ random_ipv6_cidr,
+ random_nat_gateway_id,
+ random_key_pair,
+ random_private_ip,
+ random_public_ip,
+ random_reservation_id,
+ random_route_table_id,
+ generate_route_id,
+ split_route_id,
+ random_security_group_id,
+ random_snapshot_id,
+ random_spot_fleet_request_id,
+ random_spot_request_id,
+ random_subnet_id,
+ random_subnet_association_id,
+ random_volume_id,
+ random_vpc_id,
+ random_vpc_cidr_association_id,
+ random_vpc_peering_connection_id,
+ generic_filter,
+ is_valid_resource_id,
+ get_prefix,
+ simple_aws_filter_to_re,
+ is_valid_cidr,
+ filter_internet_gateways,
+ filter_reservations,
+ random_network_acl_id,
+ random_network_acl_subnet_association_id,
+ random_vpn_gateway_id,
+ random_vpn_connection_id,
+ random_customer_gateway_id,
+ is_tag_filter,
+ tag_filter_matches,
+)
+
+# load from ya-resources
+import library.python.resource as _ya_res
+
+INSTANCE_TYPES = json.loads(_ya_res.find('resource/instance_types.json'))
+AMIS = json.loads(_ya_res.find('resource/amis.json'))
+
+
+def utc_date_and_time():
+ return datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.000Z')
+
+
+def validate_resource_ids(resource_ids):
+ if not resource_ids:
+ raise MissingParameterError(parameter='resourceIdSet')
+ for resource_id in resource_ids:
+ if not is_valid_resource_id(resource_id):
+ raise InvalidID(resource_id=resource_id)
+ return True
+
+
+class InstanceState(object):
+ def __init__(self, name='pending', code=0):
+ self.name = name
+ self.code = code
+
+
+class StateReason(object):
+ def __init__(self, message="", code=""):
+ self.message = message
+ self.code = code
+
+
+class TaggedEC2Resource(BaseModel):
+ def get_tags(self, *args, **kwargs):
+ tags = self.ec2_backend.describe_tags(
+ filters={'resource-id': [self.id]})
+ return tags
+
+ def add_tag(self, key, value):
+ self.ec2_backend.create_tags([self.id], {key: value})
+
+ def add_tags(self, tag_map):
+ for key, value in tag_map.items():
+ self.ec2_backend.create_tags([self.id], {key: value})
+
+ def get_filter_value(self, filter_name, method_name=None):
+ tags = self.get_tags()
+
+ if filter_name.startswith('tag:'):
+ tagname = filter_name.replace('tag:', '', 1)
+ for tag in tags:
+ if tag['key'] == tagname:
+ return tag['value']
+
+ return ''
+ elif filter_name == 'tag-key':
+ return [tag['key'] for tag in tags]
+ elif filter_name == 'tag-value':
+ return [tag['value'] for tag in tags]
+ else:
+ raise FilterNotImplementedError(filter_name, method_name)
+
+
+class NetworkInterface(TaggedEC2Resource):
+ def __init__(self, ec2_backend, subnet, private_ip_address, device_index=0,
+ public_ip_auto_assign=True, group_ids=None):
+ self.ec2_backend = ec2_backend
+ self.id = random_eni_id()
+ self.device_index = device_index
+ self.private_ip_address = private_ip_address or random_private_ip()
+ self.subnet = subnet
+ self.instance = None
+ self.attachment_id = None
+
+ self.public_ip = None
+ self.public_ip_auto_assign = public_ip_auto_assign
+ self.start()
+
+ self.attachments = []
+
+ # Local set to the ENI. When attached to an instance, @property group_set
+ # returns groups for both self and the attached instance.
+ self._group_set = []
+
+ group = None
+ if group_ids:
+ for group_id in group_ids:
+ group = self.ec2_backend.get_security_group_from_id(group_id)
+ if not group:
+ # Create with specific group ID.
+ group = SecurityGroup(
+ self.ec2_backend, group_id, group_id, group_id, vpc_id=subnet.vpc_id)
+ self.ec2_backend.groups[subnet.vpc_id][group_id] = group
+ if group:
+ self._group_set.append(group)
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ security_group_ids = properties.get('SecurityGroups', [])
+
+ ec2_backend = ec2_backends[region_name]
+ subnet_id = properties.get('SubnetId')
+ if subnet_id:
+ subnet = ec2_backend.get_subnet(subnet_id)
+ else:
+ subnet = None
+
+ private_ip_address = properties.get('PrivateIpAddress', None)
+
+ network_interface = ec2_backend.create_network_interface(
+ subnet,
+ private_ip_address,
+ group_ids=security_group_ids
+ )
+ return network_interface
+
+ def stop(self):
+ if self.public_ip_auto_assign:
+ self.public_ip = None
+
+ def start(self):
+ self.check_auto_public_ip()
+
+ def check_auto_public_ip(self):
+ if self.public_ip_auto_assign:
+ self.public_ip = random_public_ip()
+
+ @property
+ def group_set(self):
+ if self.instance and self.instance.security_groups:
+ return set(self._group_set) | set(self.instance.security_groups)
+ else:
+ return self._group_set
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'PrimaryPrivateIpAddress':
+ return self.private_ip_address
+ elif attribute_name == 'SecondaryPrivateIpAddresses':
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "SecondaryPrivateIpAddresses" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'network-interface-id':
+ return self.id
+ elif filter_name in ('addresses.private-ip-address', 'private-ip-address'):
+ return self.private_ip_address
+ elif filter_name == 'subnet-id':
+ return self.subnet.id
+ elif filter_name == 'vpc-id':
+ return self.subnet.vpc_id
+ elif filter_name == 'group-id':
+ return [group.id for group in self._group_set]
+ elif filter_name == 'availability-zone':
+ return self.subnet.availability_zone
+ else:
+ return super(NetworkInterface, self).get_filter_value(
+ filter_name, 'DescribeNetworkInterfaces')
+
+
+class NetworkInterfaceBackend(object):
+ def __init__(self):
+ self.enis = {}
+ super(NetworkInterfaceBackend, self).__init__()
+
+ def create_network_interface(self, subnet, private_ip_address, group_ids=None, **kwargs):
+ eni = NetworkInterface(
+ self, subnet, private_ip_address, group_ids=group_ids, **kwargs)
+ self.enis[eni.id] = eni
+ return eni
+
+ def get_network_interface(self, eni_id):
+ for eni in self.enis.values():
+ if eni_id == eni.id:
+ return eni
+ raise InvalidNetworkInterfaceIdError(eni_id)
+
+ def delete_network_interface(self, eni_id):
+ deleted = self.enis.pop(eni_id, None)
+ if not deleted:
+ raise InvalidNetworkInterfaceIdError(eni_id)
+ return deleted
+
+ def describe_network_interfaces(self, filters=None):
+ enis = self.enis.values()
+
+ if filters:
+ for (_filter, _filter_value) in filters.items():
+ if _filter == 'network-interface-id':
+ _filter = 'id'
+ enis = [eni for eni in enis if getattr(
+ eni, _filter) in _filter_value]
+ elif _filter == 'group-id':
+ original_enis = enis
+ enis = []
+ for eni in original_enis:
+ for group in eni.group_set:
+ if group.id in _filter_value:
+ enis.append(eni)
+ break
+ else:
+ self.raise_not_implemented_error(
+ "The filter '{0}' for DescribeNetworkInterfaces".format(_filter))
+ return enis
+
+ def attach_network_interface(self, eni_id, instance_id, device_index):
+ eni = self.get_network_interface(eni_id)
+ instance = self.get_instance(instance_id)
+ return instance.attach_eni(eni, device_index)
+
+ def detach_network_interface(self, attachment_id):
+ found_eni = None
+
+ for eni in self.enis.values():
+ if eni.attachment_id == attachment_id:
+ found_eni = eni
+ break
+ else:
+ raise InvalidNetworkAttachmentIdError(attachment_id)
+
+ found_eni.instance.detach_eni(found_eni)
+
+ def modify_network_interface_attribute(self, eni_id, group_id):
+ eni = self.get_network_interface(eni_id)
+ group = self.get_security_group_from_id(group_id)
+ eni._group_set = [group]
+
+ def get_all_network_interfaces(self, eni_ids=None, filters=None):
+ enis = self.enis.values()
+
+ if eni_ids:
+ enis = [eni for eni in enis if eni.id in eni_ids]
+ if len(enis) != len(eni_ids):
+ invalid_id = list(set(eni_ids).difference(
+ set([eni.id for eni in enis])))[0]
+ raise InvalidNetworkInterfaceIdError(invalid_id)
+
+ return generic_filter(filters, enis)
+
+
+class Instance(TaggedEC2Resource, BotoInstance):
+ def __init__(self, ec2_backend, image_id, user_data, security_groups, **kwargs):
+ super(Instance, self).__init__()
+ self.ec2_backend = ec2_backend
+ self.id = random_instance_id()
+ self.image_id = image_id
+ self._state = InstanceState("running", 16)
+ self._reason = ""
+ self._state_reason = StateReason()
+ self.user_data = user_data
+ self.security_groups = security_groups
+ self.instance_type = kwargs.get("instance_type", "m1.small")
+ self.region_name = kwargs.get("region_name", "us-east-1")
+ placement = kwargs.get("placement", None)
+ self.vpc_id = None
+ self.subnet_id = kwargs.get("subnet_id")
+ in_ec2_classic = not bool(self.subnet_id)
+ self.key_name = kwargs.get("key_name")
+ self.ebs_optimized = kwargs.get("ebs_optimized", False)
+ self.source_dest_check = "true"
+ self.launch_time = utc_date_and_time()
+ self.ami_launch_index = kwargs.get("ami_launch_index", 0)
+ self.disable_api_termination = kwargs.get("disable_api_termination", False)
+ self._spot_fleet_id = kwargs.get("spot_fleet_id", None)
+ associate_public_ip = kwargs.get("associate_public_ip", False)
+ if in_ec2_classic:
+ # If we are in EC2-Classic, autoassign a public IP
+ associate_public_ip = True
+
+ amis = self.ec2_backend.describe_images(filters={'image-id': image_id})
+ ami = amis[0] if amis else None
+ if ami is None:
+ warnings.warn('Could not find AMI with image-id:{0}, '
+ 'in the near future this will '
+ 'cause an error.\n'
+ 'Use ec2_backend.describe_images() to'
+ 'find suitable image for your test'.format(image_id),
+ PendingDeprecationWarning)
+
+ self.platform = ami.platform if ami else None
+ self.virtualization_type = ami.virtualization_type if ami else 'paravirtual'
+ self.architecture = ami.architecture if ami else 'x86_64'
+
+ # handle weird bug around user_data -- something grabs the repr(), so
+ # it must be clean
+ if isinstance(self.user_data, list) and len(self.user_data) > 0:
+ if six.PY3 and isinstance(self.user_data[0], six.binary_type):
+ # string will have a "b" prefix -- need to get rid of it
+ self.user_data[0] = self.user_data[0].decode('utf-8')
+ elif six.PY2 and isinstance(self.user_data[0], six.text_type):
+ # string will have a "u" prefix -- need to get rid of it
+ self.user_data[0] = self.user_data[0].encode('utf-8')
+
+ if self.subnet_id:
+ subnet = ec2_backend.get_subnet(self.subnet_id)
+ self.vpc_id = subnet.vpc_id
+ self._placement.zone = subnet.availability_zone
+
+ if associate_public_ip is None:
+ # Mapping public ip hasnt been explicitly enabled or disabled
+ associate_public_ip = subnet.map_public_ip_on_launch == 'true'
+ elif placement:
+ self._placement.zone = placement
+ else:
+ self._placement.zone = ec2_backend.region_name + 'a'
+
+ self.block_device_mapping = BlockDeviceMapping()
+
+ self._private_ips = set()
+ self.prep_nics(
+ kwargs.get("nics", {}),
+ private_ip=kwargs.get("private_ip"),
+ associate_public_ip=associate_public_ip
+ )
+
+ def __del__(self):
+ try:
+ subnet = self.ec2_backend.get_subnet(self.subnet_id)
+ for ip in self._private_ips:
+ subnet.del_subnet_ip(ip)
+ except Exception:
+ # Its not "super" critical we clean this up, as reset will do this
+ # worst case we'll get IP address exaustion... rarely
+ pass
+
+ def setup_defaults(self):
+ # Default have an instance with root volume should you not wish to
+ # override with attach volume cmd.
+ volume = self.ec2_backend.create_volume(8, 'us-east-1a')
+ self.ec2_backend.attach_volume(volume.id, self.id, '/dev/sda1')
+
+ def teardown_defaults(self):
+ volume_id = self.block_device_mapping['/dev/sda1'].volume_id
+ self.ec2_backend.detach_volume(volume_id, self.id, '/dev/sda1')
+ self.ec2_backend.delete_volume(volume_id)
+
+ @property
+ def get_block_device_mapping(self):
+ return self.block_device_mapping.items()
+
+ @property
+ def private_ip(self):
+ return self.nics[0].private_ip_address
+
+ @property
+ def private_dns(self):
+ formatted_ip = self.private_ip.replace('.', '-')
+ if self.region_name == "us-east-1":
+ return "ip-{0}.ec2.internal".format(formatted_ip)
+ else:
+ return "ip-{0}.{1}.compute.internal".format(formatted_ip, self.region_name)
+
+ @property
+ def public_ip(self):
+ return self.nics[0].public_ip
+
+ @property
+ def public_dns(self):
+ if self.public_ip:
+ formatted_ip = self.public_ip.replace('.', '-')
+ if self.region_name == "us-east-1":
+ return "ec2-{0}.compute-1.amazonaws.com".format(formatted_ip)
+ else:
+ return "ec2-{0}.{1}.compute.amazonaws.com".format(formatted_ip, self.region_name)
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ security_group_ids = properties.get('SecurityGroups', [])
+ group_names = [ec2_backend.get_security_group_from_id(
+ group_id).name for group_id in security_group_ids]
+
+ reservation = ec2_backend.add_instances(
+ image_id=properties['ImageId'],
+ user_data=properties.get('UserData'),
+ count=1,
+ security_group_names=group_names,
+ instance_type=properties.get("InstanceType", "m1.small"),
+ subnet_id=properties.get("SubnetId"),
+ key_name=properties.get("KeyName"),
+ private_ip=properties.get('PrivateIpAddress'),
+ )
+ instance = reservation.instances[0]
+ for tag in properties.get("Tags", []):
+ instance.add_tag(tag["Key"], tag["Value"])
+ return instance
+
+ @classmethod
+ def delete_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ ec2_backend = ec2_backends[region_name]
+ all_instances = ec2_backend.all_instances()
+
+ # the resource_name for instances is the stack name, logical id, and random suffix separated
+ # by hyphens. So to lookup the instances using the 'aws:cloudformation:logical-id' tag, we need to
+ # extract the logical-id from the resource_name
+ logical_id = resource_name.split('-')[1]
+
+ for instance in all_instances:
+ instance_tags = instance.get_tags()
+ for tag in instance_tags:
+ if tag['key'] == 'aws:cloudformation:logical-id' and tag['value'] == logical_id:
+ instance.delete(region_name)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def start(self, *args, **kwargs):
+ for nic in self.nics.values():
+ nic.start()
+
+ self._state.name = "running"
+ self._state.code = 16
+
+ self._reason = ""
+ self._state_reason = StateReason()
+
+ def stop(self, *args, **kwargs):
+ for nic in self.nics.values():
+ nic.stop()
+
+ self._state.name = "stopped"
+ self._state.code = 80
+
+ self._reason = "User initiated ({0})".format(
+ datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC'))
+ self._state_reason = StateReason("Client.UserInitiatedShutdown: User initiated shutdown",
+ "Client.UserInitiatedShutdown")
+
+ def delete(self, region):
+ self.terminate()
+
+ def terminate(self, *args, **kwargs):
+ for nic in self.nics.values():
+ nic.stop()
+
+ self.teardown_defaults()
+
+ if self._spot_fleet_id:
+ spot_fleet = self.ec2_backend.get_spot_fleet_request(self._spot_fleet_id)
+ for spec in spot_fleet.launch_specs:
+ if spec.instance_type == self.instance_type and spec.subnet_id == self.subnet_id:
+ break
+ spot_fleet.fulfilled_capacity -= spec.weighted_capacity
+ spot_fleet.spot_requests = [req for req in spot_fleet.spot_requests if req.instance != self]
+
+ self._state.name = "terminated"
+ self._state.code = 48
+
+ self._reason = "User initiated ({0})".format(
+ datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC'))
+ self._state_reason = StateReason("Client.UserInitiatedShutdown: User initiated shutdown",
+ "Client.UserInitiatedShutdown")
+
+ def reboot(self, *args, **kwargs):
+ self._state.name = "running"
+ self._state.code = 16
+
+ self._reason = ""
+ self._state_reason = StateReason()
+
+ @property
+ def dynamic_group_list(self):
+ if self.nics:
+ groups = []
+ for nic in self.nics.values():
+ for group in nic.group_set:
+ groups.append(group)
+ return groups
+ else:
+ return self.security_groups
+
+ def prep_nics(self, nic_spec, private_ip=None, associate_public_ip=None):
+ self.nics = {}
+
+ if self.subnet_id:
+ subnet = self.ec2_backend.get_subnet(self.subnet_id)
+ if not private_ip:
+ private_ip = subnet.get_available_subnet_ip(instance=self)
+ else:
+ subnet.request_ip(private_ip, instance=self)
+
+ self._private_ips.add(private_ip)
+ elif private_ip is None:
+ # Preserve old behaviour if in EC2-Classic mode
+ private_ip = random_private_ip()
+
+ # Primary NIC defaults
+ primary_nic = {'SubnetId': self.subnet_id,
+ 'PrivateIpAddress': private_ip,
+ 'AssociatePublicIpAddress': associate_public_ip}
+ primary_nic = dict((k, v) for k, v in primary_nic.items() if v)
+
+ # If empty NIC spec but primary NIC values provided, create NIC from
+ # them.
+ if primary_nic and not nic_spec:
+ nic_spec[0] = primary_nic
+ nic_spec[0]['DeviceIndex'] = 0
+
+ # Flesh out data structures and associations
+ for nic in nic_spec.values():
+ device_index = int(nic.get('DeviceIndex'))
+
+ nic_id = nic.get('NetworkInterfaceId')
+ if nic_id:
+ # If existing NIC found, use it.
+ use_nic = self.ec2_backend.get_network_interface(nic_id)
+ use_nic.device_index = device_index
+ use_nic.public_ip_auto_assign = False
+
+ else:
+ # If primary NIC values provided, use them for the primary NIC.
+ if device_index == 0 and primary_nic:
+ nic.update(primary_nic)
+
+ if 'SubnetId' in nic:
+ subnet = self.ec2_backend.get_subnet(nic['SubnetId'])
+ else:
+ subnet = None
+
+ group_id = nic.get('SecurityGroupId')
+ group_ids = [group_id] if group_id else []
+
+ use_nic = self.ec2_backend.create_network_interface(subnet,
+ nic.get(
+ 'PrivateIpAddress'),
+ device_index=device_index,
+ public_ip_auto_assign=nic.get(
+ 'AssociatePublicIpAddress', False),
+ group_ids=group_ids)
+
+ self.attach_eni(use_nic, device_index)
+
+ def attach_eni(self, eni, device_index):
+ device_index = int(device_index)
+ self.nics[device_index] = eni
+
+ # This is used upon associate/disassociate public IP.
+ eni.instance = self
+ eni.attachment_id = random_eni_attach_id()
+ eni.device_index = device_index
+
+ return eni.attachment_id
+
+ def detach_eni(self, eni):
+ self.nics.pop(eni.device_index, None)
+ eni.instance = None
+ eni.attachment_id = None
+ eni.device_index = None
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'AvailabilityZone':
+ return self.placement
+ elif attribute_name == 'PrivateDnsName':
+ return self.private_dns
+ elif attribute_name == 'PublicDnsName':
+ return self.public_dns
+ elif attribute_name == 'PrivateIp':
+ return self.private_ip
+ elif attribute_name == 'PublicIp':
+ return self.public_ip
+ raise UnformattedGetAttTemplateException()
+
+
+class InstanceBackend(object):
+ def __init__(self):
+ self.reservations = OrderedDict()
+ super(InstanceBackend, self).__init__()
+
+ def get_instance(self, instance_id):
+ for instance in self.all_instances():
+ if instance.id == instance_id:
+ return instance
+ raise InvalidInstanceIdError(instance_id)
+
+ def add_instances(self, image_id, count, user_data, security_group_names,
+ **kwargs):
+ new_reservation = Reservation()
+ new_reservation.id = random_reservation_id()
+
+ security_groups = [self.get_security_group_from_name(name)
+ for name in security_group_names]
+ security_groups.extend(self.get_security_group_from_id(sg_id)
+ for sg_id in kwargs.pop("security_group_ids", []))
+ self.reservations[new_reservation.id] = new_reservation
+
+ tags = kwargs.pop("tags", {})
+ instance_tags = tags.get('instance', {})
+
+ for index in range(count):
+ kwargs["ami_launch_index"] = index
+ new_instance = Instance(
+ self,
+ image_id,
+ user_data,
+ security_groups,
+ **kwargs
+ )
+ new_reservation.instances.append(new_instance)
+ new_instance.add_tags(instance_tags)
+ new_instance.setup_defaults()
+ return new_reservation
+
+ def start_instances(self, instance_ids):
+ started_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.start()
+ started_instances.append(instance)
+
+ return started_instances
+
+ def stop_instances(self, instance_ids):
+ stopped_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.stop()
+ stopped_instances.append(instance)
+
+ return stopped_instances
+
+ def terminate_instances(self, instance_ids):
+ terminated_instances = []
+ if not instance_ids:
+ raise EC2ClientError(
+ "InvalidParameterCombination", "No instances specified")
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.terminate()
+ terminated_instances.append(instance)
+
+ return terminated_instances
+
+ def reboot_instances(self, instance_ids):
+ rebooted_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.reboot()
+ rebooted_instances.append(instance)
+
+ return rebooted_instances
+
+ def modify_instance_attribute(self, instance_id, key, value):
+ instance = self.get_instance(instance_id)
+ setattr(instance, key, value)
+ return instance
+
+ def modify_instance_security_groups(self, instance_id, new_group_list):
+ instance = self.get_instance(instance_id)
+ setattr(instance, 'security_groups', new_group_list)
+ return instance
+
+ def describe_instance_attribute(self, instance_id, key):
+ if key == 'group_set':
+ key = 'security_groups'
+ instance = self.get_instance(instance_id)
+ value = getattr(instance, key)
+ return instance, value
+
+ def all_instances(self):
+ instances = []
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ instances.append(instance)
+ return instances
+
+ def all_running_instances(self):
+ instances = []
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.state_code == 16:
+ instances.append(instance)
+ return instances
+
+ def get_multi_instances_by_id(self, instance_ids):
+ """
+ :param instance_ids: A string list with instance ids
+ :return: A list with instance objects
+ """
+ result = []
+
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.id in instance_ids:
+ result.append(instance)
+
+ # TODO: Trim error message down to specific invalid id.
+ if instance_ids and len(instance_ids) > len(result):
+ raise InvalidInstanceIdError(instance_ids)
+
+ return result
+
+ def get_instance_by_id(self, instance_id):
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.id == instance_id:
+ return instance
+
+ def get_reservations_by_instance_ids(self, instance_ids, filters=None):
+ """ Go through all of the reservations and filter to only return those
+ associated with the given instance_ids.
+ """
+ reservations = []
+ for reservation in self.all_reservations():
+ reservation_instance_ids = [
+ instance.id for instance in reservation.instances]
+ matching_reservation = any(
+ instance_id in reservation_instance_ids for instance_id in instance_ids)
+ if matching_reservation:
+ reservation.instances = [
+ instance for instance in reservation.instances if instance.id in instance_ids]
+ reservations.append(reservation)
+ found_instance_ids = [
+ instance.id for reservation in reservations for instance in reservation.instances]
+ if len(found_instance_ids) != len(instance_ids):
+ invalid_id = list(set(instance_ids).difference(
+ set(found_instance_ids)))[0]
+ raise InvalidInstanceIdError(invalid_id)
+ if filters is not None:
+ reservations = filter_reservations(reservations, filters)
+ return reservations
+
+ def all_reservations(self, filters=None):
+ reservations = [copy.copy(reservation) for reservation in self.reservations.values()]
+ if filters is not None:
+ reservations = filter_reservations(reservations, filters)
+ return reservations
+
+
+class KeyPair(object):
+ def __init__(self, name, fingerprint, material):
+ self.name = name
+ self.fingerprint = fingerprint
+ self.material = material
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'key-name':
+ return self.name
+ elif filter_name == 'fingerprint':
+ return self.fingerprint
+ else:
+ raise FilterNotImplementedError(filter_name, 'DescribeKeyPairs')
+
+
+class KeyPairBackend(object):
+ def __init__(self):
+ self.keypairs = {}
+ super(KeyPairBackend, self).__init__()
+
+ def create_key_pair(self, name):
+ if name in self.keypairs:
+ raise InvalidKeyPairDuplicateError(name)
+ keypair = KeyPair(name, **random_key_pair())
+ self.keypairs[name] = keypair
+ return keypair
+
+ def delete_key_pair(self, name):
+ if name in self.keypairs:
+ self.keypairs.pop(name)
+ return True
+
+ def describe_key_pairs(self, key_names=None, filters=None):
+ results = []
+ if key_names:
+ results = [keypair for keypair in self.keypairs.values()
+ if keypair.name in key_names]
+ if len(key_names) > len(results):
+ unknown_keys = set(key_names) - set(results)
+ raise InvalidKeyPairNameError(unknown_keys)
+ else:
+ results = self.keypairs.values()
+
+ if filters:
+ return generic_filter(filters, results)
+ else:
+ return results
+
+ def import_key_pair(self, key_name, public_key_material):
+ if key_name in self.keypairs:
+ raise InvalidKeyPairDuplicateError(key_name)
+ keypair = KeyPair(key_name, **random_key_pair())
+ self.keypairs[key_name] = keypair
+ return keypair
+
+
+class TagBackend(object):
+ VALID_TAG_FILTERS = ['key',
+ 'resource-id',
+ 'resource-type',
+ 'value']
+
+ VALID_TAG_RESOURCE_FILTER_TYPES = ['customer-gateway',
+ 'dhcp-options',
+ 'image',
+ 'instance',
+ 'internet-gateway',
+ 'network-acl',
+ 'network-interface',
+ 'reserved-instances',
+ 'route-table',
+ 'security-group',
+ 'snapshot',
+ 'spot-instances-request',
+ 'subnet',
+ 'volume',
+ 'vpc',
+ 'vpc-peering-connection'
+ 'vpn-connection',
+ 'vpn-gateway']
+
+ def __init__(self):
+ self.tags = defaultdict(dict)
+ super(TagBackend, self).__init__()
+
+ def create_tags(self, resource_ids, tags):
+ if None in set([tags[tag] for tag in tags]):
+ raise InvalidParameterValueErrorTagNull()
+ for resource_id in resource_ids:
+ if resource_id in self.tags:
+ if len(self.tags[resource_id]) + len([tag for tag in tags if not tag.startswith("aws:")]) > 50:
+ raise TagLimitExceeded()
+ elif len([tag for tag in tags if not tag.startswith("aws:")]) > 50:
+ raise TagLimitExceeded()
+ for resource_id in resource_ids:
+ for tag in tags:
+ self.tags[resource_id][tag] = tags[tag]
+ return True
+
+ def delete_tags(self, resource_ids, tags):
+ for resource_id in resource_ids:
+ for tag in tags:
+ if tag in self.tags[resource_id]:
+ if tags[tag] is None:
+ self.tags[resource_id].pop(tag)
+ elif tags[tag] == self.tags[resource_id][tag]:
+ self.tags[resource_id].pop(tag)
+ return True
+
+ def describe_tags(self, filters=None):
+ import re
+ results = []
+ key_filters = []
+ resource_id_filters = []
+ resource_type_filters = []
+ value_filters = []
+ if filters is not None:
+ for tag_filter in filters:
+ if tag_filter in self.VALID_TAG_FILTERS:
+ if tag_filter == 'key':
+ for value in filters[tag_filter]:
+ key_filters.append(re.compile(
+ simple_aws_filter_to_re(value)))
+ if tag_filter == 'resource-id':
+ for value in filters[tag_filter]:
+ resource_id_filters.append(
+ re.compile(simple_aws_filter_to_re(value)))
+ if tag_filter == 'resource-type':
+ for value in filters[tag_filter]:
+ resource_type_filters.append(value)
+ if tag_filter == 'value':
+ for value in filters[tag_filter]:
+ value_filters.append(re.compile(
+ simple_aws_filter_to_re(value)))
+ for resource_id, tags in self.tags.items():
+ for key, value in tags.items():
+ add_result = False
+ if filters is None:
+ add_result = True
+ else:
+ key_pass = False
+ id_pass = False
+ type_pass = False
+ value_pass = False
+ if key_filters:
+ for pattern in key_filters:
+ if pattern.match(key) is not None:
+ key_pass = True
+ else:
+ key_pass = True
+ if resource_id_filters:
+ for pattern in resource_id_filters:
+ if pattern.match(resource_id) is not None:
+ id_pass = True
+ else:
+ id_pass = True
+ if resource_type_filters:
+ for resource_type in resource_type_filters:
+ if EC2_PREFIX_TO_RESOURCE[get_prefix(resource_id)] == resource_type:
+ type_pass = True
+ else:
+ type_pass = True
+ if value_filters:
+ for pattern in value_filters:
+ if pattern.match(value) is not None:
+ value_pass = True
+ else:
+ value_pass = True
+ if key_pass and id_pass and type_pass and value_pass:
+ add_result = True
+ # If we're not filtering, or we are filtering and this
+ if add_result:
+ result = {
+ 'resource_id': resource_id,
+ 'key': key,
+ 'value': value,
+ 'resource_type': EC2_PREFIX_TO_RESOURCE[get_prefix(resource_id)],
+ }
+ results.append(result)
+ return results
+
+
+class Ami(TaggedEC2Resource):
+ def __init__(self, ec2_backend, ami_id, instance=None, source_ami=None,
+ name=None, description=None, owner_id=111122223333,
+ public=False, virtualization_type=None, architecture=None,
+ state='available', creation_date=None, platform=None,
+ image_type='machine', image_location=None, hypervisor=None,
+ root_device_type='standard', root_device_name='/dev/sda1', sriov='simple',
+ region_name='us-east-1a'
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = ami_id
+ self.state = state
+ self.name = name
+ self.image_type = image_type
+ self.image_location = image_location
+ self.owner_id = owner_id
+ self.description = description
+ self.virtualization_type = virtualization_type
+ self.architecture = architecture
+ self.kernel_id = None
+ self.platform = platform
+ self.hypervisor = hypervisor
+ self.root_device_name = root_device_name
+ self.root_device_type = root_device_type
+ self.sriov = sriov
+ self.creation_date = utc_date_and_time() if creation_date is None else creation_date
+
+ if instance:
+ self.instance = instance
+ self.instance_id = instance.id
+ self.virtualization_type = instance.virtualization_type
+ self.architecture = instance.architecture
+ self.kernel_id = instance.kernel
+ self.platform = instance.platform
+
+ elif source_ami:
+ """
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/CopyingAMIs.html
+ "We don't copy launch permissions, user-defined tags, or Amazon S3 bucket permissions from the source AMI to the new AMI."
+ ~ 2014.09.29
+ """
+ self.virtualization_type = source_ami.virtualization_type
+ self.architecture = source_ami.architecture
+ self.kernel_id = source_ami.kernel_id
+ self.platform = source_ami.platform
+ if not name:
+ self.name = source_ami.name
+ if not description:
+ self.description = source_ami.description
+
+ self.launch_permission_groups = set()
+ self.launch_permission_users = set()
+
+ if public:
+ self.launch_permission_groups.add('all')
+
+ # AWS auto-creates these, we should reflect the same.
+ volume = self.ec2_backend.create_volume(15, region_name)
+ self.ebs_snapshot = self.ec2_backend.create_snapshot(
+ volume.id, "Auto-created snapshot for AMI %s" % self.id, owner_id)
+ self.ec2_backend.delete_volume(volume.id)
+
+ @property
+ def is_public(self):
+ return 'all' in self.launch_permission_groups
+
+ @property
+ def is_public_string(self):
+ return str(self.is_public).lower()
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'virtualization-type':
+ return self.virtualization_type
+ elif filter_name == 'kernel-id':
+ return self.kernel_id
+ elif filter_name in ['architecture', 'platform']:
+ return getattr(self, filter_name)
+ elif filter_name == 'image-id':
+ return self.id
+ elif filter_name == 'is-public':
+ return self.is_public_string
+ elif filter_name == 'state':
+ return self.state
+ elif filter_name == 'name':
+ return self.name
+ elif filter_name == 'owner-id':
+ return self.owner_id
+ else:
+ return super(Ami, self).get_filter_value(
+ filter_name, 'DescribeImages')
+
+
+class AmiBackend(object):
+
+ AMI_REGEX = re.compile("ami-[a-z0-9]+")
+
+ def __init__(self):
+ self.amis = {}
+
+ self._load_amis()
+
+ super(AmiBackend, self).__init__()
+
+ def _load_amis(self):
+ for ami in AMIS:
+ ami_id = ami['ami_id']
+ self.amis[ami_id] = Ami(self, **ami)
+
+ def create_image(self, instance_id, name=None, description=None, context=None):
+ # TODO: check that instance exists and pull info from it.
+ ami_id = random_ami_id()
+ instance = self.get_instance(instance_id)
+
+ ami = Ami(self, ami_id, instance=instance, source_ami=None,
+ name=name, description=description,
+ owner_id=context.get_current_user() if context else '111122223333')
+ self.amis[ami_id] = ami
+ return ami
+
+ def copy_image(self, source_image_id, source_region, name=None, description=None):
+ source_ami = ec2_backends[source_region].describe_images(
+ ami_ids=[source_image_id])[0]
+ ami_id = random_ami_id()
+ ami = Ami(self, ami_id, instance=None, source_ami=source_ami,
+ name=name, description=description)
+ self.amis[ami_id] = ami
+ return ami
+
+ def describe_images(self, ami_ids=(), filters=None, exec_users=None, owners=None,
+ context=None):
+ images = self.amis.values()
+
+ if len(ami_ids):
+ # boto3 seems to default to just searching based on ami ids if that parameter is passed
+ # and if no images are found, it raises an errors
+ malformed_ami_ids = [ami_id for ami_id in ami_ids if not ami_id.startswith('ami-')]
+ if malformed_ami_ids:
+ raise MalformedAMIIdError(malformed_ami_ids)
+
+ images = [ami for ami in images if ami.id in ami_ids]
+ if len(images) == 0:
+ raise InvalidAMIIdError(ami_ids)
+ else:
+ # Limit images by launch permissions
+ if exec_users:
+ tmp_images = []
+ for ami in images:
+ for user_id in exec_users:
+ if user_id in ami.launch_permission_users:
+ tmp_images.append(ami)
+ images = tmp_images
+
+ # Limit by owner ids
+ if owners:
+ # support filtering by Owners=['self']
+ owners = list(map(
+ lambda o: context.get_current_user()
+ if context and o == 'self' else o,
+ owners))
+ images = [ami for ami in images if ami.owner_id in owners]
+
+ # Generic filters
+ if filters:
+ return generic_filter(filters, images)
+
+ return images
+
+ def deregister_image(self, ami_id):
+ if ami_id in self.amis:
+ self.amis.pop(ami_id)
+ return True
+ raise InvalidAMIIdError(ami_id)
+
+ def get_launch_permission_groups(self, ami_id):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ return ami.launch_permission_groups
+
+ def get_launch_permission_users(self, ami_id):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ return ami.launch_permission_users
+
+ def validate_permission_targets(self, user_ids=None, group=None):
+ # If anything is invalid, nothing is added. (No partial success.)
+ if user_ids:
+ """
+ AWS docs:
+ "The AWS account ID is a 12-digit number, such as 123456789012, that you use to construct Amazon Resource Names (ARNs)."
+ http://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html
+ """
+ for user_id in user_ids:
+ if len(user_id) != 12 or not user_id.isdigit():
+ raise InvalidAMIAttributeItemValueError("userId", user_id)
+
+ if group and group != 'all':
+ raise InvalidAMIAttributeItemValueError("UserGroup", group)
+
+ def add_launch_permission(self, ami_id, user_ids=None, group=None):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ self.validate_permission_targets(user_ids=user_ids, group=group)
+
+ if user_ids:
+ for user_id in user_ids:
+ ami.launch_permission_users.add(user_id)
+
+ if group:
+ ami.launch_permission_groups.add(group)
+
+ return True
+
+ def remove_launch_permission(self, ami_id, user_ids=None, group=None):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ self.validate_permission_targets(user_ids=user_ids, group=group)
+
+ if user_ids:
+ for user_id in user_ids:
+ ami.launch_permission_users.discard(user_id)
+
+ if group:
+ ami.launch_permission_groups.discard(group)
+
+ return True
+
+
+class Region(object):
+ def __init__(self, name, endpoint):
+ self.name = name
+ self.endpoint = endpoint
+
+
+class Zone(object):
+ def __init__(self, name, region_name):
+ self.name = name
+ self.region_name = region_name
+
+
+class RegionsAndZonesBackend(object):
+ regions = [Region(ri.name, ri.endpoint) for ri in boto.ec2.regions()]
+
+ zones = dict(
+ (region, [Zone(region + c, region) for c in 'abc'])
+ for region in [r.name for r in regions])
+
+ def describe_regions(self, region_names=[]):
+ if len(region_names) == 0:
+ return self.regions
+ ret = []
+ for name in region_names:
+ for region in self.regions:
+ if region.name == name:
+ ret.append(region)
+ return ret
+
+ def describe_availability_zones(self):
+ return self.zones[self.region_name]
+
+ def get_zone_by_name(self, name):
+ for zone in self.zones[self.region_name]:
+ if zone.name == name:
+ return zone
+
+
+class SecurityRule(object):
+ def __init__(self, ip_protocol, from_port, to_port, ip_ranges, source_groups):
+ self.ip_protocol = ip_protocol
+ self.from_port = from_port
+ self.to_port = to_port
+ self.ip_ranges = ip_ranges or []
+ self.source_groups = source_groups
+
+ @property
+ def unique_representation(self):
+ return "{0}-{1}-{2}-{3}-{4}".format(
+ self.ip_protocol,
+ self.from_port,
+ self.to_port,
+ self.ip_ranges,
+ self.source_groups
+ )
+
+ def __eq__(self, other):
+ return self.unique_representation == other.unique_representation
+
+
+class SecurityGroup(TaggedEC2Resource):
+ def __init__(self, ec2_backend, group_id, name, description, vpc_id=None):
+ self.ec2_backend = ec2_backend
+ self.id = group_id
+ self.name = name
+ self.description = description
+ self.ingress_rules = []
+ self.egress_rules = [SecurityRule(-1, None, None, ['0.0.0.0/0'], [])]
+ self.enis = {}
+ self.vpc_id = vpc_id
+ self.owner_id = "123456789012"
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ vpc_id = properties.get('VpcId')
+ security_group = ec2_backend.create_security_group(
+ name=resource_name,
+ description=properties.get('GroupDescription'),
+ vpc_id=vpc_id,
+ )
+
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ security_group.add_tag(tag_key, tag_value)
+
+ for ingress_rule in properties.get('SecurityGroupIngress', []):
+ source_group_id = ingress_rule.get('SourceSecurityGroupId')
+
+ ec2_backend.authorize_security_group_ingress(
+ group_name_or_id=security_group.id,
+ ip_protocol=ingress_rule['IpProtocol'],
+ from_port=ingress_rule['FromPort'],
+ to_port=ingress_rule['ToPort'],
+ ip_ranges=ingress_rule.get('CidrIp'),
+ source_group_ids=[source_group_id],
+ vpc_id=vpc_id,
+ )
+
+ return security_group
+
+ @classmethod
+ def update_from_cloudformation_json(cls, original_resource, new_resource_name, cloudformation_json, region_name):
+ cls._delete_security_group_given_vpc_id(
+ original_resource.name, original_resource.vpc_id, region_name)
+ return cls.create_from_cloudformation_json(new_resource_name, cloudformation_json, region_name)
+
+ @classmethod
+ def delete_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+ vpc_id = properties.get('VpcId')
+ cls._delete_security_group_given_vpc_id(
+ resource_name, vpc_id, region_name)
+
+ @classmethod
+ def _delete_security_group_given_vpc_id(cls, resource_name, vpc_id, region_name):
+ ec2_backend = ec2_backends[region_name]
+ security_group = ec2_backend.get_security_group_from_name(
+ resource_name, vpc_id)
+ if security_group:
+ security_group.delete(region_name)
+
+ def delete(self, region_name):
+ ''' Not exposed as part of the ELB API - used for CloudFormation. '''
+ self.ec2_backend.delete_security_group(group_id=self.id)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def matches_filter(self, key, filter_value):
+ def to_attr(filter_name):
+ attr = None
+
+ if filter_name == 'group-name':
+ attr = 'name'
+ elif filter_name == 'group-id':
+ attr = 'id'
+ elif filter_name == 'vpc-id':
+ attr = 'vpc_id'
+ else:
+ attr = filter_name.replace('-', '_')
+
+ return attr
+
+ if key.startswith('ip-permission'):
+ match = re.search(r"ip-permission.(*)", key)
+ ingress_attr = to_attr(match.groups()[0])
+
+ for ingress in self.ingress_rules:
+ if getattr(ingress, ingress_attr) in filter_value:
+ return True
+ elif is_tag_filter(key):
+ tag_value = self.get_filter_value(key)
+ if isinstance(filter_value, list):
+ return tag_filter_matches(self, key, filter_value)
+ return tag_value in filter_value
+ else:
+ attr_name = to_attr(key)
+ return getattr(self, attr_name) in filter_value
+
+ return False
+
+ def matches_filters(self, filters):
+ for key, value in filters.items():
+ if not self.matches_filter(key, value):
+ return False
+ return True
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'GroupId':
+ return self.id
+ raise UnformattedGetAttTemplateException()
+
+ def add_ingress_rule(self, rule):
+ if rule in self.ingress_rules:
+ raise InvalidPermissionDuplicateError()
+ else:
+ self.ingress_rules.append(rule)
+
+ def add_egress_rule(self, rule):
+ self.egress_rules.append(rule)
+
+ def get_number_of_ingress_rules(self):
+ return sum(
+ len(rule.ip_ranges) + len(rule.source_groups)
+ for rule in self.ingress_rules)
+
+ def get_number_of_egress_rules(self):
+ return sum(
+ len(rule.ip_ranges) + len(rule.source_groups)
+ for rule in self.egress_rules)
+
+
+class SecurityGroupBackend(object):
+ def __init__(self):
+ # the key in the dict group is the vpc_id or None (non-vpc)
+ self.groups = defaultdict(dict)
+
+ # Create the default security group
+ self.create_security_group("default", "default group")
+
+ super(SecurityGroupBackend, self).__init__()
+
+ def create_security_group(self, name, description, vpc_id=None, force=False):
+ if not description:
+ raise MissingParameterError('GroupDescription')
+
+ group_id = random_security_group_id()
+ if not force:
+ existing_group = self.get_security_group_from_name(name, vpc_id)
+ if existing_group:
+ raise InvalidSecurityGroupDuplicateError(name)
+ group = SecurityGroup(self, group_id, name, description, vpc_id=vpc_id)
+
+ self.groups[vpc_id][group_id] = group
+ return group
+
+ def describe_security_groups(self, group_ids=None, groupnames=None, filters=None):
+ matches = itertools.chain(*[x.values()
+ for x in self.groups.values()])
+ if group_ids:
+ matches = [grp for grp in matches
+ if grp.id in group_ids]
+ if len(group_ids) > len(matches):
+ unknown_ids = set(group_ids) - set(matches)
+ raise InvalidSecurityGroupNotFoundError(unknown_ids)
+ if groupnames:
+ matches = [grp for grp in matches
+ if grp.name in groupnames]
+ if len(groupnames) > len(matches):
+ unknown_names = set(groupnames) - set(matches)
+ raise InvalidSecurityGroupNotFoundError(unknown_names)
+ if filters:
+ matches = [grp for grp in matches
+ if grp.matches_filters(filters)]
+
+ return matches
+
+ def _delete_security_group(self, vpc_id, group_id):
+ if self.groups[vpc_id][group_id].enis:
+ raise DependencyViolationError(
+ "{0} is being utilized by {1}".format(group_id, 'ENIs'))
+ return self.groups[vpc_id].pop(group_id)
+
+ def delete_security_group(self, name=None, group_id=None):
+ if group_id:
+ # loop over all the SGs, find the right one
+ for vpc_id, groups in self.groups.items():
+ if group_id in groups:
+ return self._delete_security_group(vpc_id, group_id)
+ raise InvalidSecurityGroupNotFoundError(group_id)
+ elif name:
+ # Group Name. Has to be in standard EC2, VPC needs to be
+ # identified by group_id
+ group = self.get_security_group_from_name(name)
+ if group:
+ return self._delete_security_group(None, group.id)
+ raise InvalidSecurityGroupNotFoundError(name)
+
+ def get_security_group_from_id(self, group_id):
+ # 2 levels of chaining necessary since it's a complex structure
+ all_groups = itertools.chain.from_iterable(
+ [x.values() for x in self.groups.values()])
+ for group in all_groups:
+ if group.id == group_id:
+ return group
+
+ def get_security_group_from_name(self, name, vpc_id=None):
+ for group_id, group in self.groups[vpc_id].items():
+ if group.name == name:
+ return group
+
+ def get_security_group_by_name_or_id(self, group_name_or_id, vpc_id):
+ # try searching by id, fallbacks to name search
+ group = self.get_security_group_from_id(group_name_or_id)
+ if group is None:
+ group = self.get_security_group_from_name(group_name_or_id, vpc_id)
+ return group
+
+ def authorize_security_group_ingress(self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_group_names=None,
+ source_group_ids=None,
+ vpc_id=None):
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if ip_ranges and not isinstance(ip_ranges, list):
+ ip_ranges = [ip_ranges]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if not is_valid_cidr(cidr):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+
+ self._verify_group_will_respect_rule_count_limit(
+ group, group.get_number_of_ingress_rules(),
+ ip_ranges, source_group_names, source_group_ids)
+
+ source_group_names = source_group_names if source_group_names else []
+ source_group_ids = source_group_ids if source_group_ids else []
+
+ source_groups = []
+ for source_group_name in source_group_names:
+ source_group = self.get_security_group_from_name(
+ source_group_name, vpc_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ # for VPCs
+ for source_group_id in source_group_ids:
+ source_group = self.get_security_group_from_id(source_group_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, source_groups)
+ group.add_ingress_rule(security_rule)
+
+ def revoke_security_group_ingress(self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_group_names=None,
+ source_group_ids=None,
+ vpc_id=None):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+
+ source_groups = []
+ for source_group_name in source_group_names:
+ source_group = self.get_security_group_from_name(
+ source_group_name, vpc_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ for source_group_id in source_group_ids:
+ source_group = self.get_security_group_from_id(source_group_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, source_groups)
+ if security_rule in group.ingress_rules:
+ group.ingress_rules.remove(security_rule)
+ return security_rule
+ raise InvalidPermissionNotFoundError()
+
+ def authorize_security_group_egress(self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_group_names=None,
+ source_group_ids=None,
+ vpc_id=None):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if ip_ranges and not isinstance(ip_ranges, list):
+ ip_ranges = [ip_ranges]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if not is_valid_cidr(cidr):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+
+ self._verify_group_will_respect_rule_count_limit(
+ group, group.get_number_of_egress_rules(),
+ ip_ranges, source_group_names, source_group_ids)
+
+ source_group_names = source_group_names if source_group_names else []
+ source_group_ids = source_group_ids if source_group_ids else []
+
+ source_groups = []
+ for source_group_name in source_group_names:
+ source_group = self.get_security_group_from_name(
+ source_group_name, vpc_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ # for VPCs
+ for source_group_id in source_group_ids:
+ source_group = self.get_security_group_from_id(source_group_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, source_groups)
+ group.add_egress_rule(security_rule)
+
+ def revoke_security_group_egress(self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_group_names=None,
+ source_group_ids=None,
+ vpc_id=None):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+
+ source_groups = []
+ for source_group_name in source_group_names:
+ source_group = self.get_security_group_from_name(
+ source_group_name, vpc_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ for source_group_id in source_group_ids:
+ source_group = self.get_security_group_from_id(source_group_id)
+ if source_group:
+ source_groups.append(source_group)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, source_groups)
+ if security_rule in group.egress_rules:
+ group.egress_rules.remove(security_rule)
+ return security_rule
+ raise InvalidPermissionNotFoundError()
+
+ def _verify_group_will_respect_rule_count_limit(
+ self, group, current_rule_nb,
+ ip_ranges, source_group_names=None, source_group_ids=None):
+ max_nb_rules = 50 if group.vpc_id else 100
+ future_group_nb_rules = current_rule_nb
+ if ip_ranges:
+ future_group_nb_rules += len(ip_ranges)
+ if source_group_ids:
+ future_group_nb_rules += len(source_group_ids)
+ if source_group_names:
+ future_group_nb_rules += len(source_group_names)
+ if future_group_nb_rules > max_nb_rules:
+ raise RulesPerSecurityGroupLimitExceededError
+
+
+class SecurityGroupIngress(object):
+ def __init__(self, security_group, properties):
+ self.security_group = security_group
+ self.properties = properties
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ group_name = properties.get('GroupName')
+ group_id = properties.get('GroupId')
+ ip_protocol = properties.get("IpProtocol")
+ cidr_ip = properties.get("CidrIp")
+ cidr_ipv6 = properties.get("CidrIpv6")
+ from_port = properties.get("FromPort")
+ source_security_group_id = properties.get("SourceSecurityGroupId")
+ source_security_group_name = properties.get("SourceSecurityGroupName")
+ # source_security_owner_id =
+ # properties.get("SourceSecurityGroupOwnerId") # IGNORED AT THE MOMENT
+ to_port = properties.get("ToPort")
+
+ assert group_id or group_name
+ assert source_security_group_name or cidr_ip or cidr_ipv6 or source_security_group_id
+ assert ip_protocol
+
+ if source_security_group_id:
+ source_security_group_ids = [source_security_group_id]
+ else:
+ source_security_group_ids = None
+ if source_security_group_name:
+ source_security_group_names = [source_security_group_name]
+ else:
+ source_security_group_names = None
+ if cidr_ip:
+ ip_ranges = [cidr_ip]
+ else:
+ ip_ranges = []
+
+ if group_id:
+ security_group = ec2_backend.describe_security_groups(group_ids=[group_id])[
+ 0]
+ else:
+ security_group = ec2_backend.describe_security_groups(
+ groupnames=[group_name])[0]
+
+ ec2_backend.authorize_security_group_ingress(
+ group_name_or_id=security_group.id,
+ ip_protocol=ip_protocol,
+ from_port=from_port,
+ to_port=to_port,
+ ip_ranges=ip_ranges,
+ source_group_ids=source_security_group_ids,
+ source_group_names=source_security_group_names,
+ )
+
+ return cls(security_group, properties)
+
+
+class VolumeAttachment(object):
+ def __init__(self, volume, instance, device, status):
+ self.volume = volume
+ self.attach_time = utc_date_and_time()
+ self.instance = instance
+ self.device = device
+ self.status = status
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ instance_id = properties['InstanceId']
+ volume_id = properties['VolumeId']
+
+ ec2_backend = ec2_backends[region_name]
+ attachment = ec2_backend.attach_volume(
+ volume_id=volume_id,
+ instance_id=instance_id,
+ device_path=properties['Device'],
+ )
+ return attachment
+
+
+class Volume(TaggedEC2Resource):
+ def __init__(self, ec2_backend, volume_id, size, zone, snapshot_id=None, encrypted=False):
+ self.id = volume_id
+ self.size = size
+ self.zone = zone
+ self.create_time = utc_date_and_time()
+ self.attachment = None
+ self.snapshot_id = snapshot_id
+ self.ec2_backend = ec2_backend
+ self.encrypted = encrypted
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ volume = ec2_backend.create_volume(
+ size=properties.get('Size'),
+ zone_name=properties.get('AvailabilityZone'),
+ )
+ return volume
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def status(self):
+ if self.attachment:
+ return 'in-use'
+ else:
+ return 'available'
+
+ def get_filter_value(self, filter_name):
+ if filter_name.startswith('attachment') and not self.attachment:
+ return None
+ elif filter_name == 'attachment.attach-time':
+ return self.attachment.attach_time
+ elif filter_name == 'attachment.device':
+ return self.attachment.device
+ elif filter_name == 'attachment.instance-id':
+ return self.attachment.instance.id
+ elif filter_name == 'attachment.status':
+ return self.attachment.status
+ elif filter_name == 'create-time':
+ return self.create_time
+ elif filter_name == 'size':
+ return self.size
+ elif filter_name == 'snapshot-id':
+ return self.snapshot_id
+ elif filter_name == 'status':
+ return self.status
+ elif filter_name == 'volume-id':
+ return self.id
+ elif filter_name == 'encrypted':
+ return str(self.encrypted).lower()
+ elif filter_name == 'availability-zone':
+ return self.zone.name
+ else:
+ return super(Volume, self).get_filter_value(
+ filter_name, 'DescribeVolumes')
+
+
+class Snapshot(TaggedEC2Resource):
+ def __init__(self, ec2_backend, snapshot_id, volume, description, encrypted=False, owner_id='123456789012'):
+ self.id = snapshot_id
+ self.volume = volume
+ self.description = description
+ self.start_time = utc_date_and_time()
+ self.create_volume_permission_groups = set()
+ self.ec2_backend = ec2_backend
+ self.status = 'completed'
+ self.encrypted = encrypted
+ self.owner_id = owner_id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'description':
+ return self.description
+ elif filter_name == 'snapshot-id':
+ return self.id
+ elif filter_name == 'start-time':
+ return self.start_time
+ elif filter_name == 'volume-id':
+ return self.volume.id
+ elif filter_name == 'volume-size':
+ return self.volume.size
+ elif filter_name == 'encrypted':
+ return str(self.encrypted).lower()
+ elif filter_name == 'status':
+ return self.status
+ else:
+ return super(Snapshot, self).get_filter_value(
+ filter_name, 'DescribeSnapshots')
+
+
+class EBSBackend(object):
+ def __init__(self):
+ self.volumes = {}
+ self.attachments = {}
+ self.snapshots = {}
+ super(EBSBackend, self).__init__()
+
+ def create_volume(self, size, zone_name, snapshot_id=None, encrypted=False):
+ volume_id = random_volume_id()
+ zone = self.get_zone_by_name(zone_name)
+ if snapshot_id:
+ snapshot = self.get_snapshot(snapshot_id)
+ if size is None:
+ size = snapshot.volume.size
+ if snapshot.encrypted:
+ encrypted = snapshot.encrypted
+ volume = Volume(self, volume_id, size, zone, snapshot_id, encrypted)
+ self.volumes[volume_id] = volume
+ return volume
+
+ def describe_volumes(self, volume_ids=None, filters=None):
+ matches = self.volumes.values()
+ if volume_ids:
+ matches = [vol for vol in matches
+ if vol.id in volume_ids]
+ if len(volume_ids) > len(matches):
+ unknown_ids = set(volume_ids) - set(matches)
+ raise InvalidVolumeIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def get_volume(self, volume_id):
+ volume = self.volumes.get(volume_id, None)
+ if not volume:
+ raise InvalidVolumeIdError(volume_id)
+ return volume
+
+ def delete_volume(self, volume_id):
+ if volume_id in self.volumes:
+ return self.volumes.pop(volume_id)
+ raise InvalidVolumeIdError(volume_id)
+
+ def attach_volume(self, volume_id, instance_id, device_path):
+ volume = self.get_volume(volume_id)
+ instance = self.get_instance(instance_id)
+
+ if not volume or not instance:
+ return False
+
+ volume.attachment = VolumeAttachment(
+ volume, instance, device_path, 'attached')
+ # Modify instance to capture mount of block device.
+ bdt = BlockDeviceType(volume_id=volume_id, status=volume.status, size=volume.size,
+ attach_time=utc_date_and_time())
+ instance.block_device_mapping[device_path] = bdt
+ return volume.attachment
+
+ def detach_volume(self, volume_id, instance_id, device_path):
+ volume = self.get_volume(volume_id)
+ self.get_instance(instance_id)
+
+ old_attachment = volume.attachment
+ if not old_attachment:
+ raise InvalidVolumeAttachmentError(volume_id, instance_id)
+ old_attachment.status = 'detached'
+
+ volume.attachment = None
+ return old_attachment
+
+ def create_snapshot(self, volume_id, description, owner_id=None):
+ snapshot_id = random_snapshot_id()
+ volume = self.get_volume(volume_id)
+ params = [self, snapshot_id, volume, description, volume.encrypted]
+ if owner_id:
+ params.append(owner_id)
+ snapshot = Snapshot(*params)
+ self.snapshots[snapshot_id] = snapshot
+ return snapshot
+
+ def describe_snapshots(self, snapshot_ids=None, filters=None):
+ matches = self.snapshots.values()
+ if snapshot_ids:
+ matches = [snap for snap in matches
+ if snap.id in snapshot_ids]
+ if len(snapshot_ids) > len(matches):
+ unknown_ids = set(snapshot_ids) - set(matches)
+ raise InvalidSnapshotIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def copy_snapshot(self, source_snapshot_id, source_region, description=None):
+ source_snapshot = ec2_backends[source_region].describe_snapshots(
+ snapshot_ids=[source_snapshot_id])[0]
+ snapshot_id = random_snapshot_id()
+ snapshot = Snapshot(self, snapshot_id, volume=source_snapshot.volume,
+ description=description, encrypted=source_snapshot.encrypted)
+ self.snapshots[snapshot_id] = snapshot
+ return snapshot
+
+ def get_snapshot(self, snapshot_id):
+ snapshot = self.snapshots.get(snapshot_id, None)
+ if not snapshot:
+ raise InvalidSnapshotIdError(snapshot_id)
+ return snapshot
+
+ def delete_snapshot(self, snapshot_id):
+ if snapshot_id in self.snapshots:
+ return self.snapshots.pop(snapshot_id)
+ raise InvalidSnapshotIdError(snapshot_id)
+
+ def get_create_volume_permission_groups(self, snapshot_id):
+ snapshot = self.get_snapshot(snapshot_id)
+ return snapshot.create_volume_permission_groups
+
+ def add_create_volume_permission(self, snapshot_id, user_id=None, group=None):
+ if user_id:
+ self.raise_not_implemented_error(
+ "The UserId parameter for ModifySnapshotAttribute")
+
+ if group != 'all':
+ raise InvalidAMIAttributeItemValueError("UserGroup", group)
+ snapshot = self.get_snapshot(snapshot_id)
+ snapshot.create_volume_permission_groups.add(group)
+ return True
+
+ def remove_create_volume_permission(self, snapshot_id, user_id=None, group=None):
+ if user_id:
+ self.raise_not_implemented_error(
+ "The UserId parameter for ModifySnapshotAttribute")
+
+ if group != 'all':
+ raise InvalidAMIAttributeItemValueError("UserGroup", group)
+ snapshot = self.get_snapshot(snapshot_id)
+ snapshot.create_volume_permission_groups.discard(group)
+ return True
+
+
+class VPC(TaggedEC2Resource):
+ def __init__(self, ec2_backend, vpc_id, cidr_block, is_default, instance_tenancy='default',
+ amazon_provided_ipv6_cidr_block=False):
+
+ self.ec2_backend = ec2_backend
+ self.id = vpc_id
+ self.cidr_block = cidr_block
+ self.cidr_block_association_set = {}
+ self.dhcp_options = None
+ self.state = 'available'
+ self.instance_tenancy = instance_tenancy
+ self.is_default = 'true' if is_default else 'false'
+ self.enable_dns_support = 'true'
+ # This attribute is set to 'true' only for default VPCs
+ # or VPCs created using the wizard of the VPC console
+ self.enable_dns_hostnames = 'true' if is_default else 'false'
+
+ self.associate_vpc_cidr_block(cidr_block)
+ if amazon_provided_ipv6_cidr_block:
+ self.associate_vpc_cidr_block(cidr_block, amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_block)
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ vpc = ec2_backend.create_vpc(
+ cidr_block=properties['CidrBlock'],
+ instance_tenancy=properties.get('InstanceTenancy', 'default')
+ )
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ vpc.add_tag(tag_key, tag_value)
+
+ return vpc
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name in ('vpc-id', 'vpcId'):
+ return self.id
+ elif filter_name in ('cidr', 'cidr-block', 'cidrBlock'):
+ return self.cidr_block
+ elif filter_name in ('cidr-block-association.cidr-block', 'ipv6-cidr-block-association.ipv6-cidr-block'):
+ return [c['cidr_block'] for c in self.get_cidr_block_association_set(ipv6='ipv6' in filter_name)]
+ elif filter_name in ('cidr-block-association.association-id', 'ipv6-cidr-block-association.association-id'):
+ return self.cidr_block_association_set.keys()
+ elif filter_name in ('cidr-block-association.state', 'ipv6-cidr-block-association.state'):
+ return [c['cidr_block_state']['state'] for c in self.get_cidr_block_association_set(ipv6='ipv6' in filter_name)]
+ elif filter_name in ('instance_tenancy', 'InstanceTenancy'):
+ return self.instance_tenancy
+ elif filter_name in ('is-default', 'isDefault'):
+ return self.is_default
+ elif filter_name == 'state':
+ return self.state
+ elif filter_name in ('dhcp-options-id', 'dhcpOptionsId'):
+ if not self.dhcp_options:
+ return None
+ return self.dhcp_options.id
+ else:
+ return super(VPC, self).get_filter_value(filter_name, 'DescribeVpcs')
+
+ def associate_vpc_cidr_block(self, cidr_block, amazon_provided_ipv6_cidr_block=False):
+ max_associations = 5 if not amazon_provided_ipv6_cidr_block else 1
+
+ if len(self.get_cidr_block_association_set(amazon_provided_ipv6_cidr_block)) >= max_associations:
+ raise CidrLimitExceeded(self.id, max_associations)
+
+ association_id = random_vpc_cidr_association_id()
+
+ association_set = {
+ 'association_id': association_id,
+ 'cidr_block_state': {'state': 'associated', 'StatusMessage': ''}
+ }
+
+ association_set['cidr_block'] = random_ipv6_cidr() if amazon_provided_ipv6_cidr_block else cidr_block
+ self.cidr_block_association_set[association_id] = association_set
+ return association_set
+
+ def disassociate_vpc_cidr_block(self, association_id):
+ if self.cidr_block == self.cidr_block_association_set.get(association_id, {}).get('cidr_block'):
+ raise OperationNotPermitted(association_id)
+
+ response = self.cidr_block_association_set.pop(association_id, {})
+ if response:
+ response['vpc_id'] = self.id
+ response['cidr_block_state']['state'] = 'disassociating'
+ return response
+
+ def get_cidr_block_association_set(self, ipv6=False):
+ return [c for c in self.cidr_block_association_set.values() if ('::/' if ipv6 else '.') in c.get('cidr_block')]
+
+
+class VPCBackend(object):
+ __refs__ = defaultdict(list)
+
+ def __init__(self):
+ self.vpcs = {}
+ self.__refs__[self.__class__].append(weakref.ref(self))
+ super(VPCBackend, self).__init__()
+
+ @classmethod
+ def get_instances(cls):
+ for inst_ref in cls.__refs__[cls]:
+ inst = inst_ref()
+ if inst is not None:
+ yield inst
+
+ def create_vpc(self, cidr_block, instance_tenancy='default', amazon_provided_ipv6_cidr_block=False):
+ vpc_id = random_vpc_id()
+ vpc = VPC(self, vpc_id, cidr_block, len(self.vpcs) == 0, instance_tenancy, amazon_provided_ipv6_cidr_block)
+ self.vpcs[vpc_id] = vpc
+
+ # AWS creates a default main route table and security group.
+ self.create_route_table(vpc_id, main=True)
+
+ # AWS creates a default Network ACL
+ self.create_network_acl(vpc_id, default=True)
+
+ default = self.get_security_group_from_name('default', vpc_id=vpc_id)
+ if not default:
+ self.create_security_group(
+ 'default', 'default VPC security group', vpc_id=vpc_id)
+
+ return vpc
+
+ def get_vpc(self, vpc_id):
+ if vpc_id not in self.vpcs:
+ raise InvalidVPCIdError(vpc_id)
+ return self.vpcs.get(vpc_id)
+
+ # get vpc by vpc id and aws region
+ def get_cross_vpc(self, vpc_id, peer_region):
+ for vpcs in self.get_instances():
+ if vpcs.region_name == peer_region:
+ match_vpc = vpcs.get_vpc(vpc_id)
+ return match_vpc
+
+ def get_all_vpcs(self, vpc_ids=None, filters=None):
+ matches = self.vpcs.values()
+ if vpc_ids:
+ matches = [vpc for vpc in matches
+ if vpc.id in vpc_ids]
+ if len(vpc_ids) > len(matches):
+ unknown_ids = set(vpc_ids) - set(matches)
+ raise InvalidVPCIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def delete_vpc(self, vpc_id):
+ # Delete route table if only main route table remains.
+ route_tables = self.get_all_route_tables(filters={'vpc-id': vpc_id})
+ if len(route_tables) > 1:
+ raise DependencyViolationError(
+ "The vpc {0} has dependencies and cannot be deleted.".format(vpc_id)
+ )
+ for route_table in route_tables:
+ self.delete_route_table(route_table.id)
+
+ # Delete default security group if exists.
+ default = self.get_security_group_from_name('default', vpc_id=vpc_id)
+ if default:
+ self.delete_security_group(group_id=default.id)
+
+ # Now delete VPC.
+ vpc = self.vpcs.pop(vpc_id, None)
+ if not vpc:
+ raise InvalidVPCIdError(vpc_id)
+
+ if vpc.dhcp_options:
+ vpc.dhcp_options.vpc = None
+ self.delete_dhcp_options_set(vpc.dhcp_options.id)
+ vpc.dhcp_options = None
+ return vpc
+
+ def describe_vpc_attribute(self, vpc_id, attr_name):
+ vpc = self.get_vpc(vpc_id)
+ if attr_name in ('enable_dns_support', 'enable_dns_hostnames'):
+ return getattr(vpc, attr_name)
+ else:
+ raise InvalidParameterValueError(attr_name)
+
+ def modify_vpc_attribute(self, vpc_id, attr_name, attr_value):
+ vpc = self.get_vpc(vpc_id)
+ if attr_name in ('enable_dns_support', 'enable_dns_hostnames'):
+ setattr(vpc, attr_name, attr_value)
+ else:
+ raise InvalidParameterValueError(attr_name)
+
+ def disassociate_vpc_cidr_block(self, association_id):
+ for vpc in self.vpcs.values():
+ response = vpc.disassociate_vpc_cidr_block(association_id)
+ if response:
+ return response
+ else:
+ raise InvalidVpcCidrBlockAssociationIdError(association_id)
+
+ def associate_vpc_cidr_block(self, vpc_id, cidr_block, amazon_provided_ipv6_cidr_block):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.associate_vpc_cidr_block(cidr_block, amazon_provided_ipv6_cidr_block)
+
+
+class VPCPeeringConnectionStatus(object):
+ def __init__(self, code='initiating-request', message=''):
+ self.code = code
+ self.message = message
+
+ def deleted(self):
+ self.code = 'deleted'
+ self.message = 'Deleted by {deleter ID}'
+
+ def initiating(self):
+ self.code = 'initiating-request'
+ self.message = 'Initiating Request to {accepter ID}'
+
+ def pending(self):
+ self.code = 'pending-acceptance'
+ self.message = 'Pending Acceptance by {accepter ID}'
+
+ def accept(self):
+ self.code = 'active'
+ self.message = 'Active'
+
+ def reject(self):
+ self.code = 'rejected'
+ self.message = 'Inactive'
+
+
+class VPCPeeringConnection(TaggedEC2Resource):
+ def __init__(self, vpc_pcx_id, vpc, peer_vpc):
+ self.id = vpc_pcx_id
+ self.vpc = vpc
+ self.peer_vpc = peer_vpc
+ self._status = VPCPeeringConnectionStatus()
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ vpc = ec2_backend.get_vpc(properties['VpcId'])
+ peer_vpc = ec2_backend.get_vpc(properties['PeerVpcId'])
+
+ vpc_pcx = ec2_backend.create_vpc_peering_connection(vpc, peer_vpc)
+
+ return vpc_pcx
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+
+class VPCPeeringConnectionBackend(object):
+ def __init__(self):
+ self.vpc_pcxs = {}
+ super(VPCPeeringConnectionBackend, self).__init__()
+
+ def create_vpc_peering_connection(self, vpc, peer_vpc):
+ vpc_pcx_id = random_vpc_peering_connection_id()
+ vpc_pcx = VPCPeeringConnection(vpc_pcx_id, vpc, peer_vpc)
+ vpc_pcx._status.pending()
+ self.vpc_pcxs[vpc_pcx_id] = vpc_pcx
+ return vpc_pcx
+
+ def get_all_vpc_peering_connections(self):
+ return self.vpc_pcxs.values()
+
+ def get_vpc_peering_connection(self, vpc_pcx_id):
+ if vpc_pcx_id not in self.vpc_pcxs:
+ raise InvalidVPCPeeringConnectionIdError(vpc_pcx_id)
+ return self.vpc_pcxs.get(vpc_pcx_id)
+
+ def delete_vpc_peering_connection(self, vpc_pcx_id):
+ deleted = self.get_vpc_peering_connection(vpc_pcx_id)
+ deleted._status.deleted()
+ return deleted
+
+ def accept_vpc_peering_connection(self, vpc_pcx_id):
+ vpc_pcx = self.get_vpc_peering_connection(vpc_pcx_id)
+ if vpc_pcx._status.code != 'pending-acceptance':
+ raise InvalidVPCPeeringConnectionStateTransitionError(vpc_pcx.id)
+ vpc_pcx._status.accept()
+ return vpc_pcx
+
+ def reject_vpc_peering_connection(self, vpc_pcx_id):
+ vpc_pcx = self.get_vpc_peering_connection(vpc_pcx_id)
+ if vpc_pcx._status.code != 'pending-acceptance':
+ raise InvalidVPCPeeringConnectionStateTransitionError(vpc_pcx.id)
+ vpc_pcx._status.reject()
+ return vpc_pcx
+
+
+class Subnet(TaggedEC2Resource):
+ def __init__(self, ec2_backend, subnet_id, vpc_id, cidr_block, availability_zone, default_for_az,
+ map_public_ip_on_launch):
+ self.ec2_backend = ec2_backend
+ self.id = subnet_id
+ self.vpc_id = vpc_id
+ self.cidr_block = cidr_block
+ self.cidr = ipaddress.ip_network(six.text_type(self.cidr_block))
+ self._availability_zone = availability_zone
+ self.default_for_az = default_for_az
+ self.map_public_ip_on_launch = map_public_ip_on_launch
+
+ # Theory is we assign ip's as we go (as 16,777,214 usable IPs in a /8)
+ self._subnet_ip_generator = self.cidr.hosts()
+ self.reserved_ips = [six.next(self._subnet_ip_generator) for _ in range(0, 3)] # Reserved by AWS
+ self._unused_ips = set() # if instance is destroyed hold IP here for reuse
+ self._subnet_ips = {} # has IP: instance
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ vpc_id = properties['VpcId']
+ cidr_block = properties['CidrBlock']
+ availability_zone = properties.get('AvailabilityZone')
+ ec2_backend = ec2_backends[region_name]
+ subnet = ec2_backend.create_subnet(
+ vpc_id=vpc_id,
+ cidr_block=cidr_block,
+ availability_zone=availability_zone,
+ )
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ subnet.add_tag(tag_key, tag_value)
+
+ return subnet
+
+ @property
+ def availability_zone(self):
+ return self._availability_zone
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ """
+ API Version 2014-10-01 defines the following filters for DescribeSubnets:
+
+ * availabilityZone
+ * available-ip-address-count
+ * cidrBlock
+ * defaultForAz
+ * state
+ * subnet-id
+ * tag:key=value
+ * tag-key
+ * tag-value
+ * vpc-id
+
+ Taken from: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html
+ """
+ if filter_name in ('cidr', 'cidrBlock', 'cidr-block'):
+ return self.cidr_block
+ elif filter_name in ('vpc-id', 'vpcId'):
+ return self.vpc_id
+ elif filter_name == 'subnet-id':
+ return self.id
+ elif filter_name in ('availabilityZone', 'availability-zone'):
+ return self.availability_zone
+ elif filter_name in ('defaultForAz', 'default-for-az'):
+ return self.default_for_az
+ else:
+ return super(Subnet, self).get_filter_value(
+ filter_name, 'DescribeSubnets')
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'AvailabilityZone':
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "AvailabilityZone" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ def get_available_subnet_ip(self, instance):
+ try:
+ new_ip = self._unused_ips.pop()
+ except KeyError:
+ new_ip = six.next(self._subnet_ip_generator)
+
+ # Skips any IP's if they've been manually specified
+ while str(new_ip) in self._subnet_ips:
+ new_ip = six.next(self._subnet_ip_generator)
+
+ if new_ip == self.cidr.broadcast_address:
+ raise StopIteration() # Broadcast address cant be used obviously
+ # TODO StopIteration will be raised if no ip's available, not sure how aws handles this.
+
+ new_ip = str(new_ip)
+ self._subnet_ips[new_ip] = instance
+
+ return new_ip
+
+ def request_ip(self, ip, instance):
+ if ipaddress.ip_address(ip) not in self.cidr:
+ raise Exception('IP does not fall in the subnet CIDR of {0}'.format(self.cidr))
+
+ if ip in self._subnet_ips:
+ raise Exception('IP already in use')
+ try:
+ self._unused_ips.remove(ip)
+ except KeyError:
+ pass
+
+ self._subnet_ips[ip] = instance
+ return ip
+
+ def del_subnet_ip(self, ip):
+ try:
+ del self._subnet_ips[ip]
+ self._unused_ips.add(ip)
+ except KeyError:
+ pass # Unknown IP
+
+
+class SubnetBackend(object):
+ def __init__(self):
+ # maps availability zone to dict of (subnet_id, subnet)
+ self.subnets = defaultdict(dict)
+ super(SubnetBackend, self).__init__()
+
+ def get_subnet(self, subnet_id):
+ for subnets in self.subnets.values():
+ if subnet_id in subnets:
+ return subnets[subnet_id]
+ raise InvalidSubnetIdError(subnet_id)
+
+ def create_subnet(self, vpc_id, cidr_block, availability_zone):
+ subnet_id = random_subnet_id()
+ self.get_vpc(vpc_id) # Validate VPC exists
+
+ # if this is the first subnet for an availability zone,
+ # consider it the default
+ default_for_az = str(availability_zone not in self.subnets).lower()
+ map_public_ip_on_launch = default_for_az
+ subnet = Subnet(self, subnet_id, vpc_id, cidr_block, availability_zone,
+ default_for_az, map_public_ip_on_launch)
+
+ # AWS associates a new subnet with the default Network ACL
+ self.associate_default_network_acl_with_subnet(subnet_id, vpc_id)
+ self.subnets[availability_zone][subnet_id] = subnet
+ return subnet
+
+ def get_all_subnets(self, subnet_ids=None, filters=None):
+ # Extract a list of all subnets
+ matches = itertools.chain(*[x.values()
+ for x in self.subnets.values()])
+ if subnet_ids:
+ matches = [sn for sn in matches
+ if sn.id in subnet_ids]
+ if len(subnet_ids) > len(matches):
+ unknown_ids = set(subnet_ids) - set(matches)
+ raise InvalidSubnetIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+
+ return matches
+
+ def delete_subnet(self, subnet_id):
+ for subnets in self.subnets.values():
+ if subnet_id in subnets:
+ return subnets.pop(subnet_id, None)
+ raise InvalidSubnetIdError(subnet_id)
+
+ def modify_subnet_attribute(self, subnet_id, map_public_ip):
+ subnet = self.get_subnet(subnet_id)
+ if map_public_ip not in ('true', 'false'):
+ raise InvalidParameterValueError(map_public_ip)
+ subnet.map_public_ip_on_launch = map_public_ip
+
+
+class SubnetRouteTableAssociation(object):
+ def __init__(self, route_table_id, subnet_id):
+ self.route_table_id = route_table_id
+ self.subnet_id = subnet_id
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ route_table_id = properties['RouteTableId']
+ subnet_id = properties['SubnetId']
+
+ ec2_backend = ec2_backends[region_name]
+ subnet_association = ec2_backend.create_subnet_association(
+ route_table_id=route_table_id,
+ subnet_id=subnet_id,
+ )
+ return subnet_association
+
+
+class SubnetRouteTableAssociationBackend(object):
+ def __init__(self):
+ self.subnet_associations = {}
+ super(SubnetRouteTableAssociationBackend, self).__init__()
+
+ def create_subnet_association(self, route_table_id, subnet_id):
+ subnet_association = SubnetRouteTableAssociation(
+ route_table_id, subnet_id)
+ self.subnet_associations["{0}:{1}".format(
+ route_table_id, subnet_id)] = subnet_association
+ return subnet_association
+
+
+class RouteTable(TaggedEC2Resource):
+ def __init__(self, ec2_backend, route_table_id, vpc_id, main=False):
+ self.ec2_backend = ec2_backend
+ self.id = route_table_id
+ self.vpc_id = vpc_id
+ self.main = main
+ self.associations = {}
+ self.routes = {}
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ vpc_id = properties['VpcId']
+ ec2_backend = ec2_backends[region_name]
+ route_table = ec2_backend.create_route_table(
+ vpc_id=vpc_id,
+ )
+ return route_table
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "association.main":
+ # Note: Boto only supports 'true'.
+ # https://github.com/boto/boto/issues/1742
+ if self.main:
+ return 'true'
+ else:
+ return 'false'
+ elif filter_name == "route-table-id":
+ return self.id
+ elif filter_name == "vpc-id":
+ return self.vpc_id
+ elif filter_name == "association.route-table-id":
+ return self.id
+ elif filter_name == "association.route-table-association-id":
+ return self.associations.keys()
+ elif filter_name == "association.subnet-id":
+ return self.associations.values()
+ else:
+ return super(RouteTable, self).get_filter_value(
+ filter_name, 'DescribeRouteTables')
+
+
+class RouteTableBackend(object):
+ def __init__(self):
+ self.route_tables = {}
+ super(RouteTableBackend, self).__init__()
+
+ def create_route_table(self, vpc_id, main=False):
+ route_table_id = random_route_table_id()
+ vpc = self.get_vpc(vpc_id) # Validate VPC exists
+ route_table = RouteTable(self, route_table_id, vpc_id, main=main)
+ self.route_tables[route_table_id] = route_table
+
+ # AWS creates a default local route.
+ self.create_route(route_table_id, vpc.cidr_block, local=True)
+
+ return route_table
+
+ def get_route_table(self, route_table_id):
+ route_table = self.route_tables.get(route_table_id, None)
+ if not route_table:
+ raise InvalidRouteTableIdError(route_table_id)
+ return route_table
+
+ def get_all_route_tables(self, route_table_ids=None, filters=None):
+ route_tables = self.route_tables.values()
+
+ if route_table_ids:
+ route_tables = [
+ route_table for route_table in route_tables if route_table.id in route_table_ids]
+ if len(route_tables) != len(route_table_ids):
+ invalid_id = list(set(route_table_ids).difference(
+ set([route_table.id for route_table in route_tables])))[0]
+ raise InvalidRouteTableIdError(invalid_id)
+
+ return generic_filter(filters, route_tables)
+
+ def delete_route_table(self, route_table_id):
+ route_table = self.get_route_table(route_table_id)
+ if route_table.associations:
+ raise DependencyViolationError(
+ "The routeTable '{0}' has dependencies and cannot be deleted.".format(route_table_id)
+ )
+ self.route_tables.pop(route_table_id)
+ return True
+
+ def associate_route_table(self, route_table_id, subnet_id):
+ # Idempotent if association already exists.
+ route_tables_by_subnet = self.get_all_route_tables(
+ filters={'association.subnet-id': [subnet_id]})
+ if route_tables_by_subnet:
+ for association_id, check_subnet_id in route_tables_by_subnet[0].associations.items():
+ if subnet_id == check_subnet_id:
+ return association_id
+
+ # Association does not yet exist, so create it.
+ route_table = self.get_route_table(route_table_id)
+ self.get_subnet(subnet_id) # Validate subnet exists
+ association_id = random_subnet_association_id()
+ route_table.associations[association_id] = subnet_id
+ return association_id
+
+ def disassociate_route_table(self, association_id):
+ for route_table in self.route_tables.values():
+ if association_id in route_table.associations:
+ return route_table.associations.pop(association_id, None)
+ raise InvalidAssociationIdError(association_id)
+
+ def replace_route_table_association(self, association_id, route_table_id):
+ # Idempotent if association already exists.
+ new_route_table = self.get_route_table(route_table_id)
+ if association_id in new_route_table.associations:
+ return association_id
+
+ # Find route table which currently has the association, error if none.
+ route_tables_by_association_id = self.get_all_route_tables(
+ filters={'association.route-table-association-id': [association_id]})
+ if not route_tables_by_association_id:
+ raise InvalidAssociationIdError(association_id)
+
+ # Remove existing association, create new one.
+ previous_route_table = route_tables_by_association_id[0]
+ subnet_id = previous_route_table.associations.pop(association_id, None)
+ return self.associate_route_table(route_table_id, subnet_id)
+
+
+class Route(object):
+ def __init__(self, route_table, destination_cidr_block, local=False,
+ gateway=None, instance=None, interface=None, vpc_pcx=None):
+ self.id = generate_route_id(route_table.id, destination_cidr_block)
+ self.route_table = route_table
+ self.destination_cidr_block = destination_cidr_block
+ self.local = local
+ self.gateway = gateway
+ self.instance = instance
+ self.interface = interface
+ self.vpc_pcx = vpc_pcx
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ gateway_id = properties.get('GatewayId')
+ instance_id = properties.get('InstanceId')
+ interface_id = properties.get('NetworkInterfaceId')
+ pcx_id = properties.get('VpcPeeringConnectionId')
+
+ route_table_id = properties['RouteTableId']
+ ec2_backend = ec2_backends[region_name]
+ route_table = ec2_backend.create_route(
+ route_table_id=route_table_id,
+ destination_cidr_block=properties.get('DestinationCidrBlock'),
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id,
+ )
+ return route_table
+
+
+class RouteBackend(object):
+ def __init__(self):
+ super(RouteBackend, self).__init__()
+
+ def create_route(self, route_table_id, destination_cidr_block, local=False,
+ gateway_id=None, instance_id=None, interface_id=None,
+ vpc_peering_connection_id=None):
+ route_table = self.get_route_table(route_table_id)
+
+ if interface_id:
+ self.raise_not_implemented_error(
+ "CreateRoute to NetworkInterfaceId")
+
+ gateway = None
+ if gateway_id:
+ if EC2_RESOURCE_TO_PREFIX['vpn-gateway'] in gateway_id:
+ gateway = self.get_vpn_gateway(gateway_id)
+ elif EC2_RESOURCE_TO_PREFIX['internet-gateway'] in gateway_id:
+ gateway = self.get_internet_gateway(gateway_id)
+
+ route = Route(route_table, destination_cidr_block, local=local,
+ gateway=gateway,
+ instance=self.get_instance(
+ instance_id) if instance_id else None,
+ interface=None,
+ vpc_pcx=self.get_vpc_peering_connection(
+ vpc_peering_connection_id) if vpc_peering_connection_id else None)
+ route_table.routes[route.id] = route
+ return route
+
+ def replace_route(self, route_table_id, destination_cidr_block,
+ gateway_id=None, instance_id=None, interface_id=None,
+ vpc_peering_connection_id=None):
+ route_table = self.get_route_table(route_table_id)
+ route_id = generate_route_id(route_table.id, destination_cidr_block)
+ route = route_table.routes[route_id]
+
+ if interface_id:
+ self.raise_not_implemented_error(
+ "ReplaceRoute to NetworkInterfaceId")
+
+ route.gateway = None
+ if gateway_id:
+ if EC2_RESOURCE_TO_PREFIX['vpn-gateway'] in gateway_id:
+ route.gateway = self.get_vpn_gateway(gateway_id)
+ elif EC2_RESOURCE_TO_PREFIX['internet-gateway'] in gateway_id:
+ route.gateway = self.get_internet_gateway(gateway_id)
+
+ route.instance = self.get_instance(
+ instance_id) if instance_id else None
+ route.interface = None
+ route.vpc_pcx = self.get_vpc_peering_connection(
+ vpc_peering_connection_id) if vpc_peering_connection_id else None
+
+ route_table.routes[route.id] = route
+ return route
+
+ def get_route(self, route_id):
+ route_table_id, destination_cidr_block = split_route_id(route_id)
+ route_table = self.get_route_table(route_table_id)
+ return route_table.get(route_id)
+
+ def delete_route(self, route_table_id, destination_cidr_block):
+ route_table = self.get_route_table(route_table_id)
+ route_id = generate_route_id(route_table_id, destination_cidr_block)
+ deleted = route_table.routes.pop(route_id, None)
+ if not deleted:
+ raise InvalidRouteError(route_table_id, destination_cidr_block)
+ return deleted
+
+
+class InternetGateway(TaggedEC2Resource):
+ def __init__(self, ec2_backend):
+ self.ec2_backend = ec2_backend
+ self.id = random_internet_gateway_id()
+ self.vpc = None
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ ec2_backend = ec2_backends[region_name]
+ return ec2_backend.create_internet_gateway()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def attachment_state(self):
+ if self.vpc:
+ return "available"
+ else:
+ return "detached"
+
+
+class InternetGatewayBackend(object):
+ def __init__(self):
+ self.internet_gateways = {}
+ super(InternetGatewayBackend, self).__init__()
+
+ def create_internet_gateway(self):
+ igw = InternetGateway(self)
+ self.internet_gateways[igw.id] = igw
+ return igw
+
+ def describe_internet_gateways(self, internet_gateway_ids=None, filters=None):
+ igws = []
+ if internet_gateway_ids is None:
+ igws = self.internet_gateways.values()
+ else:
+ for igw_id in internet_gateway_ids:
+ if igw_id in self.internet_gateways:
+ igws.append(self.internet_gateways[igw_id])
+ else:
+ raise InvalidInternetGatewayIdError(igw_id)
+ if filters is not None:
+ igws = filter_internet_gateways(igws, filters)
+ return igws
+
+ def delete_internet_gateway(self, internet_gateway_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if igw.vpc:
+ raise DependencyViolationError(
+ "{0} is being utilized by {1}".format(internet_gateway_id, igw.vpc.id)
+ )
+ self.internet_gateways.pop(internet_gateway_id)
+ return True
+
+ def detach_internet_gateway(self, internet_gateway_id, vpc_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if not igw.vpc or igw.vpc.id != vpc_id:
+ raise GatewayNotAttachedError(internet_gateway_id, vpc_id)
+ igw.vpc = None
+ return True
+
+ def attach_internet_gateway(self, internet_gateway_id, vpc_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if igw.vpc:
+ raise ResourceAlreadyAssociatedError(internet_gateway_id)
+ vpc = self.get_vpc(vpc_id)
+ igw.vpc = vpc
+ return True
+
+ def get_internet_gateway(self, internet_gateway_id):
+ igw_ids = [internet_gateway_id]
+ return self.describe_internet_gateways(internet_gateway_ids=igw_ids)[0]
+
+
+class VPCGatewayAttachment(BaseModel):
+ def __init__(self, gateway_id, vpc_id):
+ self.gateway_id = gateway_id
+ self.vpc_id = vpc_id
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ ec2_backend = ec2_backends[region_name]
+ attachment = ec2_backend.create_vpc_gateway_attachment(
+ gateway_id=properties['InternetGatewayId'],
+ vpc_id=properties['VpcId'],
+ )
+ ec2_backend.attach_internet_gateway(
+ properties['InternetGatewayId'], properties['VpcId'])
+ return attachment
+
+ @property
+ def physical_resource_id(self):
+ return self.vpc_id
+
+
+class VPCGatewayAttachmentBackend(object):
+ def __init__(self):
+ self.gateway_attachments = {}
+ super(VPCGatewayAttachmentBackend, self).__init__()
+
+ def create_vpc_gateway_attachment(self, vpc_id, gateway_id):
+ attachment = VPCGatewayAttachment(vpc_id, gateway_id)
+ self.gateway_attachments[gateway_id] = attachment
+ return attachment
+
+
+class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
+ def __init__(self, ec2_backend, spot_request_id, price, image_id, type,
+ valid_from, valid_until, launch_group, availability_zone_group,
+ key_name, security_groups, user_data, instance_type, placement,
+ kernel_id, ramdisk_id, monitoring_enabled, subnet_id, tags, spot_fleet_id,
+ **kwargs):
+ super(SpotInstanceRequest, self).__init__(**kwargs)
+ ls = LaunchSpecification()
+ self.ec2_backend = ec2_backend
+ self.launch_specification = ls
+ self.id = spot_request_id
+ self.state = "open"
+ self.price = price
+ self.type = type
+ self.valid_from = valid_from
+ self.valid_until = valid_until
+ self.launch_group = launch_group
+ self.availability_zone_group = availability_zone_group
+ self.user_data = user_data # NOT
+ ls.kernel = kernel_id
+ ls.ramdisk = ramdisk_id
+ ls.image_id = image_id
+ ls.key_name = key_name
+ ls.instance_type = instance_type
+ ls.placement = placement
+ ls.monitored = monitoring_enabled
+ ls.subnet_id = subnet_id
+ self.spot_fleet_id = spot_fleet_id
+ self.tags = tags
+
+ if security_groups:
+ for group_name in security_groups:
+ group = self.ec2_backend.get_security_group_from_name(
+ group_name)
+ if group:
+ ls.groups.append(group)
+ else:
+ # If not security groups, add the default
+ default_group = self.ec2_backend.get_security_group_from_name(
+ "default")
+ ls.groups.append(default_group)
+
+ self.instance = self.launch_instance()
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'state':
+ return self.state
+ elif filter_name == 'spot-instance-request-id':
+ return self.id
+ else:
+ return super(SpotInstanceRequest, self).get_filter_value(
+ filter_name, 'DescribeSpotInstanceRequests')
+
+ def launch_instance(self):
+ reservation = self.ec2_backend.add_instances(
+ image_id=self.launch_specification.image_id, count=1, user_data=self.user_data,
+ instance_type=self.launch_specification.instance_type,
+ subnet_id=self.launch_specification.subnet_id,
+ key_name=self.launch_specification.key_name,
+ security_group_names=[],
+ security_group_ids=self.launch_specification.groups,
+ spot_fleet_id=self.spot_fleet_id,
+ tags=self.tags,
+ )
+ instance = reservation.instances[0]
+ return instance
+
+
+@six.add_metaclass(Model)
+class SpotRequestBackend(object):
+ def __init__(self):
+ self.spot_instance_requests = {}
+ super(SpotRequestBackend, self).__init__()
+
+ def request_spot_instances(self, price, image_id, count, type, valid_from,
+ valid_until, launch_group, availability_zone_group,
+ key_name, security_groups, user_data,
+ instance_type, placement, kernel_id, ramdisk_id,
+ monitoring_enabled, subnet_id, tags=None, spot_fleet_id=None):
+ requests = []
+ tags = tags or {}
+ for _ in range(count):
+ spot_request_id = random_spot_request_id()
+ request = SpotInstanceRequest(self,
+ spot_request_id, price, image_id, type, valid_from, valid_until,
+ launch_group, availability_zone_group, key_name, security_groups,
+ user_data, instance_type, placement, kernel_id, ramdisk_id,
+ monitoring_enabled, subnet_id, tags, spot_fleet_id)
+ self.spot_instance_requests[spot_request_id] = request
+ requests.append(request)
+ return requests
+
+ @Model.prop('SpotInstanceRequest')
+ def describe_spot_instance_requests(self, filters=None):
+ requests = self.spot_instance_requests.values()
+
+ return generic_filter(filters, requests)
+
+ def cancel_spot_instance_requests(self, request_ids):
+ requests = []
+ for request_id in request_ids:
+ requests.append(self.spot_instance_requests.pop(request_id))
+ return requests
+
+
+class SpotFleetLaunchSpec(object):
+ def __init__(self, ebs_optimized, group_set, iam_instance_profile, image_id,
+ instance_type, key_name, monitoring, spot_price, subnet_id, tag_specifications,
+ user_data, weighted_capacity):
+ self.ebs_optimized = ebs_optimized
+ self.group_set = group_set
+ self.iam_instance_profile = iam_instance_profile
+ self.image_id = image_id
+ self.instance_type = instance_type
+ self.key_name = key_name
+ self.monitoring = monitoring
+ self.spot_price = spot_price
+ self.subnet_id = subnet_id
+ self.tag_specifications = tag_specifications
+ self.user_data = user_data
+ self.weighted_capacity = float(weighted_capacity)
+
+
+class SpotFleetRequest(TaggedEC2Resource):
+ def __init__(self, ec2_backend, spot_fleet_request_id, spot_price,
+ target_capacity, iam_fleet_role, allocation_strategy, launch_specs):
+
+ self.ec2_backend = ec2_backend
+ self.id = spot_fleet_request_id
+ self.spot_price = spot_price
+ self.target_capacity = int(target_capacity)
+ self.iam_fleet_role = iam_fleet_role
+ self.allocation_strategy = allocation_strategy
+ self.state = "active"
+ self.fulfilled_capacity = 0.0
+
+ self.launch_specs = []
+ for spec in launch_specs:
+ self.launch_specs.append(SpotFleetLaunchSpec(
+ ebs_optimized=spec['ebs_optimized'],
+ group_set=[val for key, val in spec.items(
+ ) if key.startswith("group_set")],
+ iam_instance_profile=spec.get('iam_instance_profile._arn'),
+ image_id=spec['image_id'],
+ instance_type=spec['instance_type'],
+ key_name=spec.get('key_name'),
+ monitoring=spec.get('monitoring._enabled'),
+ spot_price=spec.get('spot_price', self.spot_price),
+ subnet_id=spec['subnet_id'],
+ tag_specifications=self._parse_tag_specifications(spec),
+ user_data=spec.get('user_data'),
+ weighted_capacity=spec['weighted_capacity'],
+ )
+ )
+
+ self.spot_requests = []
+ self.create_spot_requests(self.target_capacity)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json[
+ 'Properties']['SpotFleetRequestConfigData']
+ ec2_backend = ec2_backends[region_name]
+
+ spot_price = properties.get('SpotPrice')
+ target_capacity = properties['TargetCapacity']
+ iam_fleet_role = properties['IamFleetRole']
+ allocation_strategy = properties['AllocationStrategy']
+ launch_specs = properties["LaunchSpecifications"]
+ launch_specs = [
+ dict([(camelcase_to_underscores(key), val)
+ for key, val in launch_spec.items()])
+ for launch_spec
+ in launch_specs
+ ]
+
+ spot_fleet_request = ec2_backend.request_spot_fleet(spot_price,
+ target_capacity, iam_fleet_role, allocation_strategy,
+ launch_specs)
+
+ return spot_fleet_request
+
+ def get_launch_spec_counts(self, weight_to_add):
+ weight_map = defaultdict(int)
+
+ weight_so_far = 0
+ if self.allocation_strategy == 'diversified':
+ launch_spec_index = 0
+ while True:
+ launch_spec = self.launch_specs[
+ launch_spec_index % len(self.launch_specs)]
+ weight_map[launch_spec] += 1
+ weight_so_far += launch_spec.weighted_capacity
+ if weight_so_far >= weight_to_add:
+ break
+ launch_spec_index += 1
+ else: # lowestPrice
+ cheapest_spec = sorted(
+ # FIXME: change `+inf` to the on demand price scaled to weighted capacity when it's not present
+ self.launch_specs, key=lambda spec: float(spec.spot_price or '+inf'))[0]
+ weight_so_far = weight_to_add + (weight_to_add % cheapest_spec.weighted_capacity)
+ weight_map[cheapest_spec] = int(
+ weight_so_far // cheapest_spec.weighted_capacity)
+
+ return weight_map, weight_so_far
+
+ def create_spot_requests(self, weight_to_add):
+ weight_map, added_weight = self.get_launch_spec_counts(weight_to_add)
+ for launch_spec, count in weight_map.items():
+ requests = self.ec2_backend.request_spot_instances(
+ price=launch_spec.spot_price,
+ image_id=launch_spec.image_id,
+ count=count,
+ type="persistent",
+ valid_from=None,
+ valid_until=None,
+ launch_group=None,
+ availability_zone_group=None,
+ key_name=launch_spec.key_name,
+ security_groups=launch_spec.group_set,
+ user_data=launch_spec.user_data,
+ instance_type=launch_spec.instance_type,
+ placement=None,
+ kernel_id=None,
+ ramdisk_id=None,
+ monitoring_enabled=launch_spec.monitoring,
+ subnet_id=launch_spec.subnet_id,
+ spot_fleet_id=self.id,
+ tags=launch_spec.tag_specifications,
+ )
+ self.spot_requests.extend(requests)
+ self.fulfilled_capacity += added_weight
+ return self.spot_requests
+
+ def terminate_instances(self):
+ instance_ids = []
+ new_fulfilled_capacity = self.fulfilled_capacity
+ for req in self.spot_requests:
+ instance = req.instance
+ for spec in self.launch_specs:
+ if spec.instance_type == instance.instance_type and spec.subnet_id == instance.subnet_id:
+ break
+
+ if new_fulfilled_capacity - spec.weighted_capacity < self.target_capacity:
+ continue
+ new_fulfilled_capacity -= spec.weighted_capacity
+ instance_ids.append(instance.id)
+
+ self.spot_requests = [req for req in self.spot_requests if req.instance.id not in instance_ids]
+ self.ec2_backend.terminate_instances(instance_ids)
+
+ def _parse_tag_specifications(self, spec):
+ try:
+ tag_spec_num = max([int(key.split('.')[1]) for key in spec if key.startswith("tag_specification_set")])
+ except ValueError: # no tag specifications
+ return {}
+
+ tag_specifications = {}
+ for si in range(1, tag_spec_num + 1):
+ resource_type = spec["tag_specification_set.{si}._resource_type".format(si=si)]
+
+ tags = [key for key in spec if key.startswith("tag_specification_set.{si}._tag".format(si=si))]
+ tag_num = max([int(key.split('.')[3]) for key in tags])
+ tag_specifications[resource_type] = dict((
+ spec["tag_specification_set.{si}._tag.{ti}._key".format(si=si, ti=ti)],
+ spec["tag_specification_set.{si}._tag.{ti}._value".format(si=si, ti=ti)],
+ ) for ti in range(1, tag_num + 1))
+
+ return tag_specifications
+
+
+class SpotFleetBackend(object):
+ def __init__(self):
+ self.spot_fleet_requests = {}
+ super(SpotFleetBackend, self).__init__()
+
+ def request_spot_fleet(self, spot_price, target_capacity, iam_fleet_role,
+ allocation_strategy, launch_specs):
+
+ spot_fleet_request_id = random_spot_fleet_request_id()
+ request = SpotFleetRequest(self, spot_fleet_request_id, spot_price,
+ target_capacity, iam_fleet_role, allocation_strategy, launch_specs)
+ self.spot_fleet_requests[spot_fleet_request_id] = request
+ return request
+
+ def get_spot_fleet_request(self, spot_fleet_request_id):
+ return self.spot_fleet_requests[spot_fleet_request_id]
+
+ def describe_spot_fleet_instances(self, spot_fleet_request_id):
+ spot_fleet = self.get_spot_fleet_request(spot_fleet_request_id)
+ return spot_fleet.spot_requests
+
+ def describe_spot_fleet_requests(self, spot_fleet_request_ids):
+ requests = self.spot_fleet_requests.values()
+
+ if spot_fleet_request_ids:
+ requests = [
+ request for request in requests if request.id in spot_fleet_request_ids]
+
+ return requests
+
+ def cancel_spot_fleet_requests(self, spot_fleet_request_ids, terminate_instances):
+ spot_requests = []
+ for spot_fleet_request_id in spot_fleet_request_ids:
+ spot_fleet = self.spot_fleet_requests[spot_fleet_request_id]
+ if terminate_instances:
+ spot_fleet.target_capacity = 0
+ spot_fleet.terminate_instances()
+ spot_requests.append(spot_fleet)
+ del self.spot_fleet_requests[spot_fleet_request_id]
+ return spot_requests
+
+ def modify_spot_fleet_request(self, spot_fleet_request_id, target_capacity, terminate_instances):
+ if target_capacity < 0:
+ raise ValueError('Cannot reduce spot fleet capacity below 0')
+ spot_fleet_request = self.spot_fleet_requests[spot_fleet_request_id]
+ delta = target_capacity - spot_fleet_request.fulfilled_capacity
+ spot_fleet_request.target_capacity = target_capacity
+ if delta > 0:
+ spot_fleet_request.create_spot_requests(delta)
+ elif delta < 0 and terminate_instances == 'Default':
+ spot_fleet_request.terminate_instances()
+ return True
+
+
+class ElasticAddress(object):
+ def __init__(self, domain, address=None):
+ if address:
+ self.public_ip = address
+ else:
+ self.public_ip = random_ip()
+ self.allocation_id = random_eip_allocation_id() if domain == "vpc" else None
+ self.domain = domain
+ self.instance = None
+ self.eni = None
+ self.association_id = None
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ ec2_backend = ec2_backends[region_name]
+
+ properties = cloudformation_json.get('Properties')
+ instance_id = None
+ if properties:
+ domain = properties.get('Domain')
+ eip = ec2_backend.allocate_address(
+ domain=domain if domain else 'standard')
+ instance_id = properties.get('InstanceId')
+ else:
+ eip = ec2_backend.allocate_address(domain='standard')
+
+ if instance_id:
+ instance = ec2_backend.get_instance_by_id(instance_id)
+ ec2_backend.associate_address(instance, address=eip.public_ip)
+
+ return eip
+
+ @property
+ def physical_resource_id(self):
+ return self.public_ip
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'AllocationId':
+ return self.allocation_id
+ raise UnformattedGetAttTemplateException()
+
+ def get_filter_value(self, filter_name):
+ if filter_name == 'allocation-id':
+ return self.allocation_id
+ elif filter_name == 'association-id':
+ return self.association_id
+ elif filter_name == 'domain':
+ return self.domain
+ elif filter_name == 'instance-id' and self.instance:
+ return self.instance.id
+ elif filter_name == 'network-interface-id' and self.eni:
+ return self.eni.id
+ elif filter_name == 'private-ip-address' and self.eni:
+ return self.eni.private_ip_address
+ elif filter_name == 'public-ip':
+ return self.public_ip
+ else:
+ # TODO: implement network-interface-owner-id
+ raise FilterNotImplementedError(filter_name, 'DescribeAddresses')
+
+
+class ElasticAddressBackend(object):
+ def __init__(self):
+ self.addresses = []
+ super(ElasticAddressBackend, self).__init__()
+
+ def allocate_address(self, domain, address=None):
+ if domain not in ['standard', 'vpc']:
+ raise InvalidDomainError(domain)
+ if address:
+ address = ElasticAddress(domain, address)
+ else:
+ address = ElasticAddress(domain)
+ self.addresses.append(address)
+ return address
+
+ def address_by_ip(self, ips):
+ eips = [address for address in self.addresses
+ if address.public_ip in ips]
+
+ # TODO: Trim error message down to specific invalid address.
+ if not eips or len(ips) > len(eips):
+ raise InvalidAddressError(ips)
+
+ return eips
+
+ def address_by_allocation(self, allocation_ids):
+ eips = [address for address in self.addresses
+ if address.allocation_id in allocation_ids]
+
+ # TODO: Trim error message down to specific invalid id.
+ if not eips or len(allocation_ids) > len(eips):
+ raise InvalidAllocationIdError(allocation_ids)
+
+ return eips
+
+ def address_by_association(self, association_ids):
+ eips = [address for address in self.addresses
+ if address.association_id in association_ids]
+
+ # TODO: Trim error message down to specific invalid id.
+ if not eips or len(association_ids) > len(eips):
+ raise InvalidAssociationIdError(association_ids)
+
+ return eips
+
+ def associate_address(self, instance=None, eni=None, address=None, allocation_id=None, reassociate=False):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif allocation_id:
+ eips = self.address_by_allocation([allocation_id])
+ eip = eips[0]
+
+ new_instance_association = bool(instance and (
+ not eip.instance or eip.instance.id == instance.id))
+ new_eni_association = bool(
+ eni and (not eip.eni or eni.id == eip.eni.id))
+
+ if new_instance_association or new_eni_association or reassociate:
+ eip.instance = instance
+ eip.eni = eni
+ if not eip.eni and instance:
+ # default to primary network interface
+ eip.eni = instance.nics[0]
+ if eip.eni:
+ eip.eni.public_ip = eip.public_ip
+ if eip.domain == "vpc":
+ eip.association_id = random_eip_association_id()
+
+ return eip
+
+ raise ResourceAlreadyAssociatedError(eip.public_ip)
+
+ def describe_addresses(self, allocation_ids=None, public_ips=None, filters=None):
+ matches = self.addresses
+ if allocation_ids:
+ matches = [addr for addr in matches
+ if addr.allocation_id in allocation_ids]
+ if len(allocation_ids) > len(matches):
+ unknown_ids = set(allocation_ids) - set(matches)
+ raise InvalidAllocationIdError(unknown_ids)
+ if public_ips:
+ matches = [addr for addr in matches
+ if addr.public_ip in public_ips]
+ if len(public_ips) > len(matches):
+ unknown_ips = set(allocation_ids) - set(matches)
+ raise InvalidAddressError(unknown_ips)
+ if filters:
+ matches = generic_filter(filters, matches)
+
+ return matches
+
+ def disassociate_address(self, address=None, association_id=None):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif association_id:
+ eips = self.address_by_association([association_id])
+ eip = eips[0]
+
+ if eip.eni:
+ eip.eni.public_ip = None
+ if eip.eni.instance and eip.eni.instance._state.name == "running":
+ eip.eni.check_auto_public_ip()
+ eip.eni = None
+
+ eip.instance = None
+ eip.association_id = None
+ return True
+
+ def release_address(self, address=None, allocation_id=None):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif allocation_id:
+ eips = self.address_by_allocation([allocation_id])
+ eip = eips[0]
+
+ self.disassociate_address(address=eip.public_ip)
+ eip.allocation_id = None
+ self.addresses.remove(eip)
+ return True
+
+
+class DHCPOptionsSet(TaggedEC2Resource):
+ def __init__(self, ec2_backend, domain_name_servers=None, domain_name=None,
+ ntp_servers=None, netbios_name_servers=None,
+ netbios_node_type=None):
+ self.ec2_backend = ec2_backend
+ self._options = {
+ "domain-name-servers": domain_name_servers,
+ "domain-name": domain_name,
+ "ntp-servers": ntp_servers,
+ "netbios-name-servers": netbios_name_servers,
+ "netbios-node-type": netbios_node_type,
+ }
+ self.id = random_dhcp_option_id()
+ self.vpc = None
+
+ def get_filter_value(self, filter_name):
+ """
+ API Version 2015-10-01 defines the following filters for DescribeDhcpOptions:
+
+ * dhcp-options-id
+ * key
+ * value
+ * tag:key=value
+ * tag-key
+ * tag-value
+
+ Taken from: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeDhcpOptions.html
+ """
+ if filter_name == 'dhcp-options-id':
+ return self.id
+ elif filter_name == 'key':
+ return list(self._options.keys())
+ elif filter_name == 'value':
+ values = [item for item in list(self._options.values()) if item]
+ return itertools.chain(*values)
+ else:
+ return super(DHCPOptionsSet, self).get_filter_value(
+ filter_name, 'DescribeDhcpOptions')
+
+ @property
+ def options(self):
+ return self._options
+
+
+class DHCPOptionsSetBackend(object):
+ def __init__(self):
+ self.dhcp_options_sets = {}
+ super(DHCPOptionsSetBackend, self).__init__()
+
+ def associate_dhcp_options(self, dhcp_options, vpc):
+ dhcp_options.vpc = vpc
+ vpc.dhcp_options = dhcp_options
+
+ def create_dhcp_options(
+ self, domain_name_servers=None, domain_name=None,
+ ntp_servers=None, netbios_name_servers=None,
+ netbios_node_type=None):
+
+ NETBIOS_NODE_TYPES = [1, 2, 4, 8]
+
+ for field_value in domain_name_servers, ntp_servers, netbios_name_servers:
+ if field_value and len(field_value) > 4:
+ raise InvalidParameterValueError(",".join(field_value))
+
+ if netbios_node_type and int(netbios_node_type[0]) not in NETBIOS_NODE_TYPES:
+ raise InvalidParameterValueError(netbios_node_type)
+
+ options = DHCPOptionsSet(
+ self, domain_name_servers, domain_name, ntp_servers,
+ netbios_name_servers, netbios_node_type
+ )
+ self.dhcp_options_sets[options.id] = options
+ return options
+
+ def describe_dhcp_options(self, options_ids=None):
+ options_sets = []
+ for option_id in options_ids or []:
+ if option_id in self.dhcp_options_sets:
+ options_sets.append(self.dhcp_options_sets[option_id])
+ else:
+ raise InvalidDHCPOptionsIdError(option_id)
+ return options_sets or self.dhcp_options_sets.values()
+
+ def delete_dhcp_options_set(self, options_id):
+ if not (options_id and options_id.startswith('dopt-')):
+ raise MalformedDHCPOptionsIdError(options_id)
+
+ if options_id in self.dhcp_options_sets:
+ if self.dhcp_options_sets[options_id].vpc:
+ raise DependencyViolationError(
+ "Cannot delete assigned DHCP options.")
+ self.dhcp_options_sets.pop(options_id)
+ else:
+ raise InvalidDHCPOptionsIdError(options_id)
+ return True
+
+ def get_all_dhcp_options(self, dhcp_options_ids=None, filters=None):
+ dhcp_options_sets = self.dhcp_options_sets.values()
+
+ if dhcp_options_ids:
+ dhcp_options_sets = [
+ dhcp_options_set for dhcp_options_set in dhcp_options_sets if dhcp_options_set.id in dhcp_options_ids]
+ if len(dhcp_options_sets) != len(dhcp_options_ids):
+ invalid_id = list(set(dhcp_options_ids).difference(
+ set([dhcp_options_set.id for dhcp_options_set in dhcp_options_sets])))[0]
+ raise InvalidDHCPOptionsIdError(invalid_id)
+
+ return generic_filter(filters, dhcp_options_sets)
+
+
+class VPNConnection(TaggedEC2Resource):
+ def __init__(self, ec2_backend, id, type,
+ customer_gateway_id, vpn_gateway_id):
+ self.ec2_backend = ec2_backend
+ self.id = id
+ self.state = 'available'
+ self.customer_gateway_configuration = {}
+ self.type = type
+ self.customer_gateway_id = customer_gateway_id
+ self.vpn_gateway_id = vpn_gateway_id
+ self.tunnels = None
+ self.options = None
+ self.static_routes = None
+
+ def get_filter_value(self, filter_name):
+ return super(VPNConnection, self).get_filter_value(
+ filter_name, 'DescribeVpnConnections')
+
+
+class VPNConnectionBackend(object):
+ def __init__(self):
+ self.vpn_connections = {}
+ super(VPNConnectionBackend, self).__init__()
+
+ def create_vpn_connection(self, type, customer_gateway_id,
+ vpn_gateway_id,
+ static_routes_only=None):
+ vpn_connection_id = random_vpn_connection_id()
+ if static_routes_only:
+ pass
+ vpn_connection = VPNConnection(
+ self, id=vpn_connection_id, type=type,
+ customer_gateway_id=customer_gateway_id,
+ vpn_gateway_id=vpn_gateway_id
+ )
+ self.vpn_connections[vpn_connection.id] = vpn_connection
+ return vpn_connection
+
+ def delete_vpn_connection(self, vpn_connection_id):
+
+ if vpn_connection_id in self.vpn_connections:
+ self.vpn_connections.pop(vpn_connection_id)
+ else:
+ raise InvalidVpnConnectionIdError(vpn_connection_id)
+ return True
+
+ def describe_vpn_connections(self, vpn_connection_ids=None):
+ vpn_connections = []
+ for vpn_connection_id in vpn_connection_ids or []:
+ if vpn_connection_id in self.vpn_connections:
+ vpn_connections.append(self.vpn_connections[vpn_connection_id])
+ else:
+ raise InvalidVpnConnectionIdError(vpn_connection_id)
+ return vpn_connections or self.vpn_connections.values()
+
+ def get_all_vpn_connections(self, vpn_connection_ids=None, filters=None):
+ vpn_connections = self.vpn_connections.values()
+
+ if vpn_connection_ids:
+ vpn_connections = [vpn_connection for vpn_connection in vpn_connections
+ if vpn_connection.id in vpn_connection_ids]
+ if len(vpn_connections) != len(vpn_connection_ids):
+ invalid_id = list(set(vpn_connection_ids).difference(
+ set([vpn_connection.id for vpn_connection in vpn_connections])))[0]
+ raise InvalidVpnConnectionIdError(invalid_id)
+
+ return generic_filter(filters, vpn_connections)
+
+
+class NetworkAclBackend(object):
+ def __init__(self):
+ self.network_acls = {}
+ super(NetworkAclBackend, self).__init__()
+
+ def get_network_acl(self, network_acl_id):
+ network_acl = self.network_acls.get(network_acl_id, None)
+ if not network_acl:
+ raise InvalidNetworkAclIdError(network_acl_id)
+ return network_acl
+
+ def create_network_acl(self, vpc_id, default=False):
+ network_acl_id = random_network_acl_id()
+ self.get_vpc(vpc_id)
+ network_acl = NetworkAcl(self, network_acl_id, vpc_id, default)
+ self.network_acls[network_acl_id] = network_acl
+ if default:
+ self.add_default_entries(network_acl_id)
+ return network_acl
+
+ def add_default_entries(self, network_acl_id):
+ default_acl_entries = [
+ {'rule_number': 100, 'rule_action': 'allow', 'egress': 'true'},
+ {'rule_number': 32767, 'rule_action': 'deny', 'egress': 'true'},
+ {'rule_number': 100, 'rule_action': 'allow', 'egress': 'false'},
+ {'rule_number': 32767, 'rule_action': 'deny', 'egress': 'false'}
+ ]
+ for entry in default_acl_entries:
+ self.create_network_acl_entry(network_acl_id=network_acl_id, rule_number=entry['rule_number'], protocol='-1',
+ rule_action=entry['rule_action'], egress=entry['egress'], cidr_block='0.0.0.0/0',
+ icmp_code=None, icmp_type=None, port_range_from=None, port_range_to=None)
+
+ def get_all_network_acls(self, network_acl_ids=None, filters=None):
+ network_acls = self.network_acls.values()
+
+ if network_acl_ids:
+ network_acls = [network_acl for network_acl in network_acls
+ if network_acl.id in network_acl_ids]
+ if len(network_acls) != len(network_acl_ids):
+ invalid_id = list(set(network_acl_ids).difference(
+ set([network_acl.id for network_acl in network_acls])))[0]
+ raise InvalidRouteTableIdError(invalid_id)
+
+ return generic_filter(filters, network_acls)
+
+ def delete_network_acl(self, network_acl_id):
+ deleted = self.network_acls.pop(network_acl_id, None)
+ if not deleted:
+ raise InvalidNetworkAclIdError(network_acl_id)
+ return deleted
+
+ def create_network_acl_entry(self, network_acl_id, rule_number,
+ protocol, rule_action, egress, cidr_block,
+ icmp_code, icmp_type, port_range_from,
+ port_range_to):
+
+ network_acl_entry = NetworkAclEntry(self, network_acl_id, rule_number,
+ protocol, rule_action, egress,
+ cidr_block, icmp_code, icmp_type,
+ port_range_from, port_range_to)
+
+ network_acl = self.get_network_acl(network_acl_id)
+ network_acl.network_acl_entries.append(network_acl_entry)
+ return network_acl_entry
+
+ def delete_network_acl_entry(self, network_acl_id, rule_number, egress):
+ network_acl = self.get_network_acl(network_acl_id)
+ entry = next(entry for entry in network_acl.network_acl_entries
+ if entry.egress == egress and entry.rule_number == rule_number)
+ if entry is not None:
+ network_acl.network_acl_entries.remove(entry)
+ return entry
+
+ def replace_network_acl_entry(self, network_acl_id, rule_number, protocol, rule_action, egress,
+ cidr_block, icmp_code, icmp_type, port_range_from, port_range_to):
+
+ self.delete_network_acl_entry(network_acl_id, rule_number, egress)
+ network_acl_entry = self.create_network_acl_entry(network_acl_id, rule_number,
+ protocol, rule_action, egress,
+ cidr_block, icmp_code, icmp_type,
+ port_range_from, port_range_to)
+ return network_acl_entry
+
+ def replace_network_acl_association(self, association_id,
+ network_acl_id):
+
+ # lookup existing association for subnet and delete it
+ default_acl = next(value for key, value in self.network_acls.items()
+ if association_id in value.associations.keys())
+
+ subnet_id = None
+ for key, value in default_acl.associations.items():
+ if key == association_id:
+ subnet_id = default_acl.associations[key].subnet_id
+ del default_acl.associations[key]
+ break
+
+ new_assoc_id = random_network_acl_subnet_association_id()
+ association = NetworkAclAssociation(self,
+ new_assoc_id,
+ subnet_id,
+ network_acl_id)
+ new_acl = self.get_network_acl(network_acl_id)
+ new_acl.associations[new_assoc_id] = association
+ return association
+
+ def associate_default_network_acl_with_subnet(self, subnet_id, vpc_id):
+ association_id = random_network_acl_subnet_association_id()
+ acl = next(acl for acl in self.network_acls.values() if acl.default and acl.vpc_id == vpc_id)
+ acl.associations[association_id] = NetworkAclAssociation(self, association_id,
+ subnet_id, acl.id)
+
+
+class NetworkAclAssociation(object):
+ def __init__(self, ec2_backend, new_association_id,
+ subnet_id, network_acl_id):
+ self.ec2_backend = ec2_backend
+ self.id = new_association_id
+ self.new_association_id = new_association_id
+ self.subnet_id = subnet_id
+ self.network_acl_id = network_acl_id
+ super(NetworkAclAssociation, self).__init__()
+
+
+class NetworkAcl(TaggedEC2Resource):
+ def __init__(self, ec2_backend, network_acl_id, vpc_id, default=False):
+ self.ec2_backend = ec2_backend
+ self.id = network_acl_id
+ self.vpc_id = vpc_id
+ self.network_acl_entries = []
+ self.associations = {}
+ self.default = 'true' if default is True else 'false'
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "default":
+ return self.default
+ elif filter_name == "vpc-id":
+ return self.vpc_id
+ elif filter_name == "association.network-acl-id":
+ return self.id
+ elif filter_name == "association.subnet-id":
+ return [assoc.subnet_id for assoc in self.associations.values()]
+ else:
+ return super(NetworkAcl, self).get_filter_value(
+ filter_name, 'DescribeNetworkAcls')
+
+
+class NetworkAclEntry(TaggedEC2Resource):
+ def __init__(self, ec2_backend, network_acl_id, rule_number,
+ protocol, rule_action, egress, cidr_block,
+ icmp_code, icmp_type, port_range_from,
+ port_range_to):
+ self.ec2_backend = ec2_backend
+ self.network_acl_id = network_acl_id
+ self.rule_number = rule_number
+ self.protocol = protocol
+ self.rule_action = rule_action
+ self.egress = egress
+ self.cidr_block = cidr_block
+ self.icmp_code = icmp_code
+ self.icmp_type = icmp_type
+ self.port_range_from = port_range_from
+ self.port_range_to = port_range_to
+
+
+class VpnGateway(TaggedEC2Resource):
+ def __init__(self, ec2_backend, id, type):
+ self.ec2_backend = ec2_backend
+ self.id = id
+ self.type = type
+ self.attachments = {}
+ super(VpnGateway, self).__init__()
+
+ def get_filter_value(self, filter_name):
+ return super(VpnGateway, self).get_filter_value(
+ filter_name, 'DescribeVpnGateways')
+
+
+class VpnGatewayAttachment(object):
+ def __init__(self, vpc_id, state):
+ self.vpc_id = vpc_id
+ self.state = state
+ super(VpnGatewayAttachment, self).__init__()
+
+
+class VpnGatewayBackend(object):
+ def __init__(self):
+ self.vpn_gateways = {}
+ super(VpnGatewayBackend, self).__init__()
+
+ def create_vpn_gateway(self, type='ipsec.1'):
+ vpn_gateway_id = random_vpn_gateway_id()
+ vpn_gateway = VpnGateway(self, vpn_gateway_id, type)
+ self.vpn_gateways[vpn_gateway_id] = vpn_gateway
+ return vpn_gateway
+
+ def get_all_vpn_gateways(self, filters=None):
+ vpn_gateways = self.vpn_gateways.values()
+ return generic_filter(filters, vpn_gateways)
+
+ def get_vpn_gateway(self, vpn_gateway_id):
+ vpn_gateway = self.vpn_gateways.get(vpn_gateway_id, None)
+ if not vpn_gateway:
+ raise InvalidVpnGatewayIdError(vpn_gateway_id)
+ return vpn_gateway
+
+ def attach_vpn_gateway(self, vpn_gateway_id, vpc_id):
+ vpn_gateway = self.get_vpn_gateway(vpn_gateway_id)
+ self.get_vpc(vpc_id)
+ attachment = VpnGatewayAttachment(vpc_id, state='attached')
+ vpn_gateway.attachments[vpc_id] = attachment
+ return attachment
+
+ def delete_vpn_gateway(self, vpn_gateway_id):
+ deleted = self.vpn_gateways.pop(vpn_gateway_id, None)
+ if not deleted:
+ raise InvalidVpnGatewayIdError(vpn_gateway_id)
+ return deleted
+
+ def detach_vpn_gateway(self, vpn_gateway_id, vpc_id):
+ vpn_gateway = self.get_vpn_gateway(vpn_gateway_id)
+ self.get_vpc(vpc_id)
+ detached = vpn_gateway.attachments.pop(vpc_id, None)
+ if not detached:
+ raise InvalidVPCIdError(vpc_id)
+ return detached
+
+
+class CustomerGateway(TaggedEC2Resource):
+ def __init__(self, ec2_backend, id, type, ip_address, bgp_asn):
+ self.ec2_backend = ec2_backend
+ self.id = id
+ self.type = type
+ self.ip_address = ip_address
+ self.bgp_asn = bgp_asn
+ self.attachments = {}
+ super(CustomerGateway, self).__init__()
+
+ def get_filter_value(self, filter_name):
+ return super(CustomerGateway, self).get_filter_value(
+ filter_name, 'DescribeCustomerGateways')
+
+
+class CustomerGatewayBackend(object):
+ def __init__(self):
+ self.customer_gateways = {}
+ super(CustomerGatewayBackend, self).__init__()
+
+ def create_customer_gateway(self, type='ipsec.1', ip_address=None, bgp_asn=None):
+ customer_gateway_id = random_customer_gateway_id()
+ customer_gateway = CustomerGateway(
+ self, customer_gateway_id, type, ip_address, bgp_asn)
+ self.customer_gateways[customer_gateway_id] = customer_gateway
+ return customer_gateway
+
+ def get_all_customer_gateways(self, filters=None):
+ customer_gateways = self.customer_gateways.values()
+ return generic_filter(filters, customer_gateways)
+
+ def get_customer_gateway(self, customer_gateway_id):
+ customer_gateway = self.customer_gateways.get(
+ customer_gateway_id, None)
+ if not customer_gateway:
+ raise InvalidCustomerGatewayIdError(customer_gateway_id)
+ return customer_gateway
+
+ def delete_customer_gateway(self, customer_gateway_id):
+ deleted = self.customer_gateways.pop(customer_gateway_id, None)
+ if not deleted:
+ raise InvalidCustomerGatewayIdError(customer_gateway_id)
+ return deleted
+
+
+class NatGateway(object):
+ def __init__(self, backend, subnet_id, allocation_id):
+ # public properties
+ self.id = random_nat_gateway_id()
+ self.subnet_id = subnet_id
+ self.allocation_id = allocation_id
+ self.state = 'available'
+ self.private_ip = random_private_ip()
+
+ # protected properties
+ self._created_at = datetime.utcnow()
+ self._backend = backend
+ # NOTE: this is the core of NAT Gateways creation
+ self._eni = self._backend.create_network_interface(
+ backend.get_subnet(self.subnet_id), self.private_ip)
+
+ # associate allocation with ENI
+ self._backend.associate_address(
+ eni=self._eni, allocation_id=self.allocation_id)
+
+ @property
+ def vpc_id(self):
+ subnet = self._backend.get_subnet(self.subnet_id)
+ return subnet.vpc_id
+
+ @property
+ def create_time(self):
+ return iso_8601_datetime_with_milliseconds(self._created_at)
+
+ @property
+ def network_interface_id(self):
+ return self._eni.id
+
+ @property
+ def public_ip(self):
+ eips = self._backend.address_by_allocation([self.allocation_id])
+ return eips[0].public_ip
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ ec2_backend = ec2_backends[region_name]
+ nat_gateway = ec2_backend.create_nat_gateway(
+ cloudformation_json['Properties']['SubnetId'],
+ cloudformation_json['Properties']['AllocationId'],
+ )
+ return nat_gateway
+
+
+class NatGatewayBackend(object):
+ def __init__(self):
+ self.nat_gateways = {}
+ super(NatGatewayBackend, self).__init__()
+
+ def get_all_nat_gateways(self, filters):
+ return self.nat_gateways.values()
+
+ def create_nat_gateway(self, subnet_id, allocation_id):
+ nat_gateway = NatGateway(self, subnet_id, allocation_id)
+ self.nat_gateways[nat_gateway.id] = nat_gateway
+ return nat_gateway
+
+ def delete_nat_gateway(self, nat_gateway_id):
+ return self.nat_gateways.pop(nat_gateway_id)
+
+
+class EC2Backend(BaseBackend, InstanceBackend, TagBackend, EBSBackend,
+ RegionsAndZonesBackend, SecurityGroupBackend, AmiBackend,
+ VPCBackend, SubnetBackend, SubnetRouteTableAssociationBackend,
+ NetworkInterfaceBackend, VPNConnectionBackend,
+ VPCPeeringConnectionBackend,
+ RouteTableBackend, RouteBackend, InternetGatewayBackend,
+ VPCGatewayAttachmentBackend, SpotFleetBackend,
+ SpotRequestBackend, ElasticAddressBackend, KeyPairBackend,
+ DHCPOptionsSetBackend, NetworkAclBackend, VpnGatewayBackend,
+ CustomerGatewayBackend, NatGatewayBackend):
+ def __init__(self, region_name):
+ self.region_name = region_name
+ super(EC2Backend, self).__init__()
+
+ # Default VPC exists by default, which is the current behavior
+ # of EC2-VPC. See for detail:
+ #
+ # docs.aws.amazon.com/AmazonVPC/latest/UserGuide/default-vpc.html
+ #
+ if not self.vpcs:
+ vpc = self.create_vpc('172.31.0.0/16')
+ else:
+ # For now this is included for potential
+ # backward-compatibility issues
+ vpc = self.vpcs.values()[0]
+
+ # Create default subnet for each availability zone
+ ip, _ = vpc.cidr_block.split('/')
+ ip = ip.split('.')
+ ip[2] = 0
+
+ for zone in self.describe_availability_zones():
+ az_name = zone.name
+ cidr_block = '.'.join(str(i) for i in ip) + '/20'
+ self.create_subnet(vpc.id, cidr_block, availability_zone=az_name)
+ ip[2] += 16
+
+ def reset(self):
+ region_name = self.region_name
+ self.__dict__ = {}
+ self.__init__(region_name)
+
+ # Use this to generate a proper error template response when in a response
+ # handler.
+ def raise_error(self, code, message):
+ raise EC2ClientError(code, message)
+
+ def raise_not_implemented_error(self, blurb):
+ raise MotoNotImplementedError(blurb)
+
+ def do_resources_exist(self, resource_ids):
+ for resource_id in resource_ids:
+ resource_prefix = get_prefix(resource_id)
+ if resource_prefix == EC2_RESOURCE_TO_PREFIX['customer-gateway']:
+ self.get_customer_gateway(customer_gateway_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['dhcp-options']:
+ self.describe_dhcp_options(options_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['image']:
+ self.describe_images(ami_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['instance']:
+ self.get_instance_by_id(instance_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['internet-gateway']:
+ self.describe_internet_gateways(
+ internet_gateway_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['network-acl']:
+ self.get_all_network_acls()
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['network-interface']:
+ self.describe_network_interfaces(
+ filters={'network-interface-id': resource_id})
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['reserved-instance']:
+ self.raise_not_implemented_error('DescribeReservedInstances')
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['route-table']:
+ self.get_route_table(route_table_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['security-group']:
+ self.describe_security_groups(group_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['snapshot']:
+ self.get_snapshot(snapshot_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['spot-instance-request']:
+ self.describe_spot_instance_requests(
+ filters={'spot-instance-request-id': resource_id})
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['subnet']:
+ self.get_subnet(subnet_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['volume']:
+ self.get_volume(volume_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['vpc']:
+ self.get_vpc(vpc_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['vpc-peering-connection']:
+ self.get_vpc_peering_connection(vpc_pcx_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['vpn-connection']:
+ self.describe_vpn_connections(vpn_connection_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX['vpn-gateway']:
+ self.get_vpn_gateway(vpn_gateway_id=resource_id)
+ return True
+
+
+ec2_backends = {region.name: EC2Backend(region.name)
+ for region in RegionsAndZonesBackend.regions}
diff --git a/contrib/python/moto/py2/moto/ec2/resources/amis.json b/contrib/python/moto/py2/moto/ec2/resources/amis.json
new file mode 100644
index 0000000000..6e4794e224
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/resources/amis.json
@@ -0,0 +1,580 @@
+[
+ {
+ "ami_id": "ami-03cf127a",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Nano Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Nano-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-12c6146b",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2008 R2 SP1 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2008-R2_SP1-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1812c061",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Standard 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1e749f67",
+ "state": "available",
+ "public": true,
+ "owner_id": "099720109477",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Canonical, Ubuntu, 14.04 LTS, amd64 trusty image build on 2017-07-27",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20170727",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1ecc1e67",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1f12c066",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Express 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-24f3215d",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Web 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-35e92e4c",
+ "state": "available",
+ "public": true,
+ "owner_id": "013907871322",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "SUSE Linux Enterprise Server 12 SP3 (HVM, 64-bit, SSD-Backed)",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "suse-sles-12-sp3-v20170907-hvm-ssd-x86_64",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-3bf32142",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Express 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-3df32144",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Enterprise 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-56ec3e2f",
+ "state": "available",
+ "public": true,
+ "image_location": "amazon/getting-started",
+ "owner_id": "801119661308",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Express 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-61db0918",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2003 R2 SP2 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2003-R2_SP2-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-6ef02217",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Web 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-760aaa0f",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Amazon Linux AMI 2017.09.1.20171103 x86_64 HVM GP2",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "amzn-ami-hvm-2017.09.1.20171103-x86_64-gp2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-77ed3f0e",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Full Locale English with SQL Enterprise 2016 SP1 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-785db401",
+ "state": "available",
+ "public": true,
+ "owner_id": "099720109477",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Canonical, Ubuntu, 16.04 LTS, amd64 xenial image build on 2017-07-21",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20170721",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-8104a4f8",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Amazon Linux AMI 2017.09.1.20171103 x86_64 PV EBS",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "amzn-ami-pv-2017.09.1.20171103-x86_64-ebs",
+ "virtualization_type": "paravirtual",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-84ee3cfd",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Web 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-86ee3cff",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Standard 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-999844e0",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Deep Learning on Amazon Linux with MXNet, Tensorflow, Caffe, Theano, Torch, CNTK and Keras",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Deep Learning AMI Amazon Linux - 3.3_Oct2017",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-9b32e8e2",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "CUDA9 Classic Ubuntu DLAMI 1508914531",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Ubuntu CUDA9 DLAMI with MXNet/TF/Caffe2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-a9cc1ed0",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Standard 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-afee3cd6",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Web 2016 SP1 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-b7e93bce",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 with Desktop Experience Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-bb9a6bc2",
+ "state": "available",
+ "public": true,
+ "owner_id": "309956199498",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Provided by Red Hat, Inc.",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "RHEL-7.4_HVM_GA-20170808-x86_64-2-Hourly2-GP2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-bceb39c5",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 with Containers Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-Containers-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-c2ff2dbb",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 RTM 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-RTM-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-c6f321bf",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Express 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-d1cb19a8",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2008 SP2 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2008-SP2-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-dca37ea5",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Deep Learning on Ubuntu Linux with MXNet, Tensorflow, Caffe, Theano, Torch, CNTK and Keras",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Deep Learning AMI Ubuntu Linux - 2.4_Oct2017",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f0e83a89",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Enterprise 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f4cf1d8d",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Standard 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f8e54081",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "CUDA9 Classic Amazon Linux DLAMI 1508914924",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "CUDA9ClassicAmazonLinuxDLAMIwithMXNetTensorflowandCaffe2 ",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-fa7cdd89",
+ "state": "available",
+ "public": true,
+ "owner_id": "013907871322",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda",
+ "description": "SUSE Linux Enterprise Server 11 Service Pack 4 ((PV, 64-bit, SSD-Backed)",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "suse-sles-11-sp4-v20151207-pv-ssd-x86_64",
+ "virtualization_type": "paravirtual",
+ "hypervisor": "xen"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py2/moto/ec2/resources/instance_types.json b/contrib/python/moto/py2/moto/ec2/resources/instance_types.json
new file mode 100644
index 0000000000..2fa2e4e936
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/resources/instance_types.json
@@ -0,0 +1 @@
+{"m1.xlarge": {"ecu_per_vcpu": 2.0, "network_perf": 9.0, "intel_avx": "", "name": "M1 General Purpose Extra Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 1680.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m1.xlarge", "computeunits": 8.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 4.0, "memory": 15.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": false}, "i3.4xlarge": {"ecu_per_vcpu": 3.3125, "network_perf": 11.0, "intel_avx": "Yes", "name": "I3 High I/O Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 3800.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.4xlarge", "computeunits": 53.0, "ebs_throughput": 400.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 3500.0, "gpus": 0, "ipv6_support": true}, "i2.xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 7.0, "intel_avx": "", "name": "I2 Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 800.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "i2.xlarge", "computeunits": 14.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 4000.0, "vcpus": 4.0, "memory": 30.5, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": true}, "hs1.8xlarge": {"ecu_per_vcpu": 2.1875, "network_perf": 12.0, "intel_avx": "", "name": "High Storage Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 48000.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "hs1.8xlarge", "computeunits": 35.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 16.0, "memory": 117.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "t2.micro": {"ecu_per_vcpu": 0.0, "network_perf": 4.0, "intel_avx": "Yes", "name": "T2 Micro", "architecture": "32/64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.micro", "computeunits": 0.1, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 4, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 1.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "d2.4xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 9.0, "intel_avx": "Yes", "name": "D2 Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 24000.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "d2.4xlarge", "computeunits": 56.0, "ebs_throughput": 250.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "m2.xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 6.0, "intel_avx": "", "name": "M2 High Memory Extra Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 420.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m2.xlarge", "computeunits": 6.5, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 17.1, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "p2.xlarge": {"ecu_per_vcpu": 3.0, "network_perf": 9.0, "intel_avx": "Yes", "name": "General Purpose GPU Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "p2.xlarge", "computeunits": 12.0, "ebs_throughput": 93.75, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 61.0, "ebs_max_bandwidth": 750.0, "gpus": 1, "ipv6_support": true}, "i2.4xlarge": {"ecu_per_vcpu": 3.3125, "network_perf": 9.0, "intel_avx": "", "name": "I2 Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 3200.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "i2.4xlarge", "computeunits": 53.0, "ebs_throughput": 250.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "t1.micro": {"ecu_per_vcpu": 0.0, "network_perf": 0.0, "intel_avx": "", "name": "T1 Micro", "architecture": "32/64-bit", "linux_virtualization": "PV", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "t1.micro", "computeunits": 0.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 4, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 0.613, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "d2.xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 7.0, "intel_avx": "Yes", "name": "D2 Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 6000.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "d2.xlarge", "computeunits": 14.0, "ebs_throughput": 93.75, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 30.5, "ebs_max_bandwidth": 750.0, "gpus": 0, "ipv6_support": true}, "r3.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "R3 High-Memory Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 160.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "r3.2xlarge", "computeunits": 26.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 61.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "i3.8xlarge": {"ecu_per_vcpu": 3.09375, "network_perf": 13.0, "intel_avx": "Yes", "name": "I3 High I/O Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 7600.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.8xlarge", "computeunits": 99.0, "ebs_throughput": 850.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 32500.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 7000.0, "gpus": 0, "ipv6_support": true}, "c3.2xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 9.0, "intel_avx": "Yes", "name": "C3 High-CPU Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 160.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "c3.2xlarge", "computeunits": 28.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2680 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 15.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "g2.8xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 16.0, "intel_avx": "", "name": "G2 Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 240.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "g2.8xlarge", "computeunits": 104.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 60.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "t2.medium": {"ecu_per_vcpu": 0.0, "network_perf": 4.0, "intel_avx": "Yes", "name": "T2 Medium", "architecture": "32/64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.medium", "computeunits": 0.4, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 18, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 4.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "m4.xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "M4 Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.xlarge", "computeunits": 13.0, "ebs_throughput": 93.75, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 16.0, "ebs_max_bandwidth": 750.0, "gpus": 0, "ipv6_support": true}, "x1.16xlarge": {"ecu_per_vcpu": 2.7265625, "network_perf": 13.0, "intel_avx": "Yes", "name": "X1 Extra High-Memory 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 1920.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "x1.16xlarge", "computeunits": 174.5, "ebs_throughput": 875.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E7-8880 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 40000.0, "vcpus": 64.0, "memory": 976.0, "ebs_max_bandwidth": 7000.0, "gpus": 0, "ipv6_support": true}, "p2.8xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 13.0, "intel_avx": "Yes", "name": "General Purpose GPU Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "p2.8xlarge", "computeunits": 94.0, "ebs_throughput": 625.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 32500.0, "vcpus": 32.0, "memory": 488.0, "ebs_max_bandwidth": 5000.0, "gpus": 8, "ipv6_support": true}, "f1.16xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 17.0, "intel_avx": "Yes", "name": "F1 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 3760.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "f1.16xlarge", "computeunits": 188.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 400, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 8, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 75000.0, "vcpus": 64.0, "memory": 976.0, "ebs_max_bandwidth": 14000.0, "gpus": 0, "ipv6_support": true}, "r4.8xlarge": {"ecu_per_vcpu": 3.09375, "network_perf": 13.0, "intel_avx": "Yes", "name": "R4 High-Memory Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.8xlarge", "computeunits": 99.0, "ebs_throughput": 875.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 37500.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 7000.0, "gpus": 0, "ipv6_support": true}, "g3.4xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 11.0, "intel_avx": "Yes", "name": "G3 Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "g3.4xlarge", "computeunits": 47.0, "ebs_throughput": 437.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 20000.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 3500.0, "gpus": 1, "ipv6_support": true}, "cg1.4xlarge": {"ecu_per_vcpu": 2.09375, "network_perf": 12.0, "intel_avx": "", "name": "Cluster GPU Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 1680.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "cg1.4xlarge", "computeunits": 33.5, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 16.0, "memory": 22.5, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "c4.large": {"ecu_per_vcpu": 4.0, "network_perf": 7.0, "intel_avx": "Yes", "name": "C4 High-CPU Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "c4.large", "computeunits": 8.0, "ebs_throughput": 62.5, "vpc_only": true, "max_ips": 30, "physical_processor": "Intel Xeon E5-2666 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 4000.0, "vcpus": 2.0, "memory": 3.75, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": true}, "m4.16xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 17.0, "intel_avx": "Yes", "name": "M4 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.16xlarge", "computeunits": 188.0, "ebs_throughput": 1250.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 65000.0, "vcpus": 64.0, "memory": 256.0, "ebs_max_bandwidth": 10000.0, "gpus": 0, "ipv6_support": true}, "r4.4xlarge": {"ecu_per_vcpu": 3.3125, "network_perf": 11.0, "intel_avx": "Yes", "name": "R4 High-Memory Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.4xlarge", "computeunits": 53.0, "ebs_throughput": 437.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 18750.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 3500.0, "gpus": 0, "ipv6_support": true}, "r4.2xlarge": {"ecu_per_vcpu": 3.375, "network_perf": 11.0, "intel_avx": "Yes", "name": "R4 High-Memory Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.2xlarge", "computeunits": 27.0, "ebs_throughput": 218.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 12000.0, "vcpus": 8.0, "memory": 61.0, "ebs_max_bandwidth": 1750.0, "gpus": 0, "ipv6_support": true}, "c3.xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 7.0, "intel_avx": "Yes", "name": "C3 High-CPU Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 80.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "c3.xlarge", "computeunits": 14.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2680 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 4000.0, "vcpus": 4.0, "memory": 7.5, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": true}, "i3.large": {"ecu_per_vcpu": 3.5, "network_perf": 11.0, "intel_avx": "Yes", "name": "I3 High I/O Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 475.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.large", "computeunits": 7.0, "ebs_throughput": 50.0, "vpc_only": true, "max_ips": 30, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 3000.0, "vcpus": 2.0, "memory": 15.25, "ebs_max_bandwidth": 425.0, "gpus": 0, "ipv6_support": true}, "r4.xlarge": {"ecu_per_vcpu": 3.375, "network_perf": 11.0, "intel_avx": "Yes", "name": "R4 High-Memory Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.xlarge", "computeunits": 13.5, "ebs_throughput": 109.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 30.5, "ebs_max_bandwidth": 875.0, "gpus": 0, "ipv6_support": true}, "m2.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 7.0, "intel_avx": "", "name": "M2 High Memory Double Extra Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 850.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m2.2xlarge", "computeunits": 13.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 120, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 4000.0, "vcpus": 4.0, "memory": 34.2, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": false}, "m3.medium": {"ecu_per_vcpu": 3.0, "network_perf": 6.0, "intel_avx": "Yes", "name": "M3 General Purpose Medium", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 4.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "m3.medium", "computeunits": 3.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 12, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 3.75, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "r3.4xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "R3 High-Memory Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 320.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "r3.4xlarge", "computeunits": 52.0, "ebs_throughput": 250.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 122.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "t2.small": {"ecu_per_vcpu": 0.0, "network_perf": 4.0, "intel_avx": "Yes", "name": "T2 Small", "architecture": "32/64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.small", "computeunits": 0.2, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 8, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 2.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "r3.large": {"ecu_per_vcpu": 3.25, "network_perf": 6.0, "intel_avx": "Yes", "name": "R3 High-Memory Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 32.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "r3.large", "computeunits": 6.5, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 30, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 15.25, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "i3.16xlarge": {"ecu_per_vcpu": 3.125, "network_perf": 17.0, "intel_avx": "Yes", "name": "I3 High I/O 16xlarge", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 15200.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.16xlarge", "computeunits": 200.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 750, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 65000.0, "vcpus": 64.0, "memory": 488.0, "ebs_max_bandwidth": 14000.0, "gpus": 0, "ipv6_support": true}, "c3.large": {"ecu_per_vcpu": 3.5, "network_perf": 6.0, "intel_avx": "Yes", "name": "C3 High-CPU Large", "architecture": "32/64-bit", "linux_virtualization": "HVM, PV", "storage": 32.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "c3.large", "computeunits": 7.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 30, "physical_processor": "Intel Xeon E5-2680 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 3.75, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "i2.2xlarge": {"ecu_per_vcpu": 3.375, "network_perf": 7.0, "intel_avx": "", "name": "I2 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 1600.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "i2.2xlarge", "computeunits": 27.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 61.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "i3.xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 11.0, "intel_avx": "Yes", "name": "I3 High I/O Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 950.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.xlarge", "computeunits": 13.0, "ebs_throughput": 100.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 30.5, "ebs_max_bandwidth": 850.0, "gpus": 0, "ipv6_support": true}, "i2.8xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 13.0, "intel_avx": "", "name": "I2 Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 6400.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "i2.8xlarge", "computeunits": 104.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "r4.16xlarge": {"ecu_per_vcpu": 3.046875, "network_perf": 17.0, "intel_avx": "Yes", "name": "R4 High-Memory 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.16xlarge", "computeunits": 195.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 750, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 75000.0, "vcpus": 64.0, "memory": 488.0, "ebs_max_bandwidth": 14000.0, "gpus": 0, "ipv6_support": true}, "g3.8xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 13.0, "intel_avx": "Yes", "name": "G3 Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "g3.8xlarge", "computeunits": 94.0, "ebs_throughput": 875.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 40000.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 7000.0, "gpus": 2, "ipv6_support": true}, "c3.4xlarge": {"ecu_per_vcpu": 3.4375, "network_perf": 9.0, "intel_avx": "Yes", "name": "C3 High-CPU Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 320.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "c3.4xlarge", "computeunits": 55.0, "ebs_throughput": 250.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2680 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 30.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "r4.large": {"ecu_per_vcpu": 3.5, "network_perf": 11.0, "intel_avx": "Yes", "name": "R4 High-Memory Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "r4.large", "computeunits": 7.0, "ebs_throughput": 54.0, "vpc_only": true, "max_ips": 30, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 3000.0, "vcpus": 2.0, "memory": 15.25, "ebs_max_bandwidth": 437.0, "gpus": 0, "ipv6_support": true}, "f1.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 11.0, "intel_avx": "Yes", "name": "F1 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 470.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "f1.2xlarge", "computeunits": 26.0, "ebs_throughput": 200.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 1, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 12000.0, "vcpus": 8.0, "memory": 122.0, "ebs_max_bandwidth": 1700.0, "gpus": 0, "ipv6_support": true}, "m4.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "M4 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.2xlarge", "computeunits": 26.0, "ebs_throughput": 125.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 32.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "m3.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "M3 General Purpose Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 160.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "m3.2xlarge", "computeunits": 26.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 120, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 30.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": false}, "c3.8xlarge": {"ecu_per_vcpu": 3.375, "network_perf": 12.0, "intel_avx": "Yes", "name": "C3 High-CPU Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 640.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "c3.8xlarge", "computeunits": 108.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2680 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 60.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "cr1.8xlarge": {"ecu_per_vcpu": 2.75, "network_perf": 12.0, "intel_avx": "", "name": "High Memory Cluster Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 240.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "cr1.8xlarge", "computeunits": 88.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "cc2.8xlarge": {"ecu_per_vcpu": 2.75, "network_perf": 12.0, "intel_avx": "", "name": "Cluster Compute Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 3360.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "cc2.8xlarge", "computeunits": 88.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 60.5, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "m1.large": {"ecu_per_vcpu": 2.0, "network_perf": 7.0, "intel_avx": "", "name": "M1 General Purpose Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 840.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m1.large", "computeunits": 4.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 30, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 4000.0, "vcpus": 2.0, "memory": 7.5, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": false}, "r3.xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 7.0, "intel_avx": "Yes", "name": "R3 High-Memory Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 80.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "r3.xlarge", "computeunits": 13.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 4000.0, "vcpus": 4.0, "memory": 30.5, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": true}, "g3.16xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 17.0, "intel_avx": "Yes", "name": "G3 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "g3.16xlarge", "computeunits": 188.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 750, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 80000.0, "vcpus": 64.0, "memory": 488.0, "ebs_max_bandwidth": 14000.0, "gpus": 4, "ipv6_support": true}, "m1.medium": {"ecu_per_vcpu": 2.0, "network_perf": 6.0, "intel_avx": "", "name": "M1 General Purpose Medium", "architecture": "32/64-bit", "linux_virtualization": "PV", "storage": 410.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m1.medium", "computeunits": 2.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 12, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 3.75, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "i3.2xlarge": {"ecu_per_vcpu": 3.375, "network_perf": 11.0, "intel_avx": "Yes", "name": "I3 High I/O Double Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 1900.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "i3.2xlarge", "computeunits": 27.0, "ebs_throughput": 200.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 12000.0, "vcpus": 8.0, "memory": 61.0, "ebs_max_bandwidth": 1700.0, "gpus": 0, "ipv6_support": true}, "t2.xlarge": {"ecu_per_vcpu": 0.0, "network_perf": 6.0, "intel_avx": "Yes", "name": "T2 Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.xlarge", "computeunits": 0.9, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 45, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 4.0, "memory": 16.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "g2.2xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 16.0, "intel_avx": "", "name": "G2 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 60.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "g2.2xlarge", "computeunits": 26.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 15.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": false}, "c1.medium": {"ecu_per_vcpu": 2.5, "network_perf": 6.0, "intel_avx": "", "name": "C1 High-CPU Medium", "architecture": "32/64-bit", "linux_virtualization": "PV", "storage": 350.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "c1.medium", "computeunits": 5.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 12, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 1.7, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "t2.large": {"ecu_per_vcpu": 0.0, "network_perf": 4.0, "intel_avx": "Yes", "name": "T2 Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.large", "computeunits": 0.6, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 36, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 8.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "d2.2xlarge": {"ecu_per_vcpu": 3.5, "network_perf": 9.0, "intel_avx": "Yes", "name": "D2 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 12000.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "d2.2xlarge", "computeunits": 28.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 61.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "c4.8xlarge": {"ecu_per_vcpu": 3.66666666667, "network_perf": 13.0, "intel_avx": "Yes", "name": "C4 High-CPU Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "c4.8xlarge", "computeunits": 132.0, "ebs_throughput": 500.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2666 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 32000.0, "vcpus": 36.0, "memory": 60.0, "ebs_max_bandwidth": 4000.0, "gpus": 0, "ipv6_support": true}, "c4.2xlarge": {"ecu_per_vcpu": 3.875, "network_perf": 9.0, "intel_avx": "Yes", "name": "C4 High-CPU Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "c4.2xlarge", "computeunits": 31.0, "ebs_throughput": 125.0, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2666 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 15.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": true}, "x1e.32xlarge": {"ecu_per_vcpu": 2.65625, "network_perf": 17.0, "intel_avx": "Yes", "name": "X1E 32xlarge", "architecture": "64-bit", "linux_virtualization": "Unknown", "storage": 3840.0, "placement_group_support": false, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "x1e.32xlarge", "computeunits": 340.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E7-8880 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 80000.0, "vcpus": 128.0, "memory": 3904.0, "ebs_max_bandwidth": 14000.0, "gpus": 0, "ipv6_support": false}, "m4.10xlarge": {"ecu_per_vcpu": 3.1125, "network_perf": 13.0, "intel_avx": "Yes", "name": "M4 Deca Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.10xlarge", "computeunits": 124.5, "ebs_throughput": 500.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 32000.0, "vcpus": 40.0, "memory": 160.0, "ebs_max_bandwidth": 4000.0, "gpus": 0, "ipv6_support": true}, "t2.2xlarge": {"ecu_per_vcpu": 0.0, "network_perf": 6.0, "intel_avx": "Yes", "name": "T2 Double Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.2xlarge", "computeunits": 1.35, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 45, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 8.0, "memory": 32.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "m4.4xlarge": {"ecu_per_vcpu": 3.34375, "network_perf": 9.0, "intel_avx": "Yes", "name": "M4 Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.4xlarge", "computeunits": 53.5, "ebs_throughput": 250.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 64.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "t2.nano": {"ecu_per_vcpu": 0.0, "network_perf": 2.0, "intel_avx": "Yes", "name": "T2 Nano", "architecture": "32/64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "t2.nano", "computeunits": 0.05, "ebs_throughput": 0.0, "vpc_only": true, "max_ips": 4, "physical_processor": "Intel Xeon family", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 0.5, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "d2.8xlarge": {"ecu_per_vcpu": 3.22222222222, "network_perf": 13.0, "intel_avx": "Yes", "name": "D2 Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 48000.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "d2.8xlarge", "computeunits": 116.0, "ebs_throughput": 500.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 32000.0, "vcpus": 36.0, "memory": 244.0, "ebs_max_bandwidth": 4000.0, "gpus": 0, "ipv6_support": true}, "m3.large": {"ecu_per_vcpu": 3.25, "network_perf": 6.0, "intel_avx": "Yes", "name": "M3 General Purpose Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 32.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "m3.large", "computeunits": 6.5, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 30, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 2.0, "memory": 7.5, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "m2.4xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "", "name": "M2 High Memory Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 1680.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m2.4xlarge", "computeunits": 26.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 68.4, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": false}, "m1.small": {"ecu_per_vcpu": 1.0, "network_perf": 2.0, "intel_avx": "", "name": "M1 General Purpose Small", "architecture": "32/64-bit", "linux_virtualization": "PV", "storage": 160.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "m1.small", "computeunits": 1.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 8, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 1.0, "memory": 1.7, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "c1.xlarge": {"ecu_per_vcpu": 2.5, "network_perf": 9.0, "intel_avx": "", "name": "C1 High-CPU Extra Large", "architecture": "64-bit", "linux_virtualization": "PV", "storage": 1680.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "c1.xlarge", "computeunits": 20.0, "ebs_throughput": 125.0, "vpc_only": false, "max_ips": 60, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 8000.0, "vcpus": 8.0, "memory": 7.0, "ebs_max_bandwidth": 1000.0, "gpus": 0, "ipv6_support": false}, "x1.32xlarge": {"ecu_per_vcpu": 2.7265625, "network_perf": 17.0, "intel_avx": "Yes", "name": "X1 Extra High-Memory 32xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 3840.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "x1.32xlarge", "computeunits": 349.0, "ebs_throughput": 1750.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E7-8880 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 80000.0, "vcpus": 128.0, "memory": 1952.0, "ebs_max_bandwidth": 14000.0, "gpus": 0, "ipv6_support": true}, "r3.8xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 12.0, "intel_avx": "Yes", "name": "R3 High-Memory Eight Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 640.0, "placement_group_support": true, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "r3.8xlarge", "computeunits": 104.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 0.0, "vcpus": 32.0, "memory": 244.0, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": true}, "m4.large": {"ecu_per_vcpu": 3.25, "network_perf": 7.0, "intel_avx": "Yes", "name": "M4 Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "m4.large", "computeunits": 6.5, "ebs_throughput": 56.25, "vpc_only": true, "max_ips": 20, "physical_processor": "Intel Xeon E5-2676 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 3600.0, "vcpus": 2.0, "memory": 8.0, "ebs_max_bandwidth": 450.0, "gpus": 0, "ipv6_support": true}, "p2.16xlarge": {"ecu_per_vcpu": 2.9375, "network_perf": 17.0, "intel_avx": "Yes", "name": "General Purpose GPU 16xlarge", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "p2.16xlarge", "computeunits": 188.0, "ebs_throughput": 1250.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2686 v4", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 65000.0, "vcpus": 64.0, "memory": 732.0, "ebs_max_bandwidth": 10000.0, "gpus": 16, "ipv6_support": true}, "hi1.4xlarge": {"ecu_per_vcpu": 2.1875, "network_perf": 12.0, "intel_avx": "", "name": "HI1. High I/O Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 2048.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "", "apiname": "hi1.4xlarge", "computeunits": 35.0, "ebs_throughput": 0.0, "vpc_only": false, "max_ips": 240, "physical_processor": "", "fpga": 0, "intel_turbo": "", "enhanced_networking": false, "ebs_iops": 0.0, "vcpus": 16.0, "memory": 60.5, "ebs_max_bandwidth": 0.0, "gpus": 0, "ipv6_support": false}, "c4.4xlarge": {"ecu_per_vcpu": 3.875, "network_perf": 9.0, "intel_avx": "Yes", "name": "C4 High-CPU Quadruple Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "c4.4xlarge", "computeunits": 62.0, "ebs_throughput": 250.0, "vpc_only": true, "max_ips": 240, "physical_processor": "Intel Xeon E5-2666 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 16000.0, "vcpus": 16.0, "memory": 30.0, "ebs_max_bandwidth": 2000.0, "gpus": 0, "ipv6_support": true}, "c4.xlarge": {"ecu_per_vcpu": 4.0, "network_perf": 9.0, "intel_avx": "Yes", "name": "C4 High-CPU Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM", "storage": 0.0, "placement_group_support": true, "intel_avx2": "Yes", "clock_speed_ghz": "Yes", "apiname": "c4.xlarge", "computeunits": 16.0, "ebs_throughput": 93.75, "vpc_only": true, "max_ips": 60, "physical_processor": "Intel Xeon E5-2666 v3", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": true, "ebs_iops": 6000.0, "vcpus": 4.0, "memory": 7.5, "ebs_max_bandwidth": 750.0, "gpus": 0, "ipv6_support": true}, "m3.xlarge": {"ecu_per_vcpu": 3.25, "network_perf": 9.0, "intel_avx": "Yes", "name": "M3 General Purpose Extra Large", "architecture": "64-bit", "linux_virtualization": "HVM, PV", "storage": 80.0, "placement_group_support": false, "intel_avx2": "", "clock_speed_ghz": "Yes", "apiname": "m3.xlarge", "computeunits": 13.0, "ebs_throughput": 62.5, "vpc_only": false, "max_ips": 60, "physical_processor": "Intel Xeon E5-2670 v2", "fpga": 0, "intel_turbo": "Yes", "enhanced_networking": false, "ebs_iops": 4000.0, "vcpus": 4.0, "memory": 15.0, "ebs_max_bandwidth": 500.0, "gpus": 0, "ipv6_support": false}} \ No newline at end of file
diff --git a/contrib/python/moto/py2/moto/ec2/responses/__init__.py b/contrib/python/moto/py2/moto/ec2/responses/__init__.py
new file mode 100644
index 0000000000..1222a7ef89
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/__init__.py
@@ -0,0 +1,79 @@
+from __future__ import unicode_literals
+
+from .account_attributes import AccountAttributes
+from .amazon_dev_pay import AmazonDevPay
+from .amis import AmisResponse
+from .availability_zones_and_regions import AvailabilityZonesAndRegions
+from .customer_gateways import CustomerGateways
+from .dhcp_options import DHCPOptions
+from .elastic_block_store import ElasticBlockStore
+from .elastic_ip_addresses import ElasticIPAddresses
+from .elastic_network_interfaces import ElasticNetworkInterfaces
+from .general import General
+from .instances import InstanceResponse
+from .internet_gateways import InternetGateways
+from .ip_addresses import IPAddresses
+from .key_pairs import KeyPairs
+from .monitoring import Monitoring
+from .network_acls import NetworkACLs
+from .placement_groups import PlacementGroups
+from .reserved_instances import ReservedInstances
+from .route_tables import RouteTables
+from .security_groups import SecurityGroups
+from .spot_fleets import SpotFleets
+from .spot_instances import SpotInstances
+from .subnets import Subnets
+from .tags import TagResponse
+from .virtual_private_gateways import VirtualPrivateGateways
+from .vm_export import VMExport
+from .vm_import import VMImport
+from .vpcs import VPCs
+from .vpc_peering_connections import VPCPeeringConnections
+from .vpn_connections import VPNConnections
+from .windows import Windows
+from .nat_gateways import NatGateways
+
+
+class EC2Response(
+ AccountAttributes,
+ AmazonDevPay,
+ AmisResponse,
+ AvailabilityZonesAndRegions,
+ CustomerGateways,
+ DHCPOptions,
+ ElasticBlockStore,
+ ElasticIPAddresses,
+ ElasticNetworkInterfaces,
+ General,
+ InstanceResponse,
+ InternetGateways,
+ IPAddresses,
+ KeyPairs,
+ Monitoring,
+ NetworkACLs,
+ PlacementGroups,
+ ReservedInstances,
+ RouteTables,
+ SecurityGroups,
+ SpotFleets,
+ SpotInstances,
+ Subnets,
+ TagResponse,
+ VirtualPrivateGateways,
+ VMExport,
+ VMImport,
+ VPCs,
+ VPCPeeringConnections,
+ VPNConnections,
+ Windows,
+ NatGateways,
+):
+
+ @property
+ def ec2_backend(self):
+ from moto.ec2.models import ec2_backends
+ return ec2_backends[self.region]
+
+ @property
+ def should_autoescape(self):
+ return True
diff --git a/contrib/python/moto/py2/moto/ec2/responses/account_attributes.py b/contrib/python/moto/py2/moto/ec2/responses/account_attributes.py
new file mode 100644
index 0000000000..8a5b9a4b0a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/account_attributes.py
@@ -0,0 +1,69 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class AccountAttributes(BaseResponse):
+
+ def describe_account_attributes(self):
+ template = self.response_template(DESCRIBE_ACCOUNT_ATTRIBUTES_RESULT)
+ return template.render()
+
+
+DESCRIBE_ACCOUNT_ATTRIBUTES_RESULT = u"""
+<DescribeAccountAttributesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <accountAttributeSet>
+ <item>
+ <attributeName>vpc-max-security-groups-per-interface</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>max-instances</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>20</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>supported-platforms</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>EC2</attributeValue>
+ </item>
+ <item>
+ <attributeValue>VPC</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>default-vpc</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>none</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>max-elastic-ips</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>vpc-max-elastic-ips</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ </accountAttributeSet>
+</DescribeAccountAttributesResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/amazon_dev_pay.py b/contrib/python/moto/py2/moto/ec2/responses/amazon_dev_pay.py
new file mode 100644
index 0000000000..14df3f0042
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/amazon_dev_pay.py
@@ -0,0 +1,9 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class AmazonDevPay(BaseResponse):
+
+ def confirm_product_instance(self):
+ raise NotImplementedError(
+ 'AmazonDevPay.confirm_product_instance is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/amis.py b/contrib/python/moto/py2/moto/ec2/responses/amis.py
new file mode 100755
index 0000000000..17e1e228d0
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/amis.py
@@ -0,0 +1,185 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class AmisResponse(BaseResponse):
+
+ def create_image(self):
+ name = self.querystring.get('Name')[0]
+ description = self._get_param('Description', if_none='')
+ instance_id = self._get_param('InstanceId')
+ if self.is_not_dryrun('CreateImage'):
+ image = self.ec2_backend.create_image(
+ instance_id, name, description, context=self)
+ template = self.response_template(CREATE_IMAGE_RESPONSE)
+ return template.render(image=image)
+
+ def copy_image(self):
+ source_image_id = self._get_param('SourceImageId')
+ source_region = self._get_param('SourceRegion')
+ name = self._get_param('Name')
+ description = self._get_param('Description')
+ if self.is_not_dryrun('CopyImage'):
+ image = self.ec2_backend.copy_image(
+ source_image_id, source_region, name, description)
+ template = self.response_template(COPY_IMAGE_RESPONSE)
+ return template.render(image=image)
+
+ def deregister_image(self):
+ ami_id = self._get_param('ImageId')
+ if self.is_not_dryrun('DeregisterImage'):
+ success = self.ec2_backend.deregister_image(ami_id)
+ template = self.response_template(DEREGISTER_IMAGE_RESPONSE)
+ return template.render(success=str(success).lower())
+
+ def describe_images(self):
+ ami_ids = self._get_multi_param('ImageId')
+ filters = filters_from_querystring(self.querystring)
+ owners = self._get_multi_param('Owner')
+ exec_users = self._get_multi_param('ExecutableBy')
+ images = self.ec2_backend.describe_images(
+ ami_ids=ami_ids, filters=filters, exec_users=exec_users,
+ owners=owners, context=self)
+ template = self.response_template(DESCRIBE_IMAGES_RESPONSE)
+ return template.render(images=images)
+
+ def describe_image_attribute(self):
+ ami_id = self._get_param('ImageId')
+ groups = self.ec2_backend.get_launch_permission_groups(ami_id)
+ users = self.ec2_backend.get_launch_permission_users(ami_id)
+ template = self.response_template(DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE)
+ return template.render(ami_id=ami_id, groups=groups, users=users)
+
+ def modify_image_attribute(self):
+ ami_id = self._get_param('ImageId')
+ operation_type = self._get_param('OperationType')
+ group = self._get_param('UserGroup.1')
+ user_ids = self._get_multi_param('UserId')
+ if self.is_not_dryrun('ModifyImageAttribute'):
+ if (operation_type == 'add'):
+ self.ec2_backend.add_launch_permission(
+ ami_id, user_ids=user_ids, group=group)
+ elif (operation_type == 'remove'):
+ self.ec2_backend.remove_launch_permission(
+ ami_id, user_ids=user_ids, group=group)
+ return MODIFY_IMAGE_ATTRIBUTE_RESPONSE
+
+ def register_image(self):
+ if self.is_not_dryrun('RegisterImage'):
+ raise NotImplementedError(
+ 'AMIs.register_image is not yet implemented')
+
+ def reset_image_attribute(self):
+ if self.is_not_dryrun('ResetImageAttribute'):
+ raise NotImplementedError(
+ 'AMIs.reset_image_attribute is not yet implemented')
+
+
+CREATE_IMAGE_RESPONSE = """<CreateImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+</CreateImageResponse>"""
+
+COPY_IMAGE_RESPONSE = """<CopyImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>60bc441d-fa2c-494d-b155-5d6a3EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+</CopyImageResponse>"""
+
+# TODO almost all of these params should actually be templated based on
+# the ec2 image
+DESCRIBE_IMAGES_RESPONSE = """<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imagesSet>
+ {% for image in images %}
+ <item>
+ <imageId>{{ image.id }}</imageId>
+ <imageLocation>{{ image.image_location }}</imageLocation>
+ <imageState>{{ image.state }}</imageState>
+ <imageOwnerId>{{ image.owner_id }}</imageOwnerId>
+ <isPublic>{{ image.is_public_string }}</isPublic>
+ <architecture>{{ image.architecture }}</architecture>
+ <imageType>{{ image.image_type }}</imageType>
+ <kernelId>{{ image.kernel_id }}</kernelId>
+ <ramdiskId>ari-1a2b3c4d</ramdiskId>
+ <imageOwnerAlias>amazon</imageOwnerAlias>
+ <creationDate>{{ image.creation_date }}</creationDate>
+ <name>{{ image.name }}</name>
+ {% if image.platform %}
+ <platform>{{ image.platform }}</platform>
+ {% endif %}
+ <description>{{ image.description }}</description>
+ <rootDeviceType>{{ image.root_device_type }}</rootDeviceType>
+ <rootDeviceName>{{ image.root_device_name }}</rootDeviceName>
+ <blockDeviceMapping>
+ <item>
+ <deviceName>{{ image.root_device_name }}</deviceName>
+ <ebs>
+ <snapshotId>{{ image.ebs_snapshot.id }}</snapshotId>
+ <volumeSize>15</volumeSize>
+ <deleteOnTermination>false</deleteOnTermination>
+ <volumeType>{{ image.root_device_type }}</volumeType>
+ </ebs>
+ </item>
+ </blockDeviceMapping>
+ <virtualizationType>{{ image.virtualization_type }}</virtualizationType>
+ <tagSet>
+ {% for tag in image.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <hypervisor>xen</hypervisor>
+ </item>
+ {% endfor %}
+ </imagesSet>
+</DescribeImagesResponse>"""
+
+DESCRIBE_IMAGE_RESPONSE = """<DescribeImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+ <{{ key }}>
+ <value>{{ value }}</value>
+ </{{key }}>
+</DescribeImageAttributeResponse>"""
+
+DEREGISTER_IMAGE_RESPONSE = """<DeregisterImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>{{ success }}</return>
+</DeregisterImageResponse>"""
+
+DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE = """
+<DescribeImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ ami_id }}</imageId>
+ {% if not groups and not users %}
+ <launchPermission/>
+ {% else %}
+ <launchPermission>
+ {% if groups %}
+ {% for group in groups %}
+ <item>
+ <group>{{ group }}</group>
+ </item>
+ {% endfor %}
+ {% endif %}
+ {% if users %}
+ {% for user in users %}
+ <item>
+ <userId>{{ user }}</userId>
+ </item>
+ {% endfor %}
+ {% endif %}
+ </launchPermission>
+ {% endif %}
+</DescribeImageAttributeResponse>"""
+
+MODIFY_IMAGE_ATTRIBUTE_RESPONSE = """
+<ModifyImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <return>true</return>
+</ModifyImageAttributeResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/availability_zones_and_regions.py b/contrib/python/moto/py2/moto/ec2/responses/availability_zones_and_regions.py
new file mode 100644
index 0000000000..a6e35a89c2
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/availability_zones_and_regions.py
@@ -0,0 +1,43 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class AvailabilityZonesAndRegions(BaseResponse):
+
+ def describe_availability_zones(self):
+ zones = self.ec2_backend.describe_availability_zones()
+ template = self.response_template(DESCRIBE_ZONES_RESPONSE)
+ return template.render(zones=zones)
+
+ def describe_regions(self):
+ region_names = self._get_multi_param('RegionName')
+ regions = self.ec2_backend.describe_regions(region_names)
+ template = self.response_template(DESCRIBE_REGIONS_RESPONSE)
+ return template.render(regions=regions)
+
+
+DESCRIBE_REGIONS_RESPONSE = """<DescribeRegionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <regionInfo>
+ {% for region in regions %}
+ <item>
+ <regionName>{{ region.name }}</regionName>
+ <regionEndpoint>{{ region.endpoint }}</regionEndpoint>
+ </item>
+ {% endfor %}
+ </regionInfo>
+</DescribeRegionsResponse>"""
+
+DESCRIBE_ZONES_RESPONSE = """<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <availabilityZoneInfo>
+ {% for zone in zones %}
+ <item>
+ <zoneName>{{ zone.name }}</zoneName>
+ <zoneState>available</zoneState>
+ <regionName>{{ zone.region_name }}</regionName>
+ <messageSet/>
+ </item>
+ {% endfor %}
+ </availabilityZoneInfo>
+</DescribeAvailabilityZonesResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/customer_gateways.py b/contrib/python/moto/py2/moto/ec2/responses/customer_gateways.py
new file mode 100644
index 0000000000..866b93045a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/customer_gateways.py
@@ -0,0 +1,84 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class CustomerGateways(BaseResponse):
+
+ def create_customer_gateway(self):
+ # raise NotImplementedError('CustomerGateways(AmazonVPC).create_customer_gateway is not yet implemented')
+ type = self._get_param('Type')
+ ip_address = self._get_param('IpAddress')
+ bgp_asn = self._get_param('BgpAsn')
+ customer_gateway = self.ec2_backend.create_customer_gateway(
+ type, ip_address=ip_address, bgp_asn=bgp_asn)
+ template = self.response_template(CREATE_CUSTOMER_GATEWAY_RESPONSE)
+ return template.render(customer_gateway=customer_gateway)
+
+ def delete_customer_gateway(self):
+ customer_gateway_id = self._get_param('CustomerGatewayId')
+ delete_status = self.ec2_backend.delete_customer_gateway(
+ customer_gateway_id)
+ template = self.response_template(DELETE_CUSTOMER_GATEWAY_RESPONSE)
+ return template.render(customer_gateway=delete_status)
+
+ def describe_customer_gateways(self):
+ filters = filters_from_querystring(self.querystring)
+ customer_gateways = self.ec2_backend.get_all_customer_gateways(filters)
+ template = self.response_template(DESCRIBE_CUSTOMER_GATEWAYS_RESPONSE)
+ return template.render(customer_gateways=customer_gateways)
+
+
+CREATE_CUSTOMER_GATEWAY_RESPONSE = """
+<CreateCustomerGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <customerGateway>
+ <customerGatewayId>{{ customer_gateway.id }}</customerGatewayId>
+ <state>pending</state>
+ <type>{{ customer_gateway.type }}</type>
+ <ipAddress>{{ customer_gateway.ip_address }}</ipAddress>
+ <bgpAsn>{{ customer_gateway.bgp_asn }}</bgpAsn>
+ <tagSet>
+ {% for tag in customer_gateway.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </customerGateway>
+</CreateCustomerGatewayResponse>"""
+
+DELETE_CUSTOMER_GATEWAY_RESPONSE = """
+<DeleteCustomerGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>{{ delete_status }}</return>
+</DeleteCustomerGatewayResponse>"""
+
+DESCRIBE_CUSTOMER_GATEWAYS_RESPONSE = """
+<DescribeCustomerGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2014-10- 01/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <customerGatewaySet>
+ {% for customer_gateway in customer_gateways %}
+ <item>
+ <customerGatewayId>{{ customer_gateway.id }}</customerGatewayId>
+ <state>{{ customer_gateway.state }}</state>
+ <type>available</type>
+ <ipAddress>{{ customer_gateway.ip_address }}</ipAddress>
+ <bgpAsn>{{ customer_gateway.bgp_asn }}</bgpAsn>
+ <tagSet>
+ {% for tag in customer_gateway.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </customerGatewaySet>
+</DescribeCustomerGatewaysResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/dhcp_options.py b/contrib/python/moto/py2/moto/ec2/responses/dhcp_options.py
new file mode 100644
index 0000000000..1f740d14b4
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/dhcp_options.py
@@ -0,0 +1,147 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import (
+ filters_from_querystring,
+ dhcp_configuration_from_querystring)
+
+
+class DHCPOptions(BaseResponse):
+
+ def associate_dhcp_options(self):
+ dhcp_opt_id = self._get_param('DhcpOptionsId')
+ vpc_id = self._get_param('VpcId')
+
+ dhcp_opt = self.ec2_backend.describe_dhcp_options([dhcp_opt_id])[0]
+ vpc = self.ec2_backend.get_vpc(vpc_id)
+
+ self.ec2_backend.associate_dhcp_options(dhcp_opt, vpc)
+
+ template = self.response_template(ASSOCIATE_DHCP_OPTIONS_RESPONSE)
+ return template.render()
+
+ def create_dhcp_options(self):
+ dhcp_config = dhcp_configuration_from_querystring(self.querystring)
+
+ # TODO validate we only got the options we know about
+
+ domain_name_servers = dhcp_config.get("domain-name-servers", None)
+ domain_name = dhcp_config.get("domain-name", None)
+ ntp_servers = dhcp_config.get("ntp-servers", None)
+ netbios_name_servers = dhcp_config.get("netbios-name-servers", None)
+ netbios_node_type = dhcp_config.get("netbios-node-type", None)
+
+ dhcp_options_set = self.ec2_backend.create_dhcp_options(
+ domain_name_servers=domain_name_servers,
+ domain_name=domain_name,
+ ntp_servers=ntp_servers,
+ netbios_name_servers=netbios_name_servers,
+ netbios_node_type=netbios_node_type
+ )
+
+ template = self.response_template(CREATE_DHCP_OPTIONS_RESPONSE)
+ return template.render(dhcp_options_set=dhcp_options_set)
+
+ def delete_dhcp_options(self):
+ dhcp_opt_id = self._get_param('DhcpOptionsId')
+ delete_status = self.ec2_backend.delete_dhcp_options_set(dhcp_opt_id)
+ template = self.response_template(DELETE_DHCP_OPTIONS_RESPONSE)
+ return template.render(delete_status=delete_status)
+
+ def describe_dhcp_options(self):
+ dhcp_opt_ids = self._get_multi_param("DhcpOptionsId")
+ filters = filters_from_querystring(self.querystring)
+ dhcp_opts = self.ec2_backend.get_all_dhcp_options(
+ dhcp_opt_ids, filters)
+ template = self.response_template(DESCRIBE_DHCP_OPTIONS_RESPONSE)
+ return template.render(dhcp_options=dhcp_opts)
+
+
+CREATE_DHCP_OPTIONS_RESPONSE = u"""
+<CreateDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <dhcpOptions>
+ <dhcpOptionsId>{{ dhcp_options_set.id }}</dhcpOptionsId>
+ <dhcpConfigurationSet>
+ {% for key, values in dhcp_options_set.options.items() %}
+ {{ values }}
+ {% if values %}
+ <item>
+ <key>{{key}}</key>
+ <valueSet>
+ {% for value in values %}
+ <item>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </valueSet>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </dhcpConfigurationSet>
+ <tagSet>
+ {% for tag in dhcp_options_set.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </dhcpOptions>
+</CreateDhcpOptionsResponse>
+"""
+
+DELETE_DHCP_OPTIONS_RESPONSE = u"""
+<DeleteDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>{{delete_status}}</return>
+</DeleteDhcpOptionsResponse>
+"""
+
+DESCRIBE_DHCP_OPTIONS_RESPONSE = u"""
+<DescribeDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <dhcpOptionsSet>
+ {% for dhcp_options_set in dhcp_options %}
+ <item>
+ <dhcpOptionsId>{{ dhcp_options_set.id }}</dhcpOptionsId>
+ <dhcpConfigurationSet>
+ {% for key, values in dhcp_options_set.options.items() %}
+ {{ values }}
+ {% if values %}
+ <item>
+ <key>{{ key }}</key>
+ <valueSet>
+ {% for value in values %}
+ <item>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </valueSet>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </dhcpConfigurationSet>
+ <tagSet>
+ {% for tag in dhcp_options_set.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </dhcpOptionsSet>
+</DescribeDhcpOptionsResponse>
+"""
+
+ASSOCIATE_DHCP_OPTIONS_RESPONSE = u"""
+<AssociateDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+<requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+<return>true</return>
+</AssociateDhcpOptionsResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/elastic_block_store.py b/contrib/python/moto/py2/moto/ec2/responses/elastic_block_store.py
new file mode 100644
index 0000000000..acd37b2832
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/elastic_block_store.py
@@ -0,0 +1,323 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class ElasticBlockStore(BaseResponse):
+
+ def attach_volume(self):
+ volume_id = self._get_param('VolumeId')
+ instance_id = self._get_param('InstanceId')
+ device_path = self._get_param('Device')
+ if self.is_not_dryrun('AttachVolume'):
+ attachment = self.ec2_backend.attach_volume(
+ volume_id, instance_id, device_path)
+ template = self.response_template(ATTACHED_VOLUME_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def copy_snapshot(self):
+ source_snapshot_id = self._get_param('SourceSnapshotId')
+ source_region = self._get_param('SourceRegion')
+ description = self._get_param('Description')
+ if self.is_not_dryrun('CopySnapshot'):
+ snapshot = self.ec2_backend.copy_snapshot(
+ source_snapshot_id, source_region, description)
+ template = self.response_template(COPY_SNAPSHOT_RESPONSE)
+ return template.render(snapshot=snapshot)
+
+ def create_snapshot(self):
+ volume_id = self._get_param('VolumeId')
+ description = self._get_param('Description')
+ tags = self._parse_tag_specification("TagSpecification")
+ snapshot_tags = tags.get('snapshot', {})
+ if self.is_not_dryrun('CreateSnapshot'):
+ snapshot = self.ec2_backend.create_snapshot(volume_id, description)
+ snapshot.add_tags(snapshot_tags)
+ template = self.response_template(CREATE_SNAPSHOT_RESPONSE)
+ return template.render(snapshot=snapshot)
+
+ def create_volume(self):
+ size = self._get_param('Size')
+ zone = self._get_param('AvailabilityZone')
+ snapshot_id = self._get_param('SnapshotId')
+ tags = self._parse_tag_specification("TagSpecification")
+ volume_tags = tags.get('volume', {})
+ encrypted = self._get_param('Encrypted', if_none=False)
+ if self.is_not_dryrun('CreateVolume'):
+ volume = self.ec2_backend.create_volume(
+ size, zone, snapshot_id, encrypted)
+ volume.add_tags(volume_tags)
+ template = self.response_template(CREATE_VOLUME_RESPONSE)
+ return template.render(volume=volume)
+
+ def delete_snapshot(self):
+ snapshot_id = self._get_param('SnapshotId')
+ if self.is_not_dryrun('DeleteSnapshot'):
+ self.ec2_backend.delete_snapshot(snapshot_id)
+ return DELETE_SNAPSHOT_RESPONSE
+
+ def delete_volume(self):
+ volume_id = self._get_param('VolumeId')
+ if self.is_not_dryrun('DeleteVolume'):
+ self.ec2_backend.delete_volume(volume_id)
+ return DELETE_VOLUME_RESPONSE
+
+ def describe_snapshots(self):
+ filters = filters_from_querystring(self.querystring)
+ snapshot_ids = self._get_multi_param('SnapshotId')
+ snapshots = self.ec2_backend.describe_snapshots(snapshot_ids=snapshot_ids, filters=filters)
+ template = self.response_template(DESCRIBE_SNAPSHOTS_RESPONSE)
+ return template.render(snapshots=snapshots)
+
+ def describe_volumes(self):
+ filters = filters_from_querystring(self.querystring)
+ volume_ids = self._get_multi_param('VolumeId')
+ volumes = self.ec2_backend.describe_volumes(volume_ids=volume_ids, filters=filters)
+ template = self.response_template(DESCRIBE_VOLUMES_RESPONSE)
+ return template.render(volumes=volumes)
+
+ def describe_volume_attribute(self):
+ raise NotImplementedError(
+ 'ElasticBlockStore.describe_volume_attribute is not yet implemented')
+
+ def describe_volume_status(self):
+ raise NotImplementedError(
+ 'ElasticBlockStore.describe_volume_status is not yet implemented')
+
+ def detach_volume(self):
+ volume_id = self._get_param('VolumeId')
+ instance_id = self._get_param('InstanceId')
+ device_path = self._get_param('Device')
+ if self.is_not_dryrun('DetachVolume'):
+ attachment = self.ec2_backend.detach_volume(
+ volume_id, instance_id, device_path)
+ template = self.response_template(DETATCH_VOLUME_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def enable_volume_io(self):
+ if self.is_not_dryrun('EnableVolumeIO'):
+ raise NotImplementedError(
+ 'ElasticBlockStore.enable_volume_io is not yet implemented')
+
+ def import_volume(self):
+ if self.is_not_dryrun('ImportVolume'):
+ raise NotImplementedError(
+ 'ElasticBlockStore.import_volume is not yet implemented')
+
+ def describe_snapshot_attribute(self):
+ snapshot_id = self._get_param('SnapshotId')
+ groups = self.ec2_backend.get_create_volume_permission_groups(
+ snapshot_id)
+ template = self.response_template(
+ DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE)
+ return template.render(snapshot_id=snapshot_id, groups=groups)
+
+ def modify_snapshot_attribute(self):
+ snapshot_id = self._get_param('SnapshotId')
+ operation_type = self._get_param('OperationType')
+ group = self._get_param('UserGroup.1')
+ user_id = self._get_param('UserId.1')
+ if self.is_not_dryrun('ModifySnapshotAttribute'):
+ if (operation_type == 'add'):
+ self.ec2_backend.add_create_volume_permission(
+ snapshot_id, user_id=user_id, group=group)
+ elif (operation_type == 'remove'):
+ self.ec2_backend.remove_create_volume_permission(
+ snapshot_id, user_id=user_id, group=group)
+ return MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE
+
+ def modify_volume_attribute(self):
+ if self.is_not_dryrun('ModifyVolumeAttribute'):
+ raise NotImplementedError(
+ 'ElasticBlockStore.modify_volume_attribute is not yet implemented')
+
+ def reset_snapshot_attribute(self):
+ if self.is_not_dryrun('ResetSnapshotAttribute'):
+ raise NotImplementedError(
+ 'ElasticBlockStore.reset_snapshot_attribute is not yet implemented')
+
+
+CREATE_VOLUME_RESPONSE = """<CreateVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ volume.id }}</volumeId>
+ <size>{{ volume.size }}</size>
+ {% if volume.snapshot_id %}
+ <snapshotId>{{ volume.snapshot_id }}</snapshotId>
+ {% else %}
+ <snapshotId/>
+ {% endif %}
+ <encrypted>{{ volume.encrypted }}</encrypted>
+ <availabilityZone>{{ volume.zone.name }}</availabilityZone>
+ <status>creating</status>
+ <createTime>{{ volume.create_time}}</createTime>
+ {% if volume.get_tags() %}
+ <tagSet>
+ {% for tag in volume.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <volumeType>standard</volumeType>
+</CreateVolumeResponse>"""
+
+DESCRIBE_VOLUMES_RESPONSE = """<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeSet>
+ {% for volume in volumes %}
+ <item>
+ <volumeId>{{ volume.id }}</volumeId>
+ <size>{{ volume.size }}</size>
+ {% if volume.snapshot_id %}
+ <snapshotId>{{ volume.snapshot_id }}</snapshotId>
+ {% else %}
+ <snapshotId/>
+ {% endif %}
+ <encrypted>{{ volume.encrypted }}</encrypted>
+ <availabilityZone>{{ volume.zone.name }}</availabilityZone>
+ <status>{{ volume.status }}</status>
+ <createTime>{{ volume.create_time}}</createTime>
+ <attachmentSet>
+ {% if volume.attachment %}
+ <item>
+ <volumeId>{{ volume.id }}</volumeId>
+ <instanceId>{{ volume.attachment.instance.id }}</instanceId>
+ <device>{{ volume.attachment.device }}</device>
+ <status>attached</status>
+ <attachTime>{{volume.attachment.attach_time}}</attachTime>
+ <deleteOnTermination>false</deleteOnTermination>
+ </item>
+ {% endif %}
+ </attachmentSet>
+ {% if volume.get_tags() %}
+ <tagSet>
+ {% for tag in volume.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <volumeType>standard</volumeType>
+ </item>
+ {% endfor %}
+ </volumeSet>
+</DescribeVolumesResponse>"""
+
+DELETE_VOLUME_RESPONSE = """<DeleteVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteVolumeResponse>"""
+
+ATTACHED_VOLUME_RESPONSE = """<AttachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ attachment.volume.id }}</volumeId>
+ <instanceId>{{ attachment.instance.id }}</instanceId>
+ <device>{{ attachment.device }}</device>
+ <status>attaching</status>
+ <attachTime>{{attachment.attach_time}}</attachTime>
+</AttachVolumeResponse>"""
+
+DETATCH_VOLUME_RESPONSE = """<DetachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ attachment.volume.id }}</volumeId>
+ <instanceId>{{ attachment.instance.id }}</instanceId>
+ <device>{{ attachment.device }}</device>
+ <status>detaching</status>
+ <attachTime>2013-10-04T17:38:53.000Z</attachTime>
+</DetachVolumeResponse>"""
+
+CREATE_SNAPSHOT_RESPONSE = """<CreateSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <volumeId>{{ snapshot.volume.id }}</volumeId>
+ <status>pending</status>
+ <startTime>{{ snapshot.start_time}}</startTime>
+ <progress>60%</progress>
+ <ownerId>{{ snapshot.owner_id }}</ownerId>
+ <volumeSize>{{ snapshot.volume.size }}</volumeSize>
+ <description>{{ snapshot.description }}</description>
+ <encrypted>{{ snapshot.encrypted }}</encrypted>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</CreateSnapshotResponse>"""
+
+COPY_SNAPSHOT_RESPONSE = """<CopySnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+</CopySnapshotResponse>"""
+
+DESCRIBE_SNAPSHOTS_RESPONSE = """<DescribeSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotSet>
+ {% for snapshot in snapshots %}
+ <item>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <volumeId>{{ snapshot.volume.id }}</volumeId>
+ <status>{{ snapshot.status }}</status>
+ <startTime>{{ snapshot.start_time}}</startTime>
+ <progress>100%</progress>
+ <ownerId>{{ snapshot.owner_id }}</ownerId>
+ <volumeSize>{{ snapshot.volume.size }}</volumeSize>
+ <description>{{ snapshot.description }}</description>
+ <encrypted>{{ snapshot.encrypted }}</encrypted>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </snapshotSet>
+</DescribeSnapshotsResponse>"""
+
+DELETE_SNAPSHOT_RESPONSE = """<DeleteSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteSnapshotResponse>"""
+
+DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE = """
+<DescribeSnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>a9540c9f-161a-45d8-9cc1-1182b89ad69f</requestId>
+ <snapshotId>snap-a0332ee0</snapshotId>
+ {% if not groups %}
+ <createVolumePermission/>
+ {% endif %}
+ {% if groups %}
+ <createVolumePermission>
+ {% for group in groups %}
+ <item>
+ <group>{{ group }}</group>
+ </item>
+ {% endfor %}
+ </createVolumePermission>
+ {% endif %}
+</DescribeSnapshotAttributeResponse>
+"""
+
+MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE = """
+<ModifySnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>666d2944-9276-4d6a-be12-1f4ada972fd8</requestId>
+ <return>true</return>
+</ModifySnapshotAttributeResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/elastic_ip_addresses.py b/contrib/python/moto/py2/moto/ec2/responses/elastic_ip_addresses.py
new file mode 100644
index 0000000000..6e1c9fe383
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/elastic_ip_addresses.py
@@ -0,0 +1,148 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class ElasticIPAddresses(BaseResponse):
+
+ def allocate_address(self):
+ domain = self._get_param('Domain', if_none='standard')
+ reallocate_address = self._get_param('Address', if_none=None)
+ if self.is_not_dryrun('AllocateAddress'):
+ if reallocate_address:
+ address = self.ec2_backend.allocate_address(
+ domain, address=reallocate_address)
+ else:
+ address = self.ec2_backend.allocate_address(domain)
+ template = self.response_template(ALLOCATE_ADDRESS_RESPONSE)
+ return template.render(address=address)
+
+ def associate_address(self):
+ instance = eni = None
+
+ if "InstanceId" in self.querystring:
+ instance = self.ec2_backend.get_instance(
+ self._get_param('InstanceId'))
+ elif "NetworkInterfaceId" in self.querystring:
+ eni = self.ec2_backend.get_network_interface(
+ self._get_param('NetworkInterfaceId'))
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter", "Invalid request, expect InstanceId/NetworkId parameter.")
+
+ reassociate = False
+ if "AllowReassociation" in self.querystring:
+ reassociate = self._get_param('AllowReassociation') == "true"
+
+ if self.is_not_dryrun('AssociateAddress'):
+ if instance or eni:
+ if "PublicIp" in self.querystring:
+ eip = self.ec2_backend.associate_address(
+ instance=instance, eni=eni,
+ address=self._get_param('PublicIp'), reassociate=reassociate)
+ elif "AllocationId" in self.querystring:
+ eip = self.ec2_backend.associate_address(
+ instance=instance, eni=eni,
+ allocation_id=self._get_param('AllocationId'), reassociate=reassociate)
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter", "Invalid request, expect PublicIp/AllocationId parameter.")
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter", "Invalid request, expect either instance or ENI.")
+
+ template = self.response_template(ASSOCIATE_ADDRESS_RESPONSE)
+ return template.render(address=eip)
+
+ def describe_addresses(self):
+ allocation_ids = self._get_multi_param('AllocationId')
+ public_ips = self._get_multi_param('PublicIp')
+ filters = filters_from_querystring(self.querystring)
+ addresses = self.ec2_backend.describe_addresses(
+ allocation_ids, public_ips, filters)
+ template = self.response_template(DESCRIBE_ADDRESS_RESPONSE)
+ return template.render(addresses=addresses)
+
+ def disassociate_address(self):
+ if self.is_not_dryrun('DisAssociateAddress'):
+ if "PublicIp" in self.querystring:
+ self.ec2_backend.disassociate_address(
+ address=self._get_param('PublicIp'))
+ elif "AssociationId" in self.querystring:
+ self.ec2_backend.disassociate_address(
+ association_id=self._get_param('AssociationId'))
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter", "Invalid request, expect PublicIp/AssociationId parameter.")
+
+ return self.response_template(DISASSOCIATE_ADDRESS_RESPONSE).render()
+
+ def release_address(self):
+ if self.is_not_dryrun('ReleaseAddress'):
+ if "PublicIp" in self.querystring:
+ self.ec2_backend.release_address(
+ address=self._get_param('PublicIp'))
+ elif "AllocationId" in self.querystring:
+ self.ec2_backend.release_address(
+ allocation_id=self._get_param('AllocationId'))
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter", "Invalid request, expect PublicIp/AllocationId parameter.")
+
+ return self.response_template(RELEASE_ADDRESS_RESPONSE).render()
+
+
+ALLOCATE_ADDRESS_RESPONSE = """<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <publicIp>{{ address.public_ip }}</publicIp>
+ <domain>{{ address.domain }}</domain>
+ {% if address.allocation_id %}
+ <allocationId>{{ address.allocation_id }}</allocationId>
+ {% endif %}
+</AllocateAddressResponse>"""
+
+ASSOCIATE_ADDRESS_RESPONSE = """<AssociateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+ {% if address.association_id %}
+ <associationId>{{ address.association_id }}</associationId>
+ {% endif %}
+</AssociateAddressResponse>"""
+
+DESCRIBE_ADDRESS_RESPONSE = """<DescribeAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <addressesSet>
+ {% for address in addresses %}
+ <item>
+ <publicIp>{{ address.public_ip }}</publicIp>
+ <domain>{{ address.domain }}</domain>
+ {% if address.instance %}
+ <instanceId>{{ address.instance.id }}</instanceId>
+ {% else %}
+ <instanceId/>
+ {% endif %}
+ {% if address.eni %}
+ <networkInterfaceId>{{ address.eni.id }}</networkInterfaceId>
+ {% else %}
+ <networkInterfaceId/>
+ {% endif %}
+ {% if address.allocation_id %}
+ <allocationId>{{ address.allocation_id }}</allocationId>
+ {% endif %}
+ {% if address.association_id %}
+ <associationId>{{ address.association_id }}</associationId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </addressesSet>
+</DescribeAddressesResponse>"""
+
+DISASSOCIATE_ADDRESS_RESPONSE = """<DisassociateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DisassociateAddressResponse>"""
+
+RELEASE_ADDRESS_RESPONSE = """<ReleaseAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReleaseAddressResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/elastic_network_interfaces.py b/contrib/python/moto/py2/moto/ec2/responses/elastic_network_interfaces.py
new file mode 100644
index 0000000000..dc8b92df80
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/elastic_network_interfaces.py
@@ -0,0 +1,214 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class ElasticNetworkInterfaces(BaseResponse):
+
+ def create_network_interface(self):
+ subnet_id = self._get_param('SubnetId')
+ private_ip_address = self._get_param('PrivateIpAddress')
+ groups = self._get_multi_param('SecurityGroupId')
+ subnet = self.ec2_backend.get_subnet(subnet_id)
+ if self.is_not_dryrun('CreateNetworkInterface'):
+ eni = self.ec2_backend.create_network_interface(
+ subnet, private_ip_address, groups)
+ template = self.response_template(
+ CREATE_NETWORK_INTERFACE_RESPONSE)
+ return template.render(eni=eni)
+
+ def delete_network_interface(self):
+ eni_id = self._get_param('NetworkInterfaceId')
+ if self.is_not_dryrun('DeleteNetworkInterface'):
+ self.ec2_backend.delete_network_interface(eni_id)
+ template = self.response_template(
+ DELETE_NETWORK_INTERFACE_RESPONSE)
+ return template.render()
+
+ def describe_network_interface_attribute(self):
+ raise NotImplementedError(
+ 'ElasticNetworkInterfaces(AmazonVPC).describe_network_interface_attribute is not yet implemented')
+
+ def describe_network_interfaces(self):
+ eni_ids = self._get_multi_param('NetworkInterfaceId')
+ filters = filters_from_querystring(self.querystring)
+ enis = self.ec2_backend.get_all_network_interfaces(eni_ids, filters)
+ template = self.response_template(DESCRIBE_NETWORK_INTERFACES_RESPONSE)
+ return template.render(enis=enis)
+
+ def attach_network_interface(self):
+ eni_id = self._get_param('NetworkInterfaceId')
+ instance_id = self._get_param('InstanceId')
+ device_index = self._get_param('DeviceIndex')
+ if self.is_not_dryrun('AttachNetworkInterface'):
+ attachment_id = self.ec2_backend.attach_network_interface(
+ eni_id, instance_id, device_index)
+ template = self.response_template(
+ ATTACH_NETWORK_INTERFACE_RESPONSE)
+ return template.render(attachment_id=attachment_id)
+
+ def detach_network_interface(self):
+ attachment_id = self._get_param('AttachmentId')
+ if self.is_not_dryrun('DetachNetworkInterface'):
+ self.ec2_backend.detach_network_interface(attachment_id)
+ template = self.response_template(
+ DETACH_NETWORK_INTERFACE_RESPONSE)
+ return template.render()
+
+ def modify_network_interface_attribute(self):
+ # Currently supports modifying one and only one security group
+ eni_id = self._get_param('NetworkInterfaceId')
+ group_id = self._get_param('SecurityGroupId.1')
+ if self.is_not_dryrun('ModifyNetworkInterface'):
+ self.ec2_backend.modify_network_interface_attribute(
+ eni_id, group_id)
+ return MODIFY_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE
+
+ def reset_network_interface_attribute(self):
+ if self.is_not_dryrun('ResetNetworkInterface'):
+ raise NotImplementedError(
+ 'ElasticNetworkInterfaces(AmazonVPC).reset_network_interface_attribute is not yet implemented')
+
+
+CREATE_NETWORK_INTERFACE_RESPONSE = """
+<CreateNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>2c6021ec-d705-445a-9780-420d0c7ab793</requestId>
+ <networkInterface>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <subnetId>{{ eni.subnet.id }}</subnetId>
+ <vpcId>{{ eni.subnet.vpc_id }}</vpcId>
+ <availabilityZone>us-west-2a</availabilityZone>
+ <description/>
+ <ownerId>498654062920</ownerId>
+ <requesterManaged>false</requesterManaged>
+ <status>pending</status>
+ <macAddress>02:07:a9:b6:12:51</macAddress>
+ {% if eni.private_ip_address %}
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ {% endif %}
+ {% if eni.instance %}
+ <sourceDestCheck>{{ eni.instance.source_dest_check }}</sourceDestCheck>
+ {% endif %}
+ <groupSet>
+ {% for group in eni.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <tagSet/>
+ {% if eni.private_ip_address %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ <primary>true</primary>
+ </item>
+ </privateIpAddressesSet>
+ {% else %}
+ <privateIpAddressesSet/>
+ {% endif %}
+ </networkInterface>
+</CreateNetworkInterfaceResponse>
+"""
+
+DESCRIBE_NETWORK_INTERFACES_RESPONSE = """<DescribeNetworkInterfacesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>ddb0aaf1-8b65-4f0a-94fa-654b18b8a204</requestId>
+ <networkInterfaceSet>
+ {% for eni in enis %}
+ <item>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <subnetId>{{ eni.subnet.id }}</subnetId>
+ <vpcId>{{ eni.subnet.vpc_id }}</vpcId>
+ <availabilityZone>us-west-2a</availabilityZone>
+ <description>Primary network interface</description>
+ <ownerId>190610284047</ownerId>
+ <requesterManaged>false</requesterManaged>
+ {% if eni.attachment_id %}
+ <status>in-use</status>
+ {% else %}
+ <status>available</status>
+ {% endif %}
+ <macAddress>0e:a3:a7:7b:95:a7</macAddress>
+ {% if eni.private_ip_address %}
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ {% endif %}
+ <privateDnsName>ip-10-0-0-134.us-west-2.compute.internal</privateDnsName>
+ {% if eni.instance %}
+ <sourceDestCheck>{{ eni.instance.source_dest_check }}</sourceDestCheck>
+ {% endif %}
+ <groupSet>
+ {% for group in eni.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <tagSet>
+ {% for tag in eni.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% if eni.instance %}
+ <attachment>
+ <attachmentId>{{ eni.attachment_id }}</attachmentId>
+ <instanceId>{{ eni.instance.id }}</instanceId>
+ <instanceOwnerId>190610284047</instanceOwnerId>
+ <deviceIndex>{{ eni.device_index }}</deviceIndex>
+ <status>attached</status>
+ <attachTime>2013-10-04T17:38:53.000Z</attachTime>
+ <deleteOnTermination>true</deleteOnTermination>
+ </attachment>
+ {% endif %}
+ <association>
+ <publicIp>{{ eni.public_ip }}</publicIp>
+ <publicDnsName>ec2-54-200-86-47.us-west-2.compute.amazonaws.com</publicDnsName>
+ <ipOwnerId>amazon</ipOwnerId>
+ </association>
+ {% if eni.private_ip_address %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ <privateDnsName>ip-10-0-0-134.us-west-2.compute.internal</privateDnsName>
+ <primary>true</primary>
+ {% if eni.public_ip %}
+ <association>
+ <publicIp>{{ eni.public_ip }}</publicIp>
+ <publicDnsName>ec2-54-200-86-47.us-west-2.compute.amazonaws.com</publicDnsName>
+ <ipOwnerId>amazon</ipOwnerId>
+ </association>
+ {% endif %}
+ </item>
+ </privateIpAddressesSet>
+ {% else %}
+ <privateIpAddressesSet/>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+</DescribeNetworkInterfacesResponse>"""
+
+ATTACH_NETWORK_INTERFACE_RESPONSE = """<AttachNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <attachmentId>{{ attachment_id }}</attachmentId>
+</AttachNetworkInterfaceResponse>"""
+
+DETACH_NETWORK_INTERFACE_RESPONSE = """<DetachNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DetachNetworkInterfaceResponse>"""
+
+MODIFY_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE = """<ModifyNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ModifyNetworkInterfaceAttributeResponse>"""
+
+DELETE_NETWORK_INTERFACE_RESPONSE = """
+<DeleteNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>34b5b3b4-d0c5-49b9-b5e2-a468ef6adcd8</requestId>
+ <return>true</return>
+</DeleteNetworkInterfaceResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/general.py b/contrib/python/moto/py2/moto/ec2/responses/general.py
new file mode 100644
index 0000000000..262d9f8ea7
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/general.py
@@ -0,0 +1,32 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class General(BaseResponse):
+
+ def get_console_output(self):
+ instance_id = self._get_param('InstanceId')
+ if not instance_id:
+ # For compatibility with boto.
+ # See: https://github.com/spulec/moto/pull/1152#issuecomment-332487599
+ instance_id = self._get_multi_param('InstanceId')[0]
+
+ instance = self.ec2_backend.get_instance(instance_id)
+ template = self.response_template(GET_CONSOLE_OUTPUT_RESULT)
+ return template.render(instance=instance)
+
+
+GET_CONSOLE_OUTPUT_RESULT = '''
+<GetConsoleOutputResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <timestamp>2010-10-14T01:12:41.000Z</timestamp>
+ <output>TGludXggdmVyc2lvbiAyLjYuMTYteGVuVSAoYnVpbGRlckBwYXRjaGJhdC5hbWF6b25zYSkgKGdj
+YyB2ZXJzaW9uIDQuMC4xIDIwMDUwNzI3IChSZWQgSGF0IDQuMC4xLTUpKSAjMSBTTVAgVGh1IE9j
+dCAyNiAwODo0MToyNiBTQVNUIDIwMDYKQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgpY
+ZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDZhNDAwMDAwICh1c2FibGUpCjk4ME1CIEhJ
+R0hNRU0gYXZhaWxhYmxlLgo3MjdNQiBMT1dNRU0gYXZhaWxhYmxlLgpOWCAoRXhlY3V0ZSBEaXNh
+YmxlKSBwcm90ZWN0aW9uOiBhY3RpdmUKSVJRIGxvY2t1cCBkZXRlY3Rpb24gZGlzYWJsZWQKQnVp
+bHQgMSB6b25lbGlzdHMKS2VybmVsIGNvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTEgcm8gNApF
+bmFibGluZyBmYXN0IEZQVSBzYXZlIGFuZCByZXN0b3JlLi4uIGRvbmUuCg==</output>
+</GetConsoleOutputResponse>'''
diff --git a/contrib/python/moto/py2/moto/ec2/responses/instances.py b/contrib/python/moto/py2/moto/ec2/responses/instances.py
new file mode 100644
index 0000000000..a5359daca6
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/instances.py
@@ -0,0 +1,681 @@
+from __future__ import unicode_literals
+from boto.ec2.instancetype import InstanceType
+from moto.core.responses import BaseResponse
+from moto.core.utils import camelcase_to_underscores
+from moto.ec2.utils import filters_from_querystring, \
+ dict_from_querystring
+
+
+class InstanceResponse(BaseResponse):
+
+ def describe_instances(self):
+ filter_dict = filters_from_querystring(self.querystring)
+ instance_ids = self._get_multi_param('InstanceId')
+ token = self._get_param("NextToken")
+ if instance_ids:
+ reservations = self.ec2_backend.get_reservations_by_instance_ids(
+ instance_ids, filters=filter_dict)
+ else:
+ reservations = self.ec2_backend.all_reservations(filters=filter_dict)
+
+ reservation_ids = [reservation.id for reservation in reservations]
+ if token:
+ start = reservation_ids.index(token) + 1
+ else:
+ start = 0
+ max_results = int(self._get_param('MaxResults', 100))
+ reservations_resp = reservations[start:start + max_results]
+ next_token = None
+ if max_results and len(reservations) > (start + max_results):
+ next_token = reservations_resp[-1].id
+ template = self.response_template(EC2_DESCRIBE_INSTANCES)
+ return template.render(reservations=reservations_resp, next_token=next_token).replace('True', 'true').replace('False', 'false')
+
+ def run_instances(self):
+ min_count = int(self._get_param('MinCount', if_none='1'))
+ image_id = self._get_param('ImageId')
+ owner_id = self._get_param('OwnerId')
+ user_data = self._get_param('UserData')
+ security_group_names = self._get_multi_param('SecurityGroup')
+ security_group_ids = self._get_multi_param('SecurityGroupId')
+ nics = dict_from_querystring("NetworkInterface", self.querystring)
+ instance_type = self._get_param('InstanceType', if_none='m1.small')
+ placement = self._get_param('Placement.AvailabilityZone')
+ subnet_id = self._get_param('SubnetId')
+ private_ip = self._get_param('PrivateIpAddress')
+ associate_public_ip = self._get_param('AssociatePublicIpAddress')
+ key_name = self._get_param('KeyName')
+ ebs_optimized = self._get_param('EbsOptimized')
+ tags = self._parse_tag_specification("TagSpecification")
+ region_name = self.region
+
+ if self.is_not_dryrun('RunInstance'):
+ new_reservation = self.ec2_backend.add_instances(
+ image_id, min_count, user_data, security_group_names,
+ instance_type=instance_type, placement=placement, region_name=region_name, subnet_id=subnet_id,
+ owner_id=owner_id, key_name=key_name, security_group_ids=security_group_ids,
+ nics=nics, private_ip=private_ip, associate_public_ip=associate_public_ip,
+ tags=tags, ebs_optimized=ebs_optimized)
+
+ template = self.response_template(EC2_RUN_INSTANCES)
+ return template.render(reservation=new_reservation)
+
+ def terminate_instances(self):
+ instance_ids = self._get_multi_param('InstanceId')
+ if self.is_not_dryrun('TerminateInstance'):
+ instances = self.ec2_backend.terminate_instances(instance_ids)
+ template = self.response_template(EC2_TERMINATE_INSTANCES)
+ return template.render(instances=instances)
+
+ def reboot_instances(self):
+ instance_ids = self._get_multi_param('InstanceId')
+ if self.is_not_dryrun('RebootInstance'):
+ instances = self.ec2_backend.reboot_instances(instance_ids)
+ template = self.response_template(EC2_REBOOT_INSTANCES)
+ return template.render(instances=instances)
+
+ def stop_instances(self):
+ instance_ids = self._get_multi_param('InstanceId')
+ if self.is_not_dryrun('StopInstance'):
+ instances = self.ec2_backend.stop_instances(instance_ids)
+ template = self.response_template(EC2_STOP_INSTANCES)
+ return template.render(instances=instances)
+
+ def start_instances(self):
+ instance_ids = self._get_multi_param('InstanceId')
+ if self.is_not_dryrun('StartInstance'):
+ instances = self.ec2_backend.start_instances(instance_ids)
+ template = self.response_template(EC2_START_INSTANCES)
+ return template.render(instances=instances)
+
+ def describe_instance_status(self):
+ instance_ids = self._get_multi_param('InstanceId')
+ include_all_instances = self._get_param('IncludeAllInstances') == 'true'
+
+ if instance_ids:
+ instances = self.ec2_backend.get_multi_instances_by_id(
+ instance_ids)
+ elif include_all_instances:
+ instances = self.ec2_backend.all_instances()
+ else:
+ instances = self.ec2_backend.all_running_instances()
+
+ template = self.response_template(EC2_INSTANCE_STATUS)
+ return template.render(instances=instances)
+
+ def describe_instance_types(self):
+ instance_types = [InstanceType(
+ name='t1.micro', cores=1, memory=644874240, disk=0)]
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_TYPES)
+ return template.render(instance_types=instance_types)
+
+ def describe_instance_attribute(self):
+ # TODO this and modify below should raise IncorrectInstanceState if
+ # instance not in stopped state
+ attribute = self._get_param('Attribute')
+ key = camelcase_to_underscores(attribute)
+ instance_id = self._get_param('InstanceId')
+ instance, value = self.ec2_backend.describe_instance_attribute(
+ instance_id, key)
+
+ if key == "group_set":
+ template = self.response_template(
+ EC2_DESCRIBE_INSTANCE_GROUPSET_ATTRIBUTE)
+ else:
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_ATTRIBUTE)
+
+ return template.render(instance=instance, attribute=attribute, value=value)
+
+ def modify_instance_attribute(self):
+ handlers = [self._dot_value_instance_attribute_handler,
+ self._block_device_mapping_handler,
+ self._security_grp_instance_attribute_handler]
+
+ for handler in handlers:
+ success = handler()
+ if success:
+ return success
+
+ msg = "This specific call to ModifyInstanceAttribute has not been" \
+ " implemented in Moto yet. Feel free to open an issue at" \
+ " https://github.com/spulec/moto/issues"
+ raise NotImplementedError(msg)
+
+ def _block_device_mapping_handler(self):
+ """
+ Handles requests which are generated by code similar to:
+
+ instance.modify_attribute(
+ BlockDeviceMappings=[{
+ 'DeviceName': '/dev/sda1',
+ 'Ebs': {'DeleteOnTermination': True}
+ }]
+ )
+
+ The querystring contains information similar to:
+
+ BlockDeviceMapping.1.Ebs.DeleteOnTermination : ['true']
+ BlockDeviceMapping.1.DeviceName : ['/dev/sda1']
+
+ For now we only support the "BlockDeviceMapping.1.Ebs.DeleteOnTermination"
+ configuration, but it should be trivial to add anything else.
+ """
+ mapping_counter = 1
+ mapping_device_name_fmt = 'BlockDeviceMapping.%s.DeviceName'
+ mapping_del_on_term_fmt = 'BlockDeviceMapping.%s.Ebs.DeleteOnTermination'
+ while True:
+ mapping_device_name = mapping_device_name_fmt % mapping_counter
+ if mapping_device_name not in self.querystring.keys():
+ break
+
+ mapping_del_on_term = mapping_del_on_term_fmt % mapping_counter
+ del_on_term_value_str = self.querystring[mapping_del_on_term][0]
+ del_on_term_value = True if 'true' == del_on_term_value_str else False
+ device_name_value = self.querystring[mapping_device_name][0]
+
+ instance_id = self._get_param('InstanceId')
+ instance = self.ec2_backend.get_instance(instance_id)
+
+ if self.is_not_dryrun('ModifyInstanceAttribute'):
+ block_device_type = instance.block_device_mapping[
+ device_name_value]
+ block_device_type.delete_on_termination = del_on_term_value
+
+ # +1 for the next device
+ mapping_counter += 1
+
+ if mapping_counter > 1:
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _dot_value_instance_attribute_handler(self):
+ attribute_key = None
+ for key, value in self.querystring.items():
+ if '.Value' in key:
+ attribute_key = key
+ break
+
+ if not attribute_key:
+ return
+
+ if self.is_not_dryrun('Modify' + attribute_key.split(".")[0]):
+ value = self.querystring.get(attribute_key)[0]
+ normalized_attribute = camelcase_to_underscores(
+ attribute_key.split(".")[0])
+ instance_id = self._get_param('InstanceId')
+ self.ec2_backend.modify_instance_attribute(
+ instance_id, normalized_attribute, value)
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _security_grp_instance_attribute_handler(self):
+ new_security_grp_list = []
+ for key, value in self.querystring.items():
+ if 'GroupId.' in key:
+ new_security_grp_list.append(self.querystring.get(key)[0])
+
+ instance_id = self._get_param('InstanceId')
+ if self.is_not_dryrun('ModifyInstanceSecurityGroups'):
+ self.ec2_backend.modify_instance_security_groups(
+ instance_id, new_security_grp_list)
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+
+EC2_RUN_INSTANCES = """<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <reservationId>{{ reservation.id }}</reservationId>
+ <ownerId>123456789012</ownerId>
+ <groupSet>
+ <item>
+ <groupId>sg-245f6a01</groupId>
+ <groupName>default</groupName>
+ </item>
+ </groupSet>
+ <instancesSet>
+ {% for instance in reservation.instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <imageId>{{ instance.image_id }}</imageId>
+ <instanceState>
+ <code>0</code>
+ <name>pending</name>
+ </instanceState>
+ <privateDnsName>{{ instance.private_dns }}</privateDnsName>
+ <publicDnsName>{{ instance.public_dns }}</publicDnsName>
+ <dnsName>{{ instance.public_dns }}</dnsName>
+ <reason/>
+ <keyName>{{ instance.key_name }}</keyName>
+ <ebsOptimized>{{ instance.ebs_optimized }}</ebsOptimized>
+ <amiLaunchIndex>{{ instance.ami_launch_index }}</amiLaunchIndex>
+ <instanceType>{{ instance.instance_type }}</instanceType>
+ <launchTime>{{ instance.launch_time }}</launchTime>
+ <placement>
+ <availabilityZone>{{ instance.placement}}</availabilityZone>
+ <groupName/>
+ <tenancy>default</tenancy>
+ </placement>
+ <monitoring>
+ <state>enabled</state>
+ </monitoring>
+ {% if instance.subnet_id %}
+ <subnetId>{{ instance.subnet_id }}</subnetId>
+ {% elif instance.nics[0].subnet.id %}
+ <subnetId>{{ instance.nics[0].subnet.id }}</subnetId>
+ {% endif %}
+ {% if instance.vpc_id %}
+ <vpcId>{{ instance.vpc_id }}</vpcId>
+ {% elif instance.nics[0].subnet.vpc_id %}
+ <vpcId>{{ instance.nics[0].subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <privateIpAddress>{{ instance.private_ip }}</privateIpAddress>
+ {% if instance.nics[0].public_ip %}
+ <ipAddress>{{ instance.nics[0].public_ip }}</ipAddress>
+ {% endif %}
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in instance.dynamic_group_list %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if instance.platform %}
+ <platform>{{ instance.platform }}</platform>
+ {% endif %}
+ <virtualizationType>{{ instance.virtualization_type }}</virtualizationType>
+ <architecture>{{ instance.architecture }}</architecture>
+ <kernelId>{{ instance.kernel }}</kernelId>
+ <clientToken/>
+ <hypervisor>xen</hypervisor>
+ <ebsOptimized>false</ebsOptimized>
+ <tagSet>
+ {% for tag in instance.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <networkInterfaceSet>
+ {% for nic in instance.nics.values() %}
+ <item>
+ <networkInterfaceId>{{ nic.id }}</networkInterfaceId>
+ {% if nic.subnet %}
+ <subnetId>{{ nic.subnet.id }}</subnetId>
+ <vpcId>{{ nic.subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <description>Primary network interface</description>
+ <ownerId>123456789012</ownerId>
+ <status>in-use</status>
+ <macAddress>1b:2b:3c:4d:5e:6f</macAddress>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in nic.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <attachment>
+ <attachmentId>{{ nic.attachment_id }}</attachmentId>
+ <deviceIndex>{{ nic.device_index }}</deviceIndex>
+ <status>attached</status>
+ <attachTime>2015-01-01T00:00:00Z</attachTime>
+ <deleteOnTermination>true</deleteOnTermination>
+ </attachment>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>123456789012</ipOwnerId>
+ </association>
+ {% endif %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <primary>true</primary>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>123456789012</ipOwnerId>
+ </association>
+ {% endif %}
+ </item>
+ </privateIpAddressesSet>
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+ </item>
+ {% endfor %}
+ </instancesSet>
+ </RunInstancesResponse>"""
+
+EC2_DESCRIBE_INSTANCES = """<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>fdcdcab1-ae5c-489e-9c33-4637c5dda355</requestId>
+ <reservationSet>
+ {% for reservation in reservations %}
+ <item>
+ <reservationId>{{ reservation.id }}</reservationId>
+ <ownerId>123456789012</ownerId>
+ <groupSet>
+ {% for group in reservation.dynamic_group_list %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <instancesSet>
+ {% for instance in reservation.instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <imageId>{{ instance.image_id }}</imageId>
+ <instanceState>
+ <code>{{ instance._state.code }}</code>
+ <name>{{ instance._state.name }}</name>
+ </instanceState>
+ <privateDnsName>{{ instance.private_dns }}</privateDnsName>
+ <publicDnsName>{{ instance.public_dns }}</publicDnsName>
+ <dnsName>{{ instance.public_dns }}</dnsName>
+ <reason>{{ instance._reason }}</reason>
+ <keyName>{{ instance.key_name }}</keyName>
+ <ebsOptimized>{{ instance.ebs_optimized }}</ebsOptimized>
+ <amiLaunchIndex>{{ instance.ami_launch_index }}</amiLaunchIndex>
+ <productCodes/>
+ <instanceType>{{ instance.instance_type }}</instanceType>
+ <launchTime>{{ instance.launch_time }}</launchTime>
+ <placement>
+ <availabilityZone>{{ instance.placement }}</availabilityZone>
+ <groupName/>
+ <tenancy>default</tenancy>
+ </placement>
+ {% if instance.platform %}
+ <platform>{{ instance.platform }}</platform>
+ {% endif %}
+ <monitoring>
+ <state>disabled</state>
+ </monitoring>
+ {% if instance.subnet_id %}
+ <subnetId>{{ instance.subnet_id }}</subnetId>
+ {% elif instance.nics[0].subnet.id %}
+ <subnetId>{{ instance.nics[0].subnet.id }}</subnetId>
+ {% endif %}
+ {% if instance.vpc_id %}
+ <vpcId>{{ instance.vpc_id }}</vpcId>
+ {% elif instance.nics[0].subnet.vpc_id %}
+ <vpcId>{{ instance.nics[0].subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <privateIpAddress>{{ instance.private_ip }}</privateIpAddress>
+ {% if instance.nics[0].public_ip %}
+ <ipAddress>{{ instance.nics[0].public_ip }}</ipAddress>
+ {% endif %}
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in instance.dynamic_group_list %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <stateReason>
+ <code>{{ instance._state_reason.code }}</code>
+ <message>{{ instance._state_reason.message }}</message>
+ </stateReason>
+ <architecture>{{ instance.architecture }}</architecture>
+ <kernelId>{{ instance.kernel }}</kernelId>
+ <rootDeviceType>ebs</rootDeviceType>
+ <rootDeviceName>/dev/sda1</rootDeviceName>
+ <blockDeviceMapping>
+ {% for device_name,deviceobject in instance.get_block_device_mapping %}
+ <item>
+ <deviceName>{{ device_name }}</deviceName>
+ <ebs>
+ <volumeId>{{ deviceobject.volume_id }}</volumeId>
+ <status>{{ deviceobject.status }}</status>
+ <attachTime>{{ deviceobject.attach_time }}</attachTime>
+ <deleteOnTermination>{{ deviceobject.delete_on_termination }}</deleteOnTermination>
+ <size>{{deviceobject.size}}</size>
+ </ebs>
+ </item>
+ {% endfor %}
+ </blockDeviceMapping>
+ <virtualizationType>{{ instance.virtualization_type }}</virtualizationType>
+ <clientToken>ABCDE1234567890123</clientToken>
+ {% if instance.get_tags() %}
+ <tagSet>
+ {% for tag in instance.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <hypervisor>xen</hypervisor>
+ <networkInterfaceSet>
+ {% for nic in instance.nics.values() %}
+ <item>
+ <networkInterfaceId>{{ nic.id }}</networkInterfaceId>
+ {% if nic.subnet %}
+ <subnetId>{{ nic.subnet.id }}</subnetId>
+ <vpcId>{{ nic.subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <description>Primary network interface</description>
+ <ownerId>123456789012</ownerId>
+ <status>in-use</status>
+ <macAddress>1b:2b:3c:4d:5e:6f</macAddress>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in nic.group_set %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <attachment>
+ <attachmentId>{{ nic.attachment_id }}</attachmentId>
+ <deviceIndex>{{ nic.device_index }}</deviceIndex>
+ <status>attached</status>
+ <attachTime>2015-01-01T00:00:00Z</attachTime>
+ <deleteOnTermination>true</deleteOnTermination>
+ </attachment>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>123456789012</ipOwnerId>
+ </association>
+ {% endif %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <primary>true</primary>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>123456789012</ipOwnerId>
+ </association>
+ {% endif %}
+ </item>
+ </privateIpAddressesSet>
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+ </item>
+ {% endfor %}
+ </instancesSet>
+ </item>
+ {% endfor %}
+ </reservationSet>
+ {% if next_token %}
+ <nextToken>{{ next_token }}</nextToken>
+ {% endif %}
+</DescribeInstancesResponse>"""
+
+EC2_TERMINATE_INSTANCES = """
+<TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>32</code>
+ <name>shutting-down</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</TerminateInstancesResponse>"""
+
+EC2_STOP_INSTANCES = """
+<StopInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>64</code>
+ <name>stopping</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</StopInstancesResponse>"""
+
+EC2_START_INSTANCES = """
+<StartInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>0</code>
+ <name>pending</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</StartInstancesResponse>"""
+
+EC2_REBOOT_INSTANCES = """<RebootInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RebootInstancesResponse>"""
+
+EC2_DESCRIBE_INSTANCE_ATTRIBUTE = """<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <{{ attribute }}>
+ <value>{{ value }}</value>
+ </{{ attribute }}>
+</DescribeInstanceAttributeResponse>"""
+
+EC2_DESCRIBE_INSTANCE_GROUPSET_ATTRIBUTE = """<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <{{ attribute }}>
+ {% for sg_id in value %}
+ <item>
+ <groupId>{{ sg_id }}</groupId>
+ </item>
+ {% endfor %}
+ </{{ attribute }}>
+</DescribeInstanceAttributeResponse>"""
+
+EC2_MODIFY_INSTANCE_ATTRIBUTE = """<ModifyInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ModifyInstanceAttributeResponse>"""
+
+EC2_INSTANCE_STATUS = """<?xml version="1.0" encoding="UTF-8"?>
+<DescribeInstanceStatusResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceStatusSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <availabilityZone>{{ instance.placement }}</availabilityZone>
+ <instanceState>
+ <code>{{ instance.state_code }}</code>
+ <name>{{ instance.state }}</name>
+ </instanceState>
+ {% if instance.state_code == 16 %}
+ <systemStatus>
+ <status>ok</status>
+ <details>
+ <item>
+ <name>reachability</name>
+ <status>passed</status>
+ </item>
+ </details>
+ </systemStatus>
+ <instanceStatus>
+ <status>ok</status>
+ <details>
+ <item>
+ <name>reachability</name>
+ <status>passed</status>
+ </item>
+ </details>
+ </instanceStatus>
+ {% else %}
+ <systemStatus>
+ <status>not-applicable</status>
+ </systemStatus>
+ <instanceStatus>
+ <status>not-applicable</status>
+ </instanceStatus>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </instanceStatusSet>
+</DescribeInstanceStatusResponse>"""
+
+EC2_DESCRIBE_INSTANCE_TYPES = """<?xml version="1.0" encoding="UTF-8"?>
+<DescribeInstanceTypesResponse xmlns="http://api.outscale.com/wsdl/fcuext/2014-04-15/">
+ <requestId>f8b86168-d034-4e65-b48d-3b84c78e64af</requestId>
+ <instanceTypeSet>
+ {% for instance_type in instance_types %}
+ <item>
+ <name>{{ instance_type.name }}</name>
+ <vcpu>{{ instance_type.cores }}</vcpu>
+ <memory>{{ instance_type.memory }}</memory>
+ <storageSize>{{ instance_type.disk }}</storageSize>
+ <storageCount>{{ instance_type.storageCount }}</storageCount>
+ <maxIpAddresses>{{ instance_type.maxIpAddresses }}</maxIpAddresses>
+ <ebsOptimizedAvailable>{{ instance_type.ebsOptimizedAvailable }}</ebsOptimizedAvailable>
+ </item>
+ {% endfor %}
+ </instanceTypeSet>
+</DescribeInstanceTypesResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/internet_gateways.py b/contrib/python/moto/py2/moto/ec2/responses/internet_gateways.py
new file mode 100644
index 0000000000..ebea14adf6
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/internet_gateways.py
@@ -0,0 +1,118 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import (
+ filters_from_querystring,
+)
+
+
+class InternetGateways(BaseResponse):
+
+ def attach_internet_gateway(self):
+ igw_id = self._get_param('InternetGatewayId')
+ vpc_id = self._get_param('VpcId')
+ if self.is_not_dryrun('AttachInternetGateway'):
+ self.ec2_backend.attach_internet_gateway(igw_id, vpc_id)
+ template = self.response_template(ATTACH_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+ def create_internet_gateway(self):
+ if self.is_not_dryrun('CreateInternetGateway'):
+ igw = self.ec2_backend.create_internet_gateway()
+ template = self.response_template(CREATE_INTERNET_GATEWAY_RESPONSE)
+ return template.render(internet_gateway=igw)
+
+ def delete_internet_gateway(self):
+ igw_id = self._get_param('InternetGatewayId')
+ if self.is_not_dryrun('DeleteInternetGateway'):
+ self.ec2_backend.delete_internet_gateway(igw_id)
+ template = self.response_template(DELETE_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+ def describe_internet_gateways(self):
+ filter_dict = filters_from_querystring(self.querystring)
+ if "InternetGatewayId.1" in self.querystring:
+ igw_ids = self._get_multi_param("InternetGatewayId")
+ igws = self.ec2_backend.describe_internet_gateways(
+ igw_ids, filters=filter_dict)
+ else:
+ igws = self.ec2_backend.describe_internet_gateways(
+ filters=filter_dict)
+
+ template = self.response_template(DESCRIBE_INTERNET_GATEWAYS_RESPONSE)
+ return template.render(internet_gateways=igws)
+
+ def detach_internet_gateway(self):
+ # TODO validate no instances with EIPs in VPC before detaching
+ # raise else DependencyViolationError()
+ igw_id = self._get_param('InternetGatewayId')
+ vpc_id = self._get_param('VpcId')
+ if self.is_not_dryrun('DetachInternetGateway'):
+ self.ec2_backend.detach_internet_gateway(igw_id, vpc_id)
+ template = self.response_template(DETACH_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+
+ATTACH_INTERNET_GATEWAY_RESPONSE = u"""<AttachInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</AttachInternetGatewayResponse>"""
+
+CREATE_INTERNET_GATEWAY_RESPONSE = u"""<CreateInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <internetGateway>
+ <internetGatewayId>{{ internet_gateway.id }}</internetGatewayId>
+ <attachmentSet/>
+ <tagSet>
+ {% for tag in internet_gateway.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </internetGateway>
+</CreateInternetGatewayResponse>"""
+
+DELETE_INTERNET_GATEWAY_RESPONSE = u"""<DeleteInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteInternetGatewayResponse>"""
+
+DESCRIBE_INTERNET_GATEWAYS_RESPONSE = u"""<DescribeInternetGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-
+15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <internetGatewaySet>
+ {% for igw in internet_gateways %}
+ <item>
+ <internetGatewayId>{{ igw.id }}</internetGatewayId>
+ {% if igw.vpc %}
+ <attachmentSet>
+ <item>
+ <vpcId>{{ igw.vpc.id }}</vpcId>
+ <state>available</state>
+ </item>
+ </attachmentSet>
+ {% else %}
+ <attachmentSet/>
+ {% endif %}
+ <tagSet>
+ {% for tag in igw.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </internetGatewaySet>
+</DescribeInternetGatewaysResponse>"""
+
+DETACH_INTERNET_GATEWAY_RESPONSE = u"""<DetachInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DetachInternetGatewayResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/ip_addresses.py b/contrib/python/moto/py2/moto/ec2/responses/ip_addresses.py
new file mode 100644
index 0000000000..fab5cbddce
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/ip_addresses.py
@@ -0,0 +1,16 @@
+from __future__ import unicode_literals
+
+from moto.core.responses import BaseResponse
+
+
+class IPAddresses(BaseResponse):
+
+ def assign_private_ip_addresses(self):
+ if self.is_not_dryrun('AssignPrivateIPAddress'):
+ raise NotImplementedError(
+ 'IPAddresses.assign_private_ip_addresses is not yet implemented')
+
+ def unassign_private_ip_addresses(self):
+ if self.is_not_dryrun('UnAssignPrivateIPAddress'):
+ raise NotImplementedError(
+ 'IPAddresses.unassign_private_ip_addresses is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/key_pairs.py b/contrib/python/moto/py2/moto/ec2/responses/key_pairs.py
new file mode 100644
index 0000000000..d927bddda4
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/key_pairs.py
@@ -0,0 +1,69 @@
+from __future__ import unicode_literals
+import six
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class KeyPairs(BaseResponse):
+
+ def create_key_pair(self):
+ name = self._get_param('KeyName')
+ if self.is_not_dryrun('CreateKeyPair'):
+ keypair = self.ec2_backend.create_key_pair(name)
+ template = self.response_template(CREATE_KEY_PAIR_RESPONSE)
+ return template.render(keypair=keypair)
+
+ def delete_key_pair(self):
+ name = self._get_param('KeyName')
+ if self.is_not_dryrun('DeleteKeyPair'):
+ success = six.text_type(
+ self.ec2_backend.delete_key_pair(name)).lower()
+ return self.response_template(DELETE_KEY_PAIR_RESPONSE).render(success=success)
+
+ def describe_key_pairs(self):
+ names = self._get_multi_param('KeyName')
+ filters = filters_from_querystring(self.querystring)
+ keypairs = self.ec2_backend.describe_key_pairs(names, filters)
+ template = self.response_template(DESCRIBE_KEY_PAIRS_RESPONSE)
+ return template.render(keypairs=keypairs)
+
+ def import_key_pair(self):
+ name = self._get_param('KeyName')
+ material = self._get_param('PublicKeyMaterial')
+ if self.is_not_dryrun('ImportKeyPair'):
+ keypair = self.ec2_backend.import_key_pair(name, material)
+ template = self.response_template(IMPORT_KEYPAIR_RESPONSE)
+ return template.render(keypair=keypair)
+
+
+DESCRIBE_KEY_PAIRS_RESPONSE = """<DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <keySet>
+ {% for keypair in keypairs %}
+ <item>
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ </item>
+ {% endfor %}
+ </keySet>
+ </DescribeKeyPairsResponse>"""
+
+
+CREATE_KEY_PAIR_RESPONSE = """<CreateKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ <keyMaterial>{{ keypair.material }}</keyMaterial>
+</CreateKeyPairResponse>"""
+
+
+DELETE_KEY_PAIR_RESPONSE = """<DeleteKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>{{ success }}</return>
+</DeleteKeyPairResponse>"""
+
+IMPORT_KEYPAIR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <ImportKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>471f9fdd-8fe2-4a84-86b0-bd3d3e350979</requestId>
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ </ImportKeyPairResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/monitoring.py b/contrib/python/moto/py2/moto/ec2/responses/monitoring.py
new file mode 100644
index 0000000000..2024abe7ea
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/monitoring.py
@@ -0,0 +1,15 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class Monitoring(BaseResponse):
+
+ def monitor_instances(self):
+ if self.is_not_dryrun('MonitorInstances'):
+ raise NotImplementedError(
+ 'Monitoring.monitor_instances is not yet implemented')
+
+ def unmonitor_instances(self):
+ if self.is_not_dryrun('UnMonitorInstances'):
+ raise NotImplementedError(
+ 'Monitoring.unmonitor_instances is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/nat_gateways.py b/contrib/python/moto/py2/moto/ec2/responses/nat_gateways.py
new file mode 100644
index 0000000000..ce9479e822
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/nat_gateways.py
@@ -0,0 +1,74 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class NatGateways(BaseResponse):
+
+ def create_nat_gateway(self):
+ subnet_id = self._get_param('SubnetId')
+ allocation_id = self._get_param('AllocationId')
+ nat_gateway = self.ec2_backend.create_nat_gateway(
+ subnet_id=subnet_id, allocation_id=allocation_id)
+ template = self.response_template(CREATE_NAT_GATEWAY)
+ return template.render(nat_gateway=nat_gateway)
+
+ def delete_nat_gateway(self):
+ nat_gateway_id = self._get_param('NatGatewayId')
+ nat_gateway = self.ec2_backend.delete_nat_gateway(nat_gateway_id)
+ template = self.response_template(DELETE_NAT_GATEWAY_RESPONSE)
+ return template.render(nat_gateway=nat_gateway)
+
+ def describe_nat_gateways(self):
+ filters = filters_from_querystring(self.querystring)
+ nat_gateways = self.ec2_backend.get_all_nat_gateways(filters)
+ template = self.response_template(DESCRIBE_NAT_GATEWAYS_RESPONSE)
+ return template.render(nat_gateways=nat_gateways)
+
+
+DESCRIBE_NAT_GATEWAYS_RESPONSE = """<DescribeNatGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>bfed02c6-dae9-47c0-86a2-example</requestId>
+ <natGatewaySet>
+ {% for nat_gateway in nat_gateways %}
+ <item>
+ <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
+ <natGatewayAddressSet>
+ <item>
+ <networkInterfaceId>{{ nat_gateway.network_interface_id }}</networkInterfaceId>
+ <publicIp>{{ nat_gateway.public_ip }}</publicIp>
+ <allocationId>{{ nat_gateway.allocation_id }}</allocationId>
+ <privateIp>{{ nat_gateway.private_ip }}</privateIp>
+ </item>
+ </natGatewayAddressSet>
+ <createTime>{{ nat_gateway.create_time }}</createTime>
+ <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+ <state>{{ nat_gateway.state }}</state>
+ </item>
+ {% endfor %}
+ </natGatewaySet>
+</DescribeNatGatewaysResponse>
+"""
+
+CREATE_NAT_GATEWAY = """<CreateNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>1b74dc5c-bcda-403f-867d-example</requestId>
+ <natGateway>
+ <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
+ <natGatewayAddressSet>
+ <item>
+ <allocationId>{{ nat_gateway.allocation_id }}</allocationId>
+ </item>
+ </natGatewayAddressSet>
+ <createTime>{{ nat_gateway.create_time }}</createTime>
+ <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+ <state>{{ nat_gateway.state }}</state>
+ </natGateway>
+</CreateNatGatewayResponse>
+"""
+
+
+DELETE_NAT_GATEWAY_RESPONSE = """<DeleteNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>741fc8ab-6ebe-452b-b92b-example</requestId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+</DeleteNatGatewayResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/network_acls.py b/contrib/python/moto/py2/moto/ec2/responses/network_acls.py
new file mode 100644
index 0000000000..97f3703062
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/network_acls.py
@@ -0,0 +1,195 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class NetworkACLs(BaseResponse):
+
+ def create_network_acl(self):
+ vpc_id = self._get_param('VpcId')
+ network_acl = self.ec2_backend.create_network_acl(vpc_id)
+ template = self.response_template(CREATE_NETWORK_ACL_RESPONSE)
+ return template.render(network_acl=network_acl)
+
+ def create_network_acl_entry(self):
+ network_acl_id = self._get_param('NetworkAclId')
+ rule_number = self._get_param('RuleNumber')
+ protocol = self._get_param('Protocol')
+ rule_action = self._get_param('RuleAction')
+ egress = self._get_param('Egress')
+ cidr_block = self._get_param('CidrBlock')
+ icmp_code = self._get_param('Icmp.Code')
+ icmp_type = self._get_param('Icmp.Type')
+ port_range_from = self._get_param('PortRange.From')
+ port_range_to = self._get_param('PortRange.To')
+
+ network_acl_entry = self.ec2_backend.create_network_acl_entry(
+ network_acl_id, rule_number, protocol, rule_action,
+ egress, cidr_block, icmp_code, icmp_type,
+ port_range_from, port_range_to)
+
+ template = self.response_template(CREATE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render(network_acl_entry=network_acl_entry)
+
+ def delete_network_acl(self):
+ network_acl_id = self._get_param('NetworkAclId')
+ self.ec2_backend.delete_network_acl(network_acl_id)
+ template = self.response_template(DELETE_NETWORK_ACL_ASSOCIATION)
+ return template.render()
+
+ def delete_network_acl_entry(self):
+ network_acl_id = self._get_param('NetworkAclId')
+ rule_number = self._get_param('RuleNumber')
+ egress = self._get_param('Egress')
+ self.ec2_backend.delete_network_acl_entry(network_acl_id, rule_number, egress)
+ template = self.response_template(DELETE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render()
+
+ def replace_network_acl_entry(self):
+ network_acl_id = self._get_param('NetworkAclId')
+ rule_number = self._get_param('RuleNumber')
+ protocol = self._get_param('Protocol')
+ rule_action = self._get_param('RuleAction')
+ egress = self._get_param('Egress')
+ cidr_block = self._get_param('CidrBlock')
+ icmp_code = self._get_param('Icmp.Code')
+ icmp_type = self._get_param('Icmp.Type')
+ port_range_from = self._get_param('PortRange.From')
+ port_range_to = self._get_param('PortRange.To')
+
+ self.ec2_backend.replace_network_acl_entry(
+ network_acl_id, rule_number, protocol, rule_action,
+ egress, cidr_block, icmp_code, icmp_type,
+ port_range_from, port_range_to)
+
+ template = self.response_template(REPLACE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render()
+
+ def describe_network_acls(self):
+ network_acl_ids = self._get_multi_param('NetworkAclId')
+ filters = filters_from_querystring(self.querystring)
+ network_acls = self.ec2_backend.get_all_network_acls(
+ network_acl_ids, filters)
+ template = self.response_template(DESCRIBE_NETWORK_ACL_RESPONSE)
+ return template.render(network_acls=network_acls)
+
+ def replace_network_acl_association(self):
+ association_id = self._get_param('AssociationId')
+ network_acl_id = self._get_param('NetworkAclId')
+
+ association = self.ec2_backend.replace_network_acl_association(
+ association_id,
+ network_acl_id
+ )
+ template = self.response_template(REPLACE_NETWORK_ACL_ASSOCIATION)
+ return template.render(association=association)
+
+
+CREATE_NETWORK_ACL_RESPONSE = """
+<CreateNetworkAclResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <networkAcl>
+ <networkAclId>{{ network_acl.id }}</networkAclId>
+ <vpcId>{{ network_acl.vpc_id }}</vpcId>
+ <default>false</default>
+ <entrySet/>
+ <associationSet/>
+ <tagSet>
+ {% for tag in network_acl.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </networkAcl>
+</CreateNetworkAclResponse>
+"""
+
+DESCRIBE_NETWORK_ACL_RESPONSE = """
+<DescribeNetworkAclsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <networkAclSet>
+ {% for network_acl in network_acls %}
+ <item>
+ <networkAclId>{{ network_acl.id }}</networkAclId>
+ <vpcId>{{ network_acl.vpc_id }}</vpcId>
+ <default>{{ network_acl.default }}</default>
+ <entrySet>
+ {% for entry in network_acl.network_acl_entries %}
+ <item>
+ <ruleNumber>{{ entry.rule_number }}</ruleNumber>
+ <protocol>{{ entry.protocol }}</protocol>
+ <ruleAction>{{ entry.rule_action }}</ruleAction>
+ <egress>{{ entry.egress.lower() }}</egress>
+ <cidrBlock>{{ entry.cidr_block }}</cidrBlock>
+ {% if entry.port_range_from or entry.port_range_to %}
+ <portRange>
+ <from>{{ entry.port_range_from }}</from>
+ <to>{{ entry.port_range_to }}</to>
+ </portRange>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </entrySet>
+ <associationSet>
+ {% for association in network_acl.associations.values() %}
+ <item>
+ <networkAclAssociationId>{{ association.id }}</networkAclAssociationId>
+ <networkAclId>{{ association.network_acl_id }}</networkAclId>
+ <subnetId>{{ association.subnet_id }}</subnetId>
+ </item>
+ {% endfor %}
+ </associationSet>
+ <tagSet>
+ {% for tag in network_acl.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </networkAclSet>
+</DescribeNetworkAclsResponse>
+"""
+
+CREATE_NETWORK_ACL_ENTRY_RESPONSE = """
+<CreateNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</CreateNetworkAclEntryResponse>
+"""
+
+REPLACE_NETWORK_ACL_ENTRY_RESPONSE = """
+<ReplaceNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReplaceNetworkAclEntryResponse>
+"""
+
+REPLACE_NETWORK_ACL_ASSOCIATION = """
+<ReplaceNetworkAclAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <newAssociationId>{{ association.new_association_id }}</newAssociationId>
+</ReplaceNetworkAclAssociationResponse>
+"""
+
+DELETE_NETWORK_ACL_ASSOCIATION = """
+<DeleteNetworkAclResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteNetworkAclResponse>
+"""
+
+DELETE_NETWORK_ACL_ENTRY_RESPONSE = """
+<DeleteNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteNetworkAclEntryResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/placement_groups.py b/contrib/python/moto/py2/moto/ec2/responses/placement_groups.py
new file mode 100644
index 0000000000..06930f700f
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/placement_groups.py
@@ -0,0 +1,19 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class PlacementGroups(BaseResponse):
+
+ def create_placement_group(self):
+ if self.is_not_dryrun('CreatePlacementGroup'):
+ raise NotImplementedError(
+ 'PlacementGroups.create_placement_group is not yet implemented')
+
+ def delete_placement_group(self):
+ if self.is_not_dryrun('DeletePlacementGroup'):
+ raise NotImplementedError(
+ 'PlacementGroups.delete_placement_group is not yet implemented')
+
+ def describe_placement_groups(self):
+ raise NotImplementedError(
+ 'PlacementGroups.describe_placement_groups is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/reserved_instances.py b/contrib/python/moto/py2/moto/ec2/responses/reserved_instances.py
new file mode 100644
index 0000000000..07bd6661e6
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/reserved_instances.py
@@ -0,0 +1,32 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class ReservedInstances(BaseResponse):
+
+ def cancel_reserved_instances_listing(self):
+ if self.is_not_dryrun('CancelReservedInstances'):
+ raise NotImplementedError(
+ 'ReservedInstances.cancel_reserved_instances_listing is not yet implemented')
+
+ def create_reserved_instances_listing(self):
+ if self.is_not_dryrun('CreateReservedInstances'):
+ raise NotImplementedError(
+ 'ReservedInstances.create_reserved_instances_listing is not yet implemented')
+
+ def describe_reserved_instances(self):
+ raise NotImplementedError(
+ 'ReservedInstances.describe_reserved_instances is not yet implemented')
+
+ def describe_reserved_instances_listings(self):
+ raise NotImplementedError(
+ 'ReservedInstances.describe_reserved_instances_listings is not yet implemented')
+
+ def describe_reserved_instances_offerings(self):
+ raise NotImplementedError(
+ 'ReservedInstances.describe_reserved_instances_offerings is not yet implemented')
+
+ def purchase_reserved_instances_offering(self):
+ if self.is_not_dryrun('PurchaseReservedInstances'):
+ raise NotImplementedError(
+ 'ReservedInstances.purchase_reserved_instances_offering is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/route_tables.py b/contrib/python/moto/py2/moto/ec2/responses/route_tables.py
new file mode 100644
index 0000000000..3878f325d8
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/route_tables.py
@@ -0,0 +1,233 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class RouteTables(BaseResponse):
+
+ def associate_route_table(self):
+ route_table_id = self._get_param('RouteTableId')
+ subnet_id = self._get_param('SubnetId')
+ association_id = self.ec2_backend.associate_route_table(
+ route_table_id, subnet_id)
+ template = self.response_template(ASSOCIATE_ROUTE_TABLE_RESPONSE)
+ return template.render(association_id=association_id)
+
+ def create_route(self):
+ route_table_id = self._get_param('RouteTableId')
+ destination_cidr_block = self._get_param('DestinationCidrBlock')
+ gateway_id = self._get_param('GatewayId')
+ instance_id = self._get_param('InstanceId')
+ interface_id = self._get_param('NetworkInterfaceId')
+ pcx_id = self._get_param('VpcPeeringConnectionId')
+
+ self.ec2_backend.create_route(route_table_id, destination_cidr_block,
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id)
+
+ template = self.response_template(CREATE_ROUTE_RESPONSE)
+ return template.render()
+
+ def create_route_table(self):
+ vpc_id = self._get_param('VpcId')
+ route_table = self.ec2_backend.create_route_table(vpc_id)
+ template = self.response_template(CREATE_ROUTE_TABLE_RESPONSE)
+ return template.render(route_table=route_table)
+
+ def delete_route(self):
+ route_table_id = self._get_param('RouteTableId')
+ destination_cidr_block = self._get_param('DestinationCidrBlock')
+ self.ec2_backend.delete_route(route_table_id, destination_cidr_block)
+ template = self.response_template(DELETE_ROUTE_RESPONSE)
+ return template.render()
+
+ def delete_route_table(self):
+ route_table_id = self._get_param('RouteTableId')
+ self.ec2_backend.delete_route_table(route_table_id)
+ template = self.response_template(DELETE_ROUTE_TABLE_RESPONSE)
+ return template.render()
+
+ def describe_route_tables(self):
+ route_table_ids = self._get_multi_param('RouteTableId')
+ filters = filters_from_querystring(self.querystring)
+ route_tables = self.ec2_backend.get_all_route_tables(
+ route_table_ids, filters)
+ template = self.response_template(DESCRIBE_ROUTE_TABLES_RESPONSE)
+ return template.render(route_tables=route_tables)
+
+ def disassociate_route_table(self):
+ association_id = self._get_param('AssociationId')
+ self.ec2_backend.disassociate_route_table(association_id)
+ template = self.response_template(DISASSOCIATE_ROUTE_TABLE_RESPONSE)
+ return template.render()
+
+ def replace_route(self):
+ route_table_id = self._get_param('RouteTableId')
+ destination_cidr_block = self._get_param('DestinationCidrBlock')
+ gateway_id = self._get_param('GatewayId')
+ instance_id = self._get_param('InstanceId')
+ interface_id = self._get_param('NetworkInterfaceId')
+ pcx_id = self._get_param('VpcPeeringConnectionId')
+
+ self.ec2_backend.replace_route(route_table_id, destination_cidr_block,
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id)
+
+ template = self.response_template(REPLACE_ROUTE_RESPONSE)
+ return template.render()
+
+ def replace_route_table_association(self):
+ route_table_id = self._get_param('RouteTableId')
+ association_id = self._get_param('AssociationId')
+ new_association_id = self.ec2_backend.replace_route_table_association(
+ association_id, route_table_id)
+ template = self.response_template(
+ REPLACE_ROUTE_TABLE_ASSOCIATION_RESPONSE)
+ return template.render(association_id=new_association_id)
+
+
+CREATE_ROUTE_RESPONSE = """
+<CreateRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</CreateRouteResponse>
+"""
+
+REPLACE_ROUTE_RESPONSE = """
+<ReplaceRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReplaceRouteResponse>
+"""
+
+CREATE_ROUTE_TABLE_RESPONSE = """
+<CreateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <routeTable>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <vpcId>{{ route_table.vpc_id }}</vpcId>
+ <routeSet>
+ {% for route in route_table.routes.values() %}
+ {% if route.local %}
+ <item>
+ <destinationCidrBlock>{{ route.destination_cidr_block }}</destinationCidrBlock>
+ <gatewayId>local</gatewayId>
+ <state>active</state>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </routeSet>
+ <associationSet/>
+ <tagSet>
+ {% for tag in route_table.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </routeTable>
+</CreateRouteTableResponse>
+"""
+
+DESCRIBE_ROUTE_TABLES_RESPONSE = """
+<DescribeRouteTablesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>6f570b0b-9c18-4b07-bdec-73740dcf861a</requestId>
+ <routeTableSet>
+ {% for route_table in route_tables %}
+ <item>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <vpcId>{{ route_table.vpc_id }}</vpcId>
+ <routeSet>
+ {% for route in route_table.routes.values() %}
+ <item>
+ <destinationCidrBlock>{{ route.destination_cidr_block }}</destinationCidrBlock>
+ {% if route.local %}
+ <gatewayId>local</gatewayId>
+ <origin>CreateRouteTable</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.gateway %}
+ <gatewayId>{{ route.gateway.id }}</gatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.instance %}
+ <instanceId>{{ route.instance.id }}</instanceId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.vpc_pcx %}
+ <vpcPeeringConnectionId>{{ route.vpc_pcx.id }}</vpcPeeringConnectionId>
+ <origin>CreateRoute</origin>
+ <state>blackhole</state>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </routeSet>
+ <associationSet>
+ {% for association_id,subnet_id in route_table.associations.items() %}
+ <item>
+ <routeTableAssociationId>{{ association_id }}</routeTableAssociationId>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <main>false</main>
+ <subnetId>{{ subnet_id }}</subnetId>
+ </item>
+ {% endfor %}
+ </associationSet>
+ <tagSet>
+ {% for tag in route_table.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </routeTableSet>
+</DescribeRouteTablesResponse>
+"""
+
+DELETE_ROUTE_RESPONSE = """
+<DeleteRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteRouteResponse>
+"""
+
+DELETE_ROUTE_TABLE_RESPONSE = """
+<DeleteRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteRouteTableResponse>
+"""
+
+ASSOCIATE_ROUTE_TABLE_RESPONSE = """
+<AssociateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <associationId>{{ association_id }}</associationId>
+</AssociateRouteTableResponse>
+"""
+
+DISASSOCIATE_ROUTE_TABLE_RESPONSE = """
+<DisassociateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DisassociateRouteTableResponse>
+"""
+
+REPLACE_ROUTE_TABLE_ASSOCIATION_RESPONSE = """
+<ReplaceRouteTableAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <newAssociationId>{{ association_id }}</newAssociationId>
+</ReplaceRouteTableAssociationResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/security_groups.py b/contrib/python/moto/py2/moto/ec2/responses/security_groups.py
new file mode 100644
index 0000000000..4aecfcf78b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/security_groups.py
@@ -0,0 +1,253 @@
+from __future__ import unicode_literals
+
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+def try_parse_int(value, default=None):
+ try:
+ return int(value)
+ except (TypeError, ValueError):
+ return default
+
+
+def parse_sg_attributes_from_dict(sg_attributes):
+ ip_protocol = sg_attributes.get('IpProtocol', [None])[0]
+ from_port = sg_attributes.get('FromPort', [None])[0]
+ to_port = sg_attributes.get('ToPort', [None])[0]
+
+ ip_ranges = []
+ ip_ranges_tree = sg_attributes.get('IpRanges') or {}
+ for ip_range_idx in sorted(ip_ranges_tree.keys()):
+ ip_ranges.append(ip_ranges_tree[ip_range_idx]['CidrIp'][0])
+
+ source_groups = []
+ source_group_ids = []
+ groups_tree = sg_attributes.get('Groups') or {}
+ for group_idx in sorted(groups_tree.keys()):
+ group_dict = groups_tree[group_idx]
+ if 'GroupId' in group_dict:
+ source_group_ids.append(group_dict['GroupId'][0])
+ elif 'GroupName' in group_dict:
+ source_groups.append(group_dict['GroupName'][0])
+
+ return ip_protocol, from_port, to_port, ip_ranges, source_groups, source_group_ids
+
+
+class SecurityGroups(BaseResponse):
+
+ def _process_rules_from_querystring(self):
+ group_name_or_id = (self._get_param('GroupName') or
+ self._get_param('GroupId'))
+
+ querytree = {}
+ for key, value in self.querystring.items():
+ key_splitted = key.split('.')
+ key_splitted = [try_parse_int(e, e) for e in key_splitted]
+
+ d = querytree
+ for subkey in key_splitted[:-1]:
+ if subkey not in d:
+ d[subkey] = {}
+ d = d[subkey]
+ d[key_splitted[-1]] = value
+
+ if 'IpPermissions' not in querytree:
+ # Handle single rule syntax
+ ip_protocol, from_port, to_port, ip_ranges, source_groups, source_group_ids = parse_sg_attributes_from_dict(querytree)
+ yield (group_name_or_id, ip_protocol, from_port, to_port, ip_ranges,
+ source_groups, source_group_ids)
+
+ ip_permissions = querytree.get('IpPermissions') or {}
+ for ip_permission_idx in sorted(ip_permissions.keys()):
+ ip_permission = ip_permissions[ip_permission_idx]
+
+ ip_protocol, from_port, to_port, ip_ranges, source_groups, source_group_ids = parse_sg_attributes_from_dict(ip_permission)
+
+ yield (group_name_or_id, ip_protocol, from_port, to_port, ip_ranges,
+ source_groups, source_group_ids)
+
+ def authorize_security_group_egress(self):
+ if self.is_not_dryrun('GrantSecurityGroupEgress'):
+ for args in self._process_rules_from_querystring():
+ self.ec2_backend.authorize_security_group_egress(*args)
+ return AUTHORIZE_SECURITY_GROUP_EGRESS_RESPONSE
+
+ def authorize_security_group_ingress(self):
+ if self.is_not_dryrun('GrantSecurityGroupIngress'):
+ for args in self._process_rules_from_querystring():
+ self.ec2_backend.authorize_security_group_ingress(*args)
+ return AUTHORIZE_SECURITY_GROUP_INGRESS_REPONSE
+
+ def create_security_group(self):
+ name = self._get_param('GroupName')
+ description = self._get_param('GroupDescription')
+ vpc_id = self._get_param('VpcId')
+
+ if self.is_not_dryrun('CreateSecurityGroup'):
+ group = self.ec2_backend.create_security_group(
+ name, description, vpc_id=vpc_id)
+ template = self.response_template(CREATE_SECURITY_GROUP_RESPONSE)
+ return template.render(group=group)
+
+ def delete_security_group(self):
+ # TODO this should raise an error if there are instances in the group.
+ # See
+ # http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteSecurityGroup.html
+
+ name = self._get_param('GroupName')
+ sg_id = self._get_param('GroupId')
+
+ if self.is_not_dryrun('DeleteSecurityGroup'):
+ if name:
+ self.ec2_backend.delete_security_group(name)
+ elif sg_id:
+ self.ec2_backend.delete_security_group(group_id=sg_id)
+
+ return DELETE_GROUP_RESPONSE
+
+ def describe_security_groups(self):
+ groupnames = self._get_multi_param("GroupName")
+ group_ids = self._get_multi_param("GroupId")
+ filters = filters_from_querystring(self.querystring)
+
+ groups = self.ec2_backend.describe_security_groups(
+ group_ids=group_ids,
+ groupnames=groupnames,
+ filters=filters
+ )
+
+ template = self.response_template(DESCRIBE_SECURITY_GROUPS_RESPONSE)
+ return template.render(groups=groups)
+
+ def revoke_security_group_egress(self):
+ if self.is_not_dryrun('RevokeSecurityGroupEgress'):
+ for args in self._process_rules_from_querystring():
+ success = self.ec2_backend.revoke_security_group_egress(*args)
+ if not success:
+ return "Could not find a matching egress rule", dict(status=404)
+ return REVOKE_SECURITY_GROUP_EGRESS_RESPONSE
+
+ def revoke_security_group_ingress(self):
+ if self.is_not_dryrun('RevokeSecurityGroupIngress'):
+ for args in self._process_rules_from_querystring():
+ self.ec2_backend.revoke_security_group_ingress(*args)
+ return REVOKE_SECURITY_GROUP_INGRESS_REPONSE
+
+
+CREATE_SECURITY_GROUP_RESPONSE = """<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+ <groupId>{{ group.id }}</groupId>
+</CreateSecurityGroupResponse>"""
+
+DELETE_GROUP_RESPONSE = """<DeleteSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteSecurityGroupResponse>"""
+
+DESCRIBE_SECURITY_GROUPS_RESPONSE = """<DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <securityGroupInfo>
+ {% for group in groups %}
+ <item>
+ <ownerId>123456789012</ownerId>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ <groupDescription>{{ group.description }}</groupDescription>
+ {% if group.vpc_id %}
+ <vpcId>{{ group.vpc_id }}</vpcId>
+ {% endif %}
+ <ipPermissions>
+ {% for rule in group.ingress_rules %}
+ <item>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ {% if rule.from_port %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ {% if rule.to_port %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <groups>
+ {% for source_group in rule.source_groups %}
+ <item>
+ <userId>123456789012</userId>
+ <groupId>{{ source_group.id }}</groupId>
+ <groupName>{{ source_group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groups>
+ <ipRanges>
+ {% for ip_range in rule.ip_ranges %}
+ <item>
+ <cidrIp>{{ ip_range }}</cidrIp>
+ </item>
+ {% endfor %}
+ </ipRanges>
+ </item>
+ {% endfor %}
+ </ipPermissions>
+ <ipPermissionsEgress>
+ {% for rule in group.egress_rules %}
+ <item>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ {% if rule.from_port %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ {% if rule.to_port %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <groups>
+ {% for source_group in rule.source_groups %}
+ <item>
+ <userId>123456789012</userId>
+ <groupId>{{ source_group.id }}</groupId>
+ <groupName>{{ source_group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groups>
+ <ipRanges>
+ {% for ip_range in rule.ip_ranges %}
+ <item>
+ <cidrIp>{{ ip_range }}</cidrIp>
+ </item>
+ {% endfor %}
+ </ipRanges>
+ </item>
+ {% endfor %}
+ </ipPermissionsEgress>
+ <tagSet>
+ {% for tag in group.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </securityGroupInfo>
+</DescribeSecurityGroupsResponse>"""
+
+AUTHORIZE_SECURITY_GROUP_INGRESS_REPONSE = """<AuthorizeSecurityGroupIngressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</AuthorizeSecurityGroupIngressResponse>"""
+
+REVOKE_SECURITY_GROUP_INGRESS_REPONSE = """<RevokeSecurityGroupIngressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RevokeSecurityGroupIngressResponse>"""
+
+AUTHORIZE_SECURITY_GROUP_EGRESS_RESPONSE = """
+<AuthorizeSecurityGroupEgressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</AuthorizeSecurityGroupEgressResponse>"""
+
+REVOKE_SECURITY_GROUP_EGRESS_RESPONSE = """<RevokeSecurityGroupEgressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RevokeSecurityGroupEgressResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/spot_fleets.py b/contrib/python/moto/py2/moto/ec2/responses/spot_fleets.py
new file mode 100644
index 0000000000..bb9aeb4ca4
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/spot_fleets.py
@@ -0,0 +1,161 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class SpotFleets(BaseResponse):
+
+ def cancel_spot_fleet_requests(self):
+ spot_fleet_request_ids = self._get_multi_param("SpotFleetRequestId.")
+ terminate_instances = self._get_param("TerminateInstances")
+ spot_fleets = self.ec2_backend.cancel_spot_fleet_requests(
+ spot_fleet_request_ids, terminate_instances)
+ template = self.response_template(CANCEL_SPOT_FLEETS_TEMPLATE)
+ return template.render(spot_fleets=spot_fleets)
+
+ def describe_spot_fleet_instances(self):
+ spot_fleet_request_id = self._get_param("SpotFleetRequestId")
+
+ spot_requests = self.ec2_backend.describe_spot_fleet_instances(
+ spot_fleet_request_id)
+ template = self.response_template(
+ DESCRIBE_SPOT_FLEET_INSTANCES_TEMPLATE)
+ return template.render(spot_request_id=spot_fleet_request_id, spot_requests=spot_requests)
+
+ def describe_spot_fleet_requests(self):
+ spot_fleet_request_ids = self._get_multi_param("SpotFleetRequestId.")
+
+ requests = self.ec2_backend.describe_spot_fleet_requests(
+ spot_fleet_request_ids)
+ template = self.response_template(DESCRIBE_SPOT_FLEET_TEMPLATE)
+ return template.render(requests=requests)
+
+ def modify_spot_fleet_request(self):
+ spot_fleet_request_id = self._get_param("SpotFleetRequestId")
+ target_capacity = self._get_int_param("TargetCapacity")
+ terminate_instances = self._get_param("ExcessCapacityTerminationPolicy", if_none="Default")
+ successful = self.ec2_backend.modify_spot_fleet_request(
+ spot_fleet_request_id, target_capacity, terminate_instances)
+ template = self.response_template(MODIFY_SPOT_FLEET_REQUEST_TEMPLATE)
+ return template.render(successful=successful)
+
+ def request_spot_fleet(self):
+ spot_config = self._get_dict_param("SpotFleetRequestConfig.")
+ spot_price = spot_config.get('spot_price')
+ target_capacity = spot_config['target_capacity']
+ iam_fleet_role = spot_config['iam_fleet_role']
+ allocation_strategy = spot_config['allocation_strategy']
+
+ launch_specs = self._get_list_prefix(
+ "SpotFleetRequestConfig.LaunchSpecifications")
+
+ request = self.ec2_backend.request_spot_fleet(
+ spot_price=spot_price,
+ target_capacity=target_capacity,
+ iam_fleet_role=iam_fleet_role,
+ allocation_strategy=allocation_strategy,
+ launch_specs=launch_specs,
+ )
+
+ template = self.response_template(REQUEST_SPOT_FLEET_TEMPLATE)
+ return template.render(request=request)
+
+
+REQUEST_SPOT_FLEET_TEMPLATE = """<RequestSpotFleetResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>60262cc5-2bd4-4c8d-98ed-example</requestId>
+ <spotFleetRequestId>{{ request.id }}</spotFleetRequestId>
+</RequestSpotFleetResponse>"""
+
+MODIFY_SPOT_FLEET_REQUEST_TEMPLATE = """<ModifySpotFleetRequestResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>21681fea-9987-aef3-2121-example</requestId>
+ <return>{{ 'true' if successful else 'false' }}</return>
+</ModifySpotFleetRequestResponse>"""
+
+DESCRIBE_SPOT_FLEET_TEMPLATE = """<DescribeSpotFleetRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>4d68a6cc-8f2e-4be1-b425-example</requestId>
+ <spotFleetRequestConfigSet>
+ {% for request in requests %}
+ <item>
+ <spotFleetRequestId>{{ request.id }}</spotFleetRequestId>
+ <spotFleetRequestState>{{ request.state }}</spotFleetRequestState>
+ <spotFleetRequestConfig>
+ {% if request.spot_price %}
+ <spotPrice>{{ request.spot_price }}</spotPrice>
+ {% endif %}
+ <targetCapacity>{{ request.target_capacity }}</targetCapacity>
+ <iamFleetRole>{{ request.iam_fleet_role }}</iamFleetRole>
+ <allocationStrategy>{{ request.allocation_strategy }}</allocationStrategy>
+ <fulfilledCapacity>{{ request.fulfilled_capacity }}</fulfilledCapacity>
+ <launchSpecifications>
+ {% for launch_spec in request.launch_specs %}
+ <item>
+ <subnetId>{{ launch_spec.subnet_id }}</subnetId>
+ <ebsOptimized>{{ launch_spec.ebs_optimized }}</ebsOptimized>
+ <imageId>{{ launch_spec.image_id }}</imageId>
+ <instanceType>{{ launch_spec.instance_type }}</instanceType>
+ <iamInstanceProfile><arn>{{ launch_spec.iam_instance_profile }}</arn></iamInstanceProfile>
+ <keyName>{{ launch_spec.key_name }}</keyName>
+ <monitoring><enabled>{{ launch_spec.monitoring }}</enabled></monitoring>
+ {% if launch_spec.spot_price %}
+ <spotPrice>{{ launch_spec.spot_price }}</spotPrice>
+ {% endif %}
+ <userData>{{ launch_spec.user_data }}</userData>
+ <weightedCapacity>{{ launch_spec.weighted_capacity }}</weightedCapacity>
+ <groupSet>
+ {% for group in launch_spec.group_set %}
+ <item>
+ <groupId>{{ group }}</groupId>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <tagSpecificationSet>
+ {% for resource_type in launch_spec.tag_specifications %}
+ <item>
+ <resourceType>{{ resource_type }}</resourceType>
+ <tag>
+ {% for key, value in launch_spec.tag_specifications[resource_type].items() %}
+ <item>
+ <key>{{ key }}</key>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </tag>
+ </item>
+ {% endfor %}
+ </tagSpecificationSet>
+ </item>
+ {% endfor %}
+ </launchSpecifications>
+ </spotFleetRequestConfig>
+ </item>
+ {% endfor %}
+ </spotFleetRequestConfigSet>
+</DescribeSpotFleetRequestsResponse>"""
+
+DESCRIBE_SPOT_FLEET_INSTANCES_TEMPLATE = """<DescribeSpotFleetInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>cfb09950-45e2-472d-a6a9-example</requestId>
+ <spotFleetRequestId>{{ spot_request_id }}</spotFleetRequestId>
+ <activeInstanceSet>
+ {% for spot_request in spot_requests %}
+ <item>
+ <instanceId>{{ spot_request.instance.id }}</instanceId>
+ <spotInstanceRequestId>{{ spot_request.id }}</spotInstanceRequestId>
+ <instanceType>{{ spot_request.instance.instance_type }}</instanceType>
+ </item>
+ {% endfor %}
+ </activeInstanceSet>
+</DescribeSpotFleetInstancesResponse>
+"""
+
+CANCEL_SPOT_FLEETS_TEMPLATE = """<CancelSpotFleetRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>e12d2fe5-6503-4b4b-911c-example</requestId>
+ <unsuccessfulFleetRequestSet/>
+ <successfulFleetRequestSet>
+ {% for spot_fleet in spot_fleets %}
+ <item>
+ <spotFleetRequestId>{{ spot_fleet.id }}</spotFleetRequestId>
+ <currentSpotFleetRequestState>cancelled_terminating</currentSpotFleetRequestState>
+ <previousSpotFleetRequestState>active</previousSpotFleetRequestState>
+ </item>
+ {% endfor %}
+ </successfulFleetRequestSet>
+</CancelSpotFleetRequestsResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/spot_instances.py b/contrib/python/moto/py2/moto/ec2/responses/spot_instances.py
new file mode 100644
index 0000000000..b0e80a3204
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/spot_instances.py
@@ -0,0 +1,233 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class SpotInstances(BaseResponse):
+
+ def cancel_spot_instance_requests(self):
+ request_ids = self._get_multi_param('SpotInstanceRequestId')
+ if self.is_not_dryrun('CancelSpotInstance'):
+ requests = self.ec2_backend.cancel_spot_instance_requests(
+ request_ids)
+ template = self.response_template(CANCEL_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+ def create_spot_datafeed_subscription(self):
+ if self.is_not_dryrun('CreateSpotDatafeedSubscription'):
+ raise NotImplementedError(
+ 'SpotInstances.create_spot_datafeed_subscription is not yet implemented')
+
+ def delete_spot_datafeed_subscription(self):
+ if self.is_not_dryrun('DeleteSpotDatafeedSubscription'):
+ raise NotImplementedError(
+ 'SpotInstances.delete_spot_datafeed_subscription is not yet implemented')
+
+ def describe_spot_datafeed_subscription(self):
+ raise NotImplementedError(
+ 'SpotInstances.describe_spot_datafeed_subscription is not yet implemented')
+
+ def describe_spot_instance_requests(self):
+ filters = filters_from_querystring(self.querystring)
+ requests = self.ec2_backend.describe_spot_instance_requests(
+ filters=filters)
+ template = self.response_template(DESCRIBE_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+ def describe_spot_price_history(self):
+ raise NotImplementedError(
+ 'SpotInstances.describe_spot_price_history is not yet implemented')
+
+ def request_spot_instances(self):
+ price = self._get_param('SpotPrice')
+ image_id = self._get_param('LaunchSpecification.ImageId')
+ count = self._get_int_param('InstanceCount', 1)
+ type = self._get_param('Type', 'one-time')
+ valid_from = self._get_param('ValidFrom')
+ valid_until = self._get_param('ValidUntil')
+ launch_group = self._get_param('LaunchGroup')
+ availability_zone_group = self._get_param('AvailabilityZoneGroup')
+ key_name = self._get_param('LaunchSpecification.KeyName')
+ security_groups = self._get_multi_param(
+ 'LaunchSpecification.SecurityGroup')
+ user_data = self._get_param('LaunchSpecification.UserData')
+ instance_type = self._get_param(
+ 'LaunchSpecification.InstanceType', 'm1.small')
+ placement = self._get_param(
+ 'LaunchSpecification.Placement.AvailabilityZone')
+ kernel_id = self._get_param('LaunchSpecification.KernelId')
+ ramdisk_id = self._get_param('LaunchSpecification.RamdiskId')
+ monitoring_enabled = self._get_param(
+ 'LaunchSpecification.Monitoring.Enabled')
+ subnet_id = self._get_param('LaunchSpecification.SubnetId')
+
+ if self.is_not_dryrun('RequestSpotInstance'):
+ requests = self.ec2_backend.request_spot_instances(
+ price=price,
+ image_id=image_id,
+ count=count,
+ type=type,
+ valid_from=valid_from,
+ valid_until=valid_until,
+ launch_group=launch_group,
+ availability_zone_group=availability_zone_group,
+ key_name=key_name,
+ security_groups=security_groups,
+ user_data=user_data,
+ instance_type=instance_type,
+ placement=placement,
+ kernel_id=kernel_id,
+ ramdisk_id=ramdisk_id,
+ monitoring_enabled=monitoring_enabled,
+ subnet_id=subnet_id,
+ )
+
+ template = self.response_template(REQUEST_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+
+REQUEST_SPOT_INSTANCES_TEMPLATE = """<RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <spotPrice>{{ request.price }}</spotPrice>
+ <type>{{ request.type }}</type>
+ <state>{{ request.state }}</state>
+ <status>
+ <code>pending-evaluation</code>
+ <updateTime>2015-01-01T00:00:00.000Z</updateTime>
+ <message>Your Spot request has been submitted for review, and is pending evaluation.</message>
+ </status>
+ <instanceId>{{ request.instance_id }}</instanceId>
+ <availabilityZoneGroup>{{ request.availability_zone_group }}</availabilityZoneGroup>
+ <launchSpecification>
+ <imageId>{{ request.launch_specification.image_id }}</imageId>
+ <keyName>{{ request.launch_specification.key_name }}</keyName>
+ <groupSet>
+ {% for group in request.launch_specification.groups %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <kernelId>{{ request.launch_specification.kernel }}</kernelId>
+ <ramdiskId>{{ request.launch_specification.ramdisk }}</ramdiskId>
+ <subnetId>{{ request.launch_specification.subnet_id }}</subnetId>
+ <instanceType>{{ request.launch_specification.instance_type }}</instanceType>
+ <blockDeviceMapping/>
+ <monitoring>
+ <enabled>{{ request.launch_specification.monitored }}</enabled>
+ </monitoring>
+ <ebsOptimized>{{ request.launch_specification.ebs_optimized }}</ebsOptimized>
+ <PlacementRequestType>
+ <availabilityZone>{{ request.launch_specification.placement }}</availabilityZone>
+ <groupName></groupName>
+ </PlacementRequestType>
+ </launchSpecification>
+ <launchGroup>{{ request.launch_group }}</launchGroup>
+ <createTime>2015-01-01T00:00:00.000Z</createTime>
+ {% if request.valid_from %}
+ <validFrom>{{ request.valid_from }}</validFrom>
+ {% endif %}
+ {% if request.valid_until %}
+ <validUntil>{{ request.valid_until }}</validUntil>
+ {% endif %}
+ <productDescription>Linux/UNIX</productDescription>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</RequestSpotInstancesResponse>"""
+
+DESCRIBE_SPOT_INSTANCES_TEMPLATE = """<DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <spotPrice>{{ request.price }}</spotPrice>
+ <type>{{ request.type }}</type>
+ <state>{{ request.state }}</state>
+ <status>
+ <code>pending-evaluation</code>
+ <updateTime>2015-01-01T00:00:00.000Z</updateTime>
+ <message>Your Spot request has been submitted for review, and is pending evaluation.</message>
+ </status>
+ <instanceId>{{ request.instance_id }}</instanceId>
+ {% if request.availability_zone_group %}
+ <availabilityZoneGroup>{{ request.availability_zone_group }}</availabilityZoneGroup>
+ {% endif %}
+ <launchSpecification>
+ <imageId>{{ request.launch_specification.image_id }}</imageId>
+ {% if request.launch_specification.key_name %}
+ <keyName>{{ request.launch_specification.key_name }}</keyName>
+ {% endif %}
+ <groupSet>
+ {% for group in request.launch_specification.groups %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if request.launch_specification.kernel %}
+ <kernelId>{{ request.launch_specification.kernel }}</kernelId>
+ {% endif %}
+ {% if request.launch_specification.ramdisk %}
+ <ramdiskId>{{ request.launch_specification.ramdisk }}</ramdiskId>
+ {% endif %}
+ {% if request.launch_specification.subnet_id %}
+ <subnetId>{{ request.launch_specification.subnet_id }}</subnetId>
+ {% endif %}
+ <instanceType>{{ request.launch_specification.instance_type }}</instanceType>
+ <blockDeviceMapping/>
+ <monitoring>
+ <enabled>{{ request.launch_specification.monitored }}</enabled>
+ </monitoring>
+ <ebsOptimized>{{ request.launch_specification.ebs_optimized }}</ebsOptimized>
+ {% if request.launch_specification.placement %}
+ <PlacementRequestType>
+ <availabilityZone>{{ request.launch_specification.placement }}</availabilityZone>
+ <groupName></groupName>
+ </PlacementRequestType>
+ {% endif %}
+ </launchSpecification>
+ <tagSet>
+ {% for tag in request.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% if request.launch_group %}
+ <launchGroup>{{ request.launch_group }}</launchGroup>
+ {% endif %}
+ <createTime>2015-01-01T00:00:00.000Z</createTime>
+ {% if request.valid_from %}
+ <validFrom>{{ request.valid_from }}</validFrom>
+ {% endif %}
+ {% if request.valid_until %}
+ <validUntil>{{ request.valid_until }}</validUntil>
+ {% endif %}
+ <productDescription>Linux/UNIX</productDescription>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</DescribeSpotInstanceRequestsResponse>"""
+
+CANCEL_SPOT_INSTANCES_TEMPLATE = """<CancelSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <state>cancelled</state>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</CancelSpotInstanceRequestsResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/subnets.py b/contrib/python/moto/py2/moto/ec2/responses/subnets.py
new file mode 100644
index 0000000000..ba4f78a5e5
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/subnets.py
@@ -0,0 +1,105 @@
+from __future__ import unicode_literals
+import random
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class Subnets(BaseResponse):
+
+ def create_subnet(self):
+ vpc_id = self._get_param('VpcId')
+ cidr_block = self._get_param('CidrBlock')
+ availability_zone = self._get_param(
+ 'AvailabilityZone', if_none=random.choice(
+ self.ec2_backend.describe_availability_zones()).name)
+ subnet = self.ec2_backend.create_subnet(
+ vpc_id,
+ cidr_block,
+ availability_zone,
+ )
+ template = self.response_template(CREATE_SUBNET_RESPONSE)
+ return template.render(subnet=subnet)
+
+ def delete_subnet(self):
+ subnet_id = self._get_param('SubnetId')
+ subnet = self.ec2_backend.delete_subnet(subnet_id)
+ template = self.response_template(DELETE_SUBNET_RESPONSE)
+ return template.render(subnet=subnet)
+
+ def describe_subnets(self):
+ subnet_ids = self._get_multi_param('SubnetId')
+ filters = filters_from_querystring(self.querystring)
+ subnets = self.ec2_backend.get_all_subnets(subnet_ids, filters)
+ template = self.response_template(DESCRIBE_SUBNETS_RESPONSE)
+ return template.render(subnets=subnets)
+
+ def modify_subnet_attribute(self):
+ subnet_id = self._get_param('SubnetId')
+ map_public_ip = self._get_param('MapPublicIpOnLaunch.Value')
+ self.ec2_backend.modify_subnet_attribute(subnet_id, map_public_ip)
+ return MODIFY_SUBNET_ATTRIBUTE_RESPONSE
+
+
+CREATE_SUBNET_RESPONSE = """
+<CreateSubnetResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <subnet>
+ <subnetId>{{ subnet.id }}</subnetId>
+ <state>pending</state>
+ <vpcId>{{ subnet.vpc_id }}</vpcId>
+ <cidrBlock>{{ subnet.cidr_block }}</cidrBlock>
+ <availableIpAddressCount>251</availableIpAddressCount>
+ <availabilityZone>{{ subnet.availability_zone }}</availabilityZone>
+ <tagSet>
+ {% for tag in subnet.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </subnet>
+</CreateSubnetResponse>"""
+
+DELETE_SUBNET_RESPONSE = """
+<DeleteSubnetResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteSubnetResponse>"""
+
+DESCRIBE_SUBNETS_RESPONSE = """
+<DescribeSubnetsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <subnetSet>
+ {% for subnet in subnets %}
+ <item>
+ <subnetId>{{ subnet.id }}</subnetId>
+ <state>available</state>
+ <vpcId>{{ subnet.vpc_id }}</vpcId>
+ <cidrBlock>{{ subnet.cidr_block }}</cidrBlock>
+ <availableIpAddressCount>251</availableIpAddressCount>
+ <availabilityZone>{{ subnet.availability_zone }}</availabilityZone>
+ <defaultForAz>{{ subnet.default_for_az }}</defaultForAz>
+ <mapPublicIpOnLaunch>{{ subnet.map_public_ip_on_launch }}</mapPublicIpOnLaunch>
+ <tagSet>
+ {% for tag in subnet.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </subnetSet>
+</DescribeSubnetsResponse>"""
+
+MODIFY_SUBNET_ATTRIBUTE_RESPONSE = """
+<ModifySubnetAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</ModifySubnetAttributeResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/tags.py b/contrib/python/moto/py2/moto/ec2/responses/tags.py
new file mode 100644
index 0000000000..65d3da2554
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/tags.py
@@ -0,0 +1,56 @@
+from __future__ import unicode_literals
+
+from moto.core.responses import BaseResponse
+from moto.ec2.models import validate_resource_ids
+from moto.ec2.utils import tags_from_query_string, filters_from_querystring
+
+
+class TagResponse(BaseResponse):
+
+ def create_tags(self):
+ resource_ids = self._get_multi_param('ResourceId')
+ validate_resource_ids(resource_ids)
+ self.ec2_backend.do_resources_exist(resource_ids)
+ tags = tags_from_query_string(self.querystring)
+ if self.is_not_dryrun('CreateTags'):
+ self.ec2_backend.create_tags(resource_ids, tags)
+ return CREATE_RESPONSE
+
+ def delete_tags(self):
+ resource_ids = self._get_multi_param('ResourceId')
+ validate_resource_ids(resource_ids)
+ tags = tags_from_query_string(self.querystring)
+ if self.is_not_dryrun('DeleteTags'):
+ self.ec2_backend.delete_tags(resource_ids, tags)
+ return DELETE_RESPONSE
+
+ def describe_tags(self):
+ filters = filters_from_querystring(querystring_dict=self.querystring)
+ tags = self.ec2_backend.describe_tags(filters=filters)
+ template = self.response_template(DESCRIBE_RESPONSE)
+ return template.render(tags=tags)
+
+
+CREATE_RESPONSE = """<CreateTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</CreateTagsResponse>"""
+
+DELETE_RESPONSE = """<DeleteTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteTagsResponse>"""
+
+DESCRIBE_RESPONSE = """<DescribeTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <tagSet>
+ {% for tag in tags %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</DescribeTagsResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/virtual_private_gateways.py b/contrib/python/moto/py2/moto/ec2/responses/virtual_private_gateways.py
new file mode 100644
index 0000000000..75de31b935
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/virtual_private_gateways.py
@@ -0,0 +1,124 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class VirtualPrivateGateways(BaseResponse):
+
+ def attach_vpn_gateway(self):
+ vpn_gateway_id = self._get_param('VpnGatewayId')
+ vpc_id = self._get_param('VpcId')
+ attachment = self.ec2_backend.attach_vpn_gateway(
+ vpn_gateway_id,
+ vpc_id
+ )
+ template = self.response_template(ATTACH_VPN_GATEWAY_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def create_vpn_gateway(self):
+ type = self._get_param('Type')
+ vpn_gateway = self.ec2_backend.create_vpn_gateway(type)
+ template = self.response_template(CREATE_VPN_GATEWAY_RESPONSE)
+ return template.render(vpn_gateway=vpn_gateway)
+
+ def delete_vpn_gateway(self):
+ vpn_gateway_id = self._get_param('VpnGatewayId')
+ vpn_gateway = self.ec2_backend.delete_vpn_gateway(vpn_gateway_id)
+ template = self.response_template(DELETE_VPN_GATEWAY_RESPONSE)
+ return template.render(vpn_gateway=vpn_gateway)
+
+ def describe_vpn_gateways(self):
+ filters = filters_from_querystring(self.querystring)
+ vpn_gateways = self.ec2_backend.get_all_vpn_gateways(filters)
+ template = self.response_template(DESCRIBE_VPN_GATEWAYS_RESPONSE)
+ return template.render(vpn_gateways=vpn_gateways)
+
+ def detach_vpn_gateway(self):
+ vpn_gateway_id = self._get_param('VpnGatewayId')
+ vpc_id = self._get_param('VpcId')
+ attachment = self.ec2_backend.detach_vpn_gateway(
+ vpn_gateway_id,
+ vpc_id
+ )
+ template = self.response_template(DETACH_VPN_GATEWAY_RESPONSE)
+ return template.render(attachment=attachment)
+
+
+CREATE_VPN_GATEWAY_RESPONSE = """
+<CreateVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnGateway>
+ <vpnGatewayId>{{ vpn_gateway.id }}</vpnGatewayId>
+ <state>available</state>
+ <type>{{ vpn_gateway.type }}</type>
+ <availabilityZone>us-east-1a</availabilityZone>
+ <attachments/>
+ <tagSet>
+ {% for tag in vpn_gateway.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpnGateway>
+</CreateVpnGatewayResponse>"""
+
+DESCRIBE_VPN_GATEWAYS_RESPONSE = """
+<DescribeVpnGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnGatewaySet>
+ {% for vpn_gateway in vpn_gateways %}
+ <item>
+ <vpnGatewayId>{{ vpn_gateway.id }}</vpnGatewayId>
+ <state>available</state>
+ <type>{{ vpn_gateway.id }}</type>
+ <availabilityZone>us-east-1a</availabilityZone>
+ <attachments>
+ {% for attachment in vpn_gateway.attachments.values() %}
+ <item>
+ <vpcId>{{ attachment.vpc_id }}</vpcId>
+ <state>{{ attachment.state }}</state>
+ </item>
+ {% endfor %}
+ </attachments>
+ <tagSet/>
+ <tagSet>
+ {% for tag in vpn_gateway.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpnGatewaySet>
+</DescribeVpnGatewaysResponse>"""
+
+ATTACH_VPN_GATEWAY_RESPONSE = """
+<AttachVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <attachment>
+ <vpcId>{{ attachment.vpc_id }}</vpcId>
+ <state>{{ attachment.state }}</state>
+ </attachment>
+</AttachVpnGatewayResponse>"""
+
+DELETE_VPN_GATEWAY_RESPONSE = """
+<DeleteVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpnGatewayResponse>
+"""
+
+DETACH_VPN_GATEWAY_RESPONSE = """
+<DetachVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DetachVpnGatewayResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/vm_export.py b/contrib/python/moto/py2/moto/ec2/responses/vm_export.py
new file mode 100644
index 0000000000..6fdf59ba31
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/vm_export.py
@@ -0,0 +1,17 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class VMExport(BaseResponse):
+
+ def cancel_export_task(self):
+ raise NotImplementedError(
+ 'VMExport.cancel_export_task is not yet implemented')
+
+ def create_instance_export_task(self):
+ raise NotImplementedError(
+ 'VMExport.create_instance_export_task is not yet implemented')
+
+ def describe_export_tasks(self):
+ raise NotImplementedError(
+ 'VMExport.describe_export_tasks is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/vm_import.py b/contrib/python/moto/py2/moto/ec2/responses/vm_import.py
new file mode 100644
index 0000000000..8c2ba138c9
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/vm_import.py
@@ -0,0 +1,21 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class VMImport(BaseResponse):
+
+ def cancel_conversion_task(self):
+ raise NotImplementedError(
+ 'VMImport.cancel_conversion_task is not yet implemented')
+
+ def describe_conversion_tasks(self):
+ raise NotImplementedError(
+ 'VMImport.describe_conversion_tasks is not yet implemented')
+
+ def import_instance(self):
+ raise NotImplementedError(
+ 'VMImport.import_instance is not yet implemented')
+
+ def import_volume(self):
+ raise NotImplementedError(
+ 'VMImport.import_volume is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/responses/vpc_peering_connections.py b/contrib/python/moto/py2/moto/ec2/responses/vpc_peering_connections.py
new file mode 100644
index 0000000000..49d7528933
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/vpc_peering_connections.py
@@ -0,0 +1,140 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class VPCPeeringConnections(BaseResponse):
+
+ def create_vpc_peering_connection(self):
+ peer_region = self._get_param('PeerRegion')
+ if peer_region == self.region or peer_region is None:
+ peer_vpc = self.ec2_backend.get_vpc(self._get_param('PeerVpcId'))
+ else:
+ peer_vpc = self.ec2_backend.get_cross_vpc(self._get_param('PeerVpcId'), peer_region)
+ vpc = self.ec2_backend.get_vpc(self._get_param('VpcId'))
+ vpc_pcx = self.ec2_backend.create_vpc_peering_connection(vpc, peer_vpc)
+ template = self.response_template(
+ CREATE_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def delete_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param('VpcPeeringConnectionId')
+ vpc_pcx = self.ec2_backend.delete_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(
+ DELETE_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def describe_vpc_peering_connections(self):
+ vpc_pcxs = self.ec2_backend.get_all_vpc_peering_connections()
+ template = self.response_template(
+ DESCRIBE_VPC_PEERING_CONNECTIONS_RESPONSE)
+ return template.render(vpc_pcxs=vpc_pcxs)
+
+ def accept_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param('VpcPeeringConnectionId')
+ vpc_pcx = self.ec2_backend.accept_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(
+ ACCEPT_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def reject_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param('VpcPeeringConnectionId')
+ self.ec2_backend.reject_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(
+ REJECT_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render()
+
+
+CREATE_VPC_PEERING_CONNECTION_RESPONSE = """
+<CreateVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnection>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>777788889999</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>false</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>false</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>false</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>123456789012</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ </accepterVpcInfo>
+ <status>
+ <code>initiating-request</code>
+ <message>Initiating Request to {accepter ID}</message>
+ </status>
+ <expirationTime>2014-02-18T14:37:25.000Z</expirationTime>
+ <tagSet/>
+ </vpcPeeringConnection>
+</CreateVpcPeeringConnectionResponse>
+"""
+
+DESCRIBE_VPC_PEERING_CONNECTIONS_RESPONSE = """
+<DescribeVpcPeeringConnectionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnectionSet>
+ {% for vpc_pcx in vpc_pcxs %}
+ <item>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>777788889999</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>123456789012</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ </accepterVpcInfo>
+ <status>
+ <code>{{ vpc_pcx._status.code }}</code>
+ <message>{{ vpc_pcx._status.message }}</message>
+ </status>
+ <expirationTime>2014-02-17T16:00:50.000Z</expirationTime>
+ <tagSet/>
+ </item>
+ {% endfor %}
+ </vpcPeeringConnectionSet>
+</DescribeVpcPeeringConnectionsResponse>
+"""
+
+DELETE_VPC_PEERING_CONNECTION_RESPONSE = """
+<DeleteVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpcPeeringConnectionResponse>
+"""
+
+ACCEPT_VPC_PEERING_CONNECTION_RESPONSE = """
+<AcceptVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnection>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>123456789012</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>777788889999</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.peer_vpc.cidr_block }}</cidrBlock>
+ </accepterVpcInfo>
+ <status>
+ <code>{{ vpc_pcx._status.code }}</code>
+ <message>{{ vpc_pcx._status.message }}</message>
+ </status>
+ <tagSet/>
+ </vpcPeeringConnection>
+</AcceptVpcPeeringConnectionResponse>
+"""
+
+REJECT_VPC_PEERING_CONNECTION_RESPONSE = """
+<RejectVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</RejectVpcPeeringConnectionResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/vpcs.py b/contrib/python/moto/py2/moto/ec2/responses/vpcs.py
new file mode 100644
index 0000000000..88673d863b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/vpcs.py
@@ -0,0 +1,247 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.core.utils import camelcase_to_underscores
+from moto.ec2.utils import filters_from_querystring
+
+
+class VPCs(BaseResponse):
+
+ def create_vpc(self):
+ cidr_block = self._get_param('CidrBlock')
+ instance_tenancy = self._get_param('InstanceTenancy', if_none='default')
+ amazon_provided_ipv6_cidr_blocks = self._get_param('AmazonProvidedIpv6CidrBlock')
+ vpc = self.ec2_backend.create_vpc(cidr_block, instance_tenancy,
+ amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_blocks)
+ doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15'
+ template = self.response_template(CREATE_VPC_RESPONSE)
+ return template.render(vpc=vpc, doc_date=doc_date)
+
+ def delete_vpc(self):
+ vpc_id = self._get_param('VpcId')
+ vpc = self.ec2_backend.delete_vpc(vpc_id)
+ template = self.response_template(DELETE_VPC_RESPONSE)
+ return template.render(vpc=vpc)
+
+ def describe_vpcs(self):
+ vpc_ids = self._get_multi_param('VpcId')
+ filters = filters_from_querystring(self.querystring)
+ vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters)
+ doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15'
+ template = self.response_template(DESCRIBE_VPCS_RESPONSE)
+ return template.render(vpcs=vpcs, doc_date=doc_date)
+
+ def describe_vpc_attribute(self):
+ vpc_id = self._get_param('VpcId')
+ attribute = self._get_param('Attribute')
+ attr_name = camelcase_to_underscores(attribute)
+ value = self.ec2_backend.describe_vpc_attribute(vpc_id, attr_name)
+ template = self.response_template(DESCRIBE_VPC_ATTRIBUTE_RESPONSE)
+ return template.render(vpc_id=vpc_id, attribute=attribute, value=value)
+
+ def modify_vpc_attribute(self):
+ vpc_id = self._get_param('VpcId')
+
+ for attribute in ('EnableDnsSupport', 'EnableDnsHostnames'):
+ if self.querystring.get('%s.Value' % attribute):
+ attr_name = camelcase_to_underscores(attribute)
+ attr_value = self.querystring.get('%s.Value' % attribute)[0]
+ self.ec2_backend.modify_vpc_attribute(
+ vpc_id, attr_name, attr_value)
+ return MODIFY_VPC_ATTRIBUTE_RESPONSE
+
+ def associate_vpc_cidr_block(self):
+ vpc_id = self._get_param('VpcId')
+ amazon_provided_ipv6_cidr_blocks = self._get_param('AmazonProvidedIpv6CidrBlock')
+ # todo test on AWS if can create an association for IPV4 and IPV6 in the same call?
+ cidr_block = self._get_param('CidrBlock') if not amazon_provided_ipv6_cidr_blocks else None
+ value = self.ec2_backend.associate_vpc_cidr_block(vpc_id, cidr_block, amazon_provided_ipv6_cidr_blocks)
+ if not amazon_provided_ipv6_cidr_blocks:
+ render_template = ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ else:
+ render_template = IPV6_ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ template = self.response_template(render_template)
+ return template.render(vpc_id=vpc_id, value=value, cidr_block=value['cidr_block'],
+ association_id=value['association_id'], cidr_block_state='associating')
+
+ def disassociate_vpc_cidr_block(self):
+ association_id = self._get_param('AssociationId')
+ value = self.ec2_backend.disassociate_vpc_cidr_block(association_id)
+ if "::" in value.get('cidr_block', ''):
+ render_template = IPV6_DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ else:
+ render_template = DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ template = self.response_template(render_template)
+ return template.render(vpc_id=value['vpc_id'], cidr_block=value['cidr_block'],
+ association_id=value['association_id'], cidr_block_state='disassociating')
+
+
+CREATE_VPC_RESPONSE = """
+<CreateVpcResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpc>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <state>pending</state>
+ <cidrBlock>{{ vpc.cidr_block }}</cidrBlock>
+ {% if doc_date == "2016-11-15" %}
+ <cidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set() %}
+ <item>
+ <cidrBlock>{{assoc.cidr_block}}</cidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <cidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </cidrBlockState>
+ </item>
+ {% endfor %}
+ </cidrBlockAssociationSet>
+ <ipv6CidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set(ipv6=True) %}
+ <item>
+ <ipv6CidrBlock>{{assoc.cidr_block}}</ipv6CidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ {% endif %}
+ <dhcpOptionsId>{% if vpc.dhcp_options %}{{ vpc.dhcp_options.id }}{% else %}dopt-1a2b3c4d2{% endif %}</dhcpOptionsId>
+ <instanceTenancy>{{ vpc.instance_tenancy }}</instanceTenancy>
+ <tagSet>
+ {% for tag in vpc.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpc>
+</CreateVpcResponse>"""
+
+DESCRIBE_VPCS_RESPONSE = """
+<DescribeVpcsResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <vpcSet>
+ {% for vpc in vpcs %}
+ <item>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <state>{{ vpc.state }}</state>
+ <cidrBlock>{{ vpc.cidr_block }}</cidrBlock>
+ {% if doc_date == "2016-11-15" %}
+ <cidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set() %}
+ <item>
+ <cidrBlock>{{assoc.cidr_block}}</cidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <cidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </cidrBlockState>
+ </item>
+ {% endfor %}
+ </cidrBlockAssociationSet>
+ <ipv6CidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set(ipv6=True) %}
+ <item>
+ <ipv6CidrBlock>{{assoc.cidr_block}}</ipv6CidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ {% endif %}
+ <dhcpOptionsId>{% if vpc.dhcp_options %}{{ vpc.dhcp_options.id }}{% else %}dopt-7a8b9c2d{% endif %}</dhcpOptionsId>
+ <instanceTenancy>{{ vpc.instance_tenancy }}</instanceTenancy>
+ <isDefault>{{ vpc.is_default }}</isDefault>
+ <tagSet>
+ {% for tag in vpc.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpcSet>
+</DescribeVpcsResponse>"""
+
+DELETE_VPC_RESPONSE = """
+<DeleteVpcResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpcResponse>
+"""
+
+DESCRIBE_VPC_ATTRIBUTE_RESPONSE = """
+<DescribeVpcAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{ vpc_id }}</vpcId>
+ <{{ attribute }}>
+ <value>{{ value }}</value>
+ </{{ attribute }}>
+</DescribeVpcAttributeResponse>"""
+
+MODIFY_VPC_ATTRIBUTE_RESPONSE = """
+<ModifyVpcAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</ModifyVpcAttributeResponse>"""
+
+ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<AssociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <cidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <cidrBlock>{{cidr_block}}</cidrBlock>
+ <cidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </cidrBlockState>
+ </cidrBlockAssociation>
+</AssociateVpcCidrBlockResponse>"""
+
+DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<DisassociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <cidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <cidrBlock>{{cidr_block}}</cidrBlock>
+ <cidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </cidrBlockState>
+ </cidrBlockAssociation>
+</DisassociateVpcCidrBlockResponse>"""
+
+IPV6_ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<AssociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>33af6c54-1139-4d50-b4f7-15a8example</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <ipv6CidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <ipv6CidrBlock>{{cidr_block}}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </ipv6CidrBlockState>
+ </ipv6CidrBlockAssociation>
+</AssociateVpcCidrBlockResponse>"""
+
+IPV6_DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<DisassociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>33af6c54-1139-4d50-b4f7-15a8example</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <ipv6CidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <ipv6CidrBlock>{{cidr_block}}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </ipv6CidrBlockState>
+ </ipv6CidrBlockAssociation>
+</DisassociateVpcCidrBlockResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/vpn_connections.py b/contrib/python/moto/py2/moto/ec2/responses/vpn_connections.py
new file mode 100644
index 0000000000..276e3ca999
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/vpn_connections.py
@@ -0,0 +1,324 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import filters_from_querystring
+
+
+class VPNConnections(BaseResponse):
+
+ def create_vpn_connection(self):
+ type = self._get_param('Type')
+ cgw_id = self._get_param('CustomerGatewayId')
+ vgw_id = self._get_param('VPNGatewayId')
+ static_routes = self._get_param('StaticRoutesOnly')
+ vpn_connection = self.ec2_backend.create_vpn_connection(
+ type, cgw_id, vgw_id, static_routes_only=static_routes)
+ template = self.response_template(CREATE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connection=vpn_connection)
+
+ def delete_vpn_connection(self):
+ vpn_connection_id = self._get_param('VpnConnectionId')
+ vpn_connection = self.ec2_backend.delete_vpn_connection(
+ vpn_connection_id)
+ template = self.response_template(DELETE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connection=vpn_connection)
+
+ def describe_vpn_connections(self):
+ vpn_connection_ids = self._get_multi_param('VpnConnectionId')
+ filters = filters_from_querystring(self.querystring)
+ vpn_connections = self.ec2_backend.get_all_vpn_connections(
+ vpn_connection_ids=vpn_connection_ids, filters=filters)
+ template = self.response_template(DESCRIBE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connections=vpn_connections)
+
+
+CREATE_VPN_CONNECTION_RESPONSE = """
+<CreateVpnConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnConnection>
+ <vpnConnectionId>{{ vpn_connection.id }}</vpnConnectionId>
+ <state>pending</state>
+ <customerGatewayConfiguration>
+ <vpn_connection id="{{ vpn_connection.id }}">
+ <customer_gateway_id>{{ vpn_connection.customer_gateway_id }}</customer_gateway_id>
+ <vpn_gateway_id>{{ vpn_connection.vpn_gateway_id }}</vpn_gateway_id>
+ <vpn_connection_type>ipsec.1</vpn_connection_type>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ </vpn_connection>
+ </customerGatewayConfiguration>
+ <type>ipsec.1</type>
+ <customerGatewayId>{{ vpn_connection.customer_gateway_id }}</customerGatewayId>
+ <vpnGatewayId>{{ vpn_connection.vpn_gateway_id }}</vpnGatewayId>
+ <tagSet>
+ {% for tag in vpn_connection.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpnConnection>
+</CreateVpnConnectionResponse>"""
+
+CREATE_VPN_CONNECTION_ROUTE_RESPONSE = """
+<CreateVpnConnectionRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10- 15/">
+ <requestId>4f35a1b2-c2c3-4093-b51f-abb9d7311990</requestId>
+ <return>true</return>
+</CreateVpnConnectionRouteResponse>"""
+
+DELETE_VPN_CONNECTION_RESPONSE = """
+<DeleteVpnConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpnConnectionResponse>"""
+
+DELETE_VPN_CONNECTION_ROUTE_RESPONSE = """
+<DeleteVpnConnectionRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10- 15/">
+ <requestId>4f35a1b2-c2c3-4093-b51f-abb9d7311990</requestId>
+ <return>true</return>
+</DeleteVpnConnectionRouteResponse>"""
+
+DESCRIBE_VPN_CONNECTION_RESPONSE = """
+<DescribeVpnConnectionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnConnectionSet>
+ {% for vpn_connection in vpn_connections %}
+ <item>
+ <vpnConnectionId>{{ vpn_connection.id }}</vpnConnectionId>
+ <state>available</state>
+ <customerGatewayConfiguration>
+ <vpn_connection id="{{ vpn_connection.id }}">
+ <customer_gateway_id>{{ vpn_connection.customer_gateway_id }}</customer_gateway_id>
+ <vpn_gateway_id>{{ vpn_connection.vpn_gateway_id }}</vpn_gateway_id>
+ <vpn_connection_type>ipsec.1</vpn_connection_type>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ </vpn_connection>
+ </customerGatewayConfiguration>
+ <type>ipsec.1</type>
+ <customerGatewayId>{{ vpn_connection.customer_gateway_id }}</customerGatewayId>
+ <vpnGatewayId>{{ vpn_connection.vpn_gateway_id }}</vpnGatewayId>
+ <tagSet>
+ {% for tag in vpn_connection.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpnConnectionSet>
+</DescribeVpnConnectionsResponse>"""
diff --git a/contrib/python/moto/py2/moto/ec2/responses/windows.py b/contrib/python/moto/py2/moto/ec2/responses/windows.py
new file mode 100644
index 0000000000..13dfa9b672
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/responses/windows.py
@@ -0,0 +1,21 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+
+
+class Windows(BaseResponse):
+
+ def bundle_instance(self):
+ raise NotImplementedError(
+ 'Windows.bundle_instance is not yet implemented')
+
+ def cancel_bundle_task(self):
+ raise NotImplementedError(
+ 'Windows.cancel_bundle_task is not yet implemented')
+
+ def describe_bundle_tasks(self):
+ raise NotImplementedError(
+ 'Windows.describe_bundle_tasks is not yet implemented')
+
+ def get_password_data(self):
+ raise NotImplementedError(
+ 'Windows.get_password_data is not yet implemented')
diff --git a/contrib/python/moto/py2/moto/ec2/urls.py b/contrib/python/moto/py2/moto/ec2/urls.py
new file mode 100644
index 0000000000..241ab71334
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/urls.py
@@ -0,0 +1,11 @@
+from __future__ import unicode_literals
+from .responses import EC2Response
+
+
+url_bases = [
+ "https?://ec2.(.+).amazonaws.com(|.cn)",
+]
+
+url_paths = {
+ '{0}/': EC2Response.dispatch,
+}
diff --git a/contrib/python/moto/py2/moto/ec2/utils.py b/contrib/python/moto/py2/moto/ec2/utils.py
new file mode 100644
index 0000000000..f5c9b8512b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/ec2/utils.py
@@ -0,0 +1,537 @@
+from __future__ import unicode_literals
+
+import fnmatch
+import random
+import re
+import six
+
+EC2_RESOURCE_TO_PREFIX = {
+ 'customer-gateway': 'cgw',
+ 'dhcp-options': 'dopt',
+ 'image': 'ami',
+ 'instance': 'i',
+ 'internet-gateway': 'igw',
+ 'nat-gateway': 'nat',
+ 'network-acl': 'acl',
+ 'network-acl-subnet-assoc': 'aclassoc',
+ 'network-interface': 'eni',
+ 'network-interface-attachment': 'eni-attach',
+ 'reserved-instance': 'uuid4',
+ 'route-table': 'rtb',
+ 'route-table-association': 'rtbassoc',
+ 'security-group': 'sg',
+ 'snapshot': 'snap',
+ 'spot-instance-request': 'sir',
+ 'spot-fleet-request': 'sfr',
+ 'subnet': 'subnet',
+ 'reservation': 'r',
+ 'volume': 'vol',
+ 'vpc': 'vpc',
+ 'vpc-cidr-association-id': 'vpc-cidr-assoc',
+ 'vpc-elastic-ip': 'eipalloc',
+ 'vpc-elastic-ip-association': 'eipassoc',
+ 'vpc-peering-connection': 'pcx',
+ 'vpn-connection': 'vpn',
+ 'vpn-gateway': 'vgw'}
+
+
+EC2_PREFIX_TO_RESOURCE = dict((v, k) for (k, v) in EC2_RESOURCE_TO_PREFIX.items())
+
+
+def random_resource_id(size=8):
+ chars = list(range(10)) + ['a', 'b', 'c', 'd', 'e', 'f']
+ resource_id = ''.join(six.text_type(random.choice(chars)) for x in range(size))
+ return resource_id
+
+
+def random_id(prefix='', size=8):
+ return '{0}-{1}'.format(prefix, random_resource_id(size))
+
+
+def random_ami_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['image'])
+
+
+def random_instance_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['instance'], size=17)
+
+
+def random_reservation_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['reservation'])
+
+
+def random_security_group_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['security-group'])
+
+
+def random_snapshot_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['snapshot'])
+
+
+def random_spot_request_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['spot-instance-request'])
+
+
+def random_spot_fleet_request_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['spot-fleet-request'])
+
+
+def random_subnet_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['subnet'])
+
+
+def random_subnet_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['route-table-association'])
+
+
+def random_network_acl_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['network-acl'])
+
+
+def random_network_acl_subnet_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['network-acl-subnet-assoc'])
+
+
+def random_vpn_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpn-gateway'])
+
+
+def random_vpn_connection_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpn-connection'])
+
+
+def random_customer_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['customer-gateway'])
+
+
+def random_volume_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['volume'])
+
+
+def random_vpc_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpc'])
+
+
+def random_vpc_cidr_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpc-cidr-association-id'])
+
+
+def random_vpc_peering_connection_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpc-peering-connection'])
+
+
+def random_eip_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpc-elastic-ip-association'])
+
+
+def random_internet_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['internet-gateway'])
+
+
+def random_route_table_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['route-table'])
+
+
+def random_eip_allocation_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['vpc-elastic-ip'])
+
+
+def random_dhcp_option_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['dhcp-options'])
+
+
+def random_eni_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['network-interface'])
+
+
+def random_eni_attach_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['network-interface-attachment'])
+
+
+def random_nat_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX['nat-gateway'], size=17)
+
+
+def random_public_ip():
+ return '54.214.{0}.{1}'.format(random.choice(range(255)),
+ random.choice(range(255)))
+
+
+def random_private_ip():
+ return '10.{0}.{1}.{2}'.format(random.choice(range(255)),
+ random.choice(range(255)),
+ random.choice(range(255)))
+
+
+def random_ip():
+ return "127.{0}.{1}.{2}".format(
+ random.randint(0, 255),
+ random.randint(0, 255),
+ random.randint(0, 255)
+ )
+
+
+def random_ipv6_cidr():
+ return "2400:6500:{}:{}::/56".format(random_resource_id(4), random_resource_id(4))
+
+
+def generate_route_id(route_table_id, cidr_block):
+ return "%s~%s" % (route_table_id, cidr_block)
+
+
+def split_route_id(route_id):
+ values = route_id.split('~')
+ return values[0], values[1]
+
+
+def tags_from_query_string(querystring_dict):
+ prefix = 'Tag'
+ suffix = 'Key'
+ response_values = {}
+ for key, value in querystring_dict.items():
+ if key.startswith(prefix) and key.endswith(suffix):
+ tag_index = key.replace(prefix + ".", "").replace("." + suffix, "")
+ tag_key = querystring_dict.get("Tag.{0}.Key".format(tag_index))[0]
+ tag_value_key = "Tag.{0}.Value".format(tag_index)
+ if tag_value_key in querystring_dict:
+ response_values[tag_key] = querystring_dict.get(tag_value_key)[
+ 0]
+ else:
+ response_values[tag_key] = None
+ return response_values
+
+
+def dhcp_configuration_from_querystring(querystring, option=u'DhcpConfiguration'):
+ """
+ turn:
+ {u'AWSAccessKeyId': [u'the_key'],
+ u'Action': [u'CreateDhcpOptions'],
+ u'DhcpConfiguration.1.Key': [u'domain-name'],
+ u'DhcpConfiguration.1.Value.1': [u'example.com'],
+ u'DhcpConfiguration.2.Key': [u'domain-name-servers'],
+ u'DhcpConfiguration.2.Value.1': [u'10.0.0.6'],
+ u'DhcpConfiguration.2.Value.2': [u'10.0.0.7'],
+ u'Signature': [u'uUMHYOoLM6r+sT4fhYjdNT6MHw22Wj1mafUpe0P0bY4='],
+ u'SignatureMethod': [u'HmacSHA256'],
+ u'SignatureVersion': [u'2'],
+ u'Timestamp': [u'2014-03-18T21:54:01Z'],
+ u'Version': [u'2013-10-15']}
+ into:
+ {u'domain-name': [u'example.com'], u'domain-name-servers': [u'10.0.0.6', u'10.0.0.7']}
+ """
+
+ key_needle = re.compile(u'{0}.[0-9]+.Key'.format(option), re.UNICODE)
+ response_values = {}
+
+ for key, value in querystring.items():
+ if key_needle.match(key):
+ values = []
+ key_index = key.split(".")[1]
+ value_index = 1
+ while True:
+ value_key = u'{0}.{1}.Value.{2}'.format(
+ option, key_index, value_index)
+ if value_key in querystring:
+ values.extend(querystring[value_key])
+ else:
+ break
+ value_index += 1
+ response_values[value[0]] = values
+ return response_values
+
+
+def filters_from_querystring(querystring_dict):
+ response_values = {}
+ for key, value in querystring_dict.items():
+ match = re.search(r"Filter.(\d).Name", key)
+ if match:
+ filter_index = match.groups()[0]
+ value_prefix = "Filter.{0}.Value".format(filter_index)
+ filter_values = [filter_value[0] for filter_key, filter_value in querystring_dict.items() if
+ filter_key.startswith(value_prefix)]
+ response_values[value[0]] = filter_values
+ return response_values
+
+
+def dict_from_querystring(parameter, querystring_dict):
+ use_dict = {}
+ for key, value in querystring_dict.items():
+ match = re.search(r"{0}.(\d).(\w+)".format(parameter), key)
+ if match:
+ use_dict_index = match.groups()[0]
+ use_dict_element_property = match.groups()[1]
+
+ if not use_dict.get(use_dict_index):
+ use_dict[use_dict_index] = {}
+ use_dict[use_dict_index][use_dict_element_property] = value[0]
+
+ return use_dict
+
+
+def get_object_value(obj, attr):
+ keys = attr.split('.')
+ val = obj
+ for key in keys:
+ if hasattr(val, key):
+ val = getattr(val, key)
+ elif isinstance(val, dict):
+ val = val[key]
+ elif isinstance(val, list):
+ for item in val:
+ item_val = get_object_value(item, key)
+ if item_val:
+ return item_val
+ else:
+ return None
+ return val
+
+
+def is_tag_filter(filter_name):
+ return (filter_name.startswith('tag:') or
+ filter_name.startswith('tag-value') or
+ filter_name.startswith('tag-key'))
+
+
+def get_obj_tag(obj, filter_name):
+ tag_name = filter_name.replace('tag:', '', 1)
+ tags = dict((tag['key'], tag['value']) for tag in obj.get_tags())
+ return tags.get(tag_name)
+
+
+def get_obj_tag_names(obj):
+ tags = set((tag['key'] for tag in obj.get_tags()))
+ return tags
+
+
+def get_obj_tag_values(obj):
+ tags = set((tag['value'] for tag in obj.get_tags()))
+ return tags
+
+
+def tag_filter_matches(obj, filter_name, filter_values):
+ regex_filters = [re.compile(simple_aws_filter_to_re(f))
+ for f in filter_values]
+ if filter_name == 'tag-key':
+ tag_values = get_obj_tag_names(obj)
+ elif filter_name == 'tag-value':
+ tag_values = get_obj_tag_values(obj)
+ else:
+ tag_values = [get_obj_tag(obj, filter_name) or '']
+
+ for tag_value in tag_values:
+ if any(regex.match(tag_value) for regex in regex_filters):
+ return True
+
+ return False
+
+
+filter_dict_attribute_mapping = {
+ 'instance-state-name': 'state',
+ 'instance-id': 'id',
+ 'state-reason-code': '_state_reason.code',
+ 'source-dest-check': 'source_dest_check',
+ 'vpc-id': 'vpc_id',
+ 'group-id': 'security_groups.id',
+ 'instance.group-id': 'security_groups.id',
+ 'instance.group-name': 'security_groups.name',
+ 'instance-type': 'instance_type',
+ 'private-ip-address': 'private_ip',
+ 'ip-address': 'public_ip',
+ 'availability-zone': 'placement',
+ 'architecture': 'architecture',
+ 'image-id': 'image_id',
+ 'network-interface.private-dns-name': 'private_dns',
+ 'private-dns-name': 'private_dns'
+}
+
+
+def passes_filter_dict(instance, filter_dict):
+ for filter_name, filter_values in filter_dict.items():
+ if filter_name in filter_dict_attribute_mapping:
+ instance_attr = filter_dict_attribute_mapping[filter_name]
+ instance_value = get_object_value(instance, instance_attr)
+ if not instance_value_in_filter_values(instance_value, filter_values):
+ return False
+
+ elif is_tag_filter(filter_name):
+ if not tag_filter_matches(instance, filter_name, filter_values):
+ return False
+ else:
+ raise NotImplementedError(
+ "Filter dicts have not been implemented in Moto for '%s' yet. Feel free to open an issue at https://github.com/spulec/moto/issues" %
+ filter_name)
+ return True
+
+
+def instance_value_in_filter_values(instance_value, filter_values):
+ if isinstance(instance_value, list):
+ if not set(filter_values).intersection(set(instance_value)):
+ return False
+ elif instance_value not in filter_values:
+ return False
+ return True
+
+
+def filter_reservations(reservations, filter_dict):
+ result = []
+ for reservation in reservations:
+ new_instances = []
+ for instance in reservation.instances:
+ if passes_filter_dict(instance, filter_dict):
+ new_instances.append(instance)
+ if new_instances:
+ reservation.instances = new_instances
+ result.append(reservation)
+ return result
+
+
+filter_dict_igw_mapping = {
+ "attachment.vpc-id": "vpc.id",
+ "attachment.state": "attachment_state",
+ "internet-gateway-id": "id",
+}
+
+
+def passes_igw_filter_dict(igw, filter_dict):
+ for filter_name, filter_values in filter_dict.items():
+ if filter_name in filter_dict_igw_mapping:
+ igw_attr = filter_dict_igw_mapping[filter_name]
+ if get_object_value(igw, igw_attr) not in filter_values:
+ return False
+ elif is_tag_filter(filter_name):
+ if not tag_filter_matches(igw, filter_name, filter_values):
+ return False
+ else:
+ raise NotImplementedError(
+ "Internet Gateway filter dicts have not been implemented in Moto for '%s' yet. Feel free to open an issue at https://github.com/spulec/moto/issues",
+ filter_name)
+ return True
+
+
+def filter_internet_gateways(igws, filter_dict):
+ result = []
+ for igw in igws:
+ if passes_igw_filter_dict(igw, filter_dict):
+ result.append(igw)
+ return result
+
+
+def is_filter_matching(obj, filter, filter_value):
+ value = obj.get_filter_value(filter)
+
+ if not filter_value:
+ return False
+
+ if isinstance(value, six.string_types):
+ if not isinstance(filter_value, list):
+ filter_value = [filter_value]
+ if any(fnmatch.fnmatch(value, pattern) for pattern in filter_value):
+ return True
+ return False
+
+ try:
+ value = set(value)
+ return (value and value.issubset(filter_value)) or value.issuperset(filter_value)
+ except TypeError:
+ return value in filter_value
+
+
+def generic_filter(filters, objects):
+ if filters:
+ for (_filter, _filter_value) in filters.items():
+ objects = [obj for obj in objects if is_filter_matching(
+ obj, _filter, _filter_value)]
+
+ return objects
+
+
+def simple_aws_filter_to_re(filter_string):
+ tmp_filter = filter_string.replace('\?', '[?]')
+ tmp_filter = tmp_filter.replace('\*', '[*]')
+ tmp_filter = fnmatch.translate(tmp_filter)
+ return tmp_filter
+
+
+def random_key_pair():
+ def random_hex():
+ return chr(random.choice(list(range(48, 58)) + list(range(97, 102))))
+
+ def random_fingerprint():
+ return ':'.join([random_hex() + random_hex() for i in range(20)])
+
+ def random_material():
+ return ''.join([
+ chr(random.choice(list(range(65, 91)) + list(range(48, 58)) +
+ list(range(97, 102))))
+ for i in range(1000)
+ ])
+ material = "---- BEGIN RSA PRIVATE KEY ----" + random_material() + \
+ "-----END RSA PRIVATE KEY-----"
+ return {
+ 'fingerprint': random_fingerprint(),
+ 'material': material
+ }
+
+
+def get_prefix(resource_id):
+ resource_id_prefix, separator, after = resource_id.partition('-')
+ if resource_id_prefix == EC2_RESOURCE_TO_PREFIX['network-interface']:
+ if after.startswith('attach'):
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX[
+ 'network-interface-attachment']
+ if resource_id_prefix not in EC2_RESOURCE_TO_PREFIX.values():
+ uuid4hex = re.compile(
+ '[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}\Z', re.I)
+ if uuid4hex.match(resource_id) is not None:
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX['reserved-instance']
+ else:
+ return None
+ return resource_id_prefix
+
+
+def is_valid_resource_id(resource_id):
+ valid_prefixes = EC2_RESOURCE_TO_PREFIX.values()
+ resource_id_prefix = get_prefix(resource_id)
+ if resource_id_prefix not in valid_prefixes:
+ return False
+ resource_id_pattern = resource_id_prefix + '-[0-9a-f]{8}'
+ resource_pattern_re = re.compile(resource_id_pattern)
+ return resource_pattern_re.match(resource_id) is not None
+
+
+def is_valid_cidr(cird):
+ cidr_pattern = '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(\d|[1-2]\d|3[0-2]))$'
+ cidr_pattern_re = re.compile(cidr_pattern)
+ return cidr_pattern_re.match(cird) is not None
+
+
+def generate_instance_identity_document(instance):
+ """
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
+
+ A JSON file that describes an instance. Usually retrieved by URL:
+ http://169.254.169.254/latest/dynamic/instance-identity/document
+ Here we just fill a dictionary that represents the document
+
+ Typically, this document is used by the amazon-ecs-agent when registering a
+ new ContainerInstance
+ """
+
+ document = {
+ 'devPayProductCodes': None,
+ 'availabilityZone': instance.placement['AvailabilityZone'],
+ 'privateIp': instance.private_ip_address,
+ 'version': '2010-8-31',
+ 'region': instance.placement['AvailabilityZone'][:-1],
+ 'instanceId': instance.id,
+ 'billingProducts': None,
+ 'instanceType': instance.instance_type,
+ 'accountId': '012345678910',
+ 'pendingTime': '2015-11-19T16:32:11Z',
+ 'imageId': instance.image_id,
+ 'kernelId': instance.kernel_id,
+ 'ramdiskId': instance.ramdisk_id,
+ 'architecture': instance.architecture,
+ }
+
+ return document
diff --git a/contrib/python/moto/py2/moto/iam/__init__.py b/contrib/python/moto/py2/moto/iam/__init__.py
new file mode 100644
index 0000000000..1dda654ce8
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import unicode_literals
+from .models import iam_backend
+
+iam_backends = {"global": iam_backend}
+mock_iam = iam_backend.decorator
+mock_iam_deprecated = iam_backend.deprecated_decorator
diff --git a/contrib/python/moto/py2/moto/iam/aws_managed_policies.py b/contrib/python/moto/py2/moto/iam/aws_managed_policies.py
new file mode 100644
index 0000000000..df348c0d9f
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/aws_managed_policies.py
@@ -0,0 +1,12944 @@
+# Imported via `make aws_managed_policies`
+aws_managed_policies_data = """
+{
+ "AWSAccountActivityAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountActivityAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewBilling"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQRYCWMFX5J3E333K",
+ "PolicyName": "AWSAccountActivityAccess",
+ "UpdateDate": "2015-02-06T18:41:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAccountUsageReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountUsageReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewUsage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJLIB4VSBVO47ZSBB6",
+ "PolicyName": "AWSAccountUsageReportAccess",
+ "UpdateDate": "2015-02-06T18:41:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAgentlessDiscoveryService": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAgentlessDiscoveryService",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-02T01:35:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "awsconnector:RegisterConnector",
+ "awsconnector:GetConnectorHealth"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::connector-platform-upgrade-info/*",
+ "arn:aws:s3:::connector-platform-upgrade-info",
+ "arn:aws:s3:::connector-platform-upgrade-bundles/*",
+ "arn:aws:s3:::connector-platform-upgrade-bundles",
+ "arn:aws:s3:::connector-platform-release-notes/*",
+ "arn:aws:s3:::connector-platform-release-notes",
+ "arn:aws:s3:::prod.agentless.discovery.connector.upgrade/*",
+ "arn:aws:s3:::prod.agentless.discovery.connector.upgrade"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::import-to-ec2-connector-debug-logs/*"
+ ]
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ },
+ {
+ "Action": [
+ "Discovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Discovery"
+ },
+ {
+ "Action": [
+ "arsenal:RegisterOnPremisesAgent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "arsenal"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIA3DIL7BYQ35ISM4K",
+ "PolicyName": "AWSAgentlessDiscoveryService",
+ "UpdateDate": "2016-08-02T01:35:11+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationDiscoveryAgentAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationDiscoveryAgentAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-11T21:38:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "arsenal:RegisterOnPremisesAgent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAICZIOVAGC6JPF3WHC",
+ "PolicyName": "AWSApplicationDiscoveryAgentAccess",
+ "UpdateDate": "2016-05-11T21:38:47+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationDiscoveryServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationDiscoveryServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-11T21:30:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "discovery:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJBNJEA6ZXM2SBOPDU",
+ "PolicyName": "AWSApplicationDiscoveryServiceFullAccess",
+ "UpdateDate": "2016-05-11T21:30:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBatchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBatchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-13T00:38:59+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "batch:*",
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeKeyPairs",
+ "ecs:DescribeClusters",
+ "ecs:Describe*",
+ "ecs:List*",
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSBatchServiceRole",
+ "arn:aws:iam::*:role/ecsInstanceRole",
+ "arn:aws:iam::*:role/iaws-ec2-spot-fleet-role",
+ "arn:aws:iam::*:role/aws-ec2-spot-fleet-role",
+ "arn:aws:iam::*:role/AWSBatchJobRole*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ7K2KIWB3HZVK3CUO",
+ "PolicyName": "AWSBatchFullAccess",
+ "UpdateDate": "2016-12-13T00:38:59+00:00",
+ "VersionId": "v2"
+ },
+ "AWSBatchServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-11T20:44:52+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeImages",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:RequestSpotFleet",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:TerminateInstances",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:CreateOrUpdateTags",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "ecs:DescribeClusters",
+ "ecs:DescribeContainerInstances",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTasks",
+ "ecs:ListClusters",
+ "ecs:ListContainerInstances",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "ecs:ListTasks",
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:RegisterTaskDefinition",
+ "ecs:DeregisterTaskDefinition",
+ "ecs:RunTask",
+ "ecs:StartTask",
+ "ecs:StopTask",
+ "ecs:UpdateContainerAgent",
+ "ecs:DeregisterContainerInstance",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogGroups",
+ "iam:GetInstanceProfile",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIUETIXPCKASQJURFE",
+ "PolicyName": "AWSBatchServiceRole",
+ "UpdateDate": "2017-05-11T20:44:52+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCertificateManagerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-21T17:02:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJYCHABBP6VQIVBCBQ",
+ "PolicyName": "AWSCertificateManagerFullAccess",
+ "UpdateDate": "2016-01-21T17:02:36+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCertificateManagerReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-04-21T15:08:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:GetCertificate",
+ "acm:ListTagsForCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI4GSWX6S4MESJ3EWC",
+ "PolicyName": "AWSCertificateManagerReadOnly",
+ "UpdateDate": "2016-04-21T15:08:16+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloudFormationReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudFormationReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:GetTemplate",
+ "cloudformation:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJWVBEE4I2POWLODLW",
+ "PolicyName": "AWSCloudFormationReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudHSMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudHSMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "cloudhsm:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIMBQYQZM7F63DA2UU",
+ "PolicyName": "AWSCloudHSMFullAccess",
+ "UpdateDate": "2015-02-06T18:39:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudHSMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudHSMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudhsm:Get*",
+ "cloudhsm:List*",
+ "cloudhsm:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAISVCBSY7YDBOT67KE",
+ "PolicyName": "AWSCloudHSMReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudHSMRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCloudHSMRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateTags",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DetachNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI7QIUU4GC66SF26WE",
+ "PolicyName": "AWSCloudHSMRole",
+ "UpdateDate": "2015-02-06T18:41:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudTrailFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudTrailFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-16T18:31:28+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:AddPermission",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListTopics",
+ "sns:SetTopicAttributes",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:ListAllMyBuckets",
+ "s3:PutBucketPolicy",
+ "s3:ListBucket",
+ "s3:GetObject",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudtrail:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole",
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetUser"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIQNUJTQYDRJPC3BNK",
+ "PolicyName": "AWSCloudTrailFullAccess",
+ "UpdateDate": "2016-02-16T18:31:28+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCloudTrailReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudTrailReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-14T20:41:52+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:ListTags",
+ "cloudtrail:ListPublicKeys",
+ "cloudtrail:GetEventSelectors",
+ "s3:ListAllMyBuckets",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJDU7KJADWBSEQ3E7S",
+ "PolicyName": "AWSCloudTrailReadOnlyAccess",
+ "UpdateDate": "2016-12-14T20:41:52+00:00",
+ "VersionId": "v6"
+ },
+ "AWSCodeBuildAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:04:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:*",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/*:log-stream:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQJGIOIE3CD2TQXDS",
+ "PolicyName": "AWSCodeBuildAdminAccess",
+ "UpdateDate": "2016-12-01T19:04:44+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeBuildDeveloperAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildDeveloperAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:02:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:StartBuild",
+ "codebuild:StopBuild",
+ "codebuild:BatchGet*",
+ "codebuild:Get*",
+ "codebuild:List*",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository",
+ "codecommit:ListBranches",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/*:log-stream:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIMKTMR34XSBQW45HS",
+ "PolicyName": "AWSCodeBuildDeveloperAccess",
+ "UpdateDate": "2016-12-01T19:02:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeBuildReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:03:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:BatchGet*",
+ "codebuild:Get*",
+ "codebuild:List*",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/*:log-stream:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJIZZWN6557F5HVP2K",
+ "PolicyName": "AWSCodeBuildReadOnlyAccess",
+ "UpdateDate": "2016-12-01T19:03:41+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeCommitFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:02:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI4VCZ3XPIZLQ5NZV2",
+ "PolicyName": "AWSCodeCommitFullAccess",
+ "UpdateDate": "2015-07-09T17:02:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeCommitPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-22T21:12:48+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:BatchGetRepositories",
+ "codecommit:CreateBranch",
+ "codecommit:CreateRepository",
+ "codecommit:DeleteBranch",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:GitPush",
+ "codecommit:List*",
+ "codecommit:Put*",
+ "codecommit:Test*",
+ "codecommit:Update*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI4UIINUVGB5SEC57G",
+ "PolicyName": "AWSCodeCommitPowerUser",
+ "UpdateDate": "2017-05-22T21:12:48+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeCommitReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:05:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:BatchGetRepositories",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJACNSXR7Z2VLJW3D6",
+ "PolicyName": "AWSCodeCommitReadOnly",
+ "UpdateDate": "2015-07-09T17:05:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeDeployDeployerAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployDeployerAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:18:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codedeploy:Batch*",
+ "codedeploy:CreateDeployment",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codedeploy:RegisterApplicationRevision"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJUWEPOMGLMVXJAPUI",
+ "PolicyName": "AWSCodeDeployDeployerAccess",
+ "UpdateDate": "2015-05-19T18:18:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeDeployFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:13:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "codedeploy:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIONKN3TJZUKXCHXWC",
+ "PolicyName": "AWSCodeDeployFullAccess",
+ "UpdateDate": "2015-05-19T18:13:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeDeployReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:21:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAILZHHKCKB4NE7XOIQ",
+ "PolicyName": "AWSCodeDeployReadOnlyAccess",
+ "UpdateDate": "2015-05-19T18:21:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeDeployRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-11T19:09:51+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:CompleteLifecycleAction",
+ "autoscaling:DeleteLifecycleHook",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:PutLifecycleHook",
+ "autoscaling:RecordLifecycleActionHeartbeat",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:EnableMetricsCollection",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:AttachLoadBalancers",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:PutLifecycleHook",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DeleteAutoScalingGroup",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:TerminateInstances",
+ "tag:GetTags",
+ "tag:GetResources",
+ "sns:Publish",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeregisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJ2NKMKD73QS5NBFLA",
+ "PolicyName": "AWSCodeDeployRole",
+ "UpdateDate": "2017-09-11T19:09:51+00:00",
+ "VersionId": "v6"
+ },
+ "AWSCodePipelineApproverAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineApproverAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-02T17:24:58+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:ListPipelineExecutions",
+ "codepipeline:ListPipelines",
+ "codepipeline:PutApprovalResult"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAICXNWK42SQ6LMDXM2",
+ "PolicyName": "AWSCodePipelineApproverAccess",
+ "UpdateDate": "2017-08-02T17:24:58+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodePipelineCustomActionAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineCustomActionAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:02:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:AcknowledgeJob",
+ "codepipeline:GetJobDetails",
+ "codepipeline:PollForJobs",
+ "codepipeline:PutJobFailureResult",
+ "codepipeline:PutJobSuccessResult"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJFW5Z32BTVF76VCYC",
+ "PolicyName": "AWSCodePipelineCustomActionAccess",
+ "UpdateDate": "2015-07-09T17:02:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodePipelineFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-01T19:59:46+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:*",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "s3:CreateBucket",
+ "s3:GetBucketPolicy",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "codedeploy:GetApplication",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentGroups",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "opsworks:DescribeApps",
+ "opsworks:DescribeLayers",
+ "opsworks:DescribeStacks",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListChangeSets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJP5LH77KSAT2KHQGG",
+ "PolicyName": "AWSCodePipelineFullAccess",
+ "UpdateDate": "2016-11-01T19:59:46+00:00",
+ "VersionId": "v5"
+ },
+ "AWSCodePipelineReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-02T17:25:18+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:ListPipelineExecutions",
+ "codepipeline:ListActionTypes",
+ "codepipeline:ListPipelines",
+ "iam:ListRoles",
+ "s3:GetBucketPolicy",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "codedeploy:GetApplication",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentGroups",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "opsworks:DescribeApps",
+ "opsworks:DescribeLayers",
+ "opsworks:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAILFKZXIBOTNC5TO2Q",
+ "PolicyName": "AWSCodePipelineReadOnlyAccess",
+ "UpdateDate": "2017-08-02T17:25:18+00:00",
+ "VersionId": "v6"
+ },
+ "AWSCodeStarFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeStarFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-19T16:23:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codestar:*",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarEC2"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStack*",
+ "cloudformation:GetTemplateSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awscodestar-*"
+ ],
+ "Sid": "CodeStarCF"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIXI233TFUGLZOJBEC",
+ "PolicyName": "AWSCodeStarFullAccess",
+ "UpdateDate": "2017-04-19T16:23:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeStarServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeStarServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-13T19:53:22+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:*Stack*",
+ "cloudformation:GetTemplate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awscodestar-*",
+ "arn:aws:cloudformation:*:*:stack/awseb-*"
+ ],
+ "Sid": "ProjectStack"
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:DescribeChangeSet"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectStackTemplate"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awscodestar-*/*"
+ ],
+ "Sid": "ProjectQuickstarts"
+ },
+ {
+ "Action": [
+ "s3:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-codestar-*",
+ "arn:aws:s3:::aws-codestar-*/*",
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "ProjectS3Buckets"
+ },
+ {
+ "Action": [
+ "codestar:*Project",
+ "codestar:*Resource*",
+ "codestar:List*",
+ "codestar:Describe*",
+ "codestar:Get*",
+ "codestar:AssociateTeamMember",
+ "codecommit:*",
+ "codepipeline:*",
+ "codedeploy:*",
+ "codebuild:*",
+ "ec2:RunInstances",
+ "autoscaling:*",
+ "cloudwatch:Put*",
+ "ec2:*",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:*",
+ "iam:ListRoles",
+ "logs:*",
+ "sns:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectServices"
+ },
+ {
+ "Action": [
+ "iam:AttachRolePolicy",
+ "iam:CreateRole",
+ "iam:DeleteRole",
+ "iam:DeleteRolePolicy",
+ "iam:DetachRolePolicy",
+ "iam:GetRole",
+ "iam:PassRole",
+ "iam:PutRolePolicy",
+ "iam:SetDefaultPolicyVersion",
+ "iam:CreatePolicy",
+ "iam:DeletePolicy",
+ "iam:AddRoleToInstanceProfile",
+ "iam:CreateInstanceProfile",
+ "iam:DeleteInstanceProfile",
+ "iam:RemoveRoleFromInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/CodeStarWorker*",
+ "arn:aws:iam::*:policy/CodeStarWorker*",
+ "arn:aws:iam::*:instance-profile/awscodestar-*"
+ ],
+ "Sid": "ProjectWorkerRoles"
+ },
+ {
+ "Action": [
+ "iam:AttachUserPolicy",
+ "iam:DetachUserPolicy"
+ ],
+ "Condition": {
+ "ArnEquals": {
+ "iam:PolicyArn": [
+ "arn:aws:iam::*:policy/CodeStar_*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectTeamMembers"
+ },
+ {
+ "Action": [
+ "iam:CreatePolicy",
+ "iam:DeletePolicy",
+ "iam:CreatePolicyVersion",
+ "iam:DeletePolicyVersion",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListPolicyVersions"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:policy/CodeStar_*"
+ ],
+ "Sid": "ProjectRoles"
+ },
+ {
+ "Action": [
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-codestar-service-role",
+ "arn:aws:iam::*:role/service-role/aws-codestar-service-role"
+ ],
+ "Sid": "InspectServiceRole"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIN6D4M2KD3NBOC4M4",
+ "PolicyName": "AWSCodeStarServiceRole",
+ "UpdateDate": "2017-07-13T19:53:22+00:00",
+ "VersionId": "v2"
+ },
+ "AWSConfigRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSConfigRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T19:04:46+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "ec2:Describe*",
+ "config:Put*",
+ "config:Get*",
+ "config:List*",
+ "config:Describe*",
+ "cloudtrail:GetTrailStatus",
+ "s3:GetObject",
+ "iam:GetAccountAuthorizationDetails",
+ "iam:GetAccountPasswordPolicy",
+ "iam:GetAccountSummary",
+ "iam:GetGroup",
+ "iam:GetGroupPolicy",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:GetUser",
+ "iam:GetUserPolicy",
+ "iam:ListAttachedGroupPolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListAttachedUserPolicies",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfilesForRole",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListUserPolicies",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeTags",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:ListTagsForCertificate",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSnapshotAttributes",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventSubscriptions",
+ "rds:ListTagsForResource",
+ "rds:DescribeDBClusters",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCORS",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketNotification",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketRequestPayment",
+ "s3:GetBucketTagging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetReplicationConfiguration",
+ "s3:ListAllMyBuckets",
+ "redshift:DescribeClusterParameterGroups",
+ "redshift:DescribeClusterParameters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:DescribeClusterSnapshots",
+ "redshift:DescribeClusterSubnetGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeEventSubscriptions",
+ "redshift:DescribeLoggingStatus",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "cloudwatch:DescribeAlarms",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIQRXRDRGJUA33ELIO",
+ "PolicyName": "AWSConfigRole",
+ "UpdateDate": "2017-08-14T19:04:46+00:00",
+ "VersionId": "v10"
+ },
+ "AWSConfigRulesExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSConfigRulesExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-03-25T17:59:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/AWSLogs/*/Config/*"
+ },
+ {
+ "Action": [
+ "config:Put*",
+ "config:Get*",
+ "config:List*",
+ "config:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJUB3KIKTA4PU4OYAA",
+ "PolicyName": "AWSConfigRulesExecutionRole",
+ "UpdateDate": "2016-03-25T17:59:36+00:00",
+ "VersionId": "v1"
+ },
+ "AWSConfigUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSConfigUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-30T19:15:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "config:Get*",
+ "config:Describe*",
+ "config:Deliver*",
+ "config:List*",
+ "tag:GetResources",
+ "tag:GetTagKeys",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:LookupEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWTTSFJ7KKJE3MWGA",
+ "PolicyName": "AWSConfigUserAccess",
+ "UpdateDate": "2016-08-30T19:15:19+00:00",
+ "VersionId": "v3"
+ },
+ "AWSConnector": {
+ "Arn": "arn:aws:iam::aws:policy/AWSConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-28T19:50:38+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:AbortMultipartUpload",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::import-to-ec2-*"
+ },
+ {
+ "Action": [
+ "ec2:CancelConversionTask",
+ "ec2:CancelExportTask",
+ "ec2:CreateImage",
+ "ec2:CreateInstanceExportTask",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:DeleteTags",
+ "ec2:DeleteVolume",
+ "ec2:DescribeConversionTasks",
+ "ec2:DescribeExportTasks",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeRegions",
+ "ec2:DescribeTags",
+ "ec2:DetachVolume",
+ "ec2:ImportInstance",
+ "ec2:ImportVolume",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ImportImage",
+ "ec2:DescribeImportImageTasks",
+ "ec2:DeregisterImage",
+ "ec2:DescribeSnapshots",
+ "ec2:DeleteSnapshot",
+ "ec2:CancelImportTask",
+ "ec2:ImportSnapshot",
+ "ec2:DescribeImportSnapshotTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ6YATONJHICG3DJ3U",
+ "PolicyName": "AWSConnector",
+ "UpdateDate": "2015-09-28T19:50:38+00:00",
+ "VersionId": "v3"
+ },
+ "AWSDataPipelineRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDataPipelineRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-22T17:17:38+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "datapipeline:DescribeObjects",
+ "datapipeline:EvaluateExpression",
+ "dynamodb:BatchGetItem",
+ "dynamodb:DescribeTable",
+ "dynamodb:GetItem",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:UpdateTable",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "elasticmapreduce:*",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:PassRole",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "s3:CreateBucket",
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:Put*",
+ "sdb:BatchPutAttributes",
+ "sdb:Select*",
+ "sns:GetTopicAttributes",
+ "sns:ListTopics",
+ "sns:Publish",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sqs:CreateQueue",
+ "sqs:Delete*",
+ "sqs:GetQueue*",
+ "sqs:PurgeQueue",
+ "sqs:ReceiveMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIKCP6XS3ESGF4GLO2",
+ "PolicyName": "AWSDataPipelineRole",
+ "UpdateDate": "2016-02-22T17:17:38+00:00",
+ "VersionId": "v5"
+ },
+ "AWSDataPipeline_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataPipeline_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-17T18:48:39+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:List*",
+ "dynamodb:DescribeTable",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetInstanceProfile",
+ "iam:ListInstanceProfiles",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIXOFIG7RSBMRPHXJ4",
+ "PolicyName": "AWSDataPipeline_FullAccess",
+ "UpdateDate": "2017-08-17T18:48:39+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDataPipeline_PowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataPipeline_PowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-17T18:49:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:List*",
+ "dynamodb:DescribeTable",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "sns:ListTopics",
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetInstanceProfile",
+ "iam:ListInstanceProfiles",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIMXGLVY6DVR24VTYS",
+ "PolicyName": "AWSDataPipeline_PowerUser",
+ "UpdateDate": "2017-08-17T18:49:42+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDeviceFarmFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeviceFarmFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-13T16:37:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devicefarm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJO7KEDP4VYJPNT5UW",
+ "PolicyName": "AWSDeviceFarmFullAccess",
+ "UpdateDate": "2015-07-13T16:37:38+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDirectConnectFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectConnectFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQF2QKZSK74KTIHOW",
+ "PolicyName": "AWSDirectConnectFullAccess",
+ "UpdateDate": "2015-02-06T18:40:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDirectConnectReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectConnectReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI23HZ27SI6FQMGNQ2",
+ "PolicyName": "AWSDirectConnectReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDirectoryServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectoryServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-24T23:10:36+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:DirectoryMonitoring*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAINAW5ANUWTH3R4ANI",
+ "PolicyName": "AWSDirectoryServiceFullAccess",
+ "UpdateDate": "2016-02-24T23:10:36+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDirectoryServiceReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectoryServiceReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-24T23:11:18+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:Check*",
+ "ds:Describe*",
+ "ds:Get*",
+ "ds:List*",
+ "ds:Verify*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "sns:ListTopics",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIHWYO6WSDNCG64M2W",
+ "PolicyName": "AWSDirectoryServiceReadOnlyAccess",
+ "UpdateDate": "2016-02-24T23:11:18+00:00",
+ "VersionId": "v3"
+ },
+ "AWSEC2SpotServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEC2SpotServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-18T18:51:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAIZJJBQNXQYVKTEXGM",
+ "PolicyName": "AWSEC2SpotServiceRolePolicy",
+ "UpdateDate": "2017-09-18T18:51:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkCustomPlatformforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkCustomPlatformforEC2Role",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-21T22:50:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachVolume",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CopyImage",
+ "ec2:CreateImage",
+ "ec2:CreateKeypair",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:DeleteKeypair",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeleteVolume",
+ "ec2:DeregisterImage",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVolumes",
+ "ec2:DetachVolume",
+ "ec2:GetPasswordData",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifySnapshotAttribute",
+ "ec2:RegisterImage",
+ "ec2:RunInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2Access"
+ },
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/platform/*",
+ "Sid": "CloudWatchLogsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJRVFXSS6LEIQGBKDY",
+ "PolicyName": "AWSElasticBeanstalkCustomPlatformforEC2Role",
+ "UpdateDate": "2017-02-21T22:50:30+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkEnhancedHealth": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-22T20:28:36+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:GetConsoleOutput",
+ "ec2:AssociateAddress",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeSecurityGroups",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeNotificationConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIH5EFJNMOGUUTKLFE",
+ "PolicyName": "AWSElasticBeanstalkEnhancedHealth",
+ "UpdateDate": "2016-08-22T20:28:36+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticBeanstalkFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-21T01:00:13+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticbeanstalk:*",
+ "ec2:*",
+ "ecs:*",
+ "ecr:*",
+ "elasticloadbalancing:*",
+ "autoscaling:*",
+ "cloudwatch:*",
+ "s3:*",
+ "sns:*",
+ "cloudformation:*",
+ "dynamodb:*",
+ "rds:*",
+ "sqs:*",
+ "logs:*",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:PassRole",
+ "iam:ListRolePolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "iam:ListServerCertificates",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:AddRoleToInstanceProfile",
+ "iam:CreateInstanceProfile",
+ "iam:CreateRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-elasticbeanstalk*",
+ "arn:aws:iam::*:instance-profile/aws-elasticbeanstalk*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:AttachRolePolicy"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PolicyArn": [
+ "arn:aws:iam::aws:policy/AWSElasticBeanstalk*",
+ "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalk*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIZYX2YLLBW2LJVUFW",
+ "PolicyName": "AWSElasticBeanstalkFullAccess",
+ "UpdateDate": "2016-12-21T01:00:13+00:00",
+ "VersionId": "v5"
+ },
+ "AWSElasticBeanstalkMulticontainerDocker": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-06T23:45:37+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:Poll",
+ "ecs:StartTask",
+ "ecs:StopTask",
+ "ecs:DiscoverPollEndpoint",
+ "ecs:StartTelemetrySession",
+ "ecs:RegisterContainerInstance",
+ "ecs:DeregisterContainerInstance",
+ "ecs:DescribeContainerInstances",
+ "ecs:Submit*",
+ "ecs:DescribeTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ECSAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ45SBYG72SD6SHJEY",
+ "PolicyName": "AWSElasticBeanstalkMulticontainerDocker",
+ "UpdateDate": "2016-06-06T23:45:37+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticBeanstalkReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "ec2:Describe*",
+ "elasticloadbalancing:Describe*",
+ "autoscaling:Describe*",
+ "cloudwatch:Describe*",
+ "cloudwatch:List*",
+ "cloudwatch:Get*",
+ "s3:Get*",
+ "s3:List*",
+ "sns:Get*",
+ "sns:List*",
+ "cloudformation:Describe*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:Validate*",
+ "cloudformation:Estimate*",
+ "rds:Describe*",
+ "sqs:Get*",
+ "sqs:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI47KNGXDAXFD4SDHG",
+ "PolicyName": "AWSElasticBeanstalkReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkService": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkService",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-21T16:49:23+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "AllowCloudformationOperationsOnElasticBeanstalkStacks"
+ },
+ {
+ "Action": [
+ "logs:DeleteLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "AllowDeleteCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "s3:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "AllowS3OperationsOnElasticBeanstalkBuckets"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DetachInstances",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "cloudwatch:PutMetricAlarm",
+ "ec2:AssociateAddress",
+ "ec2:AllocateAddress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:TerminateInstances",
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:DescribeClusters",
+ "ecs:RegisterTaskDefinition",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeregisterTargets",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "s3:CopyObject",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectMetadata",
+ "s3:ListBucket",
+ "s3:listBuckets",
+ "s3:ListObjects",
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic",
+ "sns:Subscribe",
+ "sns:SetTopicAttributes",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowOperations"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJKQ5SN74ZQ4WASXBM",
+ "PolicyName": "AWSElasticBeanstalkService",
+ "UpdateDate": "2017-06-21T16:49:23+00:00",
+ "VersionId": "v11"
+ },
+ "AWSElasticBeanstalkServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticBeanstalkServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-13T23:46:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "iam:PassedToService": "elasticbeanstalk.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowPassRoleToElasticBeanstalk"
+ },
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "AllowCloudformationOperationsOnElasticBeanstalkStacks"
+ },
+ {
+ "Action": [
+ "logs:DeleteLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "AllowDeleteCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "s3:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "AllowS3OperationsOnElasticBeanstalkBuckets"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DetachInstances",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "cloudwatch:PutMetricAlarm",
+ "ec2:AssociateAddress",
+ "ec2:AllocateAddress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:TerminateInstances",
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:DescribeClusters",
+ "ecs:RegisterTaskDefinition",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeregisterTargets",
+ "iam:ListRoles",
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy",
+ "rds:DescribeDBInstances",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribeDBEngineVersions",
+ "sns:ListTopics",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowOperations"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAIID62QSI3OSIPQXTM",
+ "PolicyName": "AWSElasticBeanstalkServiceRolePolicy",
+ "UpdateDate": "2017-09-13T23:46:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkWebTier": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-21T02:06:25+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "XRayAccess"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "CloudWatchLogsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIUF4325SJYOREKW3A",
+ "PolicyName": "AWSElasticBeanstalkWebTier",
+ "UpdateDate": "2016-12-21T02:06:25+00:00",
+ "VersionId": "v4"
+ },
+ "AWSElasticBeanstalkWorkerTier": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-21T02:01:55+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "MetricsAccess"
+ },
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "XRayAccess"
+ },
+ {
+ "Action": [
+ "sqs:ChangeMessageVisibility",
+ "sqs:DeleteMessage",
+ "sqs:ReceiveMessage",
+ "sqs:SendMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "QueueAccess"
+ },
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "dynamodb:BatchGetItem",
+ "dynamodb:BatchWriteItem",
+ "dynamodb:DeleteItem",
+ "dynamodb:GetItem",
+ "dynamodb:PutItem",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:UpdateItem"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/*-stack-AWSEBWorkerCronLeaderRegistry*"
+ ],
+ "Sid": "DynamoPeriodicTasks"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "CloudWatchLogsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQDLBRSJVKVF4JMSK",
+ "PolicyName": "AWSElasticBeanstalkWorkerTier",
+ "UpdateDate": "2016-12-21T02:01:55+00:00",
+ "VersionId": "v4"
+ },
+ "AWSElasticLoadBalancingClassicServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticLoadBalancingClassicServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-19T22:36:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AttachNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssignIpv6Addresses",
+ "ec2:UnassignIpv6Addresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAIUMWW3QP7DPZPNVU4",
+ "PolicyName": "AWSElasticLoadBalancingClassicServiceRolePolicy",
+ "UpdateDate": "2017-09-19T22:36:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticLoadBalancingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticLoadBalancingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-19T22:19:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AttachNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssignIpv6Addresses",
+ "ec2:UnassignIpv6Addresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAIMHWGGSRHLOQUICJQ",
+ "PolicyName": "AWSElasticLoadBalancingServiceRolePolicy",
+ "UpdateDate": "2017-09-19T22:19:04+00:00",
+ "VersionId": "v1"
+ },
+ "AWSEnhancedClassicNetworkingMangementPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEnhancedClassicNetworkingMangementPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-20T17:29:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAI7T4V2HZTS72QVO52",
+ "PolicyName": "AWSEnhancedClassicNetworkingMangementPolicy",
+ "UpdateDate": "2017-09-20T17:29:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGlueConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-13T00:12:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSubnetGroups",
+ "iam:ListRoles",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeInstances",
+ "rds:DescribeDBInstances",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*/*",
+ "arn:aws:s3:::*/*aws-glue-*/*",
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:/aws-glue/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/aws-glue*/*"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:RunInstances",
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-dev-endpoint"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceNotebookRole*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJNZGDEOD7MISOVSVI",
+ "PolicyName": "AWSGlueConsoleFullAccess",
+ "UpdateDate": "2017-09-13T00:12:54+00:00",
+ "VersionId": "v2"
+ },
+ "AWSGlueServiceNotebookRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-17T18:08:29+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:CreatePartition",
+ "glue:CreateTable",
+ "glue:DeleteDatabase",
+ "glue:DeletePartition",
+ "glue:DeleteTable",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:GetTable",
+ "glue:GetTableVersions",
+ "glue:GetTables",
+ "glue:UpdateDatabase",
+ "glue:UpdatePartition",
+ "glue:UpdateTable",
+ "glue:CreateBookmark",
+ "glue:GetBookmark",
+ "glue:UpdateBookmark",
+ "glue:GetMetric",
+ "glue:PutMetric",
+ "glue:CreateConnection",
+ "glue:CreateJob",
+ "glue:DeleteConnection",
+ "glue:DeleteJob",
+ "glue:GetConnection",
+ "glue:GetConnections",
+ "glue:GetDevEndpoint",
+ "glue:GetDevEndpoints",
+ "glue:GetJob",
+ "glue:GetJobs",
+ "glue:UpdateJob",
+ "glue:BatchDeleteConnection",
+ "glue:UpdateConnection",
+ "glue:GetUserDefinedFunction",
+ "glue:UpdateUserDefinedFunction",
+ "glue:GetUserDefinedFunctions",
+ "glue:DeleteUserDefinedFunction",
+ "glue:CreateUserDefinedFunction",
+ "glue:BatchGetPartition",
+ "glue:BatchDeletePartition",
+ "glue:BatchCreatePartition",
+ "glue:BatchDeleteTable",
+ "glue:UpdateDevEndpoint",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::crawler-public*",
+ "arn:aws:s3:::aws-glue*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-service-resource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIMRC6VZUHJYCTKWFI",
+ "PolicyName": "AWSGlueServiceNotebookRole",
+ "UpdateDate": "2017-08-17T18:08:29+00:00",
+ "VersionId": "v2"
+ },
+ "AWSGlueServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-23T21:35:25+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:*",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*/*",
+ "arn:aws:s3:::*/*aws-glue-*/*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::crawler-public*",
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:/aws-glue/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-service-resource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIRUJCPEBPMEZFAS32",
+ "PolicyName": "AWSGlueServiceRole",
+ "UpdateDate": "2017-08-23T21:35:25+00:00",
+ "VersionId": "v3"
+ },
+ "AWSGreengrassFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGreengrassFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-03T00:47:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "greengrass:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJWPV6OBK4QONH4J3O",
+ "PolicyName": "AWSGreengrassFullAccess",
+ "UpdateDate": "2017-05-03T00:47:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGreengrassResourceAccessRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-26T23:10:54+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DeleteThingShadow",
+ "iot:GetThingShadow",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/GG_*",
+ "arn:aws:iot:*:*:thing/*-gcm",
+ "arn:aws:iot:*:*:thing/*-gda",
+ "arn:aws:iot:*:*:thing/*-gci"
+ ],
+ "Sid": "AllowGreengrassAccessToShadows"
+ },
+ {
+ "Action": [
+ "iot:DescribeThing"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:thing/*",
+ "Sid": "AllowGreengrassToDescribeThings"
+ },
+ {
+ "Action": [
+ "iot:DescribeCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:cert/*",
+ "Sid": "AllowGreengrassToDescribeCertificates"
+ },
+ {
+ "Action": [
+ "greengrass:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowGreengrassToCallGreengrassServices"
+ },
+ {
+ "Action": [
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowGreengrassToGetLambdaFunctions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJPKEIMB6YMXDEVRTM",
+ "PolicyName": "AWSGreengrassResourceAccessRolePolicy",
+ "UpdateDate": "2017-05-26T23:10:54+00:00",
+ "VersionId": "v3"
+ },
+ "AWSHealthFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSHealthFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T12:30:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "health:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI3CUMPCPEUPCSXC4Y",
+ "PolicyName": "AWSHealthFullAccess",
+ "UpdateDate": "2016-12-06T12:30:31+00:00",
+ "VersionId": "v1"
+ },
+ "AWSImportExportFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImportExportFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "importexport:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJCQCT4JGTLC6722MQ",
+ "PolicyName": "AWSImportExportFullAccess",
+ "UpdateDate": "2015-02-06T18:40:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSImportExportReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImportExportReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "importexport:ListJobs",
+ "importexport:GetStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJNTV4OG52ESYZHCNK",
+ "PolicyName": "AWSImportExportReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:42+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTConfigAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTConfigAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-07-27T20:41:18+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:AcceptCertificateTransfer",
+ "iot:AttachPrincipalPolicy",
+ "iot:AttachThingPrincipal",
+ "iot:CancelCertificateTransfer",
+ "iot:CreateCertificateFromCsr",
+ "iot:CreateKeysAndCertificate",
+ "iot:CreatePolicy",
+ "iot:CreatePolicyVersion",
+ "iot:CreateThing",
+ "iot:CreateThingType",
+ "iot:CreateTopicRule",
+ "iot:DeleteCertificate",
+ "iot:DeleteCACertificate",
+ "iot:DeletePolicy",
+ "iot:DeletePolicyVersion",
+ "iot:DeleteRegistrationCode",
+ "iot:DeleteThing",
+ "iot:DeleteThingType",
+ "iot:DeleteTopicRule",
+ "iot:DeprecateThingType",
+ "iot:DescribeCertificate",
+ "iot:DescribeCACertificate",
+ "iot:DescribeEndpoint",
+ "iot:DescribeThing",
+ "iot:DescribeThingType",
+ "iot:DetachPrincipalPolicy",
+ "iot:DetachThingPrincipal",
+ "iot:GetLoggingOptions",
+ "iot:GetPolicy",
+ "iot:GetPolicyVersion",
+ "iot:GetRegistrationCode",
+ "iot:GetTopicRule",
+ "iot:ListCertificates",
+ "iot:ListCACertificates",
+ "iot:ListCertificatesByCA",
+ "iot:ListPolicies",
+ "iot:ListPolicyPrincipals",
+ "iot:ListPolicyVersions",
+ "iot:ListPrincipalPolicies",
+ "iot:ListPrincipalThings",
+ "iot:ListThingPrincipals",
+ "iot:ListThings",
+ "iot:ListThingTypes",
+ "iot:ListTopicRules",
+ "iot:RegisterCertificate",
+ "iot:RegisterCACertificate",
+ "iot:RejectCertificateTransfer",
+ "iot:ReplaceTopicRule",
+ "iot:SetDefaultPolicyVersion",
+ "iot:SetLoggingOptions",
+ "iot:TransferCertificate",
+ "iot:UpdateCertificate",
+ "iot:UpdateCACertificate",
+ "iot:UpdateThing"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWWGD4LM4EMXNRL7I",
+ "PolicyName": "AWSIoTConfigAccess",
+ "UpdateDate": "2016-07-27T20:41:18+00:00",
+ "VersionId": "v4"
+ },
+ "AWSIoTConfigReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTConfigReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-07-27T20:41:36+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DescribeCertificate",
+ "iot:DescribeCACertificate",
+ "iot:DescribeEndpoint",
+ "iot:DescribeThing",
+ "iot:DescribeThingType",
+ "iot:GetLoggingOptions",
+ "iot:GetPolicy",
+ "iot:GetPolicyVersion",
+ "iot:GetRegistrationCode",
+ "iot:GetTopicRule",
+ "iot:ListCertificates",
+ "iot:ListCertificatesByCA",
+ "iot:ListCACertificates",
+ "iot:ListPolicies",
+ "iot:ListPolicyPrincipals",
+ "iot:ListPolicyVersions",
+ "iot:ListPrincipalPolicies",
+ "iot:ListPrincipalThings",
+ "iot:ListThingPrincipals",
+ "iot:ListThings",
+ "iot:ListThingTypes",
+ "iot:ListTopicRules"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJHENEMXGX4XMFOIOI",
+ "PolicyName": "AWSIoTConfigReadOnlyAccess",
+ "UpdateDate": "2016-07-27T20:41:36+00:00",
+ "VersionId": "v4"
+ },
+ "AWSIoTDataAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTDataAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-27T21:51:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:Connect",
+ "iot:Publish",
+ "iot:Subscribe",
+ "iot:Receive",
+ "iot:GetThingShadow",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJM2KI2UJDR24XPS2K",
+ "PolicyName": "AWSIoTDataAccess",
+ "UpdateDate": "2015-10-27T21:51:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:19:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJU2FPGG6PQWN72V2G",
+ "PolicyName": "AWSIoTFullAccess",
+ "UpdateDate": "2015-10-08T15:19:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTLogging": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTLogging",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:17:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "logs:PutRetentionPolicy",
+ "logs:GetLogEvents",
+ "logs:DeleteLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI6R6Z2FHHGS454W7W",
+ "PolicyName": "AWSIoTLogging",
+ "UpdateDate": "2015-10-08T15:17:25+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTRuleActions": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTRuleActions",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:14:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "dynamodb:PutItem",
+ "kinesis:PutRecord",
+ "iot:Publish",
+ "s3:PutObject",
+ "sns:Publish",
+ "sqs:SendMessage*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJEZ6FS7BUZVUHMOKY",
+ "PolicyName": "AWSIoTRuleActions",
+ "UpdateDate": "2015-10-08T15:14:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSKeyManagementServicePowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-03-07T00:55:11+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kms:CreateAlias",
+ "kms:CreateKey",
+ "kms:DeleteAlias",
+ "kms:Describe*",
+ "kms:GenerateRandom",
+ "kms:Get*",
+ "kms:List*",
+ "kms:TagResource",
+ "kms:UntagResource",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJNPP7PPPPMJRV2SA4",
+ "PolicyName": "AWSKeyManagementServicePowerUser",
+ "UpdateDate": "2017-03-07T00:55:11+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLambdaBasicExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:03:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJNCQGXC42545SKXIK",
+ "PolicyName": "AWSLambdaBasicExecutionRole",
+ "UpdateDate": "2015-04-09T15:03:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaDynamoDBExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:09:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeStream",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:ListStreams",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIP7WNAGMIPYNW4WQG",
+ "PolicyName": "AWSLambdaDynamoDBExecutionRole",
+ "UpdateDate": "2015-04-09T15:09:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaENIManagementAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaENIManagementAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T00:37:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJXAW2Q3KPTURUT2QC",
+ "PolicyName": "AWSLambdaENIManagementAccess",
+ "UpdateDate": "2016-12-06T00:37:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaExecute": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaExecute",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJE5FX7FQZSU5XAKGO",
+ "PolicyName": "AWSLambdaExecute",
+ "UpdateDate": "2015-02-06T18:40:46+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-25T19:08:45+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "cognito-identity:ListIdentityPools",
+ "cognito-sync:GetCognitoEvents",
+ "cognito-sync:SetCognitoEvents",
+ "dynamodb:*",
+ "events:*",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "kinesis:PutRecord",
+ "lambda:*",
+ "logs:*",
+ "s3:*",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:Publish",
+ "sqs:ListQueues",
+ "sqs:SendMessage",
+ "tag:GetResources",
+ "kms:ListAliases",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "iot:GetTopicRule",
+ "iot:ListTopicRules",
+ "iot:CreateTopicRule",
+ "iot:ReplaceTopicRule",
+ "iot:AttachPrincipalPolicy",
+ "iot:AttachThingPrincipal",
+ "iot:CreateKeysAndCertificate",
+ "iot:CreatePolicy",
+ "iot:CreateThing",
+ "iot:ListPolicies",
+ "iot:ListThings",
+ "iot:DescribeEndpoint",
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI6E2CYYMI4XI7AA5K",
+ "PolicyName": "AWSLambdaFullAccess",
+ "UpdateDate": "2017-05-25T19:08:45+00:00",
+ "VersionId": "v7"
+ },
+ "AWSLambdaInvocation-DynamoDB": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaInvocation-DynamoDB",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:DescribeStream",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJTHQ3EKCQALQDYG5G",
+ "PolicyName": "AWSLambdaInvocation-DynamoDB",
+ "UpdateDate": "2015-02-06T18:40:47+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaKinesisExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:14:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:DescribeStream",
+ "kinesis:GetRecords",
+ "kinesis:GetShardIterator",
+ "kinesis:ListStreams",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJHOLKJPXV4GBRMJUQ",
+ "PolicyName": "AWSLambdaKinesisExecutionRole",
+ "UpdateDate": "2015-04-09T15:14:16+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-04T18:22:29+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cognito-identity:ListIdentityPools",
+ "cognito-sync:GetCognitoEvents",
+ "dynamodb:BatchGetItem",
+ "dynamodb:DescribeStream",
+ "dynamodb:DescribeTable",
+ "dynamodb:GetItem",
+ "dynamodb:ListStreams",
+ "dynamodb:ListTables",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "events:List*",
+ "events:Describe*",
+ "iam:ListRoles",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "lambda:List*",
+ "lambda:Get*",
+ "logs:DescribeMetricFilters",
+ "logs:GetLogEvents",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "s3:Get*",
+ "s3:List*",
+ "sns:ListTopics",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sqs:ListQueues",
+ "tag:GetResources",
+ "kms:ListAliases",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "iot:GetTopicRules",
+ "iot:ListTopicRules",
+ "iot:ListPolicies",
+ "iot:ListThings",
+ "iot:DescribeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJLDG7J3CGUHFN4YN6",
+ "PolicyName": "AWSLambdaReadOnlyAccess",
+ "UpdateDate": "2017-05-04T18:22:29+00:00",
+ "VersionId": "v6"
+ },
+ "AWSLambdaRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJX4DPCRGTC4NFDUXI",
+ "PolicyName": "AWSLambdaRole",
+ "UpdateDate": "2015-02-06T18:41:28+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaVPCAccessExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-11T23:15:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJVTME3YLVNL72YR2K",
+ "PolicyName": "AWSLambdaVPCAccessExecutionRole",
+ "UpdateDate": "2016-02-11T23:15:26+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-11T17:21:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:List*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcs",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI2DV5ULJSO2FYVPYG",
+ "PolicyName": "AWSMarketplaceFullAccess",
+ "UpdateDate": "2015-02-11T17:21:45+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceGetEntitlements": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceGetEntitlements",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-27T19:37:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:GetEntitlements"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJLPIMQE4WMHDC2K7C",
+ "PolicyName": "AWSMarketplaceGetEntitlements",
+ "UpdateDate": "2017-03-27T19:37:24+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceManageSubscriptions": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceManageSubscriptions",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ViewSubscriptions",
+ "aws-marketplace:Subscribe",
+ "aws-marketplace:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJRDW2WIFN7QLUAKBQ",
+ "PolicyName": "AWSMarketplaceManageSubscriptions",
+ "UpdateDate": "2015-02-06T18:40:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceMeteringFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceMeteringFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-03-17T22:39:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:MeterUsage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ65YJPG7CC7LDXNA6",
+ "PolicyName": "AWSMarketplaceMeteringFullAccess",
+ "UpdateDate": "2016-03-17T22:39:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceRead-only": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceRead-only",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ViewSubscriptions",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJOOM6LETKURTJ3XZ2",
+ "PolicyName": "AWSMarketplaceRead-only",
+ "UpdateDate": "2015-02-06T18:40:31+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubDMSAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubDMSAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:00:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:CreateProgressUpdateStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS"
+ },
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:DescribeMigrationTask",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:ListDiscoveredResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIUQB56VA4JHLN7G2W",
+ "PolicyName": "AWSMigrationHubDMSAccess",
+ "UpdateDate": "2017-08-14T14:00:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubDiscoveryAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubDiscoveryAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:30:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "discovery:ListConfigurations",
+ "discovery:DescribeConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAITRMRLSV7JAL6YIGG",
+ "PolicyName": "AWSMigrationHubDiscoveryAccess",
+ "UpdateDate": "2017-08-14T13:30:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMigrationHubFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:09:27+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:*",
+ "discovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ4A2SZKHUYHDYIGOK",
+ "PolicyName": "AWSMigrationHubFullAccess",
+ "UpdateDate": "2017-08-14T14:09:27+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMigrationHubSMSAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubSMSAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:57:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:CreateProgressUpdateStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS"
+ },
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:DescribeMigrationTask",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:ListDiscoveredResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIWQYYT6TSVIRJO4TY",
+ "PolicyName": "AWSMigrationHubSMSAccess",
+ "UpdateDate": "2017-08-14T13:57:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMobileHub_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMobileHub_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-10T22:23:47+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET",
+ "apigateway:GetRestApis",
+ "apigateway:GetResources",
+ "apigateway:POST",
+ "apigateway:TestInvokeMethod",
+ "dynamodb:DescribeTable",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "iam:ListSAMLProviders",
+ "lambda:ListFunctions",
+ "sns:ListTopics",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetBot",
+ "lex:GetBots",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "mobilehub:CreateProject",
+ "mobilehub:DeleteProject",
+ "mobilehub:UpdateProject",
+ "mobilehub:ExportProject",
+ "mobilehub:ImportProject",
+ "mobilehub:SynchronizeProject",
+ "mobilehub:GenerateProjectParameters",
+ "mobilehub:GetProject",
+ "mobilehub:GetProjectSnapshot",
+ "mobilehub:ListAvailableConnectors",
+ "mobilehub:ListAvailableFeatures",
+ "mobilehub:ListAvailableRegions",
+ "mobilehub:ListProjects",
+ "mobilehub:ValidateProject",
+ "mobilehub:VerifyServiceRole",
+ "mobilehub:DescribeBundle",
+ "mobilehub:ExportBundle",
+ "mobilehub:ListBundles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/aws-my-sample-app*.zip"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIJLU43R6AGRBK76DM",
+ "PolicyName": "AWSMobileHub_FullAccess",
+ "UpdateDate": "2017-08-10T22:23:47+00:00",
+ "VersionId": "v10"
+ },
+ "AWSMobileHub_ReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMobileHub_ReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-10T22:08:23+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeTable",
+ "iam:ListSAMLProviders",
+ "lambda:ListFunctions",
+ "sns:ListTopics",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetBot",
+ "lex:GetBots",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "mobilehub:ExportProject",
+ "mobilehub:GenerateProjectParameters",
+ "mobilehub:GetProject",
+ "mobilehub:GetProjectSnapshot",
+ "mobilehub:ListAvailableConnectors",
+ "mobilehub:ListAvailableFeatures",
+ "mobilehub:ListAvailableRegions",
+ "mobilehub:ListProjects",
+ "mobilehub:ValidateProject",
+ "mobilehub:VerifyServiceRole",
+ "mobilehub:DescribeBundle",
+ "mobilehub:ExportBundle",
+ "mobilehub:ListBundles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/aws-my-sample-app*.zip"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIBXVYVL3PWQFBZFGW",
+ "PolicyName": "AWSMobileHub_ReadOnly",
+ "UpdateDate": "2017-08-10T22:08:23+00:00",
+ "VersionId": "v8"
+ },
+ "AWSMobileHub_ServiceUseOnly": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMobileHub_ServiceUseOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-02T23:35:49+00:00",
+ "DefaultVersionId": "v23",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateUploadBucket",
+ "cloudformation:ValidateTemplate",
+ "cloudfront:CreateDistribution",
+ "cloudfront:DeleteDistribution",
+ "cloudfront:GetDistribution",
+ "cloudfront:GetDistributionConfig",
+ "cloudfront:UpdateDistribution",
+ "cognito-identity:CreateIdentityPool",
+ "cognito-identity:UpdateIdentityPool",
+ "cognito-identity:DeleteIdentityPool",
+ "cognito-identity:SetIdentityPoolRoles",
+ "cognito-idp:CreateUserPool",
+ "dynamodb:CreateTable",
+ "dynamodb:DeleteTable",
+ "dynamodb:DescribeTable",
+ "dynamodb:UpdateTable",
+ "iam:AddClientIDToOpenIDConnectProvider",
+ "iam:CreateOpenIDConnectProvider",
+ "iam:GetOpenIDConnectProvider",
+ "iam:ListOpenIDConnectProviders",
+ "iam:CreateSAMLProvider",
+ "iam:GetSAMLProvider",
+ "iam:ListSAMLProvider",
+ "iam:UpdateSAMLProvider",
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "mobileanalytics:CreateApp",
+ "mobileanalytics:DeleteApp",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListPlatformApplications",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "lex:PutIntent",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:PutSlotType",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:PutBot",
+ "lex:GetBot",
+ "lex:GetBots",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:CreatePlatformApplication",
+ "sns:DeletePlatformApplication",
+ "sns:GetPlatformApplicationAttributes",
+ "sns:SetPlatformApplicationAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:app/*_MOBILEHUB_*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteBucketWebsite",
+ "s3:ListBucket",
+ "s3:ListBucketVersions",
+ "s3:GetBucketLocation",
+ "s3:GetBucketVersioning",
+ "s3:PutBucketVersioning",
+ "s3:PutBucketWebsite",
+ "s3:PutBucketPolicy",
+ "s3:SetBucketCrossOriginConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*-userfiles-mobilehub-*",
+ "arn:aws:s3:::*-contentdelivery-mobilehub-*",
+ "arn:aws:s3:::*-hosting-mobilehub-*",
+ "arn:aws:s3:::*-deployments-mobilehub-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:DeleteVersion",
+ "s3:DeleteObjectVersion",
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*-userfiles-mobilehub-*/*",
+ "arn:aws:s3:::*-contentdelivery-mobilehub-*/*",
+ "arn:aws:s3:::*-hosting-mobilehub-*/*",
+ "arn:aws:s3:::*-deployments-mobilehub-*/*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:CreateAlias",
+ "lambda:DeleteAlias",
+ "lambda:UpdateAlias",
+ "lambda:GetFunctionConfiguration",
+ "lambda:GetPolicy",
+ "lambda:RemovePermission",
+ "lambda:UpdateFunctionCode",
+ "lambda:UpdateFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*-mobilehub-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateRole",
+ "iam:DeleteRole",
+ "iam:DeleteRolePolicy",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListRolePolicies",
+ "iam:PassRole",
+ "iam:PutRolePolicy",
+ "iam:UpdateAssumeRolePolicy",
+ "iam:AttachRolePolicy",
+ "iam:DetachRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*_unauth_MOBILEHUB_*",
+ "arn:aws:iam::*:role/*_auth_MOBILEHUB_*",
+ "arn:aws:iam::*:role/*_consolepush_MOBILEHUB_*",
+ "arn:aws:iam::*:role/*_lambdaexecutionrole_MOBILEHUB_*",
+ "arn:aws:iam::*:role/*_smsverification_MOBILEHUB_*",
+ "arn:aws:iam::*:role/*_botexecutionrole_MOBILEHUB_*",
+ "arn:aws:iam::*:role/pinpoint-events",
+ "arn:aws:iam::*:role/MOBILEHUB-*-lambdaexecution*",
+ "arn:aws:iam::*:role/MobileHub_Service_Role"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/mobilehub/*:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/MobileHub_Service_Role"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStackResources",
+ "cloudformation:ListStacks",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/MOBILEHUB-*"
+ ]
+ },
+ {
+ "Action": [
+ "apigateway:DELETE",
+ "apigateway:GET",
+ "apigateway:HEAD",
+ "apigateway:OPTIONS",
+ "apigateway:PATCH",
+ "apigateway:POST",
+ "apigateway:PUT"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/restapis*"
+ ]
+ },
+ {
+ "Action": [
+ "cognito-idp:DeleteUserPool",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:DeleteUserPoolClient"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cognito-idp:*:*:userpool/*"
+ ]
+ },
+ {
+ "Action": [
+ "mobiletargeting:UpdateApnsChannel",
+ "mobiletargeting:UpdateApnsSandboxChannel",
+ "mobiletargeting:UpdateEmailChannel",
+ "mobiletargeting:UpdateGcmChannel",
+ "mobiletargeting:UpdateSmsChannel",
+ "mobiletargeting:DeleteApnsChannel",
+ "mobiletargeting:DeleteApnsSandboxChannel",
+ "mobiletargeting:DeleteEmailChannel",
+ "mobiletargeting:DeleteGcmChannel",
+ "mobiletargeting:DeleteSmsChannel"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:mobiletargeting:*:*:apps/*/channels/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIUHPQXBDZUWOP3PSK",
+ "PolicyName": "AWSMobileHub_ServiceUseOnly",
+ "UpdateDate": "2017-06-02T23:35:49+00:00",
+ "VersionId": "v23"
+ },
+ "AWSOpsWorksCMInstanceProfileRole": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksCMInstanceProfileRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-24T09:48:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:ListMultipartUploadParts",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-opsworks-cm-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAICSU3OSHCURP2WIZW",
+ "PolicyName": "AWSOpsWorksCMInstanceProfileRole",
+ "UpdateDate": "2016-11-24T09:48:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksCMServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSOpsWorksCMServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-03T12:00:07+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteObject",
+ "s3:DeleteBucket",
+ "s3:GetObject",
+ "s3:HeadBucket",
+ "s3:ListBucket",
+ "s3:ListObjects",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:DescribeInstanceInformation",
+ "ssm:GetCommandInvocation",
+ "ssm:ListCommandInvocations",
+ "ssm:ListCommands"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ssm:resourceTag/aws:cloudformation:stack-name": "aws-opsworks-cm-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*::document/*",
+ "arn:aws:s3:::aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateImage",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateTags",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeregisterImage",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RunInstances",
+ "ec2:StopInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-name": "aws-opsworks-cm-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-opsworks-cm-*",
+ "arn:aws:iam::*:role/service-role/aws-opsworks-cm-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJ6I6MPGJE62URSHCO",
+ "PolicyName": "AWSOpsWorksCMServiceRole",
+ "UpdateDate": "2017-04-03T12:00:07+00:00",
+ "VersionId": "v6"
+ },
+ "AWSOpsWorksCloudWatchLogs": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksCloudWatchLogs",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-30T17:47:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJXFIK7WABAY5CPXM4",
+ "PolicyName": "AWSOpsWorksCloudWatchLogs",
+ "UpdateDate": "2017-03-30T17:47:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:*",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "iam:GetRolePolicy",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAICN26VXMXASXKOQCG",
+ "PolicyName": "AWSOpsWorksFullAccess",
+ "UpdateDate": "2015-02-06T18:40:48+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksInstanceRegistration": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksInstanceRegistration",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-03T14:23:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:DescribeStackProvisioningParameters",
+ "opsworks:DescribeStacks",
+ "opsworks:RegisterInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJG3LCPVNI4WDZCIMU",
+ "PolicyName": "AWSOpsWorksInstanceRegistration",
+ "UpdateDate": "2016-06-03T14:23:15+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksRegisterCLI": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksRegisterCLI",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:AssignInstance",
+ "opsworks:CreateStack",
+ "opsworks:CreateLayer",
+ "opsworks:DeregisterInstance",
+ "opsworks:DescribeInstances",
+ "opsworks:DescribeStackProvisioningParameters",
+ "opsworks:DescribeStacks",
+ "opsworks:UnassignInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:AddUserToGroup",
+ "iam:CreateAccessKey",
+ "iam:CreateGroup",
+ "iam:CreateUser",
+ "iam:ListInstanceProfiles",
+ "iam:PassRole",
+ "iam:PutUserPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ3AB5ZBFPCQGTVDU4",
+ "PolicyName": "AWSOpsWorksRegisterCLI",
+ "UpdateDate": "2015-02-06T18:40:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSOpsWorksRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "iam:GetRolePolicy",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "iam:PassRole",
+ "opsworks:*",
+ "rds:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIDUTMOKHJFAPJV45W",
+ "PolicyName": "AWSOpsWorksRole",
+ "UpdateDate": "2015-02-06T18:41:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightDescribeRDS": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightDescribeRDS",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:24:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJU5J6OAMCJD3OO76O",
+ "PolicyName": "AWSQuickSightDescribeRDS",
+ "UpdateDate": "2015-11-10T23:24:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightDescribeRedshift": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightDescribeRedshift",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:25:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJFEM6MLSLTW4ZNBW2",
+ "PolicyName": "AWSQuickSightDescribeRedshift",
+ "UpdateDate": "2015-11-10T23:25:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightListIAM": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightListIAM",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:25:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI3CH5UUWZN4EKGILO",
+ "PolicyName": "AWSQuickSightListIAM",
+ "UpdateDate": "2015-11-10T23:25:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuicksightAthenaAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuicksightAthenaAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-11T23:37:32+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "athena:BatchGetQueryExecution",
+ "athena:CancelQueryExecution",
+ "athena:GetCatalogs",
+ "athena:GetExecutionEngine",
+ "athena:GetExecutionEngines",
+ "athena:GetNamespace",
+ "athena:GetNamespaces",
+ "athena:GetQueryExecution",
+ "athena:GetQueryExecutions",
+ "athena:GetQueryResults",
+ "athena:GetTable",
+ "athena:GetTables",
+ "athena:ListQueryExecutions",
+ "athena:RunQuery",
+ "athena:StartQueryExecution",
+ "athena:StopQueryExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:DeleteTable",
+ "glue:BatchDeleteTable",
+ "glue:UpdateTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:BatchCreatePartition",
+ "glue:CreatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:UpdatePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-athena-query-results-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI4JB77JXFQXDWNRPM",
+ "PolicyName": "AWSQuicksightAthenaAccess",
+ "UpdateDate": "2017-08-11T23:37:32+00:00",
+ "VersionId": "v3"
+ },
+ "AWSStepFunctionsConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T00:19:34+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "states:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/StatesExecutionRole*"
+ },
+ {
+ "Action": "lambda:ListFunctions",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJIYC52YWRX6OSMJWK",
+ "PolicyName": "AWSStepFunctionsConsoleFullAccess",
+ "UpdateDate": "2017-01-12T00:19:34+00:00",
+ "VersionId": "v2"
+ },
+ "AWSStepFunctionsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-11T21:51:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "states:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJXKA6VP3UFBVHDPPA",
+ "PolicyName": "AWSStepFunctionsFullAccess",
+ "UpdateDate": "2017-01-11T21:51:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStepFunctionsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-11T21:46:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "states:ListStateMachines",
+ "states:ListActivities",
+ "states:DescribeStateMachine",
+ "states:ListExecutions",
+ "states:DescribeExecution",
+ "states:GetExecutionHistory",
+ "states:DescribeActivity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJONHB2TJQDJPFW5TM",
+ "PolicyName": "AWSStepFunctionsReadOnlyAccess",
+ "UpdateDate": "2017-01-11T21:46:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStorageGatewayFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStorageGatewayFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "storagegateway:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DeleteSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJG5SSPAVOGK3SIDGU",
+ "PolicyName": "AWSStorageGatewayFullAccess",
+ "UpdateDate": "2015-02-06T18:41:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStorageGatewayReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStorageGatewayReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "storagegateway:List*",
+ "storagegateway:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIFKCTUVOPD5NICXJK",
+ "PolicyName": "AWSStorageGatewayReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSupportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSupportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "support:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJSNKQX2OW67GF4S7E",
+ "PolicyName": "AWSSupportAccess",
+ "UpdateDate": "2015-02-06T18:41:11+00:00",
+ "VersionId": "v1"
+ },
+ "AWSWAFFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-07T21:33:25+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "waf:*",
+ "waf-regional:*",
+ "elasticloadbalancing:SetWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJMIKIAFXZEGOLRH7C",
+ "PolicyName": "AWSWAFFullAccess",
+ "UpdateDate": "2016-12-07T21:33:25+00:00",
+ "VersionId": "v2"
+ },
+ "AWSWAFReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-07T21:30:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "waf:Get*",
+ "waf:List*",
+ "waf-regional:Get*",
+ "waf-regional:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAINZVDMX2SBF7EU2OC",
+ "PolicyName": "AWSWAFReadOnlyAccess",
+ "UpdateDate": "2016-12-07T21:30:54+00:00",
+ "VersionId": "v2"
+ },
+ "AWSXrayFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:30:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQBYG45NSJMVQDB2K",
+ "PolicyName": "AWSXrayFullAccess",
+ "UpdateDate": "2016-12-01T18:30:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSXrayReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:27:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:BatchGetTraces",
+ "xray:GetServiceGraph",
+ "xray:GetTraceGraph",
+ "xray:GetTraceSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIH4OFXWPS6ZX6OPGQ",
+ "PolicyName": "AWSXrayReadOnlyAccess",
+ "UpdateDate": "2016-12-01T18:27:02+00:00",
+ "VersionId": "v1"
+ },
+ "AWSXrayWriteOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:19:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIAACM4LMYSRGBCTM6",
+ "PolicyName": "AWSXrayWriteOnlyAccess",
+ "UpdateDate": "2016-12-01T18:19:53+00:00",
+ "VersionId": "v1"
+ },
+ "AdministratorAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AdministratorAccess",
+ "AttachmentCount": 3,
+ "CreateDate": "2015-02-06T18:39:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWMBCKSKIEE64ZLYK",
+ "PolicyName": "AdministratorAccess",
+ "UpdateDate": "2015-02-06T18:39:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAPIGatewayAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAPIGatewayAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:34:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:apigateway:*::/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ4PT6VY5NLKTNUYSI",
+ "PolicyName": "AmazonAPIGatewayAdministrator",
+ "UpdateDate": "2015-07-09T17:34:45+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAPIGatewayInvokeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAPIGatewayInvokeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:36:12+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "execute-api:Invoke"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:execute-api:*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIIWAX2NOOQJ4AIEQ6",
+ "PolicyName": "AmazonAPIGatewayInvokeFullAccess",
+ "UpdateDate": "2015-07-09T17:36:12+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAPIGatewayPushToCloudWatchLogs": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-11T23:41:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents",
+ "logs:GetLogEvents",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIK4GFO7HLKYN64ASK",
+ "PolicyName": "AmazonAPIGatewayPushToCloudWatchLogs",
+ "UpdateDate": "2015-11-11T23:41:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAppStreamFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppStreamFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-07T23:56:23+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/ApplicationAutoScalingForAmazonAppStreamAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJLZZXU2YQVGL4QDNC",
+ "PolicyName": "AmazonAppStreamFullAccess",
+ "UpdateDate": "2017-09-07T23:56:23+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonAppStreamReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppStreamReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-07T21:00:06+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:Get*",
+ "appstream:List*",
+ "appstream:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJXIFDGB4VBX23DX7K",
+ "PolicyName": "AmazonAppStreamReadOnlyAccess",
+ "UpdateDate": "2016-12-07T21:00:06+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonAppStreamServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonAppStreamServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-23T23:00:47+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSubnets",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:GetObjectVersion",
+ "s3:DeleteObjectVersion",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::appstream2-36fb080bb8-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAISBRZ7LMMCBYEF3SE",
+ "PolicyName": "AmazonAppStreamServiceAccess",
+ "UpdateDate": "2017-05-23T23:00:47+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonAthenaFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAthenaFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-13T00:13:48+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "athena:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:DeleteTable",
+ "glue:BatchDeleteTable",
+ "glue:UpdateTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:BatchCreatePartition",
+ "glue:CreatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:UpdatePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-athena-query-results-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::athena-examples*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIPJMLMD4C7RYZ6XCK",
+ "PolicyName": "AmazonAthenaFullAccess",
+ "UpdateDate": "2017-09-13T00:13:48+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonCloudDirectoryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudDirectoryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-25T00:41:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "clouddirectory:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJG3XQK77ATFLCF2CK",
+ "PolicyName": "AmazonCloudDirectoryFullAccess",
+ "UpdateDate": "2017-02-25T00:41:39+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudDirectoryReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudDirectoryReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-28T23:42:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "clouddirectory:List*",
+ "clouddirectory:Get*",
+ "clouddirectory:LookupPolicy",
+ "clouddirectory:BatchRead"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAICMSZQGR3O62KMD6M",
+ "PolicyName": "AmazonCloudDirectoryReadOnlyAccess",
+ "UpdateDate": "2017-02-28T23:42:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCognitoDeveloperAuthenticatedIdentities": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoDeveloperAuthenticatedIdentities",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-03-24T17:22:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:GetOpenIdTokenForDeveloperIdentity",
+ "cognito-identity:LookupDeveloperIdentity",
+ "cognito-identity:MergeDeveloperIdentities",
+ "cognito-identity:UnlinkDeveloperIdentity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIQOKZ5BGKLCMTXH4W",
+ "PolicyName": "AmazonCognitoDeveloperAuthenticatedIdentities",
+ "UpdateDate": "2015-03-24T17:22:23+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCognitoPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-02T16:57:56+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:*",
+ "cognito-idp:*",
+ "cognito-sync:*",
+ "iam:ListRoles",
+ "iam:ListOpenIdConnectProviders",
+ "sns:ListPlatformApplications"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKW5H2HNCPGCYGR6Y",
+ "PolicyName": "AmazonCognitoPowerUser",
+ "UpdateDate": "2016-06-02T16:57:56+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonCognitoReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-02T17:30:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:Describe*",
+ "cognito-identity:Get*",
+ "cognito-identity:List*",
+ "cognito-idp:Describe*",
+ "cognito-idp:AdminGetUser",
+ "cognito-idp:List*",
+ "cognito-sync:Describe*",
+ "cognito-sync:Get*",
+ "cognito-sync:List*",
+ "iam:ListOpenIdConnectProviders",
+ "iam:ListRoles",
+ "sns:ListPlatformApplications"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJBFTRZD2GQGJHSVQK",
+ "PolicyName": "AmazonCognitoReadOnly",
+ "UpdateDate": "2016-06-02T17:30:24+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonDMSCloudWatchLogsRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSCloudWatchLogsRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-07T23:44:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowDescribeOnAllLogGroups"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*"
+ ],
+ "Sid": "AllowDescribeOfAllLogStreamsOnDmsTasksLogGroup"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*"
+ ],
+ "Sid": "AllowCreationOfDmsTasksLogGroups"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*:log-stream:dms-task-*"
+ ],
+ "Sid": "AllowCreationOfDmsTaskLogStream"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*:log-stream:dms-task-*"
+ ],
+ "Sid": "AllowUploadOfLogEventsToDmsTaskLogStream"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJBG7UXZZXUJD3TDJE",
+ "PolicyName": "AmazonDMSCloudWatchLogsRole",
+ "UpdateDate": "2016-01-07T23:44:53+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDMSRedshiftS3Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSRedshiftS3Role",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-04-20T17:05:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:DeleteBucket",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:GetObjectVersion",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy",
+ "s3:DeleteBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::dms-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI3CCUQ4U5WNC5F6B6",
+ "PolicyName": "AmazonDMSRedshiftS3Role",
+ "UpdateDate": "2016-04-20T17:05:56+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDMSVPCManagementRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSVPCManagementRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-23T16:29:57+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJHKIGMBQI4AEFFSYO",
+ "PolicyName": "AmazonDMSVPCManagementRole",
+ "UpdateDate": "2016-05-23T16:29:57+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonDRSVPCManagement": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDRSVPCManagement",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-02T00:09:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJPXIBTTZMBEFEX6UA",
+ "PolicyName": "AmazonDRSVPCManagement",
+ "UpdateDate": "2015-09-02T00:09:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDynamoDBFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-28T23:23:34+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:*",
+ "dax:*",
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "datapipeline:ActivatePipeline",
+ "datapipeline:CreatePipeline",
+ "datapipeline:DeletePipeline",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:PutPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:SetTopicAttributes",
+ "lambda:CreateFunction",
+ "lambda:ListFunctions",
+ "lambda:ListEventSourceMappings",
+ "lambda:CreateEventSourceMapping",
+ "lambda:DeleteEventSourceMapping",
+ "lambda:GetFunctionConfiguration",
+ "lambda:DeleteFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "application-autoscaling.amazonaws.com",
+ "dax.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAINUGF2JSOSUY76KYA",
+ "PolicyName": "AmazonDynamoDBFullAccess",
+ "UpdateDate": "2017-06-28T23:23:34+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonDynamoDBFullAccesswithDataPipeline": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccesswithDataPipeline",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-12T02:17:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "dynamodb:*",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsole"
+ },
+ {
+ "Action": [
+ "lambda:*",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsoleTriggers"
+ },
+ {
+ "Action": [
+ "datapipeline:*",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsoleImportExport"
+ },
+ {
+ "Action": [
+ "iam:GetRolePolicy",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "IAMEDPRoles"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DescribeInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "elasticmapreduce:*",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EMR"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:Put*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "S3"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ3ORT7KDISSXGHJXA",
+ "PolicyName": "AmazonDynamoDBFullAccesswithDataPipeline",
+ "UpdateDate": "2015-11-12T02:17:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonDynamoDBReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-12T21:11:40+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "dynamodb:BatchGetItem",
+ "dynamodb:DescribeTable",
+ "dynamodb:GetItem",
+ "dynamodb:ListTables",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:DescribeReservedCapacity",
+ "dynamodb:DescribeReservedCapacityOfferings",
+ "dynamodb:ListTagsOfResource",
+ "dynamodb:DescribeTimeToLive",
+ "dynamodb:DescribeLimits",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "lambda:ListFunctions",
+ "lambda:ListEventSourceMappings",
+ "lambda:GetFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIY2XFNA232XJ6J7X2",
+ "PolicyName": "AmazonDynamoDBReadOnlyAccess",
+ "UpdateDate": "2017-06-12T21:11:40+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonEC2ContainerRegistryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-21T17:06:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIESRL7KD7IIVF6V4W",
+ "PolicyName": "AmazonEC2ContainerRegistryFullAccess",
+ "UpdateDate": "2015-12-21T17:06:48+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2ContainerRegistryPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-10-11T22:28:07+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:GetRepositoryPolicy",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecr:DescribeImages",
+ "ecr:BatchGetImage",
+ "ecr:InitiateLayerUpload",
+ "ecr:UploadLayerPart",
+ "ecr:CompleteLayerUpload",
+ "ecr:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJDNE5PIHROIBGGDDW",
+ "PolicyName": "AmazonEC2ContainerRegistryPowerUser",
+ "UpdateDate": "2016-10-11T22:28:07+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerRegistryReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-10-11T22:08:43+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:GetRepositoryPolicy",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecr:DescribeImages",
+ "ecr:BatchGetImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIFYZPA37OOHVIH7KQ",
+ "PolicyName": "AmazonEC2ContainerRegistryReadOnly",
+ "UpdateDate": "2016-10-11T22:08:43+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerServiceAutoscaleRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceAutoscaleRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2016-05-12T23:25:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:DescribeServices",
+ "ecs:UpdateService"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIUAP3EGGGXXCPDQKK",
+ "PolicyName": "AmazonEC2ContainerServiceAutoscaleRole",
+ "UpdateDate": "2016-05-12T23:25:44+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2ContainerServiceEventsRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-30T16:51:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:RunTask"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAITKFNIUAG27VSYNZ4",
+ "PolicyName": "AmazonEC2ContainerServiceEventsRole",
+ "UpdateDate": "2017-05-30T16:51:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2ContainerServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-08T00:18:56+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "autoscaling:UpdateAutoScalingGroup",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStack*",
+ "cloudformation:UpdateStack",
+ "cloudwatch:GetMetricStatistics",
+ "ec2:Describe*",
+ "elasticloadbalancing:*",
+ "ecs:*",
+ "events:DescribeRule",
+ "events:DeleteRule",
+ "events:ListRuleNamesByTarget",
+ "events:ListTargetsByRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJALOYVTPDZEMIACSM",
+ "PolicyName": "AmazonEC2ContainerServiceFullAccess",
+ "UpdateDate": "2017-06-08T00:18:56+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonEC2ContainerServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2016-08-11T13:08:01+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:Describe*",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DeregisterTargets",
+ "elasticloadbalancing:Describe*",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJO53W2XHNACG7V77Q",
+ "PolicyName": "AmazonEC2ContainerServiceRole",
+ "UpdateDate": "2016-08-11T13:08:01+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerServiceforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-05-17T23:09:13+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:CreateCluster",
+ "ecs:DeregisterContainerInstance",
+ "ecs:DiscoverPollEndpoint",
+ "ecs:Poll",
+ "ecs:RegisterContainerInstance",
+ "ecs:StartTelemetrySession",
+ "ecs:UpdateContainerInstancesState",
+ "ecs:Submit*",
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJLYJCVHC7TQHCSQDS",
+ "PolicyName": "AmazonEC2ContainerServiceforEC2Role",
+ "UpdateDate": "2017-05-17T23:09:13+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonEC2FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2FullAccess",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:40:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI3VAJF5ZCRZ7MCQE6",
+ "PolicyName": "AmazonEC2FullAccess",
+ "UpdateDate": "2015-02-06T18:40:15+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIGDT4SV4GSETWTBZK",
+ "PolicyName": "AmazonEC2ReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:17+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2ReportsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ReportsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2-reports:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIU6NBZVF2PCRW36ZW",
+ "PolicyName": "AmazonEC2ReportsAccess",
+ "UpdateDate": "2015-02-06T18:40:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2RoleforAWSCodeDeploy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforAWSCodeDeploy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-20T17:14:10+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIAZKXZ27TAJ4PVWGK",
+ "PolicyName": "AmazonEC2RoleforAWSCodeDeploy",
+ "UpdateDate": "2017-03-20T17:14:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2RoleforDataPipelineRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforDataPipelineRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-22T17:24:05+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "datapipeline:*",
+ "dynamodb:*",
+ "ec2:Describe*",
+ "elasticmapreduce:AddJobFlowSteps",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:ListInstance*",
+ "elasticmapreduce:ModifyInstanceGroups",
+ "rds:Describe*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "s3:*",
+ "sdb:*",
+ "sns:*",
+ "sqs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJ3Z5I2WAJE5DN2J36",
+ "PolicyName": "AmazonEC2RoleforDataPipelineRole",
+ "UpdateDate": "2016-02-22T17:24:05+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2RoleforSSM": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-10T20:49:08+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAssociation",
+ "ssm:GetDeployablePatchSnapshotForInstance",
+ "ssm:GetDocument",
+ "ssm:GetParameters",
+ "ssm:ListAssociations",
+ "ssm:ListInstanceAssociations",
+ "ssm:PutInventory",
+ "ssm:PutComplianceItems",
+ "ssm:UpdateAssociationStatus",
+ "ssm:UpdateInstanceAssociationStatus",
+ "ssm:UpdateInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2messages:AcknowledgeMessage",
+ "ec2messages:DeleteMessage",
+ "ec2messages:FailMessage",
+ "ec2messages:GetEndpoint",
+ "ec2messages:GetMessages",
+ "ec2messages:SendReply"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ds:CreateComputer",
+ "ds:DescribeDirectories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:AbortMultipartUpload",
+ "s3:ListMultipartUploadParts",
+ "s3:ListBucketMultipartUploads"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-ssm-packages-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAI6TL3SMY22S4KMMX6",
+ "PolicyName": "AmazonEC2RoleforSSM",
+ "UpdateDate": "2017-08-10T20:49:08+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonEC2SpotFleetAutoscaleRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetAutoscaleRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-19T18:27:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIMFFRMIOBGDP2TAVE",
+ "PolicyName": "AmazonEC2SpotFleetAutoscaleRole",
+ "UpdateDate": "2016-08-19T18:27:22+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2SpotFleetRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T21:19:35+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:RequestSpotInstances",
+ "ec2:TerminateInstances",
+ "ec2:DescribeInstanceStatus",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIMRTKHWK7ESSNETSW",
+ "PolicyName": "AmazonEC2SpotFleetRole",
+ "UpdateDate": "2016-11-10T21:19:35+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2SpotFleetTaggingRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-26T19:10:35+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:RequestSpotInstances",
+ "ec2:TerminateInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJ5U6UMLCEYLX5OLC4",
+ "PolicyName": "AmazonEC2SpotFleetTaggingRole",
+ "UpdateDate": "2017-07-26T19:10:35+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonESFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonESFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-01T19:14:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJM6ZTCU24QL5PZCGC",
+ "PolicyName": "AmazonESFullAccess",
+ "UpdateDate": "2015-10-01T19:14:00+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonESReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonESReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-01T19:18:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:Describe*",
+ "es:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJUDMRLOQ7FPAR46FQ",
+ "PolicyName": "AmazonESReadOnlyAccess",
+ "UpdateDate": "2015-10-01T19:18:24+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElastiCacheFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "elasticache:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIA2V44CPHAUAAECKG",
+ "PolicyName": "AmazonElastiCacheFullAccess",
+ "UpdateDate": "2015-02-06T18:40:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElastiCacheReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElastiCacheReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticache:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIPDACSNQHSENWAKM2",
+ "PolicyName": "AmazonElastiCacheReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:21+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticFileSystemFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T10:18:34+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "elasticfilesystem:*",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKXTMNVQGIDNCKPBC",
+ "PolicyName": "AmazonElasticFileSystemFullAccess",
+ "UpdateDate": "2017-08-14T10:18:34+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonElasticFileSystemReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T10:09:49+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "elasticfilesystem:Describe*",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIPN5S4NE5JJOKVC4Y",
+ "PolicyName": "AmazonElasticFileSystemReadOnlyAccess",
+ "UpdateDate": "2017-08-14T10:09:49+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonElasticMapReduceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticMapReduceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-20T19:27:37+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateRoute",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteRoute",
+ "ec2:DeleteTags",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeNetworkAcls",
+ "ec2:CreateVpcEndpoint",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RunInstances",
+ "ec2:TerminateInstances",
+ "elasticmapreduce:*",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "kms:List*",
+ "s3:*",
+ "sdb:*",
+ "support:CreateCase",
+ "support:DescribeServices",
+ "support:DescribeSeverityLevels"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "elasticmapreduce.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/elasticmapreduce.amazonaws.com/AWSServiceRoleForEMRCleanup"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIZP5JFP3AMSGINBB2",
+ "PolicyName": "AmazonElasticMapReduceFullAccess",
+ "UpdateDate": "2017-09-20T19:27:37+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonElasticMapReduceReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticMapReduceReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-22T23:00:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:List*",
+ "elasticmapreduce:ViewEventsFromAllClustersInConsole",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sdb:Select",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIHP6NH2S6GYFCOINC",
+ "PolicyName": "AmazonElasticMapReduceReadOnlyAccess",
+ "UpdateDate": "2017-05-22T23:00:19+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElasticMapReduceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-17T21:29:50+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteTags",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcs",
+ "ec2:DetachNetworkInterface",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RunInstances",
+ "ec2:TerminateInstances",
+ "ec2:DeleteVolume",
+ "ec2:DescribeVolumeStatus",
+ "ec2:DescribeVolumes",
+ "ec2:DetachVolume",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListInstanceProfiles",
+ "iam:ListRolePolicies",
+ "iam:PassRole",
+ "s3:CreateBucket",
+ "s3:Get*",
+ "s3:List*",
+ "sdb:BatchPutAttributes",
+ "sdb:Select",
+ "sqs:CreateQueue",
+ "sqs:Delete*",
+ "sqs:GetQueue*",
+ "sqs:PurgeQueue",
+ "sqs:ReceiveMessage",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms",
+ "application-autoscaling:RegisterScalableTarget",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIDI2BQT2LKXZG36TW",
+ "PolicyName": "AmazonElasticMapReduceRole",
+ "UpdateDate": "2017-07-17T21:29:50+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonElasticMapReduceforAutoScalingRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforAutoScalingRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-18T01:09:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ModifyInstanceGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJSVXG6QHPE6VHDZ4Q",
+ "PolicyName": "AmazonElasticMapReduceforAutoScalingRole",
+ "UpdateDate": "2016-11-18T01:09:10+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticMapReduceforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforEC2Role",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-11T23:57:30+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "dynamodb:*",
+ "ec2:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:ListBootstrapActions",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSteps",
+ "kinesis:CreateStream",
+ "kinesis:DeleteStream",
+ "kinesis:DescribeStream",
+ "kinesis:GetRecords",
+ "kinesis:GetShardIterator",
+ "kinesis:MergeShards",
+ "kinesis:PutRecord",
+ "kinesis:SplitShard",
+ "rds:Describe*",
+ "s3:*",
+ "sdb:*",
+ "sns:*",
+ "sqs:*",
+ "glue:CreateDatabase",
+ "glue:UpdateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:CreateTable",
+ "glue:UpdateTable",
+ "glue:DeleteTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetTableVersions",
+ "glue:CreatePartition",
+ "glue:BatchCreatePartition",
+ "glue:UpdatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition",
+ "glue:CreateUserDefinedFunction",
+ "glue:UpdateUserDefinedFunction",
+ "glue:DeleteUserDefinedFunction",
+ "glue:GetUserDefinedFunction",
+ "glue:GetUserDefinedFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIGALS5RCDLZLB3PGS",
+ "PolicyName": "AmazonElasticMapReduceforEC2Role",
+ "UpdateDate": "2017-08-11T23:57:30+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonElasticTranscoderFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoderFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:*",
+ "cloudfront:*",
+ "s3:List*",
+ "s3:Put*",
+ "s3:Get*",
+ "s3:*MultipartUpload*",
+ "iam:CreateRole",
+ "iam:GetRolePolicy",
+ "iam:PassRole",
+ "iam:PutRolePolicy",
+ "iam:List*",
+ "sns:CreateTopic",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ4D5OJU75P5ZJZVNY",
+ "PolicyName": "AmazonElasticTranscoderFullAccess",
+ "UpdateDate": "2015-02-06T18:40:24+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticTranscoderJobsSubmitter": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoderJobsSubmitter",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:Read*",
+ "elastictranscoder:List*",
+ "elastictranscoder:*Job",
+ "elastictranscoder:*Preset",
+ "s3:List*",
+ "iam:List*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIN5WGARIKZ3E2UQOU",
+ "PolicyName": "AmazonElasticTranscoderJobsSubmitter",
+ "UpdateDate": "2015-02-06T18:40:25+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticTranscoderReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoderReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:Read*",
+ "elastictranscoder:List*",
+ "s3:List*",
+ "iam:List*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJGPP7GPMJRRJMEP3Q",
+ "PolicyName": "AmazonElasticTranscoderReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticTranscoderRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticTranscoderRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:Put*",
+ "s3:Get*",
+ "s3:*MultipartUpload*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "1"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "2"
+ },
+ {
+ "Action": [
+ "s3:*Policy*",
+ "sns:*Permission*",
+ "sns:*Delete*",
+ "s3:*Delete*",
+ "sns:*Remove*"
+ ],
+ "Effect": "Deny",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "3"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJNW3WMKVXFJ2KPIQ2",
+ "PolicyName": "AmazonElasticTranscoderRole",
+ "UpdateDate": "2015-02-06T18:41:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticsearchServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonElasticsearchServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-07T00:15:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973134"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAJFEWZPHXKLCVHEUIC",
+ "PolicyName": "AmazonElasticsearchServiceRolePolicy",
+ "UpdateDate": "2017-07-07T00:15:31+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonGlacierFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGlacierFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "glacier:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQSTZJWB2AXXAKHVQ",
+ "PolicyName": "AmazonGlacierFullAccess",
+ "UpdateDate": "2015-02-06T18:40:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonGlacierReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGlacierReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-05T18:46:10+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glacier:DescribeJob",
+ "glacier:DescribeVault",
+ "glacier:GetDataRetrievalPolicy",
+ "glacier:GetJobOutput",
+ "glacier:GetVaultAccessPolicy",
+ "glacier:GetVaultLock",
+ "glacier:GetVaultNotifications",
+ "glacier:ListJobs",
+ "glacier:ListMultipartUploads",
+ "glacier:ListParts",
+ "glacier:ListTagsForVault",
+ "glacier:ListVaults"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI2D5NJKMU274MET4E",
+ "PolicyName": "AmazonGlacierReadOnlyAccess",
+ "UpdateDate": "2016-05-05T18:46:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonInspectorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspectorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-12T17:42:57+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "inspector:*",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "sns:ListTopics",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI7Y6NTA27NWNA5U5E",
+ "PolicyName": "AmazonInspectorFullAccess",
+ "UpdateDate": "2017-09-12T17:42:57+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonInspectorReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspectorReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-12T16:53:06+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "inspector:Describe*",
+ "inspector:Get*",
+ "inspector:List*",
+ "inspector:LocalizeText",
+ "inspector:Preview*",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "sns:ListTopics",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJXQNTHTEJ2JFRN2SE",
+ "PolicyName": "AmazonInspectorReadOnlyAccess",
+ "UpdateDate": "2017-09-12T16:53:06+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonKinesisAnalyticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisAnalyticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-09-21T19:01:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kinesisanalytics:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:CreateStream",
+ "kinesis:DeleteStream",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "kinesis:PutRecord",
+ "kinesis:PutRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:GetLogEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListPolicyVersions",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/kinesis-analytics*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQOSKHTXP43R7P5AC",
+ "PolicyName": "AmazonKinesisAnalyticsFullAccess",
+ "UpdateDate": "2016-09-21T19:01:14+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisAnalyticsReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisAnalyticsReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-09-21T18:16:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesisanalytics:Describe*",
+ "kinesisanalytics:Get*",
+ "kinesisanalytics:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:GetLogEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListPolicyVersions",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIJIEXZAFUK43U7ARK",
+ "PolicyName": "AmazonKinesisAnalyticsReadOnly",
+ "UpdateDate": "2016-09-21T18:16:43+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFirehoseFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T18:45:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJMZQMTZ7FRBFHHAHI",
+ "PolicyName": "AmazonKinesisFirehoseFullAccess",
+ "UpdateDate": "2015-10-07T18:45:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFirehoseReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFirehoseReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T18:43:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:Describe*",
+ "firehose:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ36NT645INW4K24W6",
+ "PolicyName": "AmazonKinesisFirehoseReadOnlyAccess",
+ "UpdateDate": "2015-10-07T18:43:39+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kinesis:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIVF32HAMOXCUYRAYE",
+ "PolicyName": "AmazonKinesisFullAccess",
+ "UpdateDate": "2015-02-06T18:40:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kinesis:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIOCMTDT5RLKZ2CAJO",
+ "PolicyName": "AmazonKinesisReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLexFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-14T19:45:37+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "lambda:GetPolicy",
+ "lambda:ListFunctions",
+ "lex:*",
+ "polly:DescribeVoices",
+ "polly:SynthesizeSpeech"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:RemovePermission"
+ ],
+ "Condition": {
+ "StringLike": {
+ "lambda:Principal": "lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:AmazonLex*"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:DeleteRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots",
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DetachRolePolicy"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PolicyArn": "arn:aws:iam::aws:policy/aws-service-role/AmazonLexBotPolicy"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "channels.lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DetachRolePolicy"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PolicyArn": "arn:aws:iam::aws:policy/aws-service-role/LexChannelPolicy"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJVLXDHKVC23HRTKSI",
+ "PolicyName": "AmazonLexFullAccess",
+ "UpdateDate": "2017-04-14T19:45:37+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonLexReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-11T23:13:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:GetBot",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "lex:GetBots",
+ "lex:GetBotChannelAssociation",
+ "lex:GetBotChannelAssociations",
+ "lex:GetBotVersions",
+ "lex:GetBuiltinIntent",
+ "lex:GetBuiltinIntents",
+ "lex:GetBuiltinSlotTypes",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetIntentVersions",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetSlotTypeVersions",
+ "lex:GetUtterancesView"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJGBI5LSMAJNDGBNAM",
+ "PolicyName": "AmazonLexReadOnly",
+ "UpdateDate": "2017-04-11T23:13:33+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLexRunBotsOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexRunBotsOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-11T23:06:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:PostContent",
+ "lex:PostText"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJVZGB5CM3N6YWJHBE",
+ "PolicyName": "AmazonLexRunBotsOnly",
+ "UpdateDate": "2017-04-11T23:06:24+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningBatchPredictionsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningBatchPredictionsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:12:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:CreateBatchPrediction",
+ "machinelearning:DeleteBatchPrediction",
+ "machinelearning:DescribeBatchPredictions",
+ "machinelearning:GetBatchPrediction",
+ "machinelearning:UpdateBatchPrediction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAILOI4HTQSFTF3GQSC",
+ "PolicyName": "AmazonMachineLearningBatchPredictionsAccess",
+ "UpdateDate": "2015-04-09T17:12:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningCreateOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningCreateOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-29T20:55:03+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Add*",
+ "machinelearning:Create*",
+ "machinelearning:Delete*",
+ "machinelearning:Describe*",
+ "machinelearning:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJDRUNIC2RYAMAT3CK",
+ "PolicyName": "AmazonMachineLearningCreateOnlyAccess",
+ "UpdateDate": "2016-06-29T20:55:03+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMachineLearningFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:25:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWKW6AGSGYOQ5ERHC",
+ "PolicyName": "AmazonMachineLearningFullAccess",
+ "UpdateDate": "2015-04-09T17:25:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningManageRealTimeEndpointOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningManageRealTimeEndpointOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:32:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:CreateRealtimeEndpoint",
+ "machinelearning:DeleteRealtimeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJJL3PC3VCSVZP6OCI",
+ "PolicyName": "AmazonMachineLearningManageRealTimeEndpointOnlyAccess",
+ "UpdateDate": "2015-04-09T17:32:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:40:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Describe*",
+ "machinelearning:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIW5VYBCGEX56JCINC",
+ "PolicyName": "AmazonMachineLearningReadOnlyAccess",
+ "UpdateDate": "2015-04-09T17:40:02+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningRealTimePredictionOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningRealTimePredictionOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:44:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Predict"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWMCNQPRWMWT36GVQ",
+ "PolicyName": "AmazonMachineLearningRealTimePredictionOnlyAccess",
+ "UpdateDate": "2015-04-09T17:44:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningRoleforRedshiftDataSource": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMachineLearningRoleforRedshiftDataSource",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:05:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:RevokeSecurityGroupIngress",
+ "redshift:AuthorizeClusterSecurityGroupIngress",
+ "redshift:CreateClusterSecurityGroup",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:ModifyCluster",
+ "redshift:RevokeClusterSecurityGroupIngress",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy",
+ "s3:GetObject",
+ "s3:PutBucketPolicy",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIQ5UDYYMNN42BM4AK",
+ "PolicyName": "AmazonMachineLearningRoleforRedshiftDataSource",
+ "UpdateDate": "2015-04-09T17:05:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMacieFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:54:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "macie:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJJF2N5FR6S5TZN5OA",
+ "PolicyName": "AmazonMacieFullAccess",
+ "UpdateDate": "2017-08-14T14:54:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMacieServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:53:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJVV7PON3FPBL2PSGC",
+ "PolicyName": "AmazonMacieServiceRole",
+ "UpdateDate": "2017-08-14T14:53:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieSetupRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMacieSetupRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:53:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "iam:ListAccountAliases",
+ "s3:GetBucket*",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudtrail:CreateTrail",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudtrail:UpdateTrail",
+ "cloudtrail:DeleteTrail",
+ "cloudtrail:PutEventSelectors"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/AWSMacieTrail-DO-NOT-EDIT"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteBucketWebsite",
+ "s3:DeleteObject",
+ "s3:DeleteObjectTagging",
+ "s3:DeleteObjectVersion",
+ "s3:DeleteObjectVersionTagging",
+ "s3:DeleteReplicationConfiguration",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awsmacie-*",
+ "arn:aws:s3:::awsmacietrail-*",
+ "arn:aws:s3:::*-awsmacietrail-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJ5DC6UBVKND7ADSKA",
+ "PolicyName": "AmazonMacieSetupRole",
+ "UpdateDate": "2017-08-14T14:53:34+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMechanicalTurkFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMechanicalTurkFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-11T19:08:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mechanicalturk:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJDGCL5BET73H5QIQC",
+ "PolicyName": "AmazonMechanicalTurkFullAccess",
+ "UpdateDate": "2015-12-11T19:08:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMechanicalTurkReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMechanicalTurkReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-27T21:45:50+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mechanicalturk:Get*",
+ "mechanicalturk:Search*",
+ "mechanicalturk:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIO5IY3G3WXSX5PPRM",
+ "PolicyName": "AmazonMechanicalTurkReadOnly",
+ "UpdateDate": "2017-02-27T21:45:50+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMobileAnalyticsFinancialReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsFinancialReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mobileanalytics:GetReports",
+ "mobileanalytics:GetFinancialReports"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKJHO2R27TXKCWBU4",
+ "PolicyName": "AmazonMobileAnalyticsFinancialReportAccess",
+ "UpdateDate": "2015-02-06T18:40:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIJIKLU2IJ7WJ6DZFG",
+ "PolicyName": "AmazonMobileAnalyticsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:34+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsNon-financialReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsNon-financialReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:GetReports",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIQLKQ4RXPUBBVVRDE",
+ "PolicyName": "AmazonMobileAnalyticsNon-financialReportAccess",
+ "UpdateDate": "2015-02-06T18:40:36+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsWriteOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsWriteOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:PutEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ5TAWBBQC2FAL3G6G",
+ "PolicyName": "AmazonMobileAnalyticsWriteOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:37+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonPollyFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPollyFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T18:59:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJUZOYQU6XQYPR7EWS",
+ "PolicyName": "AmazonPollyFullAccess",
+ "UpdateDate": "2016-11-30T18:59:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonPollyReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T18:59:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:DescribeVoices",
+ "polly:GetLexicon",
+ "polly:ListLexicons",
+ "polly:SynthesizeSpeech"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ5FENL3CVPL2FPDLA",
+ "PolicyName": "AmazonPollyReadOnlyAccess",
+ "UpdateDate": "2016-11-30T18:59:24+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSDirectoryServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonRDSDirectoryServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-26T02:02:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "ds:AuthorizeApplication",
+ "ds:UnauthorizeApplication"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIL4KBY57XWMYUHKUU",
+ "PolicyName": "AmazonRDSDirectoryServiceAccess",
+ "UpdateDate": "2016-02-26T02:02:05+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSEnhancedMonitoringRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-11-11T19:58:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:RDS*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:RDS*:log-stream:*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogStreams"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJV7BS425S4PTSSVGK",
+ "PolicyName": "AmazonRDSEnhancedMonitoringRole",
+ "UpdateDate": "2015-11-11T19:58:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRDSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-14T23:40:45+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:*",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "pi:*",
+ "Effect": "Allow",
+ "Resource": "arn:aws:pi:*:*:metrics/rds/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI3R4QMOG6Q5A4VWVG",
+ "PolicyName": "AmazonRDSFullAccess",
+ "UpdateDate": "2017-09-14T23:40:45+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonRDSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-28T21:36:32+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKTTTYV2IIHKLZ346",
+ "PolicyName": "AmazonRDSReadOnlyAccess",
+ "UpdateDate": "2017-08-28T21:36:32+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonRedshiftFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-19T18:27:44+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:*",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "sns:CreateTopic",
+ "sns:Get*",
+ "sns:List*",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:DisableAlarmActions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "redshift.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAISEKCHH4YDB46B5ZO",
+ "PolicyName": "AmazonRedshiftFullAccess",
+ "UpdateDate": "2017-09-19T18:27:44+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:Describe*",
+ "redshift:ViewQueriesInConsole",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "sns:Get*",
+ "sns:List*",
+ "cloudwatch:Describe*",
+ "cloudwatch:List*",
+ "cloudwatch:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIGD46KSON64QBSEZM",
+ "PolicyName": "AmazonRedshiftReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:51+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRedshiftServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRedshiftServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-18T19:19:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeAddress",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PolicyId": "ANPAJPY2VXNRUYOY3SRZS",
+ "PolicyName": "AmazonRedshiftServiceLinkedRolePolicy",
+ "UpdateDate": "2017-09-18T19:19:45+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRekognitionFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRekognitionFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T14:40:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rekognition:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIWDAOK6AIFDVX6TT6",
+ "PolicyName": "AmazonRekognitionFullAccess",
+ "UpdateDate": "2016-11-30T14:40:44+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRekognitionReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRekognitionReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T14:58:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rekognition:CompareFaces",
+ "rekognition:DetectFaces",
+ "rekognition:DetectLabels",
+ "rekognition:ListCollections",
+ "rekognition:ListFaces",
+ "rekognition:SearchFaces",
+ "rekognition:SearchFacesByImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAILWSUHXUY4ES43SA4",
+ "PolicyName": "AmazonRekognitionReadOnlyAccess",
+ "UpdateDate": "2016-11-30T14:58:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53DomainsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53DomainsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:CreateHostedZone",
+ "route53domains:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIPAFBMIYUILMOKL6G",
+ "PolicyName": "AmazonRoute53DomainsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:56+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53DomainsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53DomainsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53domains:Get*",
+ "route53domains:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIDRINP6PPTRXYVQCI",
+ "PolicyName": "AmazonRoute53DomainsReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:57+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-14T21:25:53+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:*",
+ "route53domains:*",
+ "cloudfront:ListDistributions",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticbeanstalk:DescribeEnvironments",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketWebsiteConfiguration",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRegions",
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJWVDLG5RPST6PHQ3A",
+ "PolicyName": "AmazonRoute53FullAccess",
+ "UpdateDate": "2017-02-14T21:25:53+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRoute53ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-15T21:15:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:Get*",
+ "route53:List*",
+ "route53:TestDNSAnswer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAITOYK2ZAOQFXV2JNC",
+ "PolicyName": "AmazonRoute53ReadOnlyAccess",
+ "UpdateDate": "2016-11-15T21:15:16+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonS3FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3FullAccess",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:40:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "s3:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIFIR6V6BVTRAHWINE",
+ "PolicyName": "AmazonS3FullAccess",
+ "UpdateDate": "2015-02-06T18:40:58+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonS3ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIZTJ4DXE7G6AGAE6M",
+ "PolicyName": "AmazonS3ReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:59+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSESFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSESFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ2P4NXCHAT7NDPNR4",
+ "PolicyName": "AmazonSESFullAccess",
+ "UpdateDate": "2015-02-06T18:41:02+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSESReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSESReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:Get*",
+ "ses:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAINV2XPFRMWJJNSCGI",
+ "PolicyName": "AmazonSESReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:03+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSNSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJWEKLCXXUNT2SOLSG",
+ "PolicyName": "AmazonSNSFullAccess",
+ "UpdateDate": "2015-02-06T18:41:05+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSNSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:GetTopicAttributes",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIZGQCQTFOFPMHSB6W",
+ "PolicyName": "AmazonSNSReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSNSRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJK5GQB7CIK7KHY2GA",
+ "PolicyName": "AmazonSNSRole",
+ "UpdateDate": "2015-02-06T18:41:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSQSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSQSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI65L554VRJ33ECQS6",
+ "PolicyName": "AmazonSQSFullAccess",
+ "UpdateDate": "2015-02-06T18:41:07+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSQSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSQSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIUGSSQY362XGCM6KW",
+ "PolicyName": "AmazonSQSReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:08+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMAutomationApproverAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMAutomationApproverAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-07T23:07:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAutomationExecutions",
+ "ssm:GetAutomationExecution",
+ "ssm:SendAutomationSignal"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIDSSXIRWBSLWWIORC",
+ "PolicyName": "AmazonSSMAutomationApproverAccess",
+ "UpdateDate": "2017-08-07T23:07:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMAutomationRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-24T23:29:12+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:Automation*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateImage",
+ "ec2:CopyImage",
+ "ec2:DeregisterImage",
+ "ec2:DescribeImages",
+ "ec2:DeleteSnapshot",
+ "ec2:StartInstances",
+ "ec2:RunInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:DescribeTags",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:UpdateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:Automation*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJIBQCTBCXD2XRNB6W",
+ "PolicyName": "AmazonSSMAutomationRole",
+ "UpdateDate": "2017-07-24T23:29:12+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonSSMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-03-07T21:09:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ds:CreateComputer",
+ "ds:DescribeDirectories",
+ "ec2:DescribeInstanceStatus",
+ "logs:*",
+ "ssm:*",
+ "ec2messages:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJA7V6HI4ISQFMDYAG",
+ "PolicyName": "AmazonSSMFullAccess",
+ "UpdateDate": "2016-03-07T21:09:12+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSSMMaintenanceWindowRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSSMMaintenanceWindowRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-09T20:49:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:GetAutomationExecution",
+ "ssm:GetParameters",
+ "ssm:ListCommands",
+ "ssm:SendCommand",
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "Stmt1477803259000"
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:SSM*",
+ "arn:aws:lambda:*:*:function:*:SSM*"
+ ],
+ "Sid": "Stmt1477803259001"
+ },
+ {
+ "Action": [
+ "states:DescribeExecution",
+ "states:StartExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:states:*:*:stateMachine:SSM*",
+ "arn:aws:states:*:*:execution:SSM*"
+ ],
+ "Sid": "Stmt1477803259002"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJV3JNYSTZ47VOXYME",
+ "PolicyName": "AmazonSSMMaintenanceWindowRole",
+ "UpdateDate": "2017-08-09T20:49:14+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSSMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-29T17:44:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:Describe*",
+ "ssm:Get*",
+ "ssm:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJODSKQGGJTHRYZ5FC",
+ "PolicyName": "AmazonSSMReadOnlyAccess",
+ "UpdateDate": "2015-05-29T17:44:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonVPCCrossAccountNetworkInterfaceOperations": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCCrossAccountNetworkInterfaceOperations",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-18T20:47:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeRouteTables",
+ "ec2:CreateRoute",
+ "ec2:DeleteRoute",
+ "ec2:ReplaceRoute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ53Y4ZY5OHP4CNRJC",
+ "PolicyName": "AmazonVPCCrossAccountNetworkInterfaceOperations",
+ "UpdateDate": "2017-07-18T20:47:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonVPCFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCFullAccess",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-12-17T17:25:44+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AllocateAddress",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateDhcpOptions",
+ "ec2:AssociateRouteTable",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAclEntry",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkAclEntry",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisableVpcClassicLink",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:EnableVpcClassicLink",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:MoveAddressToVpc",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceNetworkAclAssociation",
+ "ec2:ReplaceNetworkAclEntry",
+ "ec2:ReplaceRoute",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:ResetNetworkInterfaceAttribute",
+ "ec2:RestoreAddressToClassic",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJBWPGNOVKZD3JI2P2",
+ "PolicyName": "AmazonVPCFullAccess",
+ "UpdateDate": "2015-12-17T17:25:44+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonVPCReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-17T17:25:56+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIICZJNOJN36GTG6CM",
+ "PolicyName": "AmazonVPCReadOnlyAccess",
+ "UpdateDate": "2015-12-17T17:25:56+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonWorkMailFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-20T08:35:49+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:AuthorizeApplication",
+ "ds:CheckAlias",
+ "ds:CreateAlias",
+ "ds:CreateDirectory",
+ "ds:CreateIdentityPoolDirectory",
+ "ds:CreateDomain",
+ "ds:DeleteAlias",
+ "ds:DeleteDirectory",
+ "ds:DescribeDirectories",
+ "ds:ExtendDirectory",
+ "ds:GetDirectoryLimits",
+ "ds:ListAuthorizedApplications",
+ "ds:UnauthorizeApplication",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteVpc",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeDomains",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "ses:*",
+ "workmail:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJQVKNMT7SVATQ4AUY",
+ "PolicyName": "AmazonWorkMailFullAccess",
+ "UpdateDate": "2017-04-20T08:35:49+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonWorkMailReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:Describe*",
+ "ses:Get*",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workmail:List*",
+ "workmail:Search*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJHF7J65E2QFKCWAJM",
+ "PolicyName": "AmazonWorkMailReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:42+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkSpacesAdmin": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesAdmin",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-18T23:08:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workspaces:CreateWorkspaces",
+ "workspaces:DescribeWorkspaces",
+ "workspaces:RebootWorkspaces",
+ "workspaces:RebuildWorkspaces",
+ "workspaces:TerminateWorkspaces",
+ "workspaces:DescribeWorkspaceDirectories",
+ "workspaces:DescribeWorkspaceBundles",
+ "workspaces:ModifyWorkspaceProperties",
+ "workspaces:StopWorkspaces",
+ "workspaces:StartWorkspaces",
+ "workspaces:DescribeWorkspacesConnectionStatus",
+ "workspaces:CreateTags",
+ "workspaces:DeleteTags",
+ "workspaces:DescribeTags",
+ "kms:ListKeys",
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ26AU6ATUQCT5KVJU",
+ "PolicyName": "AmazonWorkSpacesAdmin",
+ "UpdateDate": "2016-08-18T23:08:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonWorkSpacesApplicationManagerAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesApplicationManagerAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T14:03:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "wam:AuthenticatePackager",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJPRL4KYETIH7XGTSS",
+ "PolicyName": "AmazonWorkSpacesApplicationManagerAdminAccess",
+ "UpdateDate": "2015-04-09T14:03:18+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonZocaloFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonZocaloFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "zocalo:*",
+ "ds:*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJLCDXYRINDMUXEVL6",
+ "PolicyName": "AmazonZocaloFullAccess",
+ "UpdateDate": "2015-02-06T18:41:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonZocaloReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonZocaloReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "zocalo:Describe*",
+ "ds:DescribeDirectories",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAISRCSSJNS3QPKZJPM",
+ "PolicyName": "AmazonZocaloReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:14+00:00",
+ "VersionId": "v1"
+ },
+ "ApplicationAutoScalingForAmazonAppStreamAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ApplicationAutoScalingForAmazonAppStreamAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-06T21:39:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:UpdateFleet",
+ "appstream:DescribeFleets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIEL3HJCCWFVHA6KPG",
+ "PolicyName": "ApplicationAutoScalingForAmazonAppStreamAccess",
+ "UpdateDate": "2017-02-06T21:39:56+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:43:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateKeyPair",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:ImportKeyPair"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListSubscriptions",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIYEN6FJGYYWJFFCZW",
+ "PolicyName": "AutoScalingConsoleFullAccess",
+ "UpdateDate": "2017-01-12T19:43:16+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:48:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListSubscriptions",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI3A7GDXOYQV3VUQMK",
+ "PolicyName": "AutoScalingConsoleReadOnlyAccess",
+ "UpdateDate": "2017-01-12T19:48:53+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:31:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricAlarm",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIAWRCSJDDXDXGPCFU",
+ "PolicyName": "AutoScalingFullAccess",
+ "UpdateDate": "2017-01-12T19:31:58+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingNotificationAccessRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AutoScalingNotificationAccessRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:SendMessage",
+ "sqs:GetQueueUrl",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIO2VMUPGDC5PZVXVA",
+ "PolicyName": "AutoScalingNotificationAccessRole",
+ "UpdateDate": "2015-02-06T18:41:22+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:39:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIAFWUVLC2LPLSFTFG",
+ "PolicyName": "AutoScalingReadOnlyAccess",
+ "UpdateDate": "2017-01-12T19:39:35+00:00",
+ "VersionId": "v1"
+ },
+ "Billing": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/Billing",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:33:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:*Billing",
+ "aws-portal:*Usage",
+ "aws-portal:*PaymentMethods",
+ "budgets:ViewBudget",
+ "budgets:ModifyBudget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAIFTHXT6FFMIRT7ZEA",
+ "PolicyName": "Billing",
+ "UpdateDate": "2016-11-10T17:33:18+00:00",
+ "VersionId": "v1"
+ },
+ "CloudFrontFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudFrontFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-21T17:03:57+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "cloudfront:*",
+ "iam:ListServerCertificates",
+ "waf:ListWebACLs",
+ "waf:GetWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIPRV52SH6HDCCFY6U",
+ "PolicyName": "CloudFrontFullAccess",
+ "UpdateDate": "2016-01-21T17:03:57+00:00",
+ "VersionId": "v3"
+ },
+ "CloudFrontReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudFrontReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-21T17:03:28+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "iam:ListServerCertificates",
+ "route53:List*",
+ "waf:ListWebACLs",
+ "waf:GetWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJJZMNYOTZCNQP36LG",
+ "PolicyName": "CloudFrontReadOnlyAccess",
+ "UpdateDate": "2016-01-21T17:03:28+00:00",
+ "VersionId": "v3"
+ },
+ "CloudSearchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudSearchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudsearch:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIM6OOWKQ7L7VBOZOC",
+ "PolicyName": "CloudSearchFullAccess",
+ "UpdateDate": "2015-02-06T18:39:56+00:00",
+ "VersionId": "v1"
+ },
+ "CloudSearchReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudSearchReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudsearch:Describe*",
+ "cloudsearch:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJWPLX7N7BCC3RZLHW",
+ "PolicyName": "CloudSearchReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:57+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchActionsEC2Access": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchActionsEC2Access",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-07T00:00:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:Describe*",
+ "ec2:Describe*",
+ "ec2:RebootInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIOWD4E3FVSORSZTGU",
+ "PolicyName": "CloudWatchActionsEC2Access",
+ "UpdateDate": "2015-07-07T00:00:33+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsBuiltInTargetExecutionAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/CloudWatchEventsBuiltInTargetExecutionAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:35:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:Describe*",
+ "ec2:RebootInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:CreateSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsBuiltInTargetExecutionAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIC5AQ5DATYSNF4AUM",
+ "PolicyName": "CloudWatchEventsBuiltInTargetExecutionAccess",
+ "UpdateDate": "2016-01-14T18:35:49+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchEventsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:37:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "events:*",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsFullAccess"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWS_Events_Invoke_Targets",
+ "Sid": "IAMPassRoleForCloudWatchEvents"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJZLOYLNHESMYOJAFU",
+ "PolicyName": "CloudWatchEventsFullAccess",
+ "UpdateDate": "2016-01-14T18:37:08+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsInvocationAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/CloudWatchEventsInvocationAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:36:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:PutRecord"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsInvocationAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJJXD6JKJLK2WDLZNO",
+ "PolicyName": "CloudWatchEventsInvocationAccess",
+ "UpdateDate": "2016-01-14T18:36:33+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchEventsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-10T17:25:34+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "events:TestEventPattern",
+ "events:DescribeEventBus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIILJPXXA6F7GYLYBS",
+ "PolicyName": "CloudWatchEventsReadOnlyAccess",
+ "UpdateDate": "2017-08-10T17:25:34+00:00",
+ "VersionId": "v2"
+ },
+ "CloudWatchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudwatch:*",
+ "logs:*",
+ "sns:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIKEABORKUXN6DEAZU",
+ "PolicyName": "CloudWatchFullAccess",
+ "UpdateDate": "2015-02-06T18:40:00+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchLogsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ3ZGNWK2R5HW5BQFO",
+ "PolicyName": "CloudWatchLogsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:02+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchLogsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchLogsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T22:22:16+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:List*",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ2YIYDYSNNEHK3VKW",
+ "PolicyName": "CloudWatchLogsReadOnlyAccess",
+ "UpdateDate": "2017-08-14T22:22:16+00:00",
+ "VersionId": "v3"
+ },
+ "CloudWatchReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "logs:Get*",
+ "logs:Describe*",
+ "logs:TestMetricFilter",
+ "sns:Get*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJN23PDQP7SZQAE3QE",
+ "PolicyName": "CloudWatchReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:01+00:00",
+ "VersionId": "v1"
+ },
+ "DataScientist": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/DataScientist",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:28:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:*",
+ "cloudwatch:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "datapipeline:Describe*",
+ "datapipeline:ListPipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "dynamodb:*",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:RequestSpotInstances",
+ "ec2:RequestSpotFleet",
+ "elasticfilesystem:*",
+ "elasticmapreduce:*",
+ "es:*",
+ "firehose:*",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:ListRoles",
+ "kinesis:*",
+ "kms:List*",
+ "lambda:Create*",
+ "lambda:Delete*",
+ "lambda:Get*",
+ "lambda:InvokeFunction",
+ "lambda:PublishVersion",
+ "lambda:Update*",
+ "lambda:List*",
+ "machinelearning:*",
+ "sdb:*",
+ "rds:*",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "redshift:*",
+ "s3:CreateBucket",
+ "sns:CreateTopic",
+ "sns:Get*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:Abort*",
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutAccelerateConfiguration",
+ "s3:PutBucketLogging",
+ "s3:PutBucketNotification",
+ "s3:PutBucketTagging",
+ "s3:PutObject",
+ "s3:Replicate*",
+ "s3:RestoreObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/EMR_EC2_DefaultRole",
+ "arn:aws:iam::*:role/EMR_DefaultRole",
+ "arn:aws:iam::*:role/kinesis-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAJ5YHI2BQW7EQFYDXS",
+ "PolicyName": "DataScientist",
+ "UpdateDate": "2016-11-10T17:28:48+00:00",
+ "VersionId": "v1"
+ },
+ "DatabaseAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/DatabaseAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:25:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:Describe*",
+ "cloudwatch:DisableAlarmActions",
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cloudwatch:PutMetricAlarm",
+ "datapipeline:ActivatePipeline",
+ "datapipeline:CreatePipeline",
+ "datapipeline:DeletePipeline",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:PutPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "dynamodb:*",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticache:*",
+ "iam:ListRoles",
+ "iam:GetRole",
+ "kms:ListKeys",
+ "lambda:CreateEventSourceMapping",
+ "lambda:CreateFunction",
+ "lambda:DeleteEventSourceMapping",
+ "lambda:DeleteFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListEventSourceMappings",
+ "lambda:ListFunctions",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:FilterLogEvents",
+ "logs:GetLogEvents",
+ "logs:Create*",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "rds:*",
+ "redshift:*",
+ "s3:CreateBucket",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:Get*",
+ "sns:List*",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject*",
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutAccelerateConfiguration",
+ "s3:PutBucketTagging",
+ "s3:PutBucketVersioning",
+ "s3:PutBucketWebsite",
+ "s3:PutLifecycleConfiguration",
+ "s3:PutReplicationConfiguration",
+ "s3:PutObject*",
+ "s3:Replicate*",
+ "s3:RestoreObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/rds-monitoring-role",
+ "arn:aws:iam::*:role/rdbms-lambda-access",
+ "arn:aws:iam::*:role/lambda_exec_role",
+ "arn:aws:iam::*:role/lambda-dynamodb-*",
+ "arn:aws:iam::*:role/lambda-vpc-execution-role",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAIGBMAW4VUQKOQNVT6",
+ "PolicyName": "DatabaseAdministrator",
+ "UpdateDate": "2016-11-10T17:25:43+00:00",
+ "VersionId": "v1"
+ },
+ "IAMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMFullAccess",
+ "AttachmentCount": 2,
+ "CreateDate": "2015-02-06T18:40:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI7XKCFMBPM3QQRRVQ",
+ "PolicyName": "IAMFullAccess",
+ "UpdateDate": "2015-02-06T18:40:38+00:00",
+ "VersionId": "v1"
+ },
+ "IAMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-09-06T17:06:37+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:GenerateCredentialReport",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:Get*",
+ "iam:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKSO7NDY4T57MWDSQ",
+ "PolicyName": "IAMReadOnlyAccess",
+ "UpdateDate": "2016-09-06T17:06:37+00:00",
+ "VersionId": "v3"
+ },
+ "IAMSelfManageServiceSpecificCredentials": {
+ "Arn": "arn:aws:iam::aws:policy/IAMSelfManageServiceSpecificCredentials",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-22T17:25:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:CreateServiceSpecificCredential",
+ "iam:ListServiceSpecificCredentials",
+ "iam:UpdateServiceSpecificCredential",
+ "iam:DeleteServiceSpecificCredential",
+ "iam:ResetServiceSpecificCredential"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAI4VT74EMXK2PMQJM2",
+ "PolicyName": "IAMSelfManageServiceSpecificCredentials",
+ "UpdateDate": "2016-12-22T17:25:18+00:00",
+ "VersionId": "v1"
+ },
+ "IAMUserChangePassword": {
+ "Arn": "arn:aws:iam::aws:policy/IAMUserChangePassword",
+ "AttachmentCount": 1,
+ "CreateDate": "2016-11-15T23:18:55+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:ChangePassword"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:user/${aws:username}"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetAccountPasswordPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ4L4MM2A7QIEB56MS",
+ "PolicyName": "IAMUserChangePassword",
+ "UpdateDate": "2016-11-15T23:18:55+00:00",
+ "VersionId": "v2"
+ },
+ "IAMUserSSHKeys": {
+ "Arn": "arn:aws:iam::aws:policy/IAMUserSSHKeys",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-07-09T17:08:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteSSHPublicKey",
+ "iam:GetSSHPublicKey",
+ "iam:ListSSHPublicKeys",
+ "iam:UpdateSSHPublicKey",
+ "iam:UploadSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJTSHUA4UXGXU7ANUA",
+ "PolicyName": "IAMUserSSHKeys",
+ "UpdateDate": "2015-07-09T17:08:54+00:00",
+ "VersionId": "v1"
+ },
+ "NetworkAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/NetworkAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-20T18:44:58+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "ec2:AllocateAddress",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateDhcpOptions",
+ "ec2:AssociateRouteTable",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAclEntry",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:CreatePlacementGroup",
+ "ec2:DeletePlacementGroup",
+ "ec2:DescribePlacementGroups",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeVpcClassicLinkDnsSupport",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:MoveAddressToVpc",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceNetworkAclAssociation",
+ "ec2:ReplaceNetworkAclEntry",
+ "ec2:ReplaceRoute",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:ResetNetworkInterfaceAttribute",
+ "ec2:RestoreAddressToClassic",
+ "ec2:UnassignPrivateIpAddresses",
+ "directconnect:*",
+ "route53:*",
+ "route53domains:*",
+ "cloudfront:ListDistributions",
+ "elasticloadbalancing:*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "sns:CreateTopic",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkAclEntry",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DisableVpcClassicLink",
+ "ec2:EnableVpcClassicLink",
+ "ec2:GetConsoleScreenshot",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketWebsiteConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListRoles",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/flow-logs-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAJPNMADZFJCVPJVZA2",
+ "PolicyName": "NetworkAdministrator",
+ "UpdateDate": "2017-03-20T18:44:58+00:00",
+ "VersionId": "v2"
+ },
+ "PowerUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/PowerUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T18:11:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "NotAction": [
+ "iam:*",
+ "organizations:*"
+ ],
+ "Resource": "*"
+ },
+ {
+ "Action": "organizations:DescribeOrganization",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJYRXTHIB4FOVS3ZXS",
+ "PolicyName": "PowerUserAccess",
+ "UpdateDate": "2016-12-06T18:11:16+00:00",
+ "VersionId": "v2"
+ },
+ "QuickSightAccessForS3StorageManagementAnalyticsReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/QuickSightAccessForS3StorageManagementAnalyticsReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-21T00:02:14+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectMetadata"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::s3-analytics-export-shared-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetAnalyticsConfiguration",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIFWG3L3WDMR4I7ZJW",
+ "PolicyName": "QuickSightAccessForS3StorageManagementAnalyticsReadOnly",
+ "UpdateDate": "2017-07-21T00:02:14+00:00",
+ "VersionId": "v3"
+ },
+ "RDSCloudHsmAuthorizationRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/RDSCloudHsmAuthorizationRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudhsm:CreateLunaClient",
+ "cloudhsm:GetClientConfiguration",
+ "cloudhsm:DeleteLunaClient",
+ "cloudhsm:DescribeLunaClient",
+ "cloudhsm:ModifyLunaClient",
+ "cloudhsm:DescribeHapg",
+ "cloudhsm:ModifyHapg",
+ "cloudhsm:GetConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAIWKFXRLQG2ROKKXLE",
+ "PolicyName": "RDSCloudHsmAuthorizationRole",
+ "UpdateDate": "2015-02-06T18:41:29+00:00",
+ "VersionId": "v1"
+ },
+ "ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-20T17:43:06+00:00",
+ "DefaultVersionId": "v29",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:Describe*",
+ "acm:Get*",
+ "acm:List*",
+ "apigateway:GET",
+ "application-autoscaling:Describe*",
+ "appstream:Describe*",
+ "appstream:Get*",
+ "appstream:List*",
+ "athena:List*",
+ "athena:Batch*",
+ "athena:Get*",
+ "autoscaling:Describe*",
+ "batch:List*",
+ "batch:Describe*",
+ "clouddirectory:List*",
+ "clouddirectory:BatchRead",
+ "clouddirectory:Get*",
+ "clouddirectory:LookupPolicy",
+ "cloudformation:Describe*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:Estimate*",
+ "cloudformation:Preview*",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudhsm:List*",
+ "cloudhsm:Describe*",
+ "cloudhsm:Get*",
+ "cloudsearch:Describe*",
+ "cloudsearch:List*",
+ "cloudtrail:Describe*",
+ "cloudtrail:Get*",
+ "cloudtrail:List*",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "codebuild:BatchGet*",
+ "codebuild:List*",
+ "codecommit:BatchGet*",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:List*",
+ "codedeploy:BatchGet*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codepipeline:List*",
+ "codepipeline:Get*",
+ "codestar:List*",
+ "codestar:Describe*",
+ "codestar:Get*",
+ "codestar:Verify*",
+ "cognito-identity:List*",
+ "cognito-identity:Describe*",
+ "cognito-identity:Lookup*",
+ "cognito-sync:List*",
+ "cognito-sync:Describe*",
+ "cognito-sync:Get*",
+ "cognito-sync:QueryRecords",
+ "cognito-idp:AdminList*",
+ "cognito-idp:List*",
+ "cognito-idp:Describe*",
+ "cognito-idp:Get*",
+ "config:Deliver*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "connect:List*",
+ "connect:Describe*",
+ "connect:Get*",
+ "datapipeline:Describe*",
+ "datapipeline:EvaluateExpression",
+ "datapipeline:Get*",
+ "datapipeline:List*",
+ "datapipeline:QueryObjects",
+ "datapipeline:Validate*",
+ "directconnect:Describe*",
+ "directconnect:Confirm*",
+ "devicefarm:List*",
+ "devicefarm:Get*",
+ "discovery:Describe*",
+ "discovery:List*",
+ "discovery:Get*",
+ "dms:Describe*",
+ "dms:List*",
+ "dms:Test*",
+ "ds:Check*",
+ "ds:Describe*",
+ "ds:Get*",
+ "ds:List*",
+ "ds:Verify*",
+ "dynamodb:BatchGet*",
+ "dynamodb:Describe*",
+ "dynamodb:Get*",
+ "dynamodb:List*",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "ec2:Describe*",
+ "ec2:Get*",
+ "ec2messages:Get*",
+ "ecr:BatchCheck*",
+ "ecr:BatchGet*",
+ "ecr:Describe*",
+ "ecr:Get*",
+ "ecr:List*",
+ "ecs:Describe*",
+ "ecs:List*",
+ "elasticache:Describe*",
+ "elasticache:List*",
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:Request*",
+ "elasticbeanstalk:Retrieve*",
+ "elasticbeanstalk:Validate*",
+ "elasticfilesystem:Describe*",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:List*",
+ "elasticmapreduce:View*",
+ "elastictranscoder:List*",
+ "elastictranscoder:Read*",
+ "es:Describe*",
+ "es:List*",
+ "es:ESHttpGet",
+ "es:ESHttpHead",
+ "events:Describe*",
+ "events:List*",
+ "events:Test*",
+ "firehose:Describe*",
+ "firehose:List*",
+ "gamelift:List*",
+ "gamelift:Get*",
+ "gamelift:Describe*",
+ "gamelift:RequestUploadCredentials",
+ "gamelift:ResolveAlias",
+ "gamelift:Search*",
+ "glacier:List*",
+ "glacier:Describe*",
+ "glacier:Get*",
+ "health:Describe*",
+ "health:Get*",
+ "health:List*",
+ "iam:Generate*",
+ "iam:Get*",
+ "iam:List*",
+ "iam:Simulate*",
+ "importexport:Get*",
+ "importexport:List*",
+ "inspector:Describe*",
+ "inspector:Get*",
+ "inspector:List*",
+ "inspector:Preview*",
+ "inspector:LocalizeText",
+ "iot:Describe*",
+ "iot:Get*",
+ "iot:List*",
+ "kinesisanalytics:Describe*",
+ "kinesisanalytics:Discover*",
+ "kinesisanalytics:Get*",
+ "kinesisanalytics:List*",
+ "kinesis:Describe*",
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:List*",
+ "lambda:Get*",
+ "lex:Get*",
+ "lightsail:Get*",
+ "lightsail:Is*",
+ "lightsail:Download*",
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:FilterLogEvents",
+ "logs:ListTagsLogGroup",
+ "logs:TestMetricFilter",
+ "machinelearning:Describe*",
+ "machinelearning:Get*",
+ "mobileanalytics:Get*",
+ "mobilehub:Get*",
+ "mobilehub:List*",
+ "mobilehub:Validate*",
+ "mobilehub:Verify*",
+ "mobiletargeting:Get*",
+ "opsworks:Describe*",
+ "opsworks:Get*",
+ "opsworks-cm:Describe*",
+ "organizations:Describe*",
+ "organizations:List*",
+ "polly:Describe*",
+ "polly:Get*",
+ "polly:List*",
+ "polly:SynthesizeSpeech",
+ "rekognition:CompareFaces",
+ "rekognition:Detect*",
+ "rekognition:List*",
+ "rekognition:Search*",
+ "rds:Describe*",
+ "rds:List*",
+ "rds:Download*",
+ "redshift:Describe*",
+ "redshift:View*",
+ "redshift:Get*",
+ "route53:Get*",
+ "route53:List*",
+ "route53:Test*",
+ "route53domains:Check*",
+ "route53domains:Get*",
+ "route53domains:List*",
+ "route53domains:View*",
+ "s3:Get*",
+ "s3:List*",
+ "s3:Head*",
+ "sdb:Get*",
+ "sdb:List*",
+ "sdb:Select*",
+ "servicecatalog:List*",
+ "servicecatalog:Scan*",
+ "servicecatalog:Search*",
+ "servicecatalog:Describe*",
+ "ses:Get*",
+ "ses:List*",
+ "ses:Describe*",
+ "ses:Verify*",
+ "shield:Describe*",
+ "shield:List*",
+ "sns:Get*",
+ "sns:List*",
+ "sns:Check*",
+ "sqs:Get*",
+ "sqs:List*",
+ "sqs:Receive*",
+ "ssm:Describe*",
+ "ssm:Get*",
+ "ssm:List*",
+ "states:List*",
+ "states:Describe*",
+ "states:GetExecutionHistory",
+ "storagegateway:Describe*",
+ "storagegateway:List*",
+ "sts:Get*",
+ "swf:Count*",
+ "swf:Describe*",
+ "swf:Get*",
+ "swf:List*",
+ "tag:Get*",
+ "trustedadvisor:Describe*",
+ "waf:Get*",
+ "waf:List*",
+ "waf-regional:List*",
+ "waf-regional:Get*",
+ "workdocs:Describe*",
+ "workdocs:Get*",
+ "workdocs:CheckAlias",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workmail:List*",
+ "workmail:Search*",
+ "workspaces:Describe*",
+ "xray:BatchGet*",
+ "xray:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAILL3HVNFSB6DCOWYQ",
+ "PolicyName": "ReadOnlyAccess",
+ "UpdateDate": "2017-07-20T17:43:06+00:00",
+ "VersionId": "v29"
+ },
+ "ResourceGroupsandTagEditorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ResourceGroupsandTagEditorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "tag:getResources",
+ "tag:getTagKeys",
+ "tag:getTagValues",
+ "tag:addResourceTags",
+ "tag:removeResourceTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJNOS54ZFXN4T2Y34A",
+ "PolicyName": "ResourceGroupsandTagEditorFullAccess",
+ "UpdateDate": "2015-02-06T18:39:53+00:00",
+ "VersionId": "v1"
+ },
+ "ResourceGroupsandTagEditorReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ResourceGroupsandTagEditorReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "tag:getResources",
+ "tag:getTagKeys",
+ "tag:getTagValues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJHXQTPI5I5JKAIU74",
+ "PolicyName": "ResourceGroupsandTagEditorReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:54+00:00",
+ "VersionId": "v1"
+ },
+ "SecurityAudit": {
+ "Arn": "arn:aws:iam::aws:policy/SecurityAudit",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-12T20:16:44+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "acm:DescribeCertificate",
+ "cloudformation:getStackPolicy",
+ "logs:describeLogGroups",
+ "logs:describeMetricFilters",
+ "autoscaling:Describe*",
+ "cloudformation:DescribeStack*",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStack*",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudwatch:Describe*",
+ "codecommit:BatchGetRepositories",
+ "codecommit:GetBranch",
+ "codecommit:GetObjectIdentifier",
+ "codecommit:GetRepository",
+ "codecommit:List*",
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "config:Deliver*",
+ "config:Describe*",
+ "config:Get*",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:EvaluateExpression",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "datapipeline:ValidatePipelineDefinition",
+ "directconnect:Describe*",
+ "dynamodb:ListTables",
+ "ec2:Describe*",
+ "ecs:Describe*",
+ "ecs:List*",
+ "elasticache:Describe*",
+ "elasticbeanstalk:Describe*",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:DescribeJobFlows",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstances",
+ "es:ListDomainNames",
+ "es:Describe*",
+ "firehose:Describe*",
+ "firehose:List*",
+ "glacier:DescribeVault",
+ "glacier:GetVaultAccessPolicy",
+ "glacier:ListVaults",
+ "iam:GenerateCredentialReport",
+ "iam:Get*",
+ "iam:List*",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:GetPolicy",
+ "lambda:ListFunctions",
+ "rds:Describe*",
+ "rds:DownloadDBLogFilePortion",
+ "rds:ListTagsForResource",
+ "redshift:Describe*",
+ "route53:GetChange",
+ "route53:GetCheckerIpRanges",
+ "route53:GetGeoLocation",
+ "route53:GetHealthCheck",
+ "route53:GetHealthCheckCount",
+ "route53:GetHealthCheckLastFailureReason",
+ "route53:GetHostedZone",
+ "route53:GetHostedZoneCount",
+ "route53:GetReusableDelegationSet",
+ "route53:ListGeoLocations",
+ "route53:ListHealthChecks",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName",
+ "route53:ListResourceRecordSets",
+ "route53:ListReusableDelegationSets",
+ "route53:ListTagsForResource",
+ "route53:ListTagsForResources",
+ "route53domains:GetDomainDetail",
+ "route53domains:GetOperationDetail",
+ "route53domains:ListDomains",
+ "route53domains:ListOperations",
+ "route53domains:ListTagsForDomain",
+ "s3:GetBucket*",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetAnalyticsConfiguration",
+ "s3:GetInventoryConfiguration",
+ "s3:GetMetricsConfiguration",
+ "s3:GetReplicationConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetObjectAcl",
+ "s3:GetObjectVersionAcl",
+ "s3:ListAllMyBuckets",
+ "sdb:DomainMetadata",
+ "sdb:ListDomains",
+ "ses:GetIdentityDkimAttributes",
+ "ses:GetIdentityVerificationAttributes",
+ "ses:ListIdentities",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues",
+ "tag:GetResources",
+ "tag:GetTagKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIX2T3QCXHR2OGGCTO",
+ "PolicyName": "SecurityAudit",
+ "UpdateDate": "2017-07-12T20:16:44+00:00",
+ "VersionId": "v12"
+ },
+ "ServerMigrationConnector": {
+ "Arn": "arn:aws:iam::aws:policy/ServerMigrationConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-10-24T21:45:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sms:SendMessage",
+ "sms:GetMessages"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutLifecycleConfiguration",
+ "s3:AbortMultipartUpload",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::sms-b-*",
+ "arn:aws:s3:::import-to-ec2-*",
+ "arn:aws:s3:::server-migration-service-upgrade",
+ "arn:aws:s3:::server-migration-service-upgrade/*",
+ "arn:aws:s3:::connector-platform-upgrade-info/*",
+ "arn:aws:s3:::connector-platform-upgrade-info",
+ "arn:aws:s3:::connector-platform-upgrade-bundles/*",
+ "arn:aws:s3:::connector-platform-upgrade-bundles",
+ "arn:aws:s3:::connector-platform-release-notes/*",
+ "arn:aws:s3:::connector-platform-release-notes"
+ ]
+ },
+ {
+ "Action": "awsconnector:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJKZRWXIPK5HSG3QDQ",
+ "PolicyName": "ServerMigrationConnector",
+ "UpdateDate": "2016-10-24T21:45:56+00:00",
+ "VersionId": "v1"
+ },
+ "ServerMigrationServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ServerMigrationServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-16T18:02:04+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:CopySnapshot",
+ "ec2:CopyImage",
+ "ec2:Describe*",
+ "ec2:DeleteSnapshot",
+ "ec2:DeregisterImage",
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJMBH3M6BO63XFW2D4",
+ "PolicyName": "ServerMigrationServiceRole",
+ "UpdateDate": "2017-06-16T18:02:04+00:00",
+ "VersionId": "v2"
+ },
+ "ServiceCatalogAdminFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceCatalogAdminFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-11T18:40:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "catalog-admin:*",
+ "catalog-user:*",
+ "cloudformation:CreateStack",
+ "cloudformation:CreateUploadBucket",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:ValidateTemplate",
+ "cloudformation:UpdateStack",
+ "iam:GetGroup",
+ "iam:GetRole",
+ "iam:GetUser",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "iam:PassRole",
+ "s3:CreateBucket",
+ "s3:GetObject",
+ "s3:PutObject",
+ "servicecatalog:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIKTX42IAS75B7B7BY",
+ "PolicyName": "ServiceCatalogAdminFullAccess",
+ "UpdateDate": "2016-11-11T18:40:24+00:00",
+ "VersionId": "v2"
+ },
+ "ServiceCatalogAdminReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceCatalogAdminReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-08T18:57:36+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "catalog-admin:DescribeConstraints",
+ "catalog-admin:DescribeListingForProduct",
+ "catalog-admin:DescribeListings",
+ "catalog-admin:DescribePortfolios",
+ "catalog-admin:DescribeProductVersions",
+ "catalog-admin:GetPortfolioCount",
+ "catalog-admin:GetPortfolios",
+ "catalog-admin:GetProductCounts",
+ "catalog-admin:ListAllPortfolioConstraints",
+ "catalog-admin:ListPortfolioConstraints",
+ "catalog-admin:ListPortfolios",
+ "catalog-admin:ListPrincipalConstraints",
+ "catalog-admin:ListProductConstraints",
+ "catalog-admin:ListResourceUsers",
+ "catalog-admin:ListTagsForResource",
+ "catalog-admin:SearchListings",
+ "catalog-user:*",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary",
+ "iam:GetGroup",
+ "iam:GetRole",
+ "iam:GetUser",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "s3:GetObject",
+ "servicecatalog:DescribeTagOption",
+ "servicecatalog:GetTagOptionMigrationStatus",
+ "servicecatalog:ListResourcesForTagOption",
+ "servicecatalog:ListTagOptions",
+ "servicecatalog:AccountLevelDescribeRecord",
+ "servicecatalog:AccountLevelListRecordHistory",
+ "servicecatalog:AccountLevelScanProvisionedProducts",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:DescribeProvisionedProduct",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:SearchProducts",
+ "servicecatalog:DescribeConstraint",
+ "servicecatalog:DescribeProductAsAdmin",
+ "servicecatalog:DescribePortfolio",
+ "servicecatalog:DescribeProvisioningArtifact",
+ "servicecatalog:ListAcceptedPortfolioShares",
+ "servicecatalog:ListConstraintsForPortfolio",
+ "servicecatalog:ListPortfolioAccess",
+ "servicecatalog:ListPortfolios",
+ "servicecatalog:ListPortfoliosForProduct",
+ "servicecatalog:ListPrincipalsForPortfolio",
+ "servicecatalog:ListProvisioningArtifacts",
+ "servicecatalog:SearchProductsAsAdmin"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ7XOUSS75M4LIPKO4",
+ "PolicyName": "ServiceCatalogAdminReadOnlyAccess",
+ "UpdateDate": "2017-08-08T18:57:36+00:00",
+ "VersionId": "v5"
+ },
+ "ServiceCatalogEndUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceCatalogEndUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-08T18:58:57+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "catalog-user:*",
+ "s3:GetObject",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:SearchProducts"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:DescribeProvisionedProduct",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ScanProvisionedProducts"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "servicecatalog:userLevel": "self"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJ56OMCO72RI4J5FSA",
+ "PolicyName": "ServiceCatalogEndUserAccess",
+ "UpdateDate": "2017-08-08T18:58:57+00:00",
+ "VersionId": "v4"
+ },
+ "ServiceCatalogEndUserFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceCatalogEndUserFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-08T18:58:54+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "catalog-user:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:ValidateTemplate",
+ "cloudformation:UpdateStack",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:ProvisionProduct",
+ "servicecatalog:SearchProducts",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:DescribeProvisionedProduct",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:TerminateProvisionedProduct",
+ "servicecatalog:UpdateProvisionedProduct"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "servicecatalog:userLevel": "self"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAJIW7AFFOONVKW75KU",
+ "PolicyName": "ServiceCatalogEndUserFullAccess",
+ "UpdateDate": "2017-08-08T18:58:54+00:00",
+ "VersionId": "v4"
+ },
+ "SimpleWorkflowFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/SimpleWorkflowFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "swf:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PolicyId": "ANPAIFE3AV6VE7EANYBVM",
+ "PolicyName": "SimpleWorkflowFullAccess",
+ "UpdateDate": "2015-02-06T18:41:04+00:00",
+ "VersionId": "v1"
+ },
+ "SupportUser": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/SupportUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-17T23:11:51+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "support:*",
+ "acm:DescribeCertificate",
+ "acm:GetCertificate",
+ "acm:List*",
+ "apigateway:GET",
+ "appstream:Get*",
+ "autoscaling:Describe*",
+ "aws-marketplace:ViewSubscriptions",
+ "cloudformation:Describe*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:EstimateTemplateCost",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudsearch:Describe*",
+ "cloudsearch:List*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:ListTags",
+ "cloudtrail:ListPublicKeys",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "codecommit:BatchGetRepositories",
+ "codecommit:Get*",
+ "codecommit:List*",
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codepipeline:AcknowledgeJob",
+ "codepipeline:AcknowledgeThirdPartyJob",
+ "codepipeline:ListActionTypes",
+ "codepipeline:ListPipelines",
+ "codepipeline:PollForJobs",
+ "codepipeline:PollForThirdPartyJobs",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipeline",
+ "cognito-identity:List*",
+ "cognito-identity:LookupDeveloperIdentity",
+ "cognito-identity:Describe*",
+ "cognito-idp:Describe*",
+ "cognito-sync:Describe*",
+ "cognito-sync:GetBulkPublishDetails",
+ "cognito-sync:GetCognitoEvents",
+ "cognito-sync:GetIdentityPoolConfiguration",
+ "cognito-sync:List*",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:DescribeConfigRuleEvaluationStatus",
+ "config:DescribeConfigRules",
+ "config:DescribeDeliveryChannels",
+ "config:DescribeDeliveryChannelStatus",
+ "config:GetResourceConfigHistory",
+ "config:ListDiscoveredResources",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "datapipeline:ReportTaskProgress",
+ "datapipeline:ReportTaskRunnerHeartbeat",
+ "devicefarm:List*",
+ "devicefarm:Get*",
+ "directconnect:Describe*",
+ "discovery:Describe*",
+ "discovery:ListConfigurations",
+ "dms:Describe*",
+ "dms:List*",
+ "ds:DescribeDirectories",
+ "ds:DescribeSnapshots",
+ "ds:GetDirectoryLimits",
+ "ds:GetSnapshotLimits",
+ "ds:ListAuthorizedApplications",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "ec2:Describe*",
+ "ec2:DescribeHosts",
+ "ec2:describeIdentityIdFormat",
+ "ec2:DescribeIdFormat",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeReservedInstancesModifications",
+ "ec2:DescribeTags",
+ "ec2:GetFlowLogsCount",
+ "ecr:GetRepositoryPolicy",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:Describe*",
+ "ecs:List*",
+ "elasticache:Describe*",
+ "elasticache:List*",
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "elasticbeanstalk:ValidateConfigurationSettings",
+ "elasticfilesystem:Describe*",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:List*",
+ "elastictranscoder:List*",
+ "elastictranscoder:ReadJob",
+ "elasticfilesystem:DescribeFileSystems",
+ "es:Describe*",
+ "es:List*",
+ "es:ESHttpGet",
+ "es:ESHttpHead",
+ "events:DescribeRule",
+ "events:List*",
+ "events:TestEventPattern",
+ "firehose:Describe*",
+ "firehose:List*",
+ "gamelift:List*",
+ "gamelift:Describe*",
+ "glacier:ListVaults",
+ "glacier:DescribeVault",
+ "glacier:DescribeJob",
+ "glacier:Get*",
+ "glacier:List*",
+ "iam:GenerateCredentialReport",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:Get*",
+ "iam:List*",
+ "importexport:GetStatus",
+ "importexport:ListJobs",
+ "importexport:GetJobDetail",
+ "inspector:Describe*",
+ "inspector:List*",
+ "inspector:GetAssessmentTelemetry",
+ "inspector:LocalizeText",
+ "iot:Describe*",
+ "iot:Get*",
+ "iot:List*",
+ "kinesisanalytics:DescribeApplication",
+ "kinesisanalytics:DiscoverInputSchema",
+ "kinesisanalytics:GetApplicationState",
+ "kinesisanalytics:ListApplications",
+ "kinesis:Describe*",
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:List*",
+ "lambda:Get*",
+ "logs:Describe*",
+ "logs:TestMetricFilter",
+ "machinelearning:Describe*",
+ "machinelearning:Get*",
+ "mobilehub:GetProject",
+ "mobilehub:List*",
+ "mobilehub:ValidateProject",
+ "mobilehub:VerifyServiceRole",
+ "opsworks:Describe*",
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "redshift:Describe*",
+ "route53:Get*",
+ "route53:List*",
+ "route53domains:CheckDomainAvailability",
+ "route53domains:GetDomainDetail",
+ "route53domains:GetOperationDetail",
+ "route53domains:List*",
+ "s3:List*",
+ "sdb:GetAttributes",
+ "sdb:List*",
+ "sdb:Select*",
+ "servicecatalog:SearchProducts",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ScanProvisionedProducts",
+ "ses:Get*",
+ "ses:List*",
+ "sns:Get*",
+ "sns:List*",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sqs:ListQueues",
+ "sqs:ReceiveMessage",
+ "ssm:List*",
+ "ssm:Describe*",
+ "storagegateway:Describe*",
+ "storagegateway:List*",
+ "swf:Count*",
+ "swf:Describe*",
+ "swf:Get*",
+ "swf:List*",
+ "waf:Get*",
+ "waf:List*",
+ "workspaces:Describe*",
+ "workdocs:Describe*",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workspaces:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAI3V4GSSN5SJY3P2RO",
+ "PolicyName": "SupportUser",
+ "UpdateDate": "2017-05-17T23:11:51+00:00",
+ "VersionId": "v2"
+ },
+ "SystemAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/SystemAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-24T17:45:43+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:Describe*",
+ "acm:Get*",
+ "acm:List*",
+ "acm:Request*",
+ "acm:Resend*",
+ "autoscaling:*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListPublicKeys",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudwatch:*",
+ "codecommit:BatchGetRepositories",
+ "codecommit:CreateBranch",
+ "codecommit:CreateRepository",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:GitPush",
+ "codecommit:List*",
+ "codecommit:Put*",
+ "codecommit:Test*",
+ "codecommit:Update*",
+ "codedeploy:*",
+ "codepipeline:*",
+ "config:*",
+ "ds:*",
+ "ec2:Allocate*",
+ "ec2:AssignPrivateIpAddresses*",
+ "ec2:Associate*",
+ "ec2:Allocate*",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:Bundle*",
+ "ec2:Cancel*",
+ "ec2:Copy*",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateImage",
+ "ec2:CreateInstanceExportTask",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateKeyPair",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreatePlacementGroup",
+ "ec2:CreateReservedInstancesListing",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateSpotDatafeedSubscription",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteKeyPair",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeletePlacementGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeleteSpotDatafeedSubscription",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DeregisterImage",
+ "ec2:Describe*",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisableVpcClassicLinkDnsSupport",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:EnableVolumeIO",
+ "ec2:EnableVpcClassicLinkDnsSupport",
+ "ec2:GetConsoleOutput",
+ "ec2:GetHostReservationPurchasePreview",
+ "ec2:GetPasswordData",
+ "ec2:Import*",
+ "ec2:Modify*",
+ "ec2:MonitorInstances",
+ "ec2:MoveAddressToVpc",
+ "ec2:Purchase*",
+ "ec2:RegisterImage",
+ "ec2:Release*",
+ "ec2:Replace*",
+ "ec2:ReportInstanceStatus",
+ "ec2:Request*",
+ "ec2:Reset*",
+ "ec2:RestoreAddressToClassic",
+ "ec2:RunScheduledInstances",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:UnmonitorInstances",
+ "elasticloadbalancing:*",
+ "events:*",
+ "iam:GetAccount*",
+ "iam:GetContextKeys*",
+ "iam:GetCredentialReport",
+ "iam:ListAccountAliases",
+ "iam:ListGroups",
+ "iam:ListOpenIDConnectProviders",
+ "iam:ListPolicies",
+ "iam:ListPoliciesGrantingServiceAccess",
+ "iam:ListRoles",
+ "iam:ListSAMLProviders",
+ "iam:ListServerCertificates",
+ "iam:Simulate*",
+ "iam:UpdateServerCertificate",
+ "iam:UpdateSigningCertificate",
+ "kinesis:ListStreams",
+ "kinesis:PutRecord",
+ "kms:CreateAlias",
+ "kms:CreateKey",
+ "kms:DeleteAlias",
+ "kms:Describe*",
+ "kms:GenerateRandom",
+ "kms:Get*",
+ "kms:List*",
+ "kms:Encrypt",
+ "kms:ReEncrypt*",
+ "lambda:Create*",
+ "lambda:Delete*",
+ "lambda:Get*",
+ "lambda:InvokeFunction",
+ "lambda:List*",
+ "lambda:PublishVersion",
+ "lambda:Update*",
+ "logs:*",
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "route53:*",
+ "route53domains:*",
+ "ses:*",
+ "sns:*",
+ "sqs:*",
+ "trustedadvisor:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AttachVolume",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNetworkAcl*",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DetachVolume",
+ "ec2:DisableVpcClassicLink",
+ "ec2:EnableVpcClassicLink",
+ "ec2:GetConsoleScreenshot",
+ "ec2:RebootInstances",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "s3:*",
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetAccessKeyLastUsed",
+ "iam:GetGroup*",
+ "iam:GetInstanceProfile",
+ "iam:GetLoginProfile",
+ "iam:GetOpenIDConnectProvider",
+ "iam:GetPolicy*",
+ "iam:GetRole*",
+ "iam:GetSAMLProvider",
+ "iam:GetSSHPublicKey",
+ "iam:GetServerCertificate",
+ "iam:GetServiceLastAccessed*",
+ "iam:GetUser*",
+ "iam:ListAccessKeys",
+ "iam:ListAttached*",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfiles*",
+ "iam:ListMFADevices",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListSSHPublicKeys",
+ "iam:ListSigningCertificates",
+ "iam:ListUserPolicies",
+ "iam:Upload*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListRoles",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/rds-monitoring-role",
+ "arn:aws:iam::*:role/ec2-sysadmin-*",
+ "arn:aws:iam::*:role/ecr-sysadmin-*",
+ "arn:aws:iam::*:role/lamdba-sysadmin-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAITJPEZXCYCBXANDSW",
+ "PolicyName": "SystemAdministrator",
+ "UpdateDate": "2017-03-24T17:45:43+00:00",
+ "VersionId": "v2"
+ },
+ "VMImportExportRoleForAWSConnector": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/VMImportExportRoleForAWSConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-03T20:48:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::import-to-ec2-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:CopySnapshot",
+ "ec2:RegisterImage",
+ "ec2:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PolicyId": "ANPAJFLQOOJ6F5XNX4LAW",
+ "PolicyName": "VMImportExportRoleForAWSConnector",
+ "UpdateDate": "2015-09-03T20:48:59+00:00",
+ "VersionId": "v1"
+ },
+ "ViewOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-26T22:35:31+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "athena:List*",
+ "aws-marketplace:ViewSubscriptions",
+ "autoscaling:Describe*",
+ "batch:ListJobs",
+ "clouddirectory:ListAppliedSchemaArns",
+ "clouddirectory:ListDevelopmentSchemaArns",
+ "clouddirectory:ListDirectories",
+ "clouddirectory:ListPublishedSchemaArns",
+ "cloudformation:List*",
+ "cloudformation:DescribeStacks",
+ "cloudfront:List*",
+ "cloudhsm:ListAvailableZones",
+ "cloudhsm:ListLunaClients",
+ "cloudhsm:ListHapgs",
+ "cloudhsm:ListHsms",
+ "cloudsearch:List*",
+ "cloudsearch:DescribeDomains",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:List*",
+ "cloudwatch:GetMetricData",
+ "codebuild:ListBuilds*",
+ "codebuild:ListProjects",
+ "codecommit:List*",
+ "codedeploy:List*",
+ "codedeploy:Get*",
+ "codepipeline:ListPipelines",
+ "codestar:List*",
+ "codestar:Verify*",
+ "cognito-idp:List*",
+ "cognito-identity:ListIdentities",
+ "cognito-identity:ListIdentityPools",
+ "cognito-sync:ListDatasets",
+ "connect:List*",
+ "config:List*",
+ "config:Describe*",
+ "datapipeline:ListPipelines",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetAccountLimits",
+ "devicefarm:List*",
+ "directconnect:Describe*",
+ "discovery:List*",
+ "dms:List*",
+ "ds:DescribeDirectories",
+ "dynamodb:ListTables",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeBundleTasks",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeConversionTasks",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeExportTasks",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeHost*",
+ "ec2:DescribeIdentityIdFormat",
+ "ec2:DescribeIdFormat",
+ "ec2:DescribeImage*",
+ "ec2:DescribeImport*",
+ "ec2:DescribeInstance*",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetwork*",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRegions",
+ "ec2:DescribeReserved*",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshot*",
+ "ec2:DescribeSpot*",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolume*",
+ "ec2:DescribeVpc*",
+ "ec2:DescribeVpnGateways",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:List*",
+ "elasticache:Describe*",
+ "elasticbeanstalk:DescribeApplicationVersions",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticbeanstalk:ListAvailableSolutionStacks",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticmapreduce:List*",
+ "elastictranscoder:List*",
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeElasticsearchDomains",
+ "es:ListDomainNames",
+ "events:ListRuleNamesByTarget",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "firehose:List*",
+ "firehose:DescribeDeliveryStream",
+ "gamelift:List*",
+ "glacier:List*",
+ "iam:List*",
+ "iam:GetAccountSummary",
+ "iam:GetLoginProfile",
+ "importexport:ListJobs",
+ "inspector:List*",
+ "iot:List*",
+ "kinesis:ListStreams",
+ "kinesisanalytics:ListApplications",
+ "kms:ListKeys",
+ "lambda:List*",
+ "lex:GetBotAliases",
+ "lex:GetBotChannelAssociations",
+ "lex:GetBots",
+ "lex:GetBotVersions",
+ "lex:GetIntents",
+ "lex:GetIntentVersions",
+ "lex:GetSlotTypes",
+ "lex:GetSlotTypeVersions",
+ "lex:GetUtterancesView",
+ "lightsail:GetBlueprints",
+ "lightsail:GetBundles",
+ "lightsail:GetInstances",
+ "lightsail:GetInstanceSnapshots",
+ "lightsail:GetKeyPair",
+ "lightsail:GetRegions",
+ "lightsail:GetStaticIps",
+ "lightsail:IsVpcPeered",
+ "logs:Describe*",
+ "machinelearning:Describe*",
+ "mobilehub:ListAvailableFeatures",
+ "mobilehub:ListAvailableRegions",
+ "mobilehub:ListProjects",
+ "opsworks:Describe*",
+ "opsworks-cm:Describe*",
+ "organizations:List*",
+ "mobiletargeting:GetApplicationSettings",
+ "mobiletargeting:GetCampaigns",
+ "mobiletargeting:GetImportJobs",
+ "mobiletargeting:GetSegments",
+ "polly:Describe*",
+ "polly:List*",
+ "rds:Describe*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeEvents",
+ "redshift:ViewQueriesInConsole",
+ "route53:List*",
+ "route53:Get*",
+ "route53domains:List*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sdb:List*",
+ "servicecatalog:List*",
+ "ses:List*",
+ "shield:List*",
+ "states:ListActivities",
+ "states:ListStateMachines",
+ "sns:List*",
+ "sqs:ListQueues",
+ "ssm:ListAssociations",
+ "ssm:ListDocuments",
+ "storagegateway:ListGateways",
+ "storagegateway:ListLocalDisks",
+ "storagegateway:ListVolumeRecoveryPoints",
+ "storagegateway:ListVolumes",
+ "swf:List*",
+ "trustedadvisor:Describe*",
+ "waf:List*",
+ "waf-regional:List*",
+ "workdocs:DescribeAvailableDirectories",
+ "workdocs:DescribeInstances",
+ "workmail:Describe*",
+ "workspaces:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PolicyId": "ANPAID22R6XPJATWOFDK6",
+ "PolicyName": "ViewOnlyAccess",
+ "UpdateDate": "2017-06-26T22:35:31+00:00",
+ "VersionId": "v3"
+ }
+}"""
diff --git a/contrib/python/moto/py2/moto/iam/exceptions.py b/contrib/python/moto/py2/moto/iam/exceptions.py
new file mode 100644
index 0000000000..84f15f51fa
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/exceptions.py
@@ -0,0 +1,26 @@
+from __future__ import unicode_literals
+from moto.core.exceptions import RESTError
+
+
+class IAMNotFoundException(RESTError):
+ code = 404
+
+ def __init__(self, message):
+ super(IAMNotFoundException, self).__init__(
+ "NoSuchEntity", message)
+
+
+class IAMConflictException(RESTError):
+ code = 409
+
+ def __init__(self, code='Conflict', message=""):
+ super(IAMConflictException, self).__init__(
+ code, message)
+
+
+class IAMReportNotPresentException(RESTError):
+ code = 410
+
+ def __init__(self, message):
+ super(IAMReportNotPresentException, self).__init__(
+ "ReportNotPresent", message)
diff --git a/contrib/python/moto/py2/moto/iam/models.py b/contrib/python/moto/py2/moto/iam/models.py
new file mode 100644
index 0000000000..4a5240a080
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/models.py
@@ -0,0 +1,941 @@
+from __future__ import unicode_literals
+import base64
+from datetime import datetime
+import json
+
+import pytz
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_without_milliseconds
+
+from .aws_managed_policies import aws_managed_policies_data
+from .exceptions import IAMNotFoundException, IAMConflictException, IAMReportNotPresentException
+from .utils import random_access_key, random_alphanumeric, random_resource_id, random_policy_id
+
+ACCOUNT_ID = 123456789012
+
+
+class MFADevice(object):
+ """MFA Device class."""
+
+ def __init__(self,
+ serial_number,
+ authentication_code_1,
+ authentication_code_2):
+ self.enable_date = datetime.now(pytz.utc)
+ self.serial_number = serial_number
+ self.authentication_code_1 = authentication_code_1
+ self.authentication_code_2 = authentication_code_2
+
+
+class Policy(BaseModel):
+
+ is_attachable = False
+
+ def __init__(self,
+ name,
+ default_version_id=None,
+ description=None,
+ document=None,
+ path=None):
+ self.name = name
+
+ self.attachment_count = 0
+ self.description = description or ''
+ self.id = random_policy_id()
+ self.path = path or '/'
+ self.default_version_id = default_version_id or 'v1'
+ self.versions = [PolicyVersion(self.arn, document, True)]
+
+ self.create_datetime = datetime.now(pytz.utc)
+ self.update_datetime = datetime.now(pytz.utc)
+
+
+class PolicyVersion(object):
+
+ def __init__(self,
+ policy_arn,
+ document,
+ is_default=False):
+ self.policy_arn = policy_arn
+ self.document = document or {}
+ self.is_default = is_default
+ self.version_id = 'v1'
+
+ self.create_datetime = datetime.now(pytz.utc)
+
+
+class ManagedPolicy(Policy):
+ """Managed policy."""
+
+ is_attachable = True
+
+ def attach_to(self, obj):
+ self.attachment_count += 1
+ obj.managed_policies[self.arn] = self
+
+ def detach_from(self, obj):
+ self.attachment_count -= 1
+ del obj.managed_policies[self.arn]
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:policy{1}{2}".format(ACCOUNT_ID, self.path, self.name)
+
+
+class AWSManagedPolicy(ManagedPolicy):
+ """AWS-managed policy."""
+
+ @classmethod
+ def from_data(cls, name, data):
+ return cls(name,
+ default_version_id=data.get('DefaultVersionId'),
+ path=data.get('Path'),
+ document=data.get('Document'))
+
+ @property
+ def arn(self):
+ return 'arn:aws:iam::aws:policy{0}{1}'.format(self.path, self.name)
+
+
+# AWS defines some of its own managed policies and we periodically
+# import them via `make aws_managed_policies`
+aws_managed_policies = [
+ AWSManagedPolicy.from_data(name, d) for name, d
+ in json.loads(aws_managed_policies_data).items()]
+
+
+class InlinePolicy(Policy):
+ """TODO: is this needed?"""
+
+
+class Role(BaseModel):
+
+ def __init__(self, role_id, name, assume_role_policy_document, path):
+ self.id = role_id
+ self.name = name
+ self.assume_role_policy_document = assume_role_policy_document
+ self.path = path
+ self.policies = {}
+ self.managed_policies = {}
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ role = iam_backend.create_role(
+ role_name=resource_name,
+ assume_role_policy_document=properties['AssumeRolePolicyDocument'],
+ path=properties.get('Path', '/'),
+ )
+
+ policies = properties.get('Policies', [])
+ for policy in policies:
+ policy_name = policy['PolicyName']
+ policy_json = policy['PolicyDocument']
+ role.put_policy(policy_name, policy_json)
+
+ return role
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:role{1}{2}".format(ACCOUNT_ID, self.path, self.name)
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def delete_policy(self, policy_name):
+ try:
+ del self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "The role policy with name {0} cannot be found.".format(policy_name))
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'Arn':
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "Arn" ]"')
+ raise UnformattedGetAttTemplateException()
+
+
+class InstanceProfile(BaseModel):
+
+ def __init__(self, instance_profile_id, name, path, roles):
+ self.id = instance_profile_id
+ self.name = name
+ self.path = path
+ self.roles = roles if roles else []
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ role_ids = properties['Roles']
+ return iam_backend.create_instance_profile(
+ name=resource_name,
+ path=properties.get('Path', '/'),
+ role_ids=role_ids,
+ )
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:instance-profile{1}{2}".format(ACCOUNT_ID, self.path, self.name)
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'Arn':
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "Arn" ]"')
+ raise UnformattedGetAttTemplateException()
+
+
+class Certificate(BaseModel):
+
+ def __init__(self, cert_name, cert_body, private_key, cert_chain=None, path=None):
+ self.cert_name = cert_name
+ self.cert_body = cert_body
+ self.private_key = private_key
+ self.path = path if path else "/"
+ self.cert_chain = cert_chain
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:server-certificate{1}{2}".format(ACCOUNT_ID, self.path, self.cert_name)
+
+
+class AccessKey(BaseModel):
+
+ def __init__(self, user_name):
+ self.user_name = user_name
+ self.access_key_id = random_access_key()
+ self.secret_access_key = random_alphanumeric(32)
+ self.status = 'Active'
+ self.create_date = datetime.strftime(
+ datetime.utcnow(),
+ "%Y-%m-%dT%H:%M:%SZ"
+ )
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'SecretAccessKey':
+ return self.secret_access_key
+ raise UnformattedGetAttTemplateException()
+
+
+class Group(BaseModel):
+
+ def __init__(self, name, path='/'):
+ self.name = name
+ self.id = random_resource_id()
+ self.path = path
+ self.created = datetime.strftime(
+ datetime.utcnow(),
+ "%Y-%m-%d-%H-%M-%S"
+ )
+
+ self.users = []
+ self.managed_policies = {}
+ self.policies = {}
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'Arn':
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "Arn" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def arn(self):
+ if self.path == '/':
+ return "arn:aws:iam::{0}:group/{1}".format(ACCOUNT_ID, self.name)
+
+ else:
+ return "arn:aws:iam::{0}:group/{1}/{2}".format(ACCOUNT_ID, self.path, self.name)
+
+ @property
+ def create_date(self):
+ return self.created
+
+ def get_policy(self, policy_name):
+ try:
+ policy_json = self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_name))
+
+ return {
+ 'policy_name': policy_name,
+ 'policy_document': policy_json,
+ 'group_name': self.name,
+ }
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def list_policies(self):
+ return self.policies.keys()
+
+
+class User(BaseModel):
+
+ def __init__(self, name, path=None):
+ self.name = name
+ self.id = random_resource_id()
+ self.path = path if path else "/"
+ self.created = datetime.utcnow()
+ self.mfa_devices = {}
+ self.policies = {}
+ self.managed_policies = {}
+ self.access_keys = []
+ self.password = None
+ self.password_reset_required = False
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:user{1}{2}".format(ACCOUNT_ID, self.path, self.name)
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.created)
+
+ def get_policy(self, policy_name):
+ policy_json = None
+ try:
+ policy_json = self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "Policy {0} not found".format(policy_name))
+
+ return {
+ 'policy_name': policy_name,
+ 'policy_document': policy_json,
+ 'user_name': self.name,
+ }
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def deactivate_mfa_device(self, serial_number):
+ self.mfa_devices.pop(serial_number)
+
+ def delete_policy(self, policy_name):
+ if policy_name not in self.policies:
+ raise IAMNotFoundException(
+ "Policy {0} not found".format(policy_name))
+
+ del self.policies[policy_name]
+
+ def create_access_key(self):
+ access_key = AccessKey(self.name)
+ self.access_keys.append(access_key)
+ return access_key
+
+ def enable_mfa_device(self,
+ serial_number,
+ authentication_code_1,
+ authentication_code_2):
+ self.mfa_devices[serial_number] = MFADevice(
+ serial_number,
+ authentication_code_1,
+ authentication_code_2
+ )
+
+ def get_all_access_keys(self):
+ return self.access_keys
+
+ def delete_access_key(self, access_key_id):
+ for key in self.access_keys:
+ if key.access_key_id == access_key_id:
+ self.access_keys.remove(key)
+ break
+ else:
+ raise IAMNotFoundException(
+ "Key {0} not found".format(access_key_id))
+
+ def update_access_key(self, access_key_id, status):
+ for key in self.access_keys:
+ if key.access_key_id == access_key_id:
+ key.status = status
+ break
+ else:
+ raise IAMNotFoundException("The Access Key with id {0} cannot be found".format(access_key_id))
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'Arn':
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "Arn" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ def to_csv(self):
+ date_format = '%Y-%m-%dT%H:%M:%S+00:00'
+ date_created = self.created
+ # aagrawal,arn:aws:iam::509284790694:user/aagrawal,2014-09-01T22:28:48+00:00,true,2014-11-12T23:36:49+00:00,2014-09-03T18:59:00+00:00,N/A,false,true,2014-09-01T22:28:48+00:00,false,N/A,false,N/A,false,N/A
+ if not self.password:
+ password_enabled = 'false'
+ password_last_used = 'not_supported'
+ else:
+ password_enabled = 'true'
+ password_last_used = 'no_information'
+
+ if len(self.access_keys) == 0:
+ access_key_1_active = 'false'
+ access_key_1_last_rotated = 'N/A'
+ access_key_2_active = 'false'
+ access_key_2_last_rotated = 'N/A'
+ elif len(self.access_keys) == 1:
+ access_key_1_active = 'true'
+ access_key_1_last_rotated = date_created.strftime(date_format)
+ access_key_2_active = 'false'
+ access_key_2_last_rotated = 'N/A'
+ else:
+ access_key_1_active = 'true'
+ access_key_1_last_rotated = date_created.strftime(date_format)
+ access_key_2_active = 'true'
+ access_key_2_last_rotated = date_created.strftime(date_format)
+
+ return '{0},{1},{2},{3},{4},{5},not_supported,false,{6},{7},{8},{9},false,N/A,false,N/A'.format(self.name,
+ self.arn,
+ date_created.strftime(
+ date_format),
+ password_enabled,
+ password_last_used,
+ date_created.strftime(
+ date_format),
+ access_key_1_active,
+ access_key_1_last_rotated,
+ access_key_2_active,
+ access_key_2_last_rotated
+ )
+
+
+class IAMBackend(BaseBackend):
+
+ def __init__(self):
+ self.instance_profiles = {}
+ self.roles = {}
+ self.certificates = {}
+ self.groups = {}
+ self.users = {}
+ self.credential_report = None
+ self.managed_policies = self._init_managed_policies()
+ self.account_aliases = []
+ super(IAMBackend, self).__init__()
+
+ def _init_managed_policies(self):
+ return dict((p.name, p) for p in aws_managed_policies)
+
+ def attach_role_policy(self, policy_arn, role_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ policy = arns[policy_arn]
+ policy.attach_to(self.get_role(role_name))
+
+ def detach_role_policy(self, policy_arn, role_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ policy.detach_from(self.get_role(role_name))
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+
+ def attach_group_policy(self, policy_arn, group_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.attach_to(self.get_group(group_name))
+
+ def detach_group_policy(self, policy_arn, group_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.detach_from(self.get_group(group_name))
+
+ def attach_user_policy(self, policy_arn, user_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.attach_to(self.get_user(user_name))
+
+ def detach_user_policy(self, policy_arn, user_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.detach_from(self.get_user(user_name))
+
+ def create_policy(self, description, path, policy_document, policy_name):
+ policy = ManagedPolicy(
+ policy_name,
+ description=description,
+ document=policy_document,
+ path=path,
+ )
+ self.managed_policies[policy.arn] = policy
+ return policy
+
+ def get_policy(self, policy_arn):
+ if policy_arn not in self.managed_policies:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_arn))
+ return self.managed_policies.get(policy_arn)
+
+ def list_attached_role_policies(self, role_name, marker=None, max_items=100, path_prefix='/'):
+ policies = self.get_role(role_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_attached_group_policies(self, group_name, marker=None, max_items=100, path_prefix='/'):
+ policies = self.get_group(group_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_attached_user_policies(self, user_name, marker=None, max_items=100, path_prefix='/'):
+ policies = self.get_user(user_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_policies(self, marker, max_items, only_attached, path_prefix, scope):
+ policies = self.managed_policies.values()
+
+ if only_attached:
+ policies = [p for p in policies if p.attachment_count > 0]
+
+ if scope == 'AWS':
+ policies = [p for p in policies if isinstance(p, AWSManagedPolicy)]
+ elif scope == 'Local':
+ policies = [p for p in policies if not isinstance(
+ p, AWSManagedPolicy)]
+
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def _filter_attached_policies(self, policies, marker, max_items, path_prefix):
+ if path_prefix:
+ policies = [p for p in policies if p.path.startswith(path_prefix)]
+
+ policies = sorted(policies, key=lambda policy: policy.name)
+ start_idx = int(marker) if marker else 0
+
+ policies = policies[start_idx:start_idx + max_items]
+
+ if len(policies) < max_items:
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ return policies, marker
+
+ def create_role(self, role_name, assume_role_policy_document, path):
+ role_id = random_resource_id()
+ role = Role(role_id, role_name, assume_role_policy_document, path)
+ self.roles[role_id] = role
+ return role
+
+ def get_role_by_id(self, role_id):
+ return self.roles.get(role_id)
+
+ def get_role(self, role_name):
+ for role in self.get_roles():
+ if role.name == role_name:
+ return role
+ raise IAMNotFoundException("Role {0} not found".format(role_name))
+
+ def get_role_by_arn(self, arn):
+ for role in self.get_roles():
+ if role.arn == arn:
+ return role
+ raise IAMNotFoundException("Role {0} not found".format(arn))
+
+ def delete_role(self, role_name):
+ for role in self.get_roles():
+ if role.name == role_name:
+ del self.roles[role.id]
+ return
+ raise IAMNotFoundException("Role {0} not found".format(role_name))
+
+ def get_roles(self):
+ return self.roles.values()
+
+ def put_role_policy(self, role_name, policy_name, policy_json):
+ role = self.get_role(role_name)
+ role.put_policy(policy_name, policy_json)
+
+ def delete_role_policy(self, role_name, policy_name):
+ role = self.get_role(role_name)
+ role.delete_policy(policy_name)
+
+ def get_role_policy(self, role_name, policy_name):
+ role = self.get_role(role_name)
+ for p, d in role.policies.items():
+ if p == policy_name:
+ return p, d
+
+ def list_role_policies(self, role_name):
+ role = self.get_role(role_name)
+ return role.policies.keys()
+
+ def create_policy_version(self, policy_arn, policy_document, set_as_default):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ version = PolicyVersion(policy_arn, policy_document, set_as_default)
+ policy.versions.append(version)
+ version.version_id = 'v{0}'.format(len(policy.versions))
+ if set_as_default:
+ policy.default_version_id = version.version_id
+ return version
+
+ def get_policy_version(self, policy_arn, version_id):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ for version in policy.versions:
+ if version.version_id == version_id:
+ return version
+ raise IAMNotFoundException("Policy version not found")
+
+ def list_policy_versions(self, policy_arn):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ return policy.versions
+
+ def delete_policy_version(self, policy_arn, version_id):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ if version_id == policy.default_version_id:
+ raise IAMConflictException(
+ "Cannot delete the default version of a policy")
+ for i, v in enumerate(policy.versions):
+ if v.version_id == version_id:
+ del policy.versions[i]
+ return
+ raise IAMNotFoundException("Policy not found")
+
+ def create_instance_profile(self, name, path, role_ids):
+ instance_profile_id = random_resource_id()
+
+ roles = [iam_backend.get_role_by_id(role_id) for role_id in role_ids]
+ instance_profile = InstanceProfile(
+ instance_profile_id, name, path, roles)
+ self.instance_profiles[instance_profile_id] = instance_profile
+ return instance_profile
+
+ def get_instance_profile(self, profile_name):
+ for profile in self.get_instance_profiles():
+ if profile.name == profile_name:
+ return profile
+
+ raise IAMNotFoundException(
+ "Instance profile {0} not found".format(profile_name))
+
+ def get_instance_profiles(self):
+ return self.instance_profiles.values()
+
+ def get_instance_profiles_for_role(self, role_name):
+ found_profiles = []
+
+ for profile in self.get_instance_profiles():
+ if len(profile.roles) > 0:
+ if profile.roles[0].name == role_name:
+ found_profiles.append(profile)
+
+ return found_profiles
+
+ def add_role_to_instance_profile(self, profile_name, role_name):
+ profile = self.get_instance_profile(profile_name)
+ role = self.get_role(role_name)
+ profile.roles.append(role)
+
+ def remove_role_from_instance_profile(self, profile_name, role_name):
+ profile = self.get_instance_profile(profile_name)
+ role = self.get_role(role_name)
+ profile.roles.remove(role)
+
+ def get_all_server_certs(self, marker=None):
+ return self.certificates.values()
+
+ def upload_server_cert(self, cert_name, cert_body, private_key, cert_chain=None, path=None):
+ certificate_id = random_resource_id()
+ cert = Certificate(cert_name, cert_body, private_key, cert_chain, path)
+ self.certificates[certificate_id] = cert
+ return cert
+
+ def get_server_certificate(self, name):
+ for key, cert in self.certificates.items():
+ if name == cert.cert_name:
+ return cert
+
+ raise IAMNotFoundException(
+ "The Server Certificate with name {0} cannot be "
+ "found.".format(name))
+
+ def delete_server_certificate(self, name):
+ cert_id = None
+ for key, cert in self.certificates.items():
+ if name == cert.cert_name:
+ cert_id = key
+ break
+
+ if cert_id is None:
+ raise IAMNotFoundException(
+ "The Server Certificate with name {0} cannot be "
+ "found.".format(name))
+
+ self.certificates.pop(cert_id, None)
+
+ def create_group(self, group_name, path='/'):
+ if group_name in self.groups:
+ raise IAMConflictException(
+ "Group {0} already exists".format(group_name))
+
+ group = Group(group_name, path)
+ self.groups[group_name] = group
+ return group
+
+ def get_group(self, group_name, marker=None, max_items=None):
+ group = None
+ try:
+ group = self.groups[group_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "Group {0} not found".format(group_name))
+
+ return group
+
+ def list_groups(self):
+ return self.groups.values()
+
+ def get_groups_for_user(self, user_name):
+ user = self.get_user(user_name)
+ groups = []
+ for group in self.list_groups():
+ if user in group.users:
+ groups.append(group)
+
+ return groups
+
+ def put_group_policy(self, group_name, policy_name, policy_json):
+ group = self.get_group(group_name)
+ group.put_policy(policy_name, policy_json)
+
+ def list_group_policies(self, group_name, marker=None, max_items=None):
+ group = self.get_group(group_name)
+ return group.list_policies()
+
+ def get_group_policy(self, group_name, policy_name):
+ group = self.get_group(group_name)
+ return group.get_policy(policy_name)
+
+ def create_user(self, user_name, path='/'):
+ if user_name in self.users:
+ raise IAMConflictException(
+ "EntityAlreadyExists", "User {0} already exists".format(user_name))
+
+ user = User(user_name, path)
+ self.users[user_name] = user
+ return user
+
+ def get_user(self, user_name):
+ user = None
+ try:
+ user = self.users[user_name]
+ except KeyError:
+ raise IAMNotFoundException("User {0} not found".format(user_name))
+
+ return user
+
+ def list_users(self, path_prefix, marker, max_items):
+ users = None
+ try:
+ users = self.users.values()
+ except KeyError:
+ raise IAMNotFoundException(
+ "Users {0}, {1}, {2} not found".format(path_prefix, marker, max_items))
+
+ return users
+
+ def create_login_profile(self, user_name, password):
+ # This does not currently deal with PasswordPolicyViolation.
+ user = self.get_user(user_name)
+ if user.password:
+ raise IAMConflictException(
+ "User {0} already has password".format(user_name))
+ user.password = password
+ return user
+
+ def get_login_profile(self, user_name):
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name))
+ return user
+
+ def update_login_profile(self, user_name, password, password_reset_required):
+ # This does not currently deal with PasswordPolicyViolation.
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name))
+ user.password = password
+ user.password_reset_required = password_reset_required
+ return user
+
+ def delete_login_profile(self, user_name):
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name))
+ user.password = None
+
+ def add_user_to_group(self, group_name, user_name):
+ user = self.get_user(user_name)
+ group = self.get_group(group_name)
+ group.users.append(user)
+
+ def remove_user_from_group(self, group_name, user_name):
+ group = self.get_group(group_name)
+ user = self.get_user(user_name)
+ try:
+ group.users.remove(user)
+ except ValueError:
+ raise IAMNotFoundException(
+ "User {0} not in group {1}".format(user_name, group_name))
+
+ def get_user_policy(self, user_name, policy_name):
+ user = self.get_user(user_name)
+ policy = user.get_policy(policy_name)
+ return policy
+
+ def list_user_policies(self, user_name):
+ user = self.get_user(user_name)
+ return user.policies.keys()
+
+ def put_user_policy(self, user_name, policy_name, policy_json):
+ user = self.get_user(user_name)
+ user.put_policy(policy_name, policy_json)
+
+ def delete_user_policy(self, user_name, policy_name):
+ user = self.get_user(user_name)
+ user.delete_policy(policy_name)
+
+ def create_access_key(self, user_name=None):
+ user = self.get_user(user_name)
+ key = user.create_access_key()
+ return key
+
+ def update_access_key(self, user_name, access_key_id, status):
+ user = self.get_user(user_name)
+ user.update_access_key(access_key_id, status)
+
+ def get_all_access_keys(self, user_name, marker=None, max_items=None):
+ user = self.get_user(user_name)
+ keys = user.get_all_access_keys()
+ return keys
+
+ def delete_access_key(self, access_key_id, user_name):
+ user = self.get_user(user_name)
+ user.delete_access_key(access_key_id)
+
+ def enable_mfa_device(self,
+ user_name,
+ serial_number,
+ authentication_code_1,
+ authentication_code_2):
+ """Enable MFA Device for user."""
+ user = self.get_user(user_name)
+ if serial_number in user.mfa_devices:
+ raise IAMConflictException(
+ "EntityAlreadyExists",
+ "Device {0} already exists".format(serial_number)
+ )
+
+ user.enable_mfa_device(
+ serial_number,
+ authentication_code_1,
+ authentication_code_2
+ )
+
+ def deactivate_mfa_device(self, user_name, serial_number):
+ """Deactivate and detach MFA Device from user if device exists."""
+ user = self.get_user(user_name)
+ if serial_number not in user.mfa_devices:
+ raise IAMNotFoundException(
+ "Device {0} not found".format(serial_number)
+ )
+
+ user.deactivate_mfa_device(serial_number)
+
+ def list_mfa_devices(self, user_name):
+ user = self.get_user(user_name)
+ return user.mfa_devices.values()
+
+ def delete_user(self, user_name):
+ try:
+ del self.users[user_name]
+ except KeyError:
+ raise IAMNotFoundException("User {0} not found".format(user_name))
+
+ def report_generated(self):
+ return self.credential_report
+
+ def generate_report(self):
+ self.credential_report = True
+
+ def get_credential_report(self):
+ if not self.credential_report:
+ raise IAMReportNotPresentException("Credential report not present")
+ report = 'user,arn,user_creation_time,password_enabled,password_last_used,password_last_changed,password_next_rotation,mfa_active,access_key_1_active,access_key_1_last_rotated,access_key_2_active,access_key_2_last_rotated,cert_1_active,cert_1_last_rotated,cert_2_active,cert_2_last_rotated\n'
+ for user in self.users:
+ report += self.users[user].to_csv()
+ return base64.b64encode(report.encode('ascii')).decode('ascii')
+
+ def list_account_aliases(self):
+ return self.account_aliases
+
+ def create_account_alias(self, alias):
+ # alias is force updated
+ self.account_aliases = [alias]
+
+ def delete_account_alias(self, alias):
+ self.account_aliases = []
+
+ def get_account_authorization_details(self, filter):
+ policies = self.managed_policies.values()
+ local_policies = set(policies) - set(aws_managed_policies)
+ returned_policies = []
+
+ if len(filter) == 0:
+ return {
+ 'instance_profiles': self.instance_profiles.values(),
+ 'roles': self.roles.values(),
+ 'groups': self.groups.values(),
+ 'users': self.users.values(),
+ 'managed_policies': self.managed_policies.values()
+ }
+
+ if 'AWSManagedPolicy' in filter:
+ returned_policies = aws_managed_policies
+ if 'LocalManagedPolicy' in filter:
+ returned_policies = returned_policies + list(local_policies)
+
+ return {
+ 'instance_profiles': self.instance_profiles.values(),
+ 'roles': self.roles.values() if 'Role' in filter else [],
+ 'groups': self.groups.values() if 'Group' in filter else [],
+ 'users': self.users.values() if 'User' in filter else [],
+ 'managed_policies': returned_policies
+ }
+
+
+iam_backend = IAMBackend()
diff --git a/contrib/python/moto/py2/moto/iam/responses.py b/contrib/python/moto/py2/moto/iam/responses.py
new file mode 100644
index 0000000000..22558f3f6b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/responses.py
@@ -0,0 +1,1487 @@
+from __future__ import unicode_literals
+
+from moto.core.responses import BaseResponse
+from .models import iam_backend, User
+
+
+class IamResponse(BaseResponse):
+
+ def attach_role_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ role_name = self._get_param('RoleName')
+ iam_backend.attach_role_policy(policy_arn, role_name)
+ template = self.response_template(ATTACH_ROLE_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_role_policy(self):
+ role_name = self._get_param('RoleName')
+ policy_arn = self._get_param('PolicyArn')
+ iam_backend.detach_role_policy(policy_arn, role_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DetachRolePolicyResponse")
+
+ def attach_group_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ group_name = self._get_param('GroupName')
+ iam_backend.attach_group_policy(policy_arn, group_name)
+ template = self.response_template(ATTACH_GROUP_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_group_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ group_name = self._get_param('GroupName')
+ iam_backend.detach_group_policy(policy_arn, group_name)
+ template = self.response_template(DETACH_GROUP_POLICY_TEMPLATE)
+ return template.render()
+
+ def attach_user_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ user_name = self._get_param('UserName')
+ iam_backend.attach_user_policy(policy_arn, user_name)
+ template = self.response_template(ATTACH_USER_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_user_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ user_name = self._get_param('UserName')
+ iam_backend.detach_user_policy(policy_arn, user_name)
+ template = self.response_template(DETACH_USER_POLICY_TEMPLATE)
+ return template.render()
+
+ def create_policy(self):
+ description = self._get_param('Description')
+ path = self._get_param('Path')
+ policy_document = self._get_param('PolicyDocument')
+ policy_name = self._get_param('PolicyName')
+ policy = iam_backend.create_policy(
+ description, path, policy_document, policy_name)
+ template = self.response_template(CREATE_POLICY_TEMPLATE)
+ return template.render(policy=policy)
+
+ def get_policy(self):
+ policy_arn = self._get_param('PolicyArn')
+ policy = iam_backend.get_policy(policy_arn)
+ template = self.response_template(GET_POLICY_TEMPLATE)
+ return template.render(policy=policy)
+
+ def list_attached_role_policies(self):
+ marker = self._get_param('Marker')
+ max_items = self._get_int_param('MaxItems', 100)
+ path_prefix = self._get_param('PathPrefix', '/')
+ role_name = self._get_param('RoleName')
+ policies, marker = iam_backend.list_attached_role_policies(
+ role_name, marker=marker, max_items=max_items, path_prefix=path_prefix)
+ template = self.response_template(LIST_ATTACHED_ROLE_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_attached_group_policies(self):
+ marker = self._get_param('Marker')
+ max_items = self._get_int_param('MaxItems', 100)
+ path_prefix = self._get_param('PathPrefix', '/')
+ group_name = self._get_param('GroupName')
+ policies, marker = iam_backend.list_attached_group_policies(
+ group_name, marker=marker, max_items=max_items,
+ path_prefix=path_prefix)
+ template = self.response_template(LIST_ATTACHED_GROUP_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_attached_user_policies(self):
+ marker = self._get_param('Marker')
+ max_items = self._get_int_param('MaxItems', 100)
+ path_prefix = self._get_param('PathPrefix', '/')
+ user_name = self._get_param('UserName')
+ policies, marker = iam_backend.list_attached_user_policies(
+ user_name, marker=marker, max_items=max_items,
+ path_prefix=path_prefix)
+ template = self.response_template(LIST_ATTACHED_USER_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_policies(self):
+ marker = self._get_param('Marker')
+ max_items = self._get_int_param('MaxItems', 100)
+ only_attached = self._get_bool_param('OnlyAttached', False)
+ path_prefix = self._get_param('PathPrefix', '/')
+ scope = self._get_param('Scope', 'All')
+ policies, marker = iam_backend.list_policies(
+ marker, max_items, only_attached, path_prefix, scope)
+ template = self.response_template(LIST_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def create_role(self):
+ role_name = self._get_param('RoleName')
+ path = self._get_param('Path')
+ assume_role_policy_document = self._get_param(
+ 'AssumeRolePolicyDocument')
+
+ role = iam_backend.create_role(
+ role_name, assume_role_policy_document, path)
+ template = self.response_template(CREATE_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def get_role(self):
+ role_name = self._get_param('RoleName')
+ role = iam_backend.get_role(role_name)
+
+ template = self.response_template(GET_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def delete_role(self):
+ role_name = self._get_param('RoleName')
+ iam_backend.delete_role(role_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteRoleResponse")
+
+ def list_role_policies(self):
+ role_name = self._get_param('RoleName')
+ role_policies_names = iam_backend.list_role_policies(role_name)
+ template = self.response_template(LIST_ROLE_POLICIES)
+ return template.render(role_policies=role_policies_names)
+
+ def put_role_policy(self):
+ role_name = self._get_param('RoleName')
+ policy_name = self._get_param('PolicyName')
+ policy_document = self._get_param('PolicyDocument')
+ iam_backend.put_role_policy(role_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutRolePolicyResponse")
+
+ def delete_role_policy(self):
+ role_name = self._get_param('RoleName')
+ policy_name = self._get_param('PolicyName')
+ iam_backend.delete_role_policy(role_name, policy_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteRolePolicyResponse")
+
+ def get_role_policy(self):
+ role_name = self._get_param('RoleName')
+ policy_name = self._get_param('PolicyName')
+ policy_name, policy_document = iam_backend.get_role_policy(
+ role_name, policy_name)
+ template = self.response_template(GET_ROLE_POLICY_TEMPLATE)
+ return template.render(role_name=role_name,
+ policy_name=policy_name,
+ policy_document=policy_document)
+
+ def update_assume_role_policy(self):
+ role_name = self._get_param('RoleName')
+ role = iam_backend.get_role(role_name)
+ role.assume_role_policy_document = self._get_param('PolicyDocument')
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="UpdateAssumeRolePolicyResponse")
+
+ def create_policy_version(self):
+ policy_arn = self._get_param('PolicyArn')
+ policy_document = self._get_param('PolicyDocument')
+ set_as_default = self._get_param('SetAsDefault')
+ policy_version = iam_backend.create_policy_version(policy_arn, policy_document, set_as_default)
+ template = self.response_template(CREATE_POLICY_VERSION_TEMPLATE)
+ return template.render(policy_version=policy_version)
+
+ def get_policy_version(self):
+ policy_arn = self._get_param('PolicyArn')
+ version_id = self._get_param('VersionId')
+ policy_version = iam_backend.get_policy_version(policy_arn, version_id)
+ template = self.response_template(GET_POLICY_VERSION_TEMPLATE)
+ return template.render(policy_version=policy_version)
+
+ def list_policy_versions(self):
+ policy_arn = self._get_param('PolicyArn')
+ policy_versions = iam_backend.list_policy_versions(policy_arn)
+
+ template = self.response_template(LIST_POLICY_VERSIONS_TEMPLATE)
+ return template.render(policy_versions=policy_versions)
+
+ def delete_policy_version(self):
+ policy_arn = self._get_param('PolicyArn')
+ version_id = self._get_param('VersionId')
+
+ iam_backend.delete_policy_version(policy_arn, version_id)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeletePolicyVersion')
+
+ def create_instance_profile(self):
+ profile_name = self._get_param('InstanceProfileName')
+ path = self._get_param('Path')
+
+ profile = iam_backend.create_instance_profile(
+ profile_name, path, role_ids=[])
+ template = self.response_template(CREATE_INSTANCE_PROFILE_TEMPLATE)
+ return template.render(profile=profile)
+
+ def get_instance_profile(self):
+ profile_name = self._get_param('InstanceProfileName')
+ profile = iam_backend.get_instance_profile(profile_name)
+
+ template = self.response_template(GET_INSTANCE_PROFILE_TEMPLATE)
+ return template.render(profile=profile)
+
+ def add_role_to_instance_profile(self):
+ profile_name = self._get_param('InstanceProfileName')
+ role_name = self._get_param('RoleName')
+
+ iam_backend.add_role_to_instance_profile(profile_name, role_name)
+ template = self.response_template(
+ ADD_ROLE_TO_INSTANCE_PROFILE_TEMPLATE)
+ return template.render()
+
+ def remove_role_from_instance_profile(self):
+ profile_name = self._get_param('InstanceProfileName')
+ role_name = self._get_param('RoleName')
+
+ iam_backend.remove_role_from_instance_profile(profile_name, role_name)
+ template = self.response_template(
+ REMOVE_ROLE_FROM_INSTANCE_PROFILE_TEMPLATE)
+ return template.render()
+
+ def list_roles(self):
+ roles = iam_backend.get_roles()
+
+ template = self.response_template(LIST_ROLES_TEMPLATE)
+ return template.render(roles=roles)
+
+ def list_instance_profiles(self):
+ profiles = iam_backend.get_instance_profiles()
+
+ template = self.response_template(LIST_INSTANCE_PROFILES_TEMPLATE)
+ return template.render(instance_profiles=profiles)
+
+ def list_instance_profiles_for_role(self):
+ role_name = self._get_param('RoleName')
+ profiles = iam_backend.get_instance_profiles_for_role(
+ role_name=role_name)
+
+ template = self.response_template(
+ LIST_INSTANCE_PROFILES_FOR_ROLE_TEMPLATE)
+ return template.render(instance_profiles=profiles)
+
+ def upload_server_certificate(self):
+ cert_name = self._get_param('ServerCertificateName')
+ cert_body = self._get_param('CertificateBody')
+ path = self._get_param('Path')
+ private_key = self._get_param('PrivateKey')
+ cert_chain = self._get_param('CertificateName')
+
+ cert = iam_backend.upload_server_cert(
+ cert_name, cert_body, private_key, cert_chain=cert_chain, path=path)
+ template = self.response_template(UPLOAD_CERT_TEMPLATE)
+ return template.render(certificate=cert)
+
+ def list_server_certificates(self, marker=None):
+ certs = iam_backend.get_all_server_certs(marker=marker)
+ template = self.response_template(LIST_SERVER_CERTIFICATES_TEMPLATE)
+ return template.render(server_certificates=certs)
+
+ def get_server_certificate(self):
+ cert_name = self._get_param('ServerCertificateName')
+ cert = iam_backend.get_server_certificate(cert_name)
+ template = self.response_template(GET_SERVER_CERTIFICATE_TEMPLATE)
+ return template.render(certificate=cert)
+
+ def delete_server_certificate(self):
+ cert_name = self._get_param('ServerCertificateName')
+ iam_backend.delete_server_certificate(cert_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteServerCertificate")
+
+ def create_group(self):
+ group_name = self._get_param('GroupName')
+ path = self._get_param('Path', '/')
+
+ group = iam_backend.create_group(group_name, path)
+ template = self.response_template(CREATE_GROUP_TEMPLATE)
+ return template.render(group=group)
+
+ def get_group(self):
+ group_name = self._get_param('GroupName')
+
+ group = iam_backend.get_group(group_name)
+ template = self.response_template(GET_GROUP_TEMPLATE)
+ return template.render(group=group)
+
+ def list_groups(self):
+ groups = iam_backend.list_groups()
+ template = self.response_template(LIST_GROUPS_TEMPLATE)
+ return template.render(groups=groups)
+
+ def list_groups_for_user(self):
+ user_name = self._get_param('UserName')
+
+ groups = iam_backend.get_groups_for_user(user_name)
+ template = self.response_template(LIST_GROUPS_FOR_USER_TEMPLATE)
+ return template.render(groups=groups)
+
+ def put_group_policy(self):
+ group_name = self._get_param('GroupName')
+ policy_name = self._get_param('PolicyName')
+ policy_document = self._get_param('PolicyDocument')
+ iam_backend.put_group_policy(group_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutGroupPolicyResponse")
+
+ def list_group_policies(self):
+ group_name = self._get_param('GroupName')
+ marker = self._get_param('Marker')
+ max_items = self._get_param('MaxItems')
+ policies = iam_backend.list_group_policies(group_name,
+ marker=marker, max_items=max_items)
+ template = self.response_template(LIST_GROUP_POLICIES_TEMPLATE)
+ return template.render(name="ListGroupPoliciesResponse",
+ policies=policies,
+ marker=marker)
+
+ def get_group_policy(self):
+ group_name = self._get_param('GroupName')
+ policy_name = self._get_param('PolicyName')
+ policy_result = iam_backend.get_group_policy(group_name, policy_name)
+ template = self.response_template(GET_GROUP_POLICY_TEMPLATE)
+ return template.render(name="GetGroupPolicyResponse", **policy_result)
+
+ def create_user(self):
+ user_name = self._get_param('UserName')
+ path = self._get_param('Path')
+
+ user = iam_backend.create_user(user_name, path)
+ template = self.response_template(USER_TEMPLATE)
+ return template.render(action='Create', user=user)
+
+ def get_user(self):
+ user_name = self._get_param('UserName')
+ if user_name:
+ user = iam_backend.get_user(user_name)
+ else:
+ user = User(name='default_user')
+ # If no user is specific, IAM returns the current user
+
+ template = self.response_template(USER_TEMPLATE)
+ return template.render(action='Get', user=user)
+
+ def list_users(self):
+ path_prefix = self._get_param('PathPrefix')
+ marker = self._get_param('Marker')
+ max_items = self._get_param('MaxItems')
+ users = iam_backend.list_users(path_prefix, marker, max_items)
+ template = self.response_template(LIST_USERS_TEMPLATE)
+ return template.render(action='List', users=users)
+
+ def create_login_profile(self):
+ user_name = self._get_param('UserName')
+ password = self._get_param('Password')
+ password = self._get_param('Password')
+ user = iam_backend.create_login_profile(user_name, password)
+
+ template = self.response_template(CREATE_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def get_login_profile(self):
+ user_name = self._get_param('UserName')
+ user = iam_backend.get_login_profile(user_name)
+
+ template = self.response_template(GET_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def update_login_profile(self):
+ user_name = self._get_param('UserName')
+ password = self._get_param('Password')
+ password_reset_required = self._get_param('PasswordResetRequired')
+ user = iam_backend.update_login_profile(user_name, password, password_reset_required)
+
+ template = self.response_template(UPDATE_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def add_user_to_group(self):
+ group_name = self._get_param('GroupName')
+ user_name = self._get_param('UserName')
+
+ iam_backend.add_user_to_group(group_name, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='AddUserToGroup')
+
+ def remove_user_from_group(self):
+ group_name = self._get_param('GroupName')
+ user_name = self._get_param('UserName')
+
+ iam_backend.remove_user_from_group(group_name, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='RemoveUserFromGroup')
+
+ def get_user_policy(self):
+ user_name = self._get_param('UserName')
+ policy_name = self._get_param('PolicyName')
+
+ policy_document = iam_backend.get_user_policy(user_name, policy_name)
+ template = self.response_template(GET_USER_POLICY_TEMPLATE)
+ return template.render(
+ user_name=user_name,
+ policy_name=policy_name,
+ policy_document=policy_document.get('policy_document')
+ )
+
+ def list_user_policies(self):
+ user_name = self._get_param('UserName')
+ policies = iam_backend.list_user_policies(user_name)
+ template = self.response_template(LIST_USER_POLICIES_TEMPLATE)
+ return template.render(policies=policies)
+
+ def put_user_policy(self):
+ user_name = self._get_param('UserName')
+ policy_name = self._get_param('PolicyName')
+ policy_document = self._get_param('PolicyDocument')
+
+ iam_backend.put_user_policy(user_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='PutUserPolicy')
+
+ def delete_user_policy(self):
+ user_name = self._get_param('UserName')
+ policy_name = self._get_param('PolicyName')
+
+ iam_backend.delete_user_policy(user_name, policy_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeleteUserPolicy')
+
+ def create_access_key(self):
+ user_name = self._get_param('UserName')
+
+ key = iam_backend.create_access_key(user_name)
+ template = self.response_template(CREATE_ACCESS_KEY_TEMPLATE)
+ return template.render(key=key)
+
+ def update_access_key(self):
+ user_name = self._get_param('UserName')
+ access_key_id = self._get_param('AccessKeyId')
+ status = self._get_param('Status')
+ iam_backend.update_access_key(user_name, access_key_id, status)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='UpdateAccessKey')
+
+ def list_access_keys(self):
+ user_name = self._get_param('UserName')
+
+ keys = iam_backend.get_all_access_keys(user_name)
+ template = self.response_template(LIST_ACCESS_KEYS_TEMPLATE)
+ return template.render(user_name=user_name, keys=keys)
+
+ def delete_access_key(self):
+ user_name = self._get_param('UserName')
+ access_key_id = self._get_param('AccessKeyId')
+
+ iam_backend.delete_access_key(access_key_id, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeleteAccessKey')
+
+ def deactivate_mfa_device(self):
+ user_name = self._get_param('UserName')
+ serial_number = self._get_param('SerialNumber')
+
+ iam_backend.deactivate_mfa_device(user_name, serial_number)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeactivateMFADevice')
+
+ def enable_mfa_device(self):
+ user_name = self._get_param('UserName')
+ serial_number = self._get_param('SerialNumber')
+ authentication_code_1 = self._get_param('AuthenticationCode1')
+ authentication_code_2 = self._get_param('AuthenticationCode2')
+
+ iam_backend.enable_mfa_device(
+ user_name,
+ serial_number,
+ authentication_code_1,
+ authentication_code_2
+ )
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='EnableMFADevice')
+
+ def list_mfa_devices(self):
+ user_name = self._get_param('UserName')
+ devices = iam_backend.list_mfa_devices(user_name)
+ template = self.response_template(LIST_MFA_DEVICES_TEMPLATE)
+ return template.render(user_name=user_name, devices=devices)
+
+ def delete_user(self):
+ user_name = self._get_param('UserName')
+ iam_backend.delete_user(user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeleteUser')
+
+ def delete_login_profile(self):
+ user_name = self._get_param('UserName')
+ iam_backend.delete_login_profile(user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name='DeleteLoginProfile')
+
+ def generate_credential_report(self):
+ if iam_backend.report_generated():
+ template = self.response_template(CREDENTIAL_REPORT_GENERATED)
+ else:
+ template = self.response_template(CREDENTIAL_REPORT_GENERATING)
+ iam_backend.generate_report()
+ return template.render()
+
+ def get_credential_report(self):
+ report = iam_backend.get_credential_report()
+ template = self.response_template(CREDENTIAL_REPORT)
+ return template.render(report=report)
+
+ def list_account_aliases(self):
+ aliases = iam_backend.list_account_aliases()
+ template = self.response_template(LIST_ACCOUNT_ALIASES_TEMPLATE)
+ return template.render(aliases=aliases)
+
+ def create_account_alias(self):
+ alias = self._get_param('AccountAlias')
+ iam_backend.create_account_alias(alias)
+ template = self.response_template(CREATE_ACCOUNT_ALIAS_TEMPLATE)
+ return template.render()
+
+ def delete_account_alias(self):
+ alias = self._get_param('AccountAlias')
+ iam_backend.delete_account_alias(alias)
+ template = self.response_template(DELETE_ACCOUNT_ALIAS_TEMPLATE)
+ return template.render()
+
+ def get_account_authorization_details(self):
+ filter_param = self._get_multi_param('Filter.member')
+ account_details = iam_backend.get_account_authorization_details(filter_param)
+ template = self.response_template(GET_ACCOUNT_AUTHORIZATION_DETAILS_TEMPLATE)
+ return template.render(
+ instance_profiles=account_details['instance_profiles'],
+ policies=account_details['managed_policies'],
+ users=account_details['users'],
+ groups=account_details['groups'],
+ roles=account_details['roles']
+ )
+
+
+ATTACH_ROLE_POLICY_TEMPLATE = """<AttachRolePolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachRolePolicyResponse>"""
+
+DETACH_ROLE_POLICY_TEMPLATE = """<DetachRolePolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachRolePolicyResponse>"""
+
+ATTACH_USER_POLICY_TEMPLATE = """<AttachUserPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachUserPolicyResponse>"""
+
+DETACH_USER_POLICY_TEMPLATE = """<DetachUserPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachUserPolicyResponse>"""
+
+ATTACH_GROUP_POLICY_TEMPLATE = """<AttachGroupPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachGroupPolicyResponse>"""
+
+DETACH_GROUP_POLICY_TEMPLATE = """<DetachGroupPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachGroupPolicyResponse>"""
+
+CREATE_POLICY_TEMPLATE = """<CreatePolicyResponse>
+ <CreatePolicyResult>
+ <Policy>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.create_datetime.isoformat() }}</CreateDate>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <UpdateDate>{{ policy.update_datetime.isoformat() }}</UpdateDate>
+ </Policy>
+ </CreatePolicyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreatePolicyResponse>"""
+
+GET_POLICY_TEMPLATE = """<GetPolicyResponse>
+ <GetPolicyResult>
+ <Policy>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <Description>{{ policy.description }}</Description>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <Path>{{ policy.path }}</Path>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.create_datetime.isoformat() }}</CreateDate>
+ <UpdateDate>{{ policy.update_datetime.isoformat() }}</UpdateDate>
+ </Policy>
+ </GetPolicyResult>
+ <ResponseMetadata>
+ <RequestId>684f0917-3d22-11e4-a4a0-cffb9EXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetPolicyResponse>"""
+
+LIST_ATTACHED_ROLE_POLICIES_TEMPLATE = """<ListAttachedRolePoliciesResponse>
+ <ListAttachedRolePoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedRolePoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedRolePoliciesResponse>"""
+
+LIST_ATTACHED_GROUP_POLICIES_TEMPLATE = """<ListAttachedGroupPoliciesResponse>
+ <ListAttachedGroupPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedGroupPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedGroupPoliciesResponse>"""
+
+LIST_ATTACHED_USER_POLICIES_TEMPLATE = """<ListAttachedUserPoliciesResponse>
+ <ListAttachedUserPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedUserPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedUserPoliciesResponse>"""
+
+LIST_POLICIES_TEMPLATE = """<ListPoliciesResponse>
+ <ListPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Policies>
+ {% for policy in policies %}
+ <member>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.create_datetime.isoformat() }}</CreateDate>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <UpdateDate>{{ policy.update_datetime.isoformat() }}</UpdateDate>
+ </member>
+ {% endfor %}
+ </Policies>
+ </ListPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListPoliciesResponse>"""
+
+GENERIC_EMPTY_TEMPLATE = """<{{ name }}Response>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ name }}Response>"""
+
+CREATE_INSTANCE_PROFILE_TEMPLATE = """<CreateInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateInstanceProfileResult>
+ <InstanceProfile>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles/>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>2012-05-09T16:11:10.222Z</CreateDate>
+ </InstanceProfile>
+ </CreateInstanceProfileResult>
+ <ResponseMetadata>
+ <RequestId>974142ee-99f1-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</CreateInstanceProfileResponse>"""
+
+GET_INSTANCE_PROFILE_TEMPLATE = """<GetInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetInstanceProfileResult>
+ <InstanceProfile>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>2012-05-09T16:11:10Z</CreateDate>
+ </InstanceProfile>
+ </GetInstanceProfileResult>
+ <ResponseMetadata>
+ <RequestId>37289fda-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</GetInstanceProfileResponse>"""
+
+CREATE_ROLE_TEMPLATE = """<CreateRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateRoleResult>
+ <Role>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-08T23:34:01.495Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </Role>
+ </CreateRoleResult>
+ <ResponseMetadata>
+ <RequestId>4a93ceee-9966-11e1-b624-b1aEXAMPLE7c</RequestId>
+ </ResponseMetadata>
+</CreateRoleResponse>"""
+
+GET_ROLE_POLICY_TEMPLATE = """<GetRolePolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<GetRolePolicyResult>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <RoleName>{{ role_name }}</RoleName>
+ <PolicyDocument>{{ policy_document }}</PolicyDocument>
+</GetRolePolicyResult>
+<ResponseMetadata>
+ <RequestId>7e7cd8bc-99ef-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</GetRolePolicyResponse>"""
+
+GET_ROLE_TEMPLATE = """<GetRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetRoleResult>
+ <Role>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-08T23:34:01Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </Role>
+ </GetRoleResult>
+ <ResponseMetadata>
+ <RequestId>df37e965-9967-11e1-a4c3-270EXAMPLE04</RequestId>
+ </ResponseMetadata>
+</GetRoleResponse>"""
+
+ADD_ROLE_TO_INSTANCE_PROFILE_TEMPLATE = """<AddRoleToInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>12657608-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</AddRoleToInstanceProfileResponse>"""
+
+REMOVE_ROLE_FROM_INSTANCE_PROFILE_TEMPLATE = """<RemoveRoleFromInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>12657608-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</RemoveRoleFromInstanceProfileResponse>"""
+
+LIST_ROLES_TEMPLATE = """<ListRolesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListRolesResult>
+ <IsTruncated>false</IsTruncated>
+ <Roles>
+ {% for role in roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ </ListRolesResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListRolesResponse>"""
+
+LIST_ROLE_POLICIES = """<ListRolePoliciesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListRolePoliciesResult>
+ <PolicyNames>
+ {% for policy_name in role_policies %}
+ <member>{{ policy_name }}</member>
+ {% endfor %}
+ </PolicyNames>
+ <IsTruncated>false</IsTruncated>
+</ListRolePoliciesResult>
+<ResponseMetadata>
+ <RequestId>8c7e1816-99f0-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</ListRolePoliciesResponse>"""
+
+CREATE_POLICY_VERSION_TEMPLATE = """<CreatePolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreatePolicyVersionResult>
+ <PolicyVersion>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default }}</IsDefaultVersion>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ </PolicyVersion>
+ </CreatePolicyVersionResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</CreatePolicyVersionResponse>"""
+
+GET_POLICY_VERSION_TEMPLATE = """<GetPolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetPolicyVersionResult>
+ <PolicyVersion>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default }}</IsDefaultVersion>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ </PolicyVersion>
+ </GetPolicyVersionResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</GetPolicyVersionResponse>"""
+
+LIST_POLICY_VERSIONS_TEMPLATE = """<ListPolicyVersionsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListPolicyVersionsResult>
+ <IsTruncated>false</IsTruncated>
+ <Versions>
+ {% for policy_version in policy_versions %}
+ <member>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default }}</IsDefaultVersion>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ </member>
+ {% endfor %}
+ </Versions>
+ </ListPolicyVersionsResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListPolicyVersionsResponse>"""
+
+LIST_INSTANCE_PROFILES_TEMPLATE = """<ListInstanceProfilesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListInstanceProfilesResult>
+ <IsTruncated>false</IsTruncated>
+ <InstanceProfiles>
+ {% for instance in instance_profiles %}
+ <member>
+ <Id>{{ instance.id }}</Id>
+ <Roles>
+ {% for role in instance.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ instance.name }}</InstanceProfileName>
+ <Path>{{ instance.path }}</Path>
+ <Arn>{{ instance.arn }}</Arn>
+ <CreateDate>2012-05-09T16:27:03Z</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfiles>
+ </ListInstanceProfilesResult>
+ <ResponseMetadata>
+ <RequestId>fd74fa8d-99f3-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListInstanceProfilesResponse>"""
+
+UPLOAD_CERT_TEMPLATE = """<UploadServerCertificateResponse>
+ <UploadServerCertificateResult>
+ <ServerCertificateMetadata>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </ServerCertificateMetadata>
+ </UploadServerCertificateResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UploadServerCertificateResponse>"""
+
+LIST_SERVER_CERTIFICATES_TEMPLATE = """<ListServerCertificatesResponse>
+ <ListServerCertificatesResult>
+ <IsTruncated>false</IsTruncated>
+ <ServerCertificateMetadataList>
+ {% for certificate in server_certificates %}
+ <member>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </member>
+ {% endfor %}
+ </ServerCertificateMetadataList>
+ </ListServerCertificatesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListServerCertificatesResponse>"""
+
+GET_SERVER_CERTIFICATE_TEMPLATE = """<GetServerCertificateResponse>
+ <GetServerCertificateResult>
+ <ServerCertificate>
+ <ServerCertificateMetadata>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </ServerCertificateMetadata>
+ <CertificateBody>{{ certificate.cert_body }}</CertificateBody>
+ </ServerCertificate>
+ </GetServerCertificateResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetServerCertificateResponse>"""
+
+CREATE_GROUP_TEMPLATE = """<CreateGroupResponse>
+ <CreateGroupResult>
+ <Group>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.create_date }}</CreateDate>
+ </Group>
+ </CreateGroupResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateGroupResponse>"""
+
+GET_GROUP_TEMPLATE = """<GetGroupResponse>
+ <GetGroupResult>
+ <Group>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.create_date }}</CreateDate>
+ </Group>
+ <Users>
+ {% for user in group.users %}
+ <member>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <UserId>{{ user.id }}</UserId>
+ <Arn>{{ user.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Users>
+ <IsTruncated>false</IsTruncated>
+ </GetGroupResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetGroupResponse>"""
+
+LIST_GROUPS_TEMPLATE = """<ListGroupsResponse>
+ <ListGroupsResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsResponse>"""
+
+LIST_GROUPS_FOR_USER_TEMPLATE = """<ListGroupsForUserResponse>
+ <ListGroupsForUserResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsForUserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsForUserResponse>"""
+
+LIST_GROUP_POLICIES_TEMPLATE = """<ListGroupPoliciesResponse>
+ <ListGroupPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <PolicyNames>
+ {% for policy in policies %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </PolicyNames>
+ </ListGroupPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupPoliciesResponse>"""
+
+GET_GROUP_POLICY_TEMPLATE = """<GetGroupPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<GetGroupPolicyResult>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <GroupName>{{ group_name }}</GroupName>
+ <PolicyDocument>{{ policy_document }}</PolicyDocument>
+</GetGroupPolicyResult>
+<ResponseMetadata>
+ <RequestId>7e7cd8bc-99ef-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</GetGroupPolicyResponse>"""
+
+USER_TEMPLATE = """<{{ action }}UserResponse>
+ <{{ action }}UserResult>
+ <User>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <UserId>{{ user.id }}</UserId>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ <Arn>{{ user.arn }}</Arn>
+ </User>
+ </{{ action }}UserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ action }}UserResponse>"""
+
+LIST_USERS_TEMPLATE = """<{{ action }}UsersResponse>
+ <{{ action }}UsersResult>
+ <Users>
+ {% for user in users %}
+ <member>
+ <UserId>{{ user.id }}</UserId>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ <Arn>{{ user.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Users>
+ </{{ action }}UsersResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ action }}UsersResponse>"""
+
+CREATE_LOGIN_PROFILE_TEMPLATE = """<CreateLoginProfileResponse>
+ <CreateLoginProfileResult>
+ <LoginProfile>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ </LoginProfile>
+ </CreateLoginProfileResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLoginProfileResponse>
+"""
+
+GET_LOGIN_PROFILE_TEMPLATE = """<GetLoginProfileResponse>
+ <GetLoginProfileResult>
+ <LoginProfile>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ {% if user.password_reset_required %}
+ <PasswordResetRequired>true</PasswordResetRequired>
+ {% endif %}
+ </LoginProfile>
+ </GetLoginProfileResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetLoginProfileResponse>
+"""
+
+UPDATE_LOGIN_PROFILE_TEMPLATE = """<UpdateLoginProfileResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateLoginProfileResponse>
+"""
+
+GET_USER_POLICY_TEMPLATE = """<GetUserPolicyResponse>
+ <GetUserPolicyResult>
+ <UserName>{{ user_name }}</UserName>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <PolicyDocument>
+ {{ policy_document }}
+ </PolicyDocument>
+ </GetUserPolicyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetUserPolicyResponse>"""
+
+LIST_USER_POLICIES_TEMPLATE = """<ListUserPoliciesResponse>
+ <ListUserPoliciesResult>
+ <PolicyNames>
+ {% for policy in policies %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </PolicyNames>
+ </ListUserPoliciesResult>
+ <IsTruncated>false</IsTruncated>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListUserPoliciesResponse>"""
+
+CREATE_ACCESS_KEY_TEMPLATE = """<CreateAccessKeyResponse>
+ <CreateAccessKeyResult>
+ <AccessKey>
+ <UserName>{{ key.user_name }}</UserName>
+ <AccessKeyId>{{ key.access_key_id }}</AccessKeyId>
+ <Status>{{ key.status }}</Status>
+ <SecretAccessKey>{{ key.secret_access_key }}</SecretAccessKey>
+ </AccessKey>
+ </CreateAccessKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateAccessKeyResponse>"""
+
+LIST_ACCESS_KEYS_TEMPLATE = """<ListAccessKeysResponse>
+ <ListAccessKeysResult>
+ <UserName>{{ user_name }}</UserName>
+ <AccessKeyMetadata>
+ {% for key in keys %}
+ <member>
+ <UserName>{{ user_name }}</UserName>
+ <AccessKeyId>{{ key.access_key_id }}</AccessKeyId>
+ <Status>{{ key.status }}</Status>
+ <CreateDate>{{ key.create_date }}</CreateDate>
+ </member>
+ {% endfor %}
+ </AccessKeyMetadata>
+ <IsTruncated>false</IsTruncated>
+ </ListAccessKeysResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAccessKeysResponse>"""
+
+CREDENTIAL_REPORT_GENERATING = """
+<GenerateCredentialReportResponse>
+ <GenerateCredentialReportResult>
+ <state>STARTED</state>
+ <description>No report exists. Starting a new report generation task</description>
+ </GenerateCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GenerateCredentialReportResponse>"""
+
+CREDENTIAL_REPORT_GENERATED = """<GenerateCredentialReportResponse>
+ <GenerateCredentialReportResult>
+ <state>COMPLETE</state>
+ </GenerateCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GenerateCredentialReportResponse>"""
+
+CREDENTIAL_REPORT = """<GetCredentialReportResponse>
+ <GetCredentialReportResult>
+ <content>{{ report }}</content>
+ <GeneratedTime>2015-02-02T20:02:02Z</GeneratedTime>
+ <ReportFormat>text/csv</ReportFormat>
+ </GetCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GetCredentialReportResponse>"""
+
+LIST_INSTANCE_PROFILES_FOR_ROLE_TEMPLATE = """<ListInstanceProfilesForRoleResponse>
+<ListInstanceProfilesForRoleResult>
+ <IsTruncated>false</IsTruncated>
+ <InstanceProfiles>
+ {% for profile in instance_profiles %}
+ <member>
+ <Id>{{ profile.id }}</Id>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfiles>
+</ListInstanceProfilesForRoleResult>
+<ResponseMetadata>
+ <RequestId>6a8c3992-99f4-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</ListInstanceProfilesForRoleResponse>"""
+
+LIST_MFA_DEVICES_TEMPLATE = """<ListMFADevicesResponse>
+ <ListMFADevicesResult>
+ <MFADevices>
+ {% for device in devices %}
+ <member>
+ <UserName>{{ user_name }}</UserName>
+ <SerialNumber>{{ device.serial_number }}</SerialNumber>
+ </member>
+ {% endfor %}
+ </MFADevices>
+ <IsTruncated>false</IsTruncated>
+ </ListMFADevicesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListMFADevicesResponse>"""
+
+
+LIST_ACCOUNT_ALIASES_TEMPLATE = """<ListAccountAliasesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListAccountAliasesResult>
+ <IsTruncated>false</IsTruncated>
+ <AccountAliases>
+ {% for alias in aliases %}
+ <member>{{ alias }}</member>
+ {% endfor %}
+ </AccountAliases>
+</ListAccountAliasesResult>
+<ResponseMetadata>
+ <RequestId>c5a076e9-f1b0-11df-8fbe-45274EXAMPLE</RequestId>
+</ResponseMetadata>
+</ListAccountAliasesResponse>"""
+
+
+CREATE_ACCOUNT_ALIAS_TEMPLATE = """<CreateAccountAliasResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>36b5db08-f1b0-11df-8fbe-45274EXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateAccountAliasResponse>"""
+
+
+DELETE_ACCOUNT_ALIAS_TEMPLATE = """<DeleteAccountAliasResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteAccountAliasResponse>"""
+
+
+LIST_GROUPS_FOR_USER_TEMPLATE = """<ListGroupsForUserResponse>
+ <ListGroupsForUserResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsForUserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsForUserResponse>"""
+
+
+GET_ACCOUNT_AUTHORIZATION_DETAILS_TEMPLATE = """<GetAccountAuthorizationDetailsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetAccountAuthorizationDetailsResult>
+ <IsTruncated>false</IsTruncated>
+ <UserDetailList>
+ {% for user in users %}
+ <member>
+ <GroupList />
+ <AttachedManagedPolicies/>
+ <UserId>{{ user.id }}</UserId>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <Arn>{{ user.arn }}</Arn>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ </member>
+ {% endfor %}
+ </UserDetailList>
+ <GroupDetailList>
+ {% for group in groups %}
+ <member>
+ <GroupId>{{ group.id }}</GroupId>
+ <AttachedManagedPolicies>
+ {% for policy in group.managed_policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedManagedPolicies>
+ <GroupName>{{ group.name }}</GroupName>
+ <Path>{{ group.path }}</Path>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ <GroupPolicyList/>
+ </member>
+ {% endfor %}
+ </GroupDetailList>
+ <RoleDetailList>
+ {% for role in roles %}
+ <member>
+ <RolePolicyList/>
+ <AttachedManagedPolicies>
+ {% for policy in role.managed_policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedManagedPolicies>
+ <InstanceProfileList>
+ {% for profile in instance_profiles %}
+ <member>
+ <Id>{{ profile.id }}</Id>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2012-05-09T15:45:35Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfileList>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>2014-07-30T17:09:20Z</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </RoleDetailList>
+ <Policies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyVersionList>
+ <member>
+ <Document>
+ {"Version":"2012-10-17","Statement":{"Effect":"Allow",
+ "Action":["iam:CreatePolicy","iam:CreatePolicyVersion",
+ "iam:DeletePolicy","iam:DeletePolicyVersion","iam:GetPolicy",
+ "iam:GetPolicyVersion","iam:ListPolicies",
+ "iam:ListPolicyVersions","iam:SetDefaultPolicyVersion"],
+ "Resource":"*"}}
+ </Document>
+ <IsDefaultVersion>true</IsDefaultVersion>
+ <VersionId>v1</VersionId>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ </member>
+ </PolicyVersionList>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>1</AttachmentCount>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ <IsAttachable>true</IsAttachable>
+ <UpdateDate>2012-05-09T16:27:11Z</UpdateDate>
+ </member>
+ {% endfor %}
+ </Policies>
+ </GetAccountAuthorizationDetailsResult>
+ <ResponseMetadata>
+ <RequestId>92e79ae7-7399-11e4-8c85-4b53eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetAccountAuthorizationDetailsResponse>"""
diff --git a/contrib/python/moto/py2/moto/iam/urls.py b/contrib/python/moto/py2/moto/iam/urls.py
new file mode 100644
index 0000000000..46db41e46c
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/urls.py
@@ -0,0 +1,10 @@
+from __future__ import unicode_literals
+from .responses import IamResponse
+
+url_bases = [
+ "https?://iam(.*).amazonaws.com",
+]
+
+url_paths = {
+ '{0}/$': IamResponse.dispatch,
+}
diff --git a/contrib/python/moto/py2/moto/iam/utils.py b/contrib/python/moto/py2/moto/iam/utils.py
new file mode 100644
index 0000000000..1fae85a6c9
--- /dev/null
+++ b/contrib/python/moto/py2/moto/iam/utils.py
@@ -0,0 +1,34 @@
+from __future__ import unicode_literals
+import random
+import string
+import six
+
+
+def random_alphanumeric(length):
+ return ''.join(six.text_type(
+ random.choice(
+ string.ascii_letters + string.digits
+ )) for _ in range(length)
+ )
+
+
+def random_resource_id():
+ size = 20
+ chars = list(range(10)) + list(string.ascii_lowercase)
+
+ return ''.join(six.text_type(random.choice(chars)) for x in range(size))
+
+
+def random_access_key():
+ return ''.join(six.text_type(
+ random.choice(
+ string.ascii_uppercase + string.digits
+ )) for _ in range(16)
+ )
+
+
+def random_policy_id():
+ return 'A' + ''.join(
+ random.choice(string.ascii_uppercase + string.digits)
+ for _ in range(20)
+ )
diff --git a/contrib/python/moto/py2/moto/instance_metadata/__init__.py b/contrib/python/moto/py2/moto/instance_metadata/__init__.py
new file mode 100644
index 0000000000..d1a674982c
--- /dev/null
+++ b/contrib/python/moto/py2/moto/instance_metadata/__init__.py
@@ -0,0 +1,4 @@
+from __future__ import unicode_literals
+from .models import instance_metadata_backend
+
+instance_metadata_backends = {"global": instance_metadata_backend}
diff --git a/contrib/python/moto/py2/moto/instance_metadata/models.py b/contrib/python/moto/py2/moto/instance_metadata/models.py
new file mode 100644
index 0000000000..8f8d84154a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/instance_metadata/models.py
@@ -0,0 +1,8 @@
+from moto.core.models import BaseBackend
+
+
+class InstanceMetadataBackend(BaseBackend):
+ pass
+
+
+instance_metadata_backend = InstanceMetadataBackend()
diff --git a/contrib/python/moto/py2/moto/instance_metadata/responses.py b/contrib/python/moto/py2/moto/instance_metadata/responses.py
new file mode 100644
index 0000000000..460e65aca0
--- /dev/null
+++ b/contrib/python/moto/py2/moto/instance_metadata/responses.py
@@ -0,0 +1,49 @@
+from __future__ import unicode_literals
+import datetime
+import json
+from six.moves.urllib.parse import urlparse
+
+from moto.core.responses import BaseResponse
+
+
+class InstanceMetadataResponse(BaseResponse):
+
+ def metadata_response(self, request, full_url, headers):
+ """
+ Mock response for localhost metadata
+
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
+ """
+
+ parsed_url = urlparse(full_url)
+ tomorrow = datetime.datetime.utcnow() + datetime.timedelta(days=1)
+ credentials = dict(
+ AccessKeyId="test-key",
+ SecretAccessKey="test-secret-key",
+ Token="test-session-token",
+ Expiration=tomorrow.strftime("%Y-%m-%dT%H:%M:%SZ")
+ )
+
+ path = parsed_url.path
+
+ meta_data_prefix = "/latest/meta-data/"
+ # Strip prefix if it is there
+ if path.startswith(meta_data_prefix):
+ path = path[len(meta_data_prefix):]
+
+ if path == '':
+ result = 'iam'
+ elif path == 'iam':
+ result = json.dumps({
+ 'security-credentials': {
+ 'default-role': credentials
+ }
+ })
+ elif path == 'iam/security-credentials/':
+ result = 'default-role'
+ elif path == 'iam/security-credentials/default-role':
+ result = json.dumps(credentials)
+ else:
+ raise NotImplementedError(
+ "The {0} metadata path has not been implemented".format(path))
+ return 200, headers, result
diff --git a/contrib/python/moto/py2/moto/instance_metadata/urls.py b/contrib/python/moto/py2/moto/instance_metadata/urls.py
new file mode 100644
index 0000000000..7776b364a5
--- /dev/null
+++ b/contrib/python/moto/py2/moto/instance_metadata/urls.py
@@ -0,0 +1,12 @@
+from __future__ import unicode_literals
+from .responses import InstanceMetadataResponse
+
+url_bases = [
+ "http://169.254.169.254"
+]
+
+instance_metadata = InstanceMetadataResponse()
+
+url_paths = {
+ '{0}/(?P<path>.+)': instance_metadata.metadata_response,
+}
diff --git a/contrib/python/moto/py2/moto/kms/__init__.py b/contrib/python/moto/py2/moto/kms/__init__.py
new file mode 100644
index 0000000000..b4bb0b639a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/kms/__init__.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+from .models import kms_backends
+from ..core.models import base_decorator, deprecated_base_decorator
+
+kms_backend = kms_backends['us-east-1']
+mock_kms = base_decorator(kms_backends)
+mock_kms_deprecated = deprecated_base_decorator(kms_backends)
diff --git a/contrib/python/moto/py2/moto/kms/models.py b/contrib/python/moto/py2/moto/kms/models.py
new file mode 100644
index 0000000000..bb39d1b241
--- /dev/null
+++ b/contrib/python/moto/py2/moto/kms/models.py
@@ -0,0 +1,175 @@
+from __future__ import unicode_literals
+
+import boto.kms
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_without_milliseconds
+from .utils import generate_key_id
+from collections import defaultdict
+from datetime import datetime, timedelta
+
+
+class Key(BaseModel):
+
+ def __init__(self, policy, key_usage, description, region):
+ self.id = generate_key_id()
+ self.policy = policy
+ self.key_usage = key_usage
+ self.key_state = "Enabled"
+ self.description = description
+ self.enabled = True
+ self.region = region
+ self.account_id = "0123456789012"
+ self.key_rotation_status = False
+ self.deletion_date = None
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def arn(self):
+ return "arn:aws:kms:{0}:{1}:key/{2}".format(self.region, self.account_id, self.id)
+
+ def to_dict(self):
+ key_dict = {
+ "KeyMetadata": {
+ "AWSAccountId": self.account_id,
+ "Arn": self.arn,
+ "CreationDate": "2015-01-01 00:00:00",
+ "Description": self.description,
+ "Enabled": self.enabled,
+ "KeyId": self.id,
+ "KeyUsage": self.key_usage,
+ "KeyState": self.key_state,
+ }
+ }
+ if self.key_state == 'PendingDeletion':
+ key_dict['KeyMetadata']['DeletionDate'] = iso_8601_datetime_without_milliseconds(self.deletion_date)
+ return key_dict
+
+ def delete(self, region_name):
+ kms_backends[region_name].delete_key(self.id)
+
+ @classmethod
+ def create_from_cloudformation_json(self, resource_name, cloudformation_json, region_name):
+ kms_backend = kms_backends[region_name]
+ properties = cloudformation_json['Properties']
+
+ key = kms_backend.create_key(
+ policy=properties['KeyPolicy'],
+ key_usage='ENCRYPT_DECRYPT',
+ description=properties['Description'],
+ region=region_name,
+ )
+ key.key_rotation_status = properties['EnableKeyRotation']
+ key.enabled = properties['Enabled']
+
+ return key
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'Arn':
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+
+class KmsBackend(BaseBackend):
+
+ def __init__(self):
+ self.keys = {}
+ self.key_to_aliases = defaultdict(set)
+
+ def create_key(self, policy, key_usage, description, region):
+ key = Key(policy, key_usage, description, region)
+ self.keys[key.id] = key
+ return key
+
+ def delete_key(self, key_id):
+ if key_id in self.keys:
+ if key_id in self.key_to_aliases:
+ self.key_to_aliases.pop(key_id)
+
+ return self.keys.pop(key_id)
+
+ def describe_key(self, key_id):
+ # allow the different methods (alias, ARN :key/, keyId, ARN alias) to
+ # describe key not just KeyId
+ key_id = self.get_key_id(key_id)
+ if r'alias/' in str(key_id).lower():
+ key_id = self.get_key_id_from_alias(key_id.split('alias/')[1])
+ return self.keys[self.get_key_id(key_id)]
+
+ def list_keys(self):
+ return self.keys.values()
+
+ def get_key_id(self, key_id):
+ # Allow use of ARN as well as pure KeyId
+ return str(key_id).split(r':key/')[1] if r':key/' in str(key_id).lower() else key_id
+
+ def alias_exists(self, alias_name):
+ for aliases in self.key_to_aliases.values():
+ if alias_name in aliases:
+ return True
+
+ return False
+
+ def add_alias(self, target_key_id, alias_name):
+ self.key_to_aliases[target_key_id].add(alias_name)
+
+ def delete_alias(self, alias_name):
+ """Delete the alias."""
+ for aliases in self.key_to_aliases.values():
+ if alias_name in aliases:
+ aliases.remove(alias_name)
+
+ def get_all_aliases(self):
+ return self.key_to_aliases
+
+ def get_key_id_from_alias(self, alias_name):
+ for key_id, aliases in dict(self.key_to_aliases).items():
+ if alias_name in ",".join(aliases):
+ return key_id
+ return None
+
+ def enable_key_rotation(self, key_id):
+ self.keys[self.get_key_id(key_id)].key_rotation_status = True
+
+ def disable_key_rotation(self, key_id):
+ self.keys[self.get_key_id(key_id)].key_rotation_status = False
+
+ def get_key_rotation_status(self, key_id):
+ return self.keys[self.get_key_id(key_id)].key_rotation_status
+
+ def put_key_policy(self, key_id, policy):
+ self.keys[self.get_key_id(key_id)].policy = policy
+
+ def get_key_policy(self, key_id):
+ return self.keys[self.get_key_id(key_id)].policy
+
+ def disable_key(self, key_id):
+ if key_id in self.keys:
+ self.keys[key_id].enabled = False
+ self.keys[key_id].key_state = 'Disabled'
+
+ def enable_key(self, key_id):
+ if key_id in self.keys:
+ self.keys[key_id].enabled = True
+ self.keys[key_id].key_state = 'Enabled'
+
+ def cancel_key_deletion(self, key_id):
+ if key_id in self.keys:
+ self.keys[key_id].key_state = 'Disabled'
+ self.keys[key_id].deletion_date = None
+
+ def schedule_key_deletion(self, key_id, pending_window_in_days):
+ if key_id in self.keys:
+ if 7 <= pending_window_in_days <= 30:
+ self.keys[key_id].enabled = False
+ self.keys[key_id].key_state = 'PendingDeletion'
+ self.keys[key_id].deletion_date = datetime.now() + timedelta(days=pending_window_in_days)
+ return iso_8601_datetime_without_milliseconds(self.keys[key_id].deletion_date)
+
+
+kms_backends = {}
+for region in boto.kms.regions():
+ kms_backends[region.name] = KmsBackend()
diff --git a/contrib/python/moto/py2/moto/kms/responses.py b/contrib/python/moto/py2/moto/kms/responses.py
new file mode 100644
index 0000000000..5883f51eca
--- /dev/null
+++ b/contrib/python/moto/py2/moto/kms/responses.py
@@ -0,0 +1,297 @@
+from __future__ import unicode_literals
+
+import base64
+import json
+import re
+import six
+
+from boto.exception import JSONResponseError
+from boto.kms.exceptions import AlreadyExistsException, NotFoundException
+
+from moto.core.responses import BaseResponse
+from .models import kms_backends
+
+reserved_aliases = [
+ 'alias/aws/ebs',
+ 'alias/aws/s3',
+ 'alias/aws/redshift',
+ 'alias/aws/rds',
+]
+
+
+class KmsResponse(BaseResponse):
+
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ @property
+ def kms_backend(self):
+ return kms_backends[self.region]
+
+ def create_key(self):
+ policy = self.parameters.get('Policy')
+ key_usage = self.parameters.get('KeyUsage')
+ description = self.parameters.get('Description')
+
+ key = self.kms_backend.create_key(
+ policy, key_usage, description, self.region)
+ return json.dumps(key.to_dict())
+
+ def describe_key(self):
+ key_id = self.parameters.get('KeyId')
+ try:
+ key = self.kms_backend.describe_key(
+ self.kms_backend.get_key_id(key_id))
+ except KeyError:
+ headers = dict(self.headers)
+ headers['status'] = 404
+ return "{}", headers
+ return json.dumps(key.to_dict())
+
+ def list_keys(self):
+ keys = self.kms_backend.list_keys()
+
+ return json.dumps({
+ "Keys": [
+ {
+ "KeyArn": key.arn,
+ "KeyId": key.id,
+ } for key in keys
+ ],
+ "NextMarker": None,
+ "Truncated": False,
+ })
+
+ def create_alias(self):
+ alias_name = self.parameters['AliasName']
+ target_key_id = self.parameters['TargetKeyId']
+ region = self.region
+
+ if not alias_name.startswith('alias/'):
+ raise JSONResponseError(400, 'Bad Request',
+ body={'message': 'Invalid identifier', '__type': 'ValidationException'})
+
+ if alias_name in reserved_aliases:
+ raise JSONResponseError(400, 'Bad Request', body={
+ '__type': 'NotAuthorizedException'})
+
+ if ':' in alias_name:
+ raise JSONResponseError(400, 'Bad Request', body={
+ 'message': '{alias_name} contains invalid characters for an alias'.format(**locals()),
+ '__type': 'ValidationException'})
+
+ if not re.match(r'^[a-zA-Z0-9:/_-]+$', alias_name):
+ raise JSONResponseError(400, 'Bad Request', body={
+ 'message': "1 validation error detected: Value '{alias_name}' at 'aliasName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$"
+ .format(**locals()),
+ '__type': 'ValidationException'})
+
+ if self.kms_backend.alias_exists(target_key_id):
+ raise JSONResponseError(400, 'Bad Request', body={
+ 'message': 'Aliases must refer to keys. Not aliases',
+ '__type': 'ValidationException'})
+
+ if self.kms_backend.alias_exists(alias_name):
+ raise AlreadyExistsException(400, 'Bad Request', body={
+ 'message': 'An alias with the name arn:aws:kms:{region}:012345678912:{alias_name} already exists'
+ .format(**locals()), '__type': 'AlreadyExistsException'})
+
+ self.kms_backend.add_alias(target_key_id, alias_name)
+
+ return json.dumps(None)
+
+ def delete_alias(self):
+ alias_name = self.parameters['AliasName']
+ region = self.region
+
+ if not alias_name.startswith('alias/'):
+ raise JSONResponseError(400, 'Bad Request',
+ body={'message': 'Invalid identifier', '__type': 'ValidationException'})
+
+ if not self.kms_backend.alias_exists(alias_name):
+ raise NotFoundException(400, 'Bad Request', body={
+ 'message': 'Alias arn:aws:kms:{region}:012345678912:{alias_name} is not found.'.format(**locals()),
+ '__type': 'NotFoundException'})
+
+ self.kms_backend.delete_alias(alias_name)
+
+ return json.dumps(None)
+
+ def list_aliases(self):
+ region = self.region
+
+ response_aliases = [
+ {
+ 'AliasArn': u'arn:aws:kms:{region}:012345678912:{reserved_alias}'.format(region=region,
+ reserved_alias=reserved_alias),
+ 'AliasName': reserved_alias
+ } for reserved_alias in reserved_aliases
+ ]
+
+ backend_aliases = self.kms_backend.get_all_aliases()
+ for target_key_id, aliases in backend_aliases.items():
+ for alias_name in aliases:
+ response_aliases.append({
+ 'AliasArn': u'arn:aws:kms:{region}:012345678912:{alias_name}'.format(region=region,
+ alias_name=alias_name),
+ 'AliasName': alias_name,
+ 'TargetKeyId': target_key_id,
+ })
+
+ return json.dumps({
+ 'Truncated': False,
+ 'Aliases': response_aliases,
+ })
+
+ def enable_key_rotation(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.enable_key_rotation(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+
+ return json.dumps(None)
+
+ def disable_key_rotation(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.disable_key_rotation(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+ return json.dumps(None)
+
+ def get_key_rotation_status(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ rotation_enabled = self.kms_backend.get_key_rotation_status(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+ return json.dumps({'KeyRotationEnabled': rotation_enabled})
+
+ def put_key_policy(self):
+ key_id = self.parameters.get('KeyId')
+ policy_name = self.parameters.get('PolicyName')
+ policy = self.parameters.get('Policy')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ _assert_default_policy(policy_name)
+
+ try:
+ self.kms_backend.put_key_policy(key_id, policy)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+
+ return json.dumps(None)
+
+ def get_key_policy(self):
+ key_id = self.parameters.get('KeyId')
+ policy_name = self.parameters.get('PolicyName')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ _assert_default_policy(policy_name)
+
+ try:
+ return json.dumps({'Policy': self.kms_backend.get_key_policy(key_id)})
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+
+ def list_key_policies(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.describe_key(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+
+ return json.dumps({'Truncated': False, 'PolicyNames': ['default']})
+
+ def encrypt(self):
+ """
+ We perform no encryption, we just encode the value as base64 and then
+ decode it in decrypt().
+ """
+ value = self.parameters.get("Plaintext")
+ if isinstance(value, six.text_type):
+ value = value.encode('utf-8')
+ return json.dumps({"CiphertextBlob": base64.b64encode(value).decode("utf-8")})
+
+ def decrypt(self):
+ value = self.parameters.get("CiphertextBlob")
+ return json.dumps({"Plaintext": base64.b64decode(value).decode("utf-8")})
+
+ def disable_key(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.disable_key(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+ return json.dumps(None)
+
+ def enable_key(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.enable_key(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+ return json.dumps(None)
+
+ def cancel_key_deletion(self):
+ key_id = self.parameters.get('KeyId')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ self.kms_backend.cancel_key_deletion(key_id)
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+ return json.dumps({'KeyId': key_id})
+
+ def schedule_key_deletion(self):
+ key_id = self.parameters.get('KeyId')
+ if self.parameters.get('PendingWindowInDays') is None:
+ pending_window_in_days = 30
+ else:
+ pending_window_in_days = self.parameters.get('PendingWindowInDays')
+ _assert_valid_key_id(self.kms_backend.get_key_id(key_id))
+ try:
+ return json.dumps({
+ 'KeyId': key_id,
+ 'DeletionDate': self.kms_backend.schedule_key_deletion(key_id, pending_window_in_days)
+ })
+ except KeyError:
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "Key 'arn:aws:kms:{region}:012345678912:key/{key_id}' does not exist".format(region=self.region, key_id=key_id),
+ '__type': 'NotFoundException'})
+
+
+def _assert_valid_key_id(key_id):
+ if not re.match(r'^[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}$', key_id, re.IGNORECASE):
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': ' Invalid keyId', '__type': 'NotFoundException'})
+
+
+def _assert_default_policy(policy_name):
+ if policy_name != 'default':
+ raise JSONResponseError(404, 'Not Found', body={
+ 'message': "No such policy exists",
+ '__type': 'NotFoundException'})
diff --git a/contrib/python/moto/py2/moto/kms/urls.py b/contrib/python/moto/py2/moto/kms/urls.py
new file mode 100644
index 0000000000..5b0b48969f
--- /dev/null
+++ b/contrib/python/moto/py2/moto/kms/urls.py
@@ -0,0 +1,10 @@
+from __future__ import unicode_literals
+from .responses import KmsResponse
+
+url_bases = [
+ "https?://kms.(.+).amazonaws.com",
+]
+
+url_paths = {
+ '{0}/$': KmsResponse.dispatch,
+}
diff --git a/contrib/python/moto/py2/moto/kms/utils.py b/contrib/python/moto/py2/moto/kms/utils.py
new file mode 100644
index 0000000000..fad38150fb
--- /dev/null
+++ b/contrib/python/moto/py2/moto/kms/utils.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+
+import uuid
+
+
+def generate_key_id():
+ return str(uuid.uuid4())
diff --git a/contrib/python/moto/py2/moto/packages/__init__.py b/contrib/python/moto/py2/moto/packages/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/__init__.py
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/__init__.py b/contrib/python/moto/py2/moto/packages/httpretty/__init__.py
new file mode 100644
index 0000000000..679294a4bf
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/__init__.py
@@ -0,0 +1,61 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+__version__ = version = '0.8.10'
+
+from .core import httpretty, httprettified, EmptyRequestHeaders
+from .errors import HTTPrettyError, UnmockedError
+from .core import URIInfo
+
+HTTPretty = httpretty
+activate = httprettified
+
+enable = httpretty.enable
+register_uri = httpretty.register_uri
+disable = httpretty.disable
+is_enabled = httpretty.is_enabled
+reset = httpretty.reset
+Response = httpretty.Response
+
+GET = httpretty.GET
+PUT = httpretty.PUT
+POST = httpretty.POST
+DELETE = httpretty.DELETE
+HEAD = httpretty.HEAD
+PATCH = httpretty.PATCH
+OPTIONS = httpretty.OPTIONS
+CONNECT = httpretty.CONNECT
+
+
+def last_request():
+ """returns the last request"""
+ return httpretty.last_request
+
+
+def has_request():
+ """returns a boolean indicating whether any request has been made"""
+ return not isinstance(httpretty.last_request.headers, EmptyRequestHeaders)
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/compat.py b/contrib/python/moto/py2/moto/packages/httpretty/compat.py
new file mode 100644
index 0000000000..b9e215b132
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/compat.py
@@ -0,0 +1,103 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+import sys
+import types
+
+PY3 = sys.version_info[0] == 3
+if PY3: # pragma: no cover
+ text_type = str
+ byte_type = bytes
+ import io
+ StringIO = io.BytesIO
+ basestring = (str, bytes)
+
+ class BaseClass(object):
+
+ def __repr__(self):
+ return self.__str__()
+else: # pragma: no cover
+ text_type = unicode
+ byte_type = str
+ import StringIO
+ StringIO = StringIO.StringIO
+ basestring = basestring
+
+
+class BaseClass(object):
+
+ def __repr__(self):
+ ret = self.__str__()
+ if PY3: # pragma: no cover
+ return ret
+ else:
+ return ret.encode('utf-8')
+
+
+try: # pragma: no cover
+ from urllib.parse import urlsplit, urlunsplit, parse_qs, quote, quote_plus, unquote
+ unquote_utf8 = unquote
+except ImportError: # pragma: no cover
+ from urlparse import urlsplit, urlunsplit, parse_qs, unquote
+ from urllib import quote, quote_plus
+
+ def unquote_utf8(qs):
+ if isinstance(qs, text_type):
+ qs = qs.encode('utf-8')
+ s = unquote(qs)
+ if isinstance(s, byte_type):
+ return s.decode("utf-8")
+ else:
+ return s
+
+
+try: # pragma: no cover
+ from http.server import BaseHTTPRequestHandler
+except ImportError: # pragma: no cover
+ from BaseHTTPServer import BaseHTTPRequestHandler
+
+
+ClassTypes = (type,)
+if not PY3: # pragma: no cover
+ ClassTypes = (type, types.ClassType)
+
+
+__all__ = [
+ 'PY3',
+ 'StringIO',
+ 'text_type',
+ 'byte_type',
+ 'BaseClass',
+ 'BaseHTTPRequestHandler',
+ 'quote',
+ 'quote_plus',
+ 'urlunsplit',
+ 'urlsplit',
+ 'parse_qs',
+ 'ClassTypes',
+]
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/core.py b/contrib/python/moto/py2/moto/packages/httpretty/core.py
new file mode 100644
index 0000000000..8ad9168a5a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/core.py
@@ -0,0 +1,1116 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+import re
+import codecs
+import inspect
+import socket
+import functools
+import itertools
+import warnings
+import logging
+import traceback
+import json
+import contextlib
+
+
+from .compat import (
+ PY3,
+ StringIO,
+ text_type,
+ BaseClass,
+ BaseHTTPRequestHandler,
+ quote,
+ quote_plus,
+ urlunsplit,
+ urlsplit,
+ parse_qs,
+ unquote,
+ unquote_utf8,
+ ClassTypes,
+ basestring
+)
+from .http import (
+ STATUSES,
+ HttpBaseClass,
+ parse_requestline,
+ last_requestline,
+)
+
+from .utils import (
+ utf8,
+ decode_utf8,
+)
+
+from .errors import HTTPrettyError, UnmockedError
+
+from datetime import datetime
+from datetime import timedelta
+from errno import EAGAIN
+
+# Some versions of python internally shadowed the
+# SocketType variable incorrectly https://bugs.python.org/issue20386
+BAD_SOCKET_SHADOW = socket.socket != socket.SocketType
+
+old_socket = socket.socket
+old_create_connection = socket.create_connection
+old_gethostbyname = socket.gethostbyname
+old_gethostname = socket.gethostname
+old_getaddrinfo = socket.getaddrinfo
+old_socksocket = None
+old_ssl_wrap_socket = None
+old_sslwrap_simple = None
+old_sslsocket = None
+old_sslcontext_wrap_socket = None
+
+if PY3: # pragma: no cover
+ basestring = (bytes, str)
+try: # pragma: no cover
+ import socks
+ old_socksocket = socks.socksocket
+except ImportError:
+ socks = None
+
+try: # pragma: no cover
+ import ssl
+ old_ssl_wrap_socket = ssl.wrap_socket
+ if not PY3:
+ old_sslwrap_simple = ssl.sslwrap_simple
+ old_sslsocket = ssl.SSLSocket
+ try:
+ old_sslcontext_wrap_socket = ssl.SSLContext.wrap_socket
+ except AttributeError:
+ pass
+except ImportError: # pragma: no cover
+ ssl = None
+
+try: # pragma: no cover
+ from requests.packages.urllib3.contrib.pyopenssl import inject_into_urllib3, extract_from_urllib3
+ pyopenssl_override = True
+except:
+ pyopenssl_override = False
+
+
+DEFAULT_HTTP_PORTS = frozenset([80])
+POTENTIAL_HTTP_PORTS = set(DEFAULT_HTTP_PORTS)
+DEFAULT_HTTPS_PORTS = frozenset([443])
+POTENTIAL_HTTPS_PORTS = set(DEFAULT_HTTPS_PORTS)
+
+
+class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
+ """Represents a HTTP request. It takes a valid multi-line, `\r\n`
+ separated string with HTTP headers and parse them out using the
+ internal `parse_request` method.
+
+ It also replaces the `rfile` and `wfile` attributes with StringIO
+ instances so that we garantee that it won't make any I/O, neighter
+ for writing nor reading.
+
+ It has some convenience attributes:
+
+ `headers` -> a mimetype object that can be cast into a dictionary,
+ contains all the request headers
+
+ `method` -> the HTTP method used in this request
+
+ `querystring` -> a dictionary containing lists with the
+ attributes. Please notice that if you need a single value from a
+ query string you will need to get it manually like:
+
+ ```python
+ >>> request.querystring
+ {'name': ['Gabriel Falcao']}
+ >>> print request.querystring['name'][0]
+ ```
+
+ `parsed_body` -> a dictionary containing parsed request body or
+ None if HTTPrettyRequest doesn't know how to parse it. It
+ currently supports parsing body data that was sent under the
+ `content-type` headers values: 'application/json' or
+ 'application/x-www-form-urlencoded'
+ """
+
+ def __init__(self, headers, body=''):
+ # first of all, lets make sure that if headers or body are
+ # unicode strings, it must be converted into a utf-8 encoded
+ # byte string
+ self.raw_headers = utf8(headers.strip())
+ self.body = utf8(body)
+
+ # Now let's concatenate the headers with the body, and create
+ # `rfile` based on it
+ self.rfile = StringIO(b'\r\n\r\n'.join([self.raw_headers, self.body]))
+ self.wfile = StringIO() # Creating `wfile` as an empty
+ # StringIO, just to avoid any real
+ # I/O calls
+
+ # parsing the request line preemptively
+ self.raw_requestline = self.rfile.readline()
+
+ # initiating the error attributes with None
+ self.error_code = None
+ self.error_message = None
+
+ # Parse the request based on the attributes above
+ if not self.parse_request():
+ return
+
+ # making the HTTP method string available as the command
+ self.method = self.command
+
+ # Now 2 convenient attributes for the HTTPretty API:
+
+ # `querystring` holds a dictionary with the parsed query string
+ try:
+ self.path = self.path.encode('iso-8859-1')
+ except UnicodeDecodeError:
+ pass
+
+ self.path = decode_utf8(self.path)
+
+ qstring = self.path.split("?", 1)[-1]
+ self.querystring = self.parse_querystring(qstring)
+
+ # And the body will be attempted to be parsed as
+ # `application/json` or `application/x-www-form-urlencoded`
+ self.parsed_body = self.parse_request_body(self.body)
+
+ def __str__(self):
+ return '<HTTPrettyRequest("{0}", total_headers={1}, body_length={2})>'.format(
+ self.headers.get('content-type', ''),
+ len(self.headers),
+ len(self.body),
+ )
+
+ def parse_querystring(self, qs):
+ expanded = unquote_utf8(qs)
+ parsed = parse_qs(expanded)
+ result = {}
+ for k in parsed:
+ result[k] = list(map(decode_utf8, parsed[k]))
+
+ return result
+
+ def parse_request_body(self, body):
+ """ Attempt to parse the post based on the content-type passed. Return the regular body if not """
+
+ PARSING_FUNCTIONS = {
+ 'application/json': json.loads,
+ 'text/json': json.loads,
+ 'application/x-www-form-urlencoded': self.parse_querystring,
+ }
+ FALLBACK_FUNCTION = lambda x: x
+
+ content_type = self.headers.get('content-type', '')
+
+ do_parse = PARSING_FUNCTIONS.get(content_type, FALLBACK_FUNCTION)
+ try:
+ body = decode_utf8(body)
+ return do_parse(body)
+ except:
+ return body
+
+
+class EmptyRequestHeaders(dict):
+ pass
+
+
+class HTTPrettyRequestEmpty(object):
+ body = ''
+ headers = EmptyRequestHeaders()
+
+
+class FakeSockFile(StringIO):
+
+ def close(self):
+ self.socket.close()
+ StringIO.close(self)
+
+
+class FakeSSLSocket(object):
+
+ def __init__(self, sock, *args, **kw):
+ self._httpretty_sock = sock
+
+ def __getattr__(self, attr):
+ return getattr(self._httpretty_sock, attr)
+
+
+class fakesock(object):
+
+ class socket(object):
+ _entry = None
+ debuglevel = 0
+ _sent_data = []
+
+ def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM,
+ protocol=0):
+ self.truesock = (old_socket(family, type, protocol)
+ if httpretty.allow_net_connect
+ else None)
+ self._closed = True
+ self.fd = FakeSockFile()
+ self.fd.socket = self
+ self.timeout = socket._GLOBAL_DEFAULT_TIMEOUT
+ self._sock = self
+ self.is_http = False
+ self._bufsize = 1024
+
+ def getpeercert(self, *a, **kw):
+ now = datetime.now()
+ shift = now + timedelta(days=30 * 12)
+ return {
+ 'notAfter': shift.strftime('%b %d %H:%M:%S GMT'),
+ 'subjectAltName': (
+ ('DNS', '*.%s' % self._host),
+ ('DNS', self._host),
+ ('DNS', '*'),
+ ),
+ 'subject': (
+ (
+ ('organizationName', '*.%s' % self._host),
+ ),
+ (
+ ('organizationalUnitName',
+ 'Domain Control Validated'),
+ ),
+ (
+ ('commonName', '*.%s' % self._host),
+ ),
+ ),
+ }
+
+ def ssl(self, sock, *args, **kw):
+ return sock
+
+ def setsockopt(self, level, optname, value):
+ if self.truesock:
+ self.truesock.setsockopt(level, optname, value)
+
+ def connect(self, address):
+ self._closed = False
+
+ try:
+ self._address = (self._host, self._port) = address
+ except ValueError:
+ # We get here when the address is just a string pointing to a
+ # unix socket path/file
+ #
+ # See issue #206
+ self.is_http = False
+ else:
+ self.is_http = self._port in POTENTIAL_HTTP_PORTS | POTENTIAL_HTTPS_PORTS
+
+ if not self.is_http:
+ if self.truesock:
+ self.truesock.connect(self._address)
+ else:
+ raise UnmockedError()
+
+ def close(self):
+ if not (self.is_http and self._closed):
+ if self.truesock:
+ self.truesock.close()
+ self._closed = True
+
+ def makefile(self, mode='r', bufsize=-1):
+ """Returns this fake socket's own StringIO buffer.
+
+ If there is an entry associated with the socket, the file
+ descriptor gets filled in with the entry data before being
+ returned.
+ """
+ self._mode = mode
+ self._bufsize = bufsize
+
+ if self._entry:
+ self._entry.fill_filekind(self.fd)
+
+ return self.fd
+
+ def real_sendall(self, data, *args, **kw):
+ """Sends data to the remote server. This method is called
+ when HTTPretty identifies that someone is trying to send
+ non-http data.
+
+ The received bytes are written in this socket's StringIO
+ buffer so that HTTPretty can return it accordingly when
+ necessary.
+ """
+
+ if not self.truesock:
+ raise UnmockedError()
+
+ if not self.is_http:
+ return self.truesock.sendall(data, *args, **kw)
+
+ self.truesock.connect(self._address)
+
+ self.truesock.setblocking(1)
+ self.truesock.sendall(data, *args, **kw)
+
+ should_continue = True
+ while should_continue:
+ try:
+ received = self.truesock.recv(self._bufsize)
+ self.fd.write(received)
+ should_continue = len(received) == self._bufsize
+
+ except socket.error as e:
+ if e.errno == EAGAIN:
+ continue
+ break
+
+ self.fd.seek(0)
+
+ def sendall(self, data, *args, **kw):
+ self._sent_data.append(data)
+ self.fd = FakeSockFile()
+ self.fd.socket = self
+ try:
+ requestline, _ = data.split(b'\r\n', 1)
+ method, path, version = parse_requestline(
+ decode_utf8(requestline))
+ is_parsing_headers = True
+ except ValueError:
+ is_parsing_headers = False
+
+ if not self._entry:
+ # If the previous request wasn't mocked, don't mock the
+ # subsequent sending of data
+ return self.real_sendall(data, *args, **kw)
+
+ self.fd.seek(0)
+
+ if not is_parsing_headers:
+ if len(self._sent_data) > 1:
+ headers = utf8(last_requestline(self._sent_data))
+ meta = self._entry.request.headers
+ body = utf8(self._sent_data[-1])
+ if meta.get('transfer-encoding', '') == 'chunked':
+ if not body.isdigit() and body != b'\r\n' and body != b'0\r\n\r\n':
+ self._entry.request.body += body
+ else:
+ self._entry.request.body += body
+
+ httpretty.historify_request(headers, body, False)
+ return
+
+ # path might come with
+ s = urlsplit(path)
+ POTENTIAL_HTTP_PORTS.add(int(s.port or 80))
+ headers, body = list(map(utf8, data.split(b'\r\n\r\n', 1)))
+
+ request = httpretty.historify_request(headers, body)
+
+ info = URIInfo(hostname=self._host, port=self._port,
+ path=s.path,
+ query=s.query,
+ last_request=request)
+
+ matcher, entries = httpretty.match_uriinfo(info)
+
+ if not entries:
+ self._entry = None
+ self.real_sendall(data)
+ return
+
+ self._entry = matcher.get_next_entry(method, info, request)
+
+ def debug(self, truesock_func, *a, **kw):
+ if self.is_http:
+ frame = inspect.stack()[0][0]
+ lines = list(map(utf8, traceback.format_stack(frame)))
+
+ message = [
+ "HTTPretty intercepted and unexpected socket method call.",
+ ("Please open an issue at "
+ "'https://github.com/gabrielfalcao/HTTPretty/issues'"),
+ "And paste the following traceback:\n",
+ "".join(decode_utf8(lines)),
+ ]
+ raise RuntimeError("\n".join(message))
+ if not self.truesock:
+ raise UnmockedError()
+ return getattr(self.truesock, truesock_func)(*a, **kw)
+
+ def settimeout(self, new_timeout):
+ self.timeout = new_timeout
+
+ def send(self, *args, **kwargs):
+ return self.debug('send', *args, **kwargs)
+
+ def sendto(self, *args, **kwargs):
+ return self.debug('sendto', *args, **kwargs)
+
+ def recvfrom_into(self, *args, **kwargs):
+ return self.debug('recvfrom_into', *args, **kwargs)
+
+ def recv_into(self, *args, **kwargs):
+ return self.debug('recv_into', *args, **kwargs)
+
+ def recvfrom(self, *args, **kwargs):
+ return self.debug('recvfrom', *args, **kwargs)
+
+ def recv(self, *args, **kwargs):
+ return self.debug('recv', *args, **kwargs)
+
+ def __getattr__(self, name):
+ if not self.truesock:
+ raise UnmockedError()
+ return getattr(self.truesock, name)
+
+
+def fake_wrap_socket(s, *args, **kw):
+ return s
+
+
+def create_fake_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):
+ s = fakesock.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
+ if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
+ s.settimeout(timeout)
+ if source_address:
+ s.bind(source_address)
+ s.connect(address)
+ return s
+
+
+def fake_gethostbyname(host):
+ return '127.0.0.1'
+
+
+def fake_gethostname():
+ return 'localhost'
+
+
+def fake_getaddrinfo(
+ host, port, family=None, socktype=None, proto=None, flags=None):
+ return [(2, 1, 6, '', (host, port))]
+
+
+class Entry(BaseClass):
+
+ def __init__(self, method, uri, body,
+ adding_headers=None,
+ forcing_headers=None,
+ status=200,
+ streaming=False,
+ **headers):
+
+ self.method = method
+ self.uri = uri
+ self.info = None
+ self.request = None
+
+ self.body_is_callable = False
+ if hasattr(body, "__call__"):
+ self.callable_body = body
+ self.body = None
+ self.body_is_callable = True
+ elif isinstance(body, text_type):
+ self.body = utf8(body)
+ else:
+ self.body = body
+
+ self.streaming = streaming
+ if not streaming and not self.body_is_callable:
+ self.body_length = len(self.body or '')
+ else:
+ self.body_length = 0
+
+ self.adding_headers = adding_headers or {}
+ self.forcing_headers = forcing_headers or {}
+ self.status = int(status)
+
+ for k, v in headers.items():
+ name = "-".join(k.split("_")).title()
+ self.adding_headers[name] = v
+
+ self.validate()
+
+ def validate(self):
+ content_length_keys = 'Content-Length', 'content-length'
+ for key in content_length_keys:
+ got = self.adding_headers.get(
+ key, self.forcing_headers.get(key, None))
+
+ if got is None:
+ continue
+
+ try:
+ igot = int(got)
+ except ValueError:
+ warnings.warn(
+ 'HTTPretty got to register the Content-Length header '
+ 'with "%r" which is not a number' % got,
+ )
+
+ if igot > self.body_length:
+ raise HTTPrettyError(
+ 'HTTPretty got inconsistent parameters. The header '
+ 'Content-Length you registered expects size "%d" but '
+ 'the body you registered for that has actually length '
+ '"%d".' % (
+ igot, self.body_length,
+ )
+ )
+
+ def __str__(self):
+ return r'<Entry %s %s getting %d>' % (
+ self.method, self.uri, self.status)
+
+ def normalize_headers(self, headers):
+ new = {}
+ for k in headers:
+ new_k = '-'.join([s.lower() for s in k.split('-')])
+ new[new_k] = headers[k]
+
+ return new
+
+ def fill_filekind(self, fk):
+ now = datetime.utcnow()
+
+ headers = {
+ 'status': self.status,
+ 'date': now.strftime('%a, %d %b %Y %H:%M:%S GMT'),
+ 'server': 'Python/HTTPretty',
+ 'connection': 'close',
+ }
+
+ if self.forcing_headers:
+ headers = self.forcing_headers
+
+ if self.adding_headers:
+ headers.update(self.normalize_headers(self.adding_headers))
+
+ headers = self.normalize_headers(headers)
+ status = headers.get('status', self.status)
+ if self.body_is_callable:
+ status, headers, self.body = self.callable_body(
+ self.request, self.info.full_url(), headers)
+ headers = self.normalize_headers(headers)
+ if self.request.method != "HEAD":
+ headers.update({
+ 'content-length': len(self.body)
+ })
+
+ string_list = [
+ 'HTTP/1.1 %d %s' % (status, STATUSES[status]),
+ ]
+
+ if 'date' in headers:
+ string_list.append('date: %s' % headers.pop('date'))
+
+ if not self.forcing_headers:
+ content_type = headers.pop('content-type',
+ 'text/plain; charset=utf-8')
+
+ content_length = headers.pop('content-length', self.body_length)
+
+ string_list.append('content-type: %s' % content_type)
+ if not self.streaming:
+ string_list.append('content-length: %s' % content_length)
+
+ string_list.append('server: %s' % headers.pop('server'))
+
+ for k, v in headers.items():
+ string_list.append(
+ '{0}: {1}'.format(k, v),
+ )
+
+ for item in string_list:
+ fk.write(utf8(item) + b'\n')
+
+ fk.write(b'\r\n')
+
+ if self.streaming:
+ self.body, body = itertools.tee(self.body)
+ for chunk in body:
+ fk.write(utf8(chunk))
+ else:
+ fk.write(utf8(self.body))
+
+ fk.seek(0)
+
+
+def url_fix(s, charset='utf-8'):
+ scheme, netloc, path, querystring, fragment = urlsplit(s)
+ path = quote(path, b'/%')
+ querystring = quote_plus(querystring, b':&=')
+ return urlunsplit((scheme, netloc, path, querystring, fragment))
+
+
+class URIInfo(BaseClass):
+
+ def __init__(self,
+ username='',
+ password='',
+ hostname='',
+ port=80,
+ path='/',
+ query='',
+ fragment='',
+ scheme='',
+ last_request=None):
+
+ self.username = username or ''
+ self.password = password or ''
+ self.hostname = hostname or ''
+
+ if port:
+ port = int(port)
+
+ elif scheme == 'https':
+ port = 443
+
+ self.port = port or 80
+ self.path = path or ''
+ self.query = query or ''
+ if scheme:
+ self.scheme = scheme
+ elif self.port in POTENTIAL_HTTPS_PORTS:
+ self.scheme = 'https'
+ else:
+ self.scheme = 'http'
+ self.fragment = fragment or ''
+ self.last_request = last_request
+
+ def __str__(self):
+ attrs = (
+ 'username',
+ 'password',
+ 'hostname',
+ 'port',
+ 'path',
+ )
+ fmt = ", ".join(['%s="%s"' % (k, getattr(self, k, '')) for k in attrs])
+ return r'<httpretty.URIInfo(%s)>' % fmt
+
+ def __hash__(self):
+ return hash(text_type(self))
+
+ def __eq__(self, other):
+ self_tuple = (
+ self.port,
+ decode_utf8(self.hostname.lower()),
+ url_fix(decode_utf8(self.path)),
+ )
+ other_tuple = (
+ other.port,
+ decode_utf8(other.hostname.lower()),
+ url_fix(decode_utf8(other.path)),
+ )
+ return self_tuple == other_tuple
+
+ def full_url(self, use_querystring=True):
+ credentials = ""
+ if self.password:
+ credentials = "{0}:{1}@".format(
+ self.username, self.password)
+
+ query = ""
+ if use_querystring and self.query:
+ query = "?{0}".format(decode_utf8(self.query))
+
+ result = "{scheme}://{credentials}{domain}{path}{query}".format(
+ scheme=self.scheme,
+ credentials=credentials,
+ domain=self.get_full_domain(),
+ path=decode_utf8(self.path),
+ query=query
+ )
+ return result
+
+ def get_full_domain(self):
+ hostname = decode_utf8(self.hostname)
+ # Port 80/443 should not be appended to the url
+ if self.port not in DEFAULT_HTTP_PORTS | DEFAULT_HTTPS_PORTS:
+ return ":".join([hostname, str(self.port)])
+
+ return hostname
+
+ @classmethod
+ def from_uri(cls, uri, entry):
+ result = urlsplit(uri)
+ if result.scheme == 'https':
+ POTENTIAL_HTTPS_PORTS.add(int(result.port or 443))
+ else:
+ POTENTIAL_HTTP_PORTS.add(int(result.port or 80))
+ return cls(result.username,
+ result.password,
+ result.hostname,
+ result.port,
+ result.path,
+ result.query,
+ result.fragment,
+ result.scheme,
+ entry)
+
+
+class URIMatcher(object):
+ regex = None
+ info = None
+
+ def __init__(self, uri, entries, match_querystring=False):
+ self._match_querystring = match_querystring
+ if type(uri).__name__ in ('SRE_Pattern', 'Pattern'):
+ self.regex = uri
+ result = urlsplit(uri.pattern)
+ if result.scheme == 'https':
+ POTENTIAL_HTTPS_PORTS.add(int(result.port or 443))
+ else:
+ POTENTIAL_HTTP_PORTS.add(int(result.port or 80))
+ else:
+ self.info = URIInfo.from_uri(uri, entries)
+
+ self.entries = entries
+
+ # hash of current_entry pointers, per method.
+ self.current_entries = {}
+
+ def matches(self, info):
+ if self.info:
+ return self.info == info
+ else:
+ return self.regex.search(info.full_url(
+ use_querystring=self._match_querystring))
+
+ def __str__(self):
+ wrap = 'URLMatcher({0})'
+ if self.info:
+ return wrap.format(text_type(self.info))
+ else:
+ return wrap.format(self.regex.pattern)
+
+ def get_next_entry(self, method, info, request):
+ """Cycle through available responses, but only once.
+ Any subsequent requests will receive the last response"""
+
+ if method not in self.current_entries:
+ self.current_entries[method] = 0
+
+ # restrict selection to entries that match the requested method
+ entries_for_method = [e for e in self.entries if e.method == method]
+
+ if self.current_entries[method] >= len(entries_for_method):
+ self.current_entries[method] = -1
+
+ if not self.entries or not entries_for_method:
+ raise ValueError('I have no entries for method %s: %s'
+ % (method, self))
+
+ entry = entries_for_method[self.current_entries[method]]
+ if self.current_entries[method] != -1:
+ self.current_entries[method] += 1
+
+ # Attach more info to the entry
+ # So the callback can be more clever about what to do
+ # This does also fix the case where the callback
+ # would be handed a compiled regex as uri instead of the
+ # real uri
+ entry.info = info
+ entry.request = request
+ return entry
+
+ def __hash__(self):
+ return hash(text_type(self))
+
+ def __eq__(self, other):
+ return text_type(self) == text_type(other)
+
+
+class httpretty(HttpBaseClass):
+ """The URI registration class"""
+ _entries = {}
+ latest_requests = []
+
+ last_request = HTTPrettyRequestEmpty()
+ _is_enabled = False
+ allow_net_connect = True
+
+ @classmethod
+ def match_uriinfo(cls, info):
+ for matcher, value in cls._entries.items():
+ if matcher.matches(info):
+ return (matcher, info)
+
+ return (None, [])
+
+ @classmethod
+ @contextlib.contextmanager
+ def record(cls, filename, indentation=4, encoding='utf-8'):
+ try:
+ import urllib3
+ except ImportError:
+ raise RuntimeError(
+ 'HTTPretty requires urllib3 installed for recording actual requests.')
+
+ http = urllib3.PoolManager()
+
+ cls.enable()
+ calls = []
+
+ def record_request(request, uri, headers):
+ cls.disable()
+
+ response = http.request(request.method, uri)
+ calls.append({
+ 'request': {
+ 'uri': uri,
+ 'method': request.method,
+ 'headers': dict(request.headers),
+ 'body': decode_utf8(request.body),
+ 'querystring': request.querystring
+ },
+ 'response': {
+ 'status': response.status,
+ 'body': decode_utf8(response.data),
+ 'headers': dict(response.headers)
+ }
+ })
+ cls.enable()
+ return response.status, response.headers, response.data
+
+ for method in cls.METHODS:
+ cls.register_uri(method, re.compile(
+ r'.*', re.M), body=record_request)
+
+ yield
+ cls.disable()
+ with codecs.open(filename, 'w', encoding) as f:
+ f.write(json.dumps(calls, indent=indentation))
+
+ @classmethod
+ @contextlib.contextmanager
+ def playback(cls, origin):
+ cls.enable()
+
+ data = json.loads(open(origin).read())
+ for item in data:
+ uri = item['request']['uri']
+ method = item['request']['method']
+ cls.register_uri(method, uri, body=item['response'][
+ 'body'], forcing_headers=item['response']['headers'])
+
+ yield
+ cls.disable()
+
+ @classmethod
+ def reset(cls):
+ POTENTIAL_HTTP_PORTS.intersection_update(DEFAULT_HTTP_PORTS)
+ POTENTIAL_HTTPS_PORTS.intersection_update(DEFAULT_HTTPS_PORTS)
+ cls._entries.clear()
+ cls.latest_requests = []
+ cls.last_request = HTTPrettyRequestEmpty()
+
+ @classmethod
+ def historify_request(cls, headers, body='', append=True):
+ request = HTTPrettyRequest(headers, body)
+ cls.last_request = request
+ if append or not cls.latest_requests:
+ cls.latest_requests.append(request)
+ else:
+ cls.latest_requests[-1] = request
+ return request
+
+ @classmethod
+ def register_uri(cls, method, uri, body='HTTPretty :)',
+ adding_headers=None,
+ forcing_headers=None,
+ status=200,
+ responses=None, match_querystring=False,
+ **headers):
+
+ uri_is_string = isinstance(uri, basestring)
+
+ if uri_is_string and re.search(r'^\w+://[^/]+[.]\w{2,}$', uri):
+ uri += '/'
+
+ if isinstance(responses, list) and len(responses) > 0:
+ for response in responses:
+ response.uri = uri
+ response.method = method
+ entries_for_this_uri = responses
+ else:
+ headers[str('body')] = body
+ headers[str('adding_headers')] = adding_headers
+ headers[str('forcing_headers')] = forcing_headers
+ headers[str('status')] = status
+
+ entries_for_this_uri = [
+ cls.Response(method=method, uri=uri, **headers),
+ ]
+
+ matcher = URIMatcher(uri, entries_for_this_uri,
+ match_querystring)
+ if matcher in cls._entries:
+ matcher.entries.extend(cls._entries[matcher])
+ del cls._entries[matcher]
+
+ cls._entries[matcher] = entries_for_this_uri
+
+ def __str__(self):
+ return '<HTTPretty with %d URI entries>' % len(self._entries)
+
+ @classmethod
+ def Response(cls, body, method=None, uri=None, adding_headers=None, forcing_headers=None,
+ status=200, streaming=False, **headers):
+
+ headers[str('body')] = body
+ headers[str('adding_headers')] = adding_headers
+ headers[str('forcing_headers')] = forcing_headers
+ headers[str('status')] = int(status)
+ headers[str('streaming')] = streaming
+ return Entry(method, uri, **headers)
+
+ @classmethod
+ def disable(cls):
+ cls._is_enabled = False
+ socket.socket = old_socket
+ if not BAD_SOCKET_SHADOW:
+ socket.SocketType = old_socket
+ socket._socketobject = old_socket
+
+ socket.create_connection = old_create_connection
+ socket.gethostname = old_gethostname
+ socket.gethostbyname = old_gethostbyname
+ socket.getaddrinfo = old_getaddrinfo
+
+ socket.__dict__['socket'] = old_socket
+ socket.__dict__['_socketobject'] = old_socket
+ if not BAD_SOCKET_SHADOW:
+ socket.__dict__['SocketType'] = old_socket
+
+ socket.__dict__['create_connection'] = old_create_connection
+ socket.__dict__['gethostname'] = old_gethostname
+ socket.__dict__['gethostbyname'] = old_gethostbyname
+ socket.__dict__['getaddrinfo'] = old_getaddrinfo
+
+ if socks:
+ socks.socksocket = old_socksocket
+ socks.__dict__['socksocket'] = old_socksocket
+
+ if ssl:
+ ssl.wrap_socket = old_ssl_wrap_socket
+ ssl.SSLSocket = old_sslsocket
+ try:
+ ssl.SSLContext.wrap_socket = old_sslcontext_wrap_socket
+ except AttributeError:
+ pass
+ ssl.__dict__['wrap_socket'] = old_ssl_wrap_socket
+ ssl.__dict__['SSLSocket'] = old_sslsocket
+
+ if not PY3:
+ ssl.sslwrap_simple = old_sslwrap_simple
+ ssl.__dict__['sslwrap_simple'] = old_sslwrap_simple
+
+ if pyopenssl_override:
+ inject_into_urllib3()
+
+ @classmethod
+ def is_enabled(cls):
+ return cls._is_enabled
+
+ @classmethod
+ def enable(cls):
+ cls._is_enabled = True
+
+ socket.socket = fakesock.socket
+ socket._socketobject = fakesock.socket
+ if not BAD_SOCKET_SHADOW:
+ socket.SocketType = fakesock.socket
+
+ socket.create_connection = create_fake_connection
+ socket.gethostname = fake_gethostname
+ socket.gethostbyname = fake_gethostbyname
+ socket.getaddrinfo = fake_getaddrinfo
+
+ socket.__dict__['socket'] = fakesock.socket
+ socket.__dict__['_socketobject'] = fakesock.socket
+ if not BAD_SOCKET_SHADOW:
+ socket.__dict__['SocketType'] = fakesock.socket
+
+ socket.__dict__['create_connection'] = create_fake_connection
+ socket.__dict__['gethostname'] = fake_gethostname
+ socket.__dict__['gethostbyname'] = fake_gethostbyname
+ socket.__dict__['getaddrinfo'] = fake_getaddrinfo
+
+ if socks:
+ socks.socksocket = fakesock.socket
+ socks.__dict__['socksocket'] = fakesock.socket
+
+ if ssl:
+ ssl.wrap_socket = fake_wrap_socket
+ ssl.SSLSocket = FakeSSLSocket
+
+ try:
+ def fake_sslcontext_wrap_socket(cls, *args, **kwargs):
+ return fake_wrap_socket(*args, **kwargs)
+
+ ssl.SSLContext.wrap_socket = fake_sslcontext_wrap_socket
+ except AttributeError:
+ pass
+
+ ssl.__dict__['wrap_socket'] = fake_wrap_socket
+ ssl.__dict__['SSLSocket'] = FakeSSLSocket
+
+ if not PY3:
+ ssl.sslwrap_simple = fake_wrap_socket
+ ssl.__dict__['sslwrap_simple'] = fake_wrap_socket
+
+ if pyopenssl_override:
+ extract_from_urllib3()
+
+
+def httprettified(test):
+ "A decorator tests that use HTTPretty"
+ def decorate_class(klass):
+ for attr in dir(klass):
+ if not attr.startswith('test_'):
+ continue
+
+ attr_value = getattr(klass, attr)
+ if not hasattr(attr_value, "__call__"):
+ continue
+
+ setattr(klass, attr, decorate_callable(attr_value))
+ return klass
+
+ def decorate_callable(test):
+ @functools.wraps(test)
+ def wrapper(*args, **kw):
+ httpretty.reset()
+ httpretty.enable()
+ try:
+ return test(*args, **kw)
+ finally:
+ httpretty.disable()
+ return wrapper
+
+ if isinstance(test, ClassTypes):
+ return decorate_class(test)
+ return decorate_callable(test)
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/errors.py b/contrib/python/moto/py2/moto/packages/httpretty/errors.py
new file mode 100644
index 0000000000..e2dcad357f
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/errors.py
@@ -0,0 +1,40 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+
+class HTTPrettyError(Exception):
+ pass
+
+
+class UnmockedError(HTTPrettyError):
+
+ def __init__(self):
+ super(UnmockedError, self).__init__(
+ 'No mocking was registered, and real connections are '
+ 'not allowed (httpretty.allow_net_connect = False).'
+ )
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/http.py b/contrib/python/moto/py2/moto/packages/httpretty/http.py
new file mode 100644
index 0000000000..ee1625905d
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/http.py
@@ -0,0 +1,154 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+import re
+from .compat import BaseClass
+from .utils import decode_utf8
+
+STATUSES = {
+ 100: "Continue",
+ 101: "Switching Protocols",
+ 102: "Processing",
+ 200: "OK",
+ 201: "Created",
+ 202: "Accepted",
+ 203: "Non-Authoritative Information",
+ 204: "No Content",
+ 205: "Reset Content",
+ 206: "Partial Content",
+ 207: "Multi-Status",
+ 208: "Already Reported",
+ 226: "IM Used",
+ 300: "Multiple Choices",
+ 301: "Moved Permanently",
+ 302: "Found",
+ 303: "See Other",
+ 304: "Not Modified",
+ 305: "Use Proxy",
+ 306: "Switch Proxy",
+ 307: "Temporary Redirect",
+ 308: "Permanent Redirect",
+ 400: "Bad Request",
+ 401: "Unauthorized",
+ 402: "Payment Required",
+ 403: "Forbidden",
+ 404: "Not Found",
+ 405: "Method Not Allowed",
+ 406: "Not Acceptable",
+ 407: "Proxy Authentication Required",
+ 408: "Request a Timeout",
+ 409: "Conflict",
+ 410: "Gone",
+ 411: "Length Required",
+ 412: "Precondition Failed",
+ 413: "Request Entity Too Large",
+ 414: "Request-URI Too Long",
+ 415: "Unsupported Media Type",
+ 416: "Requested Range Not Satisfiable",
+ 417: "Expectation Failed",
+ 418: "I'm a teapot",
+ 420: "Enhance Your Calm",
+ 422: "Unprocessable Entity",
+ 423: "Locked",
+ 424: "Failed Dependency",
+ 424: "Method Failure",
+ 425: "Unordered Collection",
+ 426: "Upgrade Required",
+ 428: "Precondition Required",
+ 429: "Too Many Requests",
+ 431: "Request Header Fields Too Large",
+ 444: "No Response",
+ 449: "Retry With",
+ 450: "Blocked by Windows Parental Controls",
+ 451: "Unavailable For Legal Reasons",
+ 451: "Redirect",
+ 494: "Request Header Too Large",
+ 495: "Cert Error",
+ 496: "No Cert",
+ 497: "HTTP to HTTPS",
+ 499: "Client Closed Request",
+ 500: "Internal Server Error",
+ 501: "Not Implemented",
+ 502: "Bad Gateway",
+ 503: "Service Unavailable",
+ 504: "Gateway Timeout",
+ 505: "HTTP Version Not Supported",
+ 506: "Variant Also Negotiates",
+ 507: "Insufficient Storage",
+ 508: "Loop Detected",
+ 509: "Bandwidth Limit Exceeded",
+ 510: "Not Extended",
+ 511: "Network Authentication Required",
+ 598: "Network read timeout error",
+ 599: "Network connect timeout error",
+}
+
+
+class HttpBaseClass(BaseClass):
+ GET = 'GET'
+ PUT = 'PUT'
+ POST = 'POST'
+ DELETE = 'DELETE'
+ HEAD = 'HEAD'
+ PATCH = 'PATCH'
+ OPTIONS = 'OPTIONS'
+ CONNECT = 'CONNECT'
+ METHODS = (GET, PUT, POST, DELETE, HEAD, PATCH, OPTIONS, CONNECT)
+
+
+def parse_requestline(s):
+ """
+ http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5
+
+ >>> parse_requestline('GET / HTTP/1.0')
+ ('GET', '/', '1.0')
+ >>> parse_requestline('post /testurl htTP/1.1')
+ ('POST', '/testurl', '1.1')
+ >>> parse_requestline('Im not a RequestLine')
+ Traceback (most recent call last):
+ ...
+ ValueError: Not a Request-Line
+ """
+ methods = '|'.join(HttpBaseClass.METHODS)
+ m = re.match(r'(' + methods + ')\s+(.*)\s+HTTP/(1.[0|1])', s, re.I)
+ if m:
+ return m.group(1).upper(), m.group(2), m.group(3)
+ else:
+ raise ValueError('Not a Request-Line')
+
+
+def last_requestline(sent_data):
+ """
+ Find the last line in sent_data that can be parsed with parse_requestline
+ """
+ for line in reversed(sent_data):
+ try:
+ parse_requestline(decode_utf8(line))
+ except ValueError:
+ pass
+ else:
+ return line
diff --git a/contrib/python/moto/py2/moto/packages/httpretty/utils.py b/contrib/python/moto/py2/moto/packages/httpretty/utils.py
new file mode 100644
index 0000000000..caa8fa13b6
--- /dev/null
+++ b/contrib/python/moto/py2/moto/packages/httpretty/utils.py
@@ -0,0 +1,48 @@
+# #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# <HTTPretty - HTTP client mock for Python>
+# Copyright (C) <2011-2013> Gabriel Falcão <gabriel@nacaolivre.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import unicode_literals
+
+from .compat import (
+ byte_type, text_type
+)
+
+
+def utf8(s):
+ if isinstance(s, text_type):
+ s = s.encode('utf-8')
+ elif s is None:
+ return byte_type()
+
+ return byte_type(s)
+
+
+def decode_utf8(s):
+ if isinstance(s, byte_type):
+ s = s.decode("utf-8")
+ elif s is None:
+ return text_type()
+
+ return text_type(s)
diff --git a/contrib/python/moto/py2/moto/route53/__init__.py b/contrib/python/moto/py2/moto/route53/__init__.py
new file mode 100644
index 0000000000..e2bbe4c1ab
--- /dev/null
+++ b/contrib/python/moto/py2/moto/route53/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import unicode_literals
+from .models import route53_backend
+
+route53_backends = {"global": route53_backend}
+mock_route53 = route53_backend.decorator
+mock_route53_deprecated = route53_backend.deprecated_decorator
diff --git a/contrib/python/moto/py2/moto/route53/models.py b/contrib/python/moto/py2/moto/route53/models.py
new file mode 100644
index 0000000000..3760d3817e
--- /dev/null
+++ b/contrib/python/moto/py2/moto/route53/models.py
@@ -0,0 +1,314 @@
+from __future__ import unicode_literals
+
+from collections import defaultdict
+
+import string
+import random
+import uuid
+from jinja2 import Template
+
+from moto.core import BaseBackend, BaseModel
+
+
+ROUTE53_ID_CHOICE = string.ascii_uppercase + string.digits
+
+
+def create_route53_zone_id():
+ # New ID's look like this Z1RWWTK7Y8UDDQ
+ return ''.join([random.choice(ROUTE53_ID_CHOICE) for _ in range(0, 15)])
+
+
+class HealthCheck(BaseModel):
+
+ def __init__(self, health_check_id, health_check_args):
+ self.id = health_check_id
+ self.ip_address = health_check_args.get("ip_address")
+ self.port = health_check_args.get("port", 80)
+ self.type_ = health_check_args.get("type")
+ self.resource_path = health_check_args.get("resource_path")
+ self.fqdn = health_check_args.get("fqdn")
+ self.search_string = health_check_args.get("search_string")
+ self.request_interval = health_check_args.get("request_interval", 30)
+ self.failure_threshold = health_check_args.get("failure_threshold", 3)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']['HealthCheckConfig']
+ health_check_args = {
+ "ip_address": properties.get('IPAddress'),
+ "port": properties.get('Port'),
+ "type": properties['Type'],
+ "resource_path": properties.get('ResourcePath'),
+ "fqdn": properties.get('FullyQualifiedDomainName'),
+ "search_string": properties.get('SearchString'),
+ "request_interval": properties.get('RequestInterval'),
+ "failure_threshold": properties.get('FailureThreshold'),
+ }
+ health_check = route53_backend.create_health_check(health_check_args)
+ return health_check
+
+ def to_xml(self):
+ template = Template("""<HealthCheck>
+ <Id>{{ health_check.id }}</Id>
+ <CallerReference>example.com 192.0.2.17</CallerReference>
+ <HealthCheckConfig>
+ <IPAddress>{{ health_check.ip_address }}</IPAddress>
+ <Port>{{ health_check.port }}</Port>
+ <Type>{{ health_check.type_ }}</Type>
+ <ResourcePath>{{ health_check.resource_path }}</ResourcePath>
+ <FullyQualifiedDomainName>{{ health_check.fqdn }}</FullyQualifiedDomainName>
+ <RequestInterval>{{ health_check.request_interval }}</RequestInterval>
+ <FailureThreshold>{{ health_check.failure_threshold }}</FailureThreshold>
+ {% if health_check.search_string %}
+ <SearchString>{{ health_check.search_string }}</SearchString>
+ {% endif %}
+ </HealthCheckConfig>
+ <HealthCheckVersion>1</HealthCheckVersion>
+ </HealthCheck>""")
+ return template.render(health_check=self)
+
+
+class RecordSet(BaseModel):
+
+ def __init__(self, kwargs):
+ self.name = kwargs.get('Name')
+ self.type_ = kwargs.get('Type')
+ self.ttl = kwargs.get('TTL')
+ self.records = kwargs.get('ResourceRecords', [])
+ self.set_identifier = kwargs.get('SetIdentifier')
+ self.weight = kwargs.get('Weight')
+ self.region = kwargs.get('Region')
+ self.health_check = kwargs.get('HealthCheckId')
+ self.hosted_zone_name = kwargs.get('HostedZoneName')
+ self.hosted_zone_id = kwargs.get('HostedZoneId')
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(
+ properties["HostedZoneId"])
+ record_set = hosted_zone.add_rrset(properties)
+ return record_set
+
+ @classmethod
+ def update_from_cloudformation_json(cls, original_resource, new_resource_name, cloudformation_json, region_name):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name)
+ return cls.create_from_cloudformation_json(new_resource_name, cloudformation_json, region_name)
+
+ @classmethod
+ def delete_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ # this will break if you changed the zone the record is in,
+ # unfortunately
+ properties = cloudformation_json['Properties']
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(
+ properties["HostedZoneId"])
+
+ try:
+ hosted_zone.delete_rrset_by_name(resource_name)
+ except KeyError:
+ pass
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ def to_xml(self):
+ template = Template("""<ResourceRecordSet>
+ <Name>{{ record_set.name }}</Name>
+ <Type>{{ record_set.type_ }}</Type>
+ {% if record_set.set_identifier %}
+ <SetIdentifier>{{ record_set.set_identifier }}</SetIdentifier>
+ {% endif %}
+ {% if record_set.weight %}
+ <Weight>{{ record_set.weight }}</Weight>
+ {% endif %}
+ {% if record_set.region %}
+ <Region>{{ record_set.region }}</Region>
+ {% endif %}
+ {% if record_set.ttl %}
+ <TTL>{{ record_set.ttl }}</TTL>
+ {% endif %}
+ <ResourceRecords>
+ {% for record in record_set.records %}
+ <ResourceRecord>
+ <Value>{{ record }}</Value>
+ </ResourceRecord>
+ {% endfor %}
+ </ResourceRecords>
+ {% if record_set.health_check %}
+ <HealthCheckId>{{ record_set.health_check }}</HealthCheckId>
+ {% endif %}
+ </ResourceRecordSet>""")
+ return template.render(record_set=self)
+
+ def delete(self, *args, **kwargs):
+ ''' Not exposed as part of the Route 53 API - used for CloudFormation. args are ignored '''
+ hosted_zone = route53_backend.get_hosted_zone_by_name(
+ self.hosted_zone_name)
+ if not hosted_zone:
+ hosted_zone = route53_backend.get_hosted_zone(self.hosted_zone_id)
+ hosted_zone.delete_rrset_by_name(self.name)
+
+
+class FakeZone(BaseModel):
+
+ def __init__(self, name, id_, private_zone, comment=None):
+ self.name = name
+ self.id = id_
+ if comment is not None:
+ self.comment = comment
+ self.private_zone = private_zone
+ self.rrsets = []
+
+ def add_rrset(self, record_set):
+ record_set = RecordSet(record_set)
+ self.rrsets.append(record_set)
+ return record_set
+
+ def upsert_rrset(self, record_set):
+ new_rrset = RecordSet(record_set)
+ for i, rrset in enumerate(self.rrsets):
+ if rrset.name == new_rrset.name and rrset.type_ == new_rrset.type_:
+ self.rrsets[i] = new_rrset
+ break
+ else:
+ self.rrsets.append(new_rrset)
+ return new_rrset
+
+ def delete_rrset_by_name(self, name):
+ self.rrsets = [
+ record_set for record_set in self.rrsets if record_set.name != name]
+
+ def delete_rrset_by_id(self, set_identifier):
+ self.rrsets = [
+ record_set for record_set in self.rrsets if record_set.set_identifier != set_identifier]
+
+ def get_record_sets(self, start_type, start_name):
+ record_sets = list(self.rrsets) # Copy the list
+ if start_type:
+ record_sets = [
+ record_set for record_set in record_sets if record_set.type_ >= start_type]
+ if start_name:
+ record_sets = [
+ record_set for record_set in record_sets if record_set.name >= start_name]
+
+ return record_sets
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+ name = properties["Name"]
+
+ hosted_zone = route53_backend.create_hosted_zone(
+ name, private_zone=False)
+ return hosted_zone
+
+
+class RecordSetGroup(BaseModel):
+
+ def __init__(self, hosted_zone_id, record_sets):
+ self.hosted_zone_id = hosted_zone_id
+ self.record_sets = record_sets
+
+ @property
+ def physical_resource_id(self):
+ return "arn:aws:route53:::hostedzone/{0}".format(self.hosted_zone_id)
+
+ @classmethod
+ def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
+ properties = cloudformation_json['Properties']
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(properties["HostedZoneId"])
+ record_sets = properties["RecordSets"]
+ for record_set in record_sets:
+ hosted_zone.add_rrset(record_set)
+
+ record_set_group = RecordSetGroup(hosted_zone.id, record_sets)
+ return record_set_group
+
+
+class Route53Backend(BaseBackend):
+
+ def __init__(self):
+ self.zones = {}
+ self.health_checks = {}
+ self.resource_tags = defaultdict(dict)
+
+ def create_hosted_zone(self, name, private_zone, comment=None):
+ new_id = create_route53_zone_id()
+ new_zone = FakeZone(
+ name, new_id, private_zone=private_zone, comment=comment)
+ self.zones[new_id] = new_zone
+ return new_zone
+
+ def change_tags_for_resource(self, resource_id, tags):
+ if 'Tag' in tags:
+ if isinstance(tags['Tag'], list):
+ for tag in tags['Tag']:
+ self.resource_tags[resource_id][tag['Key']] = tag['Value']
+ else:
+ key, value = (tags['Tag']['Key'], tags['Tag']['Value'])
+ self.resource_tags[resource_id][key] = value
+ else:
+ if 'Key' in tags:
+ if isinstance(tags['Key'], list):
+ for key in tags['Key']:
+ del(self.resource_tags[resource_id][key])
+ else:
+ del(self.resource_tags[resource_id][tags['Key']])
+
+ def list_tags_for_resource(self, resource_id):
+ if resource_id in self.resource_tags:
+ return self.resource_tags[resource_id]
+
+ def get_all_hosted_zones(self):
+ return self.zones.values()
+
+ def get_hosted_zone(self, id_):
+ return self.zones.get(id_.replace("/hostedzone/", ""))
+
+ def get_hosted_zone_by_name(self, name):
+ for zone in self.get_all_hosted_zones():
+ if zone.name == name:
+ return zone
+
+ def delete_hosted_zone(self, id_):
+ return self.zones.pop(id_.replace("/hostedzone/", ""), None)
+
+ def create_health_check(self, health_check_args):
+ health_check_id = str(uuid.uuid4())
+ health_check = HealthCheck(health_check_id, health_check_args)
+ self.health_checks[health_check_id] = health_check
+ return health_check
+
+ def get_health_checks(self):
+ return self.health_checks.values()
+
+ def delete_health_check(self, health_check_id):
+ return self.health_checks.pop(health_check_id, None)
+
+
+route53_backend = Route53Backend()
diff --git a/contrib/python/moto/py2/moto/route53/responses.py b/contrib/python/moto/py2/moto/route53/responses.py
new file mode 100644
index 0000000000..98ffa4c471
--- /dev/null
+++ b/contrib/python/moto/py2/moto/route53/responses.py
@@ -0,0 +1,369 @@
+from __future__ import unicode_literals
+from jinja2 import Template
+from six.moves.urllib.parse import parse_qs, urlparse
+
+from moto.core.responses import BaseResponse
+from .models import route53_backend
+import xmltodict
+
+
+class Route53(BaseResponse):
+
+ def list_or_create_hostzone_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if request.method == "POST":
+ elements = xmltodict.parse(self.body)
+ if "HostedZoneConfig" in elements["CreateHostedZoneRequest"]:
+ comment = elements["CreateHostedZoneRequest"][
+ "HostedZoneConfig"]["Comment"]
+ try:
+ # in boto3, this field is set directly in the xml
+ private_zone = elements["CreateHostedZoneRequest"][
+ "HostedZoneConfig"]["PrivateZone"]
+ except KeyError:
+ # if a VPC subsection is only included in xmls params when private_zone=True,
+ # see boto: boto/route53/connection.py
+ private_zone = 'VPC' in elements["CreateHostedZoneRequest"]
+ else:
+ comment = None
+ private_zone = False
+
+ name = elements["CreateHostedZoneRequest"]["Name"]
+
+ if name[-1] != ".":
+ name += "."
+
+ new_zone = route53_backend.create_hosted_zone(
+ name,
+ comment=comment,
+ private_zone=private_zone,
+ )
+ template = Template(CREATE_HOSTED_ZONE_RESPONSE)
+ return 201, headers, template.render(zone=new_zone)
+
+ elif request.method == "GET":
+ all_zones = route53_backend.get_all_hosted_zones()
+ template = Template(LIST_HOSTED_ZONES_RESPONSE)
+ return 200, headers, template.render(zones=all_zones)
+
+ def list_hosted_zones_by_name_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ query_params = parse_qs(parsed_url.query)
+ dnsname = query_params.get("dnsname")
+
+ if dnsname:
+ dnsname = dnsname[0] # parse_qs gives us a list, but this parameter doesn't repeat
+ # return all zones with that name (there can be more than one)
+ zones = [zone for zone in route53_backend.get_all_hosted_zones() if zone.name == dnsname]
+ else:
+ # sort by names, but with domain components reversed
+ # see http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.list_hosted_zones_by_name
+
+ def sort_key(zone):
+ domains = zone.name.split(".")
+ if domains[-1] == "":
+ domains = domains[-1:] + domains[:-1]
+ return ".".join(reversed(domains))
+
+ zones = route53_backend.get_all_hosted_zones()
+ zones = sorted(zones, key=sort_key)
+
+ template = Template(LIST_HOSTED_ZONES_BY_NAME_RESPONSE)
+ return 200, headers, template.render(zones=zones)
+
+ def get_or_delete_hostzone_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ zoneid = parsed_url.path.rstrip('/').rsplit('/', 1)[1]
+ the_zone = route53_backend.get_hosted_zone(zoneid)
+ if not the_zone:
+ return 404, headers, "Zone %s not Found" % zoneid
+
+ if request.method == "GET":
+ template = Template(GET_HOSTED_ZONE_RESPONSE)
+
+ return 200, headers, template.render(zone=the_zone)
+ elif request.method == "DELETE":
+ route53_backend.delete_hosted_zone(zoneid)
+ return 200, headers, DELETE_HOSTED_ZONE_RESPONSE
+
+ def rrset_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ method = request.method
+
+ zoneid = parsed_url.path.rstrip('/').rsplit('/', 2)[1]
+ the_zone = route53_backend.get_hosted_zone(zoneid)
+ if not the_zone:
+ return 404, headers, "Zone %s Not Found" % zoneid
+
+ if method == "POST":
+ elements = xmltodict.parse(self.body)
+
+ change_list = elements['ChangeResourceRecordSetsRequest'][
+ 'ChangeBatch']['Changes']['Change']
+ if not isinstance(change_list, list):
+ change_list = [elements['ChangeResourceRecordSetsRequest'][
+ 'ChangeBatch']['Changes']['Change']]
+
+ for value in change_list:
+ action = value['Action']
+ record_set = value['ResourceRecordSet']
+
+ cleaned_record_name = record_set['Name'].strip('.')
+ cleaned_hosted_zone_name = the_zone.name.strip('.')
+
+ if not cleaned_record_name.endswith(cleaned_hosted_zone_name):
+ error_msg = """
+ An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation:
+ RRSet with DNS name %s is not permitted in zone %s
+ """ % (record_set['Name'], the_zone.name)
+ return 400, headers, error_msg
+
+ if not record_set['Name'].endswith('.'):
+ record_set['Name'] += '.'
+
+ if action in ('CREATE', 'UPSERT'):
+ if 'ResourceRecords' in record_set:
+ resource_records = list(
+ record_set['ResourceRecords'].values())[0]
+ if not isinstance(resource_records, list):
+ # Depending on how many records there are, this may
+ # or may not be a list
+ resource_records = [resource_records]
+ record_values = [x['Value'] for x in resource_records]
+ elif 'AliasTarget' in record_set:
+ record_values = [record_set['AliasTarget']['DNSName']]
+ record_set['ResourceRecords'] = record_values
+ if action == 'CREATE':
+ the_zone.add_rrset(record_set)
+ else:
+ the_zone.upsert_rrset(record_set)
+ elif action == "DELETE":
+ if 'SetIdentifier' in record_set:
+ the_zone.delete_rrset_by_id(
+ record_set["SetIdentifier"])
+ else:
+ the_zone.delete_rrset_by_name(record_set["Name"])
+
+ return 200, headers, CHANGE_RRSET_RESPONSE
+
+ elif method == "GET":
+ querystring = parse_qs(parsed_url.query)
+ template = Template(LIST_RRSET_RESPONSE)
+ start_type = querystring.get("type", [None])[0]
+ start_name = querystring.get("name", [None])[0]
+ record_sets = the_zone.get_record_sets(start_type, start_name)
+ return 200, headers, template.render(record_sets=record_sets)
+
+ def health_check_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ method = request.method
+
+ if method == "POST":
+ properties = xmltodict.parse(self.body)['CreateHealthCheckRequest'][
+ 'HealthCheckConfig']
+ health_check_args = {
+ "ip_address": properties.get('IPAddress'),
+ "port": properties.get('Port'),
+ "type": properties['Type'],
+ "resource_path": properties.get('ResourcePath'),
+ "fqdn": properties.get('FullyQualifiedDomainName'),
+ "search_string": properties.get('SearchString'),
+ "request_interval": properties.get('RequestInterval'),
+ "failure_threshold": properties.get('FailureThreshold'),
+ }
+ health_check = route53_backend.create_health_check(
+ health_check_args)
+ template = Template(CREATE_HEALTH_CHECK_RESPONSE)
+ return 201, headers, template.render(health_check=health_check)
+ elif method == "DELETE":
+ health_check_id = parsed_url.path.split("/")[-1]
+ route53_backend.delete_health_check(health_check_id)
+ return 200, headers, DELETE_HEALTH_CHECK_RESPONSE
+ elif method == "GET":
+ template = Template(LIST_HEALTH_CHECKS_RESPONSE)
+ health_checks = route53_backend.get_health_checks()
+ return 200, headers, template.render(health_checks=health_checks)
+
+ def not_implemented_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ action = ''
+ if 'tags' in full_url:
+ action = 'tags'
+ elif 'trafficpolicyinstances' in full_url:
+ action = 'policies'
+ raise NotImplementedError(
+ "The action for {0} has not been implemented for route 53".format(action))
+
+ def list_or_change_tags_for_resource_request(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ id_ = parsed_url.path.split("/")[-1]
+ type_ = parsed_url.path.split("/")[-2]
+
+ if request.method == "GET":
+ tags = route53_backend.list_tags_for_resource(id_)
+ template = Template(LIST_TAGS_FOR_RESOURCE_RESPONSE)
+ return 200, headers, template.render(
+ resource_type=type_, resource_id=id_, tags=tags)
+
+ if request.method == "POST":
+ tags = xmltodict.parse(
+ self.body)['ChangeTagsForResourceRequest']
+
+ if 'AddTags' in tags:
+ tags = tags['AddTags']
+ elif 'RemoveTagKeys' in tags:
+ tags = tags['RemoveTagKeys']
+
+ route53_backend.change_tags_for_resource(id_, tags)
+ template = Template(CHANGE_TAGS_FOR_RESOURCE_RESPONSE)
+
+ return 200, headers, template.render()
+
+
+LIST_TAGS_FOR_RESOURCE_RESPONSE = """
+<ListTagsForResourceResponse xmlns="https://route53.amazonaws.com/doc/2015-01-01/">
+ <ResourceTagSet>
+ <ResourceType>{{resource_type}}</ResourceType>
+ <ResourceId>{{resource_id}}</ResourceId>
+ <Tags>
+ {% for key, value in tags.items() %}
+ <Tag>
+ <Key>{{key}}</Key>
+ <Value>{{value}}</Value>
+ </Tag>
+ {% endfor %}
+ </Tags>
+ </ResourceTagSet>
+</ListTagsForResourceResponse>
+"""
+
+CHANGE_TAGS_FOR_RESOURCE_RESPONSE = """<ChangeTagsForResourceResponse xmlns="https://route53.amazonaws.com/doc/2015-01-01/">
+</ChangeTagsForResourceResponse>
+"""
+
+LIST_RRSET_RESPONSE = """<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ResourceRecordSets>
+ {% for record_set in record_sets %}
+ {{ record_set.to_xml() }}
+ {% endfor %}
+ </ResourceRecordSets>
+</ListResourceRecordSetsResponse>"""
+
+CHANGE_RRSET_RESPONSE = """<ChangeResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ChangeInfo>
+ <Status>INSYNC</Status>
+ <SubmittedAt>2010-09-10T01:36:41.958Z</SubmittedAt>
+ <Id>/change/C2682N5HXP0BZ4</Id>
+ </ChangeInfo>
+</ChangeResourceRecordSetsResponse>"""
+
+DELETE_HOSTED_ZONE_RESPONSE = """<DeleteHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ChangeInfo>
+ </ChangeInfo>
+</DeleteHostedZoneResponse>"""
+
+GET_HOSTED_ZONE_RESPONSE = """<GetHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ zone.private_zone }}</PrivateZone>
+ </Config>
+ </HostedZone>
+ <DelegationSet>
+ <NameServers>
+ <NameServer>moto.test.com</NameServer>
+ </NameServers>
+ </DelegationSet>
+</GetHostedZoneResponse>"""
+
+CREATE_HOSTED_ZONE_RESPONSE = """<CreateHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <ResourceRecordSetCount>0</ResourceRecordSetCount>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ zone.private_zone }}</PrivateZone>
+ </Config>
+ </HostedZone>
+ <DelegationSet>
+ <NameServers>
+ <NameServer>moto.test.com</NameServer>
+ </NameServers>
+ </DelegationSet>
+</CreateHostedZoneResponse>"""
+
+LIST_HOSTED_ZONES_RESPONSE = """<ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZones>
+ {% for zone in zones %}
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ zone.private_zone }}</PrivateZone>
+ </Config>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ </HostedZone>
+ {% endfor %}
+ </HostedZones>
+ <IsTruncated>false</IsTruncated>
+</ListHostedZonesResponse>"""
+
+LIST_HOSTED_ZONES_BY_NAME_RESPONSE = """<ListHostedZonesByNameResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+ <HostedZones>
+ {% for zone in zones %}
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ zone.private_zone }}</PrivateZone>
+ </Config>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ </HostedZone>
+ {% endfor %}
+ </HostedZones>
+ <IsTruncated>false</IsTruncated>
+</ListHostedZonesByNameResponse>"""
+
+CREATE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CreateHealthCheckResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+ {{ health_check.to_xml() }}
+</CreateHealthCheckResponse>"""
+
+LIST_HEALTH_CHECKS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListHealthChecksResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+ <HealthChecks>
+ {% for health_check in health_checks %}
+ {{ health_check.to_xml() }}
+ {% endfor %}
+ </HealthChecks>
+ <IsTruncated>false</IsTruncated>
+ <MaxItems>{{ health_checks|length }}</MaxItems>
+</ListHealthChecksResponse>"""
+
+DELETE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <DeleteHealthCheckResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+</DeleteHealthCheckResponse>"""
diff --git a/contrib/python/moto/py2/moto/route53/urls.py b/contrib/python/moto/py2/moto/route53/urls.py
new file mode 100644
index 0000000000..53abf23a20
--- /dev/null
+++ b/contrib/python/moto/py2/moto/route53/urls.py
@@ -0,0 +1,26 @@
+from __future__ import unicode_literals
+from .responses import Route53
+
+url_bases = [
+ "https?://route53(.*).amazonaws.com",
+]
+
+
+def tag_response1(*args, **kwargs):
+ return Route53().list_or_change_tags_for_resource_request(*args, **kwargs)
+
+
+def tag_response2(*args, **kwargs):
+ return Route53().list_or_change_tags_for_resource_request(*args, **kwargs)
+
+
+url_paths = {
+ '{0}/(?P<api_version>[\d_-]+)/hostedzone$': Route53().list_or_create_hostzone_response,
+ '{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$': Route53().get_or_delete_hostzone_response,
+ '{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$': Route53().rrset_response,
+ '{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname': Route53().list_hosted_zones_by_name_response,
+ '{0}/(?P<api_version>[\d_-]+)/healthcheck': Route53().health_check_response,
+ '{0}/(?P<api_version>[\d_-]+)/tags/healthcheck/(?P<zone_id>[^/]+)$': tag_response1,
+ '{0}/(?P<api_version>[\d_-]+)/tags/hostedzone/(?P<zone_id>[^/]+)$': tag_response2,
+ '{0}/(?P<api_version>[\d_-]+)/trafficpolicyinstances/*': Route53().not_implemented_response
+}
diff --git a/contrib/python/moto/py2/moto/s3/__init__.py b/contrib/python/moto/py2/moto/s3/__init__.py
new file mode 100644
index 0000000000..84c1cbde0a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import unicode_literals
+from .models import s3_backend
+
+s3_backends = {"global": s3_backend}
+mock_s3 = s3_backend.decorator
+mock_s3_deprecated = s3_backend.deprecated_decorator
diff --git a/contrib/python/moto/py2/moto/s3/exceptions.py b/contrib/python/moto/py2/moto/s3/exceptions.py
new file mode 100644
index 0000000000..27c8421110
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/exceptions.py
@@ -0,0 +1,201 @@
+from __future__ import unicode_literals
+from moto.core.exceptions import RESTError
+
+
+ERROR_WITH_BUCKET_NAME = """{% extends 'single_error' %}
+{% block extra %}<BucketName>{{ bucket }}</BucketName>{% endblock %}
+"""
+
+ERROR_WITH_KEY_NAME = """{% extends 'single_error' %}
+{% block extra %}<KeyName>{{ key_name }}</KeyName>{% endblock %}
+"""
+
+
+class S3ClientError(RESTError):
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault('template', 'single_error')
+ self.templates['bucket_error'] = ERROR_WITH_BUCKET_NAME
+ super(S3ClientError, self).__init__(*args, **kwargs)
+
+
+class BucketError(S3ClientError):
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault('template', 'bucket_error')
+ self.templates['bucket_error'] = ERROR_WITH_BUCKET_NAME
+ super(BucketError, self).__init__(*args, **kwargs)
+
+
+class BucketAlreadyExists(BucketError):
+ code = 409
+
+ def __init__(self, *args, **kwargs):
+ super(BucketAlreadyExists, self).__init__(
+ "BucketAlreadyExists",
+ ("The requested bucket name is not available. The bucket "
+ "namespace is shared by all users of the system. Please "
+ "select a different name and try again"),
+ *args, **kwargs)
+
+
+class MissingBucket(BucketError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super(MissingBucket, self).__init__(
+ "NoSuchBucket",
+ "The specified bucket does not exist",
+ *args, **kwargs)
+
+
+class MissingKey(S3ClientError):
+ code = 404
+
+ def __init__(self, key_name):
+ super(MissingKey, self).__init__(
+ "NoSuchKey",
+ "The specified key does not exist.",
+ Key=key_name,
+ )
+
+
+class InvalidPartOrder(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidPartOrder, self).__init__(
+ "InvalidPartOrder",
+ ("The list of parts was not in ascending order. The parts "
+ "list must be specified in order by part number."),
+ *args, **kwargs)
+
+
+class InvalidPart(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidPart, self).__init__(
+ "InvalidPart",
+ ("One or more of the specified parts could not be found. "
+ "The part might not have been uploaded, or the specified "
+ "entity tag might not have matched the part's entity tag."),
+ *args, **kwargs)
+
+
+class EntityTooSmall(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(EntityTooSmall, self).__init__(
+ "EntityTooSmall",
+ "Your proposed upload is smaller than the minimum allowed object size.",
+ *args, **kwargs)
+
+
+class InvalidRequest(S3ClientError):
+ code = 400
+
+ def __init__(self, method, *args, **kwargs):
+ super(InvalidRequest, self).__init__(
+ "InvalidRequest",
+ "Found unsupported HTTP method in CORS config. Unsupported method is {}".format(method),
+ *args, **kwargs)
+
+
+class MalformedXML(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(MalformedXML, self).__init__(
+ "MalformedXML",
+ "The XML you provided was not well-formed or did not validate against our published schema",
+ *args, **kwargs)
+
+
+class MalformedACLError(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(MalformedACLError, self).__init__(
+ "MalformedACLError",
+ "The XML you provided was not well-formed or did not validate against our published schema",
+ *args, **kwargs)
+
+
+class InvalidTargetBucketForLogging(S3ClientError):
+ code = 400
+
+ def __init__(self, msg):
+ super(InvalidTargetBucketForLogging, self).__init__("InvalidTargetBucketForLogging", msg)
+
+
+class CrossLocationLoggingProhibitted(S3ClientError):
+ code = 403
+
+ def __init__(self):
+ super(CrossLocationLoggingProhibitted, self).__init__(
+ "CrossLocationLoggingProhibitted",
+ "Cross S3 location logging not allowed."
+ )
+
+
+class InvalidNotificationARN(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidNotificationARN, self).__init__(
+ "InvalidArgument",
+ "The ARN is not well formed",
+ *args, **kwargs)
+
+
+class InvalidNotificationDestination(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidNotificationDestination, self).__init__(
+ "InvalidArgument",
+ "The notification destination service region is not valid for the bucket location constraint",
+ *args, **kwargs)
+
+
+class InvalidNotificationEvent(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidNotificationEvent, self).__init__(
+ "InvalidArgument",
+ "The event is not supported for notifications",
+ *args, **kwargs)
+
+
+class InvalidStorageClass(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidStorageClass, self).__init__(
+ "InvalidStorageClass",
+ "The storage class you specified is not valid",
+ *args, **kwargs)
+
+
+class InvalidBucketName(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(InvalidBucketName, self).__init__(
+ "InvalidBucketName",
+ "The specified bucket is not valid.",
+ *args, **kwargs
+ )
+
+
+class DuplicateTagKeys(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super(DuplicateTagKeys, self).__init__(
+ "InvalidTag",
+ "Cannot provide multiple Tags with the same key",
+ *args, **kwargs)
diff --git a/contrib/python/moto/py2/moto/s3/models.py b/contrib/python/moto/py2/moto/s3/models.py
new file mode 100644
index 0000000000..a1357a786a
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/models.py
@@ -0,0 +1,997 @@
+from __future__ import unicode_literals
+import os
+import base64
+import datetime
+import hashlib
+import copy
+import itertools
+import codecs
+import random
+import string
+import tempfile
+import sys
+import uuid
+
+import six
+
+from bisect import insort
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, rfc_1123_datetime
+from .exceptions import BucketAlreadyExists, MissingBucket, InvalidBucketName, InvalidPart, \
+ EntityTooSmall, MissingKey, InvalidNotificationDestination, MalformedXML, InvalidStorageClass, DuplicateTagKeys
+from .utils import clean_key_name, _VersionedKeyStore
+
+MAX_BUCKET_NAME_LENGTH = 63
+MIN_BUCKET_NAME_LENGTH = 3
+UPLOAD_ID_BYTES = 43
+UPLOAD_PART_MIN_SIZE = 5242880
+STORAGE_CLASS = ["STANDARD", "REDUCED_REDUNDANCY", "STANDARD_IA", "ONEZONE_IA"]
+DEFAULT_KEY_BUFFER_SIZE = 300 * 1024 * 1024
+DEFAULT_TEXT_ENCODING = sys.getdefaultencoding()
+
+
+class FakeDeleteMarker(BaseModel):
+
+ def __init__(self, key):
+ self.key = key
+ self.name = key.name
+ self.last_modified = datetime.datetime.utcnow()
+ self._version_id = str(uuid.uuid4())
+
+ @property
+ def last_modified_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.last_modified)
+
+ @property
+ def version_id(self):
+ return self._version_id
+
+
+class FakeKey(BaseModel):
+
+ def __init__(self, name, value, storage="STANDARD", etag=None, is_versioned=False, version_id=0,
+ max_buffer_size=DEFAULT_KEY_BUFFER_SIZE):
+ self.name = name
+ self.last_modified = datetime.datetime.utcnow()
+ self.acl = get_canned_acl('private')
+ self.website_redirect_location = None
+ self._storage_class = storage if storage else "STANDARD"
+ self._metadata = {}
+ self._expiry = None
+ self._etag = etag
+ self._version_id = version_id
+ self._is_versioned = is_versioned
+ self._tagging = FakeTagging()
+
+ self._value_buffer = tempfile.SpooledTemporaryFile(max_size=max_buffer_size)
+ self._max_buffer_size = max_buffer_size
+ self.value = value
+
+ @property
+ def version_id(self):
+ return self._version_id
+
+ @property
+ def value(self):
+ self._value_buffer.seek(0)
+ return self._value_buffer.read()
+
+ @value.setter
+ def value(self, new_value):
+ self._value_buffer.seek(0)
+ self._value_buffer.truncate()
+
+ # Hack for working around moto's own unit tests; this probably won't
+ # actually get hit in normal use.
+ if isinstance(new_value, six.text_type):
+ new_value = new_value.encode(DEFAULT_TEXT_ENCODING)
+ self._value_buffer.write(new_value)
+
+ def copy(self, new_name=None):
+ r = copy.deepcopy(self)
+ if new_name is not None:
+ r.name = new_name
+ return r
+
+ def set_metadata(self, metadata, replace=False):
+ if replace:
+ self._metadata = {}
+ self._metadata.update(metadata)
+
+ def set_tagging(self, tagging):
+ self._tagging = tagging
+
+ def set_storage_class(self, storage):
+ if storage is not None and storage not in STORAGE_CLASS:
+ raise InvalidStorageClass(storage=storage)
+ self._storage_class = storage
+
+ def set_acl(self, acl):
+ self.acl = acl
+
+ def append_to_value(self, value):
+ self._value_buffer.seek(0, os.SEEK_END)
+ self._value_buffer.write(value)
+
+ self.last_modified = datetime.datetime.utcnow()
+ self._etag = None # must recalculate etag
+ if self._is_versioned:
+ self._version_id = str(uuid.uuid4())
+ else:
+ self._version_id = None
+
+ def restore(self, days):
+ self._expiry = datetime.datetime.utcnow() + datetime.timedelta(days)
+
+ def refresh_version(self):
+ self._version_id = str(uuid.uuid4())
+ self.last_modified = datetime.datetime.utcnow()
+
+ @property
+ def etag(self):
+ if self._etag is None:
+ value_md5 = hashlib.md5()
+ self._value_buffer.seek(0)
+ while True:
+ block = self._value_buffer.read(DEFAULT_KEY_BUFFER_SIZE)
+ if not block:
+ break
+ value_md5.update(block)
+
+ self._etag = value_md5.hexdigest()
+ return '"{0}"'.format(self._etag)
+
+ @property
+ def last_modified_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.last_modified)
+
+ @property
+ def last_modified_RFC1123(self):
+ # Different datetime formats depending on how the key is obtained
+ # https://github.com/boto/boto/issues/466
+ return rfc_1123_datetime(self.last_modified)
+
+ @property
+ def metadata(self):
+ return self._metadata
+
+ @property
+ def tagging(self):
+ return self._tagging
+
+ @property
+ def response_dict(self):
+ res = {
+ 'ETag': self.etag,
+ 'last-modified': self.last_modified_RFC1123,
+ 'content-length': str(self.size),
+ }
+ if self._storage_class != 'STANDARD':
+ res['x-amz-storage-class'] = self._storage_class
+ if self._expiry is not None:
+ rhdr = 'ongoing-request="false", expiry-date="{0}"'
+ res['x-amz-restore'] = rhdr.format(self.expiry_date)
+
+ if self._is_versioned:
+ res['x-amz-version-id'] = str(self.version_id)
+
+ if self.website_redirect_location:
+ res['x-amz-website-redirect-location'] = self.website_redirect_location
+
+ return res
+
+ @property
+ def size(self):
+ self._value_buffer.seek(0, os.SEEK_END)
+ return self._value_buffer.tell()
+
+ @property
+ def storage_class(self):
+ return self._storage_class
+
+ @property
+ def expiry_date(self):
+ if self._expiry is not None:
+ return self._expiry.strftime("%a, %d %b %Y %H:%M:%S GMT")
+
+ # Keys need to be pickleable due to some implementation details of boto3.
+ # Since file objects aren't pickleable, we need to override the default
+ # behavior. The following is adapted from the Python docs:
+ # https://docs.python.org/3/library/pickle.html#handling-stateful-objects
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ state['value'] = self.value
+ del state['_value_buffer']
+ return state
+
+ def __setstate__(self, state):
+ self.__dict__.update({
+ k: v for k, v in six.iteritems(state)
+ if k != 'value'
+ })
+
+ self._value_buffer = \
+ tempfile.SpooledTemporaryFile(max_size=self._max_buffer_size)
+ self.value = state['value']
+
+
+class FakeMultipart(BaseModel):
+
+ def __init__(self, key_name, metadata):
+ self.key_name = key_name
+ self.metadata = metadata
+ self.parts = {}
+ self.partlist = [] # ordered list of part ID's
+ rand_b64 = base64.b64encode(os.urandom(UPLOAD_ID_BYTES))
+ self.id = rand_b64.decode('utf-8').replace('=', '').replace('+', '')
+
+ def complete(self, body):
+ decode_hex = codecs.getdecoder("hex_codec")
+ total = bytearray()
+ md5s = bytearray()
+
+ last = None
+ count = 0
+ for pn, etag in body:
+ part = self.parts.get(pn)
+ part_etag = None
+ if part is not None:
+ part_etag = part.etag.replace('"', '')
+ etag = etag.replace('"', '')
+ if part is None or part_etag != etag:
+ raise InvalidPart()
+ if last is not None and len(last.value) < UPLOAD_PART_MIN_SIZE:
+ raise EntityTooSmall()
+ md5s.extend(decode_hex(part_etag)[0])
+ total.extend(part.value)
+ last = part
+ count += 1
+
+ etag = hashlib.md5()
+ etag.update(bytes(md5s))
+ return total, "{0}-{1}".format(etag.hexdigest(), count)
+
+ def set_part(self, part_id, value):
+ if part_id < 1:
+ return
+
+ key = FakeKey(part_id, value)
+ self.parts[part_id] = key
+ if part_id not in self.partlist:
+ insort(self.partlist, part_id)
+ return key
+
+ def list_parts(self):
+ for part_id in self.partlist:
+ yield self.parts[part_id]
+
+
+class FakeGrantee(BaseModel):
+
+ def __init__(self, id='', uri='', display_name=''):
+ self.id = id
+ self.uri = uri
+ self.display_name = display_name
+
+ def __eq__(self, other):
+ if not isinstance(other, FakeGrantee):
+ return False
+ return self.id == other.id and self.uri == other.uri and self.display_name == other.display_name
+
+ @property
+ def type(self):
+ return 'Group' if self.uri else 'CanonicalUser'
+
+ def __repr__(self):
+ return "FakeGrantee(display_name: '{}', id: '{}', uri: '{}')".format(self.display_name, self.id, self.uri)
+
+
+ALL_USERS_GRANTEE = FakeGrantee(
+ uri='http://acs.amazonaws.com/groups/global/AllUsers')
+AUTHENTICATED_USERS_GRANTEE = FakeGrantee(
+ uri='http://acs.amazonaws.com/groups/global/AuthenticatedUsers')
+LOG_DELIVERY_GRANTEE = FakeGrantee(
+ uri='http://acs.amazonaws.com/groups/s3/LogDelivery')
+
+PERMISSION_FULL_CONTROL = 'FULL_CONTROL'
+PERMISSION_WRITE = 'WRITE'
+PERMISSION_READ = 'READ'
+PERMISSION_WRITE_ACP = 'WRITE_ACP'
+PERMISSION_READ_ACP = 'READ_ACP'
+
+
+class FakeGrant(BaseModel):
+
+ def __init__(self, grantees, permissions):
+ self.grantees = grantees
+ self.permissions = permissions
+
+ def __repr__(self):
+ return "FakeGrant(grantees: {}, permissions: {})".format(self.grantees, self.permissions)
+
+
+class FakeAcl(BaseModel):
+
+ def __init__(self, grants=[]):
+ self.grants = grants
+
+ @property
+ def public_read(self):
+ for grant in self.grants:
+ if ALL_USERS_GRANTEE in grant.grantees:
+ if PERMISSION_READ in grant.permissions:
+ return True
+ if PERMISSION_FULL_CONTROL in grant.permissions:
+ return True
+ return False
+
+ def __repr__(self):
+ return "FakeAcl(grants: {})".format(self.grants)
+
+
+def get_canned_acl(acl):
+ owner_grantee = FakeGrantee(
+ id='75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a')
+ grants = [FakeGrant([owner_grantee], [PERMISSION_FULL_CONTROL])]
+ if acl == 'private':
+ pass # no other permissions
+ elif acl == 'public-read':
+ grants.append(FakeGrant([ALL_USERS_GRANTEE], [PERMISSION_READ]))
+ elif acl == 'public-read-write':
+ grants.append(FakeGrant([ALL_USERS_GRANTEE], [
+ PERMISSION_READ, PERMISSION_WRITE]))
+ elif acl == 'authenticated-read':
+ grants.append(
+ FakeGrant([AUTHENTICATED_USERS_GRANTEE], [PERMISSION_READ]))
+ elif acl == 'bucket-owner-read':
+ pass # TODO: bucket owner ACL
+ elif acl == 'bucket-owner-full-control':
+ pass # TODO: bucket owner ACL
+ elif acl == 'aws-exec-read':
+ pass # TODO: bucket owner, EC2 Read
+ elif acl == 'log-delivery-write':
+ grants.append(FakeGrant([LOG_DELIVERY_GRANTEE], [
+ PERMISSION_READ_ACP, PERMISSION_WRITE]))
+ else:
+ assert False, 'Unknown canned acl: %s' % (acl,)
+ return FakeAcl(grants=grants)
+
+
+class FakeTagging(BaseModel):
+
+ def __init__(self, tag_set=None):
+ self.tag_set = tag_set or FakeTagSet()
+
+
+class FakeTagSet(BaseModel):
+
+ def __init__(self, tags=None):
+ self.tags = tags or []
+
+
+class FakeTag(BaseModel):
+
+ def __init__(self, key, value=None):
+ self.key = key
+ self.value = value
+
+
+class LifecycleFilter(BaseModel):
+
+ def __init__(self, prefix=None, tag=None, and_filter=None):
+ self.prefix = prefix or ''
+ self.tag = tag
+ self.and_filter = and_filter
+
+
+class LifecycleAndFilter(BaseModel):
+
+ def __init__(self, prefix=None, tags=None):
+ self.prefix = prefix or ''
+ self.tags = tags
+
+
+class LifecycleRule(BaseModel):
+
+ def __init__(self, id=None, prefix=None, lc_filter=None, status=None, expiration_days=None,
+ expiration_date=None, transition_days=None, transition_date=None, storage_class=None,
+ expired_object_delete_marker=None, nve_noncurrent_days=None, nvt_noncurrent_days=None,
+ nvt_storage_class=None, aimu_days=None):
+ self.id = id
+ self.prefix = prefix
+ self.filter = lc_filter
+ self.status = status
+ self.expiration_days = expiration_days
+ self.expiration_date = expiration_date
+ self.transition_days = transition_days
+ self.transition_date = transition_date
+ self.storage_class = storage_class
+ self.expired_object_delete_marker = expired_object_delete_marker
+ self.nve_noncurrent_days = nve_noncurrent_days
+ self.nvt_noncurrent_days = nvt_noncurrent_days
+ self.nvt_storage_class = nvt_storage_class
+ self.aimu_days = aimu_days
+
+
+class CorsRule(BaseModel):
+
+ def __init__(self, allowed_methods, allowed_origins, allowed_headers=None, expose_headers=None,
+ max_age_seconds=None):
+ self.allowed_methods = [allowed_methods] if isinstance(allowed_methods, six.string_types) else allowed_methods
+ self.allowed_origins = [allowed_origins] if isinstance(allowed_origins, six.string_types) else allowed_origins
+ self.allowed_headers = [allowed_headers] if isinstance(allowed_headers, six.string_types) else allowed_headers
+ self.exposed_headers = [expose_headers] if isinstance(expose_headers, six.string_types) else expose_headers
+ self.max_age_seconds = max_age_seconds
+
+
+class Notification(BaseModel):
+
+ def __init__(self, arn, events, filters=None, id=None):
+ self.id = id if id else ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(50))
+ self.arn = arn
+ self.events = events
+ self.filters = filters if filters else {}
+
+
+class NotificationConfiguration(BaseModel):
+
+ def __init__(self, topic=None, queue=None, cloud_function=None):
+ self.topic = [Notification(t["Topic"], t["Event"], filters=t.get("Filter"), id=t.get("Id")) for t in topic] \
+ if topic else []
+ self.queue = [Notification(q["Queue"], q["Event"], filters=q.get("Filter"), id=q.get("Id")) for q in queue] \
+ if queue else []
+ self.cloud_function = [Notification(c["CloudFunction"], c["Event"], filters=c.get("Filter"), id=c.get("Id"))
+ for c in cloud_function] if cloud_function else []
+
+
+class FakeBucket(BaseModel):
+
+ def __init__(self, name, region_name):
+ self.name = name
+ self.region_name = region_name
+ self.keys = _VersionedKeyStore()
+ self.multiparts = {}
+ self.versioning_status = None
+ self.rules = []
+ self.policy = None
+ self.website_configuration = None
+ self.acl = get_canned_acl('private')
+ self.tags = FakeTagging()
+ self.cors = []
+ self.logging = {}
+ self.notification_configuration = None
+
+ @property
+ def location(self):
+ return self.region_name
+
+ @property
+ def is_versioned(self):
+ return self.versioning_status == 'Enabled'
+
+ def set_lifecycle(self, rules):
+ self.rules = []
+ for rule in rules:
+ # Extract and validate actions from Lifecycle rule
+ expiration = rule.get('Expiration')
+ transition = rule.get('Transition')
+
+ nve_noncurrent_days = None
+ if rule.get('NoncurrentVersionExpiration') is not None:
+ if rule["NoncurrentVersionExpiration"].get('NoncurrentDays') is None:
+ raise MalformedXML()
+ nve_noncurrent_days = rule["NoncurrentVersionExpiration"]["NoncurrentDays"]
+
+ nvt_noncurrent_days = None
+ nvt_storage_class = None
+ if rule.get('NoncurrentVersionTransition') is not None:
+ if rule["NoncurrentVersionTransition"].get('NoncurrentDays') is None:
+ raise MalformedXML()
+ if rule["NoncurrentVersionTransition"].get('StorageClass') is None:
+ raise MalformedXML()
+ nvt_noncurrent_days = rule["NoncurrentVersionTransition"]["NoncurrentDays"]
+ nvt_storage_class = rule["NoncurrentVersionTransition"]["StorageClass"]
+
+ aimu_days = None
+ if rule.get('AbortIncompleteMultipartUpload') is not None:
+ if rule["AbortIncompleteMultipartUpload"].get('DaysAfterInitiation') is None:
+ raise MalformedXML()
+ aimu_days = rule["AbortIncompleteMultipartUpload"]["DaysAfterInitiation"]
+
+ eodm = None
+ if expiration and expiration.get("ExpiredObjectDeleteMarker") is not None:
+ # This cannot be set if Date or Days is set:
+ if expiration.get("Days") or expiration.get("Date"):
+ raise MalformedXML()
+ eodm = expiration["ExpiredObjectDeleteMarker"]
+
+ # Pull out the filter:
+ lc_filter = None
+ if rule.get("Filter"):
+ # Can't have both `Filter` and `Prefix` (need to check for the presence of the key):
+ try:
+ if rule["Prefix"] or not rule["Prefix"]:
+ raise MalformedXML()
+ except KeyError:
+ pass
+
+ and_filter = None
+ if rule["Filter"].get("And"):
+ and_tags = []
+ if rule["Filter"]["And"].get("Tag"):
+ if not isinstance(rule["Filter"]["And"]["Tag"], list):
+ rule["Filter"]["And"]["Tag"] = [rule["Filter"]["And"]["Tag"]]
+
+ for t in rule["Filter"]["And"]["Tag"]:
+ and_tags.append(FakeTag(t["Key"], t.get("Value", '')))
+
+ and_filter = LifecycleAndFilter(prefix=rule["Filter"]["And"]["Prefix"], tags=and_tags)
+
+ filter_tag = None
+ if rule["Filter"].get("Tag"):
+ filter_tag = FakeTag(rule["Filter"]["Tag"]["Key"], rule["Filter"]["Tag"].get("Value", ''))
+
+ lc_filter = LifecycleFilter(prefix=rule["Filter"]["Prefix"], tag=filter_tag, and_filter=and_filter)
+
+ self.rules.append(LifecycleRule(
+ id=rule.get('ID'),
+ prefix=rule.get('Prefix'),
+ lc_filter=lc_filter,
+ status=rule['Status'],
+ expiration_days=expiration.get('Days') if expiration else None,
+ expiration_date=expiration.get('Date') if expiration else None,
+ transition_days=transition.get('Days') if transition else None,
+ transition_date=transition.get('Date') if transition else None,
+ storage_class=transition.get('StorageClass') if transition else None,
+ expired_object_delete_marker=eodm,
+ nve_noncurrent_days=nve_noncurrent_days,
+ nvt_noncurrent_days=nvt_noncurrent_days,
+ nvt_storage_class=nvt_storage_class,
+ aimu_days=aimu_days,
+ ))
+
+ def delete_lifecycle(self):
+ self.rules = []
+
+ def set_cors(self, rules):
+ from moto.s3.exceptions import InvalidRequest, MalformedXML
+ self.cors = []
+
+ if len(rules) > 100:
+ raise MalformedXML()
+
+ for rule in rules:
+ assert isinstance(rule["AllowedMethod"], list) or isinstance(rule["AllowedMethod"], six.string_types)
+ assert isinstance(rule["AllowedOrigin"], list) or isinstance(rule["AllowedOrigin"], six.string_types)
+ assert isinstance(rule.get("AllowedHeader", []), list) or isinstance(rule.get("AllowedHeader", ""),
+ six.string_types)
+ assert isinstance(rule.get("ExposedHeader", []), list) or isinstance(rule.get("ExposedHeader", ""),
+ six.string_types)
+ assert isinstance(rule.get("MaxAgeSeconds", "0"), six.string_types)
+
+ if isinstance(rule["AllowedMethod"], six.string_types):
+ methods = [rule["AllowedMethod"]]
+ else:
+ methods = rule["AllowedMethod"]
+
+ for method in methods:
+ if method not in ["GET", "PUT", "HEAD", "POST", "DELETE"]:
+ raise InvalidRequest(method)
+
+ self.cors.append(CorsRule(
+ rule["AllowedMethod"],
+ rule["AllowedOrigin"],
+ rule.get("AllowedHeader"),
+ rule.get("ExposedHeader"),
+ rule.get("MaxAgeSecond")
+ ))
+
+ def delete_cors(self):
+ self.cors = []
+
+ def set_tags(self, tagging):
+ self.tags = tagging
+
+ def delete_tags(self):
+ self.tags = FakeTagging()
+
+ @property
+ def tagging(self):
+ return self.tags
+
+ def set_logging(self, logging_config, bucket_backend):
+ if not logging_config:
+ self.logging = {}
+ return
+
+ from moto.s3.exceptions import InvalidTargetBucketForLogging, CrossLocationLoggingProhibitted
+ # Target bucket must exist in the same account (assuming all moto buckets are in the same account):
+ if not bucket_backend.buckets.get(logging_config["TargetBucket"]):
+ raise InvalidTargetBucketForLogging("The target bucket for logging does not exist.")
+
+ # Does the target bucket have the log-delivery WRITE and READ_ACP permissions?
+ write = read_acp = False
+ for grant in bucket_backend.buckets[logging_config["TargetBucket"]].acl.grants:
+ # Must be granted to: http://acs.amazonaws.com/groups/s3/LogDelivery
+ for grantee in grant.grantees:
+ if grantee.uri == "http://acs.amazonaws.com/groups/s3/LogDelivery":
+ if "WRITE" in grant.permissions or "FULL_CONTROL" in grant.permissions:
+ write = True
+
+ if "READ_ACP" in grant.permissions or "FULL_CONTROL" in grant.permissions:
+ read_acp = True
+
+ break
+
+ if not write or not read_acp:
+ raise InvalidTargetBucketForLogging("You must give the log-delivery group WRITE and READ_ACP"
+ " permissions to the target bucket")
+
+ # Buckets must also exist within the same region:
+ if bucket_backend.buckets[logging_config["TargetBucket"]].region_name != self.region_name:
+ raise CrossLocationLoggingProhibitted()
+
+ # Checks pass -- set the logging config:
+ self.logging = logging_config
+
+ def set_notification_configuration(self, notification_config):
+ if not notification_config:
+ self.notification_configuration = None
+ return
+
+ self.notification_configuration = NotificationConfiguration(
+ topic=notification_config.get("TopicConfiguration"),
+ queue=notification_config.get("QueueConfiguration"),
+ cloud_function=notification_config.get("CloudFunctionConfiguration")
+ )
+
+ # Validate that the region is correct:
+ for thing in ["topic", "queue", "cloud_function"]:
+ for t in getattr(self.notification_configuration, thing):
+ region = t.arn.split(":")[3]
+ if region != self.region_name:
+ raise InvalidNotificationDestination()
+
+ def set_website_configuration(self, website_configuration):
+ self.website_configuration = website_configuration
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+ if attribute_name == 'DomainName':
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "DomainName" ]"')
+ elif attribute_name == 'WebsiteURL':
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "WebsiteURL" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ def set_acl(self, acl):
+ self.acl = acl
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name):
+ bucket = s3_backend.create_bucket(resource_name, region_name)
+ return bucket
+
+
+class S3Backend(BaseBackend):
+
+ def __init__(self):
+ self.buckets = {}
+
+ def create_bucket(self, bucket_name, region_name):
+ if bucket_name in self.buckets:
+ raise BucketAlreadyExists(bucket=bucket_name)
+ if not MIN_BUCKET_NAME_LENGTH <= len(bucket_name) <= MAX_BUCKET_NAME_LENGTH:
+ raise InvalidBucketName()
+ new_bucket = FakeBucket(name=bucket_name, region_name=region_name)
+ self.buckets[bucket_name] = new_bucket
+ return new_bucket
+
+ def get_all_buckets(self):
+ return self.buckets.values()
+
+ def get_bucket(self, bucket_name):
+ try:
+ return self.buckets[bucket_name]
+ except KeyError:
+ raise MissingBucket(bucket=bucket_name)
+
+ def delete_bucket(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ if bucket.keys:
+ # Can't delete a bucket with keys
+ return False
+ else:
+ return self.buckets.pop(bucket_name)
+
+ def set_bucket_versioning(self, bucket_name, status):
+ self.get_bucket(bucket_name).versioning_status = status
+
+ def get_bucket_versioning(self, bucket_name):
+ return self.get_bucket(bucket_name).versioning_status
+
+ def get_bucket_latest_versions(self, bucket_name):
+ versions = self.get_bucket_versions(bucket_name)
+ latest_modified_per_key = {}
+ latest_versions = {}
+
+ for version in versions:
+ name = version.name
+ last_modified = version.last_modified
+ version_id = version.version_id
+ latest_modified_per_key[name] = max(
+ last_modified,
+ latest_modified_per_key.get(name, datetime.datetime.min)
+ )
+ if last_modified == latest_modified_per_key[name]:
+ latest_versions[name] = version_id
+
+ return latest_versions
+
+ def get_bucket_versions(self, bucket_name, delimiter=None,
+ encoding_type=None,
+ key_marker=None,
+ max_keys=None,
+ version_id_marker=None,
+ prefix=''):
+ bucket = self.get_bucket(bucket_name)
+
+ if any((delimiter, encoding_type, key_marker, version_id_marker)):
+ raise NotImplementedError(
+ "Called get_bucket_versions with some of delimiter, encoding_type, key_marker, version_id_marker")
+
+ return itertools.chain(*(l for key, l in bucket.keys.iterlists() if key.startswith(prefix)))
+
+ def get_bucket_policy(self, bucket_name):
+ return self.get_bucket(bucket_name).policy
+
+ def set_bucket_policy(self, bucket_name, policy):
+ self.get_bucket(bucket_name).policy = policy
+
+ def delete_bucket_policy(self, bucket_name, body):
+ bucket = self.get_bucket(bucket_name)
+ bucket.policy = None
+
+ def set_bucket_lifecycle(self, bucket_name, rules):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_lifecycle(rules)
+
+ def set_bucket_website_configuration(self, bucket_name, website_configuration):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_website_configuration(website_configuration)
+
+ def get_bucket_website_configuration(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.website_configuration
+
+ def set_key(self, bucket_name, key_name, value, storage=None, etag=None):
+ key_name = clean_key_name(key_name)
+ if storage is not None and storage not in STORAGE_CLASS:
+ raise InvalidStorageClass(storage=storage)
+
+ bucket = self.get_bucket(bucket_name)
+
+ new_key = FakeKey(
+ name=key_name,
+ value=value,
+ storage=storage,
+ etag=etag,
+ is_versioned=bucket.is_versioned,
+ version_id=str(uuid.uuid4()) if bucket.is_versioned else None)
+
+ keys = [
+ key for key in bucket.keys.getlist(key_name, [])
+ if key.version_id != new_key.version_id
+ ] + [new_key]
+ bucket.keys.setlist(key_name, keys)
+
+ return new_key
+
+ def append_to_key(self, bucket_name, key_name, value):
+ key_name = clean_key_name(key_name)
+
+ key = self.get_key(bucket_name, key_name)
+ key.append_to_value(value)
+ return key
+
+ def get_key(self, bucket_name, key_name, version_id=None):
+ key_name = clean_key_name(key_name)
+ bucket = self.get_bucket(bucket_name)
+ key = None
+
+ if bucket:
+ if version_id is None:
+ if key_name in bucket.keys:
+ key = bucket.keys[key_name]
+ else:
+ for key_version in bucket.keys.getlist(key_name, default=[]):
+ if str(key_version.version_id) == str(version_id):
+ key = key_version
+ break
+
+ if isinstance(key, FakeKey):
+ return key
+ else:
+ return None
+
+ def set_key_tagging(self, bucket_name, key_name, tagging):
+ key = self.get_key(bucket_name, key_name)
+ if key is None:
+ raise MissingKey(key_name)
+ key.set_tagging(tagging)
+ return key
+
+ def put_bucket_tagging(self, bucket_name, tagging):
+ tag_keys = [tag.key for tag in tagging.tag_set.tags]
+ if len(tag_keys) != len(set(tag_keys)):
+ raise DuplicateTagKeys()
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_tags(tagging)
+
+ def delete_bucket_tagging(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.delete_tags()
+
+ def put_bucket_cors(self, bucket_name, cors_rules):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_cors(cors_rules)
+
+ def put_bucket_logging(self, bucket_name, logging_config):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_logging(logging_config, self)
+
+ def delete_bucket_cors(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.delete_cors()
+
+ def put_bucket_notification_configuration(self, bucket_name, notification_config):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_notification_configuration(notification_config)
+
+ def initiate_multipart(self, bucket_name, key_name, metadata):
+ bucket = self.get_bucket(bucket_name)
+ new_multipart = FakeMultipart(key_name, metadata)
+ bucket.multiparts[new_multipart.id] = new_multipart
+
+ return new_multipart
+
+ def complete_multipart(self, bucket_name, multipart_id, body):
+ bucket = self.get_bucket(bucket_name)
+ multipart = bucket.multiparts[multipart_id]
+ value, etag = multipart.complete(body)
+ if value is None:
+ return
+ del bucket.multiparts[multipart_id]
+
+ key = self.set_key(bucket_name, multipart.key_name, value, etag=etag)
+ key.set_metadata(multipart.metadata)
+ return key
+
+ def cancel_multipart(self, bucket_name, multipart_id):
+ bucket = self.get_bucket(bucket_name)
+ del bucket.multiparts[multipart_id]
+
+ def list_multipart(self, bucket_name, multipart_id):
+ bucket = self.get_bucket(bucket_name)
+ return list(bucket.multiparts[multipart_id].list_parts())
+
+ def get_all_multiparts(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.multiparts
+
+ def set_part(self, bucket_name, multipart_id, part_id, value):
+ bucket = self.get_bucket(bucket_name)
+ multipart = bucket.multiparts[multipart_id]
+ return multipart.set_part(part_id, value)
+
+ def copy_part(self, dest_bucket_name, multipart_id, part_id,
+ src_bucket_name, src_key_name, start_byte, end_byte):
+ src_key_name = clean_key_name(src_key_name)
+ src_bucket = self.get_bucket(src_bucket_name)
+ dest_bucket = self.get_bucket(dest_bucket_name)
+ multipart = dest_bucket.multiparts[multipart_id]
+ src_value = src_bucket.keys[src_key_name].value
+ if start_byte is not None:
+ src_value = src_value[start_byte:end_byte + 1]
+ return multipart.set_part(part_id, src_value)
+
+ def prefix_query(self, bucket, prefix, delimiter):
+ key_results = set()
+ folder_results = set()
+ if prefix:
+ for key_name, key in bucket.keys.items():
+ if key_name.startswith(prefix):
+ key_without_prefix = key_name.replace(prefix, "", 1)
+ if delimiter and delimiter in key_without_prefix:
+ # If delimiter, we need to split out folder_results
+ key_without_delimiter = key_without_prefix.split(delimiter)[
+ 0]
+ folder_results.add("{0}{1}{2}".format(
+ prefix, key_without_delimiter, delimiter))
+ else:
+ key_results.add(key)
+ else:
+ for key_name, key in bucket.keys.items():
+ if delimiter and delimiter in key_name:
+ # If delimiter, we need to split out folder_results
+ folder_results.add(key_name.split(
+ delimiter)[0] + delimiter)
+ else:
+ key_results.add(key)
+
+ key_results = filter(lambda key: not isinstance(key, FakeDeleteMarker), key_results)
+ key_results = sorted(key_results, key=lambda key: key.name)
+ folder_results = [folder_name for folder_name in sorted(
+ folder_results, key=lambda key: key)]
+
+ return key_results, folder_results
+
+ def _set_delete_marker(self, bucket_name, key_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.keys[key_name] = FakeDeleteMarker(
+ key=bucket.keys[key_name]
+ )
+
+ def delete_key(self, bucket_name, key_name, version_id=None):
+ key_name = clean_key_name(key_name)
+ bucket = self.get_bucket(bucket_name)
+
+ try:
+ if not bucket.is_versioned:
+ bucket.keys.pop(key_name)
+ else:
+ if version_id is None:
+ self._set_delete_marker(bucket_name, key_name)
+ else:
+ if key_name not in bucket.keys:
+ raise KeyError
+ bucket.keys.setlist(
+ key_name,
+ [
+ key
+ for key in bucket.keys.getlist(key_name)
+ if str(key.version_id) != str(version_id)
+ ]
+ )
+
+ if not bucket.keys.getlist(key_name):
+ bucket.keys.pop(key_name)
+ return True
+ except KeyError:
+ return False
+
+ def copy_key(self, src_bucket_name, src_key_name, dest_bucket_name,
+ dest_key_name, storage=None, acl=None, src_version_id=None):
+ src_key_name = clean_key_name(src_key_name)
+ dest_key_name = clean_key_name(dest_key_name)
+ dest_bucket = self.get_bucket(dest_bucket_name)
+ key = self.get_key(src_bucket_name, src_key_name,
+ version_id=src_version_id)
+ if dest_key_name != src_key_name:
+ key = key.copy(dest_key_name)
+ dest_bucket.keys[dest_key_name] = key
+
+ # By this point, the destination key must exist, or KeyError
+ if dest_bucket.is_versioned:
+ dest_bucket.keys[dest_key_name].refresh_version()
+ if storage is not None:
+ key.set_storage_class(storage)
+ if acl is not None:
+ key.set_acl(acl)
+
+ def set_bucket_acl(self, bucket_name, acl):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_acl(acl)
+
+ def get_bucket_acl(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.acl
+
+
+s3_backend = S3Backend()
diff --git a/contrib/python/moto/py2/moto/s3/responses.py b/contrib/python/moto/py2/moto/s3/responses.py
new file mode 100644
index 0000000000..998beda2cf
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/responses.py
@@ -0,0 +1,1697 @@
+from __future__ import unicode_literals
+
+import re
+
+import six
+from moto.core.utils import str_to_rfc_1123_datetime
+from six.moves.urllib.parse import parse_qs, urlparse, unquote
+
+import xmltodict
+
+from moto.packages.httpretty.core import HTTPrettyRequest
+from moto.core.responses import _TemplateEnvironmentMixin
+from moto.core.utils import path_url
+
+from moto.s3bucket_path.utils import bucket_name_from_url as bucketpath_bucket_name_from_url, \
+ parse_key_name as bucketpath_parse_key_name, is_delete_keys as bucketpath_is_delete_keys
+
+from .exceptions import BucketAlreadyExists, S3ClientError, MissingBucket, MissingKey, InvalidPartOrder, MalformedXML, \
+ MalformedACLError, InvalidNotificationARN, InvalidNotificationEvent
+from .models import s3_backend, get_canned_acl, FakeGrantee, FakeGrant, FakeAcl, FakeKey, FakeTagging, FakeTagSet, \
+ FakeTag
+from .utils import bucket_name_from_url, clean_key_name, metadata_from_headers, parse_region_from_url
+from xml.dom import minidom
+
+
+DEFAULT_REGION_NAME = 'us-east-1'
+
+
+def parse_key_name(pth):
+ return pth.lstrip("/")
+
+
+def is_delete_keys(request, path, bucket_name):
+ return path == u'/?delete' or (
+ path == u'/' and
+ getattr(request, "query_string", "") == "delete"
+ )
+
+
+class ResponseObject(_TemplateEnvironmentMixin):
+
+ def __init__(self, backend):
+ super(ResponseObject, self).__init__()
+ self.backend = backend
+
+ @property
+ def should_autoescape(self):
+ return True
+
+ def all_buckets(self):
+ # No bucket specified. Listing all buckets
+ all_buckets = self.backend.get_all_buckets()
+ template = self.response_template(S3_ALL_BUCKETS)
+ return template.render(buckets=all_buckets)
+
+ def subdomain_based_buckets(self, request):
+ host = request.headers.get('host', request.headers.get('Host'))
+ if not host:
+ host = urlparse(request.url).netloc
+
+ if (not host or host.startswith('localhost') or host.startswith('localstack') or
+ re.match(r'^[^.]+$', host) or re.match(r'^.*\.svc\.cluster\.local$', host)):
+ # Default to path-based buckets for (1) localhost, (2) localstack hosts (e.g. localstack.dev),
+ # (3) local host names that do not contain a "." (e.g., Docker container host names), or
+ # (4) kubernetes host names
+ return False
+
+ match = re.match(r'^([^\[\]:]+)(:\d+)?$', host)
+ if match:
+ match = re.match(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}',
+ match.groups()[0])
+ if match:
+ return False
+
+ match = re.match(r'^\[(.+)\](:\d+)?$', host)
+ if match:
+ match = re.match(
+ r'^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\Z',
+ match.groups()[0], re.IGNORECASE)
+ if match:
+ return False
+
+ path_based = (host == 's3.amazonaws.com' or re.match(
+ r"s3[\.\-]([^.]*)\.amazonaws\.com", host))
+ return not path_based
+
+ def is_delete_keys(self, request, path, bucket_name):
+ if self.subdomain_based_buckets(request):
+ return is_delete_keys(request, path, bucket_name)
+ else:
+ return bucketpath_is_delete_keys(request, path, bucket_name)
+
+ def parse_bucket_name_from_url(self, request, url):
+ if self.subdomain_based_buckets(request):
+ return bucket_name_from_url(url)
+ else:
+ return bucketpath_bucket_name_from_url(url)
+
+ def parse_key_name(self, request, url):
+ if self.subdomain_based_buckets(request):
+ return parse_key_name(url)
+ else:
+ return bucketpath_parse_key_name(url)
+
+ def ambiguous_response(self, request, full_url, headers):
+ # Depending on which calling format the client is using, we don't know
+ # if this is a bucket or key request so we have to check
+ if self.subdomain_based_buckets(request):
+ return self.key_response(request, full_url, headers)
+ else:
+ # Using path-based buckets
+ return self.bucket_response(request, full_url, headers)
+
+ def bucket_response(self, request, full_url, headers):
+ try:
+ response = self._bucket_response(request, full_url, headers)
+ except S3ClientError as s3error:
+ response = s3error.code, {}, s3error.description
+
+ if isinstance(response, six.string_types):
+ return 200, {}, response.encode("utf-8")
+ else:
+ status_code, headers, response_content = response
+ if not isinstance(response_content, six.binary_type):
+ response_content = response_content.encode("utf-8")
+
+ return status_code, headers, response_content
+
+ def _bucket_response(self, request, full_url, headers):
+ parsed_url = urlparse(full_url)
+ querystring = parse_qs(parsed_url.query, keep_blank_values=True)
+ method = request.method
+ region_name = parse_region_from_url(full_url)
+
+ bucket_name = self.parse_bucket_name_from_url(request, full_url)
+ if not bucket_name:
+ # If no bucket specified, list all buckets
+ return self.all_buckets()
+
+ if hasattr(request, 'body'):
+ # Boto
+ body = request.body
+ else:
+ # Flask server
+ body = request.data
+ if body is None:
+ body = b''
+ if isinstance(body, six.binary_type):
+ body = body.decode('utf-8')
+ body = u'{0}'.format(body).encode('utf-8')
+
+ if method == 'HEAD':
+ return self._bucket_response_head(bucket_name, headers)
+ elif method == 'GET':
+ return self._bucket_response_get(bucket_name, querystring, headers)
+ elif method == 'PUT':
+ return self._bucket_response_put(request, body, region_name, bucket_name, querystring, headers)
+ elif method == 'DELETE':
+ return self._bucket_response_delete(body, bucket_name, querystring, headers)
+ elif method == 'POST':
+ return self._bucket_response_post(request, body, bucket_name, headers)
+ else:
+ raise NotImplementedError(
+ "Method {0} has not been impelemented in the S3 backend yet".format(method))
+
+ def _bucket_response_head(self, bucket_name, headers):
+ try:
+ self.backend.get_bucket(bucket_name)
+ except MissingBucket:
+ # Unless we do this, boto3 does not raise ClientError on
+ # HEAD (which the real API responds with), and instead
+ # raises NoSuchBucket, leading to inconsistency in
+ # error response between real and mocked responses.
+ return 404, {}, ""
+ return 200, {}, ""
+
+ def _bucket_response_get(self, bucket_name, querystring, headers):
+ if 'uploads' in querystring:
+ for unsup in ('delimiter', 'max-uploads'):
+ if unsup in querystring:
+ raise NotImplementedError(
+ "Listing multipart uploads with {} has not been implemented yet.".format(unsup))
+ multiparts = list(
+ self.backend.get_all_multiparts(bucket_name).values())
+ if 'prefix' in querystring:
+ prefix = querystring.get('prefix', [None])[0]
+ multiparts = [
+ upload for upload in multiparts if upload.key_name.startswith(prefix)]
+ template = self.response_template(S3_ALL_MULTIPARTS)
+ return template.render(
+ bucket_name=bucket_name,
+ uploads=multiparts)
+ elif 'location' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ template = self.response_template(S3_BUCKET_LOCATION)
+
+ location = bucket.location
+ # us-east-1 is different - returns a None location
+ if location == DEFAULT_REGION_NAME:
+ location = None
+
+ return template.render(location=location)
+ elif 'lifecycle' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if not bucket.rules:
+ template = self.response_template(S3_NO_LIFECYCLE)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(
+ S3_BUCKET_LIFECYCLE_CONFIGURATION)
+ return template.render(rules=bucket.rules)
+ elif 'versioning' in querystring:
+ versioning = self.backend.get_bucket_versioning(bucket_name)
+ template = self.response_template(S3_BUCKET_GET_VERSIONING)
+ return template.render(status=versioning)
+ elif 'policy' in querystring:
+ policy = self.backend.get_bucket_policy(bucket_name)
+ if not policy:
+ template = self.response_template(S3_NO_POLICY)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ return 200, {}, policy
+ elif 'website' in querystring:
+ website_configuration = self.backend.get_bucket_website_configuration(
+ bucket_name)
+ if not website_configuration:
+ template = self.response_template(S3_NO_BUCKET_WEBSITE_CONFIG)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ return 200, {}, website_configuration
+ elif 'acl' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ template = self.response_template(S3_OBJECT_ACL_RESPONSE)
+ return template.render(obj=bucket)
+ elif 'tagging' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ # "Special Error" if no tags:
+ if len(bucket.tagging.tag_set.tags) == 0:
+ template = self.response_template(S3_NO_BUCKET_TAGGING)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_BUCKET_TAGGING_RESPONSE)
+ return template.render(bucket=bucket)
+ elif 'logging' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if not bucket.logging:
+ template = self.response_template(S3_NO_LOGGING_CONFIG)
+ return 200, {}, template.render()
+ template = self.response_template(S3_LOGGING_CONFIG)
+ return 200, {}, template.render(logging=bucket.logging)
+ elif "cors" in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if len(bucket.cors) == 0:
+ template = self.response_template(S3_NO_CORS_CONFIG)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_BUCKET_CORS_RESPONSE)
+ return template.render(bucket=bucket)
+ elif "notification" in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if not bucket.notification_configuration:
+ return 200, {}, ""
+ template = self.response_template(S3_GET_BUCKET_NOTIFICATION_CONFIG)
+ return template.render(bucket=bucket)
+
+ elif 'versions' in querystring:
+ delimiter = querystring.get('delimiter', [None])[0]
+ encoding_type = querystring.get('encoding-type', [None])[0]
+ key_marker = querystring.get('key-marker', [None])[0]
+ max_keys = querystring.get('max-keys', [None])[0]
+ prefix = querystring.get('prefix', [''])[0]
+ version_id_marker = querystring.get('version-id-marker', [None])[0]
+
+ bucket = self.backend.get_bucket(bucket_name)
+ versions = self.backend.get_bucket_versions(
+ bucket_name,
+ delimiter=delimiter,
+ encoding_type=encoding_type,
+ key_marker=key_marker,
+ max_keys=max_keys,
+ version_id_marker=version_id_marker,
+ prefix=prefix
+ )
+ latest_versions = self.backend.get_bucket_latest_versions(
+ bucket_name=bucket_name
+ )
+ key_list = []
+ delete_marker_list = []
+ for version in versions:
+ if isinstance(version, FakeKey):
+ key_list.append(version)
+ else:
+ delete_marker_list.append(version)
+ template = self.response_template(S3_BUCKET_GET_VERSIONS)
+ return 200, {}, template.render(
+ key_list=key_list,
+ delete_marker_list=delete_marker_list,
+ latest_versions=latest_versions,
+ bucket=bucket,
+ prefix='',
+ max_keys=1000,
+ delimiter='',
+ is_truncated='false',
+ )
+ elif querystring.get('list-type', [None])[0] == '2':
+ return 200, {}, self._handle_list_objects_v2(bucket_name, querystring)
+
+ bucket = self.backend.get_bucket(bucket_name)
+ prefix = querystring.get('prefix', [None])[0]
+ if prefix and isinstance(prefix, six.binary_type):
+ prefix = prefix.decode("utf-8")
+ delimiter = querystring.get('delimiter', [None])[0]
+ max_keys = int(querystring.get('max-keys', [1000])[0])
+ marker = querystring.get('marker', [None])[0]
+ result_keys, result_folders = self.backend.prefix_query(
+ bucket, prefix, delimiter)
+
+ if marker:
+ result_keys = self._get_results_from_token(result_keys, marker)
+
+ result_keys, is_truncated, _ = self._truncate_result(result_keys, max_keys)
+
+ template = self.response_template(S3_BUCKET_GET_RESPONSE)
+ return 200, {}, template.render(
+ bucket=bucket,
+ prefix=prefix,
+ delimiter=delimiter,
+ result_keys=result_keys,
+ result_folders=result_folders,
+ is_truncated=is_truncated,
+ max_keys=max_keys
+ )
+
+ def _handle_list_objects_v2(self, bucket_name, querystring):
+ template = self.response_template(S3_BUCKET_GET_RESPONSE_V2)
+ bucket = self.backend.get_bucket(bucket_name)
+
+ prefix = querystring.get('prefix', [None])[0]
+ if prefix and isinstance(prefix, six.binary_type):
+ prefix = prefix.decode("utf-8")
+ delimiter = querystring.get('delimiter', [None])[0]
+ result_keys, result_folders = self.backend.prefix_query(
+ bucket, prefix, delimiter)
+
+ fetch_owner = querystring.get('fetch-owner', [False])[0]
+ max_keys = int(querystring.get('max-keys', [1000])[0])
+ continuation_token = querystring.get('continuation-token', [None])[0]
+ start_after = querystring.get('start-after', [None])[0]
+
+ if continuation_token or start_after:
+ limit = continuation_token or start_after
+ if not delimiter:
+ result_keys = self._get_results_from_token(result_keys, limit)
+ else:
+ result_folders = self._get_results_from_token(result_folders, limit)
+
+ if not delimiter:
+ result_keys, is_truncated, next_continuation_token = self._truncate_result(result_keys, max_keys)
+ else:
+ result_folders, is_truncated, next_continuation_token = self._truncate_result(result_folders, max_keys)
+
+ return template.render(
+ bucket=bucket,
+ prefix=prefix or '',
+ delimiter=delimiter,
+ result_keys=result_keys,
+ result_folders=result_folders,
+ fetch_owner=fetch_owner,
+ max_keys=max_keys,
+ is_truncated=is_truncated,
+ next_continuation_token=next_continuation_token,
+ start_after=None if continuation_token else start_after
+ )
+
+ def _get_results_from_token(self, result_keys, token):
+ continuation_index = 0
+ for key in result_keys:
+ if (key.name if isinstance(key, FakeKey) else key) > token:
+ break
+ continuation_index += 1
+ return result_keys[continuation_index:]
+
+ def _truncate_result(self, result_keys, max_keys):
+ if len(result_keys) > max_keys:
+ is_truncated = 'true'
+ result_keys = result_keys[:max_keys]
+ item = result_keys[-1]
+ next_continuation_token = (item.name if isinstance(item, FakeKey) else item)
+ else:
+ is_truncated = 'false'
+ next_continuation_token = None
+ return result_keys, is_truncated, next_continuation_token
+
+ def _bucket_response_put(self, request, body, region_name, bucket_name, querystring, headers):
+ if not request.headers.get('Content-Length'):
+ return 411, {}, "Content-Length required"
+ if 'versioning' in querystring:
+ ver = re.search('<Status>([A-Za-z]+)</Status>', body.decode())
+ if ver:
+ self.backend.set_bucket_versioning(bucket_name, ver.group(1))
+ template = self.response_template(S3_BUCKET_VERSIONING)
+ return template.render(bucket_versioning_status=ver.group(1))
+ else:
+ return 404, {}, ""
+ elif 'lifecycle' in querystring:
+ configuration = xmltodict.parse(body)['LifecycleConfiguration']
+ if not configuration:
+ # empty LifecycleConfiguration is correct in case
+ # bucket.configure_lifecycle(Lifecycle())
+ # body will be
+ # b'<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration></LifecycleConfiguration>'
+ # and there are no 'Rule'
+ rules = []
+ else:
+ rules = configuration['Rule']
+ if not isinstance(rules, list):
+ # If there is only one rule, xmldict returns just the item
+ rules = [rules]
+ self.backend.set_bucket_lifecycle(bucket_name, rules)
+ return ""
+ elif 'policy' in querystring:
+ self.backend.set_bucket_policy(bucket_name, body)
+ return 'True'
+ elif 'acl' in querystring:
+ # Headers are first. If not set, then look at the body (consistent with the documentation):
+ acls = self._acl_from_headers(request.headers)
+ if not acls:
+ acls = self._acl_from_xml(body)
+ self.backend.set_bucket_acl(bucket_name, acls)
+ return ""
+ elif "tagging" in querystring:
+ tagging = self._bucket_tagging_from_xml(body)
+ self.backend.put_bucket_tagging(bucket_name, tagging)
+ return ""
+ elif 'website' in querystring:
+ self.backend.set_bucket_website_configuration(bucket_name, body)
+ return ""
+ elif "cors" in querystring:
+ try:
+ self.backend.put_bucket_cors(bucket_name, self._cors_from_xml(body))
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ elif "logging" in querystring:
+ try:
+ self.backend.put_bucket_logging(bucket_name, self._logging_from_xml(body))
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ elif "notification" in querystring:
+ try:
+ self.backend.put_bucket_notification_configuration(bucket_name,
+ self._notification_config_from_xml(body))
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ except Exception as e:
+ raise e
+
+ else:
+ if body:
+ # us-east-1, the default AWS region behaves a bit differently
+ # - you should not use it as a location constraint --> it fails
+ # - querying the location constraint returns None
+ try:
+ forced_region = xmltodict.parse(body)['CreateBucketConfiguration']['LocationConstraint']
+
+ if forced_region == DEFAULT_REGION_NAME:
+ raise S3ClientError(
+ 'InvalidLocationConstraint',
+ 'The specified location-constraint is not valid'
+ )
+ else:
+ region_name = forced_region
+ except KeyError:
+ pass
+
+ try:
+ new_bucket = self.backend.create_bucket(
+ bucket_name, region_name)
+ except BucketAlreadyExists:
+ if region_name == DEFAULT_REGION_NAME:
+ # us-east-1 has different behavior
+ new_bucket = self.backend.get_bucket(bucket_name)
+ else:
+ raise
+
+ if 'x-amz-acl' in request.headers:
+ # TODO: Support the XML-based ACL format
+ self.backend.set_bucket_acl(bucket_name, self._acl_from_headers(request.headers))
+
+ template = self.response_template(S3_BUCKET_CREATE_RESPONSE)
+ return 200, {}, template.render(bucket=new_bucket)
+
+ def _bucket_response_delete(self, body, bucket_name, querystring, headers):
+ if 'policy' in querystring:
+ self.backend.delete_bucket_policy(bucket_name, body)
+ return 204, {}, ""
+ elif "tagging" in querystring:
+ self.backend.delete_bucket_tagging(bucket_name)
+ return 204, {}, ""
+ elif "cors" in querystring:
+ self.backend.delete_bucket_cors(bucket_name)
+ return 204, {}, ""
+ elif 'lifecycle' in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ bucket.delete_lifecycle()
+ return 204, {}, ""
+
+ removed_bucket = self.backend.delete_bucket(bucket_name)
+
+ if removed_bucket:
+ # Bucket exists
+ template = self.response_template(S3_DELETE_BUCKET_SUCCESS)
+ return 204, {}, template.render(bucket=removed_bucket)
+ else:
+ # Tried to delete a bucket that still has keys
+ template = self.response_template(
+ S3_DELETE_BUCKET_WITH_ITEMS_ERROR)
+ return 409, {}, template.render(bucket=removed_bucket)
+
+ def _bucket_response_post(self, request, body, bucket_name, headers):
+ if not request.headers.get('Content-Length'):
+ return 411, {}, "Content-Length required"
+
+ if isinstance(request, HTTPrettyRequest):
+ path = request.path
+ else:
+ path = request.full_path if hasattr(request, 'full_path') else path_url(request.url)
+
+ if self.is_delete_keys(request, path, bucket_name):
+ return self._bucket_response_delete_keys(request, body, bucket_name, headers)
+
+ # POST to bucket-url should create file from form
+ if hasattr(request, 'form'):
+ # Not HTTPretty
+ form = request.form
+ else:
+ # HTTPretty, build new form object
+ body = body.decode()
+
+ form = {}
+ for kv in body.split('&'):
+ k, v = kv.split('=')
+ form[k] = v
+
+ key = form['key']
+ if 'file' in form:
+ f = form['file']
+ else:
+ f = request.files['file'].stream.read()
+
+ new_key = self.backend.set_key(bucket_name, key, f)
+
+ # Metadata
+ metadata = metadata_from_headers(form)
+ new_key.set_metadata(metadata)
+
+ return 200, {}, ""
+
+ def _bucket_response_delete_keys(self, request, body, bucket_name, headers):
+ template = self.response_template(S3_DELETE_KEYS_RESPONSE)
+
+ keys = minidom.parseString(body).getElementsByTagName('Key')
+ deleted_names = []
+ error_names = []
+
+ for k in keys:
+ key_name = k.firstChild.nodeValue
+ success = self.backend.delete_key(bucket_name, key_name)
+ if success:
+ deleted_names.append(key_name)
+ else:
+ error_names.append(key_name)
+
+ return 200, {}, template.render(deleted=deleted_names, delete_errors=error_names)
+
+ def _handle_range_header(self, request, headers, response_content):
+ response_headers = {}
+ length = len(response_content)
+ last = length - 1
+ _, rspec = request.headers.get('range').split('=')
+ if ',' in rspec:
+ raise NotImplementedError(
+ "Multiple range specifiers not supported")
+
+ def toint(i):
+ return int(i) if i else None
+
+ begin, end = map(toint, rspec.split('-'))
+ if begin is not None: # byte range
+ end = last if end is None else min(end, last)
+ elif end is not None: # suffix byte range
+ begin = length - min(end, length)
+ end = last
+ else:
+ return 400, response_headers, ""
+ if begin < 0 or end > last or begin > min(end, last):
+ return 416, response_headers, ""
+ response_headers['content-range'] = "bytes {0}-{1}/{2}".format(
+ begin, end, length)
+ return 206, response_headers, response_content[begin:end + 1]
+
+ def key_response(self, request, full_url, headers):
+ response_headers = {}
+ try:
+ response = self._key_response(request, full_url, headers)
+ except S3ClientError as s3error:
+ response = s3error.code, {}, s3error.description
+
+ if isinstance(response, six.string_types):
+ status_code = 200
+ response_content = response
+ else:
+ status_code, response_headers, response_content = response
+
+ if status_code == 200 and 'range' in request.headers:
+ return self._handle_range_header(request, response_headers, response_content)
+ return status_code, response_headers, response_content
+
+ def _key_response(self, request, full_url, headers):
+ parsed_url = urlparse(full_url)
+ query = parse_qs(parsed_url.query, keep_blank_values=True)
+ method = request.method
+
+ key_name = self.parse_key_name(request, parsed_url.path)
+ bucket_name = self.parse_bucket_name_from_url(request, full_url)
+
+ # Because we patch the requests library the boto/boto3 API
+ # requests go through this method but so do
+ # `requests.get("https://bucket-name.s3.amazonaws.com/file-name")`
+ # Here we deny public access to private files by checking the
+ # ACL and checking for the mere presence of an Authorization
+ # header.
+ if 'Authorization' not in request.headers:
+ if hasattr(request, 'url'):
+ signed_url = 'Signature=' in request.url
+ elif hasattr(request, 'requestline'):
+ signed_url = 'Signature=' in request.path
+ key = self.backend.get_key(bucket_name, key_name)
+
+ if key:
+ if not key.acl.public_read and not signed_url:
+ return 403, {}, ""
+
+ if hasattr(request, 'body'):
+ # Boto
+ body = request.body
+ if hasattr(body, 'read'):
+ body = body.read()
+ else:
+ # Flask server
+ body = request.data
+ if body is None:
+ body = b''
+
+ if method == 'GET':
+ return self._key_response_get(bucket_name, query, key_name, headers)
+ elif method == 'PUT':
+ return self._key_response_put(request, body, bucket_name, query, key_name, headers)
+ elif method == 'HEAD':
+ return self._key_response_head(bucket_name, query, key_name, headers=request.headers)
+ elif method == 'DELETE':
+ return self._key_response_delete(bucket_name, query, key_name, headers)
+ elif method == 'POST':
+ return self._key_response_post(request, body, bucket_name, query, key_name, headers)
+ else:
+ raise NotImplementedError(
+ "Method {0} has not been implemented in the S3 backend yet".format(method))
+
+ def _key_response_get(self, bucket_name, query, key_name, headers):
+ response_headers = {}
+ if query.get('uploadId'):
+ upload_id = query['uploadId'][0]
+ parts = self.backend.list_multipart(bucket_name, upload_id)
+ template = self.response_template(S3_MULTIPART_LIST_RESPONSE)
+ return 200, response_headers, template.render(
+ bucket_name=bucket_name,
+ key_name=key_name,
+ upload_id=upload_id,
+ count=len(parts),
+ parts=parts
+ )
+ version_id = query.get('versionId', [None])[0]
+ key = self.backend.get_key(
+ bucket_name, key_name, version_id=version_id)
+ if key is None:
+ raise MissingKey(key_name)
+ if 'acl' in query:
+ template = self.response_template(S3_OBJECT_ACL_RESPONSE)
+ return 200, response_headers, template.render(obj=key)
+ if 'tagging' in query:
+ template = self.response_template(S3_OBJECT_TAGGING_RESPONSE)
+ return 200, response_headers, template.render(obj=key)
+
+ response_headers.update(key.metadata)
+ response_headers.update(key.response_dict)
+ return 200, response_headers, key.value
+
+ def _key_response_put(self, request, body, bucket_name, query, key_name, headers):
+ response_headers = {}
+ if query.get('uploadId') and query.get('partNumber'):
+ upload_id = query['uploadId'][0]
+ part_number = int(query['partNumber'][0])
+ if 'x-amz-copy-source' in request.headers:
+ src = unquote(request.headers.get("x-amz-copy-source")).lstrip("/")
+ src_bucket, src_key = src.split("/", 1)
+ src_range = request.headers.get(
+ 'x-amz-copy-source-range', '').split("bytes=")[-1]
+
+ try:
+ start_byte, end_byte = src_range.split("-")
+ start_byte, end_byte = int(start_byte), int(end_byte)
+ except ValueError:
+ start_byte, end_byte = None, None
+
+ key = self.backend.copy_part(
+ bucket_name, upload_id, part_number, src_bucket,
+ src_key, start_byte, end_byte)
+ template = self.response_template(S3_MULTIPART_UPLOAD_RESPONSE)
+ response = template.render(part=key)
+ else:
+ key = self.backend.set_part(
+ bucket_name, upload_id, part_number, body)
+ response = ""
+ response_headers.update(key.response_dict)
+ return 200, response_headers, response
+
+ storage_class = request.headers.get('x-amz-storage-class', 'STANDARD')
+ acl = self._acl_from_headers(request.headers)
+ if acl is None:
+ acl = self.backend.get_bucket(bucket_name).acl
+ tagging = self._tagging_from_headers(request.headers)
+
+ if 'acl' in query:
+ key = self.backend.get_key(bucket_name, key_name)
+ # TODO: Support the XML-based ACL format
+ key.set_acl(acl)
+ return 200, response_headers, ""
+
+ if 'tagging' in query:
+ tagging = self._tagging_from_xml(body)
+ self.backend.set_key_tagging(bucket_name, key_name, tagging)
+ return 200, response_headers, ""
+
+ if 'x-amz-copy-source' in request.headers:
+ # Copy key
+ # you can have a quoted ?version=abc with a version Id, so work on
+ # we need to parse the unquoted string first
+ src_key = clean_key_name(request.headers.get("x-amz-copy-source"))
+ if isinstance(src_key, six.binary_type):
+ src_key = src_key.decode('utf-8')
+ src_key_parsed = urlparse(src_key)
+ src_bucket, src_key = unquote(src_key_parsed.path).\
+ lstrip("/").split("/", 1)
+ src_version_id = parse_qs(src_key_parsed.query).get(
+ 'versionId', [None])[0]
+ self.backend.copy_key(src_bucket, src_key, bucket_name, key_name,
+ storage=storage_class, acl=acl, src_version_id=src_version_id)
+ new_key = self.backend.get_key(bucket_name, key_name)
+ mdirective = request.headers.get('x-amz-metadata-directive')
+ if mdirective is not None and mdirective == 'REPLACE':
+ metadata = metadata_from_headers(request.headers)
+ new_key.set_metadata(metadata, replace=True)
+ template = self.response_template(S3_OBJECT_COPY_RESPONSE)
+ response_headers.update(new_key.response_dict)
+ return 200, response_headers, template.render(key=new_key)
+ streaming_request = hasattr(request, 'streaming') and request.streaming
+ closing_connection = headers.get('connection') == 'close'
+ if closing_connection and streaming_request:
+ # Closing the connection of a streaming request. No more data
+ new_key = self.backend.get_key(bucket_name, key_name)
+ elif streaming_request:
+ # Streaming request, more data
+ new_key = self.backend.append_to_key(bucket_name, key_name, body)
+ else:
+ # Initial data
+ new_key = self.backend.set_key(bucket_name, key_name, body,
+ storage=storage_class)
+ request.streaming = True
+ metadata = metadata_from_headers(request.headers)
+ new_key.set_metadata(metadata)
+ new_key.set_acl(acl)
+ new_key.website_redirect_location = request.headers.get('x-amz-website-redirect-location')
+ new_key.set_tagging(tagging)
+
+ template = self.response_template(S3_OBJECT_RESPONSE)
+ response_headers.update(new_key.response_dict)
+ return 200, response_headers, template.render(key=new_key)
+
+ def _key_response_head(self, bucket_name, query, key_name, headers):
+ response_headers = {}
+ version_id = query.get('versionId', [None])[0]
+
+ if_modified_since = headers.get('If-Modified-Since', None)
+ if if_modified_since:
+ if_modified_since = str_to_rfc_1123_datetime(if_modified_since)
+
+ key = self.backend.get_key(
+ bucket_name, key_name, version_id=version_id)
+ if key:
+ response_headers.update(key.metadata)
+ response_headers.update(key.response_dict)
+
+ if if_modified_since and key.last_modified < if_modified_since:
+ return 304, response_headers, 'Not Modified'
+ else:
+ return 200, response_headers, ""
+ else:
+ return 404, response_headers, ""
+
+ def _acl_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+ if not parsed_xml.get("AccessControlPolicy"):
+ raise MalformedACLError()
+
+ # The owner is needed for some reason...
+ if not parsed_xml["AccessControlPolicy"].get("Owner"):
+ # TODO: Validate that the Owner is actually correct.
+ raise MalformedACLError()
+
+ # If empty, then no ACLs:
+ if parsed_xml["AccessControlPolicy"].get("AccessControlList") is None:
+ return []
+
+ if not parsed_xml["AccessControlPolicy"]["AccessControlList"].get("Grant"):
+ raise MalformedACLError()
+
+ permissions = [
+ "READ",
+ "WRITE",
+ "READ_ACP",
+ "WRITE_ACP",
+ "FULL_CONTROL"
+ ]
+
+ if not isinstance(parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"], list):
+ parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"] = \
+ [parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"]]
+
+ grants = self._get_grants_from_xml(parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"],
+ MalformedACLError, permissions)
+ return FakeAcl(grants)
+
+ def _get_grants_from_xml(self, grant_list, exception_type, permissions):
+ grants = []
+ for grant in grant_list:
+ if grant.get("Permission", "") not in permissions:
+ raise exception_type()
+
+ if grant["Grantee"].get("@xsi:type", "") not in ["CanonicalUser", "AmazonCustomerByEmail", "Group"]:
+ raise exception_type()
+
+ # TODO: Verify that the proper grantee data is supplied based on the type.
+
+ grants.append(FakeGrant(
+ [FakeGrantee(id=grant["Grantee"].get("ID", ""), display_name=grant["Grantee"].get("DisplayName", ""),
+ uri=grant["Grantee"].get("URI", ""))],
+ [grant["Permission"]])
+ )
+
+ return grants
+
+ def _acl_from_headers(self, headers):
+ canned_acl = headers.get('x-amz-acl', '')
+ if canned_acl:
+ return get_canned_acl(canned_acl)
+
+ grants = []
+ for header, value in headers.items():
+ if not header.startswith('x-amz-grant-'):
+ continue
+
+ permission = {
+ 'read': 'READ',
+ 'write': 'WRITE',
+ 'read-acp': 'READ_ACP',
+ 'write-acp': 'WRITE_ACP',
+ 'full-control': 'FULL_CONTROL',
+ }[header[len('x-amz-grant-'):]]
+
+ grantees = []
+ for key_and_value in value.split(","):
+ key, value = re.match(
+ '([^=]+)="([^"]+)"', key_and_value.strip()).groups()
+ if key.lower() == 'id':
+ grantees.append(FakeGrantee(id=value))
+ else:
+ grantees.append(FakeGrantee(uri=value))
+ grants.append(FakeGrant(grantees, [permission]))
+
+ if grants:
+ return FakeAcl(grants)
+ else:
+ return None
+
+ def _tagging_from_headers(self, headers):
+ if headers.get('x-amz-tagging'):
+ parsed_header = parse_qs(headers['x-amz-tagging'], keep_blank_values=True)
+ tags = []
+ for tag in parsed_header.items():
+ tags.append(FakeTag(tag[0], tag[1][0]))
+
+ tag_set = FakeTagSet(tags)
+ tagging = FakeTagging(tag_set)
+ return tagging
+ else:
+ return FakeTagging()
+
+ def _tagging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml, force_list={'Tag': True})
+
+ tags = []
+ for tag in parsed_xml['Tagging']['TagSet']['Tag']:
+ tags.append(FakeTag(tag['Key'], tag['Value']))
+
+ tag_set = FakeTagSet(tags)
+ tagging = FakeTagging(tag_set)
+ return tagging
+
+ def _bucket_tagging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ tags = []
+ # Optional if no tags are being sent:
+ if parsed_xml['Tagging'].get('TagSet'):
+ # If there is only 1 tag, then it's not a list:
+ if not isinstance(parsed_xml['Tagging']['TagSet']['Tag'], list):
+ tags.append(FakeTag(parsed_xml['Tagging']['TagSet']['Tag']['Key'],
+ parsed_xml['Tagging']['TagSet']['Tag']['Value']))
+ else:
+ for tag in parsed_xml['Tagging']['TagSet']['Tag']:
+ tags.append(FakeTag(tag['Key'], tag['Value']))
+
+ tag_set = FakeTagSet(tags)
+ tagging = FakeTagging(tag_set)
+ return tagging
+
+ def _cors_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if isinstance(parsed_xml["CORSConfiguration"]["CORSRule"], list):
+ return [cors for cors in parsed_xml["CORSConfiguration"]["CORSRule"]]
+
+ return [parsed_xml["CORSConfiguration"]["CORSRule"]]
+
+ def _logging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if not parsed_xml["BucketLoggingStatus"].get("LoggingEnabled"):
+ return {}
+
+ if not parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetBucket"):
+ raise MalformedXML()
+
+ if not parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetPrefix"):
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetPrefix"] = ""
+
+ # Get the ACLs:
+ if parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetGrants"):
+ permissions = [
+ "READ",
+ "WRITE",
+ "FULL_CONTROL"
+ ]
+ if not isinstance(parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"]["Grant"], list):
+ target_grants = self._get_grants_from_xml(
+ [parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"]["Grant"]],
+ MalformedXML,
+ permissions
+ )
+ else:
+ target_grants = self._get_grants_from_xml(
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"]["Grant"],
+ MalformedXML,
+ permissions
+ )
+
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"] = target_grants
+
+ return parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]
+
+ def _notification_config_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if not len(parsed_xml["NotificationConfiguration"]):
+ return {}
+
+ # The types of notifications, and their required fields (apparently lambda is categorized by the API as
+ # "CloudFunction"):
+ notification_fields = [
+ ("Topic", "sns"),
+ ("Queue", "sqs"),
+ ("CloudFunction", "lambda")
+ ]
+
+ event_names = [
+ 's3:ReducedRedundancyLostObject',
+ 's3:ObjectCreated:*',
+ 's3:ObjectCreated:Put',
+ 's3:ObjectCreated:Post',
+ 's3:ObjectCreated:Copy',
+ 's3:ObjectCreated:CompleteMultipartUpload',
+ 's3:ObjectRemoved:*',
+ 's3:ObjectRemoved:Delete',
+ 's3:ObjectRemoved:DeleteMarkerCreated'
+ ]
+
+ found_notifications = 0 # Tripwire -- if this is not ever set, then there were no notifications
+ for name, arn_string in notification_fields:
+ # 1st verify that the proper notification configuration has been passed in (with an ARN that is close
+ # to being correct -- nothing too complex in the ARN logic):
+ the_notification = parsed_xml["NotificationConfiguration"].get("{}Configuration".format(name))
+ if the_notification:
+ found_notifications += 1
+ if not isinstance(the_notification, list):
+ the_notification = parsed_xml["NotificationConfiguration"]["{}Configuration".format(name)] \
+ = [the_notification]
+
+ for n in the_notification:
+ if not n[name].startswith("arn:aws:{}:".format(arn_string)):
+ raise InvalidNotificationARN()
+
+ # 2nd, verify that the Events list is correct:
+ assert n["Event"]
+ if not isinstance(n["Event"], list):
+ n["Event"] = [n["Event"]]
+
+ for event in n["Event"]:
+ if event not in event_names:
+ raise InvalidNotificationEvent()
+
+ # Parse out the filters:
+ if n.get("Filter"):
+ # Error if S3Key is blank:
+ if not n["Filter"]["S3Key"]:
+ raise KeyError()
+
+ if not isinstance(n["Filter"]["S3Key"]["FilterRule"], list):
+ n["Filter"]["S3Key"]["FilterRule"] = [n["Filter"]["S3Key"]["FilterRule"]]
+
+ for filter_rule in n["Filter"]["S3Key"]["FilterRule"]:
+ assert filter_rule["Name"] in ["suffix", "prefix"]
+ assert filter_rule["Value"]
+
+ if not found_notifications:
+ return {}
+
+ return parsed_xml["NotificationConfiguration"]
+
+ def _key_response_delete(self, bucket_name, query, key_name, headers):
+ if query.get('uploadId'):
+ upload_id = query['uploadId'][0]
+ self.backend.cancel_multipart(bucket_name, upload_id)
+ return 204, {}, ""
+ version_id = query.get('versionId', [None])[0]
+ self.backend.delete_key(bucket_name, key_name, version_id=version_id)
+ template = self.response_template(S3_DELETE_OBJECT_SUCCESS)
+ return 204, {}, template.render()
+
+ def _complete_multipart_body(self, body):
+ ps = minidom.parseString(body).getElementsByTagName('Part')
+ prev = 0
+ for p in ps:
+ pn = int(p.getElementsByTagName(
+ 'PartNumber')[0].firstChild.wholeText)
+ if pn <= prev:
+ raise InvalidPartOrder()
+ yield (pn, p.getElementsByTagName('ETag')[0].firstChild.wholeText)
+
+ def _key_response_post(self, request, body, bucket_name, query, key_name, headers):
+ if body == b'' and 'uploads' in query:
+ metadata = metadata_from_headers(request.headers)
+ multipart = self.backend.initiate_multipart(
+ bucket_name, key_name, metadata)
+
+ template = self.response_template(S3_MULTIPART_INITIATE_RESPONSE)
+ response = template.render(
+ bucket_name=bucket_name,
+ key_name=key_name,
+ upload_id=multipart.id,
+ )
+ return 200, {}, response
+
+ if query.get('uploadId'):
+ body = self._complete_multipart_body(body)
+ upload_id = query['uploadId'][0]
+ key = self.backend.complete_multipart(bucket_name, upload_id, body)
+ template = self.response_template(S3_MULTIPART_COMPLETE_RESPONSE)
+ return template.render(
+ bucket_name=bucket_name,
+ key_name=key.name,
+ etag=key.etag,
+ )
+ elif 'restore' in query:
+ es = minidom.parseString(body).getElementsByTagName('Days')
+ days = es[0].childNodes[0].wholeText
+ key = self.backend.get_key(bucket_name, key_name)
+ r = 202
+ if key.expiry_date is not None:
+ r = 200
+ key.restore(int(days))
+ return r, {}, ""
+ else:
+ raise NotImplementedError(
+ "Method POST had only been implemented for multipart uploads and restore operations, so far")
+
+
+S3ResponseInstance = ResponseObject(s3_backend)
+
+S3_ALL_BUCKETS = """<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <Owner>
+ <ID>bcaf1ffd86f41161ca5fb16fd081034f</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <Buckets>
+ {% for bucket in buckets %}
+ <Bucket>
+ <Name>{{ bucket.name }}</Name>
+ <CreationDate>2006-02-03T16:45:09.000Z</CreationDate>
+ </Bucket>
+ {% endfor %}
+ </Buckets>
+</ListAllMyBucketsResult>"""
+
+S3_BUCKET_GET_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Name>{{ bucket.name }}</Name>
+ <Prefix>{{ prefix }}</Prefix>
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ <Delimiter>{{ delimiter }}</Delimiter>
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ {% for key in result_keys %}
+ <Contents>
+ <Key>{{ key.name }}</Key>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </Contents>
+ {% endfor %}
+ {% if delimiter %}
+ {% for folder in result_folders %}
+ <CommonPrefixes>
+ <Prefix>{{ folder }}</Prefix>
+ </CommonPrefixes>
+ {% endfor %}
+ {% endif %}
+ </ListBucketResult>"""
+
+S3_BUCKET_GET_RESPONSE_V2 = """<?xml version="1.0" encoding="UTF-8"?>
+<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Name>{{ bucket.name }}</Name>
+ <Prefix>{{ prefix }}</Prefix>
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ <KeyCount>{{ result_keys | length }}</KeyCount>
+{% if delimiter %}
+ <Delimiter>{{ delimiter }}</Delimiter>
+{% endif %}
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+{% if next_continuation_token %}
+ <NextContinuationToken>{{ next_continuation_token }}</NextContinuationToken>
+{% endif %}
+{% if start_after %}
+ <StartAfter>{{ start_after }}</StartAfter>
+{% endif %}
+ {% for key in result_keys %}
+ <Contents>
+ <Key>{{ key.name }}</Key>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ {% if fetch_owner %}
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ {% endif %}
+ </Contents>
+ {% endfor %}
+ {% if delimiter %}
+ {% for folder in result_folders %}
+ <CommonPrefixes>
+ <Prefix>{{ folder }}</Prefix>
+ </CommonPrefixes>
+ {% endfor %}
+ {% endif %}
+ </ListBucketResult>"""
+
+S3_BUCKET_CREATE_RESPONSE = """<CreateBucketResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <CreateBucketResponse>
+ <Bucket>{{ bucket.name }}</Bucket>
+ </CreateBucketResponse>
+</CreateBucketResponse>"""
+
+S3_DELETE_BUCKET_SUCCESS = """<DeleteBucketResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <DeleteBucketResponse>
+ <Code>204</Code>
+ <Description>No Content</Description>
+ </DeleteBucketResponse>
+</DeleteBucketResponse>"""
+
+S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
+<Error><Code>BucketNotEmpty</Code>
+<Message>The bucket you tried to delete is not empty</Message>
+<BucketName>{{ bucket.name }}</BucketName>
+<RequestId>asdfasdfsdafds</RequestId>
+<HostId>sdfgdsfgdsfgdfsdsfgdfs</HostId>
+</Error>"""
+
+S3_BUCKET_LOCATION = """<?xml version="1.0" encoding="UTF-8"?>
+<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">{% if location != None %}{{ location }}{% endif %}</LocationConstraint>"""
+
+S3_BUCKET_LIFECYCLE_CONFIGURATION = """<?xml version="1.0" encoding="UTF-8"?>
+<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ {% for rule in rules %}
+ <Rule>
+ <ID>{{ rule.id }}</ID>
+ {% if rule.filter %}
+ <Filter>
+ <Prefix>{{ rule.filter.prefix }}</Prefix>
+ {% if rule.filter.tag %}
+ <Tag>
+ <Key>{{ rule.filter.tag.key }}</Key>
+ <Value>{{ rule.filter.tag.value }}</Value>
+ </Tag>
+ {% endif %}
+ {% if rule.filter.and_filter %}
+ <And>
+ <Prefix>{{ rule.filter.and_filter.prefix }}</Prefix>
+ {% for tag in rule.filter.and_filter.tags %}
+ <Tag>
+ <Key>{{ tag.key }}</Key>
+ <Value>{{ tag.value }}</Value>
+ </Tag>
+ {% endfor %}
+ </And>
+ {% endif %}
+ </Filter>
+ {% else %}
+ <Prefix>{{ rule.prefix if rule.prefix != None }}</Prefix>
+ {% endif %}
+ <Status>{{ rule.status }}</Status>
+ {% if rule.storage_class %}
+ <Transition>
+ {% if rule.transition_days %}
+ <Days>{{ rule.transition_days }}</Days>
+ {% endif %}
+ {% if rule.transition_date %}
+ <Date>{{ rule.transition_date }}</Date>
+ {% endif %}
+ <StorageClass>{{ rule.storage_class }}</StorageClass>
+ </Transition>
+ {% endif %}
+ {% if rule.expiration_days or rule.expiration_date or rule.expired_object_delete_marker %}
+ <Expiration>
+ {% if rule.expiration_days %}
+ <Days>{{ rule.expiration_days }}</Days>
+ {% endif %}
+ {% if rule.expiration_date %}
+ <Date>{{ rule.expiration_date }}</Date>
+ {% endif %}
+ {% if rule.expired_object_delete_marker %}
+ <ExpiredObjectDeleteMarker>{{ rule.expired_object_delete_marker }}</ExpiredObjectDeleteMarker>
+ {% endif %}
+ </Expiration>
+ {% endif %}
+ {% if rule.nvt_noncurrent_days and rule.nvt_storage_class %}
+ <NoncurrentVersionTransition>
+ <NoncurrentDays>{{ rule.nvt_noncurrent_days }}</NoncurrentDays>
+ <StorageClass>{{ rule.nvt_storage_class }}</StorageClass>
+ </NoncurrentVersionTransition>
+ {% endif %}
+ {% if rule.nve_noncurrent_days %}
+ <NoncurrentVersionExpiration>
+ <NoncurrentDays>{{ rule.nve_noncurrent_days }}</NoncurrentDays>
+ </NoncurrentVersionExpiration>
+ {% endif %}
+ {% if rule.aimu_days %}
+ <AbortIncompleteMultipartUpload>
+ <DaysAfterInitiation>{{ rule.aimu_days }}</DaysAfterInitiation>
+ </AbortIncompleteMultipartUpload>
+ {% endif %}
+ </Rule>
+ {% endfor %}
+</LifecycleConfiguration>
+"""
+
+S3_BUCKET_VERSIONING = """<?xml version="1.0" encoding="UTF-8"?>
+<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Status>{{ bucket_versioning_status }}</Status>
+</VersioningConfiguration>
+"""
+
+S3_BUCKET_GET_VERSIONING = """<?xml version="1.0" encoding="UTF-8"?>
+{% if status is none %}
+ <VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>
+{% else %}
+ <VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Status>{{ status }}</Status>
+ </VersioningConfiguration>
+{% endif %}
+"""
+
+S3_BUCKET_GET_VERSIONS = """<?xml version="1.0" encoding="UTF-8"?>
+<ListVersionsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <Name>{{ bucket.name }}</Name>
+ <Prefix>{{ prefix }}</Prefix>
+ <KeyMarker>{{ key_marker }}</KeyMarker>
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ {% for key in key_list %}
+ <Version>
+ <Key>{{ key.name }}</Key>
+ <VersionId>{% if key.version_id is none %}null{% else %}{{ key.version_id }}{% endif %}</VersionId>
+ <IsLatest>{% if latest_versions[key.name] == key.version_id %}true{% else %}false{% endif %}</IsLatest>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </Version>
+ {% endfor %}
+ {% for marker in delete_marker_list %}
+ <DeleteMarker>
+ <Key>{{ marker.name }}</Key>
+ <VersionId>{{ marker.version_id }}</VersionId>
+ <IsLatest>{% if latest_versions[marker.name] == marker.version_id %}true{% else %}false{% endif %}</IsLatest>
+ <LastModified>{{ marker.last_modified_ISO8601 }}</LastModified>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </DeleteMarker>
+ {% endfor %}
+</ListVersionsResult>
+"""
+
+S3_DELETE_KEYS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<DeleteResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+{% for k in deleted %}
+<Deleted>
+<Key>{{k}}</Key>
+</Deleted>
+{% endfor %}
+{% for k in delete_errors %}
+<Error>
+<Key>{{k}}</Key>
+</Error>
+{% endfor %}
+</DeleteResult>"""
+
+S3_DELETE_OBJECT_SUCCESS = """<DeleteObjectResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <DeleteObjectResponse>
+ <Code>200</Code>
+ <Description>OK</Description>
+ </DeleteObjectResponse>
+</DeleteObjectResponse>"""
+
+S3_OBJECT_RESPONSE = """<PutObjectResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <PutObjectResponse>
+ <ETag>{{ key.etag }}</ETag>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ </PutObjectResponse>
+ </PutObjectResponse>"""
+
+S3_OBJECT_ACL_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <AccessControlList>
+ {% for grant in obj.acl.grants %}
+ <Grant>
+ {% for grantee in grant.grantees %}
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="{{ grantee.type }}">
+ {% if grantee.uri %}
+ <URI>{{ grantee.uri }}</URI>
+ {% endif %}
+ {% if grantee.id %}
+ <ID>{{ grantee.id }}</ID>
+ {% endif %}
+ {% if grantee.display_name %}
+ <DisplayName>{{ grantee.display_name }}</DisplayName>
+ {% endif %}
+ </Grantee>
+ {% endfor %}
+ {% for permission in grant.permissions %}
+ <Permission>{{ permission }}</Permission>
+ {% endfor %}
+ </Grant>
+ {% endfor %}
+ </AccessControlList>
+ </AccessControlPolicy>"""
+
+S3_OBJECT_TAGGING_RESPONSE = """\
+<?xml version="1.0" encoding="UTF-8"?>
+<Tagging xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <TagSet>
+ {% for tag in obj.tagging.tag_set.tags %}
+ <Tag>
+ <Key>{{ tag.key }}</Key>
+ <Value>{{ tag.value }}</Value>
+ </Tag>
+ {% endfor %}
+ </TagSet>
+</Tagging>"""
+
+S3_BUCKET_TAGGING_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<Tagging>
+ <TagSet>
+ {% for tag in bucket.tagging.tag_set.tags %}
+ <Tag>
+ <Key>{{ tag.key }}</Key>
+ <Value>{{ tag.value }}</Value>
+ </Tag>
+ {% endfor %}
+ </TagSet>
+</Tagging>"""
+
+S3_BUCKET_CORS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CORSConfiguration>
+ {% for cors in bucket.cors %}
+ <CORSRule>
+ {% for origin in cors.allowed_origins %}
+ <AllowedOrigin>{{ origin }}</AllowedOrigin>
+ {% endfor %}
+ {% for method in cors.allowed_methods %}
+ <AllowedMethod>{{ method }}</AllowedMethod>
+ {% endfor %}
+ {% if cors.allowed_headers is not none %}
+ {% for header in cors.allowed_headers %}
+ <AllowedHeader>{{ header }}</AllowedHeader>
+ {% endfor %}
+ {% endif %}
+ {% if cors.exposed_headers is not none %}
+ {% for header in cors.exposed_headers %}
+ <ExposedHeader>{{ header }}</ExposedHeader>
+ {% endfor %}
+ {% endif %}
+ {% if cors.max_age_seconds is not none %}
+ <MaxAgeSeconds>{{ cors.max_age_seconds }}</MaxAgeSeconds>
+ {% endif %}
+ </CORSRule>
+ {% endfor %}
+ </CORSConfiguration>
+"""
+
+S3_OBJECT_COPY_RESPONSE = """\
+<CopyObjectResult xmlns="http://doc.s3.amazonaws.com/2006-03-01">
+ <ETag>{{ key.etag }}</ETag>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+</CopyObjectResult>"""
+
+S3_MULTIPART_INITIATE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <UploadId>{{ upload_id }}</UploadId>
+</InitiateMultipartUploadResult>"""
+
+S3_MULTIPART_UPLOAD_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CopyPartResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <LastModified>{{ part.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ part.etag }}</ETag>
+</CopyPartResult>"""
+
+S3_MULTIPART_LIST_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListPartsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <UploadId>{{ upload_id }}</UploadId>
+ <StorageClass>STANDARD</StorageClass>
+ <Initiator>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Initiator>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <StorageClass>STANDARD</StorageClass>
+ <PartNumberMarker>1</PartNumberMarker>
+ <NextPartNumberMarker>{{ count }}</NextPartNumberMarker>
+ <MaxParts>{{ count }}</MaxParts>
+ <IsTruncated>false</IsTruncated>
+ {% for part in parts %}
+ <Part>
+ <PartNumber>{{ part.name }}</PartNumber>
+ <LastModified>{{ part.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ part.etag }}</ETag>
+ <Size>{{ part.size }}</Size>
+ </Part>
+ {% endfor %}
+</ListPartsResult>"""
+
+S3_MULTIPART_COMPLETE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Location>http://{{ bucket_name }}.s3.amazonaws.com/{{ key_name }}</Location>
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <ETag>{{ etag }}</ETag>
+</CompleteMultipartUploadResult>
+"""
+
+S3_ALL_MULTIPARTS = """<?xml version="1.0" encoding="UTF-8"?>
+<ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <KeyMarker></KeyMarker>
+ <UploadIdMarker></UploadIdMarker>
+ <MaxUploads>1000</MaxUploads>
+ <IsTruncated>False</IsTruncated>
+ {% for upload in uploads %}
+ <Upload>
+ <Key>{{ upload.key_name }}</Key>
+ <UploadId>{{ upload.id }}</UploadId>
+ <Initiator>
+ <ID>arn:aws:iam::123456789012:user/user1-11111a31-17b5-4fb7-9df5-b111111f13de</ID>
+ <DisplayName>user1-11111a31-17b5-4fb7-9df5-b111111f13de</DisplayName>
+ </Initiator>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <StorageClass>STANDARD</StorageClass>
+ <Initiated>2010-11-10T20:48:33.000Z</Initiated>
+ </Upload>
+ {% endfor %}
+</ListMultipartUploadsResult>
+"""
+
+S3_NO_POLICY = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchBucketPolicy</Code>
+ <Message>The bucket policy does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>0D68A23BB2E2215B</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_LIFECYCLE = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchLifecycleConfiguration</Code>
+ <Message>The lifecycle configuration does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_BUCKET_TAGGING = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchTagSet</Code>
+ <Message>The TagSet does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_BUCKET_WEBSITE_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchWebsiteConfiguration</Code>
+ <Message>The specified bucket does not have a website configuration</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_INVALID_CORS_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchWebsiteConfiguration</Code>
+ <Message>The specified bucket does not have a website configuration</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_CORS_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchCORSConfiguration</Code>
+ <Message>The CORS configuration does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_LOGGING_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
+ <LoggingEnabled>
+ <TargetBucket>{{ logging["TargetBucket"] }}</TargetBucket>
+ <TargetPrefix>{{ logging["TargetPrefix"] }}</TargetPrefix>
+ {% if logging.get("TargetGrants") %}
+ <TargetGrants>
+ {% for grant in logging["TargetGrants"] %}
+ <Grant>
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="{{ grant.grantees[0].type }}">
+ {% if grant.grantees[0].uri %}
+ <URI>{{ grant.grantees[0].uri }}</URI>
+ {% endif %}
+ {% if grant.grantees[0].id %}
+ <ID>{{ grant.grantees[0].id }}</ID>
+ {% endif %}
+ {% if grant.grantees[0].display_name %}
+ <DisplayName>{{ grant.grantees[0].display_name }}</DisplayName>
+ {% endif %}
+ </Grantee>
+ <Permission>{{ grant.permissions[0] }}</Permission>
+ </Grant>
+ {% endfor %}
+ </TargetGrants>
+ {% endif %}
+ </LoggingEnabled>
+</BucketLoggingStatus>
+"""
+
+S3_NO_LOGGING_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01" />
+"""
+
+S3_GET_BUCKET_NOTIFICATION_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<NotificationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ {% for topic in bucket.notification_configuration.topic %}
+ <TopicConfiguration>
+ <Id>{{ topic.id }}</Id>
+ <Topic>{{ topic.arn }}</Topic>
+ {% for event in topic.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if topic.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in topic.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </TopicConfiguration>
+ {% endfor %}
+ {% for queue in bucket.notification_configuration.queue %}
+ <QueueConfiguration>
+ <Id>{{ queue.id }}</Id>
+ <Queue>{{ queue.arn }}</Queue>
+ {% for event in queue.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if queue.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in queue.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </QueueConfiguration>
+ {% endfor %}
+ {% for cf in bucket.notification_configuration.cloud_function %}
+ <CloudFunctionConfiguration>
+ <Id>{{ cf.id }}</Id>
+ <CloudFunction>{{ cf.arn }}</CloudFunction>
+ {% for event in cf.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if cf.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in cf.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </CloudFunctionConfiguration>
+ {% endfor %}
+</NotificationConfiguration>
+"""
diff --git a/contrib/python/moto/py2/moto/s3/urls.py b/contrib/python/moto/py2/moto/s3/urls.py
new file mode 100644
index 0000000000..1d439a5492
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/urls.py
@@ -0,0 +1,27 @@
+from __future__ import unicode_literals
+
+from .responses import S3ResponseInstance
+
+url_bases = [
+ "https?://s3(.*).amazonaws.com",
+ r"https?://(?P<bucket_name>[a-zA-Z0-9\-_.]*)\.?s3(.*).amazonaws.com"
+]
+
+
+def ambiguous_response1(*args, **kwargs):
+ return S3ResponseInstance.ambiguous_response(*args, **kwargs)
+
+
+def ambiguous_response2(*args, **kwargs):
+ return S3ResponseInstance.ambiguous_response(*args, **kwargs)
+
+
+url_paths = {
+ # subdomain bucket
+ '{0}/$': S3ResponseInstance.bucket_response,
+
+ # subdomain key of path-based bucket
+ '{0}/(?P<key_or_bucket_name>[^/]+)/?$': S3ResponseInstance.ambiguous_response,
+ # path-based bucket + key
+ '{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)': S3ResponseInstance.key_response,
+}
diff --git a/contrib/python/moto/py2/moto/s3/utils.py b/contrib/python/moto/py2/moto/s3/utils.py
new file mode 100644
index 0000000000..85a812aad9
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3/utils.py
@@ -0,0 +1,145 @@
+from __future__ import unicode_literals
+import logging
+import os
+
+from boto.s3.key import Key
+import re
+import six
+from six.moves.urllib.parse import urlparse, unquote
+import sys
+
+
+log = logging.getLogger(__name__)
+
+
+bucket_name_regex = re.compile("(.+).s3(.*).amazonaws.com")
+
+
+def bucket_name_from_url(url):
+ if os.environ.get('S3_IGNORE_SUBDOMAIN_BUCKETNAME', '') in ['1', 'true']:
+ return None
+ domain = urlparse(url).netloc
+
+ if domain.startswith('www.'):
+ domain = domain[4:]
+
+ if 'amazonaws.com' in domain:
+ bucket_result = bucket_name_regex.search(domain)
+ if bucket_result:
+ return bucket_result.groups()[0]
+ else:
+ if '.' in domain:
+ return domain.split(".")[0]
+ else:
+ # No subdomain found.
+ return None
+
+
+REGION_URL_REGEX = re.compile(
+ r'^https?://(s3[-\.](?P<region1>.+)\.amazonaws\.com/(.+)|'
+ r'(.+)\.s3-(?P<region2>.+)\.amazonaws\.com)/?')
+
+
+def parse_region_from_url(url):
+ match = REGION_URL_REGEX.search(url)
+ if match:
+ region = match.group('region1') or match.group('region2')
+ else:
+ region = 'us-east-1'
+ return region
+
+
+def metadata_from_headers(headers):
+ metadata = {}
+ meta_regex = re.compile(
+ '^x-amz-meta-([a-zA-Z0-9\-_]+)$', flags=re.IGNORECASE)
+ for header, value in headers.items():
+ if isinstance(header, six.string_types):
+ result = meta_regex.match(header)
+ meta_key = None
+ if result:
+ # Check for extra metadata
+ meta_key = result.group(0).lower()
+ elif header.lower() in Key.base_user_settable_fields:
+ # Check for special metadata that doesn't start with x-amz-meta
+ meta_key = header
+ if meta_key:
+ metadata[meta_key] = headers[header]
+ return metadata
+
+
+def clean_key_name(key_name):
+ if six.PY2:
+ return unquote(key_name.encode('utf-8')).decode('utf-8')
+
+ return unquote(key_name)
+
+
+class _VersionedKeyStore(dict):
+
+ """ A simplified/modified version of Django's `MultiValueDict` taken from:
+ https://github.com/django/django/blob/70576740b0bb5289873f5a9a9a4e1a26b2c330e5/django/utils/datastructures.py#L282
+ """
+
+ def __sgetitem__(self, key):
+ return super(_VersionedKeyStore, self).__getitem__(key)
+
+ def __getitem__(self, key):
+ return self.__sgetitem__(key)[-1]
+
+ def __setitem__(self, key, value):
+ try:
+ current = self.__sgetitem__(key)
+ current.append(value)
+ except (KeyError, IndexError):
+ current = [value]
+
+ super(_VersionedKeyStore, self).__setitem__(key, current)
+
+ def get(self, key, default=None):
+ try:
+ return self[key]
+ except (KeyError, IndexError):
+ pass
+ return default
+
+ def getlist(self, key, default=None):
+ try:
+ return self.__sgetitem__(key)
+ except (KeyError, IndexError):
+ pass
+ return default
+
+ def setlist(self, key, list_):
+ if isinstance(list_, tuple):
+ list_ = list(list_)
+ elif not isinstance(list_, list):
+ list_ = [list_]
+
+ super(_VersionedKeyStore, self).__setitem__(key, list_)
+
+ def _iteritems(self):
+ for key in self:
+ yield key, self[key]
+
+ def _itervalues(self):
+ for key in self:
+ yield self[key]
+
+ def _iterlists(self):
+ for key in self:
+ yield key, self.getlist(key)
+
+ items = iteritems = _iteritems
+ lists = iterlists = _iterlists
+ values = itervalues = _itervalues
+
+ if sys.version_info[0] < 3:
+ def items(self):
+ return list(self.iteritems())
+
+ def values(self):
+ return list(self.itervalues())
+
+ def lists(self):
+ return list(self.iterlists())
diff --git a/contrib/python/moto/py2/moto/s3bucket_path/__init__.py b/contrib/python/moto/py2/moto/s3bucket_path/__init__.py
new file mode 100644
index 0000000000..baffc48825
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3bucket_path/__init__.py
@@ -0,0 +1 @@
+from __future__ import unicode_literals
diff --git a/contrib/python/moto/py2/moto/s3bucket_path/utils.py b/contrib/python/moto/py2/moto/s3bucket_path/utils.py
new file mode 100644
index 0000000000..1b9a034f4b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/s3bucket_path/utils.py
@@ -0,0 +1,24 @@
+from __future__ import unicode_literals
+from six.moves.urllib.parse import urlparse
+
+
+def bucket_name_from_url(url):
+ path = urlparse(url).path.lstrip("/")
+
+ parts = path.lstrip("/").split("/")
+ if len(parts) == 0 or parts[0] == "":
+ return None
+ return parts[0]
+
+
+def parse_key_name(path):
+ return "/".join(path.split("/")[2:])
+
+
+def is_delete_keys(request, path, bucket_name):
+ return (
+ path == u'/' + bucket_name + u'/?delete' or
+ path == u'/' + bucket_name + u'?delete' or
+ (path == u'/' + bucket_name and
+ getattr(request, "query_string", "") == "delete")
+ )
diff --git a/contrib/python/moto/py2/moto/server.py b/contrib/python/moto/py2/moto/server.py
new file mode 100644
index 0000000000..5ad02d3838
--- /dev/null
+++ b/contrib/python/moto/py2/moto/server.py
@@ -0,0 +1,231 @@
+from __future__ import unicode_literals
+
+import argparse
+import json
+import re
+import sys
+from threading import Lock
+
+import six
+from flask import Flask
+from flask.testing import FlaskClient
+
+from six.moves.urllib.parse import urlencode
+from werkzeug.routing import BaseConverter
+from werkzeug.serving import run_simple
+
+from moto.backends import BACKENDS
+from moto.core.utils import convert_flask_to_httpretty_response
+
+
+HTTP_METHODS = ["GET", "POST", "PUT", "DELETE", "HEAD", "PATCH"]
+
+
+class DomainDispatcherApplication(object):
+ """
+ Dispatch requests to different applications based on the "Host:" header
+ value. We'll match the host header value with the url_bases of each backend.
+ """
+
+ def __init__(self, create_app, service=None):
+ self.create_app = create_app
+ self.lock = Lock()
+ self.app_instances = {}
+ self.service = service
+
+ def get_backend_for_host(self, host):
+ if host == 'moto_api':
+ return host
+
+ if self.service:
+ return self.service
+
+ if host in BACKENDS:
+ return host
+
+ for backend_name, backend in BACKENDS.items():
+ for url_base in list(backend.values())[0].url_bases:
+ if re.match(url_base, 'http://%s' % host):
+ return backend_name
+
+ raise RuntimeError('Invalid host: "%s"' % host)
+
+ def get_application(self, environ):
+ path_info = environ.get('PATH_INFO', '')
+
+ # The URL path might contain non-ASCII text, for instance unicode S3 bucket names
+ if six.PY2 and isinstance(path_info, str):
+ path_info = six.u(path_info)
+ if six.PY3 and isinstance(path_info, six.binary_type):
+ path_info = path_info.decode('utf-8')
+
+ if path_info.startswith("/moto-api") or path_info == "/favicon.ico":
+ host = "moto_api"
+ elif path_info.startswith("/latest/meta-data/"):
+ host = "instance_metadata"
+ else:
+ host = environ['HTTP_HOST'].split(':')[0]
+ if host in {'localhost', 'motoserver'} or host.startswith("192.168."):
+ # Fall back to parsing auth header to find service
+ # ['Credential=sdffdsa', '20170220', 'us-east-1', 'sns', 'aws4_request']
+ try:
+ _, _, region, service, _ = environ['HTTP_AUTHORIZATION'].split(",")[0].split()[
+ 1].split("/")
+ except (KeyError, ValueError):
+ # Some cognito-idp endpoints (e.g. change password) do not receive an auth header.
+ if environ.get('HTTP_X_AMZ_TARGET', '').startswith('AWSCognitoIdentityProviderService'):
+ service = 'cognito-idp'
+ else:
+ service = 's3'
+
+ region = 'us-east-1'
+ if service == 'dynamodb':
+ if environ['HTTP_X_AMZ_TARGET'].startswith('DynamoDBStreams'):
+ host = 'dynamodbstreams'
+ else:
+ dynamo_api_version = environ['HTTP_X_AMZ_TARGET'].split("_")[1].split(".")[0]
+ # If Newer API version, use dynamodb2
+ if dynamo_api_version > "20111205":
+ host = "dynamodb2"
+ else:
+ host = "{service}.{region}.amazonaws.com".format(
+ service=service, region=region)
+
+ with self.lock:
+ backend = self.get_backend_for_host(host)
+ app = self.app_instances.get(backend, None)
+ if app is None:
+ app = self.create_app(backend)
+ self.app_instances[backend] = app
+ return app
+
+ def __call__(self, environ, start_response):
+ backend_app = self.get_application(environ)
+ return backend_app(environ, start_response)
+
+
+class RegexConverter(BaseConverter):
+ # http://werkzeug.pocoo.org/docs/routing/#custom-converters
+
+ def __init__(self, url_map, *items):
+ super(RegexConverter, self).__init__(url_map)
+ self.regex = items[0]
+
+
+class AWSTestHelper(FlaskClient):
+
+ def action_data(self, action_name, **kwargs):
+ """
+ Method calls resource with action_name and returns data of response.
+ """
+ opts = {"Action": action_name}
+ opts.update(kwargs)
+ res = self.get("/?{0}".format(urlencode(opts)),
+ headers={"Host": "{0}.us-east-1.amazonaws.com".format(self.application.service)})
+ return res.data.decode("utf-8")
+
+ def action_json(self, action_name, **kwargs):
+ """
+ Method calls resource with action_name and returns object obtained via
+ deserialization of output.
+ """
+ return json.loads(self.action_data(action_name, **kwargs))
+
+
+def create_backend_app(service):
+ from werkzeug.routing import Map
+
+ # Create the backend_app
+ backend_app = Flask(__name__)
+ backend_app.debug = True
+ backend_app.service = service
+
+ # Reset view functions to reset the app
+ backend_app.view_functions = {}
+ backend_app.url_map = Map()
+ backend_app.url_map.converters['regex'] = RegexConverter
+ backend = list(BACKENDS[service].values())[0]
+ for url_path, handler in backend.flask_paths.items():
+ if handler.__name__ == 'dispatch':
+ endpoint = '{0}.dispatch'.format(handler.__self__.__name__)
+ else:
+ endpoint = None
+
+ original_endpoint = endpoint
+ index = 2
+ while endpoint in backend_app.view_functions:
+ # HACK: Sometimes we map the same view to multiple url_paths. Flask
+ # requries us to have different names.
+ endpoint = original_endpoint + str(index)
+ index += 1
+
+ backend_app.add_url_rule(
+ url_path,
+ endpoint=endpoint,
+ methods=HTTP_METHODS,
+ view_func=convert_flask_to_httpretty_response(handler),
+ strict_slashes=False,
+ )
+
+ backend_app.test_client_class = AWSTestHelper
+ return backend_app
+
+
+def main(argv=sys.argv[1:]):
+ parser = argparse.ArgumentParser()
+
+ # Keep this for backwards compat
+ parser.add_argument(
+ "service",
+ type=str,
+ nargs='?', # http://stackoverflow.com/a/4480202/731592
+ default=None)
+ parser.add_argument(
+ '-H', '--host', type=str,
+ help='Which host to bind',
+ default='127.0.0.1')
+ parser.add_argument(
+ '-p', '--port', type=int,
+ help='Port number to use for connection',
+ default=5000)
+ parser.add_argument(
+ '-r', '--reload',
+ action='store_true',
+ help='Reload server on a file change',
+ default=False
+ )
+ parser.add_argument(
+ '-s', '--ssl',
+ action='store_true',
+ help='Enable SSL encrypted connection with auto-generated certificate (use https://... URL)',
+ default=False
+ )
+ parser.add_argument(
+ '-c', '--ssl-cert', type=str,
+ help='Path to SSL certificate',
+ default=None)
+ parser.add_argument(
+ '-k', '--ssl-key', type=str,
+ help='Path to SSL private key',
+ default=None)
+
+ args = parser.parse_args(argv)
+
+ # Wrap the main application
+ main_app = DomainDispatcherApplication(
+ create_backend_app, service=args.service)
+ main_app.debug = True
+
+ ssl_context = None
+ if args.ssl_key and args.ssl_cert:
+ ssl_context = (args.ssl_cert, args.ssl_key)
+ elif args.ssl:
+ ssl_context = 'adhoc'
+
+ run_simple(args.host, args.port, main_app,
+ threaded=True, use_reloader=args.reload,
+ ssl_context=ssl_context)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/contrib/python/moto/py2/moto/settings.py b/contrib/python/moto/py2/moto/settings.py
new file mode 100644
index 0000000000..a5240f1300
--- /dev/null
+++ b/contrib/python/moto/py2/moto/settings.py
@@ -0,0 +1,3 @@
+import os
+
+TEST_SERVER_MODE = os.environ.get('TEST_SERVER_MODE', '0').lower() == 'true'
diff --git a/contrib/python/moto/py2/moto/sts/__init__.py b/contrib/python/moto/py2/moto/sts/__init__.py
new file mode 100644
index 0000000000..7b46bdfbdc
--- /dev/null
+++ b/contrib/python/moto/py2/moto/sts/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import unicode_literals
+from .models import sts_backend
+
+sts_backends = {"global": sts_backend}
+mock_sts = sts_backend.decorator
+mock_sts_deprecated = sts_backend.deprecated_decorator
diff --git a/contrib/python/moto/py2/moto/sts/models.py b/contrib/python/moto/py2/moto/sts/models.py
new file mode 100644
index 0000000000..c7163a335b
--- /dev/null
+++ b/contrib/python/moto/py2/moto/sts/models.py
@@ -0,0 +1,50 @@
+from __future__ import unicode_literals
+import datetime
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds
+
+
+class Token(BaseModel):
+
+ def __init__(self, duration, name=None, policy=None):
+ now = datetime.datetime.utcnow()
+ self.expiration = now + datetime.timedelta(seconds=duration)
+ self.name = name
+ self.policy = None
+
+ @property
+ def expiration_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.expiration)
+
+
+class AssumedRole(BaseModel):
+
+ def __init__(self, role_session_name, role_arn, policy, duration, external_id):
+ self.session_name = role_session_name
+ self.arn = role_arn
+ self.policy = policy
+ now = datetime.datetime.utcnow()
+ self.expiration = now + datetime.timedelta(seconds=duration)
+ self.external_id = external_id
+
+ @property
+ def expiration_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.expiration)
+
+
+class STSBackend(BaseBackend):
+
+ def get_session_token(self, duration):
+ token = Token(duration=duration)
+ return token
+
+ def get_federation_token(self, name, duration, policy):
+ token = Token(duration=duration, name=name, policy=policy)
+ return token
+
+ def assume_role(self, **kwargs):
+ role = AssumedRole(**kwargs)
+ return role
+
+
+sts_backend = STSBackend()
diff --git a/contrib/python/moto/py2/moto/sts/responses.py b/contrib/python/moto/py2/moto/sts/responses.py
new file mode 100644
index 0000000000..a5abb6b817
--- /dev/null
+++ b/contrib/python/moto/py2/moto/sts/responses.py
@@ -0,0 +1,113 @@
+from __future__ import unicode_literals
+
+from moto.core.responses import BaseResponse
+from .models import sts_backend
+
+
+class TokenResponse(BaseResponse):
+
+ def get_session_token(self):
+ duration = int(self.querystring.get('DurationSeconds', [43200])[0])
+ token = sts_backend.get_session_token(duration=duration)
+ template = self.response_template(GET_SESSION_TOKEN_RESPONSE)
+ return template.render(token=token)
+
+ def get_federation_token(self):
+ duration = int(self.querystring.get('DurationSeconds', [43200])[0])
+ policy = self.querystring.get('Policy', [None])[0]
+ name = self.querystring.get('Name')[0]
+ token = sts_backend.get_federation_token(
+ duration=duration, name=name, policy=policy)
+ template = self.response_template(GET_FEDERATION_TOKEN_RESPONSE)
+ return template.render(token=token)
+
+ def assume_role(self):
+ role_session_name = self.querystring.get('RoleSessionName')[0]
+ role_arn = self.querystring.get('RoleArn')[0]
+
+ policy = self.querystring.get('Policy', [None])[0]
+ duration = int(self.querystring.get('DurationSeconds', [3600])[0])
+ external_id = self.querystring.get('ExternalId', [None])[0]
+
+ role = sts_backend.assume_role(
+ role_session_name=role_session_name,
+ role_arn=role_arn,
+ policy=policy,
+ duration=duration,
+ external_id=external_id,
+ )
+ template = self.response_template(ASSUME_ROLE_RESPONSE)
+ return template.render(role=role)
+
+ def get_caller_identity(self):
+ template = self.response_template(GET_CALLER_IDENTITY_RESPONSE)
+ return template.render()
+
+
+GET_SESSION_TOKEN_RESPONSE = """<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <GetSessionTokenResult>
+ <Credentials>
+ <SessionToken>AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE</SessionToken>
+ <SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
+ <Expiration>{{ token.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
+ </Credentials>
+ </GetSessionTokenResult>
+ <ResponseMetadata>
+ <RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId>
+ </ResponseMetadata>
+</GetSessionTokenResponse>"""
+
+
+GET_FEDERATION_TOKEN_RESPONSE = """<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/
+2011-06-15/">
+ <GetFederationTokenResult>
+ <Credentials>
+ <SessionToken>AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==</SessionToken>
+ <SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
+ <Expiration>{{ token.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
+ </Credentials>
+ <FederatedUser>
+ <Arn>arn:aws:sts::123456789012:federated-user/{{ token.name }}</Arn>
+ <FederatedUserId>123456789012:{{ token.name }}</FederatedUserId>
+ </FederatedUser>
+ <PackedPolicySize>6</PackedPolicySize>
+ </GetFederationTokenResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</GetFederationTokenResponse>"""
+
+
+ASSUME_ROLE_RESPONSE = """<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/
+2011-06-15/">
+ <AssumeRoleResult>
+ <Credentials>
+ <SessionToken>BQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE</SessionToken>
+ <SecretAccessKey>aJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
+ <Expiration>{{ role.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
+ </Credentials>
+ <AssumedRoleUser>
+ <Arn>{{ role.arn }}</Arn>
+ <AssumedRoleId>ARO123EXAMPLE123:{{ role.session_name }}</AssumedRoleId>
+ </AssumedRoleUser>
+ <PackedPolicySize>6</PackedPolicySize>
+ </AssumeRoleResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</AssumeRoleResponse>"""
+
+GET_CALLER_IDENTITY_RESPONSE = """<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <GetCallerIdentityResult>
+ <Arn>arn:aws:sts::123456789012:user/moto</Arn>
+ <UserId>AKIAIOSFODNN7EXAMPLE</UserId>
+ <Account>123456789012</Account>
+ </GetCallerIdentityResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</GetCallerIdentityResponse>
+"""
diff --git a/contrib/python/moto/py2/moto/sts/urls.py b/contrib/python/moto/py2/moto/sts/urls.py
new file mode 100644
index 0000000000..2078e0b2c5
--- /dev/null
+++ b/contrib/python/moto/py2/moto/sts/urls.py
@@ -0,0 +1,10 @@
+from __future__ import unicode_literals
+from .responses import TokenResponse
+
+url_bases = [
+ "https?://sts(.*).amazonaws.com"
+]
+
+url_paths = {
+ '{0}/$': TokenResponse.dispatch,
+}
diff --git a/contrib/python/moto/py2/ya.make b/contrib/python/moto/py2/ya.make
new file mode 100644
index 0000000000..2d2ebf1317
--- /dev/null
+++ b/contrib/python/moto/py2/ya.make
@@ -0,0 +1,129 @@
+PY2_LIBRARY()
+
+LICENSE(Apache-2.0)
+
+VERSION(1.3.7)
+
+NO_LINT()
+
+PEERDIR(
+ contrib/python/botocore
+ contrib/python/boto
+ contrib/python/cookies
+ contrib/python/requests
+ contrib/python/responses
+ contrib/python/Werkzeug
+ contrib/python/Jinja2
+ contrib/python/xmltodict
+ contrib/python/pytz
+ contrib/python/Flask
+ library/python/resource
+)
+
+PY_SRCS(
+ TOP_LEVEL
+ moto/__init__.py
+ moto/settings.py
+ moto/compat.py
+ moto/backends.py
+ moto/server.py
+
+ moto/core/__init__.py
+ moto/core/exceptions.py
+ moto/core/models.py
+ moto/core/responses.py
+ moto/core/urls.py
+ moto/core/utils.py
+
+ moto/ec2/__init__.py
+ moto/ec2/exceptions.py
+ moto/ec2/models.py
+ moto/ec2/responses/__init__.py
+ moto/ec2/responses/account_attributes.py
+ moto/ec2/responses/amazon_dev_pay.py
+ moto/ec2/responses/amis.py
+ moto/ec2/responses/availability_zones_and_regions.py
+ moto/ec2/responses/customer_gateways.py
+ moto/ec2/responses/dhcp_options.py
+ moto/ec2/responses/elastic_block_store.py
+ moto/ec2/responses/elastic_ip_addresses.py
+ moto/ec2/responses/elastic_network_interfaces.py
+ moto/ec2/responses/general.py
+ moto/ec2/responses/instances.py
+ moto/ec2/responses/internet_gateways.py
+ moto/ec2/responses/ip_addresses.py
+ moto/ec2/responses/key_pairs.py
+ moto/ec2/responses/monitoring.py
+ moto/ec2/responses/nat_gateways.py
+ moto/ec2/responses/network_acls.py
+ moto/ec2/responses/placement_groups.py
+ moto/ec2/responses/reserved_instances.py
+ moto/ec2/responses/route_tables.py
+ moto/ec2/responses/security_groups.py
+ moto/ec2/responses/spot_fleets.py
+ moto/ec2/responses/spot_instances.py
+ moto/ec2/responses/subnets.py
+ moto/ec2/responses/tags.py
+ moto/ec2/responses/virtual_private_gateways.py
+ moto/ec2/responses/vm_export.py
+ moto/ec2/responses/vm_import.py
+ moto/ec2/responses/vpc_peering_connections.py
+ moto/ec2/responses/vpcs.py
+ moto/ec2/responses/vpn_connections.py
+ moto/ec2/responses/windows.py
+ moto/ec2/urls.py
+ moto/ec2/utils.py
+
+ moto/iam/aws_managed_policies.py
+ moto/iam/exceptions.py
+ moto/iam/__init__.py
+ moto/iam/models.py
+ moto/iam/responses.py
+ moto/iam/urls.py
+ moto/iam/utils.py
+
+ moto/kms/__init__.py
+ moto/kms/models.py
+ moto/kms/responses.py
+ moto/kms/urls.py
+ moto/kms/utils.py
+
+ moto/route53/__init__.py
+ moto/route53/models.py
+ moto/route53/responses.py
+ moto/route53/urls.py
+
+ moto/s3/__init__.py
+ moto/s3/exceptions.py
+ moto/s3/models.py
+ moto/s3/urls.py
+ moto/s3/utils.py
+ moto/s3/responses.py
+
+ moto/s3bucket_path/__init__.py
+ moto/s3bucket_path/utils.py
+
+ moto/sts/__init__.py
+ moto/sts/models.py
+ moto/sts/responses.py
+ moto/sts/urls.py
+
+ moto/packages/__init__.py
+ moto/packages/httpretty/__init__.py
+ moto/packages/httpretty/compat.py
+ moto/packages/httpretty/core.py
+ moto/packages/httpretty/errors.py
+ moto/packages/httpretty/http.py
+ moto/packages/httpretty/utils.py
+
+ moto/instance_metadata/__init__.py
+ moto/instance_metadata/models.py
+ moto/instance_metadata/responses.py
+ moto/instance_metadata/urls.py
+)
+
+RESOURCE(
+ moto/ec2/resources/amis.json resource/amis.json
+ moto/ec2/resources/instance_types.json resource/instance_types.json
+)
+END()
diff --git a/contrib/python/moto/py3/.dist-info/METADATA b/contrib/python/moto/py3/.dist-info/METADATA
new file mode 100644
index 0000000000..ec47e922bf
--- /dev/null
+++ b/contrib/python/moto/py3/.dist-info/METADATA
@@ -0,0 +1,275 @@
+Metadata-Version: 2.1
+Name: moto
+Version: 3.1.12
+Summary: A library that allows your python tests to easily mock out the boto library
+Home-page: https://github.com/spulec/moto
+Author: Steve Pulec
+Author-email: spulec@gmail.com
+License: Apache
+Project-URL: Documentation, http://docs.getmoto.org/en/latest/
+Project-URL: Issue tracker, https://github.com/spulec/moto/issues
+Project-URL: Changelog, https://github.com/spulec/moto/blob/master/CHANGELOG.md
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Testing
+Requires-Python: >=3.6
+Description-Content-Type: text/markdown
+License-File: LICENSE
+License-File: AUTHORS.md
+Requires-Dist: boto3 (>=1.9.201)
+Requires-Dist: botocore (>=1.12.201)
+Requires-Dist: cryptography (>=3.3.1)
+Requires-Dist: requests (>=2.5)
+Requires-Dist: xmltodict
+Requires-Dist: werkzeug (>=0.5)
+Requires-Dist: pytz
+Requires-Dist: python-dateutil (<3.0.0,>=2.1)
+Requires-Dist: responses (>=0.9.0)
+Requires-Dist: MarkupSafe (!=2.0.0a1)
+Requires-Dist: Jinja2 (>=2.10.1)
+Requires-Dist: importlib-metadata ; python_version < "3.8"
+Provides-Extra: acm
+Provides-Extra: all
+Requires-Dist: PyYAML (>=5.1) ; extra == 'all'
+Requires-Dist: python-jose[cryptography] (<4.0.0,>=3.1.0) ; extra == 'all'
+Requires-Dist: ecdsa (!=0.15) ; extra == 'all'
+Requires-Dist: docker (>=2.5.1) ; extra == 'all'
+Requires-Dist: graphql-core ; extra == 'all'
+Requires-Dist: jsondiff (>=1.1.2) ; extra == 'all'
+Requires-Dist: aws-xray-sdk (!=0.96,>=0.93) ; extra == 'all'
+Requires-Dist: idna (<4,>=2.5) ; extra == 'all'
+Requires-Dist: cfn-lint (>=0.4.0) ; extra == 'all'
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'all'
+Requires-Dist: pyparsing (>=3.0.7) ; extra == 'all'
+Requires-Dist: openapi-spec-validator (>=0.2.8) ; extra == 'all'
+Requires-Dist: setuptools ; extra == 'all'
+Provides-Extra: apigateway
+Requires-Dist: PyYAML (>=5.1) ; extra == 'apigateway'
+Requires-Dist: python-jose[cryptography] (<4.0.0,>=3.1.0) ; extra == 'apigateway'
+Requires-Dist: ecdsa (!=0.15) ; extra == 'apigateway'
+Requires-Dist: openapi-spec-validator (>=0.2.8) ; extra == 'apigateway'
+Provides-Extra: apigatewayv2
+Requires-Dist: PyYAML (>=5.1) ; extra == 'apigatewayv2'
+Provides-Extra: applicationautoscaling
+Provides-Extra: appsync
+Requires-Dist: graphql-core ; extra == 'appsync'
+Provides-Extra: athena
+Provides-Extra: autoscaling
+Provides-Extra: awslambda
+Requires-Dist: docker (>=2.5.1) ; extra == 'awslambda'
+Provides-Extra: batch
+Requires-Dist: docker (>=2.5.1) ; extra == 'batch'
+Provides-Extra: batch_simple
+Provides-Extra: budgets
+Provides-Extra: cloudformation
+Requires-Dist: PyYAML (>=5.1) ; extra == 'cloudformation'
+Requires-Dist: python-jose[cryptography] (<4.0.0,>=3.1.0) ; extra == 'cloudformation'
+Requires-Dist: ecdsa (!=0.15) ; extra == 'cloudformation'
+Requires-Dist: docker (>=2.5.1) ; extra == 'cloudformation'
+Requires-Dist: graphql-core ; extra == 'cloudformation'
+Requires-Dist: jsondiff (>=1.1.2) ; extra == 'cloudformation'
+Requires-Dist: aws-xray-sdk (!=0.96,>=0.93) ; extra == 'cloudformation'
+Requires-Dist: idna (<4,>=2.5) ; extra == 'cloudformation'
+Requires-Dist: cfn-lint (>=0.4.0) ; extra == 'cloudformation'
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'cloudformation'
+Requires-Dist: pyparsing (>=3.0.7) ; extra == 'cloudformation'
+Requires-Dist: openapi-spec-validator (>=0.2.8) ; extra == 'cloudformation'
+Requires-Dist: setuptools ; extra == 'cloudformation'
+Provides-Extra: cloudfront
+Provides-Extra: cloudtrail
+Provides-Extra: cloudwatch
+Provides-Extra: codecommit
+Provides-Extra: codepipeline
+Provides-Extra: cognitoidentity
+Provides-Extra: cognitoidp
+Requires-Dist: python-jose[cryptography] (<4.0.0,>=3.1.0) ; extra == 'cognitoidp'
+Requires-Dist: ecdsa (!=0.15) ; extra == 'cognitoidp'
+Provides-Extra: config
+Provides-Extra: databrew
+Provides-Extra: datapipeline
+Provides-Extra: datasync
+Provides-Extra: dax
+Provides-Extra: dms
+Provides-Extra: ds
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'ds'
+Provides-Extra: dynamodb
+Requires-Dist: docker (>=2.5.1) ; extra == 'dynamodb'
+Provides-Extra: dynamodb2
+Requires-Dist: docker (>=2.5.1) ; extra == 'dynamodb2'
+Provides-Extra: dynamodbstreams
+Requires-Dist: docker (>=2.5.1) ; extra == 'dynamodbstreams'
+Provides-Extra: ebs
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'ebs'
+Provides-Extra: ec2
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'ec2'
+Provides-Extra: ec2instanceconnect
+Provides-Extra: ecr
+Provides-Extra: ecs
+Provides-Extra: efs
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'efs'
+Provides-Extra: eks
+Provides-Extra: elasticache
+Provides-Extra: elasticbeanstalk
+Provides-Extra: elastictranscoder
+Provides-Extra: elb
+Provides-Extra: elbv2
+Provides-Extra: emr
+Provides-Extra: emrcontainers
+Provides-Extra: es
+Provides-Extra: events
+Provides-Extra: firehose
+Provides-Extra: forecast
+Provides-Extra: glacier
+Provides-Extra: glue
+Requires-Dist: pyparsing (>=3.0.7) ; extra == 'glue'
+Provides-Extra: greengrass
+Provides-Extra: guardduty
+Provides-Extra: iam
+Provides-Extra: iot
+Provides-Extra: iotdata
+Requires-Dist: jsondiff (>=1.1.2) ; extra == 'iotdata'
+Provides-Extra: kinesis
+Provides-Extra: kinesisvideo
+Provides-Extra: kinesisvideoarchivedmedia
+Provides-Extra: kms
+Provides-Extra: lambda
+Provides-Extra: logs
+Provides-Extra: managedblockchain
+Provides-Extra: mediaconnect
+Provides-Extra: medialive
+Provides-Extra: mediapackage
+Provides-Extra: mediastore
+Provides-Extra: mediastoredata
+Provides-Extra: mq
+Provides-Extra: opsworks
+Provides-Extra: organizations
+Provides-Extra: pinpoint
+Provides-Extra: polly
+Provides-Extra: quicksight
+Provides-Extra: ram
+Provides-Extra: rds
+Provides-Extra: rds2
+Provides-Extra: redshift
+Provides-Extra: redshiftdata
+Provides-Extra: rekognition
+Provides-Extra: resourcegroups
+Provides-Extra: resourcegroupstaggingapi
+Provides-Extra: route53
+Provides-Extra: route53resolver
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'route53resolver'
+Provides-Extra: s3
+Requires-Dist: PyYAML (>=5.1) ; extra == 's3'
+Provides-Extra: s3control
+Provides-Extra: sagemaker
+Provides-Extra: sdb
+Provides-Extra: secretsmanager
+Provides-Extra: server
+Requires-Dist: PyYAML (>=5.1) ; extra == 'server'
+Requires-Dist: python-jose[cryptography] (<4.0.0,>=3.1.0) ; extra == 'server'
+Requires-Dist: ecdsa (!=0.15) ; extra == 'server'
+Requires-Dist: docker (>=2.5.1) ; extra == 'server'
+Requires-Dist: graphql-core ; extra == 'server'
+Requires-Dist: jsondiff (>=1.1.2) ; extra == 'server'
+Requires-Dist: aws-xray-sdk (!=0.96,>=0.93) ; extra == 'server'
+Requires-Dist: idna (<4,>=2.5) ; extra == 'server'
+Requires-Dist: cfn-lint (>=0.4.0) ; extra == 'server'
+Requires-Dist: sshpubkeys (>=3.1.0) ; extra == 'server'
+Requires-Dist: pyparsing (>=3.0.7) ; extra == 'server'
+Requires-Dist: openapi-spec-validator (>=0.2.8) ; extra == 'server'
+Requires-Dist: setuptools ; extra == 'server'
+Requires-Dist: flask ; extra == 'server'
+Requires-Dist: flask-cors ; extra == 'server'
+Provides-Extra: servicediscovery
+Provides-Extra: ses
+Provides-Extra: sns
+Provides-Extra: sqs
+Provides-Extra: ssm
+Requires-Dist: PyYAML (>=5.1) ; extra == 'ssm'
+Requires-Dist: dataclasses ; (python_version < "3.7") and extra == 'ssm'
+Provides-Extra: ssoadmin
+Provides-Extra: stepfunctions
+Provides-Extra: sts
+Provides-Extra: support
+Provides-Extra: swf
+Provides-Extra: textract
+Provides-Extra: timestreamwrite
+Provides-Extra: transcribe
+Provides-Extra: wafv2
+Provides-Extra: xray
+Requires-Dist: aws-xray-sdk (!=0.96,>=0.93) ; extra == 'xray'
+Requires-Dist: setuptools ; extra == 'xray'
+Provides-Extra: xray_client
+
+# Moto - Mock AWS Services
+
+[![Join the chat at https://gitter.im/awsmoto/Lobby](https://badges.gitter.im/awsmoto/Lobby.svg)](https://gitter.im/awsmoto/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![Build Status](https://github.com/spulec/moto/workflows/TestNDeploy/badge.svg)](https://github.com/spulec/moto/actions)
+[![Coverage Status](https://codecov.io/gh/spulec/moto/branch/master/graph/badge.svg)](https://codecov.io/gh/spulec/moto)
+[![Docs](https://readthedocs.org/projects/pip/badge/?version=stable)](http://docs.getmoto.org)
+[![PyPI](https://img.shields.io/pypi/v/moto.svg)](https://pypi.org/project/moto/)
+[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/moto.svg)](#)
+[![PyPI - Downloads](https://img.shields.io/pypi/dw/moto.svg)](https://pypistats.org/packages/moto)
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
+
+
+## Install
+
+```console
+$ pip install 'moto[ec2,s3,all]'
+```
+
+## In a nutshell
+
+
+Moto is a library that allows your tests to easily mock out AWS Services.
+
+Imagine you have the following python code that you want to test:
+
+```python
+import boto3
+
+class MyModel(object):
+ def __init__(self, name, value):
+ self.name = name
+ self.value = value
+
+ def save(self):
+ s3 = boto3.client('s3', region_name='us-east-1')
+ s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)
+```
+
+Take a minute to think how you would have tested that in the past.
+
+Now see how you could test it with Moto:
+
+```python
+import boto3
+from moto import mock_s3
+from mymodule import MyModel
+
+@mock_s3
+def test_my_model_save():
+ conn = boto3.resource('s3', region_name='us-east-1')
+ # We need to create the bucket since this is all in Moto's 'virtual' AWS account
+ conn.create_bucket(Bucket='mybucket')
+ model_instance = MyModel('steve', 'is awesome')
+ model_instance.save()
+ body = conn.Object('mybucket', 'steve').get()['Body'].read().decode("utf-8")
+ assert body == 'is awesome'
+```
+
+With the decorator wrapping the test, all the calls to s3 are automatically mocked out. The mock keeps the state of the buckets and keys.
+
+For a full list of which services and features are covered, please see our [implementation coverage](https://github.com/spulec/moto/blob/master/IMPLEMENTATION_COVERAGE.md).
+
+
+### Documentation
+The full documentation can be found here:
+
+[http://docs.getmoto.org/en/latest/](http://docs.getmoto.org/en/latest/)
diff --git a/contrib/python/moto/py3/.dist-info/entry_points.txt b/contrib/python/moto/py3/.dist-info/entry_points.txt
new file mode 100644
index 0000000000..7959bebd8e
--- /dev/null
+++ b/contrib/python/moto/py3/.dist-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+moto_server = moto.server:main
diff --git a/contrib/python/moto/py3/.dist-info/top_level.txt b/contrib/python/moto/py3/.dist-info/top_level.txt
new file mode 100644
index 0000000000..0a175dad0c
--- /dev/null
+++ b/contrib/python/moto/py3/.dist-info/top_level.txt
@@ -0,0 +1 @@
+moto
diff --git a/contrib/python/moto/py3/AUTHORS.md b/contrib/python/moto/py3/AUTHORS.md
new file mode 100644
index 0000000000..82f0313e6e
--- /dev/null
+++ b/contrib/python/moto/py3/AUTHORS.md
@@ -0,0 +1,64 @@
+## Moto Contributors
+
+Moto is written by Steve Pulec with contributions from:
+
+* [Zach Smith](https://github.com/zmsmith)
+* [Dilshod Tadjibaev](https://github.com/antimora)
+* [Dan Berglund](https://github.com/cheif)
+* [Lincoln de Sousa](https://github.com/clarete)
+* [mhock](https://github.com/mhock)
+* [Ilya Sukhanov](https://github.com/IlyaSukhanov)
+* [Lucian Branescu Mihaila](https://github.com/lucian1900)
+* [Konstantinos Koukopoulos](https://github.com/kouk)
+* [attili](https://github.com/attili)
+* [JJ Zeng](https://github.com/jjofseattle)
+* [Jon Haddad](https://github.com/rustyrazorblade)
+* [Andres Riancho](https://github.com/andresriancho)
+* [Michael Ossareh](https://github.com/ossareh)
+* [JeffMGreg](https://github.com/JeffMGreg)
+* [Hugo Lopes Tavares](https://github.com/hltbra)
+* [Chris St. Pierre](https://github.com/stpierre)
+* [Frank Mata](https://github.com/matafc)
+* [Clint Ecker](https://github.com/clintecker)
+* [Richard Eames](https://github.com/Naddiseo)
+* [Kevin Glisson](https://github.com/kevgliss)
+* [Shawn Falkner-Horine](https://github.com/DreadPirateShawn)
+* [David Baumgold](https://github.com/singingwolfboy)
+* [Rory-Finnegan](https://github.com/Rory-Finnegan)
+* [Bobby Impollonia](https://github.com/bobbyi)
+* [Ralfas](https://github.com/ralfas)
+* [Omer Katz](https://github.com/thedrow)
+* [Joseph Lawson](https://github.com/joekiller)
+* [Trey Tacon](https://github.com/ttacon)
+* [Peter](https://github.com/pvbouwel)
+* [Tyler Sanders](https://github.com/tsanders)
+* [Gary Dalton](https://github.com/gary-dalton)
+* [Chris Henry](https://github.com/chrishenry)
+* [Mike Fuller](https://github.com/mfulleratlassian)
+* [Andy](https://github.com/aaltepet)
+* [Mike Grima](https://github.com/mikegrima)
+* [Marco Rucci](https://github.com/mrucci)
+* [Zack Kourouma](https://github.com/zkourouma)
+* [Pior Bastida](https://github.com/pior)
+* [Dustin J. Mitchell](https://github.com/djmitche)
+* [Jean-Baptiste Barth](https://github.com/jbbarth)
+* [Tom Viner](https://github.com/tomviner)
+* [Justin Wiley](https://github.com/SectorNine50)
+* [Adam Stauffer](https://github.com/adamstauffer)
+* [Guy Templeton](https://github.com/gjtempleton)
+* [Michael van Tellingen](https://github.com/mvantellingen)
+* [Jessie Nadler](https://github.com/nadlerjessie)
+* [Alex Morken](https://github.com/alexmorken)
+* [Clive Li](https://github.com/cliveli)
+* [Jim Shields](https://github.com/jimjshields)
+* [William Richard](https://github.com/william-richard)
+* [Alex Casalboni](https://github.com/alexcasalboni)
+* [Jon Beilke](https://github.com/jrbeilke)
+* [Bendeguz Acs](https://github.com/acsbendi)
+* [Craig Anderson](https://github.com/craiga)
+* [Robert Lewis](https://github.com/ralewis85)
+* [Kyle Jones](https://github.com/Kerl1310)
+* [Mickaël Schoentgen](https://github.com/BoboTiG)
+* [Ariel Beck](https://github.com/arielb135)
+* [Roman Rader](https://github.com/rrader/)
+* [Bryan Chen](https://github.com/bchen1116)
diff --git a/contrib/python/moto/py3/LICENSE b/contrib/python/moto/py3/LICENSE
new file mode 100644
index 0000000000..90a85e7149
--- /dev/null
+++ b/contrib/python/moto/py3/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright 2012 Steve Pulec
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. \ No newline at end of file
diff --git a/contrib/python/moto/py3/README.md b/contrib/python/moto/py3/README.md
new file mode 100644
index 0000000000..34de0cf350
--- /dev/null
+++ b/contrib/python/moto/py3/README.md
@@ -0,0 +1,68 @@
+# Moto - Mock AWS Services
+
+[![Join the chat at https://gitter.im/awsmoto/Lobby](https://badges.gitter.im/awsmoto/Lobby.svg)](https://gitter.im/awsmoto/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![Build Status](https://github.com/spulec/moto/workflows/TestNDeploy/badge.svg)](https://github.com/spulec/moto/actions)
+[![Coverage Status](https://codecov.io/gh/spulec/moto/branch/master/graph/badge.svg)](https://codecov.io/gh/spulec/moto)
+[![Docs](https://readthedocs.org/projects/pip/badge/?version=stable)](http://docs.getmoto.org)
+[![PyPI](https://img.shields.io/pypi/v/moto.svg)](https://pypi.org/project/moto/)
+[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/moto.svg)](#)
+[![PyPI - Downloads](https://img.shields.io/pypi/dw/moto.svg)](https://pypistats.org/packages/moto)
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
+
+
+## Install
+
+```console
+$ pip install 'moto[ec2,s3,all]'
+```
+
+## In a nutshell
+
+
+Moto is a library that allows your tests to easily mock out AWS Services.
+
+Imagine you have the following python code that you want to test:
+
+```python
+import boto3
+
+class MyModel(object):
+ def __init__(self, name, value):
+ self.name = name
+ self.value = value
+
+ def save(self):
+ s3 = boto3.client('s3', region_name='us-east-1')
+ s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)
+```
+
+Take a minute to think how you would have tested that in the past.
+
+Now see how you could test it with Moto:
+
+```python
+import boto3
+from moto import mock_s3
+from mymodule import MyModel
+
+@mock_s3
+def test_my_model_save():
+ conn = boto3.resource('s3', region_name='us-east-1')
+ # We need to create the bucket since this is all in Moto's 'virtual' AWS account
+ conn.create_bucket(Bucket='mybucket')
+ model_instance = MyModel('steve', 'is awesome')
+ model_instance.save()
+ body = conn.Object('mybucket', 'steve').get()['Body'].read().decode("utf-8")
+ assert body == 'is awesome'
+```
+
+With the decorator wrapping the test, all the calls to s3 are automatically mocked out. The mock keeps the state of the buckets and keys.
+
+For a full list of which services and features are covered, please see our [implementation coverage](https://github.com/spulec/moto/blob/master/IMPLEMENTATION_COVERAGE.md).
+
+
+### Documentation
+The full documentation can be found here:
+
+[http://docs.getmoto.org/en/latest/](http://docs.getmoto.org/en/latest/)
diff --git a/contrib/python/moto/py3/moto/__init__.py b/contrib/python/moto/py3/moto/__init__.py
new file mode 100644
index 0000000000..6a3d93e44e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/__init__.py
@@ -0,0 +1,225 @@
+import importlib
+import sys
+from contextlib import ContextDecorator
+
+
+def lazy_load(
+ module_name,
+ element,
+ boto3_name=None,
+ backend=None,
+ warn_repurpose=False,
+ use_instead=None,
+):
+ def f(*args, **kwargs):
+ if warn_repurpose:
+ import warnings
+
+ warnings.warn(
+ f"Module {element} has been deprecated, and will be repurposed in a later release. "
+ "Please see https://github.com/spulec/moto/issues/4526 for more information."
+ )
+ if use_instead:
+ import warnings
+
+ used, recommended = use_instead
+ warnings.warn(
+ f"Module {used} has been deprecated, and will be removed in a later release. Please use {recommended} instead. "
+ "See https://github.com/spulec/moto/issues/4526 for more information."
+ )
+ module = importlib.import_module(module_name, "moto")
+ return getattr(module, element)(*args, **kwargs)
+
+ setattr(f, "name", module_name.replace(".", ""))
+ setattr(f, "element", element)
+ setattr(f, "boto3_name", boto3_name or f.name)
+ setattr(f, "backend", backend or f"{f.name}_backends")
+ return f
+
+
+mock_acm = lazy_load(".acm", "mock_acm")
+mock_apigateway = lazy_load(".apigateway", "mock_apigateway")
+mock_apigatewayv2 = lazy_load(".apigatewayv2", "mock_apigatewayv2")
+mock_appsync = lazy_load(".appsync", "mock_appsync")
+mock_athena = lazy_load(".athena", "mock_athena")
+mock_applicationautoscaling = lazy_load(
+ ".applicationautoscaling", "mock_applicationautoscaling"
+)
+mock_autoscaling = lazy_load(".autoscaling", "mock_autoscaling")
+mock_lambda = lazy_load(
+ ".awslambda", "mock_lambda", boto3_name="lambda", backend="lambda_backends"
+)
+mock_batch = lazy_load(".batch", "mock_batch")
+mock_batch_simple = lazy_load(
+ ".batch_simple",
+ "mock_batch_simple",
+ boto3_name="batch",
+ backend="batch_simple_backends",
+)
+mock_budgets = lazy_load(".budgets", "mock_budgets")
+mock_cloudformation = lazy_load(".cloudformation", "mock_cloudformation")
+mock_cloudfront = lazy_load(".cloudfront", "mock_cloudfront")
+mock_cloudtrail = lazy_load(".cloudtrail", "mock_cloudtrail")
+mock_cloudwatch = lazy_load(".cloudwatch", "mock_cloudwatch")
+mock_codecommit = lazy_load(".codecommit", "mock_codecommit")
+mock_codepipeline = lazy_load(".codepipeline", "mock_codepipeline")
+mock_cognitoidentity = lazy_load(
+ ".cognitoidentity", "mock_cognitoidentity", boto3_name="cognito-identity"
+)
+mock_cognitoidp = lazy_load(".cognitoidp", "mock_cognitoidp", boto3_name="cognito-idp")
+mock_config = lazy_load(".config", "mock_config")
+mock_databrew = lazy_load(".databrew", "mock_databrew")
+mock_datapipeline = lazy_load(".datapipeline", "mock_datapipeline")
+mock_datasync = lazy_load(".datasync", "mock_datasync")
+mock_dax = lazy_load(".dax", "mock_dax")
+mock_dms = lazy_load(".dms", "mock_dms")
+mock_ds = lazy_load(".ds", "mock_ds")
+mock_dynamodb = lazy_load(".dynamodb", "mock_dynamodb")
+mock_dynamodb2 = lazy_load(
+ ".dynamodb", "mock_dynamodb", use_instead=("mock_dynamodb2", "mock_dynamodb")
+)
+mock_dynamodbstreams = lazy_load(".dynamodbstreams", "mock_dynamodbstreams")
+mock_elasticbeanstalk = lazy_load(
+ ".elasticbeanstalk", "mock_elasticbeanstalk", backend="eb_backends"
+)
+mock_ebs = lazy_load(".ebs", "mock_ebs")
+mock_ec2 = lazy_load(".ec2", "mock_ec2")
+mock_ec2instanceconnect = lazy_load(".ec2instanceconnect", "mock_ec2instanceconnect")
+mock_ecr = lazy_load(".ecr", "mock_ecr")
+mock_ecs = lazy_load(".ecs", "mock_ecs")
+mock_efs = lazy_load(".efs", "mock_efs")
+mock_eks = lazy_load(".eks", "mock_eks")
+mock_elasticache = lazy_load(
+ ".elasticache", "mock_elasticache", boto3_name="elasticache"
+)
+mock_elastictranscoder = lazy_load(".elastictranscoder", "mock_elastictranscoder")
+mock_elb = lazy_load(".elb", "mock_elb")
+mock_elbv2 = lazy_load(".elbv2", "mock_elbv2")
+mock_emr = lazy_load(".emr", "mock_emr")
+mock_emrcontainers = lazy_load(
+ ".emrcontainers", "mock_emrcontainers", boto3_name="emr-containers"
+)
+mock_es = lazy_load(".es", "mock_es")
+mock_events = lazy_load(".events", "mock_events")
+mock_firehose = lazy_load(".firehose", "mock_firehose")
+mock_forecast = lazy_load(".forecast", "mock_forecast")
+mock_greengrass = lazy_load(".greengrass", "mock_greengrass")
+mock_glacier = lazy_load(".glacier", "mock_glacier")
+mock_glue = lazy_load(".glue", "mock_glue")
+mock_guardduty = lazy_load(".guardduty", "mock_guardduty")
+mock_iam = lazy_load(".iam", "mock_iam")
+mock_iot = lazy_load(".iot", "mock_iot")
+mock_iotdata = lazy_load(".iotdata", "mock_iotdata", boto3_name="iot-data")
+mock_kinesis = lazy_load(".kinesis", "mock_kinesis")
+mock_kinesisvideo = lazy_load(".kinesisvideo", "mock_kinesisvideo")
+mock_kinesisvideoarchivedmedia = lazy_load(
+ ".kinesisvideoarchivedmedia",
+ "mock_kinesisvideoarchivedmedia",
+ boto3_name="kinesis-video-archived-media",
+)
+mock_kms = lazy_load(".kms", "mock_kms")
+mock_logs = lazy_load(".logs", "mock_logs")
+mock_managedblockchain = lazy_load(".managedblockchain", "mock_managedblockchain")
+mock_mediaconnect = lazy_load(".mediaconnect", "mock_mediaconnect")
+mock_medialive = lazy_load(".medialive", "mock_medialive")
+mock_mediapackage = lazy_load(".mediapackage", "mock_mediapackage")
+mock_mediastore = lazy_load(".mediastore", "mock_mediastore")
+mock_mediastoredata = lazy_load(
+ ".mediastoredata", "mock_mediastoredata", boto3_name="mediastore-data"
+)
+mock_mq = lazy_load(".mq", "mock_mq", boto3_name="mq")
+mock_opsworks = lazy_load(".opsworks", "mock_opsworks")
+mock_organizations = lazy_load(".organizations", "mock_organizations")
+mock_pinpoint = lazy_load(".pinpoint", "mock_pinpoint")
+mock_polly = lazy_load(".polly", "mock_polly")
+mock_quicksight = lazy_load(".quicksight", "mock_quicksight")
+mock_ram = lazy_load(".ram", "mock_ram")
+mock_rds = lazy_load(".rds", "mock_rds")
+mock_rds2 = lazy_load(".rds", "mock_rds", use_instead=("mock_rds2", "mock_rds"))
+mock_redshift = lazy_load(".redshift", "mock_redshift")
+mock_redshiftdata = lazy_load(
+ ".redshiftdata", "mock_redshiftdata", boto3_name="redshift-data"
+)
+mock_rekognition = lazy_load(
+ ".rekognition", "mock_rekognition", boto3_name="rekognition"
+)
+mock_resourcegroups = lazy_load(
+ ".resourcegroups", "mock_resourcegroups", boto3_name="resource-groups"
+)
+mock_resourcegroupstaggingapi = lazy_load(
+ ".resourcegroupstaggingapi", "mock_resourcegroupstaggingapi"
+)
+mock_route53 = lazy_load(".route53", "mock_route53")
+mock_route53resolver = lazy_load(
+ ".route53resolver", "mock_route53resolver", boto3_name="route53resolver"
+)
+mock_s3 = lazy_load(".s3", "mock_s3")
+mock_s3control = lazy_load(".s3control", "mock_s3control")
+mock_sagemaker = lazy_load(".sagemaker", "mock_sagemaker")
+mock_sdb = lazy_load(".sdb", "mock_sdb")
+mock_secretsmanager = lazy_load(".secretsmanager", "mock_secretsmanager")
+mock_ses = lazy_load(".ses", "mock_ses")
+mock_servicediscovery = lazy_load(".servicediscovery", "mock_servicediscovery")
+mock_sns = lazy_load(".sns", "mock_sns")
+mock_sqs = lazy_load(".sqs", "mock_sqs")
+mock_ssm = lazy_load(".ssm", "mock_ssm")
+mock_ssoadmin = lazy_load(".ssoadmin", "mock_ssoadmin", boto3_name="sso-admin")
+mock_stepfunctions = lazy_load(
+ ".stepfunctions", "mock_stepfunctions", backend="stepfunction_backends"
+)
+mock_sts = lazy_load(".sts", "mock_sts")
+mock_support = lazy_load(".support", "mock_support")
+mock_swf = lazy_load(".swf", "mock_swf")
+mock_timestreamwrite = lazy_load(
+ ".timestreamwrite", "mock_timestreamwrite", boto3_name="timestream-write"
+)
+mock_transcribe = lazy_load(".transcribe", "mock_transcribe")
+XRaySegment = lazy_load(".xray", "XRaySegment")
+mock_xray = lazy_load(".xray", "mock_xray")
+mock_xray_client = lazy_load(".xray", "mock_xray_client")
+mock_wafv2 = lazy_load(".wafv2", "mock_wafv2")
+mock_textract = lazy_load(".textract", "mock_textract")
+
+
+class MockAll(ContextDecorator):
+ def __init__(self):
+ self.mocks = []
+ for mock in dir(sys.modules["moto"]):
+ if (
+ mock.startswith("mock_")
+ and not mock.endswith("_deprecated")
+ and not mock == ("mock_all")
+ ):
+ self.mocks.append(globals()[mock]())
+
+ def __enter__(self):
+ for mock in self.mocks:
+ mock.start()
+
+ def __exit__(self, *exc):
+ for mock in self.mocks:
+ mock.stop()
+
+
+mock_all = MockAll
+
+# import logging
+# logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+__title__ = "moto"
+__version__ = "3.1.12"
+
+
+try:
+ # Need to monkey-patch botocore requests back to underlying urllib3 classes
+ from botocore.awsrequest import (
+ HTTPSConnectionPool,
+ HTTPConnectionPool,
+ HTTPConnection,
+ VerifiedHTTPSConnection,
+ )
+except ImportError:
+ pass
+else:
+ HTTPSConnectionPool.ConnectionCls = VerifiedHTTPSConnection
+ HTTPConnectionPool.ConnectionCls = HTTPConnection
diff --git a/contrib/python/moto/py3/moto/acm/__init__.py b/contrib/python/moto/py3/moto/acm/__init__.py
new file mode 100644
index 0000000000..dc896d0ed7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/acm/__init__.py
@@ -0,0 +1,5 @@
+from .models import acm_backends
+from ..core.models import base_decorator
+
+acm_backend = acm_backends["us-east-1"]
+mock_acm = base_decorator(acm_backends)
diff --git a/contrib/python/moto/py3/moto/acm/models.py b/contrib/python/moto/py3/moto/acm/models.py
new file mode 100644
index 0000000000..3a3f3e1e6f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/acm/models.py
@@ -0,0 +1,581 @@
+import base64
+import re
+import datetime
+from moto.core import BaseBackend, BaseModel
+from moto.core.exceptions import AWSError
+from moto.core.utils import BackendDict
+from moto import settings
+
+from .utils import make_arn_for_certificate
+
+import cryptography.x509
+import cryptography.hazmat.primitives.asymmetric.rsa
+from cryptography.hazmat.primitives import serialization, hashes
+from cryptography.hazmat.backends import default_backend
+
+from moto.core import get_account_id
+
+
+AWS_ROOT_CA = b"""-----BEGIN CERTIFICATE-----
+MIIESTCCAzGgAwIBAgITBntQXCplJ7wevi2i0ZmY7bibLDANBgkqhkiG9w0BAQsF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAxMB4XDTE1MTAyMTIyMjQzNFoXDTQwMTAyMTIyMjQzNFowRjEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEVMBMGA1UECxMMU2VydmVyIENB
+IDFCMQ8wDQYDVQQDEwZBbWF6b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDCThZn3c68asg3Wuw6MLAd5tES6BIoSMzoKcG5blPVo+sDORrMd4f2AbnZ
+cMzPa43j4wNxhplty6aUKk4T1qe9BOwKFjwK6zmxxLVYo7bHViXsPlJ6qOMpFge5
+blDP+18x+B26A0piiQOuPkfyDyeR4xQghfj66Yo19V+emU3nazfvpFA+ROz6WoVm
+B5x+F2pV8xeKNR7u6azDdU5YVX1TawprmxRC1+WsAYmz6qP+z8ArDITC2FMVy2fw
+0IjKOtEXc/VfmtTFch5+AfGYMGMqqvJ6LcXiAhqG5TI+Dr0RtM88k+8XUBCeQ8IG
+KuANaL7TiItKZYxK1MMuTJtV9IblAgMBAAGjggE7MIIBNzASBgNVHRMBAf8ECDAG
+AQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUWaRmBlKge5WSPKOUByeW
+dFv5PdAwHwYDVR0jBBgwFoAUhBjMhTTsvAyUlC4IWZzHshBOCggwewYIKwYBBQUH
+AQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5yb290Y2ExLmFtYXpvbnRy
+dXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDovL2NybC5yb290Y2ExLmFtYXpvbnRy
+dXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3Js
+LnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jvb3RjYTEuY3JsMBMGA1UdIAQMMAow
+CAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IBAQAfsaEKwn17DjAbi/Die0etn+PE
+gfY/I6s8NLWkxGAOUfW2o+vVowNARRVjaIGdrhAfeWHkZI6q2pI0x/IJYmymmcWa
+ZaW/2R7DvQDtxCkFkVaxUeHvENm6IyqVhf6Q5oN12kDSrJozzx7I7tHjhBK7V5Xo
+TyS4NU4EhSyzGgj2x6axDd1hHRjblEpJ80LoiXlmUDzputBXyO5mkcrplcVvlIJi
+WmKjrDn2zzKxDX5nwvkskpIjYlJcrQu4iCX1/YwZ1yNqF9LryjlilphHCACiHbhI
+RnGfN8j8KLDVmWyTYMk8V+6j0LI4+4zFh2upqGMQHL3VFVFWBek6vCDWhB/b
+ -----END CERTIFICATE-----"""
+# Added aws root CA as AWS returns chain you gave it + root CA (provided or not)
+# so for now a cheap response is just give any old root CA
+
+
+def datetime_to_epoch(date):
+ # As only Py3 has datetime.timestamp()
+ return int((date - datetime.datetime(1970, 1, 1)).total_seconds())
+
+
+class AWSValidationException(AWSError):
+ TYPE = "ValidationException"
+
+
+class AWSResourceNotFoundException(AWSError):
+ TYPE = "ResourceNotFoundException"
+
+
+class AWSTooManyTagsException(AWSError):
+ TYPE = "TooManyTagsException"
+
+
+class TagHolder(dict):
+ MAX_TAG_COUNT = 50
+ MAX_KEY_LENGTH = 128
+ MAX_VALUE_LENGTH = 256
+
+ def _validate_kv(self, key, value, index):
+ if len(key) > self.MAX_KEY_LENGTH:
+ raise AWSValidationException(
+ "Value '%s' at 'tags.%d.member.key' failed to satisfy constraint: Member must have length less than or equal to %s"
+ % (key, index, self.MAX_KEY_LENGTH)
+ )
+ if value and len(value) > self.MAX_VALUE_LENGTH:
+ raise AWSValidationException(
+ "Value '%s' at 'tags.%d.member.value' failed to satisfy constraint: Member must have length less than or equal to %s"
+ % (value, index, self.MAX_VALUE_LENGTH)
+ )
+ if key.startswith("aws:"):
+ raise AWSValidationException(
+ 'Invalid Tag Key: "%s". AWS internal tags cannot be changed with this API'
+ % key
+ )
+
+ def add(self, tags):
+ tags_copy = self.copy()
+ for i, tag in enumerate(tags):
+ key = tag["Key"]
+ value = tag.get("Value", None)
+ self._validate_kv(key, value, i + 1)
+
+ tags_copy[key] = value
+ if len(tags_copy) > self.MAX_TAG_COUNT:
+ raise AWSTooManyTagsException(
+ "the TagSet: '{%s}' contains too many Tags"
+ % ", ".join(k + "=" + str(v or "") for k, v in tags_copy.items())
+ )
+
+ self.update(tags_copy)
+
+ def remove(self, tags):
+ for i, tag in enumerate(tags):
+ key = tag["Key"]
+ value = tag.get("Value", None)
+ self._validate_kv(key, value, i + 1)
+ try:
+ # If value isnt provided, just delete key
+ if value is None:
+ del self[key]
+ # If value is provided, only delete if it matches what already exists
+ elif self[key] == value:
+ del self[key]
+ except KeyError:
+ pass
+
+ def equals(self, tags):
+ tags = {t["Key"]: t.get("Value", None) for t in tags} if tags else {}
+ return self == tags
+
+
+class CertBundle(BaseModel):
+ def __init__(
+ self,
+ certificate,
+ private_key,
+ chain=None,
+ region="us-east-1",
+ arn=None,
+ cert_type="IMPORTED",
+ cert_status="ISSUED",
+ ):
+ self.created_at = datetime.datetime.now()
+ self.cert = certificate
+ self._cert = None
+ self.common_name = None
+ self.key = private_key
+ self._key = None
+ self.chain = chain
+ self.tags = TagHolder()
+ self._chain = None
+ self.type = cert_type # Should really be an enum
+ self.status = cert_status # Should really be an enum
+ self.in_use_by = []
+
+ # AWS always returns your chain + root CA
+ if self.chain is None:
+ self.chain = AWS_ROOT_CA
+ else:
+ self.chain += b"\n" + AWS_ROOT_CA
+
+ # Takes care of PEM checking
+ self.validate_pk()
+ self.validate_certificate()
+ if chain is not None:
+ self.validate_chain()
+
+ # TODO check cert is valid, or if self-signed then a chain is provided, otherwise
+ # raise AWSValidationException('Provided certificate is not a valid self signed. Please provide either a valid self-signed certificate or certificate chain.')
+
+ # Used for when one wants to overwrite an arn
+ if arn is None:
+ self.arn = make_arn_for_certificate(get_account_id(), region)
+ else:
+ self.arn = arn
+
+ @classmethod
+ def generate_cert(cls, domain_name, region, sans=None):
+ if sans is None:
+ sans = set()
+ else:
+ sans = set(sans)
+
+ sans.add(domain_name)
+ sans = [cryptography.x509.DNSName(item) for item in sans]
+
+ key = cryptography.hazmat.primitives.asymmetric.rsa.generate_private_key(
+ public_exponent=65537, key_size=2048, backend=default_backend()
+ )
+ subject = cryptography.x509.Name(
+ [
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.COUNTRY_NAME, "US"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.STATE_OR_PROVINCE_NAME, "CA"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.LOCALITY_NAME, "San Francisco"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.ORGANIZATION_NAME, "My Company"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.COMMON_NAME, domain_name
+ ),
+ ]
+ )
+ issuer = cryptography.x509.Name(
+ [ # C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.COUNTRY_NAME, "US"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.ORGANIZATION_NAME, "Amazon"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.ORGANIZATIONAL_UNIT_NAME, "Server CA 1B"
+ ),
+ cryptography.x509.NameAttribute(
+ cryptography.x509.NameOID.COMMON_NAME, "Amazon"
+ ),
+ ]
+ )
+ cert = (
+ cryptography.x509.CertificateBuilder()
+ .subject_name(subject)
+ .issuer_name(issuer)
+ .public_key(key.public_key())
+ .serial_number(cryptography.x509.random_serial_number())
+ .not_valid_before(datetime.datetime.utcnow())
+ .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365))
+ .add_extension(
+ cryptography.x509.SubjectAlternativeName(sans), critical=False
+ )
+ .sign(key, hashes.SHA512(), default_backend())
+ )
+
+ cert_armored = cert.public_bytes(serialization.Encoding.PEM)
+ private_key = key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption(),
+ )
+
+ return cls(
+ cert_armored,
+ private_key,
+ cert_type="AMAZON_ISSUED",
+ cert_status="PENDING_VALIDATION",
+ region=region,
+ )
+
+ def validate_pk(self):
+ try:
+ self._key = serialization.load_pem_private_key(
+ self.key, password=None, backend=default_backend()
+ )
+
+ if self._key.key_size > 2048:
+ AWSValidationException(
+ "The private key length is not supported. Only 1024-bit and 2048-bit are allowed."
+ )
+
+ except Exception as err:
+ if isinstance(err, AWSValidationException):
+ raise
+ raise AWSValidationException(
+ "The private key is not PEM-encoded or is not valid."
+ )
+
+ def validate_certificate(self):
+ try:
+ self._cert = cryptography.x509.load_pem_x509_certificate(
+ self.cert, default_backend()
+ )
+
+ now = datetime.datetime.utcnow()
+ if self._cert.not_valid_after < now:
+ raise AWSValidationException(
+ "The certificate has expired, is not valid."
+ )
+
+ if self._cert.not_valid_before > now:
+ raise AWSValidationException(
+ "The certificate is not in effect yet, is not valid."
+ )
+
+ # Extracting some common fields for ease of use
+ # Have to search through cert.subject for OIDs
+ self.common_name = self._cert.subject.get_attributes_for_oid(
+ cryptography.x509.OID_COMMON_NAME
+ )[0].value
+
+ except Exception as err:
+ if isinstance(err, AWSValidationException):
+ raise
+ raise AWSValidationException(
+ "The certificate is not PEM-encoded or is not valid."
+ )
+
+ def validate_chain(self):
+ try:
+ self._chain = []
+
+ for cert_armored in self.chain.split(b"-\n-"):
+ # Would leave encoded but Py2 does not have raw binary strings
+ cert_armored = cert_armored.decode()
+
+ # Fix missing -'s on split
+ cert_armored = re.sub(r"^----B", "-----B", cert_armored)
+ cert_armored = re.sub(r"E----$", "E-----", cert_armored)
+ cert = cryptography.x509.load_pem_x509_certificate(
+ cert_armored.encode(), default_backend()
+ )
+ self._chain.append(cert)
+
+ now = datetime.datetime.now()
+ if self._cert.not_valid_after < now:
+ raise AWSValidationException(
+ "The certificate chain has expired, is not valid."
+ )
+
+ if self._cert.not_valid_before > now:
+ raise AWSValidationException(
+ "The certificate chain is not in effect yet, is not valid."
+ )
+
+ except Exception as err:
+ if isinstance(err, AWSValidationException):
+ raise
+ raise AWSValidationException(
+ "The certificate is not PEM-encoded or is not valid."
+ )
+
+ def check(self):
+ # Basically, if the certificate is pending, and then checked again after a
+ # while, it will appear as if its been validated. The default wait time is 60
+ # seconds but you can set an environment to change it.
+ waited_seconds = (datetime.datetime.now() - self.created_at).total_seconds()
+ if (
+ self.type == "AMAZON_ISSUED"
+ and self.status == "PENDING_VALIDATION"
+ and waited_seconds > settings.ACM_VALIDATION_WAIT
+ ):
+ self.status = "ISSUED"
+
+ def describe(self):
+ # 'RenewalSummary': {}, # Only when cert is amazon issued
+ if self._key.key_size == 1024:
+ key_algo = "RSA_1024"
+ elif self._key.key_size == 2048:
+ key_algo = "RSA_2048"
+ else:
+ key_algo = "EC_prime256v1"
+
+ # Look for SANs
+ try:
+ san_obj = self._cert.extensions.get_extension_for_oid(
+ cryptography.x509.OID_SUBJECT_ALTERNATIVE_NAME
+ )
+ except cryptography.x509.ExtensionNotFound:
+ san_obj = None
+ sans = []
+ if san_obj is not None:
+ sans = [item.value for item in san_obj.value]
+
+ result = {
+ "Certificate": {
+ "CertificateArn": self.arn,
+ "DomainName": self.common_name,
+ "InUseBy": self.in_use_by,
+ "Issuer": self._cert.issuer.get_attributes_for_oid(
+ cryptography.x509.OID_COMMON_NAME
+ )[0].value,
+ "KeyAlgorithm": key_algo,
+ "NotAfter": datetime_to_epoch(self._cert.not_valid_after),
+ "NotBefore": datetime_to_epoch(self._cert.not_valid_before),
+ "Serial": str(self._cert.serial_number),
+ "SignatureAlgorithm": self._cert.signature_algorithm_oid._name.upper().replace(
+ "ENCRYPTION", ""
+ ),
+ "Status": self.status, # One of PENDING_VALIDATION, ISSUED, INACTIVE, EXPIRED, VALIDATION_TIMED_OUT, REVOKED, FAILED.
+ "Subject": "CN={0}".format(self.common_name),
+ "SubjectAlternativeNames": sans,
+ "Type": self.type, # One of IMPORTED, AMAZON_ISSUED,
+ "ExtendedKeyUsages": [],
+ "RenewalEligibility": "INELIGIBLE",
+ "Options": {"CertificateTransparencyLoggingPreference": "ENABLED"},
+ "DomainValidationOptions": [{"DomainName": self.common_name}],
+ }
+ }
+
+ if self.status == "PENDING_VALIDATION":
+ result["Certificate"]["DomainValidationOptions"][0][
+ "ValidationDomain"
+ ] = self.common_name
+ result["Certificate"]["DomainValidationOptions"][0][
+ "ValidationStatus"
+ ] = self.status
+ result["Certificate"]["DomainValidationOptions"][0]["ResourceRecord"] = {
+ "Name": f"_d930b28be6c5927595552b219965053e.{self.common_name}.",
+ "Type": "CNAME",
+ "Value": "_c9edd76ee4a0e2a74388032f3861cc50.ykybfrwcxw.acm-validations.aws.",
+ }
+ result["Certificate"]["DomainValidationOptions"][0][
+ "ValidationMethod"
+ ] = "DNS"
+ if self.type == "IMPORTED":
+ result["Certificate"]["ImportedAt"] = datetime_to_epoch(self.created_at)
+ else:
+ result["Certificate"]["CreatedAt"] = datetime_to_epoch(self.created_at)
+ result["Certificate"]["IssuedAt"] = datetime_to_epoch(self.created_at)
+
+ return result
+
+ def serialize_pk(self, passphrase_bytes):
+ pk_bytes = self._key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.PKCS8,
+ encryption_algorithm=serialization.BestAvailableEncryption(
+ passphrase_bytes
+ ),
+ )
+ return pk_bytes.decode("utf-8")
+
+ def __str__(self):
+ return self.arn
+
+ def __repr__(self):
+ return "<Certificate>"
+
+
+class AWSCertificateManagerBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._certificates = {}
+ self._idempotency_tokens = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "acm-pca"
+ )
+
+ @staticmethod
+ def _arn_not_found(arn):
+ msg = "Certificate with arn {0} not found in account {1}".format(
+ arn, get_account_id()
+ )
+ return AWSResourceNotFoundException(msg)
+
+ def set_certificate_in_use_by(self, arn, load_balancer_name):
+ if arn not in self._certificates:
+ raise self._arn_not_found(arn)
+
+ cert_bundle = self._certificates[arn]
+ cert_bundle.in_use_by.append(load_balancer_name)
+
+ def _get_arn_from_idempotency_token(self, token):
+ """
+ If token doesnt exist, return None, later it will be
+ set with an expiry and arn.
+
+ If token expiry has passed, delete entry and return None
+
+ Else return ARN
+
+ :param token: String token
+ :return: None or ARN
+ """
+ now = datetime.datetime.now()
+ if token in self._idempotency_tokens:
+ if self._idempotency_tokens[token]["expires"] < now:
+ # Token has expired, new request
+ del self._idempotency_tokens[token]
+ return None
+ else:
+ return self._idempotency_tokens[token]["arn"]
+
+ return None
+
+ def _set_idempotency_token_arn(self, token, arn):
+ self._idempotency_tokens[token] = {
+ "arn": arn,
+ "expires": datetime.datetime.now() + datetime.timedelta(hours=1),
+ }
+
+ def import_cert(self, certificate, private_key, chain=None, arn=None, tags=None):
+ if arn is not None:
+ if arn not in self._certificates:
+ raise self._arn_not_found(arn)
+ else:
+ # Will reuse provided ARN
+ bundle = CertBundle(
+ certificate,
+ private_key,
+ chain=chain,
+ region=self.region_name,
+ arn=arn,
+ )
+ else:
+ # Will generate a random ARN
+ bundle = CertBundle(
+ certificate, private_key, chain=chain, region=self.region_name
+ )
+
+ self._certificates[bundle.arn] = bundle
+
+ if tags:
+ self.add_tags_to_certificate(bundle.arn, tags)
+
+ return bundle.arn
+
+ def get_certificates_list(self, statuses):
+ """
+ Get list of certificates
+
+ :return: List of certificates
+ :rtype: list of CertBundle
+ """
+ for arn in self._certificates.keys():
+ cert = self.get_certificate(arn)
+ if not statuses or cert.status in statuses:
+ yield cert
+
+ def get_certificate(self, arn):
+ if arn not in self._certificates:
+ raise self._arn_not_found(arn)
+
+ cert_bundle = self._certificates[arn]
+ cert_bundle.check()
+ return cert_bundle
+
+ def delete_certificate(self, arn):
+ if arn not in self._certificates:
+ raise self._arn_not_found(arn)
+
+ del self._certificates[arn]
+
+ def request_certificate(
+ self,
+ domain_name,
+ idempotency_token,
+ subject_alt_names,
+ tags=None,
+ ):
+ """
+ The parameter DomainValidationOptions has not yet been implemented
+ """
+ if idempotency_token is not None:
+ arn = self._get_arn_from_idempotency_token(idempotency_token)
+ if arn and self._certificates[arn].tags.equals(tags):
+ return arn
+
+ cert = CertBundle.generate_cert(
+ domain_name, region=self.region_name, sans=subject_alt_names
+ )
+ if idempotency_token is not None:
+ self._set_idempotency_token_arn(idempotency_token, cert.arn)
+ self._certificates[cert.arn] = cert
+
+ if tags:
+ cert.tags.add(tags)
+
+ return cert.arn
+
+ def add_tags_to_certificate(self, arn, tags):
+ # get_cert does arn check
+ cert_bundle = self.get_certificate(arn)
+ cert_bundle.tags.add(tags)
+
+ def remove_tags_from_certificate(self, arn, tags):
+ # get_cert does arn check
+ cert_bundle = self.get_certificate(arn)
+ cert_bundle.tags.remove(tags)
+
+ def export_certificate(self, certificate_arn, passphrase):
+ passphrase_bytes = base64.standard_b64decode(passphrase)
+ cert_bundle = self.get_certificate(certificate_arn)
+
+ certificate = cert_bundle.cert.decode()
+ certificate_chain = cert_bundle.chain.decode()
+ private_key = cert_bundle.serialize_pk(passphrase_bytes)
+
+ return certificate, certificate_chain, private_key
+
+
+acm_backends = BackendDict(AWSCertificateManagerBackend, "ec2")
diff --git a/contrib/python/moto/py3/moto/acm/responses.py b/contrib/python/moto/py3/moto/acm/responses.py
new file mode 100644
index 0000000000..d0696e5f4f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/acm/responses.py
@@ -0,0 +1,259 @@
+import json
+import base64
+
+from moto.core.responses import BaseResponse
+from .models import acm_backends, AWSValidationException
+
+
+class AWSCertificateManagerResponse(BaseResponse):
+ @property
+ def acm_backend(self):
+ """
+ ACM Backend
+
+ :return: ACM Backend object
+ :rtype: moto.acm.models.AWSCertificateManagerBackend
+ """
+ return acm_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def add_tags_to_certificate(self):
+ arn = self._get_param("CertificateArn")
+ tags = self._get_param("Tags")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ self.acm_backend.add_tags_to_certificate(arn, tags)
+
+ return ""
+
+ def delete_certificate(self):
+ arn = self._get_param("CertificateArn")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ self.acm_backend.delete_certificate(arn)
+
+ return ""
+
+ def describe_certificate(self):
+ arn = self._get_param("CertificateArn")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ cert_bundle = self.acm_backend.get_certificate(arn)
+
+ return json.dumps(cert_bundle.describe())
+
+ def get_certificate(self):
+ arn = self._get_param("CertificateArn")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ cert_bundle = self.acm_backend.get_certificate(arn)
+
+ result = {
+ "Certificate": cert_bundle.cert.decode(),
+ "CertificateChain": cert_bundle.chain.decode(),
+ }
+ return json.dumps(result)
+
+ def import_certificate(self):
+ """
+ Returns errors on:
+ Certificate, PrivateKey or Chain not being properly formatted
+ Arn not existing if its provided
+ PrivateKey size > 2048
+ Certificate expired or is not yet in effect
+
+ Does not return errors on:
+ Checking Certificate is legit, or a selfsigned chain is provided
+
+ :return: str(JSON) for response
+ """
+ certificate = self._get_param("Certificate")
+ private_key = self._get_param("PrivateKey")
+ chain = self._get_param("CertificateChain") # Optional
+ current_arn = self._get_param("CertificateArn") # Optional
+ tags = self._get_param("Tags") # Optional
+
+ # Simple parameter decoding. Rather do it here as its a data transport decision not part of the
+ # actual data
+ try:
+ certificate = base64.standard_b64decode(certificate)
+ except Exception:
+ raise AWSValidationException(
+ "The certificate is not PEM-encoded or is not valid."
+ )
+ try:
+ private_key = base64.standard_b64decode(private_key)
+ except Exception:
+ raise AWSValidationException(
+ "The private key is not PEM-encoded or is not valid."
+ )
+ if chain is not None:
+ try:
+ chain = base64.standard_b64decode(chain)
+ except Exception:
+ raise AWSValidationException(
+ "The certificate chain is not PEM-encoded or is not valid."
+ )
+
+ arn = self.acm_backend.import_cert(
+ certificate, private_key, chain=chain, arn=current_arn, tags=tags
+ )
+
+ return json.dumps({"CertificateArn": arn})
+
+ def list_certificates(self):
+ certs = []
+ statuses = self._get_param("CertificateStatuses")
+ for cert_bundle in self.acm_backend.get_certificates_list(statuses):
+ certs.append(
+ {
+ "CertificateArn": cert_bundle.arn,
+ "DomainName": cert_bundle.common_name,
+ }
+ )
+
+ result = {"CertificateSummaryList": certs}
+ return json.dumps(result)
+
+ def list_tags_for_certificate(self):
+ arn = self._get_param("CertificateArn")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return {"__type": "MissingParameter", "message": msg}, dict(status=400)
+
+ cert_bundle = self.acm_backend.get_certificate(arn)
+
+ result = {"Tags": []}
+ # Tag "objects" can not contain the Value part
+ for key, value in cert_bundle.tags.items():
+ tag_dict = {"Key": key}
+ if value is not None:
+ tag_dict["Value"] = value
+ result["Tags"].append(tag_dict)
+
+ return json.dumps(result)
+
+ def remove_tags_from_certificate(self):
+ arn = self._get_param("CertificateArn")
+ tags = self._get_param("Tags")
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ self.acm_backend.remove_tags_from_certificate(arn, tags)
+
+ return ""
+
+ def request_certificate(self):
+ domain_name = self._get_param("DomainName")
+ idempotency_token = self._get_param("IdempotencyToken")
+ subject_alt_names = self._get_param("SubjectAlternativeNames")
+ tags = self._get_param("Tags") # Optional
+
+ if subject_alt_names is not None and len(subject_alt_names) > 10:
+ # There is initial AWS limit of 10
+ msg = (
+ "An ACM limit has been exceeded. Need to request SAN limit to be raised"
+ )
+ return (
+ json.dumps({"__type": "LimitExceededException", "message": msg}),
+ dict(status=400),
+ )
+
+ arn = self.acm_backend.request_certificate(
+ domain_name,
+ idempotency_token,
+ subject_alt_names,
+ tags,
+ )
+
+ return json.dumps({"CertificateArn": arn})
+
+ def resend_validation_email(self):
+ arn = self._get_param("CertificateArn")
+ domain = self._get_param("Domain")
+ # ValidationDomain not used yet.
+ # Contains domain which is equal to or a subset of Domain
+ # that AWS will send validation emails to
+ # https://docs.aws.amazon.com/acm/latest/APIReference/API_ResendValidationEmail.html
+ # validation_domain = self._get_param('ValidationDomain')
+
+ if arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ cert_bundle = self.acm_backend.get_certificate(arn)
+
+ if cert_bundle.common_name != domain:
+ msg = "Parameter Domain does not match certificate domain"
+ _type = "InvalidDomainValidationOptionsException"
+ return json.dumps({"__type": _type, "message": msg}), dict(status=400)
+
+ return ""
+
+ def export_certificate(self):
+ certificate_arn = self._get_param("CertificateArn")
+ passphrase = self._get_param("Passphrase")
+
+ if certificate_arn is None:
+ msg = "A required parameter for the specified action is not supplied."
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ (
+ certificate,
+ certificate_chain,
+ private_key,
+ ) = self.acm_backend.export_certificate(
+ certificate_arn=certificate_arn, passphrase=passphrase
+ )
+ return json.dumps(
+ dict(
+ Certificate=certificate,
+ CertificateChain=certificate_chain,
+ PrivateKey=private_key,
+ )
+ )
diff --git a/contrib/python/moto/py3/moto/acm/urls.py b/contrib/python/moto/py3/moto/acm/urls.py
new file mode 100644
index 0000000000..0c3d4c5881
--- /dev/null
+++ b/contrib/python/moto/py3/moto/acm/urls.py
@@ -0,0 +1,5 @@
+from .responses import AWSCertificateManagerResponse
+
+url_bases = [r"https?://acm\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": AWSCertificateManagerResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/acm/utils.py b/contrib/python/moto/py3/moto/acm/utils.py
new file mode 100644
index 0000000000..6d695d95ce
--- /dev/null
+++ b/contrib/python/moto/py3/moto/acm/utils.py
@@ -0,0 +1,9 @@
+import uuid
+
+
+def make_arn_for_certificate(account_id, region_name):
+ # Example
+ # arn:aws:acm:eu-west-2:764371465172:certificate/c4b738b8-56fe-4b3a-b841-1c047654780b
+ return "arn:aws:acm:{0}:{1}:certificate/{2}".format(
+ region_name, account_id, uuid.uuid4()
+ )
diff --git a/contrib/python/moto/py3/moto/apigateway/__init__.py b/contrib/python/moto/py3/moto/apigateway/__init__.py
new file mode 100644
index 0000000000..436ec6fec8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/__init__.py
@@ -0,0 +1,5 @@
+from .models import apigateway_backends
+from ..core.models import base_decorator
+
+apigateway_backend = apigateway_backends["us-east-1"]
+mock_apigateway = base_decorator(apigateway_backends)
diff --git a/contrib/python/moto/py3/moto/apigateway/exceptions.py b/contrib/python/moto/py3/moto/apigateway/exceptions.py
new file mode 100644
index 0000000000..d8373bb8d2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/exceptions.py
@@ -0,0 +1,285 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class ApiGatewayException(JsonRESTError):
+ pass
+
+
+class BadRequestException(ApiGatewayException):
+ def __init__(self, message):
+ super().__init__("BadRequestException", message)
+
+
+class NotFoundException(ApiGatewayException):
+ def __init__(self, message):
+ super().__init__("NotFoundException", message)
+
+
+class AccessDeniedException(ApiGatewayException):
+ pass
+
+
+class ConflictException(ApiGatewayException):
+ code = 409
+
+ def __init__(self, message):
+ super().__init__("ConflictException", message)
+
+
+class AwsProxyNotAllowed(BadRequestException):
+ def __init__(self):
+ super().__init__(
+ "Integrations of type 'AWS_PROXY' currently only supports Lambda function and Firehose stream invocations."
+ )
+
+
+class CrossAccountNotAllowed(AccessDeniedException):
+ def __init__(self):
+ super().__init__(
+ "AccessDeniedException", "Cross-account pass role is not allowed."
+ )
+
+
+class RoleNotSpecified(BadRequestException):
+ def __init__(self):
+ super().__init__("Role ARN must be specified for AWS integrations")
+
+
+class IntegrationMethodNotDefined(BadRequestException):
+ def __init__(self):
+ super().__init__("Enumeration value for HttpMethod must be non-empty")
+
+
+class InvalidOpenAPIDocumentException(BadRequestException):
+ def __init__(self, cause):
+ super().__init__(
+ f"Failed to parse the uploaded OpenAPI document due to: {cause.message}"
+ )
+
+
+class InvalidOpenApiDocVersionException(BadRequestException):
+ def __init__(self):
+ super().__init__("Only OpenAPI 3.x.x are currently supported")
+
+
+class InvalidOpenApiModeException(BadRequestException):
+ def __init__(self):
+ super().__init__(
+ 'Enumeration value of OpenAPI import mode must be "overwrite" or "merge"',
+ )
+
+
+class InvalidResourcePathException(BadRequestException):
+ def __init__(self):
+ super().__init__(
+ "Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end and an optional plus sign before the closing brace."
+ )
+
+
+class InvalidHttpEndpoint(BadRequestException):
+ def __init__(self):
+ super().__init__("Invalid HTTP endpoint specified for URI")
+
+
+class InvalidArn(BadRequestException):
+ def __init__(self):
+ super().__init__("Invalid ARN specified in the request")
+
+
+class InvalidIntegrationArn(BadRequestException):
+ def __init__(self):
+ super().__init__("AWS ARN for integration must contain path or action")
+
+
+class InvalidRequestInput(BadRequestException):
+ def __init__(self):
+ super().__init__("Invalid request input")
+
+
+class NoIntegrationDefined(NotFoundException):
+ def __init__(self):
+ super().__init__("No integration defined for method")
+
+
+class NoIntegrationResponseDefined(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Response status code specified")
+
+
+class NoMethodDefined(BadRequestException):
+ def __init__(self):
+ super().__init__("The REST API doesn't contain any methods")
+
+
+class AuthorizerNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Authorizer identifier specified")
+
+
+class StageNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid stage identifier specified")
+
+
+class ApiKeyNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid API Key identifier specified")
+
+
+class UsagePlanNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Usage Plan ID specified")
+
+
+class ApiKeyAlreadyExists(ApiGatewayException):
+ code = 409
+
+ def __init__(self):
+ super().__init__("ConflictException", "API Key already exists")
+
+
+class InvalidDomainName(BadRequestException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("No Domain Name specified")
+
+
+class DomainNameNotFound(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid domain name identifier specified")
+
+
+class InvalidRestApiId(BadRequestException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("No Rest API Id specified")
+
+
+class InvalidModelName(BadRequestException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("No Model Name specified")
+
+
+class RestAPINotFound(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Rest API Id specified")
+
+
+class RequestValidatorNotFound(BadRequestException):
+ code = 400
+
+ def __init__(self):
+ super().__init__("Invalid Request Validator Id specified")
+
+
+class ModelNotFound(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Model Name specified")
+
+
+class ApiKeyValueMinLength(BadRequestException):
+ code = 400
+
+ def __init__(self):
+ super().__init__("API Key value should be at least 20 characters")
+
+
+class MethodNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid Method identifier specified")
+
+
+class InvalidBasePathException(BadRequestException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "API Gateway V1 doesn't support the slash character (/) in base path mappings. "
+ "To create a multi-level base path mapping, use API Gateway V2."
+ )
+
+
+class DeploymentNotFoundException(NotFoundException):
+ def __init__(self):
+ super().__init__("Invalid Deployment identifier specified")
+
+
+class InvalidRestApiIdForBasePathMappingException(BadRequestException):
+ code = 400
+
+ def __init__(self):
+ super().__init__("Invalid REST API identifier specified")
+
+
+class InvalidStageException(BadRequestException):
+ code = 400
+
+ def __init__(self):
+ super().__init__("Invalid stage identifier specified")
+
+
+class BasePathConflictException(ConflictException):
+ def __init__(self):
+ super().__init__("Base path already exists for this domain name")
+
+
+class BasePathNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid base path mapping identifier specified")
+
+
+class ResourceIdNotFoundException(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("Invalid resource identifier specified")
+
+
+class VpcLinkNotFound(NotFoundException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("VPCLink not found")
+
+
+class ValidationException(ApiGatewayException):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
+
+
+class StageStillActive(BadRequestException):
+ def __init__(self):
+ super().__init__(
+ "Active stages pointing to this deployment must be moved or deleted"
+ )
+
+
+class GatewayResponseNotFound(NotFoundException):
+ def __init__(self):
+ super().__init__("GatewayResponse not found")
diff --git a/contrib/python/moto/py3/moto/apigateway/integration_parsers/__init__.py b/contrib/python/moto/py3/moto/apigateway/integration_parsers/__init__.py
new file mode 100644
index 0000000000..f9fa1db795
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/integration_parsers/__init__.py
@@ -0,0 +1,7 @@
+import abc
+
+
+class IntegrationParser:
+ @abc.abstractmethod
+ def invoke(self, request, integration):
+ pass
diff --git a/contrib/python/moto/py3/moto/apigateway/integration_parsers/aws_parser.py b/contrib/python/moto/py3/moto/apigateway/integration_parsers/aws_parser.py
new file mode 100644
index 0000000000..2aa644197c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/integration_parsers/aws_parser.py
@@ -0,0 +1,26 @@
+import requests
+
+from . import IntegrationParser
+
+
+class TypeAwsParser(IntegrationParser):
+ def invoke(self, request, integration):
+ # integration.uri = arn:aws:apigateway:{region}:{subdomain.service|service}:path|action/{service_api}
+ # example value = 'arn:aws:apigateway:us-west-2:dynamodb:action/PutItem'
+ try:
+ # We need a better way to support services automatically
+ # This is how AWS does it though - sending a new HTTP request to the target service
+ arn, action = integration["uri"].split("/")
+ _, _, _, region, service, path_or_action = arn.split(":")
+ if service == "dynamodb" and path_or_action == "action":
+ target_url = f"https://dynamodb.{region}.amazonaws.com/"
+ headers = {"X-Amz-Target": f"DynamoDB_20120810.{action}"}
+ res = requests.post(target_url, request.body, headers=headers)
+ return res.status_code, res.content
+ else:
+ return (
+ 400,
+ f"Integration for service {service} / {path_or_action} is not yet supported",
+ )
+ except Exception as e:
+ return 400, str(e)
diff --git a/contrib/python/moto/py3/moto/apigateway/integration_parsers/http_parser.py b/contrib/python/moto/py3/moto/apigateway/integration_parsers/http_parser.py
new file mode 100644
index 0000000000..574558465a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/integration_parsers/http_parser.py
@@ -0,0 +1,15 @@
+import requests
+
+from . import IntegrationParser
+
+
+class TypeHttpParser(IntegrationParser):
+ """
+ Parse invocations to a APIGateway resource with integration type HTTP
+ """
+
+ def invoke(self, request, integration):
+ uri = integration["uri"]
+ requests_func = getattr(requests, integration["httpMethod"].lower())
+ response = requests_func(uri)
+ return response.status_code, response.text
diff --git a/contrib/python/moto/py3/moto/apigateway/integration_parsers/unknown_parser.py b/contrib/python/moto/py3/moto/apigateway/integration_parsers/unknown_parser.py
new file mode 100644
index 0000000000..c008daff2b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/integration_parsers/unknown_parser.py
@@ -0,0 +1,11 @@
+from . import IntegrationParser
+
+
+class TypeUnknownParser(IntegrationParser):
+ """
+ Parse invocations to a APIGateway resource with an unknown integration type
+ """
+
+ def invoke(self, request, integration):
+ _type = integration["type"]
+ raise NotImplementedError("The {0} type has not been implemented".format(_type))
diff --git a/contrib/python/moto/py3/moto/apigateway/models.py b/contrib/python/moto/py3/moto/apigateway/models.py
new file mode 100644
index 0000000000..064b9c2145
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/models.py
@@ -0,0 +1,2098 @@
+from __future__ import absolute_import
+
+import random
+import string
+import re
+from collections import defaultdict
+from copy import copy
+
+from openapi_spec_validator import validate_spec
+import time
+
+from urllib.parse import urlparse
+import responses
+
+from openapi_spec_validator.exceptions import OpenAPIValidationError
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from .utils import create_id, to_path
+from moto.core.utils import path_url, BackendDict
+from .integration_parsers.aws_parser import TypeAwsParser
+from .integration_parsers.http_parser import TypeHttpParser
+from .integration_parsers.unknown_parser import TypeUnknownParser
+from .exceptions import (
+ ConflictException,
+ DeploymentNotFoundException,
+ ApiKeyNotFoundException,
+ UsagePlanNotFoundException,
+ AwsProxyNotAllowed,
+ CrossAccountNotAllowed,
+ IntegrationMethodNotDefined,
+ InvalidArn,
+ InvalidIntegrationArn,
+ InvalidHttpEndpoint,
+ InvalidOpenAPIDocumentException,
+ InvalidOpenApiDocVersionException,
+ InvalidOpenApiModeException,
+ InvalidResourcePathException,
+ AuthorizerNotFoundException,
+ StageNotFoundException,
+ ResourceIdNotFoundException,
+ RoleNotSpecified,
+ NoIntegrationDefined,
+ NoIntegrationResponseDefined,
+ NoMethodDefined,
+ ApiKeyAlreadyExists,
+ DomainNameNotFound,
+ InvalidDomainName,
+ InvalidRestApiId,
+ InvalidModelName,
+ RestAPINotFound,
+ RequestValidatorNotFound,
+ ModelNotFound,
+ ApiKeyValueMinLength,
+ InvalidBasePathException,
+ InvalidRestApiIdForBasePathMappingException,
+ InvalidStageException,
+ BasePathConflictException,
+ BasePathNotFoundException,
+ StageStillActive,
+ VpcLinkNotFound,
+ ValidationException,
+ GatewayResponseNotFound,
+)
+from ..core.models import responses_mock
+from moto.apigateway.exceptions import MethodNotFoundException
+
+STAGE_URL = "https://{api_id}.execute-api.{region_name}.amazonaws.com/{stage_name}"
+
+
+class Deployment(CloudFormationModel, dict):
+ def __init__(self, deployment_id, name, description=""):
+ super().__init__()
+ self["id"] = deployment_id
+ self["stageName"] = name
+ self["description"] = description
+ self["createdDate"] = int(time.time())
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Deployment"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::ApiGateway::Deployment"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ rest_api_id = properties["RestApiId"]
+ name = properties["StageName"]
+ desc = properties.get("Description", "")
+ backend = apigateway_backends[region_name]
+ return backend.create_deployment(
+ function_id=rest_api_id, name=name, description=desc
+ )
+
+
+class IntegrationResponse(BaseModel, dict):
+ def __init__(
+ self,
+ status_code,
+ selection_pattern=None,
+ response_templates=None,
+ content_handling=None,
+ ):
+ if response_templates is None:
+ # response_templates = {"application/json": None} # Note: removed for compatibility with TF
+ response_templates = {}
+ for key in response_templates.keys():
+ response_templates[key] = (
+ response_templates[key] or None
+ ) # required for compatibility with TF
+ self["responseTemplates"] = response_templates
+ self["statusCode"] = status_code
+ if selection_pattern:
+ self["selectionPattern"] = selection_pattern
+ if content_handling:
+ self["contentHandling"] = content_handling
+
+
+class Integration(BaseModel, dict):
+ def __init__(
+ self,
+ integration_type,
+ uri,
+ http_method,
+ request_templates=None,
+ passthrough_behavior="WHEN_NO_MATCH",
+ cache_key_parameters=None,
+ tls_config=None,
+ cache_namespace=None,
+ timeout_in_millis=None,
+ ):
+ super().__init__()
+ self["type"] = integration_type
+ self["uri"] = uri
+ self["httpMethod"] = http_method if integration_type != "MOCK" else None
+ self["passthroughBehavior"] = passthrough_behavior
+ self["cacheKeyParameters"] = cache_key_parameters or []
+ self["requestTemplates"] = request_templates
+ # self["integrationResponses"] = {"200": IntegrationResponse(200)} # commented out (tf-compat)
+ self[
+ "integrationResponses"
+ ] = None # prevent json serialization from including them if none provided
+ self["tlsConfig"] = tls_config
+ self["cacheNamespace"] = cache_namespace
+ self["timeoutInMillis"] = timeout_in_millis
+
+ def create_integration_response(
+ self, status_code, selection_pattern, response_templates, content_handling
+ ):
+ if response_templates == {}:
+ response_templates = None
+ integration_response = IntegrationResponse(
+ status_code, selection_pattern, response_templates, content_handling
+ )
+ if self.get("integrationResponses") is None:
+ self["integrationResponses"] = {}
+ self["integrationResponses"][status_code] = integration_response
+ return integration_response
+
+ def get_integration_response(self, status_code):
+ result = self.get("integrationResponses", {}).get(status_code)
+ if not result:
+ raise NoIntegrationResponseDefined()
+ return result
+
+ def delete_integration_response(self, status_code):
+ return self.get("integrationResponses", {}).pop(status_code, None)
+
+
+class MethodResponse(BaseModel, dict):
+ def __init__(self, status_code, response_models=None, response_parameters=None):
+ super().__init__()
+ self["statusCode"] = status_code
+ self["responseModels"] = response_models
+ self["responseParameters"] = response_parameters
+
+
+class Method(CloudFormationModel, dict):
+ def __init__(self, method_type, authorization_type, **kwargs):
+ super().__init__()
+ self.update(
+ dict(
+ httpMethod=method_type,
+ authorizationType=authorization_type,
+ authorizerId=kwargs.get("authorizer_id"),
+ authorizationScopes=kwargs.get("authorization_scopes"),
+ apiKeyRequired=kwargs.get("api_key_required") or False,
+ requestParameters=None,
+ requestModels=kwargs.get("request_models"),
+ methodIntegration=None,
+ operationName=kwargs.get("operation_name"),
+ requestValidatorId=kwargs.get("request_validator_id"),
+ )
+ )
+ self["methodResponses"] = {}
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Method"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::ApiGateway::Method"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ rest_api_id = properties["RestApiId"]
+ resource_id = properties["ResourceId"]
+ method_type = properties["HttpMethod"]
+ auth_type = properties["AuthorizationType"]
+ key_req = properties["ApiKeyRequired"]
+ backend = apigateway_backends[region_name]
+ m = backend.put_method(
+ function_id=rest_api_id,
+ resource_id=resource_id,
+ method_type=method_type,
+ authorization_type=auth_type,
+ api_key_required=key_req,
+ )
+ int_method = properties["Integration"]["IntegrationHttpMethod"]
+ int_type = properties["Integration"]["Type"]
+ int_uri = properties["Integration"]["Uri"]
+ backend.put_integration(
+ function_id=rest_api_id,
+ resource_id=resource_id,
+ method_type=method_type,
+ integration_type=int_type,
+ uri=int_uri,
+ integration_method=int_method,
+ )
+ return m
+
+ def create_response(self, response_code, response_models, response_parameters):
+ method_response = MethodResponse(
+ response_code, response_models, response_parameters
+ )
+ self["methodResponses"][response_code] = method_response
+ return method_response
+
+ def get_response(self, response_code):
+ return self["methodResponses"].get(response_code)
+
+ def delete_response(self, response_code):
+ return self["methodResponses"].pop(response_code, None)
+
+
+class Resource(CloudFormationModel):
+ def __init__(self, resource_id, region_name, api_id, path_part, parent_id):
+ super().__init__()
+ self.id = resource_id
+ self.region_name = region_name
+ self.api_id = api_id
+ self.path_part = path_part
+ self.parent_id = parent_id
+ self.resource_methods = {}
+ self.integration_parsers = defaultdict(TypeUnknownParser)
+ self.integration_parsers["HTTP"] = TypeHttpParser()
+ self.integration_parsers["AWS"] = TypeAwsParser()
+
+ def to_dict(self):
+ response = {
+ "path": self.get_path(),
+ "id": self.id,
+ }
+ if self.resource_methods:
+ response["resourceMethods"] = self.resource_methods
+ if self.parent_id:
+ response["parentId"] = self.parent_id
+ response["pathPart"] = self.path_part
+ return response
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Resource"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::ApiGateway::Resource"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ api_id = properties["RestApiId"]
+ parent = properties["ParentId"]
+ path = properties["PathPart"]
+
+ backend = apigateway_backends[region_name]
+ if parent == api_id:
+ # A Root path (/) is automatically created. Any new paths should use this as their parent
+ resources = backend.get_resources(function_id=api_id)
+ root_id = [resource for resource in resources if resource.path_part == "/"][
+ 0
+ ].id
+ parent = root_id
+ return backend.create_resource(
+ function_id=api_id, parent_resource_id=parent, path_part=path
+ )
+
+ def get_path(self):
+ return self.get_parent_path() + self.path_part
+
+ def get_parent_path(self):
+ if self.parent_id:
+ backend = apigateway_backends[self.region_name]
+ parent = backend.get_resource(self.api_id, self.parent_id)
+ parent_path = parent.get_path()
+ if parent_path != "/": # Root parent
+ parent_path += "/"
+ return parent_path
+ else:
+ return ""
+
+ def get_response(self, request):
+ integration = self.get_integration(request.method)
+ integration_type = integration["type"]
+
+ status, result = self.integration_parsers[integration_type].invoke(
+ request, integration
+ )
+
+ return status, result
+
+ def add_method(
+ self,
+ method_type,
+ authorization_type,
+ api_key_required,
+ request_models=None,
+ operation_name=None,
+ authorizer_id=None,
+ authorization_scopes=None,
+ request_validator_id=None,
+ ):
+ if authorization_scopes and not isinstance(authorization_scopes, list):
+ authorization_scopes = [authorization_scopes]
+ method = Method(
+ method_type=method_type,
+ authorization_type=authorization_type,
+ api_key_required=api_key_required,
+ request_models=request_models,
+ operation_name=operation_name,
+ authorizer_id=authorizer_id,
+ authorization_scopes=authorization_scopes,
+ request_validator_id=request_validator_id,
+ )
+ self.resource_methods[method_type] = method
+ return method
+
+ def get_method(self, method_type):
+ method = self.resource_methods.get(method_type)
+ if not method:
+ raise MethodNotFoundException()
+ return method
+
+ def delete_method(self, method_type):
+ self.resource_methods.pop(method_type)
+
+ def add_integration(
+ self,
+ method_type,
+ integration_type,
+ uri,
+ request_templates=None,
+ passthrough_behavior=None,
+ integration_method=None,
+ tls_config=None,
+ cache_namespace=None,
+ timeout_in_millis=None,
+ ):
+ integration_method = integration_method or method_type
+ integration = Integration(
+ integration_type,
+ uri,
+ integration_method,
+ request_templates=request_templates,
+ passthrough_behavior=passthrough_behavior,
+ tls_config=tls_config,
+ cache_namespace=cache_namespace,
+ timeout_in_millis=timeout_in_millis,
+ )
+ self.resource_methods[method_type]["methodIntegration"] = integration
+ return integration
+
+ def get_integration(self, method_type):
+ return self.resource_methods.get(method_type, {}).get("methodIntegration", {})
+
+ def delete_integration(self, method_type):
+ return self.resource_methods[method_type].pop("methodIntegration")
+
+
+class Authorizer(BaseModel, dict):
+ def __init__(self, authorizer_id, name, authorizer_type, **kwargs):
+ super().__init__()
+ self["id"] = authorizer_id
+ self["name"] = name
+ self["type"] = authorizer_type
+ if kwargs.get("provider_arns"):
+ self["providerARNs"] = kwargs.get("provider_arns")
+ if kwargs.get("auth_type"):
+ self["authType"] = kwargs.get("auth_type")
+ if kwargs.get("authorizer_uri"):
+ self["authorizerUri"] = kwargs.get("authorizer_uri")
+ if kwargs.get("authorizer_credentials"):
+ self["authorizerCredentials"] = kwargs.get("authorizer_credentials")
+ if kwargs.get("identity_source"):
+ self["identitySource"] = kwargs.get("identity_source")
+ if kwargs.get("identity_validation_expression"):
+ self["identityValidationExpression"] = kwargs.get(
+ "identity_validation_expression"
+ )
+ self["authorizerResultTtlInSeconds"] = kwargs.get("authorizer_result_ttl")
+
+ def apply_operations(self, patch_operations):
+ for op in patch_operations:
+ if "/authorizerUri" in op["path"]:
+ self["authorizerUri"] = op["value"]
+ elif "/authorizerCredentials" in op["path"]:
+ self["authorizerCredentials"] = op["value"]
+ elif "/authorizerResultTtlInSeconds" in op["path"]:
+ self["authorizerResultTtlInSeconds"] = int(op["value"])
+ elif "/authType" in op["path"]:
+ self["authType"] = op["value"]
+ elif "/identitySource" in op["path"]:
+ self["identitySource"] = op["value"]
+ elif "/identityValidationExpression" in op["path"]:
+ self["identityValidationExpression"] = op["value"]
+ elif "/name" in op["path"]:
+ self["name"] = op["value"]
+ elif "/providerARNs" in op["path"]:
+ # TODO: add and remove
+ raise Exception('Patch operation for "%s" not implemented' % op["path"])
+ elif "/type" in op["path"]:
+ self["type"] = op["value"]
+ else:
+ raise Exception('Patch operation "%s" not implemented' % op["op"])
+ return self
+
+
+class Stage(BaseModel, dict):
+ def __init__(
+ self,
+ name=None,
+ deployment_id=None,
+ variables=None,
+ description="",
+ cacheClusterEnabled=False,
+ cacheClusterSize=None,
+ tags=None,
+ tracing_enabled=None,
+ ):
+ super().__init__()
+ if variables is None:
+ variables = {}
+ self["stageName"] = name
+ self["deploymentId"] = deployment_id
+ self["methodSettings"] = {}
+ self["variables"] = variables
+ self["description"] = description
+ self["cacheClusterEnabled"] = cacheClusterEnabled
+ if self["cacheClusterEnabled"]:
+ self["cacheClusterStatus"] = "AVAILABLE"
+ self["cacheClusterSize"] = str(0.5)
+ if cacheClusterSize is not None:
+ self["cacheClusterSize"] = str(cacheClusterSize)
+ if tags is not None:
+ self["tags"] = tags
+ if tracing_enabled is not None:
+ self["tracingEnabled"] = tracing_enabled
+
+ def apply_operations(self, patch_operations):
+ for op in patch_operations:
+ if "variables/" in op["path"]:
+ self._apply_operation_to_variables(op)
+ elif "/cacheClusterEnabled" in op["path"]:
+ self["cacheClusterEnabled"] = self._str2bool(op["value"])
+ if self["cacheClusterEnabled"]:
+ self["cacheClusterStatus"] = "AVAILABLE"
+ if "cacheClusterSize" not in self:
+ self["cacheClusterSize"] = str(0.5)
+ else:
+ self["cacheClusterStatus"] = "NOT_AVAILABLE"
+ elif "/cacheClusterSize" in op["path"]:
+ self["cacheClusterSize"] = str(op["value"])
+ elif "/description" in op["path"]:
+ self["description"] = op["value"]
+ elif "/deploymentId" in op["path"]:
+ self["deploymentId"] = op["value"]
+ elif op["op"] == "replace":
+ if op["path"] == "/tracingEnabled":
+ self["tracingEnabled"] = self._str2bool(op["value"])
+ elif op["path"].startswith("/accessLogSettings/"):
+ self["accessLogSettings"] = self.get("accessLogSettings", {})
+ self["accessLogSettings"][op["path"].split("/")[-1]] = op["value"]
+ else:
+ # (e.g., path could be '/*/*/logging/loglevel')
+ split_path = op["path"].split("/", 3)
+ if len(split_path) != 4:
+ continue
+ self._patch_method_setting(
+ "/".join(split_path[1:3]), split_path[3], op["value"]
+ )
+ elif op["op"] == "remove":
+ if op["path"] == "/accessLogSettings":
+ self["accessLogSettings"] = None
+ else:
+ raise ValidationException(
+ "Member must satisfy enum value set: [add, remove, move, test, replace, copy]"
+ )
+ return self
+
+ def _patch_method_setting(self, resource_path_and_method, key, value):
+ updated_key = self._method_settings_translations(key)
+ if updated_key is not None:
+ if resource_path_and_method not in self["methodSettings"]:
+ self["methodSettings"][
+ resource_path_and_method
+ ] = self._get_default_method_settings()
+ self["methodSettings"][resource_path_and_method][
+ updated_key
+ ] = self._convert_to_type(updated_key, value)
+
+ def _get_default_method_settings(self):
+ return {
+ "throttlingRateLimit": 1000.0,
+ "dataTraceEnabled": False,
+ "metricsEnabled": False,
+ "unauthorizedCacheControlHeaderStrategy": "SUCCEED_WITH_RESPONSE_HEADER",
+ "cacheTtlInSeconds": 300,
+ "cacheDataEncrypted": True,
+ "cachingEnabled": False,
+ "throttlingBurstLimit": 2000,
+ "requireAuthorizationForCacheControl": True,
+ }
+
+ def _method_settings_translations(self, key):
+ mappings = {
+ "metrics/enabled": "metricsEnabled",
+ "logging/loglevel": "loggingLevel",
+ "logging/dataTrace": "dataTraceEnabled",
+ "throttling/burstLimit": "throttlingBurstLimit",
+ "throttling/rateLimit": "throttlingRateLimit",
+ "caching/enabled": "cachingEnabled",
+ "caching/ttlInSeconds": "cacheTtlInSeconds",
+ "caching/dataEncrypted": "cacheDataEncrypted",
+ "caching/requireAuthorizationForCacheControl": "requireAuthorizationForCacheControl",
+ "caching/unauthorizedCacheControlHeaderStrategy": "unauthorizedCacheControlHeaderStrategy",
+ }
+
+ return mappings.get(key)
+
+ def _str2bool(self, v):
+ return v.lower() == "true"
+
+ def _convert_to_type(self, key, val):
+ type_mappings = {
+ "metricsEnabled": "bool",
+ "loggingLevel": "str",
+ "dataTraceEnabled": "bool",
+ "throttlingBurstLimit": "int",
+ "throttlingRateLimit": "float",
+ "cachingEnabled": "bool",
+ "cacheTtlInSeconds": "int",
+ "cacheDataEncrypted": "bool",
+ "requireAuthorizationForCacheControl": "bool",
+ "unauthorizedCacheControlHeaderStrategy": "str",
+ }
+
+ if key in type_mappings:
+ type_value = type_mappings[key]
+
+ if type_value == "bool":
+ return self._str2bool(val)
+ elif type_value == "int":
+ return int(val)
+ elif type_value == "float":
+ return float(val)
+ else:
+ return str(val)
+ else:
+ return str(val)
+
+ def _apply_operation_to_variables(self, op):
+ key = op["path"][op["path"].rindex("variables/") + 10 :]
+ if op["op"] == "remove":
+ self["variables"].pop(key, None)
+ elif op["op"] == "replace":
+ self["variables"][key] = op["value"]
+ else:
+ raise Exception('Patch operation "%s" not implemented' % op["op"])
+
+
+class ApiKey(BaseModel, dict):
+ def __init__(
+ self,
+ name=None,
+ description=None,
+ enabled=False,
+ generateDistinctId=False, # pylint: disable=unused-argument
+ value=None,
+ stageKeys=None,
+ tags=None,
+ customerId=None,
+ ):
+ super().__init__()
+ self["id"] = create_id()
+ self["value"] = value or "".join(
+ random.sample(string.ascii_letters + string.digits, 40)
+ )
+ self["name"] = name
+ self["customerId"] = customerId
+ self["description"] = description
+ self["enabled"] = enabled
+ self["createdDate"] = self["lastUpdatedDate"] = int(time.time())
+ self["stageKeys"] = stageKeys or []
+ self["tags"] = tags
+
+ def update_operations(self, patch_operations):
+ for op in patch_operations:
+ if op["op"] == "replace":
+ if "/name" in op["path"]:
+ self["name"] = op["value"]
+ elif "/customerId" in op["path"]:
+ self["customerId"] = op["value"]
+ elif "/description" in op["path"]:
+ self["description"] = op["value"]
+ elif "/enabled" in op["path"]:
+ self["enabled"] = self._str2bool(op["value"])
+ else:
+ raise Exception('Patch operation "%s" not implemented' % op["op"])
+ return self
+
+ def _str2bool(self, v):
+ return v.lower() == "true"
+
+
+class UsagePlan(BaseModel, dict):
+ def __init__(
+ self,
+ name=None,
+ description=None,
+ apiStages=None,
+ throttle=None,
+ quota=None,
+ productCode=None,
+ tags=None,
+ ):
+ super().__init__()
+ self["id"] = create_id()
+ self["name"] = name
+ self["description"] = description
+ self["apiStages"] = apiStages if apiStages else []
+ self["throttle"] = throttle
+ self["quota"] = quota
+ self["productCode"] = productCode
+ self["tags"] = tags
+
+ def apply_patch_operations(self, patch_operations):
+ for op in patch_operations:
+ path = op["path"]
+ value = op["value"]
+ if op["op"] == "replace":
+ if "/name" in path:
+ self["name"] = value
+ if "/productCode" in path:
+ self["productCode"] = value
+ if "/description" in path:
+ self["description"] = value
+ if "/quota/limit" in path:
+ self["quota"]["limit"] = value
+ if "/quota/period" in path:
+ self["quota"]["period"] = value
+ if "/throttle/rateLimit" in path:
+ self["throttle"]["rateLimit"] = value
+ if "/throttle/burstLimit" in path:
+ self["throttle"]["burstLimit"] = value
+
+
+class RequestValidator(BaseModel, dict):
+ PROP_ID = "id"
+ PROP_NAME = "name"
+ PROP_VALIDATE_REQUEST_BODY = "validateRequestBody"
+ PROP_VALIDATE_REQUEST_PARAMETERS = "validateRequestParameters"
+
+ # operations
+ OP_PATH = "path"
+ OP_VALUE = "value"
+ OP_REPLACE = "replace"
+ OP_OP = "op"
+
+ def __init__(self, _id, name, validateRequestBody, validateRequestParameters):
+ super().__init__()
+ self[RequestValidator.PROP_ID] = _id
+ self[RequestValidator.PROP_NAME] = name
+ self[RequestValidator.PROP_VALIDATE_REQUEST_BODY] = validateRequestBody
+ self[
+ RequestValidator.PROP_VALIDATE_REQUEST_PARAMETERS
+ ] = validateRequestParameters
+
+ def apply_patch_operations(self, operations):
+ for operation in operations:
+ path = operation[RequestValidator.OP_PATH]
+ value = operation[RequestValidator.OP_VALUE]
+ if operation[RequestValidator.OP_OP] == RequestValidator.OP_REPLACE:
+ if to_path(RequestValidator.PROP_NAME) in path:
+ self[RequestValidator.PROP_NAME] = value
+ if to_path(RequestValidator.PROP_VALIDATE_REQUEST_BODY) in path:
+ self[
+ RequestValidator.PROP_VALIDATE_REQUEST_BODY
+ ] = value.lower() in ("true")
+ if to_path(RequestValidator.PROP_VALIDATE_REQUEST_PARAMETERS) in path:
+ self[
+ RequestValidator.PROP_VALIDATE_REQUEST_PARAMETERS
+ ] = value.lower() in ("true")
+
+ def to_dict(self):
+ return {
+ "id": self["id"],
+ "name": self["name"],
+ "validateRequestBody": self["validateRequestBody"],
+ "validateRequestParameters": self["validateRequestParameters"],
+ }
+
+
+class UsagePlanKey(BaseModel, dict):
+ def __init__(self, plan_id, plan_type, name, value):
+ super().__init__()
+ self["id"] = plan_id
+ self["name"] = name
+ self["type"] = plan_type
+ self["value"] = value
+
+
+class VpcLink(BaseModel, dict):
+ def __init__(self, name, description, target_arns, tags):
+ super().__init__()
+ self["id"] = create_id()
+ self["name"] = name
+ self["description"] = description
+ self["targetArns"] = target_arns
+ self["tags"] = tags
+ self["status"] = "AVAILABLE"
+
+
+class RestAPI(CloudFormationModel):
+
+ PROP_ID = "id"
+ PROP_NAME = "name"
+ PROP_DESCRIPTION = "description"
+ PROP_VERSION = "version"
+ PROP_BINARY_MEDIA_TYPES = "binaryMediaTypes"
+ PROP_CREATED_DATE = "createdDate"
+ PROP_API_KEY_SOURCE = "apiKeySource"
+ PROP_ENDPOINT_CONFIGURATION = "endpointConfiguration"
+ PROP_TAGS = "tags"
+ PROP_POLICY = "policy"
+ PROP_DISABLE_EXECUTE_API_ENDPOINT = "disableExecuteApiEndpoint"
+ PROP_MINIMUM_COMPRESSION_SIZE = "minimumCompressionSize"
+
+ # operations
+ OPERATION_ADD = "add"
+ OPERATION_REPLACE = "replace"
+ OPERATION_REMOVE = "remove"
+ OPERATION_PATH = "path"
+ OPERATION_VALUE = "value"
+ OPERATION_OP = "op"
+
+ def __init__(self, api_id, region_name, name, description, **kwargs):
+ super().__init__()
+ self.id = api_id
+ self.region_name = region_name
+ self.name = name
+ self.description = description
+ self.version = kwargs.get(RestAPI.PROP_VERSION) or "V1"
+ self.binaryMediaTypes = kwargs.get(RestAPI.PROP_BINARY_MEDIA_TYPES) or []
+ self.create_date = int(time.time())
+ self.api_key_source = kwargs.get("api_key_source") or "HEADER"
+ self.policy = kwargs.get(RestAPI.PROP_POLICY) or None
+ self.endpoint_configuration = kwargs.get("endpoint_configuration") or {
+ "types": ["EDGE"]
+ }
+ self.tags = kwargs.get(RestAPI.PROP_TAGS) or {}
+ self.disableExecuteApiEndpoint = (
+ kwargs.get(RestAPI.PROP_DISABLE_EXECUTE_API_ENDPOINT) or False
+ )
+ self.minimum_compression_size = kwargs.get("minimum_compression_size")
+ self.deployments = {}
+ self.authorizers = {}
+ self.gateway_responses = {}
+ self.stages = {}
+ self.resources = {}
+ self.models = {}
+ self.request_validators = {}
+ self.default = self.add_child("/") # Add default child
+
+ def __repr__(self):
+ return str(self.id)
+
+ def to_dict(self):
+ return {
+ self.PROP_ID: self.id,
+ self.PROP_NAME: self.name,
+ self.PROP_DESCRIPTION: self.description,
+ self.PROP_VERSION: self.version,
+ self.PROP_BINARY_MEDIA_TYPES: self.binaryMediaTypes,
+ self.PROP_CREATED_DATE: self.create_date,
+ self.PROP_API_KEY_SOURCE: self.api_key_source,
+ self.PROP_ENDPOINT_CONFIGURATION: self.endpoint_configuration,
+ self.PROP_TAGS: self.tags,
+ self.PROP_POLICY: self.policy,
+ self.PROP_DISABLE_EXECUTE_API_ENDPOINT: self.disableExecuteApiEndpoint,
+ self.PROP_MINIMUM_COMPRESSION_SIZE: self.minimum_compression_size,
+ }
+
+ def apply_patch_operations(self, patch_operations):
+
+ for op in patch_operations:
+ path = op[self.OPERATION_PATH]
+ value = ""
+ if self.OPERATION_VALUE in op:
+ value = op[self.OPERATION_VALUE]
+ operaton = op[self.OPERATION_OP]
+ if operaton == self.OPERATION_REPLACE:
+ if to_path(self.PROP_NAME) in path:
+ self.name = value
+ if to_path(self.PROP_DESCRIPTION) in path:
+ self.description = value
+ if to_path(self.PROP_API_KEY_SOURCE) in path:
+ self.api_key_source = value
+ if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
+ self.binaryMediaTypes = [value]
+ if to_path(self.PROP_DISABLE_EXECUTE_API_ENDPOINT) in path:
+ self.disableExecuteApiEndpoint = bool(value)
+ elif operaton == self.OPERATION_ADD:
+ if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
+ self.binaryMediaTypes.append(value)
+ elif operaton == self.OPERATION_REMOVE:
+ if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
+ self.binaryMediaTypes.remove(value)
+ if to_path(self.PROP_DESCRIPTION) in path:
+ self.description = ""
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["RootResourceId"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "RootResourceId":
+ for res_id, res_obj in self.resources.items():
+ if res_obj.path_part == "/" and not res_obj.parent_id:
+ return res_id
+ raise Exception("Unable to find root resource for API %s" % self)
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "RestApi"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::ApiGateway::RestApi"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ name = properties["Name"]
+ desc = properties.get("Description", "")
+ config = properties.get("EndpointConfiguration", None)
+ backend = apigateway_backends[region_name]
+ return backend.create_rest_api(
+ name=name, description=desc, endpoint_configuration=config
+ )
+
+ def add_child(self, path, parent_id=None):
+ child_id = create_id()
+ child = Resource(
+ resource_id=child_id,
+ region_name=self.region_name,
+ api_id=self.id,
+ path_part=path,
+ parent_id=parent_id,
+ )
+ self.resources[child_id] = child
+ return child
+
+ def add_model(
+ self,
+ name,
+ description=None,
+ schema=None,
+ content_type=None,
+ cli_input_json=None,
+ generate_cli_skeleton=None,
+ ):
+ model_id = create_id()
+ new_model = Model(
+ model_id=model_id,
+ name=name,
+ description=description,
+ schema=schema,
+ content_type=content_type,
+ cli_input_json=cli_input_json,
+ generate_cli_skeleton=generate_cli_skeleton,
+ )
+
+ self.models[name] = new_model
+ return new_model
+
+ def get_resource_for_path(self, path_after_stage_name):
+ for resource in self.resources.values():
+ if resource.get_path() == path_after_stage_name:
+ return resource
+ # TODO deal with no matching resource
+
+ def resource_callback(self, request):
+ path = path_url(request.url)
+ path_after_stage_name = "/" + "/".join(path.split("/")[2:])
+
+ resource = self.get_resource_for_path(path_after_stage_name)
+ status_code, response = resource.get_response(request)
+ return status_code, {}, response
+
+ def update_integration_mocks(self, stage_name):
+ stage_url_lower = STAGE_URL.format(
+ api_id=self.id.lower(), region_name=self.region_name, stage_name=stage_name
+ )
+ stage_url_upper = STAGE_URL.format(
+ api_id=self.id.upper(), region_name=self.region_name, stage_name=stage_name
+ )
+
+ for resource in self.resources.values():
+ path = resource.get_path()
+ path = "" if path == "/" else path
+
+ for http_method in resource.resource_methods.keys():
+ for url in [stage_url_lower, stage_url_upper]:
+ callback_response = responses.CallbackResponse(
+ url=url + path,
+ method=http_method,
+ callback=self.resource_callback,
+ content_type="text/plain",
+ )
+ responses_mock.add(callback_response)
+
+ def create_authorizer(
+ self,
+ authorizer_id,
+ name,
+ authorizer_type,
+ provider_arns=None,
+ auth_type=None,
+ authorizer_uri=None,
+ authorizer_credentials=None,
+ identity_source=None,
+ identiy_validation_expression=None,
+ authorizer_result_ttl=None,
+ ):
+ authorizer = Authorizer(
+ authorizer_id=authorizer_id,
+ name=name,
+ authorizer_type=authorizer_type,
+ provider_arns=provider_arns,
+ auth_type=auth_type,
+ authorizer_uri=authorizer_uri,
+ authorizer_credentials=authorizer_credentials,
+ identity_source=identity_source,
+ identiy_validation_expression=identiy_validation_expression,
+ authorizer_result_ttl=authorizer_result_ttl,
+ )
+ self.authorizers[authorizer_id] = authorizer
+ return authorizer
+
+ def create_stage(
+ self,
+ name,
+ deployment_id,
+ variables=None,
+ description="",
+ cacheClusterEnabled=None,
+ cacheClusterSize=None,
+ tags=None,
+ tracing_enabled=None,
+ ):
+ if name in self.stages:
+ raise ConflictException("Stage already exists")
+ if variables is None:
+ variables = {}
+ stage = Stage(
+ name=name,
+ deployment_id=deployment_id,
+ variables=variables,
+ description=description,
+ cacheClusterSize=cacheClusterSize,
+ cacheClusterEnabled=cacheClusterEnabled,
+ tags=tags,
+ tracing_enabled=tracing_enabled,
+ )
+ self.stages[name] = stage
+ self.update_integration_mocks(name)
+ return stage
+
+ def create_deployment(self, name, description="", stage_variables=None):
+ if stage_variables is None:
+ stage_variables = {}
+ deployment_id = create_id()
+ deployment = Deployment(deployment_id, name, description)
+ self.deployments[deployment_id] = deployment
+ if name:
+ self.stages[name] = Stage(
+ name=name, deployment_id=deployment_id, variables=stage_variables
+ )
+ self.update_integration_mocks(name)
+
+ return deployment
+
+ def get_deployment(self, deployment_id):
+ return self.deployments[deployment_id]
+
+ def get_authorizers(self):
+ return list(self.authorizers.values())
+
+ def get_stages(self):
+ return list(self.stages.values())
+
+ def get_deployments(self):
+ return list(self.deployments.values())
+
+ def delete_deployment(self, deployment_id):
+ if deployment_id not in self.deployments:
+ raise DeploymentNotFoundException()
+ deployment = self.deployments[deployment_id]
+ if deployment["stageName"] and deployment["stageName"] in self.stages:
+ # Stage is still active
+ raise StageStillActive()
+
+ return self.deployments.pop(deployment_id)
+
+ def create_request_validator(
+ self, name, validateRequestBody, validateRequestParameters
+ ):
+ validator_id = create_id()
+ request_validator = RequestValidator(
+ _id=validator_id,
+ name=name,
+ validateRequestBody=validateRequestBody,
+ validateRequestParameters=validateRequestParameters,
+ )
+ self.request_validators[validator_id] = request_validator
+ return request_validator
+
+ def get_request_validators(self):
+ return list(self.request_validators.values())
+
+ def get_request_validator(self, validator_id):
+ reqeust_validator = self.request_validators.get(validator_id)
+ if reqeust_validator is None:
+ raise RequestValidatorNotFound()
+ return reqeust_validator
+
+ def delete_request_validator(self, validator_id):
+ reqeust_validator = self.request_validators.pop(validator_id)
+ return reqeust_validator
+
+ def update_request_validator(self, validator_id, patch_operations):
+ self.request_validators[validator_id].apply_patch_operations(patch_operations)
+ return self.request_validators[validator_id]
+
+ def put_gateway_response(
+ self, response_type, status_code, response_parameters, response_templates
+ ):
+ response = GatewayResponse(
+ response_type=response_type,
+ status_code=status_code,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ )
+ self.gateway_responses[response_type] = response
+ return response
+
+ def get_gateway_response(self, response_type):
+ if response_type not in self.gateway_responses:
+ raise GatewayResponseNotFound()
+ return self.gateway_responses[response_type]
+
+ def get_gateway_responses(self):
+ return list(self.gateway_responses.values())
+
+ def delete_gateway_response(self, response_type):
+ self.gateway_responses.pop(response_type, None)
+
+
+class DomainName(BaseModel, dict):
+ def __init__(self, domain_name, **kwargs):
+ super().__init__()
+ self["domainName"] = domain_name
+ self["regionalDomainName"] = "d-%s.execute-api.%s.amazonaws.com" % (
+ create_id(),
+ kwargs.get("region_name") or "us-east-1",
+ )
+ self["distributionDomainName"] = "d%s.cloudfront.net" % create_id()
+ self["domainNameStatus"] = "AVAILABLE"
+ self["domainNameStatusMessage"] = "Domain Name Available"
+ self["regionalHostedZoneId"] = "Z2FDTNDATAQYW2"
+ self["distributionHostedZoneId"] = "Z2FDTNDATAQYW2"
+ self["certificateUploadDate"] = int(time.time())
+ if kwargs.get("certificate_name"):
+ self["certificateName"] = kwargs.get("certificate_name")
+ if kwargs.get("certificate_arn"):
+ self["certificateArn"] = kwargs.get("certificate_arn")
+ if kwargs.get("certificate_body"):
+ self["certificateBody"] = kwargs.get("certificate_body")
+ if kwargs.get("tags"):
+ self["tags"] = kwargs.get("tags")
+ if kwargs.get("security_policy"):
+ self["securityPolicy"] = kwargs.get("security_policy")
+ if kwargs.get("certificate_chain"):
+ self["certificateChain"] = kwargs.get("certificate_chain")
+ if kwargs.get("regional_certificate_name"):
+ self["regionalCertificateName"] = kwargs.get("regional_certificate_name")
+ if kwargs.get("certificate_private_key"):
+ self["certificatePrivateKey"] = kwargs.get("certificate_private_key")
+ if kwargs.get("regional_certificate_arn"):
+ self["regionalCertificateArn"] = kwargs.get("regional_certificate_arn")
+ if kwargs.get("endpoint_configuration"):
+ self["endpointConfiguration"] = kwargs.get("endpoint_configuration")
+ if kwargs.get("generate_cli_skeleton"):
+ self["generateCliSkeleton"] = kwargs.get("generate_cli_skeleton")
+
+
+class Model(BaseModel, dict):
+ def __init__(self, model_id, name, **kwargs):
+ super().__init__()
+ self["id"] = model_id
+ self["name"] = name
+ if kwargs.get("description"):
+ self["description"] = kwargs.get("description")
+ if kwargs.get("schema"):
+ self["schema"] = kwargs.get("schema")
+ if kwargs.get("content_type"):
+ self["contentType"] = kwargs.get("content_type")
+ if kwargs.get("cli_input_json"):
+ self["cliInputJson"] = kwargs.get("cli_input_json")
+ if kwargs.get("generate_cli_skeleton"):
+ self["generateCliSkeleton"] = kwargs.get("generate_cli_skeleton")
+
+
+class BasePathMapping(BaseModel, dict):
+
+ # operations
+ OPERATION_REPLACE = "replace"
+ OPERATION_PATH = "path"
+ OPERATION_VALUE = "value"
+ OPERATION_OP = "op"
+
+ def __init__(self, domain_name, rest_api_id, **kwargs):
+ super().__init__()
+ self["domain_name"] = domain_name
+ self["restApiId"] = rest_api_id
+ if kwargs.get("basePath"):
+ self["basePath"] = kwargs.get("basePath")
+ else:
+ self["basePath"] = "(none)"
+ if kwargs.get("stage"):
+ self["stage"] = kwargs.get("stage")
+
+ def apply_patch_operations(self, patch_operations):
+
+ for op in patch_operations:
+ path = op["path"]
+ value = op["value"]
+ operation = op["op"]
+ if operation == self.OPERATION_REPLACE:
+ if "/basePath" in path:
+ self["basePath"] = value
+ if "/restapiId" in path:
+ self["restApiId"] = value
+ if "/stage" in path:
+ self["stage"] = value
+
+
+class GatewayResponse(BaseModel, dict):
+ def __init__(
+ self, response_type, status_code, response_parameters, response_templates
+ ):
+ super().__init__()
+ self["responseType"] = response_type
+ if status_code is not None:
+ self["statusCode"] = status_code
+ if response_parameters is not None:
+ self["responseParameters"] = response_parameters
+ if response_templates is not None:
+ self["responseTemplates"] = response_templates
+ self["defaultResponse"] = False
+
+
+class APIGatewayBackend(BaseBackend):
+ """
+ API Gateway mock.
+
+ The public URLs of an API integration are mocked as well, i.e. the following would be supported in Moto:
+
+ .. sourcecode:: python
+
+ client.put_integration(
+ restApiId=api_id,
+ ...,
+ uri="http://httpbin.org/robots.txt",
+ integrationHttpMethod="GET"
+ )
+ deploy_url = f"https://{api_id}.execute-api.us-east-1.amazonaws.com/dev"
+ requests.get(deploy_url).content.should.equal(b"a fake response")
+
+ Limitations:
+ - Integrations of type HTTP are supported
+ - Integrations of type AWS with service DynamoDB are supported
+ - Other types (AWS_PROXY, MOCK, etc) are ignored
+ - Other services are not yet supported
+ - The BasePath of an API is ignored
+ - TemplateMapping is not yet supported for requests/responses
+ - This only works when using the decorators, not in ServerMode
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.apis = {}
+ self.keys = {}
+ self.usage_plans = {}
+ self.usage_plan_keys = {}
+ self.domain_names = {}
+ self.models = {}
+ self.base_path_mappings = {}
+ self.vpc_links = {}
+
+ def create_rest_api(
+ self,
+ name,
+ description,
+ api_key_source=None,
+ endpoint_configuration=None,
+ tags=None,
+ policy=None,
+ minimum_compression_size=None,
+ ):
+ api_id = create_id()
+ rest_api = RestAPI(
+ api_id,
+ self.region_name,
+ name,
+ description,
+ api_key_source=api_key_source,
+ endpoint_configuration=endpoint_configuration,
+ tags=tags,
+ policy=policy,
+ minimum_compression_size=minimum_compression_size,
+ )
+ self.apis[api_id] = rest_api
+ return rest_api
+
+ def import_rest_api(self, api_doc, fail_on_warnings):
+ """
+ Only a subset of the OpenAPI spec 3.x is currently implemented.
+ """
+ if fail_on_warnings:
+ try:
+ validate_spec(api_doc)
+ except OpenAPIValidationError as e:
+ raise InvalidOpenAPIDocumentException(e)
+ name = api_doc["info"]["title"]
+ description = api_doc["info"]["description"]
+ api = self.create_rest_api(name=name, description=description)
+ self.put_rest_api(api.id, api_doc, fail_on_warnings=fail_on_warnings)
+ return api
+
+ def get_rest_api(self, function_id):
+ rest_api = self.apis.get(function_id)
+ if rest_api is None:
+ raise RestAPINotFound()
+ return rest_api
+
+ def put_rest_api(self, function_id, api_doc, mode="merge", fail_on_warnings=False):
+ """
+ Only a subset of the OpenAPI spec 3.x is currently implemented.
+ """
+ if mode not in ["merge", "overwrite"]:
+ raise InvalidOpenApiModeException()
+
+ if api_doc.get("swagger") is not None or (
+ api_doc.get("openapi") is not None and api_doc["openapi"][0] != "3"
+ ):
+ raise InvalidOpenApiDocVersionException()
+
+ if fail_on_warnings:
+ try:
+ validate_spec(api_doc)
+ except OpenAPIValidationError as e:
+ raise InvalidOpenAPIDocumentException(e)
+
+ if mode == "overwrite":
+ api = self.get_rest_api(function_id)
+ api.resources = {}
+ api.default = api.add_child("/") # Add default child
+
+ for (path, resource_doc) in sorted(
+ api_doc["paths"].items(), key=lambda x: x[0]
+ ):
+ parent_path_part = path[0 : path.rfind("/")] or "/"
+ parent_resource_id = (
+ self.apis[function_id].get_resource_for_path(parent_path_part).id
+ )
+ resource = self.create_resource(
+ function_id=function_id,
+ parent_resource_id=parent_resource_id,
+ path_part=path[path.rfind("/") + 1 :],
+ )
+
+ for (method_type, method_doc) in resource_doc.items():
+ method_type = method_type.upper()
+ if method_doc.get("x-amazon-apigateway-integration") is None:
+ self.put_method(function_id, resource.id, method_type, None)
+ method_responses = method_doc.get("responses", {}).items()
+ for (response_code, _) in method_responses:
+ self.put_method_response(
+ function_id,
+ resource.id,
+ method_type,
+ response_code,
+ response_models=None,
+ response_parameters=None,
+ )
+
+ return self.get_rest_api(function_id)
+
+ def update_rest_api(self, function_id, patch_operations):
+ rest_api = self.apis.get(function_id)
+ if rest_api is None:
+ raise RestAPINotFound()
+ self.apis[function_id].apply_patch_operations(patch_operations)
+ return self.apis[function_id]
+
+ def list_apis(self):
+ return self.apis.values()
+
+ def delete_rest_api(self, function_id):
+ rest_api = self.apis.pop(function_id)
+ return rest_api
+
+ def get_resources(self, function_id):
+ api = self.get_rest_api(function_id)
+ return api.resources.values()
+
+ def get_resource(self, function_id, resource_id):
+ api = self.get_rest_api(function_id)
+ if resource_id not in api.resources:
+ raise ResourceIdNotFoundException
+ resource = api.resources[resource_id]
+ return resource
+
+ def create_resource(self, function_id, parent_resource_id, path_part):
+ api = self.get_rest_api(function_id)
+ if not path_part:
+ # We're attempting to create the default resource, which already exists.
+ return api.default
+ if not re.match("^\\{?[a-zA-Z0-9._-]+\\+?\\}?$", path_part):
+ raise InvalidResourcePathException()
+ child = api.add_child(path=path_part, parent_id=parent_resource_id)
+ return child
+
+ def delete_resource(self, function_id, resource_id):
+ api = self.get_rest_api(function_id)
+ resource = api.resources.pop(resource_id)
+ return resource
+
+ def get_method(self, function_id, resource_id, method_type):
+ resource = self.get_resource(function_id, resource_id)
+ return resource.get_method(method_type)
+
+ def put_method(
+ self,
+ function_id,
+ resource_id,
+ method_type,
+ authorization_type,
+ api_key_required=None,
+ request_models=None,
+ operation_name=None,
+ authorizer_id=None,
+ authorization_scopes=None,
+ request_validator_id=None,
+ ):
+ resource = self.get_resource(function_id, resource_id)
+ method = resource.add_method(
+ method_type,
+ authorization_type,
+ api_key_required=api_key_required,
+ request_models=request_models,
+ operation_name=operation_name,
+ authorizer_id=authorizer_id,
+ authorization_scopes=authorization_scopes,
+ request_validator_id=request_validator_id,
+ )
+ return method
+
+ def update_method(self, function_id, resource_id, method_type, patch_operations):
+ resource = self.get_resource(function_id, resource_id)
+ method = resource.get_method(method_type)
+ return method.apply_operations(patch_operations)
+
+ def delete_method(self, function_id, resource_id, method_type):
+ resource = self.get_resource(function_id, resource_id)
+ resource.delete_method(method_type)
+
+ def get_authorizer(self, restapi_id, authorizer_id):
+ api = self.get_rest_api(restapi_id)
+ authorizer = api.authorizers.get(authorizer_id)
+ if authorizer is None:
+ raise AuthorizerNotFoundException()
+ else:
+ return authorizer
+
+ def get_authorizers(self, restapi_id):
+ api = self.get_rest_api(restapi_id)
+ return api.get_authorizers()
+
+ def create_authorizer(self, restapi_id, name, authorizer_type, **kwargs):
+ api = self.get_rest_api(restapi_id)
+ authorizer_id = create_id()
+ authorizer = api.create_authorizer(
+ authorizer_id,
+ name,
+ authorizer_type,
+ provider_arns=kwargs.get("provider_arns"),
+ auth_type=kwargs.get("auth_type"),
+ authorizer_uri=kwargs.get("authorizer_uri"),
+ authorizer_credentials=kwargs.get("authorizer_credentials"),
+ identity_source=kwargs.get("identity_source"),
+ identiy_validation_expression=kwargs.get("identiy_validation_expression"),
+ authorizer_result_ttl=kwargs.get("authorizer_result_ttl"),
+ )
+ return api.authorizers.get(authorizer["id"])
+
+ def update_authorizer(self, restapi_id, authorizer_id, patch_operations):
+ authorizer = self.get_authorizer(restapi_id, authorizer_id)
+ if not authorizer:
+ api = self.get_rest_api(restapi_id)
+ authorizer = api.authorizers[authorizer_id] = Authorizer()
+ return authorizer.apply_operations(patch_operations)
+
+ def delete_authorizer(self, restapi_id, authorizer_id):
+ api = self.get_rest_api(restapi_id)
+ del api.authorizers[authorizer_id]
+
+ def get_stage(self, function_id, stage_name):
+ api = self.get_rest_api(function_id)
+ stage = api.stages.get(stage_name)
+ if stage is None:
+ raise StageNotFoundException()
+ return stage
+
+ def get_stages(self, function_id):
+ api = self.get_rest_api(function_id)
+ return api.get_stages()
+
+ def create_stage(
+ self,
+ function_id,
+ stage_name,
+ deploymentId,
+ variables=None,
+ description="",
+ cacheClusterEnabled=None,
+ cacheClusterSize=None,
+ tags=None,
+ tracing_enabled=None,
+ ):
+ if variables is None:
+ variables = {}
+ api = self.get_rest_api(function_id)
+ api.create_stage(
+ stage_name,
+ deploymentId,
+ variables=variables,
+ description=description,
+ cacheClusterEnabled=cacheClusterEnabled,
+ cacheClusterSize=cacheClusterSize,
+ tags=tags,
+ tracing_enabled=tracing_enabled,
+ )
+ return api.stages.get(stage_name)
+
+ def update_stage(self, function_id, stage_name, patch_operations):
+ stage = self.get_stage(function_id, stage_name)
+ if not stage:
+ api = self.get_rest_api(function_id)
+ stage = api.stages[stage_name] = Stage()
+ return stage.apply_operations(patch_operations)
+
+ def delete_stage(self, function_id, stage_name):
+ api = self.get_rest_api(function_id)
+ deleted = api.stages.pop(stage_name, None)
+ if not deleted:
+ raise StageNotFoundException()
+
+ def get_method_response(self, function_id, resource_id, method_type, response_code):
+ method = self.get_method(function_id, resource_id, method_type)
+ method_response = method.get_response(response_code)
+ return method_response
+
+ def put_method_response(
+ self,
+ function_id,
+ resource_id,
+ method_type,
+ response_code,
+ response_models,
+ response_parameters,
+ ):
+ method = self.get_method(function_id, resource_id, method_type)
+ method_response = method.create_response(
+ response_code, response_models, response_parameters
+ )
+ return method_response
+
+ def update_method_response(
+ self, function_id, resource_id, method_type, response_code, patch_operations
+ ):
+ method = self.get_method(function_id, resource_id, method_type)
+ method_response = method.get_response(response_code)
+ method_response.apply_operations(patch_operations)
+ return method_response
+
+ def delete_method_response(
+ self, function_id, resource_id, method_type, response_code
+ ):
+ method = self.get_method(function_id, resource_id, method_type)
+ method_response = method.delete_response(response_code)
+ return method_response
+
+ def put_integration(
+ self,
+ function_id,
+ resource_id,
+ method_type,
+ integration_type,
+ uri,
+ integration_method=None,
+ credentials=None,
+ request_templates=None,
+ passthrough_behavior=None,
+ tls_config=None,
+ cache_namespace=None,
+ timeout_in_millis=None,
+ ):
+ resource = self.get_resource(function_id, resource_id)
+ if credentials and not re.match(
+ "^arn:aws:iam::" + str(get_account_id()), credentials
+ ):
+ raise CrossAccountNotAllowed()
+ if not integration_method and integration_type in [
+ "HTTP",
+ "HTTP_PROXY",
+ "AWS",
+ "AWS_PROXY",
+ ]:
+ raise IntegrationMethodNotDefined()
+ if integration_type in ["AWS_PROXY"] and re.match(
+ "^arn:aws:apigateway:[a-zA-Z0-9-]+:s3", uri
+ ):
+ raise AwsProxyNotAllowed()
+ if (
+ integration_type in ["AWS"]
+ and re.match("^arn:aws:apigateway:[a-zA-Z0-9-]+:s3", uri)
+ and not credentials
+ ):
+ raise RoleNotSpecified()
+ if integration_type in ["HTTP", "HTTP_PROXY"] and not self._uri_validator(uri):
+ raise InvalidHttpEndpoint()
+ if integration_type in ["AWS", "AWS_PROXY"] and not re.match("^arn:aws:", uri):
+ raise InvalidArn()
+ if integration_type in ["AWS", "AWS_PROXY"] and not re.match(
+ "^arn:aws:apigateway:[a-zA-Z0-9-]+:[a-zA-Z0-9-]+:(path|action)/", uri
+ ):
+ raise InvalidIntegrationArn()
+ integration = resource.add_integration(
+ method_type,
+ integration_type,
+ uri,
+ integration_method=integration_method,
+ request_templates=request_templates,
+ passthrough_behavior=passthrough_behavior,
+ tls_config=tls_config,
+ cache_namespace=cache_namespace,
+ timeout_in_millis=timeout_in_millis,
+ )
+ return integration
+
+ def get_integration(self, function_id, resource_id, method_type):
+ resource = self.get_resource(function_id, resource_id)
+ return resource.get_integration(method_type)
+
+ def delete_integration(self, function_id, resource_id, method_type):
+ resource = self.get_resource(function_id, resource_id)
+ return resource.delete_integration(method_type)
+
+ def put_integration_response(
+ self,
+ function_id,
+ resource_id,
+ method_type,
+ status_code,
+ selection_pattern,
+ response_templates,
+ content_handling,
+ ):
+ integration = self.get_integration(function_id, resource_id, method_type)
+ integration_response = integration.create_integration_response(
+ status_code, selection_pattern, response_templates, content_handling
+ )
+ return integration_response
+
+ def get_integration_response(
+ self, function_id, resource_id, method_type, status_code
+ ):
+ integration = self.get_integration(function_id, resource_id, method_type)
+ integration_response = integration.get_integration_response(status_code)
+ return integration_response
+
+ def delete_integration_response(
+ self, function_id, resource_id, method_type, status_code
+ ):
+ integration = self.get_integration(function_id, resource_id, method_type)
+ integration_response = integration.delete_integration_response(status_code)
+ return integration_response
+
+ def create_deployment(
+ self, function_id, name, description="", stage_variables=None
+ ):
+ if stage_variables is None:
+ stage_variables = {}
+ api = self.get_rest_api(function_id)
+ methods = [
+ list(res.resource_methods.values())
+ for res in self.get_resources(function_id)
+ ]
+ methods = [m for sublist in methods for m in sublist]
+ if not any(methods):
+ raise NoMethodDefined()
+ method_integrations = [
+ method.get("methodIntegration", None) for method in methods
+ ]
+ if not any(method_integrations):
+ raise NoIntegrationDefined()
+ deployment = api.create_deployment(name, description, stage_variables)
+ return deployment
+
+ def get_deployment(self, function_id, deployment_id):
+ api = self.get_rest_api(function_id)
+ return api.get_deployment(deployment_id)
+
+ def get_deployments(self, function_id):
+ api = self.get_rest_api(function_id)
+ return api.get_deployments()
+
+ def delete_deployment(self, function_id, deployment_id):
+ api = self.get_rest_api(function_id)
+ return api.delete_deployment(deployment_id)
+
+ def create_api_key(self, payload):
+ if payload.get("value"):
+ if len(payload.get("value", [])) < 20:
+ raise ApiKeyValueMinLength()
+ for api_key in self.get_api_keys(include_values=True):
+ if api_key.get("value") == payload["value"]:
+ raise ApiKeyAlreadyExists()
+ key = ApiKey(**payload)
+ self.keys[key["id"]] = key
+ return key
+
+ def get_api_keys(self, include_values=False):
+ api_keys = list(self.keys.values())
+
+ if not include_values:
+ keys = []
+ for api_key in list(self.keys.values()):
+ new_key = copy(api_key)
+ del new_key["value"]
+ keys.append(new_key)
+ api_keys = keys
+
+ return api_keys
+
+ def get_api_key(self, api_key_id, include_value=False):
+ api_key = self.keys.get(api_key_id)
+ if not api_key:
+ raise ApiKeyNotFoundException()
+
+ if not include_value:
+ new_key = copy(api_key)
+ del new_key["value"]
+ api_key = new_key
+
+ return api_key
+
+ def update_api_key(self, api_key_id, patch_operations):
+ key = self.keys[api_key_id]
+ return key.update_operations(patch_operations)
+
+ def delete_api_key(self, api_key_id):
+ self.keys.pop(api_key_id)
+ return {}
+
+ def create_usage_plan(self, payload):
+ plan = UsagePlan(**payload)
+ self.usage_plans[plan["id"]] = plan
+ return plan
+
+ def get_usage_plans(self, api_key_id=None):
+ plans = list(self.usage_plans.values())
+ if api_key_id is not None:
+ plans = [
+ plan
+ for plan in plans
+ if self.usage_plan_keys.get(plan["id"], {}).get(api_key_id, False)
+ ]
+ return plans
+
+ def get_usage_plan(self, usage_plan_id):
+ if usage_plan_id not in self.usage_plans:
+ raise UsagePlanNotFoundException()
+ return self.usage_plans[usage_plan_id]
+
+ def update_usage_plan(self, usage_plan_id, patch_operations):
+ if usage_plan_id not in self.usage_plans:
+ raise UsagePlanNotFoundException()
+ self.usage_plans[usage_plan_id].apply_patch_operations(patch_operations)
+ return self.usage_plans[usage_plan_id]
+
+ def delete_usage_plan(self, usage_plan_id):
+ self.usage_plans.pop(usage_plan_id)
+ return {}
+
+ def create_usage_plan_key(self, usage_plan_id, payload):
+ if usage_plan_id not in self.usage_plan_keys:
+ self.usage_plan_keys[usage_plan_id] = {}
+
+ key_id = payload["keyId"]
+ if key_id not in self.keys:
+ raise ApiKeyNotFoundException()
+
+ api_key = self.keys[key_id]
+
+ usage_plan_key = UsagePlanKey(
+ plan_id=key_id,
+ plan_type=payload["keyType"],
+ name=api_key["name"],
+ value=api_key["value"],
+ )
+ self.usage_plan_keys[usage_plan_id][usage_plan_key["id"]] = usage_plan_key
+ return usage_plan_key
+
+ def get_usage_plan_keys(self, usage_plan_id):
+ if usage_plan_id not in self.usage_plan_keys:
+ return []
+
+ return list(self.usage_plan_keys[usage_plan_id].values())
+
+ def get_usage_plan_key(self, usage_plan_id, key_id):
+ # first check if is a valid api key
+ if key_id not in self.keys:
+ raise ApiKeyNotFoundException()
+
+ # then check if is a valid api key and that the key is in the plan
+ if (
+ usage_plan_id not in self.usage_plan_keys
+ or key_id not in self.usage_plan_keys[usage_plan_id]
+ ):
+ raise UsagePlanNotFoundException()
+
+ return self.usage_plan_keys[usage_plan_id][key_id]
+
+ def delete_usage_plan_key(self, usage_plan_id, key_id):
+ self.usage_plan_keys[usage_plan_id].pop(key_id)
+ return {}
+
+ def _uri_validator(self, uri):
+ try:
+ result = urlparse(uri)
+ return all([result.scheme, result.netloc, result.path or "/"])
+ except Exception:
+ return False
+
+ def create_domain_name(
+ self,
+ domain_name,
+ certificate_name=None,
+ tags=None,
+ certificate_arn=None,
+ certificate_body=None,
+ certificate_private_key=None,
+ certificate_chain=None,
+ regional_certificate_name=None,
+ regional_certificate_arn=None,
+ endpoint_configuration=None,
+ security_policy=None,
+ generate_cli_skeleton=None,
+ ):
+
+ if not domain_name:
+ raise InvalidDomainName()
+
+ new_domain_name = DomainName(
+ domain_name=domain_name,
+ certificate_name=certificate_name,
+ certificate_private_key=certificate_private_key,
+ certificate_arn=certificate_arn,
+ certificate_body=certificate_body,
+ certificate_chain=certificate_chain,
+ regional_certificate_name=regional_certificate_name,
+ regional_certificate_arn=regional_certificate_arn,
+ endpoint_configuration=endpoint_configuration,
+ tags=tags,
+ security_policy=security_policy,
+ generate_cli_skeleton=generate_cli_skeleton,
+ region_name=self.region_name,
+ )
+
+ self.domain_names[domain_name] = new_domain_name
+ return new_domain_name
+
+ def get_domain_names(self):
+ return list(self.domain_names.values())
+
+ def get_domain_name(self, domain_name):
+ domain_info = self.domain_names.get(domain_name)
+ if domain_info is None:
+ raise DomainNameNotFound()
+ else:
+ return self.domain_names[domain_name]
+
+ def delete_domain_name(self, domain_name):
+ domain_info = self.domain_names.pop(domain_name, None)
+ if domain_info is None:
+ raise DomainNameNotFound()
+
+ def update_domain_name(self, domain_name, patch_operations):
+ domain_info = self.domain_names.get(domain_name)
+ if not domain_info:
+ raise DomainNameNotFound()
+ domain_info.apply_patch_operations(patch_operations)
+ return domain_info
+
+ def create_model(
+ self,
+ rest_api_id,
+ name,
+ content_type,
+ description=None,
+ schema=None,
+ cli_input_json=None,
+ generate_cli_skeleton=None,
+ ):
+
+ if not rest_api_id:
+ raise InvalidRestApiId
+ if not name:
+ raise InvalidModelName
+
+ api = self.get_rest_api(rest_api_id)
+ new_model = api.add_model(
+ name=name,
+ description=description,
+ schema=schema,
+ content_type=content_type,
+ cli_input_json=cli_input_json,
+ generate_cli_skeleton=generate_cli_skeleton,
+ )
+
+ return new_model
+
+ def get_models(self, rest_api_id):
+ if not rest_api_id:
+ raise InvalidRestApiId
+ api = self.get_rest_api(rest_api_id)
+ models = api.models.values()
+ return list(models)
+
+ def get_model(self, rest_api_id, model_name):
+ if not rest_api_id:
+ raise InvalidRestApiId
+ api = self.get_rest_api(rest_api_id)
+ model = api.models.get(model_name)
+ if model is None:
+ raise ModelNotFound
+ else:
+ return model
+
+ def get_request_validators(self, restapi_id):
+ restApi = self.get_rest_api(restapi_id)
+ return restApi.get_request_validators()
+
+ def create_request_validator(self, restapi_id, name, body, params):
+ restApi = self.get_rest_api(restapi_id)
+ return restApi.create_request_validator(
+ name=name, validateRequestBody=body, validateRequestParameters=params
+ )
+
+ def get_request_validator(self, restapi_id, validator_id):
+ restApi = self.get_rest_api(restapi_id)
+ return restApi.get_request_validator(validator_id)
+
+ def delete_request_validator(self, restapi_id, validator_id):
+ restApi = self.get_rest_api(restapi_id)
+ restApi.delete_request_validator(validator_id)
+
+ def update_request_validator(self, restapi_id, validator_id, patch_operations):
+ restApi = self.get_rest_api(restapi_id)
+ return restApi.update_request_validator(validator_id, patch_operations)
+
+ def create_base_path_mapping(
+ self, domain_name, rest_api_id, base_path=None, stage=None
+ ):
+ if domain_name not in self.domain_names:
+ raise DomainNameNotFound()
+
+ if base_path and "/" in base_path:
+ raise InvalidBasePathException()
+
+ if rest_api_id not in self.apis:
+ raise InvalidRestApiIdForBasePathMappingException()
+
+ if stage and self.apis[rest_api_id].stages.get(stage) is None:
+ raise InvalidStageException()
+
+ new_base_path_mapping = BasePathMapping(
+ domain_name=domain_name,
+ rest_api_id=rest_api_id,
+ basePath=base_path,
+ stage=stage,
+ )
+
+ new_base_path = new_base_path_mapping.get("basePath")
+ if self.base_path_mappings.get(domain_name) is None:
+ self.base_path_mappings[domain_name] = {}
+ else:
+ if (
+ self.base_path_mappings[domain_name].get(new_base_path)
+ and new_base_path != "(none)"
+ ):
+ raise BasePathConflictException()
+ self.base_path_mappings[domain_name][new_base_path] = new_base_path_mapping
+ return new_base_path_mapping
+
+ def get_base_path_mappings(self, domain_name):
+
+ if domain_name not in self.domain_names:
+ raise DomainNameNotFound()
+
+ return list(self.base_path_mappings[domain_name].values())
+
+ def get_base_path_mapping(self, domain_name, base_path):
+
+ if domain_name not in self.domain_names:
+ raise DomainNameNotFound()
+
+ if base_path not in self.base_path_mappings[domain_name]:
+ raise BasePathNotFoundException()
+
+ return self.base_path_mappings[domain_name][base_path]
+
+ def delete_base_path_mapping(self, domain_name, base_path):
+
+ if domain_name not in self.domain_names:
+ raise DomainNameNotFound()
+
+ if base_path not in self.base_path_mappings[domain_name]:
+ raise BasePathNotFoundException()
+
+ self.base_path_mappings[domain_name].pop(base_path)
+
+ def update_base_path_mapping(self, domain_name, base_path, patch_operations):
+
+ if domain_name not in self.domain_names:
+ raise DomainNameNotFound()
+
+ if base_path not in self.base_path_mappings[domain_name]:
+ raise BasePathNotFoundException()
+
+ base_path_mapping = self.get_base_path_mapping(domain_name, base_path)
+
+ rest_api_ids = [
+ op["value"] for op in patch_operations if op["path"] == "/restapiId"
+ ]
+ if len(rest_api_ids) == 0:
+ modified_rest_api_id = base_path_mapping["restApiId"]
+ else:
+ modified_rest_api_id = rest_api_ids[-1]
+
+ stages = [op["value"] for op in patch_operations if op["path"] == "/stage"]
+ if len(stages) == 0:
+ modified_stage = base_path_mapping.get("stage")
+ else:
+ modified_stage = stages[-1]
+
+ base_paths = [
+ op["value"] for op in patch_operations if op["path"] == "/basePath"
+ ]
+ if len(base_paths) == 0:
+ modified_base_path = base_path_mapping["basePath"]
+ else:
+ modified_base_path = base_paths[-1]
+
+ rest_api = self.apis.get(modified_rest_api_id)
+ if rest_api is None:
+ raise InvalidRestApiIdForBasePathMappingException()
+ if modified_stage and rest_api.stages.get(modified_stage) is None:
+ raise InvalidStageException()
+
+ base_path_mapping.apply_patch_operations(patch_operations)
+
+ if base_path != modified_base_path:
+ self.base_path_mappings[domain_name].pop(base_path)
+ self.base_path_mappings[domain_name][modified_base_path] = base_path_mapping
+
+ return base_path_mapping
+
+ def create_vpc_link(self, name, description, target_arns, tags):
+ vpc_link = VpcLink(
+ name, description=description, target_arns=target_arns, tags=tags
+ )
+ self.vpc_links[vpc_link["id"]] = vpc_link
+ return vpc_link
+
+ def delete_vpc_link(self, vpc_link_id):
+ self.vpc_links.pop(vpc_link_id, None)
+
+ def get_vpc_link(self, vpc_link_id):
+ if vpc_link_id not in self.vpc_links:
+ raise VpcLinkNotFound
+ return self.vpc_links[vpc_link_id]
+
+ def get_vpc_links(self):
+ """
+ Pagination has not yet been implemented
+ """
+ return list(self.vpc_links.values())
+
+ def put_gateway_response(
+ self,
+ rest_api_id,
+ response_type,
+ status_code,
+ response_parameters,
+ response_templates,
+ ):
+ api = self.get_rest_api(rest_api_id)
+ response = api.put_gateway_response(
+ response_type,
+ status_code=status_code,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ )
+ return response
+
+ def get_gateway_response(self, rest_api_id, response_type):
+ api = self.get_rest_api(rest_api_id)
+ return api.get_gateway_response(response_type)
+
+ def get_gateway_responses(self, rest_api_id):
+ """
+ Pagination is not yet implemented
+ """
+ api = self.get_rest_api(rest_api_id)
+ return api.get_gateway_responses()
+
+ def delete_gateway_response(self, rest_api_id, response_type):
+ api = self.get_rest_api(rest_api_id)
+ api.delete_gateway_response(response_type)
+
+
+apigateway_backends = BackendDict(APIGatewayBackend, "apigateway")
diff --git a/contrib/python/moto/py3/moto/apigateway/responses.py b/contrib/python/moto/py3/moto/apigateway/responses.py
new file mode 100644
index 0000000000..cff28e84ec
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/responses.py
@@ -0,0 +1,829 @@
+import json
+from urllib.parse import unquote
+
+from moto.utilities.utils import merge_multiple_dicts
+from moto.core.responses import BaseResponse
+from .models import apigateway_backends
+from .utils import deserialize_body
+from .exceptions import InvalidRequestInput
+
+API_KEY_SOURCES = ["AUTHORIZER", "HEADER"]
+AUTHORIZER_TYPES = ["TOKEN", "REQUEST", "COGNITO_USER_POOLS"]
+ENDPOINT_CONFIGURATION_TYPES = ["PRIVATE", "EDGE", "REGIONAL"]
+
+
+class APIGatewayResponse(BaseResponse):
+ def error(self, type_, message, status=400):
+ headers = self.response_headers or {}
+ headers["X-Amzn-Errortype"] = type_
+ return (status, headers, json.dumps({"__type": type_, "message": message}))
+
+ @property
+ def backend(self):
+ return apigateway_backends[self.region]
+
+ def __validate_api_key_source(self, api_key_source):
+ if api_key_source and api_key_source not in API_KEY_SOURCES:
+ return self.error(
+ "ValidationException",
+ (
+ "1 validation error detected: "
+ "Value '{api_key_source}' at 'createRestApiInput.apiKeySource' failed "
+ "to satisfy constraint: Member must satisfy enum value set: "
+ "[AUTHORIZER, HEADER]"
+ ).format(api_key_source=api_key_source),
+ )
+
+ def __validate_endpoint_configuration(self, endpoint_configuration):
+ if endpoint_configuration and "types" in endpoint_configuration:
+ invalid_types = list(
+ set(endpoint_configuration["types"]) - set(ENDPOINT_CONFIGURATION_TYPES)
+ )
+ if invalid_types:
+ return self.error(
+ "ValidationException",
+ (
+ "1 validation error detected: Value '{endpoint_type}' "
+ "at 'createRestApiInput.endpointConfiguration.types' failed "
+ "to satisfy constraint: Member must satisfy enum value set: "
+ "[PRIVATE, EDGE, REGIONAL]"
+ ).format(endpoint_type=invalid_types[0]),
+ )
+
+ def restapis(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ apis = self.backend.list_apis()
+ return 200, {}, json.dumps({"item": [api.to_dict() for api in apis]})
+ elif self.method == "POST":
+ api_doc = deserialize_body(self.body)
+ if api_doc:
+ fail_on_warnings = self._get_bool_param("failonwarnings")
+ rest_api = self.backend.import_rest_api(api_doc, fail_on_warnings)
+
+ return 200, {}, json.dumps(rest_api.to_dict())
+
+ name = self._get_param("name")
+ description = self._get_param("description")
+
+ api_key_source = self._get_param("apiKeySource")
+ endpoint_configuration = self._get_param("endpointConfiguration")
+ tags = self._get_param("tags")
+ policy = self._get_param("policy")
+ minimum_compression_size = self._get_param("minimumCompressionSize")
+
+ # Param validation
+ response = self.__validate_api_key_source(api_key_source)
+ if response is not None:
+ return response
+
+ response = self.__validate_endpoint_configuration(endpoint_configuration)
+ if response is not None:
+ return response
+
+ rest_api = self.backend.create_rest_api(
+ name,
+ description,
+ api_key_source=api_key_source,
+ endpoint_configuration=endpoint_configuration,
+ tags=tags,
+ policy=policy,
+ minimum_compression_size=minimum_compression_size,
+ )
+
+ return 200, {}, json.dumps(rest_api.to_dict())
+
+ def __validte_rest_patch_operations(self, patch_operations):
+ for op in patch_operations:
+ path = op["path"]
+ if "apiKeySource" in path:
+ value = op["value"]
+ return self.__validate_api_key_source(value)
+
+ def restapis_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ function_id = self.path.replace("/restapis/", "", 1).split("/")[0]
+
+ if self.method == "GET":
+ rest_api = self.backend.get_rest_api(function_id)
+ elif self.method == "DELETE":
+ rest_api = self.backend.delete_rest_api(function_id)
+ elif self.method == "PUT":
+ mode = self._get_param("mode", "merge")
+ fail_on_warnings = self._get_bool_param("failonwarnings", False)
+
+ api_doc = deserialize_body(self.body)
+
+ rest_api = self.backend.put_rest_api(
+ function_id, api_doc, mode, fail_on_warnings
+ )
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ response = self.__validte_rest_patch_operations(patch_operations)
+ if response is not None:
+ return response
+ rest_api = self.backend.update_rest_api(function_id, patch_operations)
+
+ return 200, {}, json.dumps(rest_api.to_dict())
+
+ def resources(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ function_id = self.path.replace("/restapis/", "", 1).split("/")[0]
+
+ if self.method == "GET":
+ resources = self.backend.get_resources(function_id)
+ return (
+ 200,
+ {},
+ json.dumps({"item": [resource.to_dict() for resource in resources]}),
+ )
+
+ def gateway_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.put_gateway_response()
+ elif request.method == "GET":
+ return self.get_gateway_response()
+ elif request.method == "DELETE":
+ return self.delete_gateway_response()
+
+ def gateway_responses(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_gateway_responses()
+
+ def resource_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ function_id = self.path.replace("/restapis/", "", 1).split("/")[0]
+ resource_id = self.path.split("/")[-1]
+
+ if self.method == "GET":
+ resource = self.backend.get_resource(function_id, resource_id)
+ elif self.method == "POST":
+ path_part = self._get_param("pathPart")
+ resource = self.backend.create_resource(function_id, resource_id, path_part)
+ elif self.method == "DELETE":
+ resource = self.backend.delete_resource(function_id, resource_id)
+ return 200, {}, json.dumps(resource.to_dict())
+
+ def resource_methods(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ resource_id = url_path_parts[4]
+ method_type = url_path_parts[6]
+
+ if self.method == "GET":
+ method = self.backend.get_method(function_id, resource_id, method_type)
+ return 200, {}, json.dumps(method)
+ elif self.method == "PUT":
+ authorization_type = self._get_param("authorizationType")
+ api_key_required = self._get_param("apiKeyRequired")
+ request_models = self._get_param("requestModels")
+ operation_name = self._get_param("operationName")
+ authorizer_id = self._get_param("authorizerId")
+ authorization_scopes = self._get_param("authorizationScopes")
+ request_validator_id = self._get_param("requestValidatorId")
+ method = self.backend.put_method(
+ function_id,
+ resource_id,
+ method_type,
+ authorization_type,
+ api_key_required,
+ request_models=request_models,
+ operation_name=operation_name,
+ authorizer_id=authorizer_id,
+ authorization_scopes=authorization_scopes,
+ request_validator_id=request_validator_id,
+ )
+ return 200, {}, json.dumps(method)
+
+ elif self.method == "DELETE":
+ self.backend.delete_method(function_id, resource_id, method_type)
+ return 200, {}, ""
+
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ self.backend.update_method(
+ function_id, resource_id, method_type, patch_operations
+ )
+
+ return 200, {}, ""
+
+ def resource_method_responses(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ resource_id = url_path_parts[4]
+ method_type = url_path_parts[6]
+ response_code = url_path_parts[8]
+
+ if self.method == "GET":
+ method_response = self.backend.get_method_response(
+ function_id, resource_id, method_type, response_code
+ )
+ elif self.method == "PUT":
+ response_models = self._get_param("responseModels")
+ response_parameters = self._get_param("responseParameters")
+ method_response = self.backend.put_method_response(
+ function_id,
+ resource_id,
+ method_type,
+ response_code,
+ response_models,
+ response_parameters,
+ )
+ elif self.method == "DELETE":
+ method_response = self.backend.delete_method_response(
+ function_id, resource_id, method_type, response_code
+ )
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ method_response = self.backend.update_method_response(
+ function_id, resource_id, method_type, response_code, patch_operations
+ )
+ else:
+ raise Exception('Unexpected HTTP method "%s"' % self.method)
+ return 200, {}, json.dumps(method_response)
+
+ def restapis_authorizers(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ restapi_id = url_path_parts[2]
+
+ if self.method == "POST":
+ name = self._get_param("name")
+ authorizer_type = self._get_param("type")
+
+ provider_arns = self._get_param("providerARNs")
+ auth_type = self._get_param("authType")
+ authorizer_uri = self._get_param("authorizerUri")
+ authorizer_credentials = self._get_param("authorizerCredentials")
+ identity_source = self._get_param("identitySource")
+ identiy_validation_expression = self._get_param(
+ "identityValidationExpression"
+ )
+ authorizer_result_ttl = self._get_param(
+ "authorizerResultTtlInSeconds", if_none=300
+ )
+
+ # Param validation
+ if authorizer_type and authorizer_type not in AUTHORIZER_TYPES:
+ return self.error(
+ "ValidationException",
+ (
+ "1 validation error detected: "
+ "Value '{authorizer_type}' at 'createAuthorizerInput.type' failed "
+ "to satisfy constraint: Member must satisfy enum value set: "
+ "[TOKEN, REQUEST, COGNITO_USER_POOLS]"
+ ).format(authorizer_type=authorizer_type),
+ )
+
+ authorizer_response = self.backend.create_authorizer(
+ restapi_id=restapi_id,
+ name=name,
+ authorizer_type=authorizer_type,
+ provider_arns=provider_arns,
+ auth_type=auth_type,
+ authorizer_uri=authorizer_uri,
+ authorizer_credentials=authorizer_credentials,
+ identity_source=identity_source,
+ identiy_validation_expression=identiy_validation_expression,
+ authorizer_result_ttl=authorizer_result_ttl,
+ )
+ elif self.method == "GET":
+ authorizers = self.backend.get_authorizers(restapi_id)
+ return 200, {}, json.dumps({"item": authorizers})
+
+ return 200, {}, json.dumps(authorizer_response)
+
+ def request_validators(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ restapi_id = url_path_parts[2]
+
+ if self.method == "GET":
+ validators = self.backend.get_request_validators(restapi_id)
+ res = json.dumps(
+ {"item": [validator.to_dict() for validator in validators]}
+ )
+ return 200, {}, res
+ if self.method == "POST":
+ name = self._get_param("name")
+ body = self._get_bool_param("validateRequestBody")
+ params = self._get_bool_param("validateRequestParameters")
+ validator = self.backend.create_request_validator(
+ restapi_id, name, body, params
+ )
+ return 200, {}, json.dumps(validator)
+
+ def request_validator_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ restapi_id = url_path_parts[2]
+ validator_id = url_path_parts[4]
+
+ if self.method == "GET":
+ validator = self.backend.get_request_validator(restapi_id, validator_id)
+ return 200, {}, json.dumps(validator)
+ if self.method == "DELETE":
+ self.backend.delete_request_validator(restapi_id, validator_id)
+ return 202, {}, ""
+ if self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ validator = self.backend.update_request_validator(
+ restapi_id, validator_id, patch_operations
+ )
+ return 200, {}, json.dumps(validator)
+
+ def authorizers(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ restapi_id = url_path_parts[2]
+ authorizer_id = url_path_parts[4]
+
+ if self.method == "GET":
+ authorizer_response = self.backend.get_authorizer(restapi_id, authorizer_id)
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ authorizer_response = self.backend.update_authorizer(
+ restapi_id, authorizer_id, patch_operations
+ )
+ elif self.method == "DELETE":
+ self.backend.delete_authorizer(restapi_id, authorizer_id)
+ return 202, {}, "{}"
+ return 200, {}, json.dumps(authorizer_response)
+
+ def restapis_stages(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+
+ if self.method == "POST":
+ stage_name = self._get_param("stageName")
+ deployment_id = self._get_param("deploymentId")
+ stage_variables = self._get_param("variables", if_none={})
+ description = self._get_param("description", if_none="")
+ cacheClusterEnabled = self._get_param("cacheClusterEnabled", if_none=False)
+ cacheClusterSize = self._get_param("cacheClusterSize")
+ tags = self._get_param("tags")
+ tracing_enabled = self._get_param("tracingEnabled")
+
+ stage_response = self.backend.create_stage(
+ function_id,
+ stage_name,
+ deployment_id,
+ variables=stage_variables,
+ description=description,
+ cacheClusterEnabled=cacheClusterEnabled,
+ cacheClusterSize=cacheClusterSize,
+ tags=tags,
+ tracing_enabled=tracing_enabled,
+ )
+ elif self.method == "GET":
+ stages = self.backend.get_stages(function_id)
+ return 200, {}, json.dumps({"item": stages})
+
+ return 200, {}, json.dumps(stage_response)
+
+ def restapis_stages_tags(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[4]
+ stage_name = url_path_parts[6]
+ if self.method == "PUT":
+ tags = self._get_param("tags")
+ if tags:
+ stage = self.backend.get_stage(function_id, stage_name)
+ stage["tags"] = merge_multiple_dicts(stage.get("tags"), tags)
+ return 200, {}, json.dumps({"item": tags})
+ if self.method == "DELETE":
+ stage = self.backend.get_stage(function_id, stage_name)
+ for tag in stage.get("tags").copy():
+ if tag in self.querystring.get("tagKeys"):
+ stage["tags"].pop(tag, None)
+ return 200, {}, json.dumps({"item": ""})
+
+ def stages(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ stage_name = url_path_parts[4]
+
+ if self.method == "GET":
+ stage_response = self.backend.get_stage(function_id, stage_name)
+
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ stage_response = self.backend.update_stage(
+ function_id, stage_name, patch_operations
+ )
+ elif self.method == "DELETE":
+ self.backend.delete_stage(function_id, stage_name)
+ return 202, {}, "{}"
+ return 200, {}, json.dumps(stage_response)
+
+ def integrations(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ resource_id = url_path_parts[4]
+ method_type = url_path_parts[6]
+
+ integration_response = {}
+
+ if self.method == "GET":
+ integration_response = self.backend.get_integration(
+ function_id, resource_id, method_type
+ )
+ elif self.method == "PUT":
+ integration_type = self._get_param("type")
+ uri = self._get_param("uri")
+ credentials = self._get_param("credentials")
+ request_templates = self._get_param("requestTemplates")
+ passthrough_behavior = self._get_param("passthroughBehavior")
+ tls_config = self._get_param("tlsConfig")
+ cache_namespace = self._get_param("cacheNamespace")
+ timeout_in_millis = self._get_param("timeoutInMillis")
+ self.backend.get_method(function_id, resource_id, method_type)
+
+ integration_http_method = self._get_param(
+ "httpMethod"
+ ) # default removed because it's a required parameter
+
+ integration_response = self.backend.put_integration(
+ function_id,
+ resource_id,
+ method_type,
+ integration_type,
+ uri,
+ credentials=credentials,
+ integration_method=integration_http_method,
+ request_templates=request_templates,
+ passthrough_behavior=passthrough_behavior,
+ tls_config=tls_config,
+ cache_namespace=cache_namespace,
+ timeout_in_millis=timeout_in_millis,
+ )
+ elif self.method == "DELETE":
+ integration_response = self.backend.delete_integration(
+ function_id, resource_id, method_type
+ )
+
+ return 200, {}, json.dumps(integration_response)
+
+ def integration_responses(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ resource_id = url_path_parts[4]
+ method_type = url_path_parts[6]
+ status_code = url_path_parts[9]
+
+ if self.method == "GET":
+ integration_response = self.backend.get_integration_response(
+ function_id, resource_id, method_type, status_code
+ )
+ elif self.method == "PUT":
+ if not self.body:
+ raise InvalidRequestInput()
+
+ selection_pattern = self._get_param("selectionPattern")
+ response_templates = self._get_param("responseTemplates")
+ content_handling = self._get_param("contentHandling")
+ integration_response = self.backend.put_integration_response(
+ function_id,
+ resource_id,
+ method_type,
+ status_code,
+ selection_pattern,
+ response_templates,
+ content_handling,
+ )
+ elif self.method == "DELETE":
+ integration_response = self.backend.delete_integration_response(
+ function_id, resource_id, method_type, status_code
+ )
+ return 200, {}, json.dumps(integration_response)
+
+ def deployments(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ function_id = self.path.replace("/restapis/", "", 1).split("/")[0]
+
+ if self.method == "GET":
+ deployments = self.backend.get_deployments(function_id)
+ return 200, {}, json.dumps({"item": deployments})
+ elif self.method == "POST":
+ name = self._get_param("stageName")
+ description = self._get_param("description")
+ stage_variables = self._get_param("variables", if_none={})
+ deployment = self.backend.create_deployment(
+ function_id, name, description, stage_variables
+ )
+ return 200, {}, json.dumps(deployment)
+
+ def individual_deployment(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ function_id = url_path_parts[2]
+ deployment_id = url_path_parts[4]
+
+ if self.method == "GET":
+ deployment = self.backend.get_deployment(function_id, deployment_id)
+ return 200, {}, json.dumps(deployment)
+ elif self.method == "DELETE":
+ deployment = self.backend.delete_deployment(function_id, deployment_id)
+ return 202, {}, json.dumps(deployment)
+
+ def apikeys(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ apikey_response = self.backend.create_api_key(json.loads(self.body))
+ return 201, {}, json.dumps(apikey_response)
+
+ elif self.method == "GET":
+ include_values = self._get_bool_param("includeValues")
+ apikeys_response = self.backend.get_api_keys(include_values=include_values)
+ return 200, {}, json.dumps({"item": apikeys_response})
+
+ def apikey_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ apikey = url_path_parts[2]
+
+ status_code = 200
+ if self.method == "GET":
+ include_value = self._get_bool_param("includeValue")
+ apikey_response = self.backend.get_api_key(
+ apikey, include_value=include_value
+ )
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ apikey_response = self.backend.update_api_key(apikey, patch_operations)
+ elif self.method == "DELETE":
+ apikey_response = self.backend.delete_api_key(apikey)
+ status_code = 202
+
+ return status_code, {}, json.dumps(apikey_response)
+
+ def usage_plans(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if self.method == "POST":
+ usage_plan_response = self.backend.create_usage_plan(json.loads(self.body))
+ elif self.method == "GET":
+ api_key_id = self.querystring.get("keyId", [None])[0]
+ usage_plans_response = self.backend.get_usage_plans(api_key_id=api_key_id)
+ return 200, {}, json.dumps({"item": usage_plans_response})
+ return 200, {}, json.dumps(usage_plan_response)
+
+ def usage_plan_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ usage_plan = url_path_parts[2]
+
+ if self.method == "GET":
+ usage_plan_response = self.backend.get_usage_plan(usage_plan)
+ elif self.method == "DELETE":
+ usage_plan_response = self.backend.delete_usage_plan(usage_plan)
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ usage_plan_response = self.backend.update_usage_plan(
+ usage_plan, patch_operations
+ )
+ return 200, {}, json.dumps(usage_plan_response)
+
+ def usage_plan_keys(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ usage_plan_id = url_path_parts[2]
+
+ if self.method == "POST":
+ usage_plan_response = self.backend.create_usage_plan_key(
+ usage_plan_id, json.loads(self.body)
+ )
+ return 201, {}, json.dumps(usage_plan_response)
+ elif self.method == "GET":
+ usage_plans_response = self.backend.get_usage_plan_keys(usage_plan_id)
+ return 200, {}, json.dumps({"item": usage_plans_response})
+
+ def usage_plan_key_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ usage_plan_id = url_path_parts[2]
+ key_id = url_path_parts[4]
+
+ if self.method == "GET":
+ usage_plan_response = self.backend.get_usage_plan_key(usage_plan_id, key_id)
+ elif self.method == "DELETE":
+ usage_plan_response = self.backend.delete_usage_plan_key(
+ usage_plan_id, key_id
+ )
+ return 200, {}, json.dumps(usage_plan_response)
+
+ def domain_names(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ domain_names = self.backend.get_domain_names()
+ return 200, {}, json.dumps({"item": domain_names})
+
+ elif self.method == "POST":
+ domain_name = self._get_param("domainName")
+ certificate_name = self._get_param("certificateName")
+ tags = self._get_param("tags")
+ certificate_arn = self._get_param("certificateArn")
+ certificate_body = self._get_param("certificateBody")
+ certificate_private_key = self._get_param("certificatePrivateKey")
+ certificate_chain = self._get_param("certificateChain")
+ regional_certificate_name = self._get_param("regionalCertificateName")
+ regional_certificate_arn = self._get_param("regionalCertificateArn")
+ endpoint_configuration = self._get_param("endpointConfiguration")
+ security_policy = self._get_param("securityPolicy")
+ generate_cli_skeleton = self._get_param("generateCliSkeleton")
+ domain_name_resp = self.backend.create_domain_name(
+ domain_name,
+ certificate_name,
+ tags,
+ certificate_arn,
+ certificate_body,
+ certificate_private_key,
+ certificate_chain,
+ regional_certificate_name,
+ regional_certificate_arn,
+ endpoint_configuration,
+ security_policy,
+ generate_cli_skeleton,
+ )
+ return 200, {}, json.dumps(domain_name_resp)
+
+ def domain_name_induvidual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ domain_name = url_path_parts[2]
+ domain_names = {}
+
+ if self.method == "GET":
+ if domain_name is not None:
+ domain_names = self.backend.get_domain_name(domain_name)
+ elif self.method == "DELETE":
+ if domain_name is not None:
+ self.backend.delete_domain_name(domain_name)
+ elif self.method == "PATCH":
+ if domain_name is not None:
+ patch_operations = self._get_param("patchOperations")
+ self.backend.update_domain_name(domain_name, patch_operations)
+ else:
+ msg = 'Method "%s" for API GW domain names not implemented' % self.method
+ return 404, {}, json.dumps({"error": msg})
+ return 200, {}, json.dumps(domain_names)
+
+ def models(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ rest_api_id = self.path.replace("/restapis/", "", 1).split("/")[0]
+
+ if self.method == "GET":
+ models = self.backend.get_models(rest_api_id)
+ return 200, {}, json.dumps({"item": models})
+
+ elif self.method == "POST":
+ name = self._get_param("name")
+ description = self._get_param("description")
+ schema = self._get_param("schema")
+ content_type = self._get_param("contentType")
+ cli_input_json = self._get_param("cliInputJson")
+ generate_cli_skeleton = self._get_param("generateCliSkeleton")
+ model = self.backend.create_model(
+ rest_api_id,
+ name,
+ content_type,
+ description,
+ schema,
+ cli_input_json,
+ generate_cli_skeleton,
+ )
+
+ return 200, {}, json.dumps(model)
+
+ def model_induvidual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ rest_api_id = url_path_parts[2]
+ model_name = url_path_parts[4]
+ model_info = {}
+ if self.method == "GET":
+ model_info = self.backend.get_model(rest_api_id, model_name)
+ return 200, {}, json.dumps(model_info)
+
+ def base_path_mappings(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ domain_name = url_path_parts[2]
+
+ if self.method == "GET":
+ base_path_mappings = self.backend.get_base_path_mappings(domain_name)
+ return 200, {}, json.dumps({"item": base_path_mappings})
+ elif self.method == "POST":
+ base_path = self._get_param("basePath")
+ rest_api_id = self._get_param("restApiId")
+ stage = self._get_param("stage")
+
+ base_path_mapping_resp = self.backend.create_base_path_mapping(
+ domain_name, rest_api_id, base_path, stage
+ )
+ return 201, {}, json.dumps(base_path_mapping_resp)
+
+ def base_path_mapping_individual(self, request, full_url, headers):
+
+ self.setup_class(request, full_url, headers)
+
+ url_path_parts = self.path.split("/")
+ domain_name = url_path_parts[2]
+ base_path = unquote(url_path_parts[4])
+
+ if self.method == "GET":
+ base_path_mapping = self.backend.get_base_path_mapping(
+ domain_name, base_path
+ )
+ return 200, {}, json.dumps(base_path_mapping)
+ elif self.method == "DELETE":
+ self.backend.delete_base_path_mapping(domain_name, base_path)
+ return 202, {}, ""
+ elif self.method == "PATCH":
+ patch_operations = self._get_param("patchOperations")
+ base_path_mapping = self.backend.update_base_path_mapping(
+ domain_name, base_path, patch_operations
+ )
+ return 200, {}, json.dumps(base_path_mapping)
+
+ def vpc_link(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ url_path_parts = self.path.split("/")
+ vpc_link_id = url_path_parts[-1]
+
+ if self.method == "DELETE":
+ self.backend.delete_vpc_link(vpc_link_id=vpc_link_id)
+ return 200, {}, "{}"
+ if self.method == "GET":
+ vpc_link = self.backend.get_vpc_link(vpc_link_id=vpc_link_id)
+ return 200, {}, json.dumps(vpc_link)
+
+ def vpc_links(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ vpc_links = self.backend.get_vpc_links()
+ return 200, {}, json.dumps({"item": vpc_links})
+ if self.method == "POST":
+ name = self._get_param("name")
+ description = self._get_param("description")
+ target_arns = self._get_param("targetArns")
+ tags = self._get_param("tags")
+ vpc_link = self.backend.create_vpc_link(
+ name=name, description=description, target_arns=target_arns, tags=tags
+ )
+ return 200, {}, json.dumps(vpc_link)
+
+ def put_gateway_response(self):
+ rest_api_id = self.path.split("/")[-3]
+ response_type = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ status_code = params.get("statusCode")
+ response_parameters = params.get("responseParameters")
+ response_templates = params.get("responseTemplates")
+ response = self.backend.put_gateway_response(
+ rest_api_id=rest_api_id,
+ response_type=response_type,
+ status_code=status_code,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ )
+ return 200, {}, json.dumps(response)
+
+ def get_gateway_response(self):
+ rest_api_id = self.path.split("/")[-3]
+ response_type = self.path.split("/")[-1]
+ response = self.backend.get_gateway_response(
+ rest_api_id=rest_api_id, response_type=response_type
+ )
+ return 200, {}, json.dumps(response)
+
+ def get_gateway_responses(self):
+ rest_api_id = self.path.split("/")[-2]
+ responses = self.backend.get_gateway_responses(rest_api_id=rest_api_id)
+ return 200, {}, json.dumps(dict(item=responses))
+
+ def delete_gateway_response(self):
+ rest_api_id = self.path.split("/")[-3]
+ response_type = self.path.split("/")[-1]
+ self.backend.delete_gateway_response(
+ rest_api_id=rest_api_id, response_type=response_type
+ )
+ return 202, {}, json.dumps(dict())
diff --git a/contrib/python/moto/py3/moto/apigateway/urls.py b/contrib/python/moto/py3/moto/apigateway/urls.py
new file mode 100644
index 0000000000..816395a327
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/urls.py
@@ -0,0 +1,45 @@
+from .responses import APIGatewayResponse
+from ..apigatewayv2.urls import url_paths as url_paths_v2
+
+response = APIGatewayResponse()
+
+url_bases = [r"https?://apigateway\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/restapis$": response.restapis,
+ "{0}/restapis/(?P<function_id>[^/]+)/?$": response.restapis_individual,
+ "{0}/restapis/(?P<function_id>[^/]+)/resources$": response.resources,
+ "{0}/restapis/(?P<function_id>[^/]+)/authorizers$": response.restapis_authorizers,
+ "{0}/restapis/(?P<function_id>[^/]+)/authorizers/(?P<authorizer_id>[^/]+)/?$": response.authorizers,
+ "{0}/restapis/(?P<function_id>[^/]+)/stages$": response.restapis_stages,
+ "{0}/tags/arn:aws:apigateway:(?P<region_name>[^/]+)::/restapis/(?P<function_id>[^/]+)/stages/(?P<stage_name>[^/]+)/?$": response.restapis_stages_tags,
+ "{0}/restapis/(?P<function_id>[^/]+)/stages/(?P<stage_name>[^/]+)/?$": response.stages,
+ "{0}/restapis/(?P<function_id>[^/]+)/deployments$": response.deployments,
+ "{0}/restapis/(?P<function_id>[^/]+)/deployments/(?P<deployment_id>[^/]+)/?$": response.individual_deployment,
+ "{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/?$": response.resource_individual,
+ "{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$": response.resource_methods,
+ r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/(?P<status_code>\d+)$": response.resource_method_responses,
+ "{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/?$": response.integrations,
+ r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/?$": response.integration_responses,
+ "{0}/apikeys$": response.apikeys,
+ "{0}/apikeys/(?P<apikey>[^/]+)": response.apikey_individual,
+ "{0}/usageplans$": response.usage_plans,
+ "{0}/domainnames$": response.domain_names,
+ "{0}/restapis/(?P<function_id>[^/]+)/models$": response.models,
+ "{0}/restapis/(?P<function_id>[^/]+)/models/(?P<model_name>[^/]+)/?$": response.model_induvidual,
+ "{0}/domainnames/(?P<domain_name>[^/]+)/?$": response.domain_name_induvidual,
+ "{0}/domainnames/(?P<domain_name>[^/]+)/basepathmappings$": response.base_path_mappings,
+ "{0}/domainnames/(?P<domain_name>[^/]+)/basepathmappings/(?P<base_path_mapping>[^/]+)$": response.base_path_mapping_individual,
+ "{0}/usageplans/(?P<usage_plan_id>[^/]+)/?$": response.usage_plan_individual,
+ "{0}/usageplans/(?P<usage_plan_id>[^/]+)/keys$": response.usage_plan_keys,
+ "{0}/usageplans/(?P<usage_plan_id>[^/]+)/keys/(?P<api_key_id>[^/]+)/?$": response.usage_plan_key_individual,
+ "{0}/restapis/(?P<function_id>[^/]+)/requestvalidators$": response.request_validators,
+ "{0}/restapis/(?P<api_id>[^/]+)/requestvalidators/(?P<validator_id>[^/]+)/?$": response.request_validator_individual,
+ "{0}/restapis/(?P<api_id>[^/]+)/gatewayresponses/?$": response.gateway_responses,
+ "{0}/restapis/(?P<api_id>[^/]+)/gatewayresponses/(?P<response_type>[^/]+)/?$": response.gateway_response,
+ "{0}/vpclinks$": response.vpc_links,
+ "{0}/vpclinks/(?P<vpclink_id>[^/]+)": response.vpc_link,
+}
+
+# Also manages the APIGatewayV2
+url_paths.update(url_paths_v2)
diff --git a/contrib/python/moto/py3/moto/apigateway/utils.py b/contrib/python/moto/py3/moto/apigateway/utils.py
new file mode 100644
index 0000000000..416e106316
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigateway/utils.py
@@ -0,0 +1,26 @@
+import random
+import string
+import json
+import yaml
+
+
+def create_id():
+ size = 10
+ chars = list(range(10)) + list(string.ascii_lowercase)
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def deserialize_body(body):
+ try:
+ api_doc = json.loads(body)
+ except json.JSONDecodeError:
+ api_doc = yaml.safe_load(body)
+
+ if "openapi" in api_doc or "swagger" in api_doc:
+ return api_doc
+
+ return None
+
+
+def to_path(prop):
+ return "/" + prop
diff --git a/contrib/python/moto/py3/moto/apigatewayv2/__init__.py b/contrib/python/moto/py3/moto/apigatewayv2/__init__.py
new file mode 100644
index 0000000000..2ddfce55b6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigatewayv2/__init__.py
@@ -0,0 +1,5 @@
+"""apigatewayv2 module initialization; sets value for base decorator."""
+from .models import apigatewayv2_backends
+from ..core.models import base_decorator
+
+mock_apigatewayv2 = base_decorator(apigatewayv2_backends)
diff --git a/contrib/python/moto/py3/moto/apigatewayv2/exceptions.py b/contrib/python/moto/py3/moto/apigatewayv2/exceptions.py
new file mode 100644
index 0000000000..7958050261
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigatewayv2/exceptions.py
@@ -0,0 +1,95 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class APIGatewayV2Error(JsonRESTError):
+ pass
+
+
+class ApiNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, api_id):
+ super().__init__(
+ "NotFoundException", f"Invalid API identifier specified {api_id}"
+ )
+
+
+class AuthorizerNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, authorizer_id):
+ super().__init__(
+ "NotFoundException",
+ f"Invalid Authorizer identifier specified {authorizer_id}",
+ )
+
+
+class ModelNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, model_id):
+ super().__init__(
+ "NotFoundException", f"Invalid Model identifier specified {model_id}"
+ )
+
+
+class RouteResponseNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, rr_id):
+ super().__init__(
+ "NotFoundException", f"Invalid RouteResponse identifier specified {rr_id}"
+ )
+
+
+class BadRequestException(APIGatewayV2Error):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("BadRequestException", message)
+
+
+class IntegrationNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, integration_id):
+ super().__init__(
+ "NotFoundException",
+ f"Invalid Integration identifier specified {integration_id}",
+ )
+
+
+class IntegrationResponseNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, int_res_id):
+ super().__init__(
+ "NotFoundException",
+ f"Invalid IntegrationResponse identifier specified {int_res_id}",
+ )
+
+
+class RouteNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, route_id):
+ super().__init__(
+ "NotFoundException", f"Invalid Route identifier specified {route_id}"
+ )
+
+
+class VpcLinkNotFound(APIGatewayV2Error):
+ code = 404
+
+ def __init__(self, vpc_link_id):
+ super().__init__(
+ "NotFoundException", f"Invalid VpcLink identifier specified {vpc_link_id}"
+ )
+
+
+class UnknownProtocol(APIGatewayV2Error):
+ def __init__(self):
+ super().__init__(
+ "BadRequestException",
+ "Invalid protocol specified. Must be one of [HTTP, WEBSOCKET]",
+ )
diff --git a/contrib/python/moto/py3/moto/apigatewayv2/models.py b/contrib/python/moto/py3/moto/apigatewayv2/models.py
new file mode 100644
index 0000000000..22f1a6cf88
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigatewayv2/models.py
@@ -0,0 +1,1475 @@
+"""ApiGatewayV2Backend class with methods for supported APIs."""
+import random
+import string
+import yaml
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from moto.utilities.tagging_service import TaggingService
+
+from .exceptions import (
+ ApiNotFound,
+ AuthorizerNotFound,
+ BadRequestException,
+ ModelNotFound,
+ RouteResponseNotFound,
+ IntegrationNotFound,
+ IntegrationResponseNotFound,
+ RouteNotFound,
+ VpcLinkNotFound,
+)
+
+
+class Authorizer(BaseModel):
+ def __init__(
+ self,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_type,
+ authorizer_uri,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.auth_creds_arn = auth_creds_arn
+ self.auth_payload_format_version = auth_payload_format_version
+ self.auth_result_ttl = auth_result_ttl
+ self.authorizer_type = authorizer_type
+ self.authorizer_uri = authorizer_uri
+ self.enable_simple_response = enable_simple_response
+ self.identity_source = identity_source
+ self.identity_validation_expr = identity_validation_expr
+ self.jwt_config = jwt_config
+ self.name = name
+
+ def update(
+ self,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_type,
+ authorizer_uri,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ if auth_creds_arn is not None:
+ self.auth_creds_arn = auth_creds_arn
+ if auth_payload_format_version is not None:
+ self.auth_payload_format_version = auth_payload_format_version
+ if auth_result_ttl is not None:
+ self.auth_result_ttl = auth_result_ttl
+ if authorizer_type is not None:
+ self.authorizer_type = authorizer_type
+ if authorizer_uri is not None:
+ self.authorizer_uri = authorizer_uri
+ if enable_simple_response is not None:
+ self.enable_simple_response = enable_simple_response
+ if identity_source is not None:
+ self.identity_source = identity_source
+ if identity_validation_expr is not None:
+ self.identity_validation_expr = identity_validation_expr
+ if jwt_config is not None:
+ self.jwt_config = jwt_config
+ if name is not None:
+ self.name = name
+
+ def to_json(self):
+ return {
+ "authorizerId": self.id,
+ "authorizerCredentialsArn": self.auth_creds_arn,
+ "authorizerPayloadFormatVersion": self.auth_payload_format_version,
+ "authorizerResultTtlInSeconds": self.auth_result_ttl,
+ "authorizerType": self.authorizer_type,
+ "authorizerUri": self.authorizer_uri,
+ "enableSimpleResponses": self.enable_simple_response,
+ "identitySource": self.identity_source,
+ "identityValidationExpression": self.identity_validation_expr,
+ "jwtConfiguration": self.jwt_config,
+ "name": self.name,
+ }
+
+
+class Integration(BaseModel):
+ def __init__(
+ self,
+ connection_id,
+ connection_type,
+ content_handling_strategy,
+ credentials_arn,
+ description,
+ integration_method,
+ integration_type,
+ integration_uri,
+ passthrough_behavior,
+ payload_format_version,
+ integration_subtype,
+ request_parameters,
+ request_templates,
+ response_parameters,
+ template_selection_expression,
+ timeout_in_millis,
+ tls_config,
+ ):
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.connection_id = connection_id
+ self.connection_type = connection_type
+ self.content_handling_strategy = content_handling_strategy
+ self.credentials_arn = credentials_arn
+ self.description = description
+ self.integration_method = integration_method
+ self.integration_response_selection_expression = None
+ self.integration_type = integration_type
+ self.integration_subtype = integration_subtype
+ self.integration_uri = integration_uri
+ self.passthrough_behavior = passthrough_behavior
+ self.payload_format_version = payload_format_version
+ self.request_parameters = request_parameters
+ self.request_templates = request_templates
+ self.response_parameters = response_parameters
+ self.template_selection_expression = template_selection_expression
+ self.timeout_in_millis = timeout_in_millis
+ self.tls_config = tls_config
+
+ if self.integration_type in ["MOCK", "HTTP"]:
+ self.integration_response_selection_expression = (
+ "${integration.response.statuscode}"
+ )
+ elif self.integration_type in ["AWS"]:
+ self.integration_response_selection_expression = (
+ "${integration.response.body.errorMessage}"
+ )
+ if (
+ self.integration_type in ["AWS", "MOCK", "HTTP"]
+ and self.passthrough_behavior is None
+ ):
+ self.passthrough_behavior = "WHEN_NO_MATCH"
+ if self.integration_uri is not None and self.integration_method is None:
+ self.integration_method = "POST"
+ if self.integration_type in ["AWS", "MOCK"]:
+ self.timeout_in_millis = self.timeout_in_millis or 29000
+ else:
+ self.timeout_in_millis = self.timeout_in_millis or 30000
+
+ self.responses = dict()
+
+ def create_response(
+ self,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ response = IntegrationResponse(
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ self.responses[response.id] = response
+ return response
+
+ def delete_response(self, integration_response_id):
+ self.responses.pop(integration_response_id)
+
+ def get_response(self, integration_response_id):
+ if integration_response_id not in self.responses:
+ raise IntegrationResponseNotFound(integration_response_id)
+ return self.responses[integration_response_id]
+
+ def get_responses(self):
+ return self.responses.values()
+
+ def update_response(
+ self,
+ integration_response_id,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ int_response = self.responses[integration_response_id]
+ int_response.update(
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ return int_response
+
+ def update(
+ self,
+ connection_id,
+ connection_type,
+ content_handling_strategy,
+ credentials_arn,
+ description,
+ integration_method,
+ integration_type,
+ integration_uri,
+ passthrough_behavior,
+ payload_format_version,
+ integration_subtype,
+ request_parameters,
+ request_templates,
+ response_parameters,
+ template_selection_expression,
+ timeout_in_millis,
+ tls_config,
+ ):
+ if connection_id is not None:
+ self.connection_id = connection_id
+ if connection_type is not None:
+ self.connection_type = connection_type
+ if content_handling_strategy is not None:
+ self.content_handling_strategy = content_handling_strategy
+ if credentials_arn is not None:
+ self.credentials_arn = credentials_arn
+ if description is not None:
+ self.description = description
+ if integration_method is not None:
+ self.integration_method = integration_method
+ if integration_type is not None:
+ self.integration_type = integration_type
+ if integration_uri is not None:
+ self.integration_uri = integration_uri
+ if passthrough_behavior is not None:
+ self.passthrough_behavior = passthrough_behavior
+ if payload_format_version is not None:
+ self.payload_format_version = payload_format_version
+ if integration_subtype is not None:
+ self.integration_subtype = integration_subtype
+ if request_parameters is not None:
+ # Skip parameters with an empty value
+ req_params = {
+ key: value for (key, value) in request_parameters.items() if value
+ }
+ self.request_parameters = req_params
+ if request_templates is not None:
+ self.request_templates = request_templates
+ if response_parameters is not None:
+ self.response_parameters = response_parameters
+ if template_selection_expression is not None:
+ self.template_selection_expression = template_selection_expression
+ if timeout_in_millis is not None:
+ self.timeout_in_millis = timeout_in_millis
+ if tls_config is not None:
+ self.tls_config = tls_config
+
+ def to_json(self):
+ return {
+ "connectionId": self.connection_id,
+ "connectionType": self.connection_type,
+ "contentHandlingStrategy": self.content_handling_strategy,
+ "credentialsArn": self.credentials_arn,
+ "description": self.description,
+ "integrationId": self.id,
+ "integrationMethod": self.integration_method,
+ "integrationResponseSelectionExpression": self.integration_response_selection_expression,
+ "integrationType": self.integration_type,
+ "integrationSubtype": self.integration_subtype,
+ "integrationUri": self.integration_uri,
+ "passthroughBehavior": self.passthrough_behavior,
+ "payloadFormatVersion": self.payload_format_version,
+ "requestParameters": self.request_parameters,
+ "requestTemplates": self.request_templates,
+ "responseParameters": self.response_parameters,
+ "templateSelectionExpression": self.template_selection_expression,
+ "timeoutInMillis": self.timeout_in_millis,
+ "tlsConfig": self.tls_config,
+ }
+
+
+class IntegrationResponse(BaseModel):
+ def __init__(
+ self,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.content_handling_strategy = content_handling_strategy
+ self.integration_response_key = integration_response_key
+ self.response_parameters = response_parameters
+ self.response_templates = response_templates
+ self.template_selection_expression = template_selection_expression
+
+ def update(
+ self,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ if content_handling_strategy is not None:
+ self.content_handling_strategy = content_handling_strategy
+ if integration_response_key is not None:
+ self.integration_response_key = integration_response_key
+ if response_parameters is not None:
+ self.response_parameters = response_parameters
+ if response_templates is not None:
+ self.response_templates = response_templates
+ if template_selection_expression is not None:
+ self.template_selection_expression = template_selection_expression
+
+ def to_json(self):
+ return {
+ "integrationResponseId": self.id,
+ "integrationResponseKey": self.integration_response_key,
+ "contentHandlingStrategy": self.content_handling_strategy,
+ "responseParameters": self.response_parameters,
+ "responseTemplates": self.response_templates,
+ "templateSelectionExpression": self.template_selection_expression,
+ }
+
+
+class Model(BaseModel):
+ def __init__(self, content_type, description, name, schema):
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.content_type = content_type
+ self.description = description
+ self.name = name
+ self.schema = schema
+
+ def update(self, content_type, description, name, schema):
+ if content_type is not None:
+ self.content_type = content_type
+ if description is not None:
+ self.description = description
+ if name is not None:
+ self.name = name
+ if schema is not None:
+ self.schema = schema
+
+ def to_json(self):
+ return {
+ "modelId": self.id,
+ "contentType": self.content_type,
+ "description": self.description,
+ "name": self.name,
+ "schema": self.schema,
+ }
+
+
+class RouteResponse(BaseModel):
+ def __init__(self, route_response_key, model_selection_expression, response_models):
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.route_response_key = route_response_key
+ self.model_selection_expression = model_selection_expression
+ self.response_models = response_models
+
+ def to_json(self):
+ return {
+ "modelSelectionExpression": self.model_selection_expression,
+ "responseModels": self.response_models,
+ "routeResponseId": self.id,
+ "routeResponseKey": self.route_response_key,
+ }
+
+
+class Route(BaseModel):
+ def __init__(
+ self,
+ api_key_required,
+ authorization_scopes,
+ authorization_type,
+ authorizer_id,
+ model_selection_expression,
+ operation_name,
+ request_models,
+ request_parameters,
+ route_key,
+ route_response_selection_expression,
+ target,
+ ):
+ self.route_id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.api_key_required = api_key_required
+ self.authorization_scopes = authorization_scopes
+ self.authorization_type = authorization_type
+ self.authorizer_id = authorizer_id
+ self.model_selection_expression = model_selection_expression
+ self.operation_name = operation_name
+ self.request_models = request_models
+ self.request_parameters = request_parameters or {}
+ self.route_key = route_key
+ self.route_response_selection_expression = route_response_selection_expression
+ self.target = target
+
+ self.route_responses = dict()
+
+ def create_route_response(
+ self, route_response_key, model_selection_expression, response_models
+ ):
+ route_response = RouteResponse(
+ route_response_key,
+ model_selection_expression=model_selection_expression,
+ response_models=response_models,
+ )
+ self.route_responses[route_response.id] = route_response
+ return route_response
+
+ def get_route_response(self, route_response_id):
+ if route_response_id not in self.route_responses:
+ raise RouteResponseNotFound(route_response_id)
+ return self.route_responses[route_response_id]
+
+ def delete_route_response(self, route_response_id):
+ self.route_responses.pop(route_response_id, None)
+
+ def delete_route_request_parameter(self, request_param):
+ del self.request_parameters[request_param]
+
+ def update(
+ self,
+ api_key_required,
+ authorization_scopes,
+ authorization_type,
+ authorizer_id,
+ model_selection_expression,
+ operation_name,
+ request_models,
+ request_parameters,
+ route_key,
+ route_response_selection_expression,
+ target,
+ ):
+ if api_key_required is not None:
+ self.api_key_required = api_key_required
+ if authorization_scopes:
+ self.authorization_scopes = authorization_scopes
+ if authorization_type:
+ self.authorization_type = authorization_type
+ if authorizer_id is not None:
+ self.authorizer_id = authorizer_id
+ if model_selection_expression:
+ self.model_selection_expression = model_selection_expression
+ if operation_name is not None:
+ self.operation_name = operation_name
+ if request_models:
+ self.request_models = request_models
+ if request_parameters:
+ self.request_parameters = request_parameters
+ if route_key:
+ self.route_key = route_key
+ if route_response_selection_expression is not None:
+ self.route_response_selection_expression = (
+ route_response_selection_expression
+ )
+ if target:
+ self.target = target
+
+ def to_json(self):
+ return {
+ "apiKeyRequired": self.api_key_required,
+ "authorizationScopes": self.authorization_scopes,
+ "authorizationType": self.authorization_type,
+ "authorizerId": self.authorizer_id,
+ "modelSelectionExpression": self.model_selection_expression,
+ "operationName": self.operation_name,
+ "requestModels": self.request_models,
+ "requestParameters": self.request_parameters,
+ "routeId": self.route_id,
+ "routeKey": self.route_key,
+ "routeResponseSelectionExpression": self.route_response_selection_expression,
+ "target": self.target,
+ }
+
+
+class Api(BaseModel):
+ def __init__(
+ self,
+ region,
+ name,
+ api_key_selection_expression,
+ cors_configuration,
+ description,
+ disable_execute_api_endpoint,
+ disable_schema_validation,
+ protocol_type,
+ route_selection_expression,
+ tags,
+ version,
+ backend,
+ ):
+ self.api_id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.api_endpoint = f"https://{self.api_id}.execute-api.{region}.amazonaws.com"
+ self.backend = backend
+ self.name = name
+ self.api_key_selection_expression = (
+ api_key_selection_expression or "$request.header.x-api-key"
+ )
+ self.created_date = unix_time()
+ self.cors_configuration = cors_configuration
+ self.description = description
+ self.disable_execute_api_endpoint = disable_execute_api_endpoint or False
+ self.disable_schema_validation = disable_schema_validation
+ self.protocol_type = protocol_type
+ self.route_selection_expression = (
+ route_selection_expression or "$request.method $request.path"
+ )
+ self.version = version
+
+ self.authorizers = dict()
+ self.integrations = dict()
+ self.models = dict()
+ self.routes = dict()
+
+ self.arn = f"arn:aws:apigateway:{region}::/apis/{self.api_id}"
+ self.backend.tag_resource(self.arn, tags)
+
+ def clear(self):
+ self.authorizers = dict()
+ self.integrations = dict()
+ self.models = dict()
+ self.routes = dict()
+
+ def delete_cors_configuration(self):
+ self.cors_configuration = None
+
+ def create_authorizer(
+ self,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_type,
+ authorizer_uri,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ authorizer = Authorizer(
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ self.authorizers[authorizer.id] = authorizer
+ return authorizer
+
+ def delete_authorizer(self, authorizer_id):
+ self.authorizers.pop(authorizer_id, None)
+
+ def get_authorizer(self, authorizer_id):
+ if authorizer_id not in self.authorizers:
+ raise AuthorizerNotFound(authorizer_id)
+ return self.authorizers[authorizer_id]
+
+ def update_authorizer(
+ self,
+ authorizer_id,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_type,
+ authorizer_uri,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ authorizer = self.authorizers[authorizer_id]
+ authorizer.update(
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ return authorizer
+
+ def create_model(self, content_type, description, name, schema):
+ model = Model(content_type, description, name, schema)
+ self.models[model.id] = model
+ return model
+
+ def delete_model(self, model_id):
+ self.models.pop(model_id, None)
+
+ def get_model(self, model_id):
+ if model_id not in self.models:
+ raise ModelNotFound(model_id)
+ return self.models[model_id]
+
+ def update_model(self, model_id, content_type, description, name, schema):
+ model = self.models[model_id]
+ model.update(content_type, description, name, schema)
+ return model
+
+ def import_api(self, body, fail_on_warnings):
+ self.clear()
+ body = yaml.safe_load(body)
+ for path, path_details in body.get("paths", {}).items():
+ for method, method_details in path_details.items():
+ route_key = f"{method.upper()} {path}"
+ for int_type, type_details in method_details.items():
+ if int_type == "responses":
+ for status_code, response_details in type_details.items():
+ content = response_details.get("content", {})
+ for content_type in content.values():
+ for ref in content_type.get("schema", {}).values():
+ if ref not in self.models and fail_on_warnings:
+ attr = f"paths.'{path}'({method}).{int_type}.{status_code}.content.schema.{ref}"
+ raise BadRequestException(
+ f"Warnings found during import:\n\tParse issue: attribute {attr} is missing"
+ )
+ if int_type == "x-amazon-apigateway-integration":
+ integration = self.create_integration(
+ connection_type="INTERNET",
+ description="AutoCreate from OpenAPI Import",
+ integration_type=type_details.get("type"),
+ integration_method=type_details.get("httpMethod"),
+ payload_format_version=type_details.get(
+ "payloadFormatVersion"
+ ),
+ integration_uri=type_details.get("uri"),
+ )
+ self.create_route(
+ api_key_required=False,
+ authorization_scopes=[],
+ route_key=route_key,
+ target=f"integrations/{integration.id}",
+ )
+ if "title" in body.get("info", {}):
+ self.name = body["info"]["title"]
+ if "version" in body.get("info", {}):
+ self.version = str(body["info"]["version"])
+ if "x-amazon-apigateway-cors" in body:
+ self.cors_configuration = body["x-amazon-apigateway-cors"]
+
+ def update(
+ self,
+ api_key_selection_expression,
+ cors_configuration,
+ description,
+ disable_schema_validation,
+ disable_execute_api_endpoint,
+ name,
+ route_selection_expression,
+ version,
+ ):
+ if api_key_selection_expression is not None:
+ self.api_key_selection_expression = api_key_selection_expression
+ if cors_configuration is not None:
+ self.cors_configuration = cors_configuration
+ if description is not None:
+ self.description = description
+ if disable_execute_api_endpoint is not None:
+ self.disable_execute_api_endpoint = disable_execute_api_endpoint
+ if disable_schema_validation is not None:
+ self.disable_schema_validation = disable_schema_validation
+ if name is not None:
+ self.name = name
+ if route_selection_expression is not None:
+ self.route_selection_expression = route_selection_expression
+ if version is not None:
+ self.version = version
+
+ def create_integration(
+ self,
+ connection_type,
+ description,
+ integration_method,
+ integration_type,
+ integration_uri,
+ connection_id=None,
+ content_handling_strategy=None,
+ credentials_arn=None,
+ passthrough_behavior=None,
+ payload_format_version=None,
+ integration_subtype=None,
+ request_parameters=None,
+ request_templates=None,
+ response_parameters=None,
+ template_selection_expression=None,
+ timeout_in_millis=None,
+ tls_config=None,
+ ):
+ integration = Integration(
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_method=integration_method,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ integration_subtype=integration_subtype,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ self.integrations[integration.id] = integration
+ return integration
+
+ def delete_integration(self, integration_id):
+ self.integrations.pop(integration_id, None)
+
+ def get_integration(self, integration_id):
+ if integration_id not in self.integrations:
+ raise IntegrationNotFound(integration_id)
+ return self.integrations[integration_id]
+
+ def get_integrations(self):
+ return self.integrations.values()
+
+ def update_integration(
+ self,
+ integration_id,
+ connection_id,
+ connection_type,
+ content_handling_strategy,
+ credentials_arn,
+ description,
+ integration_method,
+ integration_type,
+ integration_uri,
+ passthrough_behavior,
+ payload_format_version,
+ integration_subtype,
+ request_parameters,
+ request_templates,
+ response_parameters,
+ template_selection_expression,
+ timeout_in_millis,
+ tls_config,
+ ):
+ integration = self.integrations[integration_id]
+ integration.update(
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_method=integration_method,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ integration_subtype=integration_subtype,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ return integration
+
+ def create_integration_response(
+ self,
+ integration_id,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ integration = self.get_integration(integration_id)
+ return integration.create_response(
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+
+ def delete_integration_response(self, integration_id, integration_response_id):
+ integration = self.get_integration(integration_id)
+ integration.delete_response(integration_response_id)
+
+ def get_integration_response(self, integration_id, integration_response_id):
+ integration = self.get_integration(integration_id)
+ return integration.get_response(integration_response_id)
+
+ def get_integration_responses(self, integration_id):
+ integration = self.get_integration(integration_id)
+ return integration.get_responses()
+
+ def update_integration_response(
+ self,
+ integration_id,
+ integration_response_id,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ integration = self.get_integration(integration_id)
+ return integration.update_response(
+ integration_response_id=integration_response_id,
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+
+ def create_route(
+ self,
+ api_key_required,
+ authorization_scopes,
+ route_key,
+ target,
+ authorization_type=None,
+ authorizer_id=None,
+ model_selection_expression=None,
+ operation_name=None,
+ request_models=None,
+ request_parameters=None,
+ route_response_selection_expression=None,
+ ):
+ route = Route(
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ self.routes[route.route_id] = route
+ return route
+
+ def delete_route(self, route_id):
+ self.routes.pop(route_id, None)
+
+ def delete_route_request_parameter(self, route_id, request_param):
+ route = self.get_route(route_id)
+ route.delete_route_request_parameter(request_param)
+
+ def get_route(self, route_id):
+ if route_id not in self.routes:
+ raise RouteNotFound(route_id)
+ return self.routes[route_id]
+
+ def get_routes(self):
+ return self.routes.values()
+
+ def update_route(
+ self,
+ route_id,
+ api_key_required,
+ authorization_scopes,
+ authorization_type,
+ authorizer_id,
+ model_selection_expression,
+ operation_name,
+ request_models,
+ request_parameters,
+ route_key,
+ route_response_selection_expression,
+ target,
+ ):
+ route = self.get_route(route_id)
+ route.update(
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ return route
+
+ def create_route_response(
+ self, route_id, route_response_key, model_selection_expression, response_models
+ ):
+ route = self.get_route(route_id)
+ return route.create_route_response(
+ route_response_key,
+ model_selection_expression=model_selection_expression,
+ response_models=response_models,
+ )
+
+ def delete_route_response(self, route_id, route_response_id):
+ route = self.get_route(route_id)
+ route.delete_route_response(route_response_id)
+
+ def get_route_response(self, route_id, route_response_id):
+ route = self.get_route(route_id)
+ return route.get_route_response(route_response_id)
+
+ def to_json(self):
+ return {
+ "apiId": self.api_id,
+ "apiEndpoint": self.api_endpoint,
+ "apiKeySelectionExpression": self.api_key_selection_expression,
+ "createdDate": self.created_date,
+ "corsConfiguration": self.cors_configuration,
+ "description": self.description,
+ "disableExecuteApiEndpoint": self.disable_execute_api_endpoint,
+ "disableSchemaValidation": self.disable_schema_validation,
+ "name": self.name,
+ "protocolType": self.protocol_type,
+ "routeSelectionExpression": self.route_selection_expression,
+ "tags": self.backend.get_tags(self.arn),
+ "version": self.version,
+ }
+
+
+class VpcLink(BaseModel):
+ def __init__(self, name, sg_ids, subnet_ids, tags, backend):
+ self.created = unix_time()
+ self.id = "".join(random.choice(string.ascii_lowercase) for _ in range(8))
+ self.name = name
+ self.sg_ids = sg_ids
+ self.subnet_ids = subnet_ids
+
+ self.arn = f"arn:aws:apigateway:{backend.region_name}::/vpclinks/{self.id}"
+ self.backend = backend
+ self.backend.tag_resource(self.arn, tags)
+
+ def update(self, name):
+ self.name = name
+
+ def to_json(self):
+ return {
+ "createdDate": self.created,
+ "name": self.name,
+ "securityGroupIds": self.sg_ids,
+ "subnetIds": self.subnet_ids,
+ "tags": self.backend.get_tags(self.arn),
+ "vpcLinkId": self.id,
+ "vpcLinkStatus": "AVAILABLE",
+ "vpcLinkVersion": "V2",
+ }
+
+
+class ApiGatewayV2Backend(BaseBackend):
+ """Implementation of ApiGatewayV2 APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.apis = dict()
+ self.vpc_links = dict()
+ self.tagger = TaggingService()
+
+ def create_api(
+ self,
+ api_key_selection_expression,
+ cors_configuration,
+ description,
+ disable_schema_validation,
+ disable_execute_api_endpoint,
+ name,
+ protocol_type,
+ route_selection_expression,
+ tags,
+ version,
+ ):
+ """
+ The following parameters are not yet implemented:
+ CredentialsArn, RouteKey, Tags, Target
+ """
+ api = Api(
+ region=self.region_name,
+ cors_configuration=cors_configuration,
+ description=description,
+ name=name,
+ api_key_selection_expression=api_key_selection_expression,
+ disable_execute_api_endpoint=disable_execute_api_endpoint,
+ disable_schema_validation=disable_schema_validation,
+ protocol_type=protocol_type,
+ route_selection_expression=route_selection_expression,
+ tags=tags,
+ version=version,
+ backend=self,
+ )
+ self.apis[api.api_id] = api
+ return api
+
+ def delete_api(self, api_id):
+ self.apis.pop(api_id, None)
+
+ def get_api(self, api_id):
+ if api_id not in self.apis:
+ raise ApiNotFound(api_id)
+ return self.apis[api_id]
+
+ def get_apis(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.apis.values()
+
+ def update_api(
+ self,
+ api_id,
+ api_key_selection_expression,
+ cors_configuration,
+ description,
+ disable_schema_validation,
+ disable_execute_api_endpoint,
+ name,
+ route_selection_expression,
+ version,
+ ):
+ """
+ The following parameters have not yet been implemented: CredentialsArn, RouteKey, Target
+ """
+ api = self.get_api(api_id)
+ api.update(
+ api_key_selection_expression=api_key_selection_expression,
+ cors_configuration=cors_configuration,
+ description=description,
+ disable_schema_validation=disable_schema_validation,
+ disable_execute_api_endpoint=disable_execute_api_endpoint,
+ name=name,
+ route_selection_expression=route_selection_expression,
+ version=version,
+ )
+ return api
+
+ def reimport_api(self, api_id, body, fail_on_warnings):
+ """
+ Only YAML is supported at the moment. Full OpenAPI-support is not guaranteed. Only limited validation is implemented
+ """
+ api = self.get_api(api_id)
+ api.import_api(body, fail_on_warnings)
+ return api
+
+ def delete_cors_configuration(self, api_id):
+ api = self.get_api(api_id)
+ api.delete_cors_configuration()
+
+ def create_authorizer(
+ self,
+ api_id,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_uri,
+ authorizer_type,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ api = self.get_api(api_id)
+ authorizer = api.create_authorizer(
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ return authorizer
+
+ def delete_authorizer(self, api_id, authorizer_id):
+ api = self.get_api(api_id)
+ api.delete_authorizer(authorizer_id=authorizer_id)
+
+ def get_authorizer(self, api_id, authorizer_id):
+ api = self.get_api(api_id)
+ authorizer = api.get_authorizer(authorizer_id=authorizer_id)
+ return authorizer
+
+ def update_authorizer(
+ self,
+ api_id,
+ authorizer_id,
+ auth_creds_arn,
+ auth_payload_format_version,
+ auth_result_ttl,
+ authorizer_uri,
+ authorizer_type,
+ enable_simple_response,
+ identity_source,
+ identity_validation_expr,
+ jwt_config,
+ name,
+ ):
+ api = self.get_api(api_id)
+ authorizer = api.update_authorizer(
+ authorizer_id=authorizer_id,
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ return authorizer
+
+ def create_model(self, api_id, content_type, description, name, schema):
+ api = self.get_api(api_id)
+ model = api.create_model(
+ content_type=content_type, description=description, name=name, schema=schema
+ )
+ return model
+
+ def delete_model(self, api_id, model_id):
+ api = self.get_api(api_id)
+ api.delete_model(model_id=model_id)
+
+ def get_model(self, api_id, model_id):
+ api = self.get_api(api_id)
+ return api.get_model(model_id)
+
+ def update_model(self, api_id, model_id, content_type, description, name, schema):
+ api = self.get_api(api_id)
+ return api.update_model(model_id, content_type, description, name, schema)
+
+ def get_tags(self, resource_id):
+ return self.tagger.get_tag_dict_for_resource(resource_id)
+
+ def tag_resource(self, resource_arn, tags):
+ tags = TaggingService.convert_dict_to_tags_input(tags or {})
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+ def create_route(
+ self,
+ api_id,
+ api_key_required,
+ authorization_scopes,
+ authorization_type,
+ authorizer_id,
+ model_selection_expression,
+ operation_name,
+ request_models,
+ request_parameters,
+ route_key,
+ route_response_selection_expression,
+ target,
+ ):
+ api = self.get_api(api_id)
+ route = api.create_route(
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ return route
+
+ def delete_route(self, api_id, route_id):
+ api = self.get_api(api_id)
+ api.delete_route(route_id)
+
+ def delete_route_request_parameter(self, api_id, route_id, request_param):
+ api = self.get_api(api_id)
+ api.delete_route_request_parameter(route_id, request_param)
+
+ def get_route(self, api_id, route_id):
+ api = self.get_api(api_id)
+ return api.get_route(route_id)
+
+ def get_routes(self, api_id):
+ """
+ Pagination is not yet implemented
+ """
+ api = self.get_api(api_id)
+ return api.get_routes()
+
+ def update_route(
+ self,
+ api_id,
+ api_key_required,
+ authorization_scopes,
+ authorization_type,
+ authorizer_id,
+ model_selection_expression,
+ operation_name,
+ request_models,
+ request_parameters,
+ route_id,
+ route_key,
+ route_response_selection_expression,
+ target,
+ ):
+ api = self.get_api(api_id)
+ route = api.update_route(
+ route_id=route_id,
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ return route
+
+ def create_route_response(
+ self,
+ api_id,
+ route_id,
+ route_response_key,
+ model_selection_expression,
+ response_models,
+ ):
+ """
+ The following parameters are not yet implemented: ResponseModels, ResponseParameters
+ """
+ api = self.get_api(api_id)
+ return api.create_route_response(
+ route_id,
+ route_response_key,
+ model_selection_expression=model_selection_expression,
+ response_models=response_models,
+ )
+
+ def delete_route_response(self, api_id, route_id, route_response_id):
+ api = self.get_api(api_id)
+ api.delete_route_response(route_id, route_response_id)
+
+ def get_route_response(self, api_id, route_id, route_response_id):
+ api = self.get_api(api_id)
+ return api.get_route_response(route_id, route_response_id)
+
+ def create_integration(
+ self,
+ api_id,
+ connection_id,
+ connection_type,
+ content_handling_strategy,
+ credentials_arn,
+ description,
+ integration_method,
+ integration_subtype,
+ integration_type,
+ integration_uri,
+ passthrough_behavior,
+ payload_format_version,
+ request_parameters,
+ request_templates,
+ response_parameters,
+ template_selection_expression,
+ timeout_in_millis,
+ tls_config,
+ ):
+ api = self.get_api(api_id)
+ integration = api.create_integration(
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_method=integration_method,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ integration_subtype=integration_subtype,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ return integration
+
+ def get_integration(self, api_id, integration_id):
+ api = self.get_api(api_id)
+ integration = api.get_integration(integration_id)
+ return integration
+
+ def get_integrations(self, api_id):
+ """
+ Pagination is not yet implemented
+ """
+ api = self.get_api(api_id)
+ return api.get_integrations()
+
+ def delete_integration(self, api_id, integration_id):
+ api = self.get_api(api_id)
+ api.delete_integration(integration_id)
+
+ def update_integration(
+ self,
+ api_id,
+ connection_id,
+ connection_type,
+ content_handling_strategy,
+ credentials_arn,
+ description,
+ integration_id,
+ integration_method,
+ integration_subtype,
+ integration_type,
+ integration_uri,
+ passthrough_behavior,
+ payload_format_version,
+ request_parameters,
+ request_templates,
+ response_parameters,
+ template_selection_expression,
+ timeout_in_millis,
+ tls_config,
+ ):
+ api = self.get_api(api_id)
+ integration = api.update_integration(
+ integration_id=integration_id,
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_method=integration_method,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ integration_subtype=integration_subtype,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ return integration
+
+ def create_integration_response(
+ self,
+ api_id,
+ integration_id,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ api = self.get_api(api_id)
+ integration_response = api.create_integration_response(
+ integration_id=integration_id,
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ return integration_response
+
+ def delete_integration_response(
+ self, api_id, integration_id, integration_response_id
+ ):
+ api = self.get_api(api_id)
+ api.delete_integration_response(
+ integration_id, integration_response_id=integration_response_id
+ )
+
+ def get_integration_response(self, api_id, integration_id, integration_response_id):
+ api = self.get_api(api_id)
+ return api.get_integration_response(
+ integration_id, integration_response_id=integration_response_id
+ )
+
+ def get_integration_responses(self, api_id, integration_id):
+ api = self.get_api(api_id)
+ return api.get_integration_responses(integration_id)
+
+ def update_integration_response(
+ self,
+ api_id,
+ integration_id,
+ integration_response_id,
+ content_handling_strategy,
+ integration_response_key,
+ response_parameters,
+ response_templates,
+ template_selection_expression,
+ ):
+ api = self.get_api(api_id)
+ integration_response = api.update_integration_response(
+ integration_id=integration_id,
+ integration_response_id=integration_response_id,
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ return integration_response
+
+ def create_vpc_link(self, name, sg_ids, subnet_ids, tags):
+ vpc_link = VpcLink(
+ name, sg_ids=sg_ids, subnet_ids=subnet_ids, tags=tags, backend=self
+ )
+ self.vpc_links[vpc_link.id] = vpc_link
+ return vpc_link
+
+ def get_vpc_link(self, vpc_link_id):
+ if vpc_link_id not in self.vpc_links:
+ raise VpcLinkNotFound(vpc_link_id)
+ return self.vpc_links[vpc_link_id]
+
+ def delete_vpc_link(self, vpc_link_id):
+ self.vpc_links.pop(vpc_link_id, None)
+
+ def get_vpc_links(self):
+ return self.vpc_links.values()
+
+ def update_vpc_link(self, vpc_link_id, name):
+ vpc_link = self.get_vpc_link(vpc_link_id)
+ vpc_link.update(name)
+ return vpc_link
+
+
+apigatewayv2_backends = BackendDict(ApiGatewayV2Backend, "apigatewayv2")
diff --git a/contrib/python/moto/py3/moto/apigatewayv2/responses.py b/contrib/python/moto/py3/moto/apigatewayv2/responses.py
new file mode 100644
index 0000000000..b025be40f5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigatewayv2/responses.py
@@ -0,0 +1,751 @@
+"""Handles incoming apigatewayv2 requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from urllib.parse import unquote
+
+from .exceptions import UnknownProtocol
+from .models import apigatewayv2_backends
+
+
+class ApiGatewayV2Response(BaseResponse):
+ """Handler for ApiGatewayV2 requests and responses."""
+
+ @property
+ def apigatewayv2_backend(self):
+ """Return backend instance specific for this region."""
+ return apigatewayv2_backends[self.region]
+
+ def apis(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ return self.create_api()
+ if self.method == "GET":
+ return self.get_apis()
+
+ def api(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ return self.get_api()
+ if self.method == "PATCH":
+ return self.update_api()
+ if self.method == "PUT":
+ return self.reimport_api()
+ if self.method == "DELETE":
+ return self.delete_api()
+
+ def authorizer(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_authorizer()
+ if self.method == "GET":
+ return self.get_authorizer()
+ if self.method == "PATCH":
+ return self.update_authorizer()
+
+ def authorizers(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ return self.create_authorizer()
+
+ def cors(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_cors_configuration()
+
+ def route_request_parameter(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_route_request_parameter()
+
+ def model(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_model()
+ if self.method == "GET":
+ return self.get_model()
+ if self.method == "PATCH":
+ return self.update_model()
+
+ def models(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ return self.create_model()
+
+ def integration(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_integration()
+ if self.method == "GET":
+ return self.get_integration()
+ if self.method == "PATCH":
+ return self.update_integration()
+
+ def integrations(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ return self.get_integrations()
+ if self.method == "POST":
+ return self.create_integration()
+
+ def integration_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_integration_response()
+ if self.method == "GET":
+ return self.get_integration_response()
+ if self.method == "PATCH":
+ return self.update_integration_response()
+
+ def integration_responses(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ return self.get_integration_responses()
+ if self.method == "POST":
+ return self.create_integration_response()
+
+ def route(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_route()
+ if self.method == "GET":
+ return self.get_route()
+ if self.method == "PATCH":
+ return self.update_route()
+
+ def routes(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "GET":
+ return self.get_routes()
+ if self.method == "POST":
+ return self.create_route()
+
+ def route_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "DELETE":
+ return self.delete_route_response()
+ if self.method == "GET":
+ return self.get_route_response()
+
+ def route_responses(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ return self.create_route_response()
+
+ def tags(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if self.method == "POST":
+ return self.tag_resource()
+ if self.method == "GET":
+ return self.get_tags()
+ if self.method == "DELETE":
+ return self.untag_resource()
+
+ def vpc_link(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if request.method == "DELETE":
+ return self.delete_vpc_link()
+ if request.method == "GET":
+ return self.get_vpc_link()
+ if request.method == "PATCH":
+ return self.update_vpc_link()
+
+ def vpc_links(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if request.method == "GET":
+ return self.get_vpc_links()
+ if request.method == "POST":
+ return self.create_vpc_link()
+
+ def create_api(self):
+ params = json.loads(self.body)
+
+ api_key_selection_expression = params.get("apiKeySelectionExpression")
+ cors_configuration = params.get("corsConfiguration")
+ description = params.get("description")
+ disable_schema_validation = params.get("disableSchemaValidation")
+ disable_execute_api_endpoint = params.get("disableExecuteApiEndpoint")
+ name = params.get("name")
+ protocol_type = params.get("protocolType")
+ route_selection_expression = params.get("routeSelectionExpression")
+ tags = params.get("tags")
+ version = params.get("version")
+
+ if protocol_type not in ["HTTP", "WEBSOCKET"]:
+ raise UnknownProtocol
+
+ api = self.apigatewayv2_backend.create_api(
+ api_key_selection_expression=api_key_selection_expression,
+ cors_configuration=cors_configuration,
+ description=description,
+ disable_schema_validation=disable_schema_validation,
+ disable_execute_api_endpoint=disable_execute_api_endpoint,
+ name=name,
+ protocol_type=protocol_type,
+ route_selection_expression=route_selection_expression,
+ tags=tags,
+ version=version,
+ )
+ return 200, {}, json.dumps(api.to_json())
+
+ def delete_api(self):
+ api_id = self.path.split("/")[-1]
+ self.apigatewayv2_backend.delete_api(api_id=api_id)
+ return 200, "", "{}"
+
+ def get_api(self):
+ api_id = self.path.split("/")[-1]
+ api = self.apigatewayv2_backend.get_api(api_id=api_id)
+ return 200, {}, json.dumps(api.to_json())
+
+ def get_apis(self):
+ apis = self.apigatewayv2_backend.get_apis()
+ return 200, {}, json.dumps({"items": [a.to_json() for a in apis]})
+
+ def update_api(self):
+ api_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ api_key_selection_expression = params.get("apiKeySelectionExpression")
+ cors_configuration = params.get("corsConfiguration")
+ description = params.get("description")
+ disable_schema_validation = params.get("disableSchemaValidation")
+ disable_execute_api_endpoint = params.get("disableExecuteApiEndpoint")
+ name = params.get("name")
+ route_selection_expression = params.get("routeSelectionExpression")
+ version = params.get("version")
+ api = self.apigatewayv2_backend.update_api(
+ api_id=api_id,
+ api_key_selection_expression=api_key_selection_expression,
+ cors_configuration=cors_configuration,
+ description=description,
+ disable_schema_validation=disable_schema_validation,
+ disable_execute_api_endpoint=disable_execute_api_endpoint,
+ name=name,
+ route_selection_expression=route_selection_expression,
+ version=version,
+ )
+ return 200, {}, json.dumps(api.to_json())
+
+ def reimport_api(self):
+ api_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ body = params.get("body")
+ fail_on_warnings = (
+ str(self._get_param("failOnWarnings", "false")).lower() == "true"
+ )
+
+ api = self.apigatewayv2_backend.reimport_api(api_id, body, fail_on_warnings)
+ return 201, {}, json.dumps(api.to_json())
+
+ def create_authorizer(self):
+ api_id = self.path.split("/")[-2]
+ params = json.loads(self.body)
+
+ auth_creds_arn = params.get("authorizerCredentialsArn")
+ auth_payload_format_version = (
+ params.get("authorizerPayloadFormatVersion") or "2.0"
+ )
+ auth_result_ttl = params.get("authorizerResultTtlInSeconds")
+ authorizer_type = params.get("authorizerType")
+ authorizer_uri = params.get("authorizerUri")
+ enable_simple_response = params.get("enableSimpleResponses")
+ identity_source = params.get("identitySource")
+ identity_validation_expr = params.get("identityValidationExpression")
+ jwt_config = params.get("jwtConfiguration")
+ name = params.get("name")
+ authorizer = self.apigatewayv2_backend.create_authorizer(
+ api_id,
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ return 200, {}, json.dumps(authorizer.to_json())
+
+ def delete_authorizer(self):
+ api_id = self.path.split("/")[-3]
+ authorizer_id = self.path.split("/")[-1]
+
+ self.apigatewayv2_backend.delete_authorizer(api_id, authorizer_id)
+ return 200, {}, "{}"
+
+ def get_authorizer(self):
+ api_id = self.path.split("/")[-3]
+ authorizer_id = self.path.split("/")[-1]
+
+ authorizer = self.apigatewayv2_backend.get_authorizer(api_id, authorizer_id)
+ return 200, {}, json.dumps(authorizer.to_json())
+
+ def update_authorizer(self):
+ api_id = self.path.split("/")[-3]
+ authorizer_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+
+ auth_creds_arn = params.get("authorizerCredentialsArn")
+ auth_payload_format_version = params.get("authorizerPayloadFormatVersion")
+ auth_result_ttl = params.get("authorizerResultTtlInSeconds")
+ authorizer_type = params.get("authorizerType")
+ authorizer_uri = params.get("authorizerUri")
+ enable_simple_response = params.get("enableSimpleResponses")
+ identity_source = params.get("identitySource")
+ identity_validation_expr = params.get("identityValidationExpression")
+ jwt_config = params.get("jwtConfiguration")
+ name = params.get("name")
+ authorizer = self.apigatewayv2_backend.update_authorizer(
+ api_id,
+ authorizer_id=authorizer_id,
+ auth_creds_arn=auth_creds_arn,
+ auth_payload_format_version=auth_payload_format_version,
+ auth_result_ttl=auth_result_ttl,
+ authorizer_type=authorizer_type,
+ authorizer_uri=authorizer_uri,
+ enable_simple_response=enable_simple_response,
+ identity_source=identity_source,
+ identity_validation_expr=identity_validation_expr,
+ jwt_config=jwt_config,
+ name=name,
+ )
+ return 200, {}, json.dumps(authorizer.to_json())
+
+ def delete_cors_configuration(self):
+ api_id = self.path.split("/")[-2]
+ self.apigatewayv2_backend.delete_cors_configuration(api_id)
+ return 200, {}, "{}"
+
+ def create_model(self):
+ api_id = self.path.split("/")[-2]
+ params = json.loads(self.body)
+
+ content_type = params.get("contentType")
+ description = params.get("description")
+ name = params.get("name")
+ schema = params.get("schema")
+ model = self.apigatewayv2_backend.create_model(
+ api_id, content_type, description, name, schema
+ )
+ return 200, {}, json.dumps(model.to_json())
+
+ def delete_model(self):
+ api_id = self.path.split("/")[-3]
+ model_id = self.path.split("/")[-1]
+
+ self.apigatewayv2_backend.delete_model(api_id, model_id)
+ return 200, {}, "{}"
+
+ def get_model(self):
+ api_id = self.path.split("/")[-3]
+ model_id = self.path.split("/")[-1]
+
+ model = self.apigatewayv2_backend.get_model(api_id, model_id)
+ return 200, {}, json.dumps(model.to_json())
+
+ def update_model(self):
+ api_id = self.path.split("/")[-3]
+ model_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+
+ content_type = params.get("contentType")
+ description = params.get("description")
+ name = params.get("name")
+ schema = params.get("schema")
+
+ model = self.apigatewayv2_backend.update_model(
+ api_id,
+ model_id,
+ content_type=content_type,
+ description=description,
+ name=name,
+ schema=schema,
+ )
+ return 200, {}, json.dumps(model.to_json())
+
+ def get_tags(self):
+ resource_arn = unquote(self.path.split("/tags/")[1])
+ tags = self.apigatewayv2_backend.get_tags(resource_arn)
+ return 200, {}, json.dumps({"tags": tags})
+
+ def tag_resource(self):
+ resource_arn = unquote(self.path.split("/tags/")[1])
+ tags = json.loads(self.body).get("tags", {})
+ self.apigatewayv2_backend.tag_resource(resource_arn, tags)
+ return 201, {}, "{}"
+
+ def untag_resource(self):
+ resource_arn = unquote(self.path.split("/tags/")[1])
+ tag_keys = self.querystring.get("tagKeys")
+ self.apigatewayv2_backend.untag_resource(resource_arn, tag_keys)
+ return 200, {}, "{}"
+
+ def create_route(self):
+ api_id = self.path.split("/")[-2]
+ params = json.loads(self.body)
+ api_key_required = params.get("apiKeyRequired", False)
+ authorization_scopes = params.get("authorizationScopes")
+ authorization_type = params.get("authorizationType", "NONE")
+ authorizer_id = params.get("authorizerId")
+ model_selection_expression = params.get("modelSelectionExpression")
+ operation_name = params.get("operationName")
+ request_models = params.get("requestModels")
+ request_parameters = params.get("requestParameters")
+ route_key = params.get("routeKey")
+ route_response_selection_expression = params.get(
+ "routeResponseSelectionExpression"
+ )
+ target = params.get("target")
+ route = self.apigatewayv2_backend.create_route(
+ api_id=api_id,
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ return 201, {}, json.dumps(route.to_json())
+
+ def delete_route(self):
+ api_id = self.path.split("/")[-3]
+ route_id = self.path.split("/")[-1]
+ self.apigatewayv2_backend.delete_route(api_id=api_id, route_id=route_id)
+ return 200, {}, "{}"
+
+ def delete_route_request_parameter(self):
+ api_id = self.path.split("/")[-5]
+ route_id = self.path.split("/")[-3]
+ request_param = self.path.split("/")[-1]
+ self.apigatewayv2_backend.delete_route_request_parameter(
+ api_id, route_id, request_param
+ )
+ return 200, {}, "{}"
+
+ def get_route(self):
+ api_id = self.path.split("/")[-3]
+ route_id = self.path.split("/")[-1]
+ api = self.apigatewayv2_backend.get_route(api_id=api_id, route_id=route_id)
+ return 200, {}, json.dumps(api.to_json())
+
+ def get_routes(self):
+ api_id = self.path.split("/")[-2]
+ apis = self.apigatewayv2_backend.get_routes(api_id=api_id)
+ return 200, {}, json.dumps({"items": [api.to_json() for api in apis]})
+
+ def update_route(self):
+ api_id = self.path.split("/")[-3]
+ route_id = self.path.split("/")[-1]
+
+ params = json.loads(self.body)
+ api_key_required = params.get("apiKeyRequired")
+ authorization_scopes = params.get("authorizationScopes")
+ authorization_type = params.get("authorizationType")
+ authorizer_id = params.get("authorizerId")
+ model_selection_expression = params.get("modelSelectionExpression")
+ operation_name = params.get("operationName")
+ request_models = params.get("requestModels")
+ request_parameters = params.get("requestParameters")
+ route_key = params.get("routeKey")
+ route_response_selection_expression = params.get(
+ "routeResponseSelectionExpression"
+ )
+ target = params.get("target")
+ api = self.apigatewayv2_backend.update_route(
+ api_id=api_id,
+ api_key_required=api_key_required,
+ authorization_scopes=authorization_scopes,
+ authorization_type=authorization_type,
+ authorizer_id=authorizer_id,
+ model_selection_expression=model_selection_expression,
+ operation_name=operation_name,
+ request_models=request_models,
+ request_parameters=request_parameters,
+ route_id=route_id,
+ route_key=route_key,
+ route_response_selection_expression=route_response_selection_expression,
+ target=target,
+ )
+ return 200, {}, json.dumps(api.to_json())
+
+ def create_route_response(self):
+ api_id = self.path.split("/")[-4]
+ route_id = self.path.split("/")[-2]
+ params = json.loads(self.body)
+
+ response_models = params.get("responseModels")
+ route_response_key = params.get("routeResponseKey")
+ model_selection_expression = params.get("modelSelectionExpression")
+ route_response = self.apigatewayv2_backend.create_route_response(
+ api_id,
+ route_id,
+ route_response_key,
+ model_selection_expression=model_selection_expression,
+ response_models=response_models,
+ )
+ return 200, {}, json.dumps(route_response.to_json())
+
+ def delete_route_response(self):
+ api_id = self.path.split("/")[-5]
+ route_id = self.path.split("/")[-3]
+ route_response_id = self.path.split("/")[-1]
+
+ self.apigatewayv2_backend.delete_route_response(
+ api_id, route_id, route_response_id
+ )
+ return 200, {}, "{}"
+
+ def get_route_response(self):
+ api_id = self.path.split("/")[-5]
+ route_id = self.path.split("/")[-3]
+ route_response_id = self.path.split("/")[-1]
+
+ route_response = self.apigatewayv2_backend.get_route_response(
+ api_id, route_id, route_response_id
+ )
+ return 200, {}, json.dumps(route_response.to_json())
+
+ def create_integration(self):
+ api_id = self.path.split("/")[-2]
+
+ params = json.loads(self.body)
+ connection_id = params.get("connectionId")
+ connection_type = params.get("connectionType")
+ content_handling_strategy = params.get("contentHandlingStrategy")
+ credentials_arn = params.get("credentialsArn")
+ description = params.get("description")
+ integration_method = params.get("integrationMethod")
+ integration_subtype = params.get("integrationSubtype")
+ integration_type = params.get("integrationType")
+ integration_uri = params.get("integrationUri")
+ passthrough_behavior = params.get("passthroughBehavior")
+ payload_format_version = params.get("payloadFormatVersion")
+ request_parameters = params.get("requestParameters")
+ request_templates = params.get("requestTemplates")
+ response_parameters = params.get("responseParameters")
+ template_selection_expression = params.get("templateSelectionExpression")
+ timeout_in_millis = params.get("timeoutInMillis")
+ tls_config = params.get("tlsConfig")
+ integration = self.apigatewayv2_backend.create_integration(
+ api_id=api_id,
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_method=integration_method,
+ integration_subtype=integration_subtype,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ return 200, {}, json.dumps(integration.to_json())
+
+ def get_integration(self):
+ api_id = self.path.split("/")[-3]
+ integration_id = self.path.split("/")[-1]
+
+ integration = self.apigatewayv2_backend.get_integration(
+ api_id=api_id, integration_id=integration_id
+ )
+ return 200, {}, json.dumps(integration.to_json())
+
+ def get_integrations(self):
+ api_id = self.path.split("/")[-2]
+
+ integrations = self.apigatewayv2_backend.get_integrations(api_id=api_id)
+ return 200, {}, json.dumps({"items": [i.to_json() for i in integrations]})
+
+ def delete_integration(self):
+ api_id = self.path.split("/")[-3]
+ integration_id = self.path.split("/")[-1]
+
+ self.apigatewayv2_backend.delete_integration(
+ api_id=api_id, integration_id=integration_id
+ )
+ return 200, {}, "{}"
+
+ def update_integration(self):
+ api_id = self.path.split("/")[-3]
+ integration_id = self.path.split("/")[-1]
+
+ params = json.loads(self.body)
+ connection_id = params.get("connectionId")
+ connection_type = params.get("connectionType")
+ content_handling_strategy = params.get("contentHandlingStrategy")
+ credentials_arn = params.get("credentialsArn")
+ description = params.get("description")
+ integration_method = params.get("integrationMethod")
+ integration_subtype = params.get("integrationSubtype")
+ integration_type = params.get("integrationType")
+ integration_uri = params.get("integrationUri")
+ passthrough_behavior = params.get("passthroughBehavior")
+ payload_format_version = params.get("payloadFormatVersion")
+ request_parameters = params.get("requestParameters")
+ request_templates = params.get("requestTemplates")
+ response_parameters = params.get("responseParameters")
+ template_selection_expression = params.get("templateSelectionExpression")
+ timeout_in_millis = params.get("timeoutInMillis")
+ tls_config = params.get("tlsConfig")
+ integration = self.apigatewayv2_backend.update_integration(
+ api_id=api_id,
+ connection_id=connection_id,
+ connection_type=connection_type,
+ content_handling_strategy=content_handling_strategy,
+ credentials_arn=credentials_arn,
+ description=description,
+ integration_id=integration_id,
+ integration_method=integration_method,
+ integration_subtype=integration_subtype,
+ integration_type=integration_type,
+ integration_uri=integration_uri,
+ passthrough_behavior=passthrough_behavior,
+ payload_format_version=payload_format_version,
+ request_parameters=request_parameters,
+ request_templates=request_templates,
+ response_parameters=response_parameters,
+ template_selection_expression=template_selection_expression,
+ timeout_in_millis=timeout_in_millis,
+ tls_config=tls_config,
+ )
+ return 200, {}, json.dumps(integration.to_json())
+
+ def create_integration_response(self):
+ api_id = self.path.split("/")[-4]
+ int_id = self.path.split("/")[-2]
+
+ params = json.loads(self.body)
+ content_handling_strategy = params.get("contentHandlingStrategy")
+ integration_response_key = params.get("integrationResponseKey")
+ response_parameters = params.get("responseParameters")
+ response_templates = params.get("responseTemplates")
+ template_selection_expression = params.get("templateSelectionExpression")
+ integration_response = self.apigatewayv2_backend.create_integration_response(
+ api_id=api_id,
+ integration_id=int_id,
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ return 200, {}, json.dumps(integration_response.to_json())
+
+ def delete_integration_response(self):
+ api_id = self.path.split("/")[-5]
+ int_id = self.path.split("/")[-3]
+ int_res_id = self.path.split("/")[-1]
+
+ self.apigatewayv2_backend.delete_integration_response(
+ api_id=api_id, integration_id=int_id, integration_response_id=int_res_id
+ )
+ return 200, {}, "{}"
+
+ def get_integration_response(self):
+ api_id = self.path.split("/")[-5]
+ int_id = self.path.split("/")[-3]
+ int_res_id = self.path.split("/")[-1]
+
+ int_response = self.apigatewayv2_backend.get_integration_response(
+ api_id=api_id, integration_id=int_id, integration_response_id=int_res_id
+ )
+ return 200, {}, json.dumps(int_response.to_json())
+
+ def get_integration_responses(self):
+ api_id = self.path.split("/")[-4]
+ int_id = self.path.split("/")[-2]
+
+ int_response = self.apigatewayv2_backend.get_integration_responses(
+ api_id=api_id, integration_id=int_id
+ )
+ return 200, {}, json.dumps({"items": [res.to_json() for res in int_response]})
+
+ def update_integration_response(self):
+ api_id = self.path.split("/")[-5]
+ int_id = self.path.split("/")[-3]
+ int_res_id = self.path.split("/")[-1]
+
+ params = json.loads(self.body)
+ content_handling_strategy = params.get("contentHandlingStrategy")
+ integration_response_key = params.get("integrationResponseKey")
+ response_parameters = params.get("responseParameters")
+ response_templates = params.get("responseTemplates")
+ template_selection_expression = params.get("templateSelectionExpression")
+ integration_response = self.apigatewayv2_backend.update_integration_response(
+ api_id=api_id,
+ integration_id=int_id,
+ integration_response_id=int_res_id,
+ content_handling_strategy=content_handling_strategy,
+ integration_response_key=integration_response_key,
+ response_parameters=response_parameters,
+ response_templates=response_templates,
+ template_selection_expression=template_selection_expression,
+ )
+ return 200, {}, json.dumps(integration_response.to_json())
+
+ def create_vpc_link(self):
+ params = json.loads(self.body)
+
+ name = params.get("name")
+ sg_ids = params.get("securityGroupIds")
+ subnet_ids = params.get("subnetIds")
+ tags = params.get("tags")
+ vpc_link = self.apigatewayv2_backend.create_vpc_link(
+ name, sg_ids, subnet_ids, tags
+ )
+ return 200, {}, json.dumps(vpc_link.to_json())
+
+ def delete_vpc_link(self):
+ vpc_link_id = self.path.split("/")[-1]
+ self.apigatewayv2_backend.delete_vpc_link(vpc_link_id)
+ return 200, {}, "{}"
+
+ def get_vpc_link(self):
+ vpc_link_id = self.path.split("/")[-1]
+ vpc_link = self.apigatewayv2_backend.get_vpc_link(vpc_link_id)
+ return 200, {}, json.dumps(vpc_link.to_json())
+
+ def get_vpc_links(self):
+ vpc_links = self.apigatewayv2_backend.get_vpc_links()
+ return 200, {}, json.dumps({"items": [link.to_json() for link in vpc_links]})
+
+ def update_vpc_link(self):
+ vpc_link_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ name = params.get("name")
+
+ vpc_link = self.apigatewayv2_backend.update_vpc_link(vpc_link_id, name=name)
+ return 200, {}, json.dumps(vpc_link.to_json())
diff --git a/contrib/python/moto/py3/moto/apigatewayv2/urls.py b/contrib/python/moto/py3/moto/apigatewayv2/urls.py
new file mode 100644
index 0000000000..375ca5b3e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/apigatewayv2/urls.py
@@ -0,0 +1,32 @@
+"""apigatewayv2 base URL and path."""
+from .responses import ApiGatewayV2Response
+
+url_bases = [
+ r"https?://apigateway\.(.+)\.amazonaws\.com",
+]
+
+
+response_v2 = ApiGatewayV2Response()
+
+
+url_paths = {
+ "{0}/v2/apis$": response_v2.apis,
+ "{0}/v2/apis/(?P<api_id>[^/]+)$": response_v2.api,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/authorizers$": response_v2.authorizers,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/authorizers/(?P<authorizer_id>[^/]+)$": response_v2.authorizer,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/cors$": response_v2.cors,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/integrations$": response_v2.integrations,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/integrations/(?P<integration_id>[^/]+)$": response_v2.integration,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/integrations/(?P<integration_id>[^/]+)/integrationresponses$": response_v2.integration_responses,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/integrations/(?P<integration_id>[^/]+)/integrationresponses/(?P<integration_response_id>[^/]+)$": response_v2.integration_response,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/models$": response_v2.models,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/models/(?P<model_id>[^/]+)$": response_v2.model,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/routes$": response_v2.routes,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)$": response_v2.route,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses$": response_v2.route_responses,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses/(?P<route_response_id>[^/]+)$": response_v2.route_response,
+ "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/requestparameters/(?P<request_parameter>[^/]+)$": response_v2.route_request_parameter,
+ "{0}/v2/tags/(?P<resource_arn>.+)$": response_v2.tags,
+ "{0}/v2/vpclinks$": response_v2.vpc_links,
+ "{0}/v2/vpclinks/(?P<vpc_link_id>[^/]+)$": response_v2.vpc_link,
+}
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/__init__.py b/contrib/python/moto/py3/moto/applicationautoscaling/__init__.py
new file mode 100644
index 0000000000..a5fe962e2a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/__init__.py
@@ -0,0 +1,4 @@
+from .models import applicationautoscaling_backends
+from ..core.models import base_decorator
+
+mock_applicationautoscaling = base_decorator(applicationautoscaling_backends)
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/exceptions.py b/contrib/python/moto/py3/moto/applicationautoscaling/exceptions.py
new file mode 100644
index 0000000000..3bb1611628
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/exceptions.py
@@ -0,0 +1,6 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class AWSValidationException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ValidationException", message, **kwargs)
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/models.py b/contrib/python/moto/py3/moto/applicationautoscaling/models.py
new file mode 100644
index 0000000000..8a6c9cdb53
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/models.py
@@ -0,0 +1,488 @@
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.ecs import ecs_backends
+from .exceptions import AWSValidationException
+from collections import OrderedDict
+from enum import Enum, unique
+import time
+import uuid
+
+
+@unique
+class ResourceTypeExceptionValueSet(Enum):
+ RESOURCE_TYPE = "ResourceType"
+ # MSK currently only has the "broker-storage" resource type which is not part of the resource_id
+ KAFKA_BROKER_STORAGE = "broker-storage"
+
+
+@unique
+class ServiceNamespaceValueSet(Enum):
+ APPSTREAM = "appstream"
+ RDS = "rds"
+ LAMBDA = "lambda"
+ CASSANDRA = "cassandra"
+ DYNAMODB = "dynamodb"
+ CUSTOM_RESOURCE = "custom-resource"
+ ELASTICMAPREDUCE = "elasticmapreduce"
+ EC2 = "ec2"
+ COMPREHEND = "comprehend"
+ ECS = "ecs"
+ SAGEMAKER = "sagemaker"
+ KAFKA = "kafka"
+
+
+@unique
+class ScalableDimensionValueSet(Enum):
+ CASSANDRA_TABLE_READ_CAPACITY_UNITS = "cassandra:table:ReadCapacityUnits"
+ CASSANDRA_TABLE_WRITE_CAPACITY_UNITS = "cassandra:table:WriteCapacityUnits"
+ DYNAMODB_INDEX_READ_CAPACITY_UNITS = "dynamodb:index:ReadCapacityUnits"
+ DYNAMODB_INDEX_WRITE_CAPACITY_UNITS = "dynamodb:index:WriteCapacityUnits"
+ DYNAMODB_TABLE_READ_CAPACITY_UNITS = "dynamodb:table:ReadCapacityUnits"
+ DYNAMODB_TABLE_WRITE_CAPACITY_UNITS = "dynamodb:table:WriteCapacityUnits"
+ RDS_CLUSTER_READ_REPLICA_COUNT = "rds:cluster:ReadReplicaCount"
+ RDS_CLUSTER_CAPACITY = "rds:cluster:Capacity"
+ COMPREHEND_DOCUMENT_CLASSIFIER_ENDPOINT_DESIRED_INFERENCE_UNITS = (
+ "comprehend:document-classifier-endpoint:DesiredInferenceUnits"
+ )
+ ELASTICMAPREDUCE_INSTANCE_FLEET_ON_DEMAND_CAPACITY = (
+ "elasticmapreduce:instancefleet:OnDemandCapacity"
+ )
+ ELASTICMAPREDUCE_INSTANCE_FLEET_SPOT_CAPACITY = (
+ "elasticmapreduce:instancefleet:SpotCapacity"
+ )
+ ELASTICMAPREDUCE_INSTANCE_GROUP_INSTANCE_COUNT = (
+ "elasticmapreduce:instancegroup:InstanceCount"
+ )
+ LAMBDA_FUNCTION_PROVISIONED_CONCURRENCY = "lambda:function:ProvisionedConcurrency"
+ APPSTREAM_FLEET_DESIRED_CAPACITY = "appstream:fleet:DesiredCapacity"
+ CUSTOM_RESOURCE_RESOURCE_TYPE_PROPERTY = "custom-resource:ResourceType:Property"
+ SAGEMAKER_VARIANT_DESIRED_INSTANCE_COUNT = "sagemaker:variant:DesiredInstanceCount"
+ EC2_SPOT_FLEET_REQUEST_TARGET_CAPACITY = "ec2:spot-fleet-request:TargetCapacity"
+ ECS_SERVICE_DESIRED_COUNT = "ecs:service:DesiredCount"
+ KAFKA_BROKER_STORAGE_VOLUME_SIZE = "kafka:broker-storage:VolumeSize"
+
+
+class ApplicationAutoscalingBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.ecs_backend = ecs_backends[region_name]
+ self.targets = OrderedDict()
+ self.policies = {}
+ self.scheduled_actions = list()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "application-autoscaling"
+ )
+
+ @property
+ def applicationautoscaling_backend(self):
+ return applicationautoscaling_backends[self.region_name]
+
+ def describe_scalable_targets(self, namespace, r_ids=None, dimension=None):
+ """Describe scalable targets."""
+ if r_ids is None:
+ r_ids = []
+ targets = self._flatten_scalable_targets(namespace)
+ if dimension is not None:
+ targets = [t for t in targets if t.scalable_dimension == dimension]
+ if len(r_ids) > 0:
+ targets = [t for t in targets if t.resource_id in r_ids]
+ return targets
+
+ def _flatten_scalable_targets(self, namespace):
+ """Flatten scalable targets for a given service namespace down to a list."""
+ targets = []
+ for dimension in self.targets.keys():
+ for resource_id in self.targets[dimension].keys():
+ targets.append(self.targets[dimension][resource_id])
+ targets = [t for t in targets if t.service_namespace == namespace]
+ return targets
+
+ def register_scalable_target(self, namespace, r_id, dimension, **kwargs):
+ """Registers or updates a scalable target."""
+ _ = _target_params_are_valid(namespace, r_id, dimension)
+ if namespace == ServiceNamespaceValueSet.ECS.value:
+ _ = self._ecs_service_exists_for_target(r_id)
+ if self._scalable_target_exists(r_id, dimension):
+ target = self.targets[dimension][r_id]
+ target.update(**kwargs)
+ else:
+ target = FakeScalableTarget(self, namespace, r_id, dimension, **kwargs)
+ self._add_scalable_target(target)
+ return target
+
+ def _scalable_target_exists(self, r_id, dimension):
+ return r_id in self.targets.get(dimension, [])
+
+ def _ecs_service_exists_for_target(self, r_id):
+ """Raises a ValidationException if an ECS service does not exist
+ for the specified resource ID.
+ """
+ _, cluster, service = r_id.split("/")
+ result, _ = self.ecs_backend.describe_services(cluster, [service])
+ if len(result) != 1:
+ raise AWSValidationException("ECS service doesn't exist: {}".format(r_id))
+ return True
+
+ def _add_scalable_target(self, target):
+ if target.scalable_dimension not in self.targets:
+ self.targets[target.scalable_dimension] = OrderedDict()
+ if target.resource_id not in self.targets[target.scalable_dimension]:
+ self.targets[target.scalable_dimension][target.resource_id] = target
+ return target
+
+ def deregister_scalable_target(self, namespace, r_id, dimension):
+ """Registers or updates a scalable target."""
+ if self._scalable_target_exists(r_id, dimension):
+ del self.targets[dimension][r_id]
+ else:
+ raise AWSValidationException(
+ "No scalable target found for service namespace: {}, resource ID: {}, scalable dimension: {}".format(
+ namespace, r_id, dimension
+ )
+ )
+
+ def put_scaling_policy(
+ self,
+ policy_name,
+ service_namespace,
+ resource_id,
+ scalable_dimension,
+ policy_body,
+ policy_type=None,
+ ):
+ policy_key = FakeApplicationAutoscalingPolicy.formulate_key(
+ service_namespace, resource_id, scalable_dimension, policy_name
+ )
+ if policy_key in self.policies:
+ old_policy = self.policies[policy_key]
+ policy = FakeApplicationAutoscalingPolicy(
+ region_name=self.region_name,
+ policy_name=policy_name,
+ service_namespace=service_namespace,
+ resource_id=resource_id,
+ scalable_dimension=scalable_dimension,
+ policy_type=policy_type if policy_type else old_policy.policy_type,
+ policy_body=policy_body if policy_body else old_policy._policy_body,
+ )
+ else:
+ policy = FakeApplicationAutoscalingPolicy(
+ region_name=self.region_name,
+ policy_name=policy_name,
+ service_namespace=service_namespace,
+ resource_id=resource_id,
+ scalable_dimension=scalable_dimension,
+ policy_type=policy_type,
+ policy_body=policy_body,
+ )
+ self.policies[policy_key] = policy
+ return policy
+
+ def describe_scaling_policies(self, service_namespace, **kwargs):
+ policy_names = kwargs.get("policy_names")
+ resource_id = kwargs.get("resource_id")
+ scalable_dimension = kwargs.get("scalable_dimension")
+ max_results = kwargs.get("max_results") or 100
+ next_token = kwargs.get("next_token")
+ policies = [
+ policy
+ for policy in self.policies.values()
+ if policy.service_namespace == service_namespace
+ ]
+ if policy_names:
+ policies = [
+ policy for policy in policies if policy.policy_name in policy_names
+ ]
+ if resource_id:
+ policies = [
+ policy for policy in policies if policy.resource_id in resource_id
+ ]
+ if scalable_dimension:
+ policies = [
+ policy
+ for policy in policies
+ if policy.scalable_dimension in scalable_dimension
+ ]
+ starting_point = int(next_token) if next_token else 0
+ ending_point = starting_point + max_results
+ policies_page = policies[starting_point:ending_point]
+ new_next_token = str(ending_point) if ending_point < len(policies) else None
+ return new_next_token, policies_page
+
+ def delete_scaling_policy(
+ self, policy_name, service_namespace, resource_id, scalable_dimension
+ ):
+ policy_key = FakeApplicationAutoscalingPolicy.formulate_key(
+ service_namespace, resource_id, scalable_dimension, policy_name
+ )
+ if policy_key in self.policies:
+ del self.policies[policy_key]
+ return {}
+ else:
+ raise AWSValidationException(
+ "No scaling policy found for service namespace: {}, resource ID: {}, scalable dimension: {}, policy name: {}".format(
+ service_namespace, resource_id, scalable_dimension, policy_name
+ )
+ )
+
+ def delete_scheduled_action(
+ self, service_namespace, scheduled_action_name, resource_id, scalable_dimension
+ ):
+ self.scheduled_actions = [
+ a
+ for a in self.scheduled_actions
+ if not (
+ a.service_namespace == service_namespace
+ and a.scheduled_action_name == scheduled_action_name
+ and a.resource_id == resource_id
+ and a.scalable_dimension == scalable_dimension
+ )
+ ]
+
+ def describe_scheduled_actions(
+ self, scheduled_action_names, service_namespace, resource_id, scalable_dimension
+ ):
+ """
+ Pagination is not yet implemented
+ """
+ result = [
+ a
+ for a in self.scheduled_actions
+ if a.service_namespace == service_namespace
+ ]
+ if scheduled_action_names:
+ result = [
+ a for a in result if a.scheduled_action_name in scheduled_action_names
+ ]
+ if resource_id:
+ result = [a for a in result if a.resource_id == resource_id]
+ if scalable_dimension:
+ result = [a for a in result if a.scalable_dimension == scalable_dimension]
+ return result
+
+ def put_scheduled_action(
+ self,
+ service_namespace,
+ schedule,
+ timezone,
+ scheduled_action_name,
+ resource_id,
+ scalable_dimension,
+ start_time,
+ end_time,
+ scalable_target_action,
+ ):
+ existing_action = next(
+ (
+ a
+ for a in self.scheduled_actions
+ if a.service_namespace == service_namespace
+ and a.resource_id == resource_id
+ and a.scalable_dimension == scalable_dimension
+ ),
+ None,
+ )
+ if existing_action:
+ existing_action.update(
+ schedule,
+ timezone,
+ scheduled_action_name,
+ start_time,
+ end_time,
+ scalable_target_action,
+ )
+ else:
+ action = FakeScheduledAction(
+ service_namespace,
+ schedule,
+ timezone,
+ scheduled_action_name,
+ resource_id,
+ scalable_dimension,
+ start_time,
+ end_time,
+ scalable_target_action,
+ self.region_name,
+ )
+ self.scheduled_actions.append(action)
+
+
+def _target_params_are_valid(namespace, r_id, dimension):
+ """Check whether namespace, resource_id and dimension are valid and consistent with each other."""
+ is_valid = True
+ valid_namespaces = [n.value for n in ServiceNamespaceValueSet]
+ if namespace not in valid_namespaces:
+ is_valid = False
+ if dimension is not None:
+ try:
+ valid_dimensions = [d.value for d in ScalableDimensionValueSet]
+ resource_type_exceptions = [r.value for r in ResourceTypeExceptionValueSet]
+ d_namespace, d_resource_type, _ = dimension.split(":")
+ if d_resource_type not in resource_type_exceptions:
+ resource_type = _get_resource_type_from_resource_id(r_id)
+ else:
+ resource_type = d_resource_type
+ if (
+ dimension not in valid_dimensions
+ or d_namespace != namespace
+ or resource_type != d_resource_type
+ ):
+ is_valid = False
+ except ValueError:
+ is_valid = False
+ if not is_valid:
+ raise AWSValidationException(
+ "Unsupported service namespace, resource type or scalable dimension"
+ )
+ return is_valid
+
+
+def _get_resource_type_from_resource_id(resource_id):
+ # AWS Application Autoscaling resource_ids are multi-component (path-like) identifiers that vary in format,
+ # depending on the type of resource it identifies. resource_type is one of its components.
+ # resource_id format variations are described in
+ # https://docs.aws.amazon.com/autoscaling/application/APIReference/API_RegisterScalableTarget.html
+ # In a nutshell:
+ # - Most use slash separators, but some use colon separators.
+ # - The resource type is usually the first component of the resource_id...
+ # - ...except for sagemaker endpoints, dynamodb GSIs and keyspaces tables, where it's the third.
+ # - Comprehend uses an arn, with the resource type being the last element.
+
+ if resource_id.startswith("arn:aws:comprehend"):
+ resource_id = resource_id.split(":")[-1]
+ resource_split = (
+ resource_id.split("/") if "/" in resource_id else resource_id.split(":")
+ )
+ if (
+ resource_split[0] == "endpoint"
+ or (resource_split[0] == "table" and len(resource_split) > 2)
+ or (resource_split[0] == "keyspace")
+ ):
+ resource_type = resource_split[2]
+ else:
+ resource_type = resource_split[0]
+ return resource_type
+
+
+class FakeScalableTarget(BaseModel):
+ def __init__(
+ self, backend, service_namespace, resource_id, scalable_dimension, **kwargs
+ ):
+ self.applicationautoscaling_backend = backend
+ self.service_namespace = service_namespace
+ self.resource_id = resource_id
+ self.scalable_dimension = scalable_dimension
+ self.min_capacity = kwargs["min_capacity"]
+ self.max_capacity = kwargs["max_capacity"]
+ self.role_arn = kwargs["role_arn"]
+ self.suspended_state = kwargs["suspended_state"]
+ self.creation_time = time.time()
+
+ def update(self, **kwargs):
+ if kwargs["min_capacity"] is not None:
+ self.min_capacity = kwargs["min_capacity"]
+ if kwargs["max_capacity"] is not None:
+ self.max_capacity = kwargs["max_capacity"]
+ if kwargs["suspended_state"] is not None:
+ self.suspended_state = kwargs["suspended_state"]
+
+
+class FakeApplicationAutoscalingPolicy(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ policy_name,
+ service_namespace,
+ resource_id,
+ scalable_dimension,
+ policy_type,
+ policy_body,
+ ):
+ self.step_scaling_policy_configuration = None
+ self.target_tracking_scaling_policy_configuration = None
+
+ if policy_type == "StepScaling":
+ self.step_scaling_policy_configuration = policy_body
+ self.target_tracking_scaling_policy_configuration = None
+ elif policy_type == "TargetTrackingScaling":
+ self.step_scaling_policy_configuration = None
+ self.target_tracking_scaling_policy_configuration = policy_body
+ else:
+ raise AWSValidationException(
+ "Unknown policy type {} specified.".format(policy_type)
+ )
+
+ self._policy_body = policy_body
+ self.service_namespace = service_namespace
+ self.resource_id = resource_id
+ self.scalable_dimension = scalable_dimension
+ self.policy_name = policy_name
+ self.policy_type = policy_type
+ self._guid = uuid.uuid4()
+ self.policy_arn = "arn:aws:autoscaling:{}:scalingPolicy:{}:resource/{}/{}:policyName/{}".format(
+ region_name,
+ self._guid,
+ self.service_namespace,
+ self.resource_id,
+ self.policy_name,
+ )
+ self.creation_time = time.time()
+
+ @staticmethod
+ def formulate_key(service_namespace, resource_id, scalable_dimension, policy_name):
+ return "{}\t{}\t{}\t{}".format(
+ service_namespace, resource_id, scalable_dimension, policy_name
+ )
+
+
+class FakeScheduledAction(BaseModel):
+ def __init__(
+ self,
+ service_namespace,
+ schedule,
+ timezone,
+ scheduled_action_name,
+ resource_id,
+ scalable_dimension,
+ start_time,
+ end_time,
+ scalable_target_action,
+ region,
+ ):
+ self.arn = f"arn:aws:autoscaling:{region}:{get_account_id()}:scheduledAction:{service_namespace}:scheduledActionName/{scheduled_action_name}"
+ self.service_namespace = service_namespace
+ self.schedule = schedule
+ self.timezone = timezone
+ self.scheduled_action_name = scheduled_action_name
+ self.resource_id = resource_id
+ self.scalable_dimension = scalable_dimension
+ self.start_time = start_time
+ self.end_time = end_time
+ self.scalable_target_action = scalable_target_action
+ self.creation_time = time.time()
+
+ def update(
+ self,
+ schedule,
+ timezone,
+ scheduled_action_name,
+ start_time,
+ end_time,
+ scalable_target_action,
+ ):
+ if scheduled_action_name:
+ self.scheduled_action_name = scheduled_action_name
+ if schedule:
+ self.schedule = schedule
+ if timezone:
+ self.timezone = timezone
+ if scalable_target_action:
+ self.scalable_target_action = scalable_target_action
+ self.start_time = start_time
+ self.end_time = end_time
+
+
+applicationautoscaling_backends = BackendDict(ApplicationAutoscalingBackend, "ec2")
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/responses.py b/contrib/python/moto/py3/moto/applicationautoscaling/responses.py
new file mode 100644
index 0000000000..f255206470
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/responses.py
@@ -0,0 +1,234 @@
+from moto.core.responses import BaseResponse
+import json
+from .models import (
+ applicationautoscaling_backends,
+ ScalableDimensionValueSet,
+ ServiceNamespaceValueSet,
+)
+from .exceptions import AWSValidationException
+
+
+class ApplicationAutoScalingResponse(BaseResponse):
+ @property
+ def applicationautoscaling_backend(self):
+ return applicationautoscaling_backends[self.region]
+
+ def describe_scalable_targets(self):
+ self._validate_params()
+ service_namespace = self._get_param("ServiceNamespace")
+ resource_ids = self._get_param("ResourceIds")
+ scalable_dimension = self._get_param("ScalableDimension")
+ max_results = self._get_int_param("MaxResults", 50)
+ marker = self._get_param("NextToken")
+ all_scalable_targets = (
+ self.applicationautoscaling_backend.describe_scalable_targets(
+ service_namespace, resource_ids, scalable_dimension
+ )
+ )
+ start = int(marker) + 1 if marker else 0
+ next_token = None
+ scalable_targets_resp = all_scalable_targets[start : start + max_results]
+ if len(all_scalable_targets) > start + max_results:
+ next_token = str(len(scalable_targets_resp) - 1)
+ targets = [_build_target(t) for t in scalable_targets_resp]
+ return json.dumps({"ScalableTargets": targets, "NextToken": next_token})
+
+ def register_scalable_target(self):
+ """Registers or updates a scalable target."""
+ self._validate_params()
+ self.applicationautoscaling_backend.register_scalable_target(
+ self._get_param("ServiceNamespace"),
+ self._get_param("ResourceId"),
+ self._get_param("ScalableDimension"),
+ min_capacity=self._get_int_param("MinCapacity"),
+ max_capacity=self._get_int_param("MaxCapacity"),
+ role_arn=self._get_param("RoleARN"),
+ suspended_state=self._get_param("SuspendedState"),
+ )
+ return json.dumps({})
+
+ def deregister_scalable_target(self):
+ """Deregisters a scalable target."""
+ self._validate_params()
+ self.applicationautoscaling_backend.deregister_scalable_target(
+ self._get_param("ServiceNamespace"),
+ self._get_param("ResourceId"),
+ self._get_param("ScalableDimension"),
+ )
+ return json.dumps({})
+
+ def put_scaling_policy(self):
+ policy = self.applicationautoscaling_backend.put_scaling_policy(
+ policy_name=self._get_param("PolicyName"),
+ service_namespace=self._get_param("ServiceNamespace"),
+ resource_id=self._get_param("ResourceId"),
+ scalable_dimension=self._get_param("ScalableDimension"),
+ policy_type=self._get_param("PolicyType"),
+ policy_body=self._get_param(
+ "StepScalingPolicyConfiguration",
+ self._get_param("TargetTrackingScalingPolicyConfiguration"),
+ ),
+ )
+ return json.dumps({"PolicyARN": policy.policy_arn, "Alarms": []}) # ToDo
+
+ def describe_scaling_policies(self):
+ (
+ next_token,
+ policy_page,
+ ) = self.applicationautoscaling_backend.describe_scaling_policies(
+ service_namespace=self._get_param("ServiceNamespace"),
+ resource_id=self._get_param("ResourceId"),
+ scalable_dimension=self._get_param("ScalableDimension"),
+ max_results=self._get_param("MaxResults"),
+ next_token=self._get_param("NextToken"),
+ )
+ response_obj = {"ScalingPolicies": [_build_policy(p) for p in policy_page]}
+ if next_token:
+ response_obj["NextToken"] = next_token
+ return json.dumps(response_obj)
+
+ def delete_scaling_policy(self):
+ self.applicationautoscaling_backend.delete_scaling_policy(
+ policy_name=self._get_param("PolicyName"),
+ service_namespace=self._get_param("ServiceNamespace"),
+ resource_id=self._get_param("ResourceId"),
+ scalable_dimension=self._get_param("ScalableDimension"),
+ )
+ return json.dumps({})
+
+ def _validate_params(self):
+ """Validate parameters.
+ TODO Integrate this validation with the validation in models.py
+ """
+ namespace = self._get_param("ServiceNamespace")
+ dimension = self._get_param("ScalableDimension")
+ messages = []
+ dimensions = [d.value for d in ScalableDimensionValueSet]
+ message = None
+ if dimension is not None and dimension not in dimensions:
+ messages.append(
+ "Value '{}' at 'scalableDimension' "
+ "failed to satisfy constraint: Member must satisfy enum value set: "
+ "{}".format(dimension, dimensions)
+ )
+ namespaces = [n.value for n in ServiceNamespaceValueSet]
+ if namespace is not None and namespace not in namespaces:
+ messages.append(
+ "Value '{}' at 'serviceNamespace' "
+ "failed to satisfy constraint: Member must satisfy enum value set: "
+ "{}".format(namespace, namespaces)
+ )
+ if len(messages) == 1:
+ message = "1 validation error detected: {}".format(messages[0])
+ elif len(messages) > 1:
+ message = "{} validation errors detected: {}".format(
+ len(messages), "; ".join(messages)
+ )
+ if message:
+ raise AWSValidationException(message)
+
+ def delete_scheduled_action(self):
+ params = json.loads(self.body)
+ service_namespace = params.get("ServiceNamespace")
+ scheduled_action_name = params.get("ScheduledActionName")
+ resource_id = params.get("ResourceId")
+ scalable_dimension = params.get("ScalableDimension")
+ self.applicationautoscaling_backend.delete_scheduled_action(
+ service_namespace=service_namespace,
+ scheduled_action_name=scheduled_action_name,
+ resource_id=resource_id,
+ scalable_dimension=scalable_dimension,
+ )
+ return json.dumps(dict())
+
+ def put_scheduled_action(self):
+ params = json.loads(self.body)
+ service_namespace = params.get("ServiceNamespace")
+ schedule = params.get("Schedule")
+ timezone = params.get("Timezone")
+ scheduled_action_name = params.get("ScheduledActionName")
+ resource_id = params.get("ResourceId")
+ scalable_dimension = params.get("ScalableDimension")
+ start_time = params.get("StartTime")
+ end_time = params.get("EndTime")
+ scalable_target_action = params.get("ScalableTargetAction")
+ self.applicationautoscaling_backend.put_scheduled_action(
+ service_namespace=service_namespace,
+ schedule=schedule,
+ timezone=timezone,
+ scheduled_action_name=scheduled_action_name,
+ resource_id=resource_id,
+ scalable_dimension=scalable_dimension,
+ start_time=start_time,
+ end_time=end_time,
+ scalable_target_action=scalable_target_action,
+ )
+ return json.dumps(dict())
+
+ def describe_scheduled_actions(self):
+ params = json.loads(self.body)
+ scheduled_action_names = params.get("ScheduledActionNames")
+ service_namespace = params.get("ServiceNamespace")
+ resource_id = params.get("ResourceId")
+ scalable_dimension = params.get("ScalableDimension")
+ scheduled_actions = (
+ self.applicationautoscaling_backend.describe_scheduled_actions(
+ scheduled_action_names=scheduled_action_names,
+ service_namespace=service_namespace,
+ resource_id=resource_id,
+ scalable_dimension=scalable_dimension,
+ )
+ )
+ response_obj = {
+ "ScheduledActions": [_build_scheduled_action(a) for a in scheduled_actions]
+ }
+ return json.dumps(response_obj)
+
+
+def _build_target(t):
+ return {
+ "CreationTime": t.creation_time,
+ "ServiceNamespace": t.service_namespace,
+ "ResourceId": t.resource_id,
+ "RoleARN": t.role_arn,
+ "ScalableDimension": t.scalable_dimension,
+ "MaxCapacity": t.max_capacity,
+ "MinCapacity": t.min_capacity,
+ "SuspendedState": t.suspended_state,
+ }
+
+
+def _build_policy(p):
+ response = {
+ "PolicyARN": p.policy_arn,
+ "PolicyName": p.policy_name,
+ "ServiceNamespace": p.service_namespace,
+ "ResourceId": p.resource_id,
+ "ScalableDimension": p.scalable_dimension,
+ "PolicyType": p.policy_type,
+ "CreationTime": p.creation_time,
+ }
+ if p.policy_type == "StepScaling":
+ response["StepScalingPolicyConfiguration"] = p.step_scaling_policy_configuration
+ elif p.policy_type == "TargetTrackingScaling":
+ response[
+ "TargetTrackingScalingPolicyConfiguration"
+ ] = p.target_tracking_scaling_policy_configuration
+ return response
+
+
+def _build_scheduled_action(a):
+ response = {
+ "ScheduledActionName": a.scheduled_action_name,
+ "ScheduledActionARN": a.arn,
+ "ServiceNamespace": a.service_namespace,
+ "Schedule": a.schedule,
+ "Timezone": a.timezone,
+ "ResourceId": a.resource_id,
+ "ScalableDimension": a.scalable_dimension,
+ "StartTime": a.start_time,
+ "EndTime": a.end_time,
+ "CreationTime": a.creation_time,
+ "ScalableTargetAction": a.scalable_target_action,
+ }
+ return response
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/urls.py b/contrib/python/moto/py3/moto/applicationautoscaling/urls.py
new file mode 100644
index 0000000000..632a0cd71e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/urls.py
@@ -0,0 +1,7 @@
+from .responses import ApplicationAutoScalingResponse
+
+url_bases = [r"https?://application-autoscaling\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/$": ApplicationAutoScalingResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/applicationautoscaling/utils.py b/contrib/python/moto/py3/moto/applicationautoscaling/utils.py
new file mode 100644
index 0000000000..7a6a130e1c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/applicationautoscaling/utils.py
@@ -0,0 +1,10 @@
+from urllib.parse import urlparse
+
+
+def region_from_applicationautoscaling_url(url):
+ domain = urlparse(url).netloc
+
+ if "." in domain:
+ return domain.split(".")[1]
+ else:
+ return "us-east-1"
diff --git a/contrib/python/moto/py3/moto/appsync/__init__.py b/contrib/python/moto/py3/moto/appsync/__init__.py
new file mode 100644
index 0000000000..9fa4247713
--- /dev/null
+++ b/contrib/python/moto/py3/moto/appsync/__init__.py
@@ -0,0 +1,5 @@
+"""appsync module initialization; sets value for base decorator."""
+from .models import appsync_backends
+from ..core.models import base_decorator
+
+mock_appsync = base_decorator(appsync_backends)
diff --git a/contrib/python/moto/py3/moto/appsync/exceptions.py b/contrib/python/moto/py3/moto/appsync/exceptions.py
new file mode 100644
index 0000000000..70ebe810e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/appsync/exceptions.py
@@ -0,0 +1,14 @@
+import json
+from moto.core.exceptions import JsonRESTError
+
+
+class AppSyncExceptions(JsonRESTError):
+ pass
+
+
+class GraphqlAPINotFound(AppSyncExceptions):
+ code = 404
+
+ def __init__(self, api_id):
+ super().__init__("NotFoundException", f"GraphQL API {api_id} not found.")
+ self.description = json.dumps({"message": self.message})
diff --git a/contrib/python/moto/py3/moto/appsync/models.py b/contrib/python/moto/py3/moto/appsync/models.py
new file mode 100644
index 0000000000..7a21b60e5e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/appsync/models.py
@@ -0,0 +1,305 @@
+import base64
+from datetime import timedelta, datetime, timezone
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from moto.utilities.tagging_service import TaggingService
+
+from uuid import uuid4
+
+from .exceptions import GraphqlAPINotFound
+
+
+class GraphqlSchema(BaseModel):
+ def __init__(self, definition):
+ self.definition = definition
+ # [graphql.language.ast.ObjectTypeDefinitionNode, ..]
+ self.types = []
+
+ self.status = "PROCESSING"
+ self.parse_error = None
+ self._parse_graphql_definition()
+
+ def get_type(self, name):
+ for graphql_type in self.types:
+ if graphql_type.name.value == name:
+ return {
+ "name": name,
+ "description": graphql_type.description.value
+ if graphql_type.description
+ else None,
+ "arn": f"arn:aws:appsync:graphql_type/{name}",
+ "definition": "NotYetImplemented",
+ }
+
+ def get_status(self):
+ return self.status, self.parse_error
+
+ def _parse_graphql_definition(self):
+ try:
+ from graphql import parse
+ from graphql.language.ast import ObjectTypeDefinitionNode
+ from graphql.error.graphql_error import GraphQLError
+
+ res = parse(self.definition)
+ for definition in res.definitions:
+ if isinstance(definition, ObjectTypeDefinitionNode):
+ self.types.append(definition)
+ self.status = "SUCCESS"
+ except GraphQLError as e:
+ self.status = "FAILED"
+ self.parse_error = str(e)
+
+
+class GraphqlAPI(BaseModel):
+ def __init__(
+ self,
+ region,
+ name,
+ authentication_type,
+ additional_authentication_providers,
+ log_config,
+ xray_enabled,
+ user_pool_config,
+ open_id_connect_config,
+ lambda_authorizer_config,
+ ):
+ self.region = region
+ self.name = name
+ self.api_id = str(uuid4())
+ self.authentication_type = authentication_type
+ self.additional_authentication_providers = additional_authentication_providers
+ self.lambda_authorizer_config = lambda_authorizer_config
+ self.log_config = log_config
+ self.open_id_connect_config = open_id_connect_config
+ self.user_pool_config = user_pool_config
+ self.xray_enabled = xray_enabled
+
+ self.arn = (
+ f"arn:aws:appsync:{self.region}:{get_account_id()}:apis/{self.api_id}"
+ )
+ self.graphql_schema = None
+
+ self.api_keys = dict()
+
+ def update(
+ self,
+ name,
+ additional_authentication_providers,
+ authentication_type,
+ lambda_authorizer_config,
+ log_config,
+ open_id_connect_config,
+ user_pool_config,
+ xray_enabled,
+ ):
+ if name:
+ self.name = name
+ if additional_authentication_providers:
+ self.additional_authentication_providers = (
+ additional_authentication_providers
+ )
+ if authentication_type:
+ self.authentication_type = authentication_type
+ if lambda_authorizer_config:
+ self.lambda_authorizer_config = lambda_authorizer_config
+ if log_config:
+ self.log_config = log_config
+ if open_id_connect_config:
+ self.open_id_connect_config = open_id_connect_config
+ if user_pool_config:
+ self.user_pool_config = user_pool_config
+ if xray_enabled is not None:
+ self.xray_enabled = xray_enabled
+
+ def create_api_key(self, description, expires):
+ api_key = GraphqlAPIKey(description, expires)
+ self.api_keys[api_key.key_id] = api_key
+ return api_key
+
+ def list_api_keys(self):
+ return self.api_keys.values()
+
+ def delete_api_key(self, api_key_id):
+ self.api_keys.pop(api_key_id)
+
+ def update_api_key(self, api_key_id, description, expires):
+ api_key = self.api_keys[api_key_id]
+ api_key.update(description, expires)
+ return api_key
+
+ def start_schema_creation(self, definition):
+ graphql_definition = base64.b64decode(definition).decode("utf-8")
+
+ self.graphql_schema = GraphqlSchema(graphql_definition)
+
+ def get_schema_status(self):
+ return self.graphql_schema.get_status()
+
+ def get_type(self, type_name, type_format):
+ graphql_type = self.graphql_schema.get_type(type_name)
+ graphql_type["format"] = type_format
+ return graphql_type
+
+ def to_json(self):
+ return {
+ "name": self.name,
+ "apiId": self.api_id,
+ "authenticationType": self.authentication_type,
+ "arn": self.arn,
+ "uris": {"GRAPHQL": "http://graphql.uri"},
+ "additionalAuthenticationProviders": self.additional_authentication_providers,
+ "lambdaAuthorizerConfig": self.lambda_authorizer_config,
+ "logConfig": self.log_config,
+ "openIDConnectConfig": self.open_id_connect_config,
+ "userPoolConfig": self.user_pool_config,
+ "xrayEnabled": self.xray_enabled,
+ }
+
+
+class GraphqlAPIKey(BaseModel):
+ def __init__(self, description, expires):
+ self.key_id = str(uuid4())[0:6]
+ self.description = description
+ self.expires = expires
+ if not self.expires:
+ default_expiry = datetime.now(timezone.utc)
+ default_expiry = default_expiry.replace(
+ minute=0, second=0, microsecond=0, tzinfo=None
+ )
+ default_expiry = default_expiry + timedelta(days=7)
+ self.expires = unix_time(default_expiry)
+
+ def update(self, description, expires):
+ if description:
+ self.description = description
+ if expires:
+ self.expires = expires
+
+ def to_json(self):
+ return {
+ "id": self.key_id,
+ "description": self.description,
+ "expires": self.expires,
+ "deletes": self.expires,
+ }
+
+
+class AppSyncBackend(BaseBackend):
+ """Implementation of AppSync APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.graphql_apis = dict()
+ self.tagger = TaggingService()
+
+ def create_graphql_api(
+ self,
+ name,
+ log_config,
+ authentication_type,
+ user_pool_config,
+ open_id_connect_config,
+ additional_authentication_providers,
+ xray_enabled,
+ lambda_authorizer_config,
+ tags,
+ ):
+ graphql_api = GraphqlAPI(
+ region=self.region_name,
+ name=name,
+ authentication_type=authentication_type,
+ additional_authentication_providers=additional_authentication_providers,
+ log_config=log_config,
+ xray_enabled=xray_enabled,
+ user_pool_config=user_pool_config,
+ open_id_connect_config=open_id_connect_config,
+ lambda_authorizer_config=lambda_authorizer_config,
+ )
+ self.graphql_apis[graphql_api.api_id] = graphql_api
+ self.tagger.tag_resource(
+ graphql_api.arn, TaggingService.convert_dict_to_tags_input(tags)
+ )
+ return graphql_api
+
+ def update_graphql_api(
+ self,
+ api_id,
+ name,
+ log_config,
+ authentication_type,
+ user_pool_config,
+ open_id_connect_config,
+ additional_authentication_providers,
+ xray_enabled,
+ lambda_authorizer_config,
+ ):
+ graphql_api = self.graphql_apis[api_id]
+ graphql_api.update(
+ name,
+ additional_authentication_providers,
+ authentication_type,
+ lambda_authorizer_config,
+ log_config,
+ open_id_connect_config,
+ user_pool_config,
+ xray_enabled,
+ )
+ return graphql_api
+
+ def get_graphql_api(self, api_id):
+ if api_id not in self.graphql_apis:
+ raise GraphqlAPINotFound(api_id)
+ return self.graphql_apis[api_id]
+
+ def delete_graphql_api(self, api_id):
+ self.graphql_apis.pop(api_id)
+
+ def list_graphql_apis(self):
+ """
+ Pagination or the maxResults-parameter have not yet been implemented.
+ """
+ return self.graphql_apis.values()
+
+ def create_api_key(self, api_id, description, expires):
+ return self.graphql_apis[api_id].create_api_key(description, expires)
+
+ def delete_api_key(self, api_id, api_key_id):
+ self.graphql_apis[api_id].delete_api_key(api_key_id)
+
+ def list_api_keys(self, api_id):
+ """
+ Pagination or the maxResults-parameter have not yet been implemented.
+ """
+ if api_id in self.graphql_apis:
+ return self.graphql_apis[api_id].list_api_keys()
+ else:
+ return []
+
+ def update_api_key(self, api_id, api_key_id, description, expires):
+ return self.graphql_apis[api_id].update_api_key(
+ api_key_id, description, expires
+ )
+
+ def start_schema_creation(self, api_id, definition):
+ self.graphql_apis[api_id].start_schema_creation(definition)
+ return "PROCESSING"
+
+ def get_schema_creation_status(self, api_id):
+ return self.graphql_apis[api_id].get_schema_status()
+
+ def tag_resource(self, resource_arn, tags):
+ self.tagger.tag_resource(
+ resource_arn, TaggingService.convert_dict_to_tags_input(tags)
+ )
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+ def list_tags_for_resource(self, resource_arn):
+ return self.tagger.get_tag_dict_for_resource(resource_arn)
+
+ def get_type(self, api_id, type_name, type_format):
+ return self.graphql_apis[api_id].get_type(type_name, type_format)
+
+
+appsync_backends = BackendDict(AppSyncBackend, "appsync")
diff --git a/contrib/python/moto/py3/moto/appsync/responses.py b/contrib/python/moto/py3/moto/appsync/responses.py
new file mode 100644
index 0000000000..c9ae5f216b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/appsync/responses.py
@@ -0,0 +1,230 @@
+"""Handles incoming appsync requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from urllib.parse import unquote
+from .models import appsync_backends
+
+
+class AppSyncResponse(BaseResponse):
+ """Handler for AppSync requests and responses."""
+
+ @property
+ def appsync_backend(self):
+ """Return backend instance specific for this region."""
+ return appsync_backends[self.region]
+
+ def graph_ql(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_graphql_api()
+ if request.method == "GET":
+ return self.list_graphql_apis()
+
+ def graph_ql_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_graphql_api()
+ if request.method == "DELETE":
+ return self.delete_graphql_api()
+ if request.method == "POST":
+ return self.update_graphql_api()
+
+ def api_key(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_api_key()
+ if request.method == "GET":
+ return self.list_api_keys()
+
+ def schemacreation(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.start_schema_creation()
+ if request.method == "GET":
+ return self.get_schema_creation_status()
+
+ def api_key_individual(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self.delete_api_key()
+ if request.method == "POST":
+ return self.update_api_key()
+
+ def tags(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.tag_resource()
+ if request.method == "DELETE":
+ return self.untag_resource()
+ if request.method == "GET":
+ return self.list_tags_for_resource()
+
+ def types(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_type()
+
+ def create_graphql_api(self):
+ params = json.loads(self.body)
+ name = params.get("name")
+ log_config = params.get("logConfig")
+ authentication_type = params.get("authenticationType")
+ user_pool_config = params.get("userPoolConfig")
+ open_id_connect_config = params.get("openIDConnectConfig")
+ tags = params.get("tags")
+ additional_authentication_providers = params.get(
+ "additionalAuthenticationProviders"
+ )
+ xray_enabled = params.get("xrayEnabled", False)
+ lambda_authorizer_config = params.get("lambdaAuthorizerConfig")
+ graphql_api = self.appsync_backend.create_graphql_api(
+ name=name,
+ log_config=log_config,
+ authentication_type=authentication_type,
+ user_pool_config=user_pool_config,
+ open_id_connect_config=open_id_connect_config,
+ additional_authentication_providers=additional_authentication_providers,
+ xray_enabled=xray_enabled,
+ lambda_authorizer_config=lambda_authorizer_config,
+ tags=tags,
+ )
+ response = graphql_api.to_json()
+ response["tags"] = self.appsync_backend.list_tags_for_resource(graphql_api.arn)
+ return 200, {}, json.dumps(dict(graphqlApi=response))
+
+ def get_graphql_api(self):
+ api_id = self.path.split("/")[-1]
+
+ graphql_api = self.appsync_backend.get_graphql_api(api_id=api_id)
+ response = graphql_api.to_json()
+ response["tags"] = self.appsync_backend.list_tags_for_resource(graphql_api.arn)
+ return 200, {}, json.dumps(dict(graphqlApi=response))
+
+ def delete_graphql_api(self):
+ api_id = self.path.split("/")[-1]
+ self.appsync_backend.delete_graphql_api(api_id=api_id)
+ return 200, {}, json.dumps(dict())
+
+ def update_graphql_api(self):
+ api_id = self.path.split("/")[-1]
+
+ params = json.loads(self.body)
+ name = params.get("name")
+ log_config = params.get("logConfig")
+ authentication_type = params.get("authenticationType")
+ user_pool_config = params.get("userPoolConfig")
+ print(user_pool_config)
+ open_id_connect_config = params.get("openIDConnectConfig")
+ additional_authentication_providers = params.get(
+ "additionalAuthenticationProviders"
+ )
+ xray_enabled = params.get("xrayEnabled", False)
+ lambda_authorizer_config = params.get("lambdaAuthorizerConfig")
+
+ api = self.appsync_backend.update_graphql_api(
+ api_id=api_id,
+ name=name,
+ log_config=log_config,
+ authentication_type=authentication_type,
+ user_pool_config=user_pool_config,
+ open_id_connect_config=open_id_connect_config,
+ additional_authentication_providers=additional_authentication_providers,
+ xray_enabled=xray_enabled,
+ lambda_authorizer_config=lambda_authorizer_config,
+ )
+ return 200, {}, json.dumps(dict(graphqlApi=api.to_json()))
+
+ def list_graphql_apis(self):
+ graphql_apis = self.appsync_backend.list_graphql_apis()
+ return (
+ 200,
+ {},
+ json.dumps(dict(graphqlApis=[api.to_json() for api in graphql_apis])),
+ )
+
+ def create_api_key(self):
+ params = json.loads(self.body)
+ # /v1/apis/[api_id]/apikeys
+ api_id = self.path.split("/")[-2]
+ description = params.get("description")
+ expires = params.get("expires")
+ api_key = self.appsync_backend.create_api_key(
+ api_id=api_id, description=description, expires=expires
+ )
+ print(api_key.to_json())
+ return 200, {}, json.dumps(dict(apiKey=api_key.to_json()))
+
+ def delete_api_key(self):
+ api_id = self.path.split("/")[-3]
+ api_key_id = self.path.split("/")[-1]
+ self.appsync_backend.delete_api_key(api_id=api_id, api_key_id=api_key_id)
+ return 200, {}, json.dumps(dict())
+
+ def list_api_keys(self):
+ # /v1/apis/[api_id]/apikeys
+ api_id = self.path.split("/")[-2]
+ api_keys = self.appsync_backend.list_api_keys(api_id=api_id)
+ return 200, {}, json.dumps(dict(apiKeys=[key.to_json() for key in api_keys]))
+
+ def update_api_key(self):
+ api_id = self.path.split("/")[-3]
+ api_key_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ description = params.get("description")
+ expires = params.get("expires")
+ api_key = self.appsync_backend.update_api_key(
+ api_id=api_id,
+ api_key_id=api_key_id,
+ description=description,
+ expires=expires,
+ )
+ return 200, {}, json.dumps(dict(apiKey=api_key.to_json()))
+
+ def start_schema_creation(self):
+ params = json.loads(self.body)
+ api_id = self.path.split("/")[-2]
+ definition = params.get("definition")
+ status = self.appsync_backend.start_schema_creation(
+ api_id=api_id, definition=definition
+ )
+ return 200, {}, json.dumps({"status": status})
+
+ def get_schema_creation_status(self):
+ api_id = self.path.split("/")[-2]
+ status, details = self.appsync_backend.get_schema_creation_status(api_id=api_id)
+ return 200, {}, json.dumps(dict(status=status, details=details))
+
+ def tag_resource(self):
+ resource_arn = self._extract_arn_from_path()
+ params = json.loads(self.body)
+ tags = params.get("tags")
+ self.appsync_backend.tag_resource(resource_arn=resource_arn, tags=tags)
+ return 200, {}, json.dumps(dict())
+
+ def untag_resource(self):
+ resource_arn = self._extract_arn_from_path()
+ tag_keys = self.querystring.get("tagKeys", [])
+ self.appsync_backend.untag_resource(
+ resource_arn=resource_arn, tag_keys=tag_keys
+ )
+ return 200, {}, json.dumps(dict())
+
+ def list_tags_for_resource(self):
+ resource_arn = self._extract_arn_from_path()
+ tags = self.appsync_backend.list_tags_for_resource(resource_arn=resource_arn)
+ return 200, {}, json.dumps(dict(tags=tags))
+
+ def _extract_arn_from_path(self):
+ # /v1/tags/arn_that_may_contain_a_slash
+ path = unquote(self.path)
+ return "/".join(path.split("/")[3:])
+
+ def get_type(self):
+ api_id = unquote(self.path.split("/")[-3])
+ type_name = self.path.split("/")[-1]
+ type_format = self.querystring.get("format")[0]
+ graphql_type = self.appsync_backend.get_type(
+ api_id=api_id, type_name=type_name, type_format=type_format
+ )
+ return 200, {}, json.dumps(dict(type=graphql_type))
diff --git a/contrib/python/moto/py3/moto/appsync/urls.py b/contrib/python/moto/py3/moto/appsync/urls.py
new file mode 100644
index 0000000000..e165c79447
--- /dev/null
+++ b/contrib/python/moto/py3/moto/appsync/urls.py
@@ -0,0 +1,20 @@
+"""appsync base URL and path."""
+from .responses import AppSyncResponse
+
+url_bases = [
+ r"https?://appsync\.(.+)\.amazonaws\.com",
+]
+
+
+response = AppSyncResponse()
+
+
+url_paths = {
+ "{0}/v1/apis$": response.graph_ql,
+ "{0}/v1/apis/(?P<api_id>[^/]+)$": response.graph_ql_individual,
+ "{0}/v1/apis/(?P<api_id>[^/]+)/apikeys$": response.api_key,
+ "{0}/v1/apis/(?P<api_id>[^/]+)/apikeys/(?P<api_key_id>[^/]+)$": response.api_key_individual,
+ "{0}/v1/apis/(?P<api_id>[^/]+)/schemacreation$": response.schemacreation,
+ "{0}/v1/tags/(?P<resource_arn>.+)$": response.tags,
+ "{0}/v1/apis/(?P<api_id>[^/]+)/types/(?P<type_name>.+)$": response.types,
+}
diff --git a/contrib/python/moto/py3/moto/athena/__init__.py b/contrib/python/moto/py3/moto/athena/__init__.py
new file mode 100644
index 0000000000..0e5ca26282
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/__init__.py
@@ -0,0 +1,5 @@
+from .models import athena_backends
+from ..core.models import base_decorator
+
+athena_backend = athena_backends["us-east-1"]
+mock_athena = base_decorator(athena_backends)
diff --git a/contrib/python/moto/py3/moto/athena/exceptions.py b/contrib/python/moto/py3/moto/athena/exceptions.py
new file mode 100644
index 0000000000..6beeb64798
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/exceptions.py
@@ -0,0 +1,17 @@
+import json
+from werkzeug.exceptions import BadRequest
+
+
+class AthenaClientError(BadRequest):
+ def __init__(self, code, message):
+ super().__init__()
+ self.description = json.dumps(
+ {
+ "Error": {
+ "Code": code,
+ "Message": message,
+ "Type": "InvalidRequestException",
+ },
+ "RequestId": "6876f774-7273-11e4-85dc-39e55ca848d1",
+ }
+ )
diff --git a/contrib/python/moto/py3/moto/athena/models.py b/contrib/python/moto/py3/moto/athena/models.py
new file mode 100644
index 0000000000..b3aef3f3c4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/models.py
@@ -0,0 +1,187 @@
+import time
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import BackendDict
+
+from uuid import uuid4
+
+
+class TaggableResourceMixin(object):
+ # This mixing was copied from Redshift when initially implementing
+ # Athena. TBD if it's worth the overhead.
+
+ def __init__(self, region_name, resource_name, tags):
+ self.region = region_name
+ self.resource_name = resource_name
+ self.tags = tags or []
+
+ @property
+ def arn(self):
+ return "arn:aws:athena:{region}:{account_id}:{resource_name}".format(
+ region=self.region,
+ account_id=get_account_id(),
+ resource_name=self.resource_name,
+ )
+
+ def create_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def delete_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+ return self.tags
+
+
+class WorkGroup(TaggableResourceMixin, BaseModel):
+
+ resource_type = "workgroup"
+ state = "ENABLED"
+
+ def __init__(self, athena_backend, name, configuration, description, tags):
+ self.region_name = athena_backend.region_name
+ super().__init__(self.region_name, "workgroup/{}".format(name), tags)
+ self.athena_backend = athena_backend
+ self.name = name
+ self.description = description
+ self.configuration = configuration
+
+
+class DataCatalog(TaggableResourceMixin, BaseModel):
+ def __init__(
+ self, athena_backend, name, catalog_type, description, parameters, tags
+ ):
+ self.region_name = athena_backend.region_name
+ super().__init__(self.region_name, "datacatalog/{}".format(name), tags)
+ self.athena_backend = athena_backend
+ self.name = name
+ self.type = catalog_type
+ self.description = description
+ self.parameters = parameters
+
+
+class Execution(BaseModel):
+ def __init__(self, query, context, config, workgroup):
+ self.id = str(uuid4())
+ self.query = query
+ self.context = context
+ self.config = config
+ self.workgroup = workgroup
+ self.start_time = time.time()
+ self.status = "QUEUED"
+
+
+class NamedQuery(BaseModel):
+ def __init__(self, name, description, database, query_string, workgroup):
+ self.id = str(uuid4())
+ self.name = name
+ self.description = description
+ self.database = database
+ self.query_string = query_string
+ self.workgroup = workgroup
+
+
+class AthenaBackend(BaseBackend):
+ region_name = None
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.work_groups = {}
+ self.executions = {}
+ self.named_queries = {}
+ self.data_catalogs = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "athena"
+ )
+
+ def create_work_group(self, name, configuration, description, tags):
+ if name in self.work_groups:
+ return None
+ work_group = WorkGroup(self, name, configuration, description, tags)
+ self.work_groups[name] = work_group
+ return work_group
+
+ def list_work_groups(self):
+ return [
+ {
+ "Name": wg.name,
+ "State": wg.state,
+ "Description": wg.description,
+ "CreationTime": time.time(),
+ }
+ for wg in self.work_groups.values()
+ ]
+
+ def get_work_group(self, name):
+ if name not in self.work_groups:
+ return None
+ wg = self.work_groups[name]
+ return {
+ "Name": wg.name,
+ "State": wg.state,
+ "Configuration": wg.configuration,
+ "Description": wg.description,
+ "CreationTime": time.time(),
+ }
+
+ def start_query_execution(self, query, context, config, workgroup):
+ execution = Execution(
+ query=query, context=context, config=config, workgroup=workgroup
+ )
+ self.executions[execution.id] = execution
+ return execution.id
+
+ def get_execution(self, exec_id):
+ return self.executions[exec_id]
+
+ def stop_query_execution(self, exec_id):
+ execution = self.executions[exec_id]
+ execution.status = "CANCELLED"
+
+ def create_named_query(self, name, description, database, query_string, workgroup):
+ nq = NamedQuery(
+ name=name,
+ description=description,
+ database=database,
+ query_string=query_string,
+ workgroup=workgroup,
+ )
+ self.named_queries[nq.id] = nq
+ return nq.id
+
+ def get_named_query(self, query_id):
+ return self.named_queries[query_id] if query_id in self.named_queries else None
+
+ def list_data_catalogs(self):
+ return [
+ {"CatalogName": dc.name, "Type": dc.type}
+ for dc in self.data_catalogs.values()
+ ]
+
+ def get_data_catalog(self, name):
+ if name not in self.data_catalogs:
+ return None
+ dc = self.data_catalogs[name]
+ return {
+ "Name": dc.name,
+ "Description": dc.description,
+ "Type": dc.type,
+ "Parameters": dc.parameters,
+ }
+
+ def create_data_catalog(self, name, catalog_type, description, parameters, tags):
+ if name in self.data_catalogs:
+ return None
+ data_catalog = DataCatalog(
+ self, name, catalog_type, description, parameters, tags
+ )
+ self.data_catalogs[name] = data_catalog
+ return data_catalog
+
+
+athena_backends = BackendDict(AthenaBackend, "athena")
diff --git a/contrib/python/moto/py3/moto/athena/responses.py b/contrib/python/moto/py3/moto/athena/responses.py
new file mode 100644
index 0000000000..218e55471d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/responses.py
@@ -0,0 +1,146 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import athena_backends
+
+
+class AthenaResponse(BaseResponse):
+ @property
+ def athena_backend(self):
+ return athena_backends[self.region]
+
+ def create_work_group(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ configuration = self._get_param("Configuration")
+ tags = self._get_param("Tags")
+ work_group = self.athena_backend.create_work_group(
+ name, configuration, description, tags
+ )
+ if not work_group:
+ return self.error("WorkGroup already exists", 400)
+ return json.dumps(
+ {
+ "CreateWorkGroupResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def list_work_groups(self):
+ return json.dumps({"WorkGroups": self.athena_backend.list_work_groups()})
+
+ def get_work_group(self):
+ name = self._get_param("WorkGroup")
+ return json.dumps({"WorkGroup": self.athena_backend.get_work_group(name)})
+
+ def start_query_execution(self):
+ query = self._get_param("QueryString")
+ context = self._get_param("QueryExecutionContext")
+ config = self._get_param("ResultConfiguration")
+ workgroup = self._get_param("WorkGroup")
+ if workgroup and not self.athena_backend.get_work_group(workgroup):
+ return self.error("WorkGroup does not exist", 400)
+ q_exec_id = self.athena_backend.start_query_execution(
+ query=query, context=context, config=config, workgroup=workgroup
+ )
+ return json.dumps({"QueryExecutionId": q_exec_id})
+
+ def get_query_execution(self):
+ exec_id = self._get_param("QueryExecutionId")
+ execution = self.athena_backend.get_execution(exec_id)
+ result = {
+ "QueryExecution": {
+ "QueryExecutionId": exec_id,
+ "Query": execution.query,
+ "StatementType": "DDL",
+ "ResultConfiguration": execution.config,
+ "QueryExecutionContext": execution.context,
+ "Status": {
+ "State": execution.status,
+ "SubmissionDateTime": execution.start_time,
+ },
+ "Statistics": {
+ "EngineExecutionTimeInMillis": 0,
+ "DataScannedInBytes": 0,
+ "TotalExecutionTimeInMillis": 0,
+ "QueryQueueTimeInMillis": 0,
+ "QueryPlanningTimeInMillis": 0,
+ "ServiceProcessingTimeInMillis": 0,
+ },
+ "WorkGroup": execution.workgroup,
+ }
+ }
+ return json.dumps(result)
+
+ def stop_query_execution(self):
+ exec_id = self._get_param("QueryExecutionId")
+ self.athena_backend.stop_query_execution(exec_id)
+ return json.dumps({})
+
+ def error(self, msg, status):
+ return (
+ json.dumps({"__type": "InvalidRequestException", "Message": msg}),
+ dict(status=status),
+ )
+
+ def create_named_query(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ database = self._get_param("Database")
+ query_string = self._get_param("QueryString")
+ workgroup = self._get_param("WorkGroup")
+ if workgroup and not self.athena_backend.get_work_group(workgroup):
+ return self.error("WorkGroup does not exist", 400)
+ query_id = self.athena_backend.create_named_query(
+ name, description, database, query_string, workgroup
+ )
+ return json.dumps({"NamedQueryId": query_id})
+
+ def get_named_query(self):
+ query_id = self._get_param("NamedQueryId")
+ nq = self.athena_backend.get_named_query(query_id)
+ return json.dumps(
+ {
+ "NamedQuery": {
+ "Name": nq.name,
+ "Description": nq.description,
+ "Database": nq.database,
+ "QueryString": nq.query_string,
+ "NamedQueryId": nq.id,
+ "WorkGroup": nq.workgroup,
+ }
+ }
+ )
+
+ def list_data_catalogs(self):
+ return json.dumps(
+ {"DataCatalogsSummary": self.athena_backend.list_data_catalogs()}
+ )
+
+ def get_data_catalog(self):
+ name = self._get_param("Name")
+ return json.dumps({"DataCatalog": self.athena_backend.get_data_catalog(name)})
+
+ def create_data_catalog(self):
+ name = self._get_param("Name")
+ catalog_type = self._get_param("Type")
+ description = self._get_param("Description")
+ parameters = self._get_param("Parameters")
+ tags = self._get_param("Tags")
+ data_catalog = self.athena_backend.create_data_catalog(
+ name, catalog_type, description, parameters, tags
+ )
+ if not data_catalog:
+ return self.error("DataCatalog already exists", 400)
+ return json.dumps(
+ {
+ "CreateDataCatalogResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
diff --git a/contrib/python/moto/py3/moto/athena/urls.py b/contrib/python/moto/py3/moto/athena/urls.py
new file mode 100644
index 0000000000..6c5d7c7126
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/urls.py
@@ -0,0 +1,5 @@
+from .responses import AthenaResponse
+
+url_bases = [r"https?://athena\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": AthenaResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/athena/utils.py b/contrib/python/moto/py3/moto/athena/utils.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/athena/utils.py
diff --git a/contrib/python/moto/py3/moto/autoscaling/__init__.py b/contrib/python/moto/py3/moto/autoscaling/__init__.py
new file mode 100644
index 0000000000..14ba8f3d96
--- /dev/null
+++ b/contrib/python/moto/py3/moto/autoscaling/__init__.py
@@ -0,0 +1,5 @@
+from .models import autoscaling_backends
+from ..core.models import base_decorator
+
+autoscaling_backend = autoscaling_backends["us-east-1"]
+mock_autoscaling = base_decorator(autoscaling_backends)
diff --git a/contrib/python/moto/py3/moto/autoscaling/exceptions.py b/contrib/python/moto/py3/moto/autoscaling/exceptions.py
new file mode 100644
index 0000000000..c408e16b20
--- /dev/null
+++ b/contrib/python/moto/py3/moto/autoscaling/exceptions.py
@@ -0,0 +1,27 @@
+from moto.core.exceptions import RESTError
+
+
+class AutoscalingClientError(RESTError):
+ code = 400
+
+
+class ResourceContentionError(RESTError):
+ code = 500
+
+ def __init__(self):
+ super().__init__(
+ "ResourceContentionError",
+ "You already have a pending update to an Auto Scaling resource (for example, a group, instance, or load balancer).",
+ )
+
+
+class InvalidInstanceError(AutoscalingClientError):
+ def __init__(self, instance_id):
+ super().__init__(
+ "ValidationError", "Instance [{0}] is invalid.".format(instance_id)
+ )
+
+
+class ValidationError(AutoscalingClientError):
+ def __init__(self, message):
+ super().__init__("ValidationError", message)
diff --git a/contrib/python/moto/py3/moto/autoscaling/models.py b/contrib/python/moto/py3/moto/autoscaling/models.py
new file mode 100644
index 0000000000..25b1dace1c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/autoscaling/models.py
@@ -0,0 +1,1271 @@
+import itertools
+import random
+from uuid import uuid4
+
+from moto.packages.boto.ec2.blockdevicemapping import (
+ BlockDeviceType,
+ BlockDeviceMapping,
+)
+from moto.ec2.exceptions import InvalidInstanceIdError
+
+from collections import OrderedDict
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import camelcase_to_underscores, BackendDict
+from moto.ec2 import ec2_backends
+from moto.elb import elb_backends
+from moto.elbv2 import elbv2_backends
+from moto.elb.exceptions import LoadBalancerNotFoundError
+from .exceptions import (
+ AutoscalingClientError,
+ ResourceContentionError,
+ InvalidInstanceError,
+ ValidationError,
+)
+
+# http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AS_Concepts.html#Cooldown
+DEFAULT_COOLDOWN = 300
+
+ASG_NAME_TAG = "aws:autoscaling:groupName"
+
+
+class InstanceState(object):
+ def __init__(
+ self,
+ instance,
+ lifecycle_state="InService",
+ health_status="Healthy",
+ protected_from_scale_in=False,
+ autoscaling_group=None,
+ ):
+ self.instance = instance
+ self.lifecycle_state = lifecycle_state
+ self.health_status = health_status
+ self.protected_from_scale_in = protected_from_scale_in
+ if not hasattr(self.instance, "autoscaling_group"):
+ self.instance.autoscaling_group = autoscaling_group
+
+
+class FakeLifeCycleHook(BaseModel):
+ def __init__(self, name, as_name, transition, timeout, result):
+ self.name = name
+ self.as_name = as_name
+ if transition:
+ self.transition = transition
+ if timeout:
+ self.timeout = timeout
+ else:
+ self.timeout = 3600
+ if result:
+ self.result = result
+ else:
+ self.result = "ABANDON"
+
+
+class FakeScalingPolicy(BaseModel):
+ def __init__(
+ self,
+ name,
+ policy_type,
+ metric_aggregation_type,
+ adjustment_type,
+ as_name,
+ min_adjustment_magnitude,
+ scaling_adjustment,
+ cooldown,
+ target_tracking_config,
+ step_adjustments,
+ estimated_instance_warmup,
+ predictive_scaling_configuration,
+ autoscaling_backend,
+ ):
+ self.name = name
+ self.policy_type = policy_type
+ self.metric_aggregation_type = metric_aggregation_type
+ self.adjustment_type = adjustment_type
+ self.as_name = as_name
+ self.min_adjustment_magnitude = min_adjustment_magnitude
+ self.scaling_adjustment = scaling_adjustment
+ if cooldown is not None:
+ self.cooldown = cooldown
+ else:
+ self.cooldown = DEFAULT_COOLDOWN
+ self.target_tracking_config = target_tracking_config
+ self.step_adjustments = step_adjustments
+ self.estimated_instance_warmup = estimated_instance_warmup
+ self.predictive_scaling_configuration = predictive_scaling_configuration
+ self.autoscaling_backend = autoscaling_backend
+
+ @property
+ def arn(self):
+ return f"arn:aws:autoscaling:{self.autoscaling_backend.region_name}:{get_account_id()}:scalingPolicy:c322761b-3172-4d56-9a21-0ed9d6161d67:autoScalingGroupName/{self.as_name}:policyName/{self.name}"
+
+ def execute(self):
+ if self.adjustment_type == "ExactCapacity":
+ self.autoscaling_backend.set_desired_capacity(
+ self.as_name, self.scaling_adjustment
+ )
+ elif self.adjustment_type == "ChangeInCapacity":
+ self.autoscaling_backend.change_capacity(
+ self.as_name, self.scaling_adjustment
+ )
+ elif self.adjustment_type == "PercentChangeInCapacity":
+ self.autoscaling_backend.change_capacity_percent(
+ self.as_name, self.scaling_adjustment
+ )
+
+
+class FakeLaunchConfiguration(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ image_id,
+ key_name,
+ ramdisk_id,
+ kernel_id,
+ security_groups,
+ user_data,
+ instance_type,
+ instance_monitoring,
+ instance_profile_name,
+ spot_price,
+ ebs_optimized,
+ associate_public_ip_address,
+ block_device_mapping_dict,
+ region_name,
+ metadata_options,
+ classic_link_vpc_id,
+ classic_link_vpc_security_groups,
+ ):
+ self.name = name
+ self.image_id = image_id
+ self.key_name = key_name
+ self.ramdisk_id = ramdisk_id
+ self.kernel_id = kernel_id
+ self.security_groups = security_groups if security_groups else []
+ self.user_data = user_data
+ self.instance_type = instance_type
+ self.instance_monitoring = instance_monitoring
+ self.instance_profile_name = instance_profile_name
+ self.spot_price = spot_price
+ self.ebs_optimized = ebs_optimized
+ self.associate_public_ip_address = associate_public_ip_address
+ self.block_device_mapping_dict = block_device_mapping_dict
+ self.metadata_options = metadata_options
+ self.classic_link_vpc_id = classic_link_vpc_id
+ self.classic_link_vpc_security_groups = classic_link_vpc_security_groups
+ self.arn = f"arn:aws:autoscaling:{region_name}:{get_account_id()}:launchConfiguration:9dbbbf87-6141-428a-a409-0752edbe6cad:launchConfigurationName/{self.name}"
+
+ @classmethod
+ def create_from_instance(cls, name, instance, backend):
+ config = backend.create_launch_configuration(
+ name=name,
+ image_id=instance.image_id,
+ kernel_id="",
+ ramdisk_id="",
+ key_name=instance.key_name,
+ security_groups=instance.security_groups,
+ user_data=instance.user_data,
+ instance_type=instance.instance_type,
+ instance_monitoring=False,
+ instance_profile_name=None,
+ spot_price=None,
+ ebs_optimized=instance.ebs_optimized,
+ associate_public_ip_address=instance.associate_public_ip,
+ # We expect a dictionary in the same format as when the user calls it
+ block_device_mappings=instance.block_device_mapping.to_source_dict(),
+ )
+ return config
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "LaunchConfigurationName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html
+ return "AWS::AutoScaling::LaunchConfiguration"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ instance_profile_name = properties.get("IamInstanceProfile")
+
+ backend = autoscaling_backends[region_name]
+ config = backend.create_launch_configuration(
+ name=resource_name,
+ image_id=properties.get("ImageId"),
+ kernel_id=properties.get("KernelId"),
+ ramdisk_id=properties.get("RamdiskId"),
+ key_name=properties.get("KeyName"),
+ security_groups=properties.get("SecurityGroups"),
+ user_data=properties.get("UserData"),
+ instance_type=properties.get("InstanceType"),
+ instance_monitoring=properties.get("InstanceMonitoring"),
+ instance_profile_name=instance_profile_name,
+ spot_price=properties.get("SpotPrice"),
+ ebs_optimized=properties.get("EbsOptimized"),
+ associate_public_ip_address=properties.get("AssociatePublicIpAddress"),
+ block_device_mappings=properties.get("BlockDeviceMapping.member"),
+ )
+ return config
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ backend = autoscaling_backends[region_name]
+ try:
+ backend.delete_launch_configuration(resource_name)
+ except KeyError:
+ pass
+
+ def delete(self, region_name):
+ backend = autoscaling_backends[region_name]
+ backend.delete_launch_configuration(self.name)
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def block_device_mappings(self):
+ if not self.block_device_mapping_dict:
+ return None
+ else:
+ return self._parse_block_device_mappings()
+
+ @property
+ def instance_monitoring_enabled(self):
+ if self.instance_monitoring:
+ return "true"
+ return "false"
+
+ def _parse_block_device_mappings(self):
+ block_device_map = BlockDeviceMapping()
+ for mapping in self.block_device_mapping_dict:
+ block_type = BlockDeviceType()
+ mount_point = mapping.get("DeviceName")
+ if mapping.get("VirtualName") and "ephemeral" in mapping.get("VirtualName"):
+ block_type.ephemeral_name = mapping.get("VirtualName")
+ elif mapping.get("NoDevice", "false") == "true":
+ block_type.no_device = "true"
+ else:
+ ebs = mapping.get("Ebs", {})
+ block_type.volume_type = ebs.get("VolumeType")
+ block_type.snapshot_id = ebs.get("SnapshotId")
+ block_type.delete_on_termination = ebs.get("DeleteOnTermination")
+ block_type.size = ebs.get("VolumeSize")
+ block_type.iops = ebs.get("Iops")
+ block_type.throughput = ebs.get("Throughput")
+ block_type.encrypted = ebs.get("Encrypted")
+ block_device_map[mount_point] = block_type
+ return block_device_map
+
+
+class FakeAutoScalingGroup(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ availability_zones,
+ desired_capacity,
+ max_size,
+ min_size,
+ launch_config_name,
+ launch_template,
+ vpc_zone_identifier,
+ default_cooldown,
+ health_check_period,
+ health_check_type,
+ load_balancers,
+ target_group_arns,
+ placement_group,
+ termination_policies,
+ autoscaling_backend,
+ ec2_backend,
+ tags,
+ new_instances_protected_from_scale_in=False,
+ ):
+ self.autoscaling_backend = autoscaling_backend
+ self.ec2_backend = ec2_backend
+ self.name = name
+ self._id = str(uuid4())
+ self.region = self.autoscaling_backend.region_name
+
+ self._set_azs_and_vpcs(availability_zones, vpc_zone_identifier)
+
+ self.max_size = max_size
+ self.min_size = min_size
+
+ self.launch_template = None
+ self.launch_config = None
+
+ self._set_launch_configuration(launch_config_name, launch_template)
+
+ self.default_cooldown = (
+ default_cooldown if default_cooldown else DEFAULT_COOLDOWN
+ )
+ self.health_check_period = health_check_period
+ self.health_check_type = health_check_type if health_check_type else "EC2"
+ self.load_balancers = load_balancers
+ self.target_group_arns = target_group_arns
+ self.placement_group = placement_group
+ self.termination_policies = termination_policies
+ self.new_instances_protected_from_scale_in = (
+ new_instances_protected_from_scale_in
+ )
+
+ self.suspended_processes = []
+ self.instance_states = []
+ self.tags = tags or []
+ self.set_desired_capacity(desired_capacity)
+
+ @property
+ def tags(self):
+ return self._tags
+
+ @tags.setter
+ def tags(self, tags):
+ for tag in tags:
+ if "resource_id" not in tag or not tag["resource_id"]:
+ tag["resource_id"] = self.name
+ if "resource_type" not in tag or not tag["resource_type"]:
+ tag["resource_type"] = "auto-scaling-group"
+ self._tags = tags
+
+ @property
+ def arn(self):
+ return f"arn:aws:autoscaling:{self.region}:{get_account_id()}:autoScalingGroup:{self._id}:autoScalingGroupName/{self.name}"
+
+ def active_instances(self):
+ return [x for x in self.instance_states if x.lifecycle_state == "InService"]
+
+ def _set_azs_and_vpcs(self, availability_zones, vpc_zone_identifier, update=False):
+ # for updates, if only AZs are provided, they must not clash with
+ # the AZs of existing VPCs
+ if update and availability_zones and not vpc_zone_identifier:
+ vpc_zone_identifier = self.vpc_zone_identifier
+
+ if vpc_zone_identifier:
+ # extract azs for vpcs
+ subnet_ids = vpc_zone_identifier.split(",")
+ subnets = self.autoscaling_backend.ec2_backend.get_all_subnets(
+ subnet_ids=subnet_ids
+ )
+ vpc_zones = [subnet.availability_zone for subnet in subnets]
+
+ if availability_zones and set(availability_zones) != set(vpc_zones):
+ raise AutoscalingClientError(
+ "ValidationError",
+ "The availability zones of the specified subnets and the Auto Scaling group do not match",
+ )
+ availability_zones = vpc_zones
+ elif not availability_zones:
+ if not update:
+ raise AutoscalingClientError(
+ "ValidationError",
+ "At least one Availability Zone or VPC Subnet is required.",
+ )
+ return
+
+ self.availability_zones = availability_zones
+ self.vpc_zone_identifier = vpc_zone_identifier
+
+ def _set_launch_configuration(self, launch_config_name, launch_template):
+ if launch_config_name:
+ self.launch_config = self.autoscaling_backend.launch_configurations[
+ launch_config_name
+ ]
+ self.launch_config_name = launch_config_name
+
+ if launch_template:
+ launch_template_id = launch_template.get("launch_template_id")
+ launch_template_name = launch_template.get("launch_template_name")
+
+ if not (launch_template_id or launch_template_name) or (
+ launch_template_id and launch_template_name
+ ):
+ raise ValidationError(
+ "Valid requests must contain either launchTemplateId or LaunchTemplateName"
+ )
+
+ if launch_template_id:
+ self.launch_template = self.ec2_backend.get_launch_template(
+ launch_template_id
+ )
+ elif launch_template_name:
+ self.launch_template = self.ec2_backend.get_launch_template_by_name(
+ launch_template_name
+ )
+ self.launch_template_version = launch_template["version"]
+
+ @staticmethod
+ def __set_string_propagate_at_launch_booleans_on_tags(tags):
+ bool_to_string = {True: "true", False: "false"}
+ for tag in tags:
+ if "PropagateAtLaunch" in tag:
+ tag["PropagateAtLaunch"] = bool_to_string[tag["PropagateAtLaunch"]]
+ return tags
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "AutoScalingGroupName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-autoscalinggroup.html
+ return "AWS::AutoScaling::AutoScalingGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ launch_config_name = properties.get("LaunchConfigurationName")
+ launch_template = {
+ camelcase_to_underscores(k): v
+ for k, v in properties.get("LaunchTemplate", {}).items()
+ }
+ load_balancer_names = properties.get("LoadBalancerNames", [])
+ target_group_arns = properties.get("TargetGroupARNs", [])
+
+ backend = autoscaling_backends[region_name]
+ group = backend.create_auto_scaling_group(
+ name=resource_name,
+ availability_zones=properties.get("AvailabilityZones", []),
+ desired_capacity=properties.get("DesiredCapacity"),
+ max_size=properties.get("MaxSize"),
+ min_size=properties.get("MinSize"),
+ launch_config_name=launch_config_name,
+ launch_template=launch_template,
+ vpc_zone_identifier=(
+ ",".join(properties.get("VPCZoneIdentifier", [])) or None
+ ),
+ default_cooldown=properties.get("Cooldown"),
+ health_check_period=properties.get("HealthCheckGracePeriod"),
+ health_check_type=properties.get("HealthCheckType"),
+ load_balancers=load_balancer_names,
+ target_group_arns=target_group_arns,
+ placement_group=None,
+ termination_policies=properties.get("TerminationPolicies", []),
+ tags=cls.__set_string_propagate_at_launch_booleans_on_tags(
+ properties.get("Tags", [])
+ ),
+ new_instances_protected_from_scale_in=properties.get(
+ "NewInstancesProtectedFromScaleIn", False
+ ),
+ )
+ return group
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ backend = autoscaling_backends[region_name]
+ try:
+ backend.delete_auto_scaling_group(resource_name)
+ except KeyError:
+ pass
+
+ def delete(self, region_name):
+ backend = autoscaling_backends[region_name]
+ backend.delete_auto_scaling_group(self.name)
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def image_id(self):
+ if self.launch_template:
+ version = self.launch_template.get_version(self.launch_template_version)
+ return version.image_id
+
+ return self.launch_config.image_id
+
+ @property
+ def instance_type(self):
+ if self.launch_template:
+ version = self.launch_template.get_version(self.launch_template_version)
+ return version.instance_type
+
+ return self.launch_config.instance_type
+
+ @property
+ def user_data(self):
+ if self.launch_template:
+ version = self.launch_template.get_version(self.launch_template_version)
+ return version.user_data
+
+ return self.launch_config.user_data
+
+ @property
+ def security_groups(self):
+ if self.launch_template:
+ version = self.launch_template.get_version(self.launch_template_version)
+ return version.security_groups
+
+ return self.launch_config.security_groups
+
+ def update(
+ self,
+ availability_zones,
+ desired_capacity,
+ max_size,
+ min_size,
+ launch_config_name,
+ launch_template,
+ vpc_zone_identifier,
+ health_check_period,
+ health_check_type,
+ new_instances_protected_from_scale_in=None,
+ ):
+ self._set_azs_and_vpcs(availability_zones, vpc_zone_identifier, update=True)
+
+ if max_size is not None:
+ self.max_size = max_size
+ if min_size is not None:
+ self.min_size = min_size
+
+ if desired_capacity is None:
+ if min_size is not None and min_size > len(self.instance_states):
+ desired_capacity = min_size
+ if max_size is not None and max_size < len(self.instance_states):
+ desired_capacity = max_size
+
+ self._set_launch_configuration(launch_config_name, launch_template)
+
+ if health_check_period is not None:
+ self.health_check_period = health_check_period
+ if health_check_type is not None:
+ self.health_check_type = health_check_type
+ if new_instances_protected_from_scale_in is not None:
+ self.new_instances_protected_from_scale_in = (
+ new_instances_protected_from_scale_in
+ )
+
+ if desired_capacity is not None:
+ self.set_desired_capacity(desired_capacity)
+
+ def set_desired_capacity(self, new_capacity):
+ if new_capacity is None:
+ self.desired_capacity = self.min_size
+ else:
+ self.desired_capacity = new_capacity
+
+ curr_instance_count = len(self.active_instances())
+
+ if self.desired_capacity == curr_instance_count:
+ pass # Nothing to do here
+ elif self.desired_capacity > curr_instance_count:
+ # Need more instances
+ count_needed = int(self.desired_capacity) - int(curr_instance_count)
+
+ propagated_tags = self.get_propagated_tags()
+ self.replace_autoscaling_group_instances(count_needed, propagated_tags)
+ else:
+ # Need to remove some instances
+ count_to_remove = curr_instance_count - self.desired_capacity
+ instances_to_remove = [ # only remove unprotected
+ state
+ for state in self.instance_states
+ if not state.protected_from_scale_in
+ ][:count_to_remove]
+ if instances_to_remove: # just in case not instances to remove
+ instance_ids_to_remove = [
+ instance.instance.id for instance in instances_to_remove
+ ]
+ self.autoscaling_backend.ec2_backend.terminate_instances(
+ instance_ids_to_remove
+ )
+ self.instance_states = list(
+ set(self.instance_states) - set(instances_to_remove)
+ )
+ if self.name in self.autoscaling_backend.autoscaling_groups:
+ self.autoscaling_backend.update_attached_elbs(self.name)
+ self.autoscaling_backend.update_attached_target_groups(self.name)
+
+ def get_propagated_tags(self):
+ propagated_tags = {}
+ for tag in self.tags:
+ # boto uses 'propagate_at_launch
+ # boto3 and cloudformation use PropagateAtLaunch
+ if "propagate_at_launch" in tag and tag["propagate_at_launch"] == "true":
+ propagated_tags[tag["key"]] = tag["value"]
+ if "PropagateAtLaunch" in tag and tag["PropagateAtLaunch"] == "true":
+ propagated_tags[tag["Key"]] = tag["Value"]
+ return propagated_tags
+
+ def replace_autoscaling_group_instances(self, count_needed, propagated_tags):
+ propagated_tags[ASG_NAME_TAG] = self.name
+
+ reservation = self.autoscaling_backend.ec2_backend.add_instances(
+ self.image_id,
+ count_needed,
+ self.user_data,
+ self.security_groups,
+ instance_type=self.instance_type,
+ tags={"instance": propagated_tags},
+ placement=random.choice(self.availability_zones),
+ launch_config=self.launch_config,
+ is_instance_type_default=False,
+ )
+ for instance in reservation.instances:
+ instance.autoscaling_group = self
+ self.instance_states.append(
+ InstanceState(
+ instance,
+ protected_from_scale_in=self.new_instances_protected_from_scale_in,
+ )
+ )
+
+ def append_target_groups(self, target_group_arns):
+ append = [x for x in target_group_arns if x not in self.target_group_arns]
+ self.target_group_arns.extend(append)
+
+
+class AutoScalingBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.autoscaling_groups = OrderedDict()
+ self.launch_configurations = OrderedDict()
+ self.policies = {}
+ self.lifecycle_hooks = {}
+ self.ec2_backend = ec2_backends[region_name]
+ self.elb_backend = elb_backends[region_name]
+ self.elbv2_backend = elbv2_backends[region_name]
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "autoscaling"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "autoscaling-plans"
+ )
+
+ def create_launch_configuration(
+ self,
+ name,
+ image_id,
+ key_name,
+ kernel_id,
+ ramdisk_id,
+ security_groups,
+ user_data,
+ instance_type,
+ instance_monitoring,
+ instance_profile_name,
+ spot_price,
+ ebs_optimized,
+ associate_public_ip_address,
+ block_device_mappings,
+ instance_id=None,
+ metadata_options=None,
+ classic_link_vpc_id=None,
+ classic_link_vpc_security_groups=None,
+ ):
+ valid_requests = [
+ instance_id is not None,
+ image_id is not None and instance_type is not None,
+ ]
+ if not any(valid_requests):
+ raise ValidationError(
+ "Valid requests must contain either the InstanceID parameter or both the ImageId and InstanceType parameters."
+ )
+ if instance_id is not None:
+ # TODO: https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-lc-with-instanceID.html
+ pass
+ launch_configuration = FakeLaunchConfiguration(
+ name=name,
+ image_id=image_id,
+ key_name=key_name,
+ kernel_id=kernel_id,
+ ramdisk_id=ramdisk_id,
+ security_groups=security_groups,
+ user_data=user_data,
+ instance_type=instance_type,
+ instance_monitoring=instance_monitoring,
+ instance_profile_name=instance_profile_name,
+ spot_price=spot_price,
+ ebs_optimized=ebs_optimized,
+ associate_public_ip_address=associate_public_ip_address,
+ block_device_mapping_dict=block_device_mappings,
+ region_name=self.region_name,
+ metadata_options=metadata_options,
+ classic_link_vpc_id=classic_link_vpc_id,
+ classic_link_vpc_security_groups=classic_link_vpc_security_groups,
+ )
+ self.launch_configurations[name] = launch_configuration
+ return launch_configuration
+
+ def describe_launch_configurations(self, names):
+ configurations = self.launch_configurations.values()
+ if names:
+ return [
+ configuration
+ for configuration in configurations
+ if configuration.name in names
+ ]
+ else:
+ return list(configurations)
+
+ def delete_launch_configuration(self, launch_configuration_name):
+ self.launch_configurations.pop(launch_configuration_name, None)
+
+ def create_auto_scaling_group(
+ self,
+ name,
+ availability_zones,
+ desired_capacity,
+ max_size,
+ min_size,
+ launch_config_name,
+ launch_template,
+ vpc_zone_identifier,
+ default_cooldown,
+ health_check_period,
+ health_check_type,
+ load_balancers,
+ target_group_arns,
+ placement_group,
+ termination_policies,
+ tags,
+ new_instances_protected_from_scale_in=False,
+ instance_id=None,
+ ):
+ def make_int(value):
+ return int(value) if value is not None else value
+
+ max_size = make_int(max_size)
+ min_size = make_int(min_size)
+ desired_capacity = make_int(desired_capacity)
+ default_cooldown = make_int(default_cooldown)
+ if health_check_period is None:
+ health_check_period = 300
+ else:
+ health_check_period = make_int(health_check_period)
+
+ # TODO: Add MixedInstancesPolicy once implemented.
+ # Verify only a single launch config-like parameter is provided.
+ params = [launch_config_name, launch_template, instance_id]
+ num_params = sum([1 for param in params if param])
+
+ if num_params != 1:
+ raise ValidationError(
+ "Valid requests must contain either LaunchTemplate, LaunchConfigurationName, "
+ "InstanceId or MixedInstancesPolicy parameter."
+ )
+
+ if instance_id:
+ try:
+ instance = self.ec2_backend.get_instance(instance_id)
+ launch_config_name = name
+ FakeLaunchConfiguration.create_from_instance(
+ launch_config_name, instance, self
+ )
+ except InvalidInstanceIdError:
+ raise InvalidInstanceError(instance_id)
+
+ group = FakeAutoScalingGroup(
+ name=name,
+ availability_zones=availability_zones,
+ desired_capacity=desired_capacity,
+ max_size=max_size,
+ min_size=min_size,
+ launch_config_name=launch_config_name,
+ launch_template=launch_template,
+ vpc_zone_identifier=vpc_zone_identifier,
+ default_cooldown=default_cooldown,
+ health_check_period=health_check_period,
+ health_check_type=health_check_type,
+ load_balancers=load_balancers,
+ target_group_arns=target_group_arns,
+ placement_group=placement_group,
+ termination_policies=termination_policies,
+ autoscaling_backend=self,
+ ec2_backend=self.ec2_backend,
+ tags=tags,
+ new_instances_protected_from_scale_in=new_instances_protected_from_scale_in,
+ )
+
+ self.autoscaling_groups[name] = group
+ self.update_attached_elbs(group.name)
+ self.update_attached_target_groups(group.name)
+ return group
+
+ def update_auto_scaling_group(
+ self,
+ name,
+ availability_zones,
+ desired_capacity,
+ max_size,
+ min_size,
+ launch_config_name,
+ launch_template,
+ vpc_zone_identifier,
+ health_check_period,
+ health_check_type,
+ new_instances_protected_from_scale_in=None,
+ ):
+ """
+ The parameter DefaultCooldown, PlacementGroup, TerminationPolicies are not yet implemented
+ """
+ # TODO: Add MixedInstancesPolicy once implemented.
+ # Verify only a single launch config-like parameter is provided.
+ if launch_config_name and launch_template:
+ raise ValidationError(
+ "Valid requests must contain either LaunchTemplate, LaunchConfigurationName "
+ "or MixedInstancesPolicy parameter."
+ )
+
+ group = self.autoscaling_groups[name]
+ group.update(
+ availability_zones=availability_zones,
+ desired_capacity=desired_capacity,
+ max_size=max_size,
+ min_size=min_size,
+ launch_config_name=launch_config_name,
+ launch_template=launch_template,
+ vpc_zone_identifier=vpc_zone_identifier,
+ health_check_period=health_check_period,
+ health_check_type=health_check_type,
+ new_instances_protected_from_scale_in=new_instances_protected_from_scale_in,
+ )
+ return group
+
+ def describe_auto_scaling_groups(self, names):
+ groups = self.autoscaling_groups.values()
+ if names:
+ return [group for group in groups if group.name in names]
+ else:
+ return list(groups)
+
+ def delete_auto_scaling_group(self, group_name):
+ self.set_desired_capacity(group_name, 0)
+ self.autoscaling_groups.pop(group_name, None)
+
+ def describe_auto_scaling_instances(self, instance_ids):
+ instance_states = []
+ for group in self.autoscaling_groups.values():
+ instance_states.extend(
+ [
+ x
+ for x in group.instance_states
+ if not instance_ids or x.instance.id in instance_ids
+ ]
+ )
+ return instance_states
+
+ def attach_instances(self, group_name, instance_ids):
+ group = self.autoscaling_groups[group_name]
+ original_size = len(group.instance_states)
+
+ if (original_size + len(instance_ids)) > group.max_size:
+ raise ResourceContentionError
+ else:
+ group.desired_capacity = original_size + len(instance_ids)
+ new_instances = [
+ InstanceState(
+ self.ec2_backend.get_instance(x),
+ protected_from_scale_in=group.new_instances_protected_from_scale_in,
+ autoscaling_group=group,
+ )
+ for x in instance_ids
+ ]
+ for instance in new_instances:
+ self.ec2_backend.create_tags(
+ [instance.instance.id], {ASG_NAME_TAG: group.name}
+ )
+ group.instance_states.extend(new_instances)
+ self.update_attached_elbs(group.name)
+ self.update_attached_target_groups(group.name)
+
+ def set_instance_health(self, instance_id, health_status):
+ """
+ The ShouldRespectGracePeriod-parameter is not yet implemented
+ """
+ instance = self.ec2_backend.get_instance(instance_id)
+ instance_state = next(
+ instance_state
+ for group in self.autoscaling_groups.values()
+ for instance_state in group.instance_states
+ if instance_state.instance.id == instance.id
+ )
+ instance_state.health_status = health_status
+
+ def detach_instances(self, group_name, instance_ids, should_decrement):
+ group = self.autoscaling_groups[group_name]
+ original_size = group.desired_capacity
+
+ detached_instances = [
+ x for x in group.instance_states if x.instance.id in instance_ids
+ ]
+ for instance in detached_instances:
+ self.ec2_backend.delete_tags(
+ [instance.instance.id], {ASG_NAME_TAG: group.name}
+ )
+
+ new_instance_state = [
+ x for x in group.instance_states if x.instance.id not in instance_ids
+ ]
+ group.instance_states = new_instance_state
+
+ if should_decrement:
+ group.desired_capacity = original_size - len(instance_ids)
+
+ group.set_desired_capacity(group.desired_capacity)
+ return detached_instances
+
+ def set_desired_capacity(self, group_name, desired_capacity):
+ group = self.autoscaling_groups[group_name]
+ group.set_desired_capacity(desired_capacity)
+ self.update_attached_elbs(group_name)
+
+ def change_capacity(self, group_name, scaling_adjustment):
+ group = self.autoscaling_groups[group_name]
+ desired_capacity = group.desired_capacity + scaling_adjustment
+ self.set_desired_capacity(group_name, desired_capacity)
+
+ def change_capacity_percent(self, group_name, scaling_adjustment):
+ """http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-scale-based-on-demand.html
+ If PercentChangeInCapacity returns a value between 0 and 1,
+ Auto Scaling will round it off to 1. If the PercentChangeInCapacity
+ returns a value greater than 1, Auto Scaling will round it off to the
+ lower value. For example, if PercentChangeInCapacity returns 12.5,
+ then Auto Scaling will round it off to 12."""
+ group = self.autoscaling_groups[group_name]
+ percent_change = 1 + (scaling_adjustment / 100.0)
+ desired_capacity = group.desired_capacity * percent_change
+ if group.desired_capacity < desired_capacity < group.desired_capacity + 1:
+ desired_capacity = group.desired_capacity + 1
+ else:
+ desired_capacity = int(desired_capacity)
+ self.set_desired_capacity(group_name, desired_capacity)
+
+ def create_lifecycle_hook(self, name, as_name, transition, timeout, result):
+ lifecycle_hook = FakeLifeCycleHook(name, as_name, transition, timeout, result)
+
+ self.lifecycle_hooks["%s_%s" % (as_name, name)] = lifecycle_hook
+ return lifecycle_hook
+
+ def describe_lifecycle_hooks(self, as_name, lifecycle_hook_names=None):
+ return [
+ lifecycle_hook
+ for lifecycle_hook in self.lifecycle_hooks.values()
+ if (lifecycle_hook.as_name == as_name)
+ and (
+ not lifecycle_hook_names or lifecycle_hook.name in lifecycle_hook_names
+ )
+ ]
+
+ def delete_lifecycle_hook(self, as_name, name):
+ self.lifecycle_hooks.pop("%s_%s" % (as_name, name), None)
+
+ def put_scaling_policy(
+ self,
+ name,
+ policy_type,
+ metric_aggregation_type,
+ adjustment_type,
+ as_name,
+ min_adjustment_magnitude,
+ scaling_adjustment,
+ cooldown,
+ target_tracking_config,
+ step_adjustments,
+ estimated_instance_warmup,
+ predictive_scaling_configuration,
+ ):
+ policy = FakeScalingPolicy(
+ name,
+ policy_type,
+ metric_aggregation_type,
+ adjustment_type=adjustment_type,
+ as_name=as_name,
+ min_adjustment_magnitude=min_adjustment_magnitude,
+ scaling_adjustment=scaling_adjustment,
+ cooldown=cooldown,
+ target_tracking_config=target_tracking_config,
+ step_adjustments=step_adjustments,
+ estimated_instance_warmup=estimated_instance_warmup,
+ predictive_scaling_configuration=predictive_scaling_configuration,
+ autoscaling_backend=self,
+ )
+
+ self.policies[name] = policy
+ return policy
+
+ def describe_policies(
+ self, autoscaling_group_name=None, policy_names=None, policy_types=None
+ ):
+ return [
+ policy
+ for policy in self.policies.values()
+ if (not autoscaling_group_name or policy.as_name == autoscaling_group_name)
+ and (not policy_names or policy.name in policy_names)
+ and (not policy_types or policy.policy_type in policy_types)
+ ]
+
+ def delete_policy(self, group_name):
+ self.policies.pop(group_name, None)
+
+ def execute_policy(self, group_name):
+ policy = self.policies[group_name]
+ policy.execute()
+
+ def update_attached_elbs(self, group_name):
+ group = self.autoscaling_groups[group_name]
+ group_instance_ids = set(
+ state.instance.id for state in group.active_instances()
+ )
+
+ # skip this if group.load_balancers is empty
+ # otherwise elb_backend.describe_load_balancers returns all available load balancers
+ if not group.load_balancers:
+ return
+ try:
+ elbs = self.elb_backend.describe_load_balancers(names=group.load_balancers)
+ except LoadBalancerNotFoundError:
+ # ELBs can be deleted before their autoscaling group
+ return
+
+ for elb in elbs:
+ elb_instace_ids = set(elb.instance_ids)
+ self.elb_backend.register_instances(
+ elb.name, group_instance_ids - elb_instace_ids, from_autoscaling=True
+ )
+ self.elb_backend.deregister_instances(
+ elb.name, elb_instace_ids - group_instance_ids, from_autoscaling=True
+ )
+
+ def update_attached_target_groups(self, group_name):
+ group = self.autoscaling_groups[group_name]
+ group_instance_ids = set(state.instance.id for state in group.instance_states)
+
+ # no action necessary if target_group_arns is empty
+ if not group.target_group_arns:
+ return
+
+ target_groups = self.elbv2_backend.describe_target_groups(
+ target_group_arns=group.target_group_arns,
+ load_balancer_arn=None,
+ names=None,
+ )
+
+ for target_group in target_groups:
+ asg_targets = [
+ {"id": x, "port": target_group.port} for x in group_instance_ids
+ ]
+ self.elbv2_backend.register_targets(target_group.arn, (asg_targets))
+
+ def create_or_update_tags(self, tags):
+ for tag in tags:
+ group_name = tag["resource_id"]
+ group = self.autoscaling_groups[group_name]
+ old_tags = group.tags
+
+ new_tags = []
+ # if key was in old_tags, update old tag
+ for old_tag in old_tags:
+ if old_tag["key"] == tag["key"]:
+ new_tags.append(tag)
+ else:
+ new_tags.append(old_tag)
+
+ # if key was never in old_tag's add it (create tag)
+ if not any(new_tag["key"] == tag["key"] for new_tag in new_tags):
+ new_tags.append(tag)
+
+ group.tags = new_tags
+
+ def delete_tags(self, tags):
+ for tag_to_delete in tags:
+ group_name = tag_to_delete["resource_id"]
+ key_to_delete = tag_to_delete["key"]
+ group = self.autoscaling_groups[group_name]
+ old_tags = group.tags
+ group.tags = [x for x in old_tags if x["key"] != key_to_delete]
+
+ def attach_load_balancers(self, group_name, load_balancer_names):
+ group = self.autoscaling_groups[group_name]
+ group.load_balancers.extend(
+ [x for x in load_balancer_names if x not in group.load_balancers]
+ )
+ self.update_attached_elbs(group_name)
+
+ def describe_load_balancers(self, group_name):
+ return self.autoscaling_groups[group_name].load_balancers
+
+ def detach_load_balancers(self, group_name, load_balancer_names):
+ group = self.autoscaling_groups[group_name]
+ group_instance_ids = set(state.instance.id for state in group.instance_states)
+ elbs = self.elb_backend.describe_load_balancers(names=group.load_balancers)
+ for elb in elbs:
+ self.elb_backend.deregister_instances(
+ elb.name, group_instance_ids, from_autoscaling=True
+ )
+ group.load_balancers = [
+ x for x in group.load_balancers if x not in load_balancer_names
+ ]
+
+ def attach_load_balancer_target_groups(self, group_name, target_group_arns):
+ group = self.autoscaling_groups[group_name]
+ group.append_target_groups(target_group_arns)
+ self.update_attached_target_groups(group_name)
+
+ def describe_load_balancer_target_groups(self, group_name):
+ return self.autoscaling_groups[group_name].target_group_arns
+
+ def detach_load_balancer_target_groups(self, group_name, target_group_arns):
+ group = self.autoscaling_groups[group_name]
+ group.target_group_arns = [
+ x for x in group.target_group_arns if x not in target_group_arns
+ ]
+ for target_group in target_group_arns:
+ asg_targets = [{"id": x.instance.id} for x in group.instance_states]
+ self.elbv2_backend.deregister_targets(target_group, (asg_targets))
+
+ def suspend_processes(self, group_name, scaling_processes):
+ all_proc_names = [
+ "Launch",
+ "Terminate",
+ "AddToLoadBalancer",
+ "AlarmNotification",
+ "AZRebalance",
+ "HealthCheck",
+ "InstanceRefresh",
+ "ReplaceUnhealthy",
+ "ScheduledActions",
+ ]
+ group = self.autoscaling_groups[group_name]
+ set_to_add = set(scaling_processes or all_proc_names)
+ group.suspended_processes = list(
+ set(group.suspended_processes).union(set_to_add)
+ )
+
+ def resume_processes(self, group_name, scaling_processes):
+ group = self.autoscaling_groups[group_name]
+ if scaling_processes:
+ group.suspended_processes = list(
+ set(group.suspended_processes).difference(set(scaling_processes))
+ )
+ else:
+ group.suspended_processes = []
+
+ def set_instance_protection(
+ self, group_name, instance_ids, protected_from_scale_in
+ ):
+ group = self.autoscaling_groups[group_name]
+ protected_instances = [
+ x for x in group.instance_states if x.instance.id in instance_ids
+ ]
+ for instance in protected_instances:
+ instance.protected_from_scale_in = protected_from_scale_in
+
+ def notify_terminate_instances(self, instance_ids):
+ for (
+ autoscaling_group_name,
+ autoscaling_group,
+ ) in self.autoscaling_groups.items():
+ original_active_instance_count = len(autoscaling_group.active_instances())
+ autoscaling_group.instance_states = list(
+ filter(
+ lambda i_state: i_state.instance.id not in instance_ids,
+ autoscaling_group.instance_states,
+ )
+ )
+ difference = original_active_instance_count - len(
+ autoscaling_group.active_instances()
+ )
+ if difference > 0:
+ autoscaling_group.replace_autoscaling_group_instances(
+ difference, autoscaling_group.get_propagated_tags()
+ )
+ self.update_attached_elbs(autoscaling_group_name)
+
+ def enter_standby_instances(self, group_name, instance_ids, should_decrement):
+ group = self.autoscaling_groups[group_name]
+ original_size = group.desired_capacity
+ standby_instances = []
+ for instance_state in group.instance_states:
+ if instance_state.instance.id in instance_ids:
+ instance_state.lifecycle_state = "Standby"
+ standby_instances.append(instance_state)
+ if should_decrement:
+ group.desired_capacity = group.desired_capacity - len(instance_ids)
+ group.set_desired_capacity(group.desired_capacity)
+ return standby_instances, original_size, group.desired_capacity
+
+ def exit_standby_instances(self, group_name, instance_ids):
+ group = self.autoscaling_groups[group_name]
+ original_size = group.desired_capacity
+ standby_instances = []
+ for instance_state in group.instance_states:
+ if instance_state.instance.id in instance_ids:
+ instance_state.lifecycle_state = "InService"
+ standby_instances.append(instance_state)
+ group.desired_capacity = group.desired_capacity + len(instance_ids)
+ group.set_desired_capacity(group.desired_capacity)
+ return standby_instances, original_size, group.desired_capacity
+
+ def terminate_instance(self, instance_id, should_decrement):
+ instance = self.ec2_backend.get_instance(instance_id)
+ instance_state = next(
+ instance_state
+ for group in self.autoscaling_groups.values()
+ for instance_state in group.instance_states
+ if instance_state.instance.id == instance.id
+ )
+ group = instance.autoscaling_group
+ original_size = group.desired_capacity
+ self.detach_instances(group.name, [instance.id], should_decrement)
+ self.ec2_backend.terminate_instances([instance.id])
+ return instance_state, original_size, group.desired_capacity
+
+ def describe_tags(self, filters):
+ """
+ Pagination is not yet implemented.
+ Only the `auto-scaling-group` and `propagate-at-launch` filters are implemented.
+ """
+ resources = self.autoscaling_groups.values()
+ tags = list(itertools.chain(*[r.tags for r in resources]))
+ for f in filters:
+ if f["Name"] == "auto-scaling-group":
+ tags = [t for t in tags if t["resource_id"] in f["Values"]]
+ if f["Name"] == "propagate-at-launch":
+ values = [v.lower() for v in f["Values"]]
+ tags = [
+ t
+ for t in tags
+ if t.get("propagate_at_launch", "").lower() in values
+ ]
+ return tags
+
+
+autoscaling_backends = BackendDict(AutoScalingBackend, "autoscaling")
diff --git a/contrib/python/moto/py3/moto/autoscaling/responses.py b/contrib/python/moto/py3/moto/autoscaling/responses.py
new file mode 100644
index 0000000000..cdfcc34440
--- /dev/null
+++ b/contrib/python/moto/py3/moto/autoscaling/responses.py
@@ -0,0 +1,1221 @@
+import datetime
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import (
+ amz_crc32,
+ amzn_request_id,
+ iso_8601_datetime_with_milliseconds,
+)
+from .models import autoscaling_backends
+
+
+class AutoScalingResponse(BaseResponse):
+ @property
+ def autoscaling_backend(self):
+ return autoscaling_backends[self.region]
+
+ def create_launch_configuration(self):
+ instance_monitoring_string = self._get_param("InstanceMonitoring.Enabled")
+ if instance_monitoring_string == "true":
+ instance_monitoring = True
+ else:
+ instance_monitoring = False
+ params = self._get_params()
+ self.autoscaling_backend.create_launch_configuration(
+ name=params.get("LaunchConfigurationName"),
+ image_id=params.get("ImageId"),
+ key_name=params.get("KeyName"),
+ ramdisk_id=params.get("RamdiskId"),
+ kernel_id=params.get("KernelId"),
+ security_groups=self._get_multi_param("SecurityGroups.member"),
+ user_data=params.get("UserData"),
+ instance_type=params.get("InstanceType"),
+ instance_monitoring=instance_monitoring,
+ instance_profile_name=params.get("IamInstanceProfile"),
+ spot_price=params.get("SpotPrice"),
+ ebs_optimized=params.get("EbsOptimized"),
+ associate_public_ip_address=params.get("AssociatePublicIpAddress"),
+ block_device_mappings=params.get("BlockDeviceMappings"),
+ instance_id=params.get("InstanceId"),
+ metadata_options=params.get("MetadataOptions"),
+ classic_link_vpc_id=params.get("ClassicLinkVPCId"),
+ classic_link_vpc_security_groups=params.get("ClassicLinkVPCSecurityGroups"),
+ )
+ template = self.response_template(CREATE_LAUNCH_CONFIGURATION_TEMPLATE)
+ return template.render()
+
+ def describe_launch_configurations(self):
+ names = self._get_multi_param("LaunchConfigurationNames.member")
+ all_launch_configurations = (
+ self.autoscaling_backend.describe_launch_configurations(names)
+ )
+ marker = self._get_param("NextToken")
+ all_names = [lc.name for lc in all_launch_configurations]
+ if marker:
+ start = all_names.index(marker) + 1
+ else:
+ start = 0
+ max_records = self._get_int_param(
+ "MaxRecords", 50
+ ) # the default is 100, but using 50 to make testing easier
+ launch_configurations_resp = all_launch_configurations[
+ start : start + max_records
+ ]
+ next_token = None
+ if len(all_launch_configurations) > start + max_records:
+ next_token = launch_configurations_resp[-1].name
+
+ template = self.response_template(DESCRIBE_LAUNCH_CONFIGURATIONS_TEMPLATE)
+ return template.render(
+ launch_configurations=launch_configurations_resp, next_token=next_token
+ )
+
+ def delete_launch_configuration(self):
+ launch_configurations_name = self.querystring.get("LaunchConfigurationName")[0]
+ self.autoscaling_backend.delete_launch_configuration(launch_configurations_name)
+ template = self.response_template(DELETE_LAUNCH_CONFIGURATION_TEMPLATE)
+ return template.render()
+
+ def create_auto_scaling_group(self):
+ self.autoscaling_backend.create_auto_scaling_group(
+ name=self._get_param("AutoScalingGroupName"),
+ availability_zones=self._get_multi_param("AvailabilityZones.member"),
+ desired_capacity=self._get_int_param("DesiredCapacity"),
+ max_size=self._get_int_param("MaxSize"),
+ min_size=self._get_int_param("MinSize"),
+ instance_id=self._get_param("InstanceId"),
+ launch_config_name=self._get_param("LaunchConfigurationName"),
+ launch_template=self._get_dict_param("LaunchTemplate."),
+ vpc_zone_identifier=self._get_param("VPCZoneIdentifier"),
+ default_cooldown=self._get_int_param("DefaultCooldown"),
+ health_check_period=self._get_int_param("HealthCheckGracePeriod"),
+ health_check_type=self._get_param("HealthCheckType"),
+ load_balancers=self._get_multi_param("LoadBalancerNames.member"),
+ target_group_arns=self._get_multi_param("TargetGroupARNs.member"),
+ placement_group=self._get_param("PlacementGroup"),
+ termination_policies=self._get_multi_param("TerminationPolicies.member"),
+ tags=self._get_list_prefix("Tags.member"),
+ new_instances_protected_from_scale_in=self._get_bool_param(
+ "NewInstancesProtectedFromScaleIn", False
+ ),
+ )
+ template = self.response_template(CREATE_AUTOSCALING_GROUP_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def attach_instances(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ instance_ids = self._get_multi_param("InstanceIds.member")
+ self.autoscaling_backend.attach_instances(group_name, instance_ids)
+ template = self.response_template(ATTACH_INSTANCES_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def set_instance_health(self):
+ instance_id = self._get_param("InstanceId")
+ health_status = self._get_param("HealthStatus")
+ if health_status not in ["Healthy", "Unhealthy"]:
+ raise ValueError("Valid instance health states are: [Healthy, Unhealthy]")
+ self.autoscaling_backend.set_instance_health(instance_id, health_status)
+ template = self.response_template(SET_INSTANCE_HEALTH_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def detach_instances(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ instance_ids = self._get_multi_param("InstanceIds.member")
+ should_decrement_string = self._get_param("ShouldDecrementDesiredCapacity")
+ if should_decrement_string == "true":
+ should_decrement = True
+ else:
+ should_decrement = False
+ detached_instances = self.autoscaling_backend.detach_instances(
+ group_name, instance_ids, should_decrement
+ )
+ template = self.response_template(DETACH_INSTANCES_TEMPLATE)
+ return template.render(detached_instances=detached_instances)
+
+ @amz_crc32
+ @amzn_request_id
+ def attach_load_balancer_target_groups(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ target_group_arns = self._get_multi_param("TargetGroupARNs.member")
+
+ self.autoscaling_backend.attach_load_balancer_target_groups(
+ group_name, target_group_arns
+ )
+ template = self.response_template(ATTACH_LOAD_BALANCER_TARGET_GROUPS_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def describe_load_balancer_target_groups(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ target_group_arns = (
+ self.autoscaling_backend.describe_load_balancer_target_groups(group_name)
+ )
+ template = self.response_template(DESCRIBE_LOAD_BALANCER_TARGET_GROUPS)
+ return template.render(target_group_arns=target_group_arns)
+
+ @amz_crc32
+ @amzn_request_id
+ def detach_load_balancer_target_groups(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ target_group_arns = self._get_multi_param("TargetGroupARNs.member")
+
+ self.autoscaling_backend.detach_load_balancer_target_groups(
+ group_name, target_group_arns
+ )
+ template = self.response_template(DETACH_LOAD_BALANCER_TARGET_GROUPS_TEMPLATE)
+ return template.render()
+
+ def describe_auto_scaling_groups(self):
+ names = self._get_multi_param("AutoScalingGroupNames.member")
+ token = self._get_param("NextToken")
+ all_groups = self.autoscaling_backend.describe_auto_scaling_groups(names)
+ all_names = [group.name for group in all_groups]
+ if token:
+ start = all_names.index(token) + 1
+ else:
+ start = 0
+ max_records = self._get_int_param("MaxRecords", 50)
+ if max_records > 100:
+ raise ValueError
+ groups = all_groups[start : start + max_records]
+ next_token = None
+ if max_records and len(all_groups) > start + max_records:
+ next_token = groups[-1].name
+ template = self.response_template(DESCRIBE_AUTOSCALING_GROUPS_TEMPLATE)
+ return template.render(groups=groups, next_token=next_token)
+
+ def update_auto_scaling_group(self):
+ self.autoscaling_backend.update_auto_scaling_group(
+ name=self._get_param("AutoScalingGroupName"),
+ availability_zones=self._get_multi_param("AvailabilityZones.member"),
+ desired_capacity=self._get_int_param("DesiredCapacity"),
+ max_size=self._get_int_param("MaxSize"),
+ min_size=self._get_int_param("MinSize"),
+ launch_config_name=self._get_param("LaunchConfigurationName"),
+ launch_template=self._get_dict_param("LaunchTemplate."),
+ vpc_zone_identifier=self._get_param("VPCZoneIdentifier"),
+ health_check_period=self._get_int_param("HealthCheckGracePeriod"),
+ health_check_type=self._get_param("HealthCheckType"),
+ new_instances_protected_from_scale_in=self._get_bool_param(
+ "NewInstancesProtectedFromScaleIn", None
+ ),
+ )
+ template = self.response_template(UPDATE_AUTOSCALING_GROUP_TEMPLATE)
+ return template.render()
+
+ def delete_auto_scaling_group(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ self.autoscaling_backend.delete_auto_scaling_group(group_name)
+ template = self.response_template(DELETE_AUTOSCALING_GROUP_TEMPLATE)
+ return template.render()
+
+ def set_desired_capacity(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ desired_capacity = self._get_int_param("DesiredCapacity")
+ self.autoscaling_backend.set_desired_capacity(group_name, desired_capacity)
+ template = self.response_template(SET_DESIRED_CAPACITY_TEMPLATE)
+ return template.render()
+
+ def create_or_update_tags(self):
+ tags = self._get_list_prefix("Tags.member")
+
+ self.autoscaling_backend.create_or_update_tags(tags)
+ template = self.response_template(UPDATE_AUTOSCALING_GROUP_TEMPLATE)
+ return template.render()
+
+ def delete_tags(self):
+ tags = self._get_list_prefix("Tags.member")
+
+ self.autoscaling_backend.delete_tags(tags)
+ template = self.response_template(UPDATE_AUTOSCALING_GROUP_TEMPLATE)
+ return template.render()
+
+ def describe_auto_scaling_instances(self):
+ instance_states = self.autoscaling_backend.describe_auto_scaling_instances(
+ instance_ids=self._get_multi_param("InstanceIds.member")
+ )
+ template = self.response_template(DESCRIBE_AUTOSCALING_INSTANCES_TEMPLATE)
+ return template.render(instance_states=instance_states)
+
+ def put_lifecycle_hook(self):
+ lifecycle_hook = self.autoscaling_backend.create_lifecycle_hook(
+ name=self._get_param("LifecycleHookName"),
+ as_name=self._get_param("AutoScalingGroupName"),
+ transition=self._get_param("LifecycleTransition"),
+ timeout=self._get_int_param("HeartbeatTimeout"),
+ result=self._get_param("DefaultResult"),
+ )
+ template = self.response_template(CREATE_LIFECYLE_HOOK_TEMPLATE)
+ return template.render(lifecycle_hook=lifecycle_hook)
+
+ def describe_lifecycle_hooks(self):
+ lifecycle_hooks = self.autoscaling_backend.describe_lifecycle_hooks(
+ as_name=self._get_param("AutoScalingGroupName"),
+ lifecycle_hook_names=self._get_multi_param("LifecycleHookNames.member"),
+ )
+ template = self.response_template(DESCRIBE_LIFECYCLE_HOOKS_TEMPLATE)
+ return template.render(lifecycle_hooks=lifecycle_hooks)
+
+ def delete_lifecycle_hook(self):
+ as_name = self._get_param("AutoScalingGroupName")
+ name = self._get_param("LifecycleHookName")
+ self.autoscaling_backend.delete_lifecycle_hook(as_name, name)
+ template = self.response_template(DELETE_LIFECYCLE_HOOK_TEMPLATE)
+ return template.render()
+
+ def put_scaling_policy(self):
+ params = self._get_params()
+ policy = self.autoscaling_backend.put_scaling_policy(
+ name=params.get("PolicyName"),
+ policy_type=params.get("PolicyType", "SimpleScaling"),
+ metric_aggregation_type=params.get("MetricAggregationType"),
+ adjustment_type=params.get("AdjustmentType"),
+ as_name=params.get("AutoScalingGroupName"),
+ min_adjustment_magnitude=params.get("MinAdjustmentMagnitude"),
+ scaling_adjustment=self._get_int_param("ScalingAdjustment"),
+ cooldown=self._get_int_param("Cooldown"),
+ target_tracking_config=params.get("TargetTrackingConfiguration", {}),
+ step_adjustments=params.get("StepAdjustments", []),
+ estimated_instance_warmup=params.get("EstimatedInstanceWarmup"),
+ predictive_scaling_configuration=params.get(
+ "PredictiveScalingConfiguration", {}
+ ),
+ )
+ template = self.response_template(CREATE_SCALING_POLICY_TEMPLATE)
+ return template.render(policy=policy)
+
+ def describe_policies(self):
+ policies = self.autoscaling_backend.describe_policies(
+ autoscaling_group_name=self._get_param("AutoScalingGroupName"),
+ policy_names=self._get_multi_param("PolicyNames.member"),
+ policy_types=self._get_multi_param("PolicyTypes.member"),
+ )
+ template = self.response_template(DESCRIBE_SCALING_POLICIES_TEMPLATE)
+ return template.render(policies=policies)
+
+ def delete_policy(self):
+ group_name = self._get_param("PolicyName")
+ self.autoscaling_backend.delete_policy(group_name)
+ template = self.response_template(DELETE_POLICY_TEMPLATE)
+ return template.render()
+
+ def execute_policy(self):
+ group_name = self._get_param("PolicyName")
+ self.autoscaling_backend.execute_policy(group_name)
+ template = self.response_template(EXECUTE_POLICY_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def attach_load_balancers(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ load_balancer_names = self._get_multi_param("LoadBalancerNames.member")
+ self.autoscaling_backend.attach_load_balancers(group_name, load_balancer_names)
+ template = self.response_template(ATTACH_LOAD_BALANCERS_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def describe_load_balancers(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ load_balancers = self.autoscaling_backend.describe_load_balancers(group_name)
+ template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE)
+ return template.render(load_balancers=load_balancers)
+
+ @amz_crc32
+ @amzn_request_id
+ def detach_load_balancers(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ load_balancer_names = self._get_multi_param("LoadBalancerNames.member")
+ self.autoscaling_backend.detach_load_balancers(group_name, load_balancer_names)
+ template = self.response_template(DETACH_LOAD_BALANCERS_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def enter_standby(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ instance_ids = self._get_multi_param("InstanceIds.member")
+ should_decrement_string = self._get_param("ShouldDecrementDesiredCapacity")
+ if should_decrement_string == "true":
+ should_decrement = True
+ else:
+ should_decrement = False
+ (
+ standby_instances,
+ original_size,
+ desired_capacity,
+ ) = self.autoscaling_backend.enter_standby_instances(
+ group_name, instance_ids, should_decrement
+ )
+ template = self.response_template(ENTER_STANDBY_TEMPLATE)
+ return template.render(
+ standby_instances=standby_instances,
+ should_decrement=should_decrement,
+ original_size=original_size,
+ desired_capacity=desired_capacity,
+ timestamp=iso_8601_datetime_with_milliseconds(datetime.datetime.utcnow()),
+ )
+
+ @amz_crc32
+ @amzn_request_id
+ def exit_standby(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ instance_ids = self._get_multi_param("InstanceIds.member")
+ (
+ standby_instances,
+ original_size,
+ desired_capacity,
+ ) = self.autoscaling_backend.exit_standby_instances(group_name, instance_ids)
+ template = self.response_template(EXIT_STANDBY_TEMPLATE)
+ return template.render(
+ standby_instances=standby_instances,
+ original_size=original_size,
+ desired_capacity=desired_capacity,
+ timestamp=iso_8601_datetime_with_milliseconds(datetime.datetime.utcnow()),
+ )
+
+ def suspend_processes(self):
+ autoscaling_group_name = self._get_param("AutoScalingGroupName")
+ scaling_processes = self._get_multi_param("ScalingProcesses.member")
+ self.autoscaling_backend.suspend_processes(
+ autoscaling_group_name, scaling_processes
+ )
+ template = self.response_template(SUSPEND_PROCESSES_TEMPLATE)
+ return template.render()
+
+ def resume_processes(self):
+ autoscaling_group_name = self._get_param("AutoScalingGroupName")
+ scaling_processes = self._get_multi_param("ScalingProcesses.member")
+ self.autoscaling_backend.resume_processes(
+ autoscaling_group_name, scaling_processes
+ )
+ template = self.response_template(RESUME_PROCESSES_TEMPLATE)
+ return template.render()
+
+ def set_instance_protection(self):
+ group_name = self._get_param("AutoScalingGroupName")
+ instance_ids = self._get_multi_param("InstanceIds.member")
+ protected_from_scale_in = self._get_bool_param("ProtectedFromScaleIn")
+ self.autoscaling_backend.set_instance_protection(
+ group_name, instance_ids, protected_from_scale_in
+ )
+ template = self.response_template(SET_INSTANCE_PROTECTION_TEMPLATE)
+ return template.render()
+
+ @amz_crc32
+ @amzn_request_id
+ def terminate_instance_in_auto_scaling_group(self):
+ instance_id = self._get_param("InstanceId")
+ should_decrement_string = self._get_param("ShouldDecrementDesiredCapacity")
+ if should_decrement_string == "true":
+ should_decrement = True
+ else:
+ should_decrement = False
+ (
+ instance,
+ original_size,
+ desired_capacity,
+ ) = self.autoscaling_backend.terminate_instance(instance_id, should_decrement)
+ template = self.response_template(TERMINATE_INSTANCES_TEMPLATE)
+ return template.render(
+ instance=instance,
+ should_decrement=should_decrement,
+ original_size=original_size,
+ desired_capacity=desired_capacity,
+ timestamp=iso_8601_datetime_with_milliseconds(datetime.datetime.utcnow()),
+ )
+
+ def describe_tags(self):
+ filters = self._get_params().get("Filters", [])
+ tags = self.autoscaling_backend.describe_tags(filters=filters)
+ template = self.response_template(DESCRIBE_TAGS_TEMPLATE)
+ return template.render(tags=tags, next_token=None)
+
+
+CREATE_LAUNCH_CONFIGURATION_TEMPLATE = """<CreateLaunchConfigurationResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<ResponseMetadata>
+ <RequestId>7c6e177f-f082-11e1-ac58-3714bEXAMPLE</RequestId>
+</ResponseMetadata>
+</CreateLaunchConfigurationResponse>"""
+
+DESCRIBE_LAUNCH_CONFIGURATIONS_TEMPLATE = """<DescribeLaunchConfigurationsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <DescribeLaunchConfigurationsResult>
+ <LaunchConfigurations>
+ {% for launch_configuration in launch_configurations %}
+ <member>
+ <AssociatePublicIpAddress>{{ 'true' if launch_configuration.associate_public_ip_address else 'false' }}</AssociatePublicIpAddress>
+ {% if launch_configuration.classic_link_vpc_id %}
+ <ClassicLinkVPCId>{{ launch_configuration.classic_link_vpc_id }}</ClassicLinkVPCId>
+ {% endif %}
+ {% if launch_configuration.classic_link_vpc_security_groups %}
+ <ClassicLinkVPCSecurityGroups>
+ {% for sg in launch_configuration.classic_link_vpc_security_groups %}
+ <member>{{ sg }}</member>
+ {% endfor %}
+ </ClassicLinkVPCSecurityGroups>
+ {% endif %}
+ <SecurityGroups>
+ {% for security_group in launch_configuration.security_groups %}
+ <member>{{ security_group }}</member>
+ {% endfor %}
+ </SecurityGroups>
+ <CreatedTime>2013-01-21T23:04:42.200Z</CreatedTime>
+ {% if launch_configuration.kernel_id %}
+ <KernelId>{{ launch_configuration.kernel_id }}</KernelId>
+ {% else %}
+ <KernelId/>
+ {% endif %}
+ {% if launch_configuration.instance_profile_name %}
+ <IamInstanceProfile>{{ launch_configuration.instance_profile_name }}</IamInstanceProfile>
+ {% endif %}
+ <LaunchConfigurationName>{{ launch_configuration.name }}</LaunchConfigurationName>
+ {% if launch_configuration.user_data %}
+ <UserData>{{ launch_configuration.user_data }}</UserData>
+ {% else %}
+ <UserData/>
+ {% endif %}
+ <InstanceType>{{ launch_configuration.instance_type }}</InstanceType>
+ <LaunchConfigurationARN>{{ launch_configuration.arn }}</LaunchConfigurationARN>
+ {% if launch_configuration.block_device_mappings %}
+ <BlockDeviceMappings>
+ {% for mount_point, mapping in launch_configuration.block_device_mappings.items() %}
+ <member>
+ <DeviceName>{{ mount_point }}</DeviceName>
+ {% if mapping.ephemeral_name %}
+ <VirtualName>{{ mapping.ephemeral_name }}</VirtualName>
+ {% elif mapping.no_device %}
+ <NoDevice>true</NoDevice>
+ {% else %}
+ <Ebs>
+ {% if mapping.snapshot_id %}
+ <SnapshotId>{{ mapping.snapshot_id }}</SnapshotId>
+ {% endif %}
+ {% if mapping.size %}
+ <VolumeSize>{{ mapping.size }}</VolumeSize>
+ {% endif %}
+ {% if mapping.iops %}
+ <Iops>{{ mapping.iops }}</Iops>
+ {% endif %}
+ {% if mapping.throughput %}
+ <Throughput>{{ mapping.throughput }}</Throughput>
+ {% endif %}
+ {% if mapping.delete_on_termination is not none %}
+ <DeleteOnTermination>{{ mapping.delete_on_termination }}</DeleteOnTermination>
+ {% endif %}
+ {% if mapping.volume_type %}
+ <VolumeType>{{ mapping.volume_type }}</VolumeType>
+ {% endif %}
+ {% if mapping.encrypted %}
+ <Encrypted>{{ mapping.encrypted }}</Encrypted>
+ {% endif %}
+ </Ebs>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </BlockDeviceMappings>
+ {% else %}
+ <BlockDeviceMappings/>
+ {% endif %}
+ <ImageId>{{ launch_configuration.image_id }}</ImageId>
+ {% if launch_configuration.key_name %}
+ <KeyName>{{ launch_configuration.key_name }}</KeyName>
+ {% else %}
+ <KeyName/>
+ {% endif %}
+ {% if launch_configuration.ramdisk_id %}
+ <RamdiskId>{{ launch_configuration.ramdisk_id }}</RamdiskId>
+ {% else %}
+ <RamdiskId/>
+ {% endif %}
+ <EbsOptimized>{{ launch_configuration.ebs_optimized }}</EbsOptimized>
+ <InstanceMonitoring>
+ <Enabled>{{ launch_configuration.instance_monitoring_enabled }}</Enabled>
+ </InstanceMonitoring>
+ {% if launch_configuration.spot_price %}
+ <SpotPrice>{{ launch_configuration.spot_price }}</SpotPrice>
+ {% endif %}
+ {% if launch_configuration.metadata_options %}
+ <MetadataOptions>
+ <HttpTokens>{{ launch_configuration.metadata_options.get("HttpTokens") }}</HttpTokens>
+ <HttpPutResponseHopLimit>{{ launch_configuration.metadata_options.get("HttpPutResponseHopLimit") }}</HttpPutResponseHopLimit>
+ <HttpEndpoint>{{ launch_configuration.metadata_options.get("HttpEndpoint") }}</HttpEndpoint>
+ </MetadataOptions>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </LaunchConfigurations>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </DescribeLaunchConfigurationsResult>
+ <ResponseMetadata>
+ <RequestId>d05a22f8-b690-11e2-bf8e-2113fEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeLaunchConfigurationsResponse>"""
+
+DELETE_LAUNCH_CONFIGURATION_TEMPLATE = """<DeleteLaunchConfigurationResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>7347261f-97df-11e2-8756-35eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteLaunchConfigurationResponse>"""
+
+CREATE_AUTOSCALING_GROUP_TEMPLATE = """<CreateAutoScalingGroupResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<ResponseMetadata>
+<RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+</ResponseMetadata>
+</CreateAutoScalingGroupResponse>"""
+
+ATTACH_LOAD_BALANCER_TARGET_GROUPS_TEMPLATE = """<AttachLoadBalancerTargetGroupsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<AttachLoadBalancerTargetGroupsResult>
+</AttachLoadBalancerTargetGroupsResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</AttachLoadBalancerTargetGroupsResponse>"""
+
+ATTACH_INSTANCES_TEMPLATE = """<AttachInstancesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<AttachInstancesResult>
+</AttachInstancesResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</AttachInstancesResponse>"""
+
+DESCRIBE_LOAD_BALANCER_TARGET_GROUPS = """<DescribeLoadBalancerTargetGroupsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DescribeLoadBalancerTargetGroupsResult>
+ <LoadBalancerTargetGroups>
+ {% for arn in target_group_arns %}
+ <member>
+ <LoadBalancerTargetGroupARN>{{ arn }}</LoadBalancerTargetGroupARN>
+ <State>Added</State>
+ </member>
+ {% endfor %}
+ </LoadBalancerTargetGroups>
+</DescribeLoadBalancerTargetGroupsResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</DescribeLoadBalancerTargetGroupsResponse>"""
+
+DETACH_INSTANCES_TEMPLATE = """<DetachInstancesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DetachInstancesResult>
+ <Activities>
+ {% for instance in detached_instances %}
+ <member>
+ <ActivityId>5091cb52-547a-47ce-a236-c9ccbc2cb2c9EXAMPLE</ActivityId>
+ <AutoScalingGroupName>{{ group_name }}</AutoScalingGroupName>
+ <Cause>
+ At 2017-10-15T15:55:21Z instance {{ instance.instance.id }} was detached in response to a user request.
+ </Cause>
+ <Description>Detaching EC2 instance: {{ instance.instance.id }}</Description>
+ <StartTime>2017-10-15T15:55:21Z</StartTime>
+ <EndTime>2017-10-15T15:55:21Z</EndTime>
+ <StatusCode>InProgress</StatusCode>
+ <StatusMessage>InProgress</StatusMessage>
+ <Progress>50</Progress>
+ <Details>details</Details>
+ </member>
+ {% endfor %}
+ </Activities>
+</DetachInstancesResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</DetachInstancesResponse>"""
+
+DETACH_LOAD_BALANCER_TARGET_GROUPS_TEMPLATE = """<DetachLoadBalancerTargetGroupsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DetachLoadBalancerTargetGroupsResult>
+</DetachLoadBalancerTargetGroupsResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</DetachLoadBalancerTargetGroupsResponse>"""
+
+DESCRIBE_AUTOSCALING_GROUPS_TEMPLATE = """<DescribeAutoScalingGroupsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DescribeAutoScalingGroupsResult>
+ <AutoScalingGroups>
+ {% for group in groups %}
+ <member>
+ <Tags>
+ {% for tag in group.tags %}
+ <member>
+ <ResourceType>{{ tag.resource_type or tag.ResourceType }}</ResourceType>
+ <ResourceId>{{ tag.resource_id or tag.ResourceId }}</ResourceId>
+ <PropagateAtLaunch>{{ tag.propagate_at_launch or tag.PropagateAtLaunch }}</PropagateAtLaunch>
+ <Key>{{ tag.key or tag.Key }}</Key>
+ <Value>{{ tag.value or tag.Value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ <SuspendedProcesses>
+ {% for suspended_process in group.suspended_processes %}
+ <member>
+ <ProcessName>{{suspended_process}}</ProcessName>
+ <SuspensionReason></SuspensionReason>
+ </member>
+ {% endfor %}
+ </SuspendedProcesses>
+ <AutoScalingGroupName>{{ group.name }}</AutoScalingGroupName>
+ <HealthCheckType>{{ group.health_check_type }}</HealthCheckType>
+ <CreatedTime>2013-05-06T17:47:15.107Z</CreatedTime>
+ <EnabledMetrics/>
+ {% if group.launch_config_name %}
+ <LaunchConfigurationName>{{ group.launch_config_name }}</LaunchConfigurationName>
+ {% elif group.launch_template %}
+ <LaunchTemplate>
+ <LaunchTemplateId>{{ group.launch_template.id }}</LaunchTemplateId>
+ <Version>{{ group.launch_template_version }}</Version>
+ <LaunchTemplateName>{{ group.launch_template.name }}</LaunchTemplateName>
+ </LaunchTemplate>
+ {% endif %}
+ <Instances>
+ {% for instance_state in group.instance_states %}
+ <member>
+ <HealthStatus>{{ instance_state.health_status }}</HealthStatus>
+ <AvailabilityZone>{{ instance_state.instance.placement }}</AvailabilityZone>
+ <InstanceId>{{ instance_state.instance.id }}</InstanceId>
+ <InstanceType>{{ instance_state.instance.instance_type }}</InstanceType>
+ {% if group.launch_config_name %}
+ <LaunchConfigurationName>{{ group.launch_config_name }}</LaunchConfigurationName>
+ {% elif group.launch_template %}
+ <LaunchTemplate>
+ <LaunchTemplateId>{{ group.launch_template.id }}</LaunchTemplateId>
+ <Version>{{ group.launch_template_version }}</Version>
+ <LaunchTemplateName>{{ group.launch_template.name }}</LaunchTemplateName>
+ </LaunchTemplate>
+ {% endif %}
+ <LifecycleState>{{ instance_state.lifecycle_state }}</LifecycleState>
+ <ProtectedFromScaleIn>{{ instance_state.protected_from_scale_in|string|lower }}</ProtectedFromScaleIn>
+ </member>
+ {% endfor %}
+ </Instances>
+ <DesiredCapacity>{{ group.desired_capacity }}</DesiredCapacity>
+ <AvailabilityZones>
+ {% for availability_zone in group.availability_zones %}
+ <member>{{ availability_zone }}</member>
+ {% endfor %}
+ </AvailabilityZones>
+ {% if group.load_balancers %}
+ <LoadBalancerNames>
+ {% for load_balancer in group.load_balancers %}
+ <member>{{ load_balancer }}</member>
+ {% endfor %}
+ </LoadBalancerNames>
+ {% else %}
+ <LoadBalancerNames/>
+ {% endif %}
+ {% if group.target_group_arns %}
+ <TargetGroupARNs>
+ {% for target_group_arn in group.target_group_arns %}
+ <member>{{ target_group_arn }}</member>
+ {% endfor %}
+ </TargetGroupARNs>
+ {% else %}
+ <TargetGroupARNs/>
+ {% endif %}
+ <MinSize>{{ group.min_size }}</MinSize>
+ {% if group.vpc_zone_identifier %}
+ <VPCZoneIdentifier>{{ group.vpc_zone_identifier }}</VPCZoneIdentifier>
+ {% else %}
+ <VPCZoneIdentifier/>
+ {% endif %}
+ <HealthCheckGracePeriod>{{ group.health_check_period }}</HealthCheckGracePeriod>
+ <DefaultCooldown>{{ group.default_cooldown }}</DefaultCooldown>
+ <AutoScalingGroupARN>{{ group.arn }}</AutoScalingGroupARN>
+ {% if group.termination_policies %}
+ <TerminationPolicies>
+ {% for policy in group.termination_policies %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </TerminationPolicies>
+ {% else %}
+ <TerminationPolicies/>
+ {% endif %}
+ <MaxSize>{{ group.max_size }}</MaxSize>
+ {% if group.placement_group %}
+ <PlacementGroup>{{ group.placement_group }}</PlacementGroup>
+ {% endif %}
+ <NewInstancesProtectedFromScaleIn>{{ group.new_instances_protected_from_scale_in|string|lower }}</NewInstancesProtectedFromScaleIn>
+ </member>
+ {% endfor %}
+ </AutoScalingGroups>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </DescribeAutoScalingGroupsResult>
+ <ResponseMetadata>
+ <RequestId>0f02a07d-b677-11e2-9eb0-dd50EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeAutoScalingGroupsResponse>"""
+
+UPDATE_AUTOSCALING_GROUP_TEMPLATE = """<UpdateAutoScalingGroupResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>adafead0-ab8a-11e2-ba13-ab0ccEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateAutoScalingGroupResponse>"""
+
+DELETE_AUTOSCALING_GROUP_TEMPLATE = """<DeleteAutoScalingGroupResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteAutoScalingGroupResponse>"""
+
+DESCRIBE_AUTOSCALING_INSTANCES_TEMPLATE = """<DescribeAutoScalingInstancesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <DescribeAutoScalingInstancesResult>
+ <AutoScalingInstances>
+ {% for instance_state in instance_states %}
+ <member>
+ <HealthStatus>{{ instance_state.health_status }}</HealthStatus>
+ <AutoScalingGroupName>{{ instance_state.instance.autoscaling_group.name }}</AutoScalingGroupName>
+ <AvailabilityZone>{{ instance_state.instance.placement }}</AvailabilityZone>
+ <InstanceId>{{ instance_state.instance.id }}</InstanceId>
+ <InstanceType>{{ instance_state.instance.instance_type }}</InstanceType>
+ {% if instance_state.instance.autoscaling_group.launch_config_name %}
+ <LaunchConfigurationName>{{ instance_state.instance.autoscaling_group.launch_config_name }}</LaunchConfigurationName>
+ {% elif instance_state.instance.autoscaling_group.launch_template %}
+ <LaunchTemplate>
+ <LaunchTemplateId>{{ instance_state.instance.autoscaling_group.launch_template.id }}</LaunchTemplateId>
+ <Version>{{ instance_state.instance.autoscaling_group.launch_template_version }}</Version>
+ <LaunchTemplateName>{{ instance_state.instance.autoscaling_group.launch_template.name }}</LaunchTemplateName>
+ </LaunchTemplate>
+ {% endif %}
+ <LifecycleState>{{ instance_state.lifecycle_state }}</LifecycleState>
+ <ProtectedFromScaleIn>{{ instance_state.protected_from_scale_in|string|lower }}</ProtectedFromScaleIn>
+ </member>
+ {% endfor %}
+ </AutoScalingInstances>
+ </DescribeAutoScalingInstancesResult>
+ <ResponseMetadata>
+ <RequestId>df992dc3-b72f-11e2-81e1-750aa6EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeAutoScalingInstancesResponse>"""
+
+CREATE_LIFECYLE_HOOK_TEMPLATE = """<PutLifecycleHookResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <PutLifecycleHookResult/>
+ <ResponseMetadata>
+ <RequestId>3cfc6fef-c08b-11e2-a697-2922EXAMPLE</RequestId>
+ </ResponseMetadata>
+</PutLifecycleHookResponse>"""
+
+DESCRIBE_LIFECYCLE_HOOKS_TEMPLATE = """<DescribeLifecycleHooksResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <DescribeLifecycleHooksResult>
+ <LifecycleHooks>
+ {% for lifecycle_hook in lifecycle_hooks %}
+ <member>
+ <AutoScalingGroupName>{{ lifecycle_hook.as_name }}</AutoScalingGroupName>
+ <RoleARN>arn:aws:iam::1234567890:role/my-auto-scaling-role</RoleARN>
+ <LifecycleTransition>{{ lifecycle_hook.transition }}</LifecycleTransition>
+ <GlobalTimeout>172800</GlobalTimeout>
+ <LifecycleHookName>{{ lifecycle_hook.name }}</LifecycleHookName>
+ <HeartbeatTimeout>{{ lifecycle_hook.timeout }}</HeartbeatTimeout>
+ <DefaultResult>{{ lifecycle_hook.result }}</DefaultResult>
+ <NotificationTargetARN>arn:aws:sqs:us-east-1:123456789012:my-queue</NotificationTargetARN>
+ </member>
+ {% endfor %}
+ </LifecycleHooks>
+ </DescribeLifecycleHooksResult>
+ <ResponseMetadata>
+ <RequestId>ec3bffad-b739-11e2-b38d-15fbEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeLifecycleHooksResponse>"""
+
+DELETE_LIFECYCLE_HOOK_TEMPLATE = """<DeleteLifecycleHookResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <DeleteLifecycleHookResult>
+ </DeleteLifecycleHookResult>
+ <ResponseMetadata>
+ <RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteLifecycleHookResponse>"""
+
+CREATE_SCALING_POLICY_TEMPLATE = """<PutScalingPolicyResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <PutScalingPolicyResult>
+ <PolicyARN>arn:aws:autoscaling:us-east-1:803981987763:scalingPolicy:b0dcf5e8
+-02e6-4e31-9719-0675d0dc31ae:autoScalingGroupName/my-test-asg:policyName/my-scal
+eout-policy</PolicyARN>
+ </PutScalingPolicyResult>
+ <ResponseMetadata>
+ <RequestId>3cfc6fef-c08b-11e2-a697-2922EXAMPLE</RequestId>
+ </ResponseMetadata>
+</PutScalingPolicyResponse>"""
+
+DESCRIBE_SCALING_POLICIES_TEMPLATE = """<DescribePoliciesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <DescribePoliciesResult>
+ <ScalingPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyARN>{{ policy.arn }}</PolicyARN>
+ {% if policy.adjustment_type %}
+ <AdjustmentType>{{ policy.adjustment_type }}</AdjustmentType>
+ {% endif %}
+ {% if policy.scaling_adjustment %}
+ <ScalingAdjustment>{{ policy.scaling_adjustment }}</ScalingAdjustment>
+ {% endif %}
+ {% if policy.min_adjustment_magnitude %}
+ <MinAdjustmentMagnitude>{{ policy.min_adjustment_magnitude }}</MinAdjustmentMagnitude>
+ {% endif %}
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyType>{{ policy.policy_type }}</PolicyType>
+ <MetricAggregationType>{{ policy.metric_aggregation_type }}</MetricAggregationType>
+ <AutoScalingGroupName>{{ policy.as_name }}</AutoScalingGroupName>
+ {% if policy.policy_type == 'SimpleScaling' %}
+ <Cooldown>{{ policy.cooldown }}</Cooldown>
+ {% endif %}
+ {% if policy.policy_type == 'TargetTrackingScaling' %}
+ <TargetTrackingConfiguration>
+ {% if policy.target_tracking_config.get("PredefinedMetricSpecification") %}
+ <PredefinedMetricSpecification>
+ <PredefinedMetricType>{{ policy.target_tracking_config.get("PredefinedMetricSpecification", {}).get("PredefinedMetricType", "") }}</PredefinedMetricType>
+ {% if policy.target_tracking_config.get("PredefinedMetricSpecification", {}).get("ResourceLabel") %}
+ <ResourceLabel>{{ policy.target_tracking_config.get("PredefinedMetricSpecification", {}).get("ResourceLabel") }}</ResourceLabel>
+ {% endif %}
+ </PredefinedMetricSpecification>
+ {% endif %}
+ {% if policy.target_tracking_config.get("CustomizedMetricSpecification") %}
+ <CustomizedMetricSpecification>
+ <MetricName>{{ policy.target_tracking_config["CustomizedMetricSpecification"].get("MetricName") }}</MetricName>
+ <Namespace>{{ policy.target_tracking_config["CustomizedMetricSpecification"].get("Namespace") }}</Namespace>
+ <Dimensions>
+ {% for dim in policy.target_tracking_config["CustomizedMetricSpecification"].get("Dimensions", []) %}
+ <member>
+ <Name>{{ dim.get("Name") }}</Name>
+ <Value>{{ dim.get("Value") }}</Value>
+ </member>
+ {% endfor %}
+ </Dimensions>
+ <Statistic>{{ policy.target_tracking_config["CustomizedMetricSpecification"].get("Statistic") }}</Statistic>
+ {% if policy.target_tracking_config["CustomizedMetricSpecification"].get("Unit") %}
+ <Unit>{{ policy.target_tracking_config["CustomizedMetricSpecification"].get("Unit") }}</Unit>
+ {% endif %}
+ </CustomizedMetricSpecification>
+ {% endif %}
+ <TargetValue>{{ policy.target_tracking_config.get("TargetValue") }}</TargetValue>
+ </TargetTrackingConfiguration>
+ {% endif %}
+ {% if policy.policy_type == 'StepScaling' %}
+ <StepAdjustments>
+ {% for step in policy.step_adjustments %}
+ <member>
+ {% if "MetricIntervalLowerBound" in step %}
+ <MetricIntervalLowerBound>{{ step.get("MetricIntervalLowerBound") }}</MetricIntervalLowerBound>
+ {% endif %}
+ {% if "MetricIntervalUpperBound" in step %}
+ <MetricIntervalUpperBound>{{ step.get("MetricIntervalUpperBound") }}</MetricIntervalUpperBound>
+ {% endif %}
+ {% if "ScalingAdjustment" in step %}
+ <ScalingAdjustment>{{ step.get("ScalingAdjustment") }}</ScalingAdjustment>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </StepAdjustments>
+ {% endif %}
+ {% if policy.estimated_instance_warmup %}
+ <EstimatedInstanceWarmup>{{ policy.estimated_instance_warmup }}</EstimatedInstanceWarmup>
+ {% endif %}
+ {% if policy.policy_type == 'PredictiveScaling' %}
+ <PredictiveScalingConfiguration>
+ <MetricSpecifications>
+ {% for config in policy.predictive_scaling_configuration.get("MetricSpecifications", []) %}
+ <member>
+ <TargetValue>{{ config.get("TargetValue") }}</TargetValue>
+ {% if config.get("PredefinedMetricPairSpecification", {}).get("PredefinedMetricType") %}
+ <PredefinedMetricPairSpecification>
+ <PredefinedMetricType>{{ config.get("PredefinedMetricPairSpecification", {}).get("PredefinedMetricType") }}</PredefinedMetricType>
+ <ResourceLabel>{{ config.get("PredefinedMetricPairSpecification", {}).get("ResourceLabel", "") }}</ResourceLabel>
+ </PredefinedMetricPairSpecification>
+ {% endif %}
+ {% if config.get("PredefinedScalingMetricSpecification", {}).get("PredefinedMetricType") %}
+ <PredefinedScalingMetricSpecification>
+ <PredefinedMetricType>{{ config.get("PredefinedScalingMetricSpecification", {}).get("PredefinedMetricType", "") }}</PredefinedMetricType>
+ <ResourceLabel>{{ config.get("PredefinedScalingMetricSpecification", {}).get("ResourceLabel", "") }}</ResourceLabel>
+ </PredefinedScalingMetricSpecification>
+ {% endif %}
+ {% if config.get("PredefinedLoadMetricSpecification", {}).get("PredefinedMetricType") %}
+ <PredefinedLoadMetricSpecification>
+ <PredefinedMetricType>{{ config.get("PredefinedLoadMetricSpecification", {}).get("PredefinedMetricType", "") }}</PredefinedMetricType>
+ <ResourceLabel>{{ config.get("PredefinedLoadMetricSpecification", {}).get("ResourceLabel", "") }}</ResourceLabel>
+ </PredefinedLoadMetricSpecification>
+ {% endif %}
+ {% if config.get("CustomizedScalingMetricSpecification", {}).get("MetricDataQueries") %}
+ <CustomizedScalingMetricSpecification>
+ <MetricDataQueries>
+ {% for query in config.get("CustomizedScalingMetricSpecification", {}).get("MetricDataQueries", []) %}
+ <member>
+ <Id>{{ query.get("Id") }}</Id>
+ <Expression>{{ query.get("Expression") }}</Expression>
+ <MetricStat>
+ <Metric>
+ <Namespace>{{ query.get("MetricStat", {}).get("Metric", {}).get("Namespace") }}</Namespace>
+ <MetricName>{{ query.get("MetricStat", {}).get("Metric", {}).get("MetricName") }}</MetricName>
+ <Dimensions>
+ {% for dim in query.get("MetricStat", {}).get("Metric", {}).get("Dimensions", []) %}
+ <Name>{{ dim.get("Name") }}</Name>
+ <Value>{{ dim.get("Value") }}</Value>
+ {% endfor %}
+ </Dimensions>
+ </Metric>
+ <Stat>{{ query.get("MetricStat", {}).get("Stat") }}</Stat>
+ <Unit>{{ query.get("MetricStat", {}).get("Unit") }}</Unit>
+ </MetricStat>
+ <Label>{{ query.get("Label") }}</Label>
+ <ReturnData>{{ 'true' if query.get("ReturnData") else 'false' }}</ReturnData>
+ </member>
+ {% endfor %}
+ </MetricDataQueries>
+ </CustomizedScalingMetricSpecification>
+ {% endif %}
+ {% if config.get("CustomizedLoadMetricSpecification", {}).get("MetricDataQueries") %}
+ <CustomizedLoadMetricSpecification>
+ <MetricDataQueries>
+ {% for query in config.get("CustomizedLoadMetricSpecification", {}).get("MetricDataQueries", []) %}
+ <member>
+ <Id>{{ query.get("Id") }}</Id>
+ <Expression>{{ query.get("Expression") }}</Expression>
+ <MetricStat>
+ <Metric>
+ <Namespace>{{ query.get("MetricStat", {}).get("Metric", {}).get("Namespace") }}</Namespace>
+ <MetricName>{{ query.get("MetricStat", {}).get("Metric", {}).get("MetricName") }}</MetricName>
+ <Dimensions>
+ {% for dim in query.get("MetricStat", {}).get("Metric", {}).get("Dimensions", []) %}
+ <Name>{{ dim.get("Name") }}</Name>
+ <Value>{{ dim.get("Value") }}</Value>
+ {% endfor %}
+ </Dimensions>
+ </Metric>
+ <Stat>{{ query.get("MetricStat", {}).get("Stat") }}</Stat>
+ <Unit>{{ query.get("MetricStat", {}).get("Unit") }}</Unit>
+ </MetricStat>
+ <Label>{{ query.get("Label") }}</Label>
+ <ReturnData>{{ 'true' if query.get("ReturnData") else 'false' }}</ReturnData>
+ </member>
+ {% endfor %}
+ </MetricDataQueries>
+ </CustomizedLoadMetricSpecification>
+ {% endif %}
+ {% if config.get("CustomizedCapacityMetricSpecification", {}).get("MetricDataQueries") %}
+ <CustomizedCapacityMetricSpecification>
+ <MetricDataQueries>
+ {% for query in config.get("CustomizedCapacityMetricSpecification", {}).get("MetricDataQueries", []) %}
+ <member>
+ <Id>{{ query.get("Id") }}</Id>
+ <Expression>{{ query.get("Expression") }}</Expression>
+ <MetricStat>
+ <Metric>
+ <Namespace>{{ query.get("MetricStat", {}).get("Metric", {}).get("Namespace") }}</Namespace>
+ <MetricName>{{ query.get("MetricStat", {}).get("Metric", {}).get("MetricName") }}</MetricName>
+ <Dimensions>
+ {% for dim in query.get("MetricStat", {}).get("Metric", {}).get("Dimensions", []) %}
+ <Name>{{ dim.get("Name") }}</Name>
+ <Value>{{ dim.get("Value") }}</Value>
+ {% endfor %}
+ </Dimensions>
+ </Metric>
+ <Stat>{{ query.get("MetricStat", {}).get("Stat") }}</Stat>
+ <Unit>{{ query.get("MetricStat", {}).get("Unit") }}</Unit>
+ </MetricStat>
+ <Label>{{ query.get("Label") }}</Label>
+ <ReturnData>{{ 'true' if query.get("ReturnData") else 'false' }}</ReturnData>
+ </member>
+ {% endfor %}
+ </MetricDataQueries>
+ </CustomizedCapacityMetricSpecification>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </MetricSpecifications>
+ {% if "Mode" in policy.predictive_scaling_configuration %}
+ <Mode>{{ policy.predictive_scaling_configuration.get("Mode") }}</Mode>
+ {% endif %}
+ {% if "SchedulingBufferTime" in policy.predictive_scaling_configuration %}
+ <SchedulingBufferTime>{{ policy.predictive_scaling_configuration.get("SchedulingBufferTime") }}</SchedulingBufferTime>
+ {% endif %}
+ {% if "MaxCapacityBreachBehavior" in policy.predictive_scaling_configuration %}
+ <MaxCapacityBreachBehavior>{{ policy.predictive_scaling_configuration.get("MaxCapacityBreachBehavior") }}</MaxCapacityBreachBehavior>
+ {% endif %}
+ {% if "MaxCapacityBuffer" in policy.predictive_scaling_configuration %}
+ <MaxCapacityBuffer>{{ policy.predictive_scaling_configuration.get("MaxCapacityBuffer") }}</MaxCapacityBuffer>
+ {% endif %}
+ </PredictiveScalingConfiguration>
+ {% endif %}
+ <Alarms/>
+ </member>
+ {% endfor %}
+ </ScalingPolicies>
+ </DescribePoliciesResult>
+ <ResponseMetadata>
+ <RequestId>ec3bffad-b739-11e2-b38d-15fbEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribePoliciesResponse>"""
+
+SET_DESIRED_CAPACITY_TEMPLATE = """<SetDesiredCapacityResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>9fb7e2db-6998-11e2-a985-57c82EXAMPLE</RequestId>
+ </ResponseMetadata>
+</SetDesiredCapacityResponse>"""
+
+EXECUTE_POLICY_TEMPLATE = """<ExecuteScalingPolicyResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ExecuteScalingPolicyResponse>"""
+
+DELETE_POLICY_TEMPLATE = """<DeleteScalingPolicyResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteScalingPolicyResponse>"""
+
+ATTACH_LOAD_BALANCERS_TEMPLATE = """<AttachLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<AttachLoadBalancersResult></AttachLoadBalancersResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</AttachLoadBalancersResponse>"""
+
+DESCRIBE_LOAD_BALANCERS_TEMPLATE = """<DescribeLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DescribeLoadBalancersResult>
+ <LoadBalancers>
+ {% for load_balancer in load_balancers %}
+ <member>
+ <LoadBalancerName>{{ load_balancer }}</LoadBalancerName>
+ <State>Added</State>
+ </member>
+ {% endfor %}
+ </LoadBalancers>
+</DescribeLoadBalancersResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</DescribeLoadBalancersResponse>"""
+
+DETACH_LOAD_BALANCERS_TEMPLATE = """<DetachLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<DetachLoadBalancersResult></DetachLoadBalancersResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</DetachLoadBalancersResponse>"""
+
+SUSPEND_PROCESSES_TEMPLATE = """<SuspendProcessesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<ResponseMetadata>
+ <RequestId>7c6e177f-f082-11e1-ac58-3714bEXAMPLE</RequestId>
+</ResponseMetadata>
+</SuspendProcessesResponse>"""
+
+RESUME_PROCESSES_TEMPLATE = """<ResumeProcessesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<ResponseMetadata>
+ <RequestId></RequestId>
+</ResponseMetadata>
+</ResumeProcessesResponse>"""
+
+SET_INSTANCE_HEALTH_TEMPLATE = """<SetInstanceHealthResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<SetInstanceHealthResponse></SetInstanceHealthResponse>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</SetInstanceHealthResponse>"""
+
+SET_INSTANCE_PROTECTION_TEMPLATE = """<SetInstanceProtectionResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+<SetInstanceProtectionResult></SetInstanceProtectionResult>
+<ResponseMetadata>
+<RequestId></RequestId>
+</ResponseMetadata>
+</SetInstanceProtectionResponse>"""
+
+ENTER_STANDBY_TEMPLATE = """<EnterStandbyResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <EnterStandbyResult>
+ <Activities>
+ {% for instance in standby_instances %}
+ <member>
+ <ActivityId>12345678-1234-1234-1234-123456789012</ActivityId>
+ <AutoScalingGroupName>{{ group_name }}</AutoScalingGroupName>
+ {% if should_decrement %}
+ <Cause>At {{ timestamp }} instance {{ instance.instance.id }} was moved to standby in response to a user request, shrinking the capacity from {{ original_size }} to {{ desired_capacity }}.</Cause>
+ {% else %}
+ <Cause>At {{ timestamp }} instance {{ instance.instance.id }} was moved to standby in response to a user request.</Cause>
+ {% endif %}
+ <Description>Moving EC2 instance to Standby: {{ instance.instance.id }}</Description>
+ <Progress>50</Progress>
+ <StartTime>{{ timestamp }}</StartTime>
+ <Details>{&quot;Subnet ID&quot;:&quot;??&quot;,&quot;Availability Zone&quot;:&quot;{{ instance.instance.placement }}&quot;}</Details>
+ <StatusCode>InProgress</StatusCode>
+ </member>
+ {% endfor %}
+ </Activities>
+ </EnterStandbyResult>
+ <ResponseMetadata>
+ <RequestId>7c6e177f-f082-11e1-ac58-3714bEXAMPLE</RequestId>
+ </ResponseMetadata>
+</EnterStandbyResponse>"""
+
+EXIT_STANDBY_TEMPLATE = """<ExitStandbyResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ExitStandbyResult>
+ <Activities>
+ {% for instance in standby_instances %}
+ <member>
+ <ActivityId>12345678-1234-1234-1234-123456789012</ActivityId>
+ <AutoScalingGroupName>{{ group_name }}</AutoScalingGroupName>
+ <Description>Moving EC2 instance out of Standby: {{ instance.instance.id }}</Description>
+ <Progress>30</Progress>
+ <Cause>At {{ timestamp }} instance {{ instance.instance.id }} was moved out of standby in response to a user request, increasing the capacity from {{ original_size }} to {{ desired_capacity }}.</Cause>
+ <StartTime>{{ timestamp }}</StartTime>
+ <Details>{&quot;Subnet ID&quot;:&quot;??&quot;,&quot;Availability Zone&quot;:&quot;{{ instance.instance.placement }}&quot;}</Details>
+ <StatusCode>PreInService</StatusCode>
+ </member>
+ {% endfor %}
+ </Activities>
+ </ExitStandbyResult>
+ <ResponseMetadata>
+ <RequestId>7c6e177f-f082-11e1-ac58-3714bEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ExitStandbyResponse>"""
+
+TERMINATE_INSTANCES_TEMPLATE = """<TerminateInstanceInAutoScalingGroupResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <TerminateInstanceInAutoScalingGroupResult>
+ <Activity>
+ <ActivityId>35b5c464-0b63-2fc7-1611-467d4a7f2497EXAMPLE</ActivityId>
+ <AutoScalingGroupName>{{ group_name }}</AutoScalingGroupName>
+ {% if should_decrement %}
+ <Cause>At {{ timestamp }} instance {{ instance.instance.id }} was taken out of service in response to a user request, shrinking the capacity from {{ original_size }} to {{ desired_capacity }}.</Cause>
+ {% else %}
+ <Cause>At {{ timestamp }} instance {{ instance.instance.id }} was taken out of service in response to a user request.</Cause>
+ {% endif %}
+ <Description>Terminating EC2 instance: {{ instance.instance.id }}</Description>
+ <Progress>0</Progress>
+ <StartTime>{{ timestamp }}</StartTime>
+ <Details>{&quot;Subnet ID&quot;:&quot;??&quot;,&quot;Availability Zone&quot;:&quot;{{ instance.instance.placement }}&quot;}</Details>
+ <StatusCode>InProgress</StatusCode>
+ </Activity>
+ </TerminateInstanceInAutoScalingGroupResult>
+ <ResponseMetadata>
+ <RequestId>a1ba8fb9-31d6-4d9a-ace1-a7f76749df11EXAMPLE</RequestId>
+ </ResponseMetadata>
+</TerminateInstanceInAutoScalingGroupResponse>"""
+
+DESCRIBE_TAGS_TEMPLATE = """<DescribeTagsResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DescribeTagsResult>
+ <Tags>
+{% for tag in tags %}
+ <member>
+ <ResourceId>{{ tag.resource_id }}</ResourceId>
+ <ResourceType>{{ tag.resource_type }}</ResourceType>
+ <Key>{{ tag.key }}</Key>
+ <Value>{{ tag.value }}</Value>
+ <PropagateAtLaunch>{{ tag.propagate_at_launch }}</PropagateAtLaunch>
+ </member>
+{% endfor %}
+ </Tags>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </DescribeTagsResult>
+</DescribeTagsResponse>"""
diff --git a/contrib/python/moto/py3/moto/autoscaling/urls.py b/contrib/python/moto/py3/moto/autoscaling/urls.py
new file mode 100644
index 0000000000..befd33b0d7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/autoscaling/urls.py
@@ -0,0 +1,5 @@
+from .responses import AutoScalingResponse
+
+url_bases = [r"https?://autoscaling\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": AutoScalingResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/awslambda/__init__.py b/contrib/python/moto/py3/moto/awslambda/__init__.py
new file mode 100644
index 0000000000..3954aa95e1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/__init__.py
@@ -0,0 +1,5 @@
+from .models import lambda_backends
+from ..core.models import base_decorator
+
+lambda_backend = lambda_backends["us-east-1"]
+mock_lambda = base_decorator(lambda_backends)
diff --git a/contrib/python/moto/py3/moto/awslambda/exceptions.py b/contrib/python/moto/py3/moto/awslambda/exceptions.py
new file mode 100644
index 0000000000..364bccd9d3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/exceptions.py
@@ -0,0 +1,66 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class LambdaClientError(JsonRESTError):
+ def __init__(self, error, message):
+ super().__init__(error, message)
+
+
+class CrossAccountNotAllowed(LambdaClientError):
+ def __init__(self):
+ super().__init__(
+ "AccessDeniedException", "Cross-account pass role is not allowed."
+ )
+
+
+class InvalidParameterValueException(LambdaClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValueException", message)
+
+
+class InvalidRoleFormat(LambdaClientError):
+ pattern = r"arn:(aws[a-zA-Z-]*)?:iam::(\d{12}):role/?[a-zA-Z_0-9+=,.@\-_/]+"
+
+ def __init__(self, role):
+ message = "1 validation error detected: Value '{0}' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: {1}".format(
+ role, InvalidRoleFormat.pattern
+ )
+ super().__init__("ValidationException", message)
+
+
+class PreconditionFailedException(JsonRESTError):
+ code = 412
+
+ def __init__(self, message):
+ super().__init__("PreconditionFailedException", message)
+
+
+class UnknownAliasException(LambdaClientError):
+ code = 404
+
+ def __init__(self, arn):
+ super().__init__("ResourceNotFoundException", f"Cannot find alias arn: {arn}")
+
+
+class UnknownFunctionException(LambdaClientError):
+ code = 404
+
+ def __init__(self, arn):
+ super().__init__("ResourceNotFoundException", f"Function not found: {arn}")
+
+
+class UnknownLayerException(LambdaClientError):
+ code = 404
+
+ def __init__(self):
+ super().__init__("ResourceNotFoundException", "Cannot find layer")
+
+
+class UnknownPolicyException(LambdaClientError):
+ code = 404
+
+ def __init__(self):
+ super().__init__(
+ "ResourceNotFoundException",
+ "No policy is associated with the given resource.",
+ )
diff --git a/contrib/python/moto/py3/moto/awslambda/models.py b/contrib/python/moto/py3/moto/awslambda/models.py
new file mode 100644
index 0000000000..92080d407e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/models.py
@@ -0,0 +1,1669 @@
+import base64
+import time
+from collections import defaultdict
+import copy
+import datetime
+from gzip import GzipFile
+from sys import platform
+
+import docker
+import docker.errors
+import hashlib
+import io
+import logging
+import os
+import json
+import re
+import zipfile
+import uuid
+import tarfile
+import calendar
+import threading
+import weakref
+import requests.exceptions
+
+from moto.awslambda.policy import Policy
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.exceptions import RESTError
+from moto.iam.models import iam_backend
+from moto.iam.exceptions import IAMNotFoundException
+from moto.core.utils import unix_time_millis, BackendDict
+from moto.s3.models import s3_backend
+from moto.logs.models import logs_backends
+from moto.s3.exceptions import MissingBucket, MissingKey
+from moto import settings
+from .exceptions import (
+ CrossAccountNotAllowed,
+ InvalidRoleFormat,
+ InvalidParameterValueException,
+ UnknownLayerException,
+ UnknownFunctionException,
+ UnknownAliasException,
+)
+from .utils import (
+ make_function_arn,
+ make_function_ver_arn,
+ make_layer_arn,
+ make_layer_ver_arn,
+ split_layer_arn,
+)
+from moto.sqs import sqs_backends
+from moto.dynamodb import dynamodb_backends
+from moto.dynamodbstreams import dynamodbstreams_backends
+from moto.core import get_account_id
+from moto.utilities.docker_utilities import DockerModel, parse_image_ref
+from tempfile import TemporaryDirectory
+from uuid import uuid4
+
+logger = logging.getLogger(__name__)
+
+
+docker_3 = docker.__version__[0] >= "3"
+
+
+def zip2tar(zip_bytes):
+ with TemporaryDirectory() as td:
+ tarname = os.path.join(td, "data.tar")
+ timeshift = int(
+ (datetime.datetime.now() - datetime.datetime.utcnow()).total_seconds()
+ )
+ with zipfile.ZipFile(io.BytesIO(zip_bytes), "r") as zipf, tarfile.TarFile(
+ tarname, "w"
+ ) as tarf:
+ for zipinfo in zipf.infolist():
+ if zipinfo.filename[-1] == "/": # is_dir() is py3.6+
+ continue
+
+ tarinfo = tarfile.TarInfo(name=zipinfo.filename)
+ tarinfo.size = zipinfo.file_size
+ tarinfo.mtime = calendar.timegm(zipinfo.date_time) - timeshift
+ infile = zipf.open(zipinfo.filename)
+ tarf.addfile(tarinfo, infile)
+
+ with open(tarname, "rb") as f:
+ tar_data = f.read()
+ return tar_data
+
+
+class _VolumeRefCount:
+ __slots__ = "refcount", "volume"
+
+ def __init__(self, refcount, volume):
+ self.refcount = refcount
+ self.volume = volume
+
+
+class _DockerDataVolumeContext:
+ _data_vol_map = defaultdict(
+ lambda: _VolumeRefCount(0, None)
+ ) # {sha256: _VolumeRefCount}
+ _lock = threading.Lock()
+
+ def __init__(self, lambda_func):
+ self._lambda_func = lambda_func
+ self._vol_ref = None
+
+ @property
+ def name(self):
+ return self._vol_ref.volume.name
+
+ def __enter__(self):
+ # See if volume is already known
+ with self.__class__._lock:
+ self._vol_ref = self.__class__._data_vol_map[self._lambda_func.code_digest]
+ self._vol_ref.refcount += 1
+ if self._vol_ref.refcount > 1:
+ return self
+
+ # See if the volume already exists
+ for vol in self._lambda_func.docker_client.volumes.list():
+ if vol.name == self._lambda_func.code_digest:
+ self._vol_ref.volume = vol
+ return self
+
+ # It doesn't exist so we need to create it
+ self._vol_ref.volume = self._lambda_func.docker_client.volumes.create(
+ self._lambda_func.code_digest
+ )
+ if docker_3:
+ volumes = {self.name: {"bind": "/tmp/data", "mode": "rw"}}
+ else:
+ volumes = {self.name: "/tmp/data"}
+
+ self._lambda_func.docker_client.images.pull(
+ ":".join(parse_image_ref("alpine"))
+ )
+ container = self._lambda_func.docker_client.containers.run(
+ "alpine", "sleep 100", volumes=volumes, detach=True
+ )
+ try:
+ tar_bytes = zip2tar(self._lambda_func.code_bytes)
+ container.put_archive("/tmp/data", tar_bytes)
+ finally:
+ container.remove(force=True)
+
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ with self.__class__._lock:
+ self._vol_ref.refcount -= 1
+ if self._vol_ref.refcount == 0:
+ try:
+ self._vol_ref.volume.remove()
+ except docker.errors.APIError as e:
+ if e.status_code != 409:
+ raise
+
+ raise # multiple processes trying to use same volume?
+
+
+def _zipfile_content(zipfile):
+ # more hackery to handle unicode/bytes/str in python3 and python2 -
+ # argh!
+ try:
+ to_unzip_code = base64.b64decode(bytes(zipfile, "utf-8"))
+ except Exception:
+ to_unzip_code = base64.b64decode(zipfile)
+
+ sha_code = hashlib.sha256(to_unzip_code)
+ base64ed_sha = base64.b64encode(sha_code.digest()).decode("utf-8")
+ sha_hex_digest = sha_code.hexdigest()
+ return to_unzip_code, len(to_unzip_code), base64ed_sha, sha_hex_digest
+
+
+def _s3_content(key):
+ sha_code = hashlib.sha256(key.value)
+ base64ed_sha = base64.b64encode(sha_code.digest()).decode("utf-8")
+ sha_hex_digest = sha_code.hexdigest()
+ return key.value, key.size, base64ed_sha, sha_hex_digest
+
+
+def _validate_s3_bucket_and_key(data):
+ key = None
+ try:
+ # FIXME: does not validate bucket region
+ key = s3_backend.get_object(data["S3Bucket"], data["S3Key"])
+ except MissingBucket:
+ if do_validate_s3():
+ raise InvalidParameterValueException(
+ "Error occurred while GetObject. S3 Error Code: NoSuchBucket. S3 Error Message: The specified bucket does not exist"
+ )
+ except MissingKey:
+ if do_validate_s3():
+ raise ValueError(
+ "InvalidParameterValueException",
+ "Error occurred while GetObject. S3 Error Code: NoSuchKey. S3 Error Message: The specified key does not exist.",
+ )
+ return key
+
+
+class Permission(CloudFormationModel):
+ def __init__(self, region):
+ self.region = region
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Permission"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::Lambda::Permission"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ backend = lambda_backends[region_name]
+ fn = backend.get_function(properties["FunctionName"])
+ fn.policy.add_statement(raw=json.dumps(properties))
+ return Permission(region=region_name)
+
+
+class LayerVersion(CloudFormationModel):
+ def __init__(self, spec, region):
+ # required
+ self.region = region
+ self.name = spec["LayerName"]
+ self.content = spec["Content"]
+
+ # optional
+ self.description = spec.get("Description", "")
+ self.compatible_architectures = spec.get("CompatibleArchitectures", [])
+ self.compatible_runtimes = spec.get("CompatibleRuntimes", [])
+ self.license_info = spec.get("LicenseInfo", "")
+
+ # auto-generated
+ self.created_date = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
+ self.version = None
+ self._attached = False
+ self._layer = None
+
+ if "ZipFile" in self.content:
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _zipfile_content(self.content["ZipFile"])
+ else:
+ key = _validate_s3_bucket_and_key(self.content)
+ if key:
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _s3_content(key)
+
+ @property
+ def arn(self):
+ if self.version:
+ return make_layer_ver_arn(
+ self.region, get_account_id(), self.name, self.version
+ )
+ raise ValueError("Layer version is not set")
+
+ def attach(self, layer, version):
+ self._attached = True
+ self._layer = layer
+ self.version = version
+
+ def get_layer_version(self):
+ return {
+ "Content": {
+ "Location": "s3://",
+ "CodeSha256": self.code_sha_256,
+ "CodeSize": self.code_size,
+ },
+ "Version": self.version,
+ "LayerArn": self._layer.layer_arn,
+ "LayerVersionArn": self.arn,
+ "CreatedDate": self.created_date,
+ "CompatibleArchitectures": self.compatible_architectures,
+ "CompatibleRuntimes": self.compatible_runtimes,
+ "Description": self.description,
+ "LicenseInfo": self.license_info,
+ }
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "LayerVersion"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::Lambda::LayerVersion"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ optional_properties = ("Description", "CompatibleRuntimes", "LicenseInfo")
+
+ # required
+ spec = {
+ "Content": properties["Content"],
+ "LayerName": resource_name,
+ }
+ for prop in optional_properties:
+ if prop in properties:
+ spec[prop] = properties[prop]
+
+ backend = lambda_backends[region_name]
+ layer_version = backend.publish_layer_version(spec)
+ return layer_version
+
+
+class LambdaAlias(BaseModel):
+ def __init__(
+ self, region, name, function_name, function_version, description, routing_config
+ ):
+ self.arn = f"arn:aws:lambda:{region}:{get_account_id()}:function:{function_name}:{name}"
+ self.name = name
+ self.function_version = function_version
+ self.description = description
+ self.routing_config = routing_config
+ self.revision_id = str(uuid4())
+
+ def update(self, description, function_version, routing_config):
+ if description is not None:
+ self.description = description
+ if function_version is not None:
+ self.function_version = function_version
+ if routing_config is not None:
+ self.routing_config = routing_config
+
+ def to_json(self):
+ return {
+ "AliasArn": self.arn,
+ "Description": self.description,
+ "FunctionVersion": self.function_version,
+ "Name": self.name,
+ "RevisionId": self.revision_id,
+ "RoutingConfig": self.routing_config or None,
+ }
+
+
+class Layer(object):
+ def __init__(self, name, region):
+ self.region = region
+ self.name = name
+
+ self.layer_arn = make_layer_arn(region, get_account_id(), self.name)
+ self._latest_version = 0
+ self.layer_versions = {}
+
+ def attach_version(self, layer_version):
+ self._latest_version += 1
+ layer_version.attach(self, self._latest_version)
+ self.layer_versions[str(self._latest_version)] = layer_version
+
+ def delete_version(self, layer_version):
+ self.layer_versions.pop(str(layer_version), None)
+
+ def to_dict(self):
+ return {
+ "LayerName": self.name,
+ "LayerArn": self.layer_arn,
+ "LatestMatchingVersion": self.layer_versions[
+ str(self._latest_version)
+ ].get_layer_version(),
+ }
+
+
+class LambdaFunction(CloudFormationModel, DockerModel):
+ def __init__(self, spec, region, version=1):
+ DockerModel.__init__(self)
+ # required
+ self.region = region
+ self.code = spec["Code"]
+ self.function_name = spec["FunctionName"]
+ self.handler = spec["Handler"]
+ self.role = spec["Role"]
+ self.run_time = spec["Runtime"]
+ self.logs_backend = logs_backends[self.region]
+ self.environment_vars = spec.get("Environment", {}).get("Variables", {})
+ self.policy = None
+ self.state = "Active"
+ self.reserved_concurrency = spec.get("ReservedConcurrentExecutions", None)
+
+ # optional
+ self.description = spec.get("Description", "")
+ self.memory_size = spec.get("MemorySize", 128)
+ self.package_type = spec.get("PackageType", None)
+ self.publish = spec.get("Publish", False) # this is ignored currently
+ self.timeout = spec.get("Timeout", 3)
+ self.layers = self._get_layers_data(spec.get("Layers", []))
+ self.signing_profile_version_arn = spec.get("SigningProfileVersionArn")
+ self.signing_job_arn = spec.get("SigningJobArn")
+ self.code_signing_config_arn = spec.get("CodeSigningConfigArn")
+ self.tracing_config = spec.get("TracingConfig") or {"Mode": "PassThrough"}
+
+ self.logs_group_name = "/aws/lambda/{}".format(self.function_name)
+
+ # this isn't finished yet. it needs to find out the VpcId value
+ self._vpc_config = spec.get(
+ "VpcConfig", {"SubnetIds": [], "SecurityGroupIds": []}
+ )
+
+ # auto-generated
+ self.version = version
+ self.last_modified = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
+
+ if "ZipFile" in self.code:
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _zipfile_content(self.code["ZipFile"])
+
+ # TODO: we should be putting this in a lambda bucket
+ self.code["UUID"] = str(uuid.uuid4())
+ self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"])
+ else:
+ key = _validate_s3_bucket_and_key(self.code)
+ if key:
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _s3_content(key)
+ else:
+ self.code_bytes = ""
+ self.code_size = 0
+ self.code_sha_256 = ""
+
+ self.function_arn = make_function_arn(
+ self.region, get_account_id(), self.function_name
+ )
+
+ if spec.get("Tags"):
+ self.tags = spec.get("Tags")
+ else:
+ self.tags = dict()
+
+ self._aliases = dict()
+
+ def set_version(self, version):
+ self.function_arn = make_function_ver_arn(
+ self.region, get_account_id(), self.function_name, version
+ )
+ self.version = version
+ self.last_modified = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
+
+ @property
+ def vpc_config(self):
+ config = self._vpc_config.copy()
+ if config["SecurityGroupIds"]:
+ config.update({"VpcId": "vpc-123abc"})
+ return config
+
+ @property
+ def physical_resource_id(self):
+ return self.function_name
+
+ def __repr__(self):
+ return json.dumps(self.get_configuration())
+
+ def _get_layers_data(self, layers_versions_arns):
+ backend = lambda_backends[self.region]
+ layer_versions = [
+ backend.layers_versions_by_arn(layer_version)
+ for layer_version in layers_versions_arns
+ ]
+ if not all(layer_versions):
+ raise ValueError(
+ "InvalidParameterValueException",
+ "One or more LayerVersion does not exist {0}".format(
+ layers_versions_arns
+ ),
+ )
+ return [{"Arn": lv.arn, "CodeSize": lv.code_size} for lv in layer_versions]
+
+ def get_code_signing_config(self):
+ return {
+ "CodeSigningConfigArn": self.code_signing_config_arn,
+ "FunctionName": self.function_name,
+ }
+
+ def get_configuration(self, on_create=False):
+ config = {
+ "CodeSha256": self.code_sha_256,
+ "CodeSize": self.code_size,
+ "Description": self.description,
+ "FunctionArn": self.function_arn,
+ "FunctionName": self.function_name,
+ "Handler": self.handler,
+ "LastModified": self.last_modified,
+ "MemorySize": self.memory_size,
+ "Role": self.role,
+ "Runtime": self.run_time,
+ "State": self.state,
+ "PackageType": self.package_type,
+ "Timeout": self.timeout,
+ "Version": str(self.version),
+ "VpcConfig": self.vpc_config,
+ "Layers": self.layers,
+ "SigningProfileVersionArn": self.signing_profile_version_arn,
+ "SigningJobArn": self.signing_job_arn,
+ "TracingConfig": self.tracing_config,
+ }
+ if not on_create:
+ # Only return this variable after the first creation
+ config["LastUpdateStatus"] = "Successful"
+ if self.environment_vars:
+ config["Environment"] = {"Variables": self.environment_vars}
+
+ return config
+
+ def get_code(self):
+ code = {
+ "Code": {
+ "Location": "s3://awslambda-{0}-tasks.s3-{0}.amazonaws.com/{1}".format(
+ self.region, self.code["S3Key"]
+ ),
+ "RepositoryType": "S3",
+ },
+ "Configuration": self.get_configuration(),
+ }
+ if self.tags:
+ code["Tags"] = self.tags
+ if self.reserved_concurrency:
+ code.update(
+ {
+ "Concurrency": {
+ "ReservedConcurrentExecutions": self.reserved_concurrency
+ }
+ }
+ )
+ return code
+
+ def update_configuration(self, config_updates):
+ for key, value in config_updates.items():
+ if key == "Description":
+ self.description = value
+ elif key == "Handler":
+ self.handler = value
+ elif key == "MemorySize":
+ self.memory_size = value
+ elif key == "Role":
+ self.role = value
+ elif key == "Runtime":
+ self.run_time = value
+ elif key == "Timeout":
+ self.timeout = value
+ elif key == "VpcConfig":
+ self._vpc_config = value
+ elif key == "Environment":
+ self.environment_vars = value["Variables"]
+ elif key == "Layers":
+ self.layers = self._get_layers_data(value)
+
+ return self.get_configuration()
+
+ def update_function_code(self, updated_spec):
+ if "DryRun" in updated_spec and updated_spec["DryRun"]:
+ return self.get_configuration()
+
+ if "ZipFile" in updated_spec:
+ self.code["ZipFile"] = updated_spec["ZipFile"]
+
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _zipfile_content(updated_spec["ZipFile"])
+
+ # TODO: we should be putting this in a lambda bucket
+ self.code["UUID"] = str(uuid.uuid4())
+ self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"])
+ elif "S3Bucket" in updated_spec and "S3Key" in updated_spec:
+ key = None
+ try:
+ # FIXME: does not validate bucket region
+ key = s3_backend.get_object(
+ updated_spec["S3Bucket"], updated_spec["S3Key"]
+ )
+ except MissingBucket:
+ if do_validate_s3():
+ raise ValueError(
+ "InvalidParameterValueException",
+ "Error occurred while GetObject. S3 Error Code: NoSuchBucket. S3 Error Message: The specified bucket does not exist",
+ )
+ except MissingKey:
+ if do_validate_s3():
+ raise ValueError(
+ "InvalidParameterValueException",
+ "Error occurred while GetObject. S3 Error Code: NoSuchKey. S3 Error Message: The specified key does not exist.",
+ )
+ if key:
+ (
+ self.code_bytes,
+ self.code_size,
+ self.code_sha_256,
+ self.code_digest,
+ ) = _s3_content(key)
+ self.code["S3Bucket"] = updated_spec["S3Bucket"]
+ self.code["S3Key"] = updated_spec["S3Key"]
+
+ return self.get_configuration()
+
+ @staticmethod
+ def convert(s):
+ try:
+ return str(s, encoding="utf-8")
+ except Exception:
+ return s
+
+ def _invoke_lambda(self, event=None):
+ # Create the LogGroup if necessary, to write the result to
+ self.logs_backend.ensure_log_group(self.logs_group_name, [])
+ # TODO: context not yet implemented
+ if event is None:
+ event = dict()
+ output = None
+
+ try:
+ # TODO: I believe we can keep the container running and feed events as needed
+ # also need to hook it up to the other services so it can make kws/s3 etc calls
+ # Should get invoke_id /RequestId from invocation
+ env_vars = {
+ "_HANDLER": self.handler,
+ "AWS_EXECUTION_ENV": "AWS_Lambda_{}".format(self.run_time),
+ "AWS_LAMBDA_FUNCTION_TIMEOUT": self.timeout,
+ "AWS_LAMBDA_FUNCTION_NAME": self.function_name,
+ "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": self.memory_size,
+ "AWS_LAMBDA_FUNCTION_VERSION": self.version,
+ "AWS_REGION": self.region,
+ "AWS_ACCESS_KEY_ID": "role-account-id",
+ "AWS_SECRET_ACCESS_KEY": "role-secret-key",
+ "AWS_SESSION_TOKEN": "session-token",
+ }
+
+ env_vars.update(self.environment_vars)
+ env_vars["MOTO_HOST"] = settings.moto_server_host()
+ env_vars["MOTO_PORT"] = settings.moto_server_port()
+ env_vars[
+ "MOTO_HTTP_ENDPOINT"
+ ] = f'{env_vars["MOTO_HOST"]}:{env_vars["MOTO_PORT"]}'
+
+ container = exit_code = None
+ log_config = docker.types.LogConfig(type=docker.types.LogConfig.types.JSON)
+
+ with _DockerDataVolumeContext(self) as data_vol:
+ try:
+ run_kwargs = dict()
+ network_name = settings.moto_network_name()
+ network_mode = settings.moto_network_mode()
+ if network_name:
+ run_kwargs["network"] = network_name
+ elif network_mode:
+ run_kwargs["network_mode"] = network_mode
+ elif settings.TEST_SERVER_MODE:
+ # AWSLambda can make HTTP requests to a Docker container called 'motoserver'
+ # Only works if our Docker-container is named 'motoserver'
+ # TODO: should remove this and rely on 'network_mode' instead, as this is too tightly coupled with our own test setup
+ run_kwargs["links"] = {"motoserver": "motoserver"}
+
+ # add host.docker.internal host on linux to emulate Mac + Windows behavior
+ # for communication with other mock AWS services running on localhost
+ if platform == "linux" or platform == "linux2":
+ run_kwargs["extra_hosts"] = {
+ "host.docker.internal": "host-gateway"
+ }
+
+ image_repo = settings.moto_lambda_image()
+ image_ref = f"{image_repo}:{self.run_time}"
+ self.docker_client.images.pull(":".join(parse_image_ref(image_ref)))
+ container = self.docker_client.containers.run(
+ image_ref,
+ [self.handler, json.dumps(event)],
+ remove=False,
+ mem_limit="{}m".format(self.memory_size),
+ volumes=["{}:/var/task".format(data_vol.name)],
+ environment=env_vars,
+ detach=True,
+ log_config=log_config,
+ **run_kwargs,
+ )
+ finally:
+ if container:
+ try:
+ exit_code = container.wait(timeout=300)
+ except requests.exceptions.ReadTimeout:
+ exit_code = -1
+ container.stop()
+ container.kill()
+ else:
+ if docker_3:
+ exit_code = exit_code["StatusCode"]
+
+ output = container.logs(stdout=False, stderr=True)
+ output += container.logs(stdout=True, stderr=False)
+ container.remove()
+
+ output = output.decode("utf-8")
+
+ self.save_logs(output)
+
+ # We only care about the response from the lambda
+ # Which is the last line of the output, according to https://github.com/lambci/docker-lambda/issues/25
+ resp = output.splitlines()[-1]
+ logs = os.linesep.join(
+ [line for line in self.convert(output).splitlines()[:-1]]
+ )
+ invocation_error = exit_code != 0
+ return resp, invocation_error, logs
+ except docker.errors.DockerException as e:
+ # Docker itself is probably not running - there will be no Lambda-logs to handle
+ msg = "error running docker: {}".format(e)
+ self.save_logs(msg)
+ return msg, True, ""
+
+ def save_logs(self, output):
+ # Send output to "logs" backend
+ invoke_id = uuid.uuid4().hex
+ log_stream_name = (
+ "{date.year}/{date.month:02d}/{date.day:02d}/[{version}]{invoke_id}".format(
+ date=datetime.datetime.utcnow(),
+ version=self.version,
+ invoke_id=invoke_id,
+ )
+ )
+ self.logs_backend.create_log_stream(self.logs_group_name, log_stream_name)
+ log_events = [
+ {"timestamp": unix_time_millis(), "message": line}
+ for line in output.splitlines()
+ ]
+ self.logs_backend.put_log_events(
+ self.logs_group_name, log_stream_name, log_events
+ )
+
+ def invoke(self, body, request_headers, response_headers):
+
+ if body:
+ body = json.loads(body)
+ else:
+ body = "{}"
+
+ # Get the invocation type:
+ res, errored, logs = self._invoke_lambda(event=body)
+ inv_type = request_headers.get("x-amz-invocation-type", "RequestResponse")
+ if inv_type == "RequestResponse":
+ encoded = base64.b64encode(logs.encode("utf-8"))
+ response_headers["x-amz-log-result"] = encoded.decode("utf-8")
+ result = res.encode("utf-8")
+ else:
+ result = res
+ if errored:
+ response_headers["x-amz-function-error"] = "Handled"
+
+ return result
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "FunctionName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html
+ return "AWS::Lambda::Function"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ optional_properties = (
+ "Description",
+ "MemorySize",
+ "Publish",
+ "Timeout",
+ "VpcConfig",
+ "Environment",
+ "ReservedConcurrentExecutions",
+ )
+
+ # required
+ spec = {
+ "Code": properties["Code"],
+ "FunctionName": resource_name,
+ "Handler": properties["Handler"],
+ "Role": properties["Role"],
+ "Runtime": properties["Runtime"],
+ }
+
+ # NOTE: Not doing `properties.get(k, DEFAULT)` to avoid duplicating the
+ # default logic
+ for prop in optional_properties:
+ if prop in properties:
+ spec[prop] = properties[prop]
+
+ # when ZipFile is present in CloudFormation, per the official docs,
+ # the code it's a plaintext code snippet up to 4096 bytes.
+ # this snippet converts this plaintext code to a proper base64-encoded ZIP file.
+ if "ZipFile" in properties["Code"]:
+ spec["Code"]["ZipFile"] = base64.b64encode(
+ cls._create_zipfile_from_plaintext_code(spec["Code"]["ZipFile"])
+ )
+
+ backend = lambda_backends[region_name]
+ fn = backend.create_function(spec)
+ return fn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return make_function_arn(self.region, get_account_id(), self.function_name)
+ raise UnformattedGetAttTemplateException()
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ updated_props = cloudformation_json["Properties"]
+ original_resource.update_configuration(updated_props)
+ original_resource.update_function_code(updated_props["Code"])
+ return original_resource
+
+ @staticmethod
+ def _create_zipfile_from_plaintext_code(code):
+ zip_output = io.BytesIO()
+ zip_file = zipfile.ZipFile(zip_output, "w", zipfile.ZIP_DEFLATED)
+ zip_file.writestr("index.py", code)
+ # This should really be part of the 'lambci' docker image
+ from moto.packages.cfnresponse import cfnresponse
+
+ with open(cfnresponse.__file__) as cfn:
+ zip_file.writestr("cfnresponse.py", cfn.read())
+ zip_file.close()
+ zip_output.seek(0)
+ return zip_output.read()
+
+ def delete(self, region):
+ lambda_backends[region].delete_function(self.function_name)
+
+ def delete_alias(self, name):
+ self._aliases.pop(name, None)
+
+ def get_alias(self, name):
+ if name in self._aliases:
+ return self._aliases[name]
+ arn = f"arn:aws:lambda:{self.region}:{get_account_id()}:function:{self.function_name}:{name}"
+ raise UnknownAliasException(arn)
+
+ def put_alias(self, name, description, function_version, routing_config):
+ alias = LambdaAlias(
+ region=self.region,
+ name=name,
+ function_name=self.function_name,
+ function_version=function_version,
+ description=description,
+ routing_config=routing_config,
+ )
+ self._aliases[name] = alias
+ return alias
+
+ def update_alias(self, name, description, function_version, routing_config):
+ alias = self.get_alias(name)
+ alias.update(description, function_version, routing_config)
+ return alias
+
+
+class EventSourceMapping(CloudFormationModel):
+ def __init__(self, spec):
+ # required
+ self.function_name = spec["FunctionName"]
+ self.event_source_arn = spec["EventSourceArn"]
+
+ # optional
+ self.batch_size = spec.get("BatchSize")
+ self.starting_position = spec.get("StartingPosition", "TRIM_HORIZON")
+ self.enabled = spec.get("Enabled", True)
+ self.starting_position_timestamp = spec.get("StartingPositionTimestamp", None)
+
+ self.function_arn = spec["FunctionArn"]
+ self.uuid = str(uuid.uuid4())
+ self.last_modified = time.mktime(datetime.datetime.utcnow().timetuple())
+
+ def _get_service_source_from_arn(self, event_source_arn):
+ return event_source_arn.split(":")[2].lower()
+
+ def _validate_event_source(self, event_source_arn):
+ valid_services = ("dynamodb", "kinesis", "sqs")
+ service = self._get_service_source_from_arn(event_source_arn)
+ return True if service in valid_services else False
+
+ @property
+ def event_source_arn(self):
+ return self._event_source_arn
+
+ @event_source_arn.setter
+ def event_source_arn(self, event_source_arn):
+ if not self._validate_event_source(event_source_arn):
+ raise ValueError(
+ "InvalidParameterValueException", "Unsupported event source type"
+ )
+ self._event_source_arn = event_source_arn
+
+ @property
+ def batch_size(self):
+ return self._batch_size
+
+ @batch_size.setter
+ def batch_size(self, batch_size):
+ batch_size_service_map = {
+ "kinesis": (100, 10000),
+ "dynamodb": (100, 1000),
+ "sqs": (10, 10),
+ }
+
+ source_type = self._get_service_source_from_arn(self.event_source_arn)
+ batch_size_for_source = batch_size_service_map[source_type]
+
+ if batch_size is None:
+ self._batch_size = batch_size_for_source[0]
+ elif batch_size > batch_size_for_source[1]:
+ error_message = "BatchSize {} exceeds the max of {}".format(
+ batch_size, batch_size_for_source[1]
+ )
+ raise ValueError("InvalidParameterValueException", error_message)
+ else:
+ self._batch_size = int(batch_size)
+
+ def get_configuration(self):
+ return {
+ "UUID": self.uuid,
+ "BatchSize": self.batch_size,
+ "EventSourceArn": self.event_source_arn,
+ "FunctionArn": self.function_arn,
+ "LastModified": self.last_modified,
+ "LastProcessingResult": "",
+ "State": "Enabled" if self.enabled else "Disabled",
+ "StateTransitionReason": "User initiated",
+ }
+
+ def delete(self, region_name):
+ lambda_backend = lambda_backends[region_name]
+ lambda_backend.delete_event_source_mapping(self.uuid)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html
+ return "AWS::Lambda::EventSourceMapping"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ lambda_backend = lambda_backends[region_name]
+ return lambda_backend.create_event_source_mapping(properties)
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ event_source_uuid = original_resource.uuid
+ lambda_backend = lambda_backends[region_name]
+ return lambda_backend.update_event_source_mapping(event_source_uuid, properties)
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ lambda_backend = lambda_backends[region_name]
+ esms = lambda_backend.list_event_source_mappings(
+ event_source_arn=properties["EventSourceArn"],
+ function_name=properties["FunctionName"],
+ )
+
+ for esm in esms:
+ if esm.uuid == resource_name:
+ esm.delete(region_name)
+
+ @property
+ def physical_resource_id(self):
+ return self.uuid
+
+
+class LambdaVersion(CloudFormationModel):
+ def __init__(self, spec):
+ self.version = spec["Version"]
+
+ def __repr__(self):
+ return str(self.logical_resource_id)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html
+ return "AWS::Lambda::Version"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ function_name = properties["FunctionName"]
+ func = lambda_backends[region_name].publish_function(function_name)
+ spec = {"Version": func.version}
+ return LambdaVersion(spec)
+
+
+class LambdaStorage(object):
+ def __init__(self, region_name):
+ # Format 'func_name' {'versions': []}
+ self._functions = {}
+ self._aliases = dict()
+ self._arns = weakref.WeakValueDictionary()
+ self.region_name = region_name
+
+ def _get_latest(self, name):
+ return self._functions[name]["latest"]
+
+ def _get_version(self, name, version):
+ index = version - 1
+
+ try:
+ return self._functions[name]["versions"][index]
+ except IndexError:
+ return None
+
+ def delete_alias(self, name, function_name):
+ fn = self.get_function_by_name_or_arn(function_name)
+ return fn.delete_alias(name)
+
+ def get_alias(self, name, function_name):
+ fn = self.get_function_by_name_or_arn(function_name)
+ return fn.get_alias(name)
+
+ def put_alias(
+ self, name, function_name, function_version, description, routing_config
+ ):
+ fn = self.get_function_by_name_or_arn(function_name)
+ return fn.put_alias(name, description, function_version, routing_config)
+
+ def update_alias(
+ self, name, function_name, function_version, description, routing_config
+ ):
+ fn = self.get_function_by_name_or_arn(function_name)
+ return fn.update_alias(name, description, function_version, routing_config)
+
+ def get_function_by_name(self, name, qualifier=None):
+ if name not in self._functions:
+ return None
+
+ if qualifier is None:
+ return self._get_latest(name)
+
+ try:
+ return self._get_version(name, int(qualifier))
+ except ValueError:
+ return self._functions[name]["latest"]
+
+ def list_versions_by_function(self, name):
+ if name not in self._functions:
+ return None
+
+ latest = copy.copy(self._functions[name]["latest"])
+ latest.function_arn += ":$LATEST"
+ return [latest] + self._functions[name]["versions"]
+
+ def get_arn(self, arn):
+ # Function ARN may contain an alias
+ # arn:aws:lambda:region:account_id:function:<fn_name>:<alias_name>
+ if ":" in arn.split(":function:")[-1]:
+ # arn = arn:aws:lambda:region:account_id:function:<fn_name>
+ arn = ":".join(arn.split(":")[0:-1])
+ return self._arns.get(arn, None)
+
+ def get_function_by_name_or_arn(self, name_or_arn, qualifier=None):
+ fn = self.get_function_by_name(name_or_arn, qualifier) or self.get_arn(
+ name_or_arn
+ )
+ if fn is None:
+ if name_or_arn.startswith("arn:aws"):
+ arn = name_or_arn
+ else:
+ arn = make_function_arn(self.region_name, get_account_id(), name_or_arn)
+ if qualifier:
+ arn = f"{arn}:{qualifier}"
+ raise UnknownFunctionException(arn)
+ return fn
+
+ def put_function(self, fn):
+ """
+ :param fn: Function
+ :type fn: LambdaFunction
+ """
+ valid_role = re.match(InvalidRoleFormat.pattern, fn.role)
+ if valid_role:
+ account = valid_role.group(2)
+ if account != get_account_id():
+ raise CrossAccountNotAllowed()
+ try:
+ iam_backend.get_role_by_arn(fn.role)
+ except IAMNotFoundException:
+ raise InvalidParameterValueException(
+ "The role defined for the function cannot be assumed by Lambda."
+ )
+ else:
+ raise InvalidRoleFormat(fn.role)
+ if fn.function_name in self._functions:
+ self._functions[fn.function_name]["latest"] = fn
+ else:
+ self._functions[fn.function_name] = {"latest": fn, "versions": []}
+ # instantiate a new policy for this version of the lambda
+ fn.policy = Policy(fn)
+ self._arns[fn.function_arn] = fn
+
+ def publish_function(self, name_or_arn, description=""):
+ function = self.get_function_by_name_or_arn(name_or_arn)
+ name = function.function_name
+ if name not in self._functions:
+ return None
+ if not self._functions[name]["latest"]:
+ return None
+
+ new_version = len(self._functions[name]["versions"]) + 1
+ fn = copy.copy(self._functions[name]["latest"])
+ fn.set_version(new_version)
+ if description:
+ fn.description = description
+
+ self._functions[name]["versions"].append(fn)
+ self._arns[fn.function_arn] = fn
+ return fn
+
+ def del_function(self, name_or_arn, qualifier=None):
+ function = self.get_function_by_name_or_arn(name_or_arn, qualifier)
+ name = function.function_name
+ if not qualifier:
+ # Something is still reffing this so delete all arns
+ latest = self._functions[name]["latest"].function_arn
+ del self._arns[latest]
+
+ for fn in self._functions[name]["versions"]:
+ del self._arns[fn.function_arn]
+
+ del self._functions[name]
+
+ elif qualifier == "$LATEST":
+ self._functions[name]["latest"] = None
+
+ # If theres no functions left
+ if (
+ not self._functions[name]["versions"]
+ and not self._functions[name]["latest"]
+ ):
+ del self._functions[name]
+
+ else:
+ fn = self.get_function_by_name(name, qualifier)
+ if fn:
+ self._functions[name]["versions"].remove(fn)
+
+ # If theres no functions left
+ if (
+ not self._functions[name]["versions"]
+ and not self._functions[name]["latest"]
+ ):
+ del self._functions[name]
+
+ def all(self):
+ result = []
+
+ for function_group in self._functions.values():
+ latest = copy.deepcopy(function_group["latest"])
+ latest.function_arn = "{}:$LATEST".format(latest.function_arn)
+ result.append(latest)
+
+ result.extend(function_group["versions"])
+
+ return result
+
+ def latest(self):
+ """
+ Return the list of functions with version @LATEST
+ :return:
+ """
+ result = []
+ for function_group in self._functions.values():
+ if function_group["latest"] is not None:
+ result.append(function_group["latest"])
+
+ return result
+
+
+class LayerStorage(object):
+ def __init__(self):
+ self._layers = {}
+ self._arns = weakref.WeakValueDictionary()
+
+ def put_layer_version(self, layer_version):
+ """
+ :param layer_version: LayerVersion
+ """
+ if layer_version.name not in self._layers:
+ self._layers[layer_version.name] = Layer(
+ layer_version.name, layer_version.region
+ )
+ self._layers[layer_version.name].attach_version(layer_version)
+
+ def list_layers(self):
+ return [layer.to_dict() for layer in self._layers.values()]
+
+ def delete_layer_version(self, layer_name, layer_version):
+ self._layers[layer_name].delete_version(layer_version)
+
+ def get_layer_version(self, layer_name, layer_version):
+ if layer_name not in self._layers:
+ raise UnknownLayerException()
+ for lv in self._layers[layer_name].layer_versions.values():
+ if lv.version == int(layer_version):
+ return lv
+ raise UnknownLayerException()
+
+ def get_layer_versions(self, layer_name):
+ if layer_name in self._layers:
+ return list(iter(self._layers[layer_name].layer_versions.values()))
+ return []
+
+ def get_layer_version_by_arn(self, layer_version_arn):
+ split_arn = split_layer_arn(layer_version_arn)
+ if split_arn.layer_name in self._layers:
+ return self._layers[split_arn.layer_name].layer_versions.get(
+ split_arn.version, None
+ )
+ return None
+
+
+class LambdaBackend(BaseBackend):
+ """
+ Implementation of the AWS Lambda endpoint.
+ Invoking functions is supported - they will run inside a Docker container, emulating the real AWS behaviour as closely as possible.
+
+ It is possible to connect from AWS Lambdas to other services, as long as you are running Moto in ServerMode.
+ The Lambda has access to environment variables `MOTO_HOST` and `MOTO_PORT`, which can be used to build the url that MotoServer runs on:
+
+ .. sourcecode:: python
+
+ def lambda_handler(event, context):
+ host = os.environ.get("MOTO_HOST")
+ port = os.environ.get("MOTO_PORT")
+ url = host + ":" + port
+ ec2 = boto3.client('ec2', region_name='us-west-2', endpoint_url=url)
+
+ # Or even simpler:
+ full_url = os.environ.get("MOTO_HTTP_ENDPOINT")
+ ec2 = boto3.client("ec2", region_name="eu-west-1", endpoint_url=full_url)
+
+ ec2.do_whatever_inside_the_existing_moto_server()
+
+ Moto will run on port 5000 by default. This can be overwritten by setting an environment variable when starting Moto:
+
+ .. sourcecode:: bash
+
+ # This env var will be propagated to the Docker container running the Lambda functions
+ MOTO_PORT=5000 moto_server
+
+ The Docker container uses the default network mode, `bridge`.
+ The following environment variables are available for fine-grained control over the Docker connection options:
+
+ .. sourcecode:: bash
+
+ # Provide the name of a custom network to connect to
+ MOTO_DOCKER_NETWORK_NAME=mycustomnetwork moto_server
+
+ # Override the network mode
+ # For example, network_mode=host would use the network of the host machine
+ # Note that this option will be ignored if MOTO_DOCKER_NETWORK_NAME is also set
+ MOTO_DOCKER_NETWORK_MODE=host moto_server
+
+ The Docker images used by Moto are taken from the `lambci/lambda`-repo by default. Use the following environment variable to configure a different repo:
+
+ .. sourcecode:: bash
+
+ MOTO_DOCKER_LAMBDA_IMAGE=mLupin/docker-lambda
+
+ .. note:: When using the decorators, a Docker container cannot reach Moto, as it does not run as a server. Any boto3-invocations used within your Lambda will try to connect to AWS.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._lambdas = LambdaStorage(region_name=region_name)
+ self._event_source_mappings = {}
+ self._layers = LayerStorage()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "lambda"
+ )
+
+ def create_alias(
+ self, name, function_name, function_version, description, routing_config
+ ):
+ return self._lambdas.put_alias(
+ name, function_name, function_version, description, routing_config
+ )
+
+ def delete_alias(self, name, function_name):
+ return self._lambdas.delete_alias(name, function_name)
+
+ def get_alias(self, name, function_name):
+ return self._lambdas.get_alias(name, function_name)
+
+ def update_alias(
+ self, name, function_name, function_version, description, routing_config
+ ):
+ """
+ The RevisionId parameter is not yet implemented
+ """
+ return self._lambdas.update_alias(
+ name, function_name, function_version, description, routing_config
+ )
+
+ def create_function(self, spec):
+ function_name = spec.get("FunctionName", None)
+ if function_name is None:
+ raise RESTError("InvalidParameterValueException", "Missing FunctionName")
+
+ fn = LambdaFunction(spec, self.region_name, version="$LATEST")
+
+ self._lambdas.put_function(fn)
+
+ if spec.get("Publish"):
+ ver = self.publish_function(function_name)
+ fn = copy.deepcopy(
+ fn
+ ) # We don't want to change the actual version - just the return value
+ fn.version = ver.version
+ return fn
+
+ def create_event_source_mapping(self, spec):
+ required = ["EventSourceArn", "FunctionName"]
+ for param in required:
+ if not spec.get(param):
+ raise RESTError(
+ "InvalidParameterValueException", "Missing {}".format(param)
+ )
+
+ # Validate function name
+ func = self._lambdas.get_function_by_name_or_arn(spec.get("FunctionName", ""))
+ if not func:
+ raise RESTError("ResourceNotFoundException", "Invalid FunctionName")
+
+ # Validate queue
+ for queue in sqs_backends[self.region_name].queues.values():
+ if queue.queue_arn == spec["EventSourceArn"]:
+ if queue.lambda_event_source_mappings.get("func.function_arn"):
+ # TODO: Correct exception?
+ raise RESTError(
+ "ResourceConflictException", "The resource already exists."
+ )
+ if queue.fifo_queue:
+ raise RESTError(
+ "InvalidParameterValueException",
+ "{} is FIFO".format(queue.queue_arn),
+ )
+ else:
+ spec.update({"FunctionArn": func.function_arn})
+ esm = EventSourceMapping(spec)
+ self._event_source_mappings[esm.uuid] = esm
+
+ # Set backend function on queue
+ queue.lambda_event_source_mappings[esm.function_arn] = esm
+
+ return esm
+ for stream in json.loads(
+ dynamodbstreams_backends[self.region_name].list_streams()
+ )["Streams"]:
+ if stream["StreamArn"] == spec["EventSourceArn"]:
+ spec.update({"FunctionArn": func.function_arn})
+ esm = EventSourceMapping(spec)
+ self._event_source_mappings[esm.uuid] = esm
+ table_name = stream["TableName"]
+ table = dynamodb_backends[self.region_name].get_table(table_name)
+ table.lambda_event_source_mappings[esm.function_arn] = esm
+ return esm
+ raise RESTError("ResourceNotFoundException", "Invalid EventSourceArn")
+
+ def publish_layer_version(self, spec):
+ required = ["LayerName", "Content"]
+ for param in required:
+ if not spec.get(param):
+ raise InvalidParameterValueException("Missing {}".format(param))
+ layer_version = LayerVersion(spec, self.region_name)
+ self._layers.put_layer_version(layer_version)
+ return layer_version
+
+ def list_layers(self):
+ return self._layers.list_layers()
+
+ def delete_layer_version(self, layer_name, layer_version):
+ return self._layers.delete_layer_version(layer_name, layer_version)
+
+ def get_layer_version(self, layer_name, layer_version):
+ return self._layers.get_layer_version(layer_name, layer_version)
+
+ def get_layer_versions(self, layer_name):
+ return self._layers.get_layer_versions(layer_name)
+
+ def layers_versions_by_arn(self, layer_version_arn):
+ return self._layers.get_layer_version_by_arn(layer_version_arn)
+
+ def publish_function(self, function_name, description=""):
+ return self._lambdas.publish_function(function_name, description)
+
+ def get_function(self, function_name_or_arn, qualifier=None):
+ return self._lambdas.get_function_by_name_or_arn(
+ function_name_or_arn, qualifier
+ )
+
+ def list_versions_by_function(self, function_name):
+ return self._lambdas.list_versions_by_function(function_name)
+
+ def get_event_source_mapping(self, uuid):
+ return self._event_source_mappings.get(uuid)
+
+ def delete_event_source_mapping(self, uuid):
+ return self._event_source_mappings.pop(uuid)
+
+ def update_event_source_mapping(self, uuid, spec):
+ esm = self.get_event_source_mapping(uuid)
+ if not esm:
+ return False
+
+ for key in spec.keys():
+ if key == "FunctionName":
+ func = self._lambdas.get_function_by_name_or_arn(spec[key])
+ esm.function_arn = func.function_arn
+ elif key == "BatchSize":
+ esm.batch_size = spec[key]
+ elif key == "Enabled":
+ esm.enabled = spec[key]
+
+ esm.last_modified = time.mktime(datetime.datetime.utcnow().timetuple())
+ return esm
+
+ def list_event_source_mappings(self, event_source_arn, function_name):
+ esms = list(self._event_source_mappings.values())
+ if event_source_arn:
+ esms = list(filter(lambda x: x.event_source_arn == event_source_arn, esms))
+ if function_name:
+ esms = list(filter(lambda x: x.function_name == function_name, esms))
+ return esms
+
+ def get_function_by_arn(self, function_arn):
+ return self._lambdas.get_arn(function_arn)
+
+ def delete_function(self, function_name, qualifier=None):
+ self._lambdas.del_function(function_name, qualifier)
+
+ def list_functions(self, func_version=None):
+ if func_version == "ALL":
+ return self._lambdas.all()
+ return self._lambdas.latest()
+
+ def send_sqs_batch(self, function_arn, messages, queue_arn):
+ success = True
+ for message in messages:
+ func = self.get_function_by_arn(function_arn)
+ result = self._send_sqs_message(func, message, queue_arn)
+ if not result:
+ success = False
+ return success
+
+ def _send_sqs_message(self, func, message, queue_arn):
+ event = {
+ "Records": [
+ {
+ "messageId": message.id,
+ "receiptHandle": message.receipt_handle,
+ "body": message.body,
+ "attributes": {
+ "ApproximateReceiveCount": "1",
+ "SentTimestamp": "1545082649183",
+ "SenderId": "AIDAIENQZJOLO23YVJ4VO",
+ "ApproximateFirstReceiveTimestamp": "1545082649185",
+ },
+ "messageAttributes": {},
+ "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
+ "eventSource": "aws:sqs",
+ "eventSourceARN": queue_arn,
+ "awsRegion": self.region_name,
+ }
+ ]
+ }
+
+ request_headers = {}
+ response_headers = {}
+ func.invoke(json.dumps(event), request_headers, response_headers)
+ return "x-amz-function-error" not in response_headers
+
+ def send_sns_message(self, function_name, message, subject=None, qualifier=None):
+ event = {
+ "Records": [
+ {
+ "EventVersion": "1.0",
+ "EventSubscriptionArn": "arn:aws:sns:EXAMPLE",
+ "EventSource": "aws:sns",
+ "Sns": {
+ "SignatureVersion": "1",
+ "Timestamp": "1970-01-01T00:00:00.000Z",
+ "Signature": "EXAMPLE",
+ "SigningCertUrl": "EXAMPLE",
+ "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
+ "Message": message,
+ "MessageAttributes": {
+ "Test": {"Type": "String", "Value": "TestString"},
+ "TestBinary": {"Type": "Binary", "Value": "TestBinary"},
+ },
+ "Type": "Notification",
+ "UnsubscribeUrl": "EXAMPLE",
+ "TopicArn": "arn:aws:sns:EXAMPLE",
+ "Subject": subject or "TestInvoke",
+ },
+ }
+ ]
+ }
+ func = self._lambdas.get_function_by_name_or_arn(function_name, qualifier)
+ func.invoke(json.dumps(event), {}, {})
+
+ def send_dynamodb_items(self, function_arn, items, source):
+ event = {
+ "Records": [
+ {
+ "eventID": item.to_json()["eventID"],
+ "eventName": "INSERT",
+ "eventVersion": item.to_json()["eventVersion"],
+ "eventSource": item.to_json()["eventSource"],
+ "awsRegion": self.region_name,
+ "dynamodb": item.to_json()["dynamodb"],
+ "eventSourceARN": source,
+ }
+ for item in items
+ ]
+ }
+ func = self._lambdas.get_arn(function_arn)
+ return func.invoke(json.dumps(event), {}, {})
+
+ def send_log_event(
+ self, function_arn, filter_name, log_group_name, log_stream_name, log_events
+ ):
+ data = {
+ "messageType": "DATA_MESSAGE",
+ "owner": get_account_id(),
+ "logGroup": log_group_name,
+ "logStream": log_stream_name,
+ "subscriptionFilters": [filter_name],
+ "logEvents": log_events,
+ }
+
+ output = io.BytesIO()
+ with GzipFile(fileobj=output, mode="w") as f:
+ f.write(json.dumps(data, separators=(",", ":")).encode("utf-8"))
+ payload_gz_encoded = base64.b64encode(output.getvalue()).decode("utf-8")
+
+ event = {"awslogs": {"data": payload_gz_encoded}}
+
+ func = self._lambdas.get_arn(function_arn)
+ return func.invoke(json.dumps(event), {}, {})
+
+ def list_tags(self, resource):
+ return self._lambdas.get_function_by_name_or_arn(resource).tags
+
+ def tag_resource(self, resource, tags):
+ fn = self._lambdas.get_function_by_name_or_arn(resource)
+ fn.tags.update(tags)
+
+ def untag_resource(self, resource, tagKeys):
+ fn = self._lambdas.get_function_by_name_or_arn(resource)
+ for key in tagKeys:
+ fn.tags.pop(key, None)
+
+ def add_permission(self, function_name, qualifier, raw):
+ fn = self.get_function(function_name, qualifier)
+ fn.policy.add_statement(raw, qualifier)
+
+ def remove_permission(self, function_name, sid, revision=""):
+ fn = self.get_function(function_name)
+ fn.policy.del_statement(sid, revision)
+
+ def get_code_signing_config(self, function_name):
+ fn = self.get_function(function_name)
+ return fn.get_code_signing_config()
+
+ def get_policy(self, function_name):
+ fn = self.get_function(function_name)
+ if not fn:
+ raise UnknownFunctionException(function_name)
+ return fn.policy.wire_format()
+
+ def update_function_code(self, function_name, qualifier, body):
+ fn = self.get_function(function_name, qualifier)
+
+ if fn:
+ if body.get("Publish", False):
+ fn = self.publish_function(function_name)
+
+ config = fn.update_function_code(body)
+ return config
+ else:
+ return None
+
+ def update_function_configuration(self, function_name, qualifier, body):
+ fn = self.get_function(function_name, qualifier)
+
+ return fn.update_configuration(body) if fn else None
+
+ def invoke(self, function_name, qualifier, body, headers, response_headers):
+ fn = self.get_function(function_name, qualifier)
+ if fn:
+ payload = fn.invoke(body, headers, response_headers)
+ response_headers["Content-Length"] = str(len(payload))
+ return payload
+ else:
+ return None
+
+ def put_function_concurrency(self, function_name, reserved_concurrency):
+ fn = self.get_function(function_name)
+ fn.reserved_concurrency = reserved_concurrency
+ return fn.reserved_concurrency
+
+ def delete_function_concurrency(self, function_name):
+ fn = self.get_function(function_name)
+ fn.reserved_concurrency = None
+ return fn.reserved_concurrency
+
+ def get_function_concurrency(self, function_name):
+ fn = self.get_function(function_name)
+ return fn.reserved_concurrency
+
+
+def do_validate_s3():
+ return os.environ.get("VALIDATE_LAMBDA_S3", "") in ["", "1", "true"]
+
+
+lambda_backends = BackendDict(LambdaBackend, "lambda")
diff --git a/contrib/python/moto/py3/moto/awslambda/policy.py b/contrib/python/moto/py3/moto/awslambda/policy.py
new file mode 100644
index 0000000000..c17aa8c9f9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/policy.py
@@ -0,0 +1,143 @@
+import json
+import uuid
+
+from moto.awslambda.exceptions import (
+ PreconditionFailedException,
+ UnknownPolicyException,
+)
+
+
+class Policy:
+ def __init__(self, parent):
+ self.revision = str(uuid.uuid4())
+ self.statements = []
+ self.parent = parent
+
+ def wire_format(self):
+ p = self.get_policy()
+ p["Policy"] = json.dumps(p["Policy"])
+ return json.dumps(p)
+
+ def get_policy(self):
+ return {
+ "Policy": {
+ "Version": "2012-10-17",
+ "Id": "default",
+ "Statement": self.statements,
+ },
+ "RevisionId": self.revision,
+ }
+
+ # adds the raw JSON statement to the policy
+ def add_statement(self, raw, qualifier=None):
+ policy = json.loads(raw, object_hook=self.decode_policy)
+ if len(policy.revision) > 0 and self.revision != policy.revision:
+ raise PreconditionFailedException(
+ "The RevisionId provided does not match the latest RevisionId"
+ " for the Lambda function or alias. Call the GetFunction or the GetAlias API to retrieve"
+ " the latest RevisionId for your resource."
+ )
+ # Remove #LATEST from the Resource (Lambda ARN)
+ if policy.statements[0].get("Resource", "").endswith("$LATEST"):
+ policy.statements[0]["Resource"] = policy.statements[0]["Resource"][0:-8]
+ if qualifier:
+ policy.statements[0]["Resource"] = (
+ policy.statements[0]["Resource"] + ":" + qualifier
+ )
+ self.statements.append(policy.statements[0])
+ self.revision = str(uuid.uuid4())
+
+ # removes the statement that matches 'sid' from the policy
+ def del_statement(self, sid, revision=""):
+ if len(revision) > 0 and self.revision != revision:
+ raise PreconditionFailedException(
+ "The RevisionId provided does not match the latest RevisionId"
+ " for the Lambda function or alias. Call the GetFunction or the GetAlias API to retrieve"
+ " the latest RevisionId for your resource."
+ )
+ for statement in self.statements:
+ if "Sid" in statement and statement["Sid"] == sid:
+ self.statements.remove(statement)
+ break
+ else:
+ raise UnknownPolicyException()
+
+ # converts AddPermission request to PolicyStatement
+ # https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html
+ def decode_policy(self, obj):
+ # import pydevd
+ # pydevd.settrace("localhost", port=5678)
+ policy = Policy(self.parent)
+ policy.revision = obj.get("RevisionId", "")
+
+ # set some default values if these keys are not set
+ self.ensure_set(obj, "Effect", "Allow")
+ self.ensure_set(obj, "Resource", self.parent.function_arn + ":$LATEST")
+ self.ensure_set(obj, "StatementId", str(uuid.uuid4()))
+
+ # transform field names and values
+ self.transform_property(obj, "StatementId", "Sid", self.nop_formatter)
+ self.transform_property(obj, "Principal", "Principal", self.principal_formatter)
+
+ self.transform_property(
+ obj, "SourceArn", "SourceArn", self.source_arn_formatter
+ )
+ self.transform_property(
+ obj, "SourceAccount", "SourceAccount", self.source_account_formatter
+ )
+
+ # remove RevisionId and EventSourceToken if they are set
+ self.remove_if_set(obj, ["RevisionId", "EventSourceToken"])
+
+ # merge conditional statements into a single map under the Condition key
+ self.condition_merge(obj)
+
+ # append resulting statement to policy.statements
+ policy.statements.append(obj)
+
+ return policy
+
+ def nop_formatter(self, obj):
+ return obj
+
+ def ensure_set(self, obj, key, value):
+ if key not in obj:
+ obj[key] = value
+
+ def principal_formatter(self, obj):
+ if isinstance(obj, str):
+ if obj.endswith(".amazonaws.com"):
+ return {"Service": obj}
+ if obj.endswith(":root"):
+ return {"AWS": obj}
+ return obj
+
+ def source_account_formatter(self, obj):
+ return {"StringEquals": {"AWS:SourceAccount": obj}}
+
+ def source_arn_formatter(self, obj):
+ return {"ArnLike": {"AWS:SourceArn": obj}}
+
+ def transform_property(self, obj, old_name, new_name, formatter):
+ if old_name in obj:
+ obj[new_name] = formatter(obj[old_name])
+ if new_name != old_name:
+ del obj[old_name]
+
+ def remove_if_set(self, obj, keys):
+ for key in keys:
+ if key in obj:
+ del obj[key]
+
+ def condition_merge(self, obj):
+ if "SourceArn" in obj:
+ if "Condition" not in obj:
+ obj["Condition"] = {}
+ obj["Condition"].update(obj["SourceArn"])
+ del obj["SourceArn"]
+
+ if "SourceAccount" in obj:
+ if "Condition" not in obj:
+ obj["Condition"] = {}
+ obj["Condition"].update(obj["SourceAccount"])
+ del obj["SourceAccount"]
diff --git a/contrib/python/moto/py3/moto/awslambda/responses.py b/contrib/python/moto/py3/moto/awslambda/responses.py
new file mode 100644
index 0000000000..c1d2f4a0ac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/responses.py
@@ -0,0 +1,541 @@
+import json
+import sys
+
+from urllib.parse import unquote
+
+from moto.core.utils import amz_crc32, amzn_request_id, path_url
+from moto.core.responses import BaseResponse
+from .models import lambda_backends
+
+
+class LambdaResponse(BaseResponse):
+ @property
+ def json_body(self):
+ """
+ :return: JSON
+ :rtype: dict
+ """
+ return json.loads(self.body)
+
+ @property
+ def lambda_backend(self):
+ """
+ Get backend
+ :return: Lambda Backend
+ :rtype: moto.awslambda.models.LambdaBackend
+ """
+ return lambda_backends[self.region]
+
+ def root(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._list_functions()
+ elif request.method == "POST":
+ return self._create_function()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def event_source_mappings(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ querystring = self.querystring
+ event_source_arn = querystring.get("EventSourceArn", [None])[0]
+ function_name = querystring.get("FunctionName", [None])[0]
+ return self._list_event_source_mappings(event_source_arn, function_name)
+ elif request.method == "POST":
+ return self._create_event_source_mapping()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def aliases(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self._create_alias()
+
+ def alias(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self._delete_alias()
+ elif request.method == "GET":
+ return self._get_alias()
+ elif request.method == "PUT":
+ return self._update_alias()
+
+ def event_source_mapping(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ path = request.path if hasattr(request, "path") else path_url(request.url)
+ uuid = path.split("/")[-1]
+ if request.method == "GET":
+ return self._get_event_source_mapping(uuid)
+ elif request.method == "PUT":
+ return self._update_event_source_mapping(uuid)
+ elif request.method == "DELETE":
+ return self._delete_event_source_mapping(uuid)
+ else:
+ raise ValueError("Cannot handle request")
+
+ def list_layers(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._list_layers()
+
+ def layers_version(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self._delete_layer_version()
+ elif request.method == "GET":
+ return self._get_layer_version()
+
+ def layers_versions(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._get_layer_versions()
+ if request.method == "POST":
+ return self._publish_layer_version()
+
+ def function(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._get_function()
+ elif request.method == "DELETE":
+ return self._delete_function()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def versions(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ # This is ListVersionByFunction
+
+ path = request.path if hasattr(request, "path") else path_url(request.url)
+ function_name = path.split("/")[-2]
+ return self._list_versions_by_function(function_name)
+
+ elif request.method == "POST":
+ return self._publish_function()
+ else:
+ raise ValueError("Cannot handle request")
+
+ @amz_crc32
+ @amzn_request_id
+ def invoke(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self._invoke(request)
+ else:
+ raise ValueError("Cannot handle request")
+
+ @amz_crc32
+ @amzn_request_id
+ def invoke_async(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self._invoke_async()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def tag(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._list_tags()
+ elif request.method == "POST":
+ return self._tag_resource()
+ elif request.method == "DELETE":
+ return self._untag_resource()
+ else:
+ raise ValueError("Cannot handle {0} request".format(request.method))
+
+ def policy(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._get_policy(request)
+ elif request.method == "POST":
+ return self._add_policy(request)
+ elif request.method == "DELETE":
+ return self._del_policy(request, self.querystring)
+ else:
+ raise ValueError("Cannot handle {0} request".format(request.method))
+
+ def configuration(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self._put_configuration()
+ if request.method == "GET":
+ return self._get_function_configuration()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def code(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self._put_code()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def code_signing_config(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self._get_code_signing_config()
+
+ def function_concurrency(self, request, full_url, headers):
+ http_method = request.method
+ self.setup_class(request, full_url, headers)
+
+ if http_method == "GET":
+ return self._get_function_concurrency()
+ elif http_method == "DELETE":
+ return self._delete_function_concurrency()
+ elif http_method == "PUT":
+ return self._put_function_concurrency()
+ else:
+ raise ValueError("Cannot handle request")
+
+ def _add_policy(self, request):
+ path = request.path if hasattr(request, "path") else path_url(request.url)
+ function_name = unquote(path.split("/")[-2])
+ qualifier = self.querystring.get("Qualifier", [None])[0]
+ statement = self.body
+ self.lambda_backend.add_permission(function_name, qualifier, statement)
+ return 200, {}, json.dumps({"Statement": statement})
+
+ def _get_policy(self, request):
+ path = request.path if hasattr(request, "path") else path_url(request.url)
+ function_name = unquote(path.split("/")[-2])
+ out = self.lambda_backend.get_policy(function_name)
+ return 200, {}, out
+
+ def _del_policy(self, request, querystring):
+ path = request.path if hasattr(request, "path") else path_url(request.url)
+ function_name = unquote(path.split("/")[-3])
+ statement_id = path.split("/")[-1].split("?")[0]
+ revision = querystring.get("RevisionId", "")
+ if self.lambda_backend.get_function(function_name):
+ self.lambda_backend.remove_permission(function_name, statement_id, revision)
+ return 204, {}, "{}"
+ else:
+ return 404, {}, "{}"
+
+ def _invoke(self, request):
+ response_headers = {}
+
+ # URL Decode in case it's a ARN:
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ qualifier = self._get_param("qualifier")
+
+ payload = self.lambda_backend.invoke(
+ function_name, qualifier, self.body, self.headers, response_headers
+ )
+ if payload:
+ if request.headers.get("X-Amz-Invocation-Type") != "Event":
+ if sys.getsizeof(payload) > 6000000:
+ response_headers["Content-Length"] = "142"
+ response_headers["x-amz-function-error"] = "Unhandled"
+ error_dict = {
+ "errorMessage": "Response payload size exceeded maximum allowed payload size (6291556 bytes).",
+ "errorType": "Function.ResponseSizeTooLarge",
+ }
+ payload = json.dumps(error_dict).encode("utf-8")
+
+ response_headers["content-type"] = "application/json"
+ if request.headers.get("X-Amz-Invocation-Type") == "Event":
+ status_code = 202
+ elif request.headers.get("X-Amz-Invocation-Type") == "DryRun":
+ status_code = 204
+ else:
+ if request.headers.get("X-Amz-Log-Type") != "Tail":
+ del response_headers["x-amz-log-result"]
+ status_code = 200
+ return status_code, response_headers, payload
+ else:
+ return 404, response_headers, "{}"
+
+ def _invoke_async(self):
+ response_headers = {}
+
+ function_name = unquote(self.path.rsplit("/", 3)[-3])
+
+ fn = self.lambda_backend.get_function(function_name, None)
+ payload = fn.invoke(self.body, self.headers, response_headers)
+ response_headers["Content-Length"] = str(len(payload))
+ return 202, response_headers, payload
+
+ def _list_functions(self):
+ querystring = self.querystring
+ func_version = querystring.get("FunctionVersion", [None])[0]
+ result = {"Functions": []}
+
+ for fn in self.lambda_backend.list_functions(func_version):
+ json_data = fn.get_configuration()
+ result["Functions"].append(json_data)
+
+ return 200, {}, json.dumps(result)
+
+ def _list_versions_by_function(self, function_name):
+ result = {"Versions": []}
+
+ functions = self.lambda_backend.list_versions_by_function(function_name)
+ if functions:
+ for fn in functions:
+ json_data = fn.get_configuration()
+ result["Versions"].append(json_data)
+
+ return 200, {}, json.dumps(result)
+
+ def _create_function(self):
+ fn = self.lambda_backend.create_function(self.json_body)
+ config = fn.get_configuration(on_create=True)
+ return 201, {}, json.dumps(config)
+
+ def _create_event_source_mapping(self):
+ fn = self.lambda_backend.create_event_source_mapping(self.json_body)
+ config = fn.get_configuration()
+ return 201, {}, json.dumps(config)
+
+ def _list_event_source_mappings(self, event_source_arn, function_name):
+ esms = self.lambda_backend.list_event_source_mappings(
+ event_source_arn, function_name
+ )
+ result = {"EventSourceMappings": [esm.get_configuration() for esm in esms]}
+ return 200, {}, json.dumps(result)
+
+ def _get_event_source_mapping(self, uuid):
+ result = self.lambda_backend.get_event_source_mapping(uuid)
+ if result:
+ return 200, {}, json.dumps(result.get_configuration())
+ else:
+ return 404, {}, "{}"
+
+ def _update_event_source_mapping(self, uuid):
+ result = self.lambda_backend.update_event_source_mapping(uuid, self.json_body)
+ if result:
+ return 202, {}, json.dumps(result.get_configuration())
+ else:
+ return 404, {}, "{}"
+
+ def _delete_event_source_mapping(self, uuid):
+ esm = self.lambda_backend.delete_event_source_mapping(uuid)
+ if esm:
+ json_result = esm.get_configuration()
+ json_result.update({"State": "Deleting"})
+ return 202, {}, json.dumps(json_result)
+ else:
+ return 404, {}, "{}"
+
+ def _publish_function(self):
+ function_name = unquote(self.path.split("/")[-2])
+ description = self._get_param("Description")
+
+ fn = self.lambda_backend.publish_function(function_name, description)
+ config = fn.get_configuration()
+ return 201, {}, json.dumps(config)
+
+ def _delete_function(self):
+ function_name = unquote(self.path.rsplit("/", 1)[-1])
+ qualifier = self._get_param("Qualifier", None)
+
+ self.lambda_backend.delete_function(function_name, qualifier)
+ return 204, {}, ""
+
+ @staticmethod
+ def _set_configuration_qualifier(configuration, qualifier):
+ if qualifier is None or qualifier == "$LATEST":
+ configuration["Version"] = "$LATEST"
+ if qualifier == "$LATEST":
+ configuration["FunctionArn"] += ":$LATEST"
+ return configuration
+
+ def _get_function(self):
+ function_name = unquote(self.path.rsplit("/", 1)[-1])
+ qualifier = self._get_param("Qualifier", None)
+
+ fn = self.lambda_backend.get_function(function_name, qualifier)
+
+ code = fn.get_code()
+ code["Configuration"] = self._set_configuration_qualifier(
+ code["Configuration"], qualifier
+ )
+ return 200, {}, json.dumps(code)
+
+ def _get_function_configuration(self):
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ qualifier = self._get_param("Qualifier", None)
+
+ fn = self.lambda_backend.get_function(function_name, qualifier)
+
+ configuration = self._set_configuration_qualifier(
+ fn.get_configuration(), qualifier
+ )
+ return 200, {}, json.dumps(configuration)
+
+ def _get_aws_region(self, full_url):
+ region = self.region_regex.search(full_url)
+ if region:
+ return region.group(1)
+ else:
+ return self.default_region
+
+ def _list_tags(self):
+ function_arn = unquote(self.path.rsplit("/", 1)[-1])
+
+ tags = self.lambda_backend.list_tags(function_arn)
+ return 200, {}, json.dumps({"Tags": tags})
+
+ def _tag_resource(self):
+ function_arn = unquote(self.path.rsplit("/", 1)[-1])
+
+ self.lambda_backend.tag_resource(function_arn, self.json_body["Tags"])
+ return 200, {}, "{}"
+
+ def _untag_resource(self):
+ function_arn = unquote(self.path.rsplit("/", 1)[-1])
+ tag_keys = self.querystring["tagKeys"]
+
+ self.lambda_backend.untag_resource(function_arn, tag_keys)
+ return 204, {}, "{}"
+
+ def _put_configuration(self):
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ qualifier = self._get_param("Qualifier", None)
+ resp = self.lambda_backend.update_function_configuration(
+ function_name, qualifier, body=self.json_body
+ )
+
+ if resp:
+ return 200, {}, json.dumps(resp)
+ else:
+ return 404, {}, "{}"
+
+ def _put_code(self):
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ qualifier = self._get_param("Qualifier", None)
+ resp = self.lambda_backend.update_function_code(
+ function_name, qualifier, body=self.json_body
+ )
+
+ if resp:
+ return 200, {}, json.dumps(resp)
+ else:
+ return 404, {}, "{}"
+
+ def _get_code_signing_config(self):
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ resp = self.lambda_backend.get_code_signing_config(function_name)
+ return 200, {}, json.dumps(resp)
+
+ def _get_function_concurrency(self):
+ path_function_name = unquote(self.path.rsplit("/", 2)[-2])
+ function_name = self.lambda_backend.get_function(path_function_name)
+
+ if function_name is None:
+ return 404, {}, "{}"
+
+ resp = self.lambda_backend.get_function_concurrency(path_function_name)
+ return 200, {}, json.dumps({"ReservedConcurrentExecutions": resp})
+
+ def _delete_function_concurrency(self):
+ path_function_name = unquote(self.path.rsplit("/", 2)[-2])
+ function_name = self.lambda_backend.get_function(path_function_name)
+
+ if function_name is None:
+ return 404, {}, "{}"
+
+ self.lambda_backend.delete_function_concurrency(path_function_name)
+
+ return 204, {}, "{}"
+
+ def _put_function_concurrency(self):
+ path_function_name = unquote(self.path.rsplit("/", 2)[-2])
+ function = self.lambda_backend.get_function(path_function_name)
+
+ if function is None:
+ return 404, {}, "{}"
+
+ concurrency = self._get_param("ReservedConcurrentExecutions", None)
+ resp = self.lambda_backend.put_function_concurrency(
+ path_function_name, concurrency
+ )
+
+ return 200, {}, json.dumps({"ReservedConcurrentExecutions": resp})
+
+ def _list_layers(self):
+ layers = self.lambda_backend.list_layers()
+ return 200, {}, json.dumps({"Layers": layers})
+
+ def _delete_layer_version(self):
+ layer_name = self.path.split("/")[-3]
+ layer_version = self.path.split("/")[-1]
+
+ self.lambda_backend.delete_layer_version(layer_name, layer_version)
+ return 200, {}, "{}"
+
+ def _get_layer_version(self):
+ layer_name = self.path.split("/")[-3]
+ layer_version = self.path.split("/")[-1]
+
+ layer = self.lambda_backend.get_layer_version(layer_name, layer_version)
+ return 200, {}, json.dumps(layer.get_layer_version())
+
+ def _get_layer_versions(self):
+ layer_name = self.path.rsplit("/", 2)[-2]
+ layer_versions = self.lambda_backend.get_layer_versions(layer_name)
+ return (
+ 200,
+ {},
+ json.dumps(
+ {"LayerVersions": [lv.get_layer_version() for lv in layer_versions]}
+ ),
+ )
+
+ def _publish_layer_version(self):
+ spec = self.json_body
+ if "LayerName" not in spec:
+ spec["LayerName"] = self.path.rsplit("/", 2)[-2]
+ layer_version = self.lambda_backend.publish_layer_version(spec)
+ config = layer_version.get_layer_version()
+ return 201, {}, json.dumps(config)
+
+ def _create_alias(self):
+ function_name = unquote(self.path.rsplit("/", 2)[-2])
+ params = json.loads(self.body)
+ alias_name = params.get("Name")
+ description = params.get("Description", "")
+ function_version = params.get("FunctionVersion")
+ routing_config = params.get("RoutingConfig")
+ alias = self.lambda_backend.create_alias(
+ name=alias_name,
+ function_name=function_name,
+ function_version=function_version,
+ description=description,
+ routing_config=routing_config,
+ )
+ return 201, {}, json.dumps(alias.to_json())
+
+ def _delete_alias(self):
+ function_name = unquote(self.path.rsplit("/")[-3])
+ alias_name = unquote(self.path.rsplit("/", 2)[-1])
+ self.lambda_backend.delete_alias(name=alias_name, function_name=function_name)
+ return 201, {}, "{}"
+
+ def _get_alias(self):
+ function_name = unquote(self.path.rsplit("/")[-3])
+ alias_name = unquote(self.path.rsplit("/", 2)[-1])
+ alias = self.lambda_backend.get_alias(
+ name=alias_name, function_name=function_name
+ )
+ return 201, {}, json.dumps(alias.to_json())
+
+ def _update_alias(self):
+ function_name = unquote(self.path.rsplit("/")[-3])
+ alias_name = unquote(self.path.rsplit("/", 2)[-1])
+ params = json.loads(self.body)
+ description = params.get("Description")
+ function_version = params.get("FunctionVersion")
+ routing_config = params.get("RoutingConfig")
+ alias = self.lambda_backend.update_alias(
+ name=alias_name,
+ function_name=function_name,
+ function_version=function_version,
+ description=description,
+ routing_config=routing_config,
+ )
+ return 201, {}, json.dumps(alias.to_json())
diff --git a/contrib/python/moto/py3/moto/awslambda/urls.py b/contrib/python/moto/py3/moto/awslambda/urls.py
new file mode 100644
index 0000000000..a567197ed0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/urls.py
@@ -0,0 +1,28 @@
+from .responses import LambdaResponse
+
+url_bases = [r"https?://lambda\.(.+)\.amazonaws\.com"]
+
+response = LambdaResponse()
+
+url_paths = {
+ r"{0}/(?P<api_version>[^/]+)/functions/?$": response.root,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/?$": response.function,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases$": response.aliases,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases/(?P<alias_name>[\w_-]+)$": response.alias,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/versions/?$": response.versions,
+ r"{0}/(?P<api_version>[^/]+)/event-source-mappings/?$": response.event_source_mappings,
+ r"{0}/(?P<api_version>[^/]+)/event-source-mappings/(?P<UUID>[\w_-]+)/?$": response.event_source_mapping,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_-]+)/invocations/?$": response.invoke,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<resource_arn>.+)/invocations/?$": response.invoke,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async/?$": response.invoke_async,
+ r"{0}/(?P<api_version>[^/]+)/tags/(?P<resource_arn>.+)": response.tag,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/(?P<statement_id>[\w_-]+)$": response.policy,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/?$": response.policy,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/configuration/?$": response.configuration,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/code/?$": response.code,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/code-signing-config$": response.code_signing_config,
+ r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/concurrency/?$": response.function_concurrency,
+ r"{0}/(?P<api_version>[^/]+)/layers/?$": response.list_layers,
+ r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/?$": response.layers_versions,
+ r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/(?P<layer_version>[\w_-]+)$": response.layers_version,
+}
diff --git a/contrib/python/moto/py3/moto/awslambda/utils.py b/contrib/python/moto/py3/moto/awslambda/utils.py
new file mode 100644
index 0000000000..99fbae3f93
--- /dev/null
+++ b/contrib/python/moto/py3/moto/awslambda/utils.py
@@ -0,0 +1,34 @@
+from collections import namedtuple
+from functools import partial
+
+ARN = namedtuple("ARN", ["region", "account", "function_name", "version"])
+LAYER_ARN = namedtuple("LAYER_ARN", ["region", "account", "layer_name", "version"])
+
+
+def make_arn(resource_type, region, account, name):
+ return "arn:aws:lambda:{0}:{1}:{2}:{3}".format(region, account, resource_type, name)
+
+
+make_function_arn = partial(make_arn, "function")
+make_layer_arn = partial(make_arn, "layer")
+
+
+def make_ver_arn(resource_type, region, account, name, version="1"):
+ arn = make_arn(resource_type, region, account, name)
+ return "{0}:{1}".format(arn, version)
+
+
+make_function_ver_arn = partial(make_ver_arn, "function")
+make_layer_ver_arn = partial(make_ver_arn, "layer")
+
+
+def split_arn(arn_type, arn):
+ arn = arn.replace("arn:aws:lambda:", "")
+
+ region, account, _, name, version = arn.split(":")
+
+ return arn_type(region, account, name, version)
+
+
+split_function_arn = partial(split_arn, ARN)
+split_layer_arn = partial(split_arn, LAYER_ARN)
diff --git a/contrib/python/moto/py3/moto/backend_index.py b/contrib/python/moto/py3/moto/backend_index.py
new file mode 100644
index 0000000000..6dd464cc5a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/backend_index.py
@@ -0,0 +1,164 @@
+# autogenerated by scripts/update_backend_index.py
+import re
+
+backend_url_patterns = [
+ ("acm", re.compile("https?://acm\\.(.+)\\.amazonaws\\.com")),
+ ("apigateway", re.compile("https?://apigateway\\.(.+)\\.amazonaws.com")),
+ (
+ "applicationautoscaling",
+ re.compile("https?://application-autoscaling\\.(.+)\\.amazonaws.com"),
+ ),
+ ("appsync", re.compile("https?://appsync\\.(.+)\\.amazonaws\\.com")),
+ ("athena", re.compile("https?://athena\\.(.+)\\.amazonaws\\.com")),
+ ("autoscaling", re.compile("https?://autoscaling\\.(.+)\\.amazonaws\\.com")),
+ ("batch", re.compile("https?://batch\\.(.+)\\.amazonaws.com")),
+ ("budgets", re.compile("https?://budgets\\.amazonaws\\.com")),
+ ("cloudformation", re.compile("https?://cloudformation\\.(.+)\\.amazonaws\\.com")),
+ ("cloudfront", re.compile("https?://cloudfront\\.amazonaws\\.com")),
+ ("cloudtrail", re.compile("https?://cloudtrail\\.(.+)\\.amazonaws\\.com")),
+ ("cloudwatch", re.compile("https?://monitoring\\.(.+)\\.amazonaws.com")),
+ ("codecommit", re.compile("https?://codecommit\\.(.+)\\.amazonaws\\.com")),
+ ("codepipeline", re.compile("https?://codepipeline\\.(.+)\\.amazonaws\\.com")),
+ (
+ "cognito-identity",
+ re.compile("https?://cognito-identity\\.(.+)\\.amazonaws.com"),
+ ),
+ ("cognito-idp", re.compile("https?://cognito-idp\\.(.+)\\.amazonaws.com")),
+ ("config", re.compile("https?://config\\.(.+)\\.amazonaws\\.com")),
+ ("databrew", re.compile("https?://databrew\\.(.+)\\.amazonaws.com")),
+ ("datapipeline", re.compile("https?://datapipeline\\.(.+)\\.amazonaws\\.com")),
+ ("datasync", re.compile("https?://(.*\\.)?(datasync)\\.(.+)\\.amazonaws.com")),
+ ("dax", re.compile("https?://dax\\.(.+)\\.amazonaws\\.com")),
+ ("dms", re.compile("https?://dms\\.(.+)\\.amazonaws\\.com")),
+ ("ds", re.compile("https?://ds\\.(.+)\\.amazonaws\\.com")),
+ ("dynamodb", re.compile("https?://dynamodb\\.(.+)\\.amazonaws\\.com")),
+ (
+ "dynamodbstreams",
+ re.compile("https?://streams\\.dynamodb\\.(.+)\\.amazonaws.com"),
+ ),
+ ("ebs", re.compile("https?://ebs\\.(.+)\\.amazonaws\\.com")),
+ ("ec2", re.compile("https?://ec2\\.(.+)\\.amazonaws\\.com(|\\.cn)")),
+ (
+ "ec2instanceconnect",
+ re.compile("https?://ec2-instance-connect\\.(.+)\\.amazonaws\\.com"),
+ ),
+ ("ecr", re.compile("https?://ecr\\.(.+)\\.amazonaws\\.com")),
+ ("ecr", re.compile("https?://api\\.ecr\\.(.+)\\.amazonaws\\.com")),
+ ("ecs", re.compile("https?://ecs\\.(.+)\\.amazonaws\\.com")),
+ ("efs", re.compile("https?://elasticfilesystem\\.(.+)\\.amazonaws.com")),
+ ("efs", re.compile("https?://elasticfilesystem\\.amazonaws.com")),
+ ("eks", re.compile("https?://eks\\.(.+)\\.amazonaws.com")),
+ ("elasticache", re.compile("https?://elasticache\\.(.+)\\.amazonaws\\.com")),
+ (
+ "elasticbeanstalk",
+ re.compile(
+ "https?://elasticbeanstalk\\.(?P<region>[a-zA-Z0-9\\-_]+)\\.amazonaws.com"
+ ),
+ ),
+ (
+ "elastictranscoder",
+ re.compile("https?://elastictranscoder\\.(.+)\\.amazonaws.com"),
+ ),
+ ("elb", re.compile("https?://elasticloadbalancing\\.(.+)\\.amazonaws.com")),
+ ("elbv2", re.compile("https?://elasticloadbalancing\\.(.+)\\.amazonaws.com")),
+ ("emr", re.compile("https?://(.+)\\.elasticmapreduce\\.amazonaws.com")),
+ ("emr", re.compile("https?://elasticmapreduce\\.(.+)\\.amazonaws.com")),
+ ("emr-containers", re.compile("https?://emr-containers\\.(.+)\\.amazonaws\\.com")),
+ ("es", re.compile("https?://es\\.(.+)\\.amazonaws\\.com")),
+ ("events", re.compile("https?://events\\.(.+)\\.amazonaws\\.com")),
+ ("firehose", re.compile("https?://firehose\\.(.+)\\.amazonaws\\.com")),
+ ("forecast", re.compile("https?://forecast\\.(.+)\\.amazonaws\\.com")),
+ ("glacier", re.compile("https?://glacier\\.(.+)\\.amazonaws.com")),
+ ("glue", re.compile("https?://glue\\.(.+)\\.amazonaws\\.com")),
+ ("greengrass", re.compile("https?://greengrass\\.(.+)\\.amazonaws.com")),
+ ("guardduty", re.compile("https?://guardduty\\.(.+)\\.amazonaws\\.com")),
+ ("iam", re.compile("https?://iam\\.(.*\\.)?amazonaws\\.com")),
+ ("iot", re.compile("https?://iot\\.(.+)\\.amazonaws\\.com")),
+ ("iot-data", re.compile("https?://data\\.iot\\.(.+)\\.amazonaws.com")),
+ ("iot-data", re.compile("https?://data-ats\\.iot\\.(.+)\\.amazonaws.com")),
+ ("kinesis", re.compile("https?://kinesis\\.(.+)\\.amazonaws\\.com")),
+ ("kinesisvideo", re.compile("https?://kinesisvideo\\.(.+)\\.amazonaws.com")),
+ (
+ "kinesis-video-archived-media",
+ re.compile("https?://.*\\.kinesisvideo\\.(.+)\\.amazonaws.com"),
+ ),
+ ("kms", re.compile("https?://kms\\.(.+)\\.amazonaws\\.com")),
+ ("lambda", re.compile("https?://lambda\\.(.+)\\.amazonaws\\.com")),
+ ("logs", re.compile("https?://logs\\.(.+)\\.amazonaws\\.com")),
+ (
+ "managedblockchain",
+ re.compile("https?://managedblockchain\\.(.+)\\.amazonaws.com"),
+ ),
+ ("mediaconnect", re.compile("https?://mediaconnect\\.(.+)\\.amazonaws.com")),
+ ("medialive", re.compile("https?://medialive\\.(.+)\\.amazonaws.com")),
+ ("mediapackage", re.compile("https?://mediapackage\\.(.+)\\.amazonaws.com")),
+ ("mediastore", re.compile("https?://mediastore\\.(.+)\\.amazonaws\\.com")),
+ (
+ "mediastore-data",
+ re.compile("https?://data\\.mediastore\\.(.+)\\.amazonaws.com"),
+ ),
+ ("mq", re.compile("https?://mq\\.(.+)\\.amazonaws\\.com")),
+ ("opsworks", re.compile("https?://opsworks\\.us-east-1\\.amazonaws.com")),
+ ("organizations", re.compile("https?://organizations\\.(.+)\\.amazonaws\\.com")),
+ ("pinpoint", re.compile("https?://pinpoint\\.(.+)\\.amazonaws\\.com")),
+ ("polly", re.compile("https?://polly\\.(.+)\\.amazonaws.com")),
+ ("quicksight", re.compile("https?://quicksight\\.(.+)\\.amazonaws\\.com")),
+ ("ram", re.compile("https?://ram\\.(.+)\\.amazonaws.com")),
+ ("rds", re.compile("https?://rds\\.(.+)\\.amazonaws\\.com")),
+ ("rds", re.compile("https?://rds\\.amazonaws\\.com")),
+ ("redshift", re.compile("https?://redshift\\.(.+)\\.amazonaws\\.com")),
+ ("redshift-data", re.compile("https?://redshift-data\\.(.+)\\.amazonaws\\.com")),
+ ("rekognition", re.compile("https?://rekognition\\.(.+)\\.amazonaws\\.com")),
+ (
+ "resource-groups",
+ re.compile("https?://resource-groups(-fips)?\\.(.+)\\.amazonaws.com"),
+ ),
+ ("resourcegroupstaggingapi", re.compile("https?://tagging\\.(.+)\\.amazonaws.com")),
+ ("route53", re.compile("https?://route53(\\..+)?\\.amazonaws.com")),
+ (
+ "route53resolver",
+ re.compile("https?://route53resolver\\.(.+)\\.amazonaws\\.com"),
+ ),
+ ("s3", re.compile("https?://s3(?!-control)(.*)\\.amazonaws.com")),
+ (
+ "s3",
+ re.compile(
+ "https?://(?P<bucket_name>[a-zA-Z0-9\\-_.]*)\\.?s3(?!-control)(.*)\\.amazonaws.com"
+ ),
+ ),
+ (
+ "s3control",
+ re.compile("https?://([0-9]+)\\.s3-control\\.(.+)\\.amazonaws\\.com"),
+ ),
+ ("sagemaker", re.compile("https?://api\\.sagemaker\\.(.+)\\.amazonaws.com")),
+ ("sdb", re.compile("https?://sdb\\.(.+)\\.amazonaws\\.com")),
+ ("secretsmanager", re.compile("https?://secretsmanager\\.(.+)\\.amazonaws\\.com")),
+ (
+ "servicediscovery",
+ re.compile("https?://servicediscovery\\.(.+)\\.amazonaws\\.com"),
+ ),
+ ("ses", re.compile("https?://email\\.(.+)\\.amazonaws\\.com")),
+ ("ses", re.compile("https?://ses\\.(.+)\\.amazonaws\\.com")),
+ ("sns", re.compile("https?://sns\\.(.+)\\.amazonaws\\.com")),
+ ("sqs", re.compile("https?://(.*\\.)?(queue|sqs)\\.(.*\\.)?amazonaws\\.com")),
+ ("ssm", re.compile("https?://ssm\\.(.+)\\.amazonaws\\.com")),
+ ("ssm", re.compile("https?://ssm\\.(.+)\\.amazonaws\\.com\\.cn")),
+ ("sso-admin", re.compile("https?://sso\\.(.+)\\.amazonaws\\.com")),
+ ("stepfunctions", re.compile("https?://states\\.(.+)\\.amazonaws.com")),
+ ("sts", re.compile("https?://sts\\.(.*\\.)?amazonaws\\.com")),
+ ("support", re.compile("https?://support\\.(.+)\\.amazonaws\\.com")),
+ ("swf", re.compile("https?://swf\\.(.+)\\.amazonaws\\.com")),
+ ("textract", re.compile("https?://textract\\.(.+)\\.amazonaws\\.com")),
+ (
+ "timestream-write",
+ re.compile("https?://ingest\\.timestream\\.(.+)\\.amazonaws\\.com"),
+ ),
+ (
+ "timestream-write",
+ re.compile("https?://ingest\\.timestream\\.(.+)\\.amazonaws\\.com/"),
+ ),
+ ("transcribe", re.compile("https?://transcribe\\.(.+)\\.amazonaws\\.com")),
+ ("wafv2", re.compile("https?://wafv2\\.(.+)\\.amazonaws.com")),
+ ("xray", re.compile("https?://xray\\.(.+)\\.amazonaws.com")),
+ ("dynamodb_v20111205", re.compile("https?://dynamodb\\.(.+)\\.amazonaws\\.com")),
+]
diff --git a/contrib/python/moto/py3/moto/backends.py b/contrib/python/moto/py3/moto/backends.py
new file mode 100644
index 0000000000..048b568510
--- /dev/null
+++ b/contrib/python/moto/py3/moto/backends.py
@@ -0,0 +1,58 @@
+import importlib
+import moto
+import sys
+
+
+decorators = [
+ d
+ for d in dir(moto)
+ if d.startswith("mock_") and not d.endswith("_deprecated") and not d == "mock_all"
+]
+decorator_functions = [getattr(moto, f) for f in decorators]
+BACKENDS = {f.boto3_name: (f.name, f.backend) for f in decorator_functions}
+BACKENDS["dynamodb_v20111205"] = ("dynamodb_v20111205", "dynamodb_backends")
+BACKENDS["moto_api"] = ("moto_api._internal", "moto_api_backends")
+BACKENDS["instance_metadata"] = ("instance_metadata", "instance_metadata_backends")
+BACKENDS["s3bucket_path"] = ("s3", "s3_backends")
+
+
+def _import_backend(module_name, backends_name):
+ module = importlib.import_module("moto." + module_name)
+ return getattr(module, backends_name)
+
+
+def backends():
+ for module_name, backends_name in BACKENDS.values():
+ yield _import_backend(module_name, backends_name)
+
+
+def unique_backends():
+ for module_name, backends_name in sorted(set(BACKENDS.values())):
+ yield _import_backend(module_name, backends_name)
+
+
+def loaded_backends():
+ loaded_modules = sys.modules.keys()
+ loaded_modules = [m for m in loaded_modules if m.startswith("moto.")]
+ imported_backends = [
+ name
+ for name, (module_name, _) in BACKENDS.items()
+ if f"moto.{module_name}" in loaded_modules
+ ]
+ for name in imported_backends:
+ module_name, backends_name = BACKENDS[name]
+ yield name, _import_backend(module_name, backends_name)
+
+
+def get_backend(name):
+ module_name, backends_name = BACKENDS[name]
+ return _import_backend(module_name, backends_name)
+
+
+def get_model(name, region_name):
+ for backends_ in backends():
+ for region, backend in backends_.items():
+ if region == region_name:
+ models = getattr(backend.__class__, "__models__", {})
+ if name in models:
+ return list(getattr(backend, models[name])())
diff --git a/contrib/python/moto/py3/moto/batch/__init__.py b/contrib/python/moto/py3/moto/batch/__init__.py
new file mode 100644
index 0000000000..753e770026
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/__init__.py
@@ -0,0 +1,5 @@
+from .models import batch_backends
+from ..core.models import base_decorator
+
+batch_backend = batch_backends["us-east-1"]
+mock_batch = base_decorator(batch_backends)
diff --git a/contrib/python/moto/py3/moto/batch/exceptions.py b/contrib/python/moto/py3/moto/batch/exceptions.py
new file mode 100644
index 0000000000..b5b8b324c4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/exceptions.py
@@ -0,0 +1,23 @@
+from moto.core.exceptions import AWSError
+
+
+class InvalidRequestException(AWSError):
+ TYPE = "InvalidRequestException"
+
+
+class InvalidParameterValueException(AWSError):
+ TYPE = "InvalidParameterValue"
+
+
+class ValidationError(AWSError):
+ TYPE = "ValidationError"
+
+
+class InternalFailure(AWSError):
+ TYPE = "InternalFailure"
+ STATUS = 500
+
+
+class ClientException(AWSError):
+ TYPE = "ClientException"
+ STATUS = 400
diff --git a/contrib/python/moto/py3/moto/batch/models.py b/contrib/python/moto/py3/moto/batch/models.py
new file mode 100644
index 0000000000..8afe18dc6c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/models.py
@@ -0,0 +1,1621 @@
+import re
+from itertools import cycle
+from time import sleep
+import datetime
+import time
+import uuid
+import logging
+import threading
+import dateutil.parser
+from sys import platform
+
+from moto.core import BaseBackend, BaseModel, CloudFormationModel, get_account_id
+from moto.iam import iam_backends
+from moto.ec2 import ec2_backends
+from moto.ecs import ecs_backends
+from moto.logs import logs_backends
+from moto.utilities.tagging_service import TaggingService
+
+from .exceptions import InvalidParameterValueException, ClientException, ValidationError
+from .utils import (
+ make_arn_for_compute_env,
+ make_arn_for_job_queue,
+ make_arn_for_task_def,
+ lowercase_first_key,
+)
+from moto.ec2.exceptions import InvalidSubnetIdError
+from moto.ec2.models.instance_types import INSTANCE_TYPES as EC2_INSTANCE_TYPES
+from moto.ec2.models.instance_types import INSTANCE_FAMILIES as EC2_INSTANCE_FAMILIES
+from moto.iam.exceptions import IAMNotFoundException
+from moto.core.utils import unix_time_millis, BackendDict
+from moto.moto_api import state_manager
+from moto.moto_api._internal.managed_state_model import ManagedState
+from moto.utilities.docker_utilities import DockerModel
+from moto import settings
+
+logger = logging.getLogger(__name__)
+COMPUTE_ENVIRONMENT_NAME_REGEX = re.compile(
+ r"^[A-Za-z0-9][A-Za-z0-9_-]{1,126}[A-Za-z0-9]$"
+)
+
+
+def datetime2int_milliseconds(date):
+ """
+ AWS returns timestamps in milliseconds
+ We don't use milliseconds timestamps internally,
+ this method should be used only in describe() method
+ """
+ return int(date.timestamp() * 1000)
+
+
+def datetime2int(date):
+ return int(time.mktime(date.timetuple()))
+
+
+class ComputeEnvironment(CloudFormationModel):
+ def __init__(
+ self,
+ compute_environment_name,
+ _type,
+ state,
+ compute_resources,
+ service_role,
+ region_name,
+ ):
+ self.name = compute_environment_name
+ self.env_type = _type
+ self.state = state
+ self.compute_resources = compute_resources
+ self.service_role = service_role
+ self.arn = make_arn_for_compute_env(
+ get_account_id(), compute_environment_name, region_name
+ )
+
+ self.instances = []
+ self.ecs_arn = None
+ self.ecs_name = None
+
+ def add_instance(self, instance):
+ self.instances.append(instance)
+
+ def set_ecs(self, arn, name):
+ self.ecs_arn = arn
+ self.ecs_name = name
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "ComputeEnvironmentName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html
+ return "AWS::Batch::ComputeEnvironment"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ backend = batch_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ env = backend.create_compute_environment(
+ resource_name,
+ properties["Type"],
+ properties.get("State", "ENABLED"),
+ lowercase_first_key(properties["ComputeResources"]),
+ properties["ServiceRole"],
+ )
+ arn = env[1]
+
+ return backend.get_compute_environment_by_arn(arn)
+
+
+class JobQueue(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ priority,
+ state,
+ environments,
+ env_order_json,
+ region_name,
+ backend,
+ tags=None,
+ ):
+ """
+ :param name: Job queue name
+ :type name: str
+ :param priority: Job queue priority
+ :type priority: int
+ :param state: Either ENABLED or DISABLED
+ :type state: str
+ :param environments: Compute Environments
+ :type environments: list of ComputeEnvironment
+ :param env_order_json: Compute Environments JSON for use when describing
+ :type env_order_json: list of dict
+ :param region_name: Region name
+ :type region_name: str
+ """
+ self.name = name
+ self.priority = priority
+ self.state = state
+ self.environments = environments
+ self.env_order_json = env_order_json
+ self.arn = make_arn_for_job_queue(get_account_id(), name, region_name)
+ self.status = "VALID"
+ self.backend = backend
+
+ if tags:
+ backend.tag_resource(self.arn, tags)
+
+ self.jobs = []
+
+ def describe(self):
+ result = {
+ "computeEnvironmentOrder": self.env_order_json,
+ "jobQueueArn": self.arn,
+ "jobQueueName": self.name,
+ "priority": self.priority,
+ "state": self.state,
+ "status": self.status,
+ "tags": self.backend.list_tags_for_resource(self.arn),
+ }
+
+ return result
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "JobQueueName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html
+ return "AWS::Batch::JobQueue"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ backend = batch_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ # Need to deal with difference case from cloudformation compute_resources, e.g. instanceRole vs InstanceRole
+ # Hacky fix to normalise keys, is making me think I want to start spamming cAsEiNsEnSiTiVe dictionaries
+ compute_envs = [
+ lowercase_first_key(dict_item)
+ for dict_item in properties["ComputeEnvironmentOrder"]
+ ]
+
+ queue = backend.create_job_queue(
+ queue_name=resource_name,
+ priority=properties["Priority"],
+ state=properties.get("State", "ENABLED"),
+ compute_env_order=compute_envs,
+ )
+ arn = queue[1]
+
+ return backend.get_job_queue_by_arn(arn)
+
+
+class JobDefinition(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ parameters,
+ _type,
+ container_properties,
+ region_name,
+ tags=None,
+ revision=0,
+ retry_strategy=0,
+ timeout=None,
+ backend=None,
+ platform_capabilities=None,
+ propagate_tags=None,
+ ):
+ self.name = name
+ self.retry_strategy = retry_strategy
+ self.type = _type
+ self.revision = revision
+ self._region = region_name
+ self.container_properties = container_properties
+ self.arn = None
+ self.status = "ACTIVE"
+ self.parameters = parameters or {}
+ self.timeout = timeout
+ self.backend = backend
+ self.platform_capabilities = platform_capabilities
+ self.propagate_tags = propagate_tags
+
+ if "resourceRequirements" not in self.container_properties:
+ self.container_properties["resourceRequirements"] = []
+ if "secrets" not in self.container_properties:
+ self.container_properties["secrets"] = []
+
+ self._validate()
+ self._update_arn()
+
+ tags = self._format_tags(tags or {})
+ # Validate the tags before proceeding.
+ errmsg = self.backend.tagger.validate_tags(tags)
+ if errmsg:
+ raise ValidationError(errmsg)
+
+ self.backend.tagger.tag_resource(self.arn, tags)
+
+ def _format_tags(self, tags):
+ return [{"Key": k, "Value": v} for k, v in tags.items()]
+
+ def _update_arn(self):
+ self.revision += 1
+ self.arn = make_arn_for_task_def(
+ get_account_id(), self.name, self.revision, self._region
+ )
+
+ def _get_resource_requirement(self, req_type, default=None):
+ """
+ Get resource requirement from container properties.
+
+ Resource requirements like "memory" and "vcpus" are now specified in
+ "resourceRequirements". This function retrieves a resource requirement
+ from either container_properties.resourceRequirements (preferred) or
+ directly from container_properties (deprecated).
+
+ :param req_type: The type of resource requirement to retrieve.
+ :type req_type: ["gpu", "memory", "vcpus"]
+
+ :param default: The default value to return if the resource requirement is not found.
+ :type default: any, default=None
+
+ :return: The value of the resource requirement, or None.
+ :rtype: any
+ """
+ resource_reqs = self.container_properties.get("resourceRequirements", [])
+
+ # Filter the resource requirements by the specified type.
+ # Note that VCPUS are specified in resourceRequirements without the
+ # trailing "s", so we strip that off in the comparison below.
+ required_resource = list(
+ filter(
+ lambda req: req["type"].lower() == req_type.lower().rstrip("s"),
+ resource_reqs,
+ )
+ )
+
+ if required_resource:
+ if req_type == "vcpus":
+ return float(required_resource[0]["value"])
+ elif req_type == "memory":
+ return int(required_resource[0]["value"])
+ else:
+ return required_resource[0]["value"]
+ else:
+ return self.container_properties.get(req_type, default)
+
+ def _validate(self):
+ # For future use when containers arnt the only thing in batch
+ if self.type not in ("container",):
+ raise ClientException('type must be one of "container"')
+
+ if not isinstance(self.parameters, dict):
+ raise ClientException("parameters must be a string to string map")
+
+ if "image" not in self.container_properties:
+ raise ClientException("containerProperties must contain image")
+
+ memory = self._get_resource_requirement("memory")
+ if memory is None:
+ raise ClientException("containerProperties must contain memory")
+ if memory < 4:
+ raise ClientException("container memory limit must be greater than 4")
+
+ vcpus = self._get_resource_requirement("vcpus")
+ if vcpus is None:
+ raise ClientException("containerProperties must contain vcpus")
+ if vcpus <= 0:
+ raise ClientException("container vcpus limit must be greater than 0")
+
+ def deregister(self):
+ self.status = "INACTIVE"
+
+ def update(
+ self, parameters, _type, container_properties, retry_strategy, tags, timeout
+ ):
+ if self.status != "INACTIVE":
+ if parameters is None:
+ parameters = self.parameters
+
+ if _type is None:
+ _type = self.type
+
+ if container_properties is None:
+ container_properties = self.container_properties
+
+ if retry_strategy is None:
+ retry_strategy = self.retry_strategy
+
+ return JobDefinition(
+ self.name,
+ parameters,
+ _type,
+ container_properties,
+ region_name=self._region,
+ revision=self.revision,
+ retry_strategy=retry_strategy,
+ tags=tags,
+ timeout=timeout,
+ backend=self.backend,
+ platform_capabilities=self.platform_capabilities,
+ propagate_tags=self.propagate_tags,
+ )
+
+ def describe(self):
+ result = {
+ "jobDefinitionArn": self.arn,
+ "jobDefinitionName": self.name,
+ "parameters": self.parameters,
+ "revision": self.revision,
+ "status": self.status,
+ "type": self.type,
+ "tags": self.backend.tagger.get_tag_dict_for_resource(self.arn),
+ "platformCapabilities": self.platform_capabilities,
+ "retryStrategy": self.retry_strategy,
+ "propagateTags": self.propagate_tags,
+ }
+ if self.container_properties is not None:
+ result["containerProperties"] = self.container_properties
+ if self.timeout:
+ result["timeout"] = self.timeout
+
+ return result
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "JobDefinitionName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html
+ return "AWS::Batch::JobDefinition"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ backend = batch_backends[region_name]
+ properties = cloudformation_json["Properties"]
+ res = backend.register_job_definition(
+ def_name=resource_name,
+ parameters=lowercase_first_key(properties.get("Parameters", {})),
+ _type="container",
+ tags=lowercase_first_key(properties.get("Tags", {})),
+ retry_strategy=lowercase_first_key(properties["RetryStrategy"]),
+ container_properties=lowercase_first_key(properties["ContainerProperties"]),
+ timeout=lowercase_first_key(properties.get("timeout", {})),
+ platform_capabilities=None,
+ propagate_tags=None,
+ )
+ arn = res[1]
+
+ return backend.get_job_definition_by_arn(arn)
+
+
+class Job(threading.Thread, BaseModel, DockerModel, ManagedState):
+ def __init__(
+ self,
+ name,
+ job_def,
+ job_queue,
+ log_backend,
+ container_overrides,
+ depends_on,
+ all_jobs,
+ timeout,
+ ):
+ """
+ Docker Job
+
+ :param name: Job Name
+ :param job_def: Job definition
+ :type: job_def: JobDefinition
+ :param job_queue: Job Queue
+ :param log_backend: Log backend
+ :type log_backend: moto.logs.models.LogsBackend
+ """
+ threading.Thread.__init__(self)
+ DockerModel.__init__(self)
+ ManagedState.__init__(
+ self,
+ "batch::job",
+ [
+ ("SUBMITTED", "PENDING"),
+ ("PENDING", "RUNNABLE"),
+ ("RUNNABLE", "STARTING"),
+ ("STARTING", "RUNNING"),
+ ],
+ )
+
+ self.job_name = name
+ self.job_id = str(uuid.uuid4())
+ self.job_definition = job_def
+ self.container_overrides = container_overrides or {}
+ self.job_queue = job_queue
+ self.job_queue.jobs.append(self)
+ self.job_created_at = datetime.datetime.now()
+ self.job_started_at = datetime.datetime(1970, 1, 1)
+ self.job_stopped_at = datetime.datetime(1970, 1, 1)
+ self.job_stopped = False
+ self.job_stopped_reason = None
+ self.depends_on = depends_on
+ self.timeout = timeout
+ self.all_jobs = all_jobs
+
+ self.stop = False
+ self.exit_code = None
+
+ self.daemon = True
+ self.name = "MOTO-BATCH-" + self.job_id
+
+ self._log_backend = log_backend
+ self.log_stream_name = None
+
+ self.attempts = []
+ self.latest_attempt = None
+
+ def describe_short(self):
+ result = {
+ "jobId": self.job_id,
+ "jobName": self.job_name,
+ "createdAt": datetime2int_milliseconds(self.job_created_at),
+ "status": self.status,
+ "jobDefinition": self.job_definition.arn,
+ }
+ if self.job_stopped_reason is not None:
+ result["statusReason"] = self.job_stopped_reason
+ if result["status"] not in ["SUBMITTED", "PENDING", "RUNNABLE", "STARTING"]:
+ result["startedAt"] = datetime2int_milliseconds(self.job_started_at)
+ if self.job_stopped:
+ result["stoppedAt"] = datetime2int_milliseconds(self.job_stopped_at)
+ if self.exit_code is not None:
+ result["container"] = {"exitCode": self.exit_code}
+ return result
+
+ def describe(self):
+ result = self.describe_short()
+ result["jobQueue"] = self.job_queue.arn
+ result["dependsOn"] = self.depends_on if self.depends_on else []
+ if self.job_stopped:
+ result["stoppedAt"] = datetime2int_milliseconds(self.job_stopped_at)
+ result["container"] = {}
+ result["container"]["command"] = self._get_container_property("command", [])
+ result["container"]["privileged"] = self._get_container_property(
+ "privileged", False
+ )
+ result["container"][
+ "readonlyRootFilesystem"
+ ] = self._get_container_property("readonlyRootFilesystem", False)
+ result["container"]["ulimits"] = self._get_container_property("ulimits", {})
+ result["container"]["vcpus"] = self._get_container_property("vcpus", 1)
+ result["container"]["memory"] = self._get_container_property("memory", 512)
+ result["container"]["volumes"] = self._get_container_property("volumes", [])
+ result["container"]["environment"] = self._get_container_property(
+ "environment", []
+ )
+ result["container"]["logStreamName"] = self.log_stream_name
+ if self.timeout:
+ result["timeout"] = self.timeout
+ result["attempts"] = self.attempts
+ return result
+
+ def _get_container_property(self, p, default):
+ if p == "environment":
+ job_env = self.container_overrides.get(p, default)
+ jd_env = self.job_definition.container_properties.get(p, default)
+
+ job_env_dict = {_env["name"]: _env["value"] for _env in job_env}
+ jd_env_dict = {_env["name"]: _env["value"] for _env in jd_env}
+
+ for key in jd_env_dict.keys():
+ if key not in job_env_dict.keys():
+ job_env.append({"name": key, "value": jd_env_dict[key]})
+
+ job_env.append({"name": "AWS_BATCH_JOB_ID", "value": self.job_id})
+
+ return job_env
+
+ if p in ["vcpus", "memory"]:
+ return self.container_overrides.get(
+ p, self.job_definition._get_resource_requirement(p, default)
+ )
+
+ return self.container_overrides.get(
+ p, self.job_definition.container_properties.get(p, default)
+ )
+
+ def _get_attempt_duration(self):
+ if self.timeout:
+ return self.timeout["attemptDurationSeconds"]
+ if self.job_definition.timeout:
+ return self.job_definition.timeout["attemptDurationSeconds"]
+ return None
+
+ def run(self):
+ """
+ Run the container.
+
+ Logic is as follows:
+ Generate container info (eventually from task definition)
+ Start container
+ Loop whilst not asked to stop and the container is running.
+ Get all logs from container between the last time I checked and now.
+ Convert logs into cloudwatch format
+ Put logs into cloudwatch
+
+ :return:
+ """
+ try:
+ import docker
+
+ self.advance()
+ while self.status == "SUBMITTED":
+ # Wait until we've moved onto state 'PENDING'
+ sleep(0.5)
+
+ # Wait until all dependent jobs have finished
+ # If any of the dependent jobs have failed, not even start
+ if self.depends_on and not self._wait_for_dependencies():
+ return
+
+ image = self.job_definition.container_properties.get(
+ "image", "alpine:latest"
+ )
+ privileged = self.job_definition.container_properties.get(
+ "privileged", False
+ )
+ cmd = self._get_container_property(
+ "command",
+ '/bin/sh -c "for a in `seq 1 10`; do echo Hello World; sleep 1; done"',
+ )
+ environment = {
+ e["name"]: e["value"]
+ for e in self._get_container_property("environment", [])
+ }
+ volumes = {
+ v["name"]: v["host"]
+ for v in self._get_container_property("volumes", [])
+ }
+ mounts = [
+ docker.types.Mount(
+ m["containerPath"],
+ volumes[m["sourceVolume"]]["sourcePath"],
+ type="bind",
+ read_only=m["readOnly"],
+ )
+ for m in self._get_container_property("mountPoints", [])
+ ]
+ name = "{0}-{1}".format(self.job_name, self.job_id)
+
+ self.advance()
+ while self.status == "PENDING":
+ # Wait until the state is no longer pending, but 'RUNNABLE'
+ sleep(0.5)
+ # TODO setup ecs container instance
+
+ self.job_started_at = datetime.datetime.now()
+ self._start_attempt()
+
+ # add host.docker.internal host on linux to emulate Mac + Windows behavior
+ # for communication with other mock AWS services running on localhost
+ extra_hosts = (
+ {"host.docker.internal": "host-gateway"}
+ if platform == "linux" or platform == "linux2"
+ else {}
+ )
+
+ environment["MOTO_HOST"] = settings.moto_server_host()
+ environment["MOTO_PORT"] = settings.moto_server_port()
+ environment[
+ "MOTO_HTTP_ENDPOINT"
+ ] = f'{environment["MOTO_HOST"]}:{environment["MOTO_PORT"]}'
+
+ run_kwargs = dict()
+ network_name = settings.moto_network_name()
+ network_mode = settings.moto_network_mode()
+ if network_name:
+ run_kwargs["network"] = network_name
+ elif network_mode:
+ run_kwargs["network_mode"] = network_mode
+
+ log_config = docker.types.LogConfig(type=docker.types.LogConfig.types.JSON)
+ self.advance()
+ while self.status == "RUNNABLE":
+ # Wait until the state is no longer runnable, but 'STARTING'
+ sleep(0.5)
+
+ self.advance()
+ while self.status == "STARTING":
+ # Wait until the state is no longer runnable, but 'RUNNING'
+ sleep(0.5)
+ container = self.docker_client.containers.run(
+ image,
+ cmd,
+ detach=True,
+ name=name,
+ log_config=log_config,
+ environment=environment,
+ mounts=mounts,
+ privileged=privileged,
+ extra_hosts=extra_hosts,
+ **run_kwargs,
+ )
+ try:
+ container.reload()
+
+ max_time = None
+ if self._get_attempt_duration():
+ attempt_duration = self._get_attempt_duration()
+ max_time = self.job_started_at + datetime.timedelta(
+ seconds=attempt_duration
+ )
+
+ while container.status == "running" and not self.stop:
+ container.reload()
+ time.sleep(0.5)
+
+ if max_time and datetime.datetime.now() > max_time:
+ raise Exception(
+ "Job time exceeded the configured attemptDurationSeconds"
+ )
+
+ # Container should be stopped by this point... unless asked to stop
+ if container.status == "running":
+ container.kill()
+
+ # Log collection
+ logs_stdout = []
+ logs_stderr = []
+ logs_stderr.extend(
+ container.logs(
+ stdout=False,
+ stderr=True,
+ timestamps=True,
+ since=datetime2int(self.job_started_at),
+ )
+ .decode()
+ .split("\n")
+ )
+ logs_stdout.extend(
+ container.logs(
+ stdout=True,
+ stderr=False,
+ timestamps=True,
+ since=datetime2int(self.job_started_at),
+ )
+ .decode()
+ .split("\n")
+ )
+
+ # Process logs
+ logs_stdout = [x for x in logs_stdout if len(x) > 0]
+ logs_stderr = [x for x in logs_stderr if len(x) > 0]
+ logs = []
+ for line in logs_stdout + logs_stderr:
+ date, line = line.split(" ", 1)
+ date_obj = (
+ dateutil.parser.parse(date)
+ .astimezone(datetime.timezone.utc)
+ .replace(tzinfo=None)
+ )
+ date = unix_time_millis(date_obj)
+ logs.append({"timestamp": date, "message": line.strip()})
+ logs = sorted(logs, key=lambda l: l["timestamp"])
+
+ # Send to cloudwatch
+ log_group = "/aws/batch/job"
+ stream_name = "{0}/default/{1}".format(
+ self.job_definition.name, self.job_id
+ )
+ self.log_stream_name = stream_name
+ self._log_backend.ensure_log_group(log_group, None)
+ self._log_backend.create_log_stream(log_group, stream_name)
+ self._log_backend.put_log_events(log_group, stream_name, logs)
+
+ result = container.wait() or {}
+ self.exit_code = result.get("StatusCode", 0)
+ job_failed = self.stop or self.exit_code > 0
+ self._mark_stopped(success=not job_failed)
+
+ except Exception as err:
+ logger.error(
+ "Failed to run AWS Batch container {0}. Error {1}".format(
+ self.name, err
+ )
+ )
+ self._mark_stopped(success=False)
+ container.kill()
+ finally:
+ container.remove()
+ except Exception as err:
+ logger.error(
+ "Failed to run AWS Batch container {0}. Error {1}".format(
+ self.name, err
+ )
+ )
+ self._mark_stopped(success=False)
+
+ def _mark_stopped(self, success=True):
+ # Ensure that job_stopped/job_stopped_at-attributes are set first
+ # The describe-method needs them immediately when status is set
+ self.job_stopped = True
+ self.job_stopped_at = datetime.datetime.now()
+ self.status = "SUCCEEDED" if success else "FAILED"
+ self._stop_attempt()
+
+ def _start_attempt(self):
+ self.latest_attempt = {
+ "container": {
+ "containerInstanceArn": "TBD",
+ "logStreamName": self.log_stream_name,
+ "networkInterfaces": [],
+ "taskArn": self.job_definition.arn,
+ }
+ }
+ self.latest_attempt["startedAt"] = datetime2int_milliseconds(
+ self.job_started_at
+ )
+ self.attempts.append(self.latest_attempt)
+
+ def _stop_attempt(self):
+ if self.latest_attempt:
+ self.latest_attempt["container"]["logStreamName"] = self.log_stream_name
+ self.latest_attempt["stoppedAt"] = datetime2int_milliseconds(
+ self.job_stopped_at
+ )
+
+ def terminate(self, reason):
+ if not self.stop:
+ self.stop = True
+ self.job_stopped_reason = reason
+
+ def _wait_for_dependencies(self):
+ dependent_ids = [dependency["jobId"] for dependency in self.depends_on]
+ successful_dependencies = set()
+ while len(successful_dependencies) != len(dependent_ids):
+ for dependent_id in dependent_ids:
+ if dependent_id in self.all_jobs:
+ dependent_job = self.all_jobs[dependent_id]
+ if dependent_job.status == "SUCCEEDED":
+ successful_dependencies.add(dependent_id)
+ if dependent_job.status == "FAILED":
+ logger.error(
+ "Terminating job {0} due to failed dependency {1}".format(
+ self.name, dependent_job.name
+ )
+ )
+ self._mark_stopped(success=False)
+ return False
+
+ time.sleep(1)
+ if self.stop:
+ # This job has been cancelled while it was waiting for a dependency
+ self._mark_stopped(success=False)
+ return False
+
+ return True
+
+
+class BatchBackend(BaseBackend):
+ """
+ Batch-jobs are executed inside a Docker-container. Everytime the `submit_job`-method is called, a new Docker container is started.
+ A job is marked as 'Success' when the Docker-container exits without throwing an error.
+
+ Use `@mock_batch_simple` instead if you do not want to use a Docker-container.
+ With this decorator, jobs are simply marked as 'Success' without trying to execute any commands/scripts.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.tagger = TaggingService()
+
+ self._compute_environments = {}
+ self._job_queues = {}
+ self._job_definitions = {}
+ self._jobs = {}
+
+ state_manager.register_default_transition(
+ "batch::job", transition={"progression": "manual", "times": 1}
+ )
+
+ @property
+ def iam_backend(self):
+ """
+ :return: IAM Backend
+ :rtype: moto.iam.models.IAMBackend
+ """
+ return iam_backends["global"]
+
+ @property
+ def ec2_backend(self):
+ """
+ :return: EC2 Backend
+ :rtype: moto.ec2.models.EC2Backend
+ """
+ return ec2_backends[self.region_name]
+
+ @property
+ def ecs_backend(self):
+ """
+ :return: ECS Backend
+ :rtype: moto.ecs.models.EC2ContainerServiceBackend
+ """
+ return ecs_backends[self.region_name]
+
+ @property
+ def logs_backend(self):
+ """
+ :return: ECS Backend
+ :rtype: moto.logs.models.LogsBackend
+ """
+ return logs_backends[self.region_name]
+
+ def reset(self):
+ for job in self._jobs.values():
+ if job.status not in ("FAILED", "SUCCEEDED"):
+ job.stop = True
+ # Try to join
+ job.join(0.2)
+
+ super().reset()
+
+ def get_compute_environment_by_arn(self, arn):
+ return self._compute_environments.get(arn)
+
+ def get_compute_environment_by_name(self, name):
+ for comp_env in self._compute_environments.values():
+ if comp_env.name == name:
+ return comp_env
+ return None
+
+ def get_compute_environment(self, identifier):
+ """
+ Get compute environment by name or ARN
+ :param identifier: Name or ARN
+ :type identifier: str
+
+ :return: Compute Environment or None
+ :rtype: ComputeEnvironment or None
+ """
+ env = self.get_compute_environment_by_arn(identifier)
+ if env is None:
+ env = self.get_compute_environment_by_name(identifier)
+ return env
+
+ def get_job_queue_by_arn(self, arn):
+ return self._job_queues.get(arn)
+
+ def get_job_queue_by_name(self, name):
+ for comp_env in self._job_queues.values():
+ if comp_env.name == name:
+ return comp_env
+ return None
+
+ def get_job_queue(self, identifier):
+ """
+ Get job queue by name or ARN
+ :param identifier: Name or ARN
+ :type identifier: str
+
+ :return: Job Queue or None
+ :rtype: JobQueue or None
+ """
+ env = self.get_job_queue_by_arn(identifier)
+ if env is None:
+ env = self.get_job_queue_by_name(identifier)
+ return env
+
+ def get_job_definition_by_arn(self, arn):
+ return self._job_definitions.get(arn)
+
+ def get_job_definition_by_name(self, name):
+ latest_revision = -1
+ latest_job = None
+ for job_def in self._job_definitions.values():
+ if job_def.name == name and job_def.revision > latest_revision:
+ latest_job = job_def
+ latest_revision = job_def.revision
+ return latest_job
+
+ def get_job_definition_by_name_revision(self, name, revision):
+ for job_def in self._job_definitions.values():
+ if job_def.name == name and job_def.revision == int(revision):
+ return job_def
+ return None
+
+ def get_job_definition(self, identifier):
+ """
+ Get job definitions by name or ARN
+ :param identifier: Name or ARN
+ :type identifier: str
+
+ :return: Job definition or None
+ :rtype: JobDefinition or None
+ """
+ job_def = self.get_job_definition_by_arn(identifier)
+ if job_def is None:
+ if ":" in identifier:
+ job_def = self.get_job_definition_by_name_revision(
+ *identifier.split(":", 1)
+ )
+ else:
+ job_def = self.get_job_definition_by_name(identifier)
+ return job_def
+
+ def get_job_definitions(self, identifier):
+ """
+ Get job definitions by name or ARN
+ :param identifier: Name or ARN
+ :type identifier: str
+
+ :return: Job definition or None
+ :rtype: list of JobDefinition
+ """
+ result = []
+ env = self.get_job_definition_by_arn(identifier)
+ if env is not None:
+ result.append(env)
+ else:
+ for value in self._job_definitions.values():
+ if value.name == identifier:
+ result.append(value)
+
+ return result
+
+ def get_job_by_id(self, identifier):
+ """
+ Get job by id
+ :param identifier: Job ID
+ :type identifier: str
+
+ :return: Job
+ :rtype: Job
+ """
+ try:
+ return self._jobs[identifier]
+ except KeyError:
+ return None
+
+ def describe_compute_environments(self, environments=None):
+ """
+ Pagination is not yet implemented
+ """
+ envs = set()
+ if environments is not None:
+ envs = set(environments)
+
+ result = []
+ for arn, environment in self._compute_environments.items():
+ # Filter shortcut
+ if len(envs) > 0 and arn not in envs and environment.name not in envs:
+ continue
+
+ json_part = {
+ "computeEnvironmentArn": arn,
+ "computeEnvironmentName": environment.name,
+ "ecsClusterArn": environment.ecs_arn,
+ "serviceRole": environment.service_role,
+ "state": environment.state,
+ "type": environment.env_type,
+ "status": "VALID",
+ "statusReason": "Compute environment is available",
+ }
+ if environment.env_type == "MANAGED":
+ json_part["computeResources"] = environment.compute_resources
+
+ result.append(json_part)
+
+ return result
+
+ def create_compute_environment(
+ self, compute_environment_name, _type, state, compute_resources, service_role
+ ):
+ # Validate
+ if COMPUTE_ENVIRONMENT_NAME_REGEX.match(compute_environment_name) is None:
+ raise InvalidParameterValueException(
+ "Compute environment name does not match ^[A-Za-z0-9][A-Za-z0-9_-]{1,126}[A-Za-z0-9]$"
+ )
+
+ if self.get_compute_environment_by_name(compute_environment_name) is not None:
+ raise InvalidParameterValueException(
+ "A compute environment already exists with the name {0}".format(
+ compute_environment_name
+ )
+ )
+
+ # Look for IAM role
+ try:
+ self.iam_backend.get_role_by_arn(service_role)
+ except IAMNotFoundException:
+ raise InvalidParameterValueException(
+ "Could not find IAM role {0}".format(service_role)
+ )
+
+ if _type not in ("MANAGED", "UNMANAGED"):
+ raise InvalidParameterValueException(
+ "type {0} must be one of MANAGED | UNMANAGED".format(service_role)
+ )
+
+ if state is not None and state not in ("ENABLED", "DISABLED"):
+ raise InvalidParameterValueException(
+ "state {0} must be one of ENABLED | DISABLED".format(state)
+ )
+
+ if compute_resources is None and _type == "MANAGED":
+ raise InvalidParameterValueException(
+ "computeResources must be specified when creating a {0} environment".format(
+ state
+ )
+ )
+ elif compute_resources is not None:
+ self._validate_compute_resources(compute_resources)
+
+ # By here, all values except SPOT ones have been validated
+ new_comp_env = ComputeEnvironment(
+ compute_environment_name,
+ _type,
+ state,
+ compute_resources,
+ service_role,
+ region_name=self.region_name,
+ )
+ self._compute_environments[new_comp_env.arn] = new_comp_env
+
+ # Ok by this point, everything is legit, so if its Managed then start some instances
+ if _type == "MANAGED" and "FARGATE" not in compute_resources["type"]:
+ cpus = int(
+ compute_resources.get("desiredvCpus", compute_resources["minvCpus"])
+ )
+ instance_types = compute_resources["instanceTypes"]
+ needed_instance_types = self.find_min_instances_to_meet_vcpus(
+ instance_types, cpus
+ )
+ # Create instances
+
+ # Will loop over and over so we get decent subnet coverage
+ subnet_cycle = cycle(compute_resources["subnets"])
+
+ for instance_type in needed_instance_types:
+ reservation = self.ec2_backend.add_instances(
+ image_id="ami-03cf127a", # Todo import AMIs
+ count=1,
+ user_data=None,
+ security_group_names=[],
+ instance_type=instance_type,
+ region_name=self.region_name,
+ subnet_id=next(subnet_cycle),
+ key_name=compute_resources.get("ec2KeyPair", "AWS_OWNED"),
+ security_group_ids=compute_resources["securityGroupIds"],
+ is_instance_type_default=False,
+ )
+
+ new_comp_env.add_instance(reservation.instances[0])
+
+ # Create ECS cluster
+ # Should be of format P2OnDemand_Batch_UUID
+ cluster_name = "OnDemand_Batch_" + str(uuid.uuid4())
+ ecs_cluster = self.ecs_backend.create_cluster(cluster_name)
+ new_comp_env.set_ecs(ecs_cluster.arn, cluster_name)
+
+ return compute_environment_name, new_comp_env.arn
+
+ def _validate_compute_resources(self, cr):
+ """
+ Checks contents of sub dictionary for managed clusters
+
+ :param cr: computeResources
+ :type cr: dict
+ """
+ if int(cr["maxvCpus"]) < 0:
+ raise InvalidParameterValueException("maxVCpus must be positive")
+ if "FARGATE" not in cr["type"]:
+ # Most parameters are not applicable to jobs that are running on Fargate resources:
+ # non exhaustive list: minvCpus, instanceTypes, imageId, ec2KeyPair, instanceRole, tags
+ for profile in self.iam_backend.get_instance_profiles():
+ if profile.arn == cr["instanceRole"]:
+ break
+ else:
+ raise InvalidParameterValueException(
+ "could not find instanceRole {0}".format(cr["instanceRole"])
+ )
+
+ if int(cr["minvCpus"]) < 0:
+ raise InvalidParameterValueException("minvCpus must be positive")
+ if int(cr["maxvCpus"]) < int(cr["minvCpus"]):
+ raise InvalidParameterValueException(
+ "maxVCpus must be greater than minvCpus"
+ )
+
+ if len(cr["instanceTypes"]) == 0:
+ raise InvalidParameterValueException(
+ "At least 1 instance type must be provided"
+ )
+ for instance_type in cr["instanceTypes"]:
+ if instance_type == "optimal":
+ pass # Optimal should pick from latest of current gen
+ elif (
+ instance_type not in EC2_INSTANCE_TYPES
+ and instance_type not in EC2_INSTANCE_FAMILIES
+ ):
+ raise InvalidParameterValueException(
+ "Instance type {0} does not exist".format(instance_type)
+ )
+
+ for sec_id in cr["securityGroupIds"]:
+ if self.ec2_backend.get_security_group_from_id(sec_id) is None:
+ raise InvalidParameterValueException(
+ "security group {0} does not exist".format(sec_id)
+ )
+ if len(cr["securityGroupIds"]) == 0:
+ raise InvalidParameterValueException(
+ "At least 1 security group must be provided"
+ )
+
+ for subnet_id in cr["subnets"]:
+ try:
+ self.ec2_backend.get_subnet(subnet_id)
+ except InvalidSubnetIdError:
+ raise InvalidParameterValueException(
+ "subnet {0} does not exist".format(subnet_id)
+ )
+ if len(cr["subnets"]) == 0:
+ raise InvalidParameterValueException("At least 1 subnet must be provided")
+
+ if cr["type"] not in {"EC2", "SPOT", "FARGATE", "FARGATE_SPOT"}:
+ raise InvalidParameterValueException(
+ "computeResources.type must be either EC2 | SPOT | FARGATE | FARGATE_SPOT"
+ )
+
+ @staticmethod
+ def find_min_instances_to_meet_vcpus(instance_types, target):
+ """
+ Finds the minimum needed instances to meed a vcpu target
+
+ :param instance_types: Instance types, like ['t2.medium', 't2.small']
+ :type instance_types: list of str
+ :param target: VCPU target
+ :type target: float
+ :return: List of instance types
+ :rtype: list of str
+ """
+ # vcpus = [ (vcpus, instance_type), (vcpus, instance_type), ... ]
+ instance_vcpus = []
+ instances = []
+
+ for instance_type in instance_types:
+ if instance_type == "optimal":
+ instance_type = "m4.4xlarge"
+
+ if "." not in instance_type:
+ # instance_type can be a family of instance types (c2, t3, etc)
+ # We'll just use the first instance_type in this family
+ instance_type = [
+ i for i in EC2_INSTANCE_TYPES.keys() if i.startswith(instance_type)
+ ][0]
+ instance_vcpus.append(
+ (
+ EC2_INSTANCE_TYPES[instance_type]["VCpuInfo"]["DefaultVCpus"],
+ instance_type,
+ )
+ )
+
+ instance_vcpus = sorted(instance_vcpus, key=lambda item: item[0], reverse=True)
+ # Loop through,
+ # if biggest instance type smaller than target, and len(instance_types)> 1, then use biggest type
+ # if biggest instance type bigger than target, and len(instance_types)> 1, then remove it and move on
+
+ # if biggest instance type bigger than target and len(instan_types) == 1 then add instance and finish
+ # if biggest instance type smaller than target and len(instan_types) == 1 then loop adding instances until target == 0
+ # ^^ boils down to keep adding last till target vcpus is negative
+ # #Algorithm ;-) ... Could probably be done better with some quality lambdas
+ while target > 0:
+ current_vcpu, current_instance = instance_vcpus[0]
+
+ if len(instance_vcpus) > 1:
+ if current_vcpu <= target:
+ target -= current_vcpu
+ instances.append(current_instance)
+ else:
+ # try next biggest instance
+ instance_vcpus.pop(0)
+ else:
+ # Were on the last instance
+ target -= current_vcpu
+ instances.append(current_instance)
+
+ return instances
+
+ def delete_compute_environment(self, compute_environment_name):
+ if compute_environment_name is None:
+ raise InvalidParameterValueException("Missing computeEnvironment parameter")
+
+ compute_env = self.get_compute_environment(compute_environment_name)
+
+ if compute_env is not None:
+ # Pop ComputeEnvironment
+ self._compute_environments.pop(compute_env.arn)
+
+ # Delete ECS cluster
+ self.ecs_backend.delete_cluster(compute_env.ecs_name)
+
+ if compute_env.env_type == "MANAGED":
+ # Delete compute environment
+ instance_ids = [instance.id for instance in compute_env.instances]
+ if instance_ids:
+ self.ec2_backend.terminate_instances(instance_ids)
+
+ def update_compute_environment(
+ self, compute_environment_name, state, compute_resources, service_role
+ ):
+ # Validate
+ compute_env = self.get_compute_environment(compute_environment_name)
+ if compute_env is None:
+ raise ClientException("Compute environment {0} does not exist")
+
+ # Look for IAM role
+ if service_role is not None:
+ try:
+ role = self.iam_backend.get_role_by_arn(service_role)
+ except IAMNotFoundException:
+ raise InvalidParameterValueException(
+ "Could not find IAM role {0}".format(service_role)
+ )
+
+ compute_env.service_role = role
+
+ if state is not None:
+ if state not in ("ENABLED", "DISABLED"):
+ raise InvalidParameterValueException(
+ "state {0} must be one of ENABLED | DISABLED".format(state)
+ )
+
+ compute_env.state = state
+
+ if compute_resources is not None:
+ # TODO Implement resizing of instances based on changing vCpus
+ # compute_resources CAN contain desiredvCpus, maxvCpus, minvCpus, and can contain none of them.
+ pass
+
+ return compute_env.name, compute_env.arn
+
+ def create_job_queue(
+ self, queue_name, priority, state, compute_env_order, tags=None
+ ):
+ for variable, var_name in (
+ (queue_name, "jobQueueName"),
+ (priority, "priority"),
+ (state, "state"),
+ (compute_env_order, "computeEnvironmentOrder"),
+ ):
+ if variable is None:
+ raise ClientException("{0} must be provided".format(var_name))
+
+ if state not in ("ENABLED", "DISABLED"):
+ raise ClientException(
+ "state {0} must be one of ENABLED | DISABLED".format(state)
+ )
+ if self.get_job_queue_by_name(queue_name) is not None:
+ raise ClientException("Job queue {0} already exists".format(queue_name))
+
+ if len(compute_env_order) == 0:
+ raise ClientException("At least 1 compute environment must be provided")
+ try:
+ # orders and extracts computeEnvironment names
+ ordered_compute_environments = [
+ item["computeEnvironment"]
+ for item in sorted(compute_env_order, key=lambda x: x["order"])
+ ]
+ env_objects = []
+ # Check each ARN exists, then make a list of compute env's
+ for arn in ordered_compute_environments:
+ env = self.get_compute_environment_by_arn(arn)
+ if env is None:
+ raise ClientException(
+ "Compute environment {0} does not exist".format(arn)
+ )
+ env_objects.append(env)
+ except Exception:
+ raise ClientException("computeEnvironmentOrder is malformed")
+
+ # Create new Job Queue
+ queue = JobQueue(
+ queue_name,
+ priority,
+ state,
+ env_objects,
+ compute_env_order,
+ self.region_name,
+ backend=self,
+ tags=tags,
+ )
+ self._job_queues[queue.arn] = queue
+
+ return queue_name, queue.arn
+
+ def describe_job_queues(self, job_queues=None):
+ """
+ Pagination is not yet implemented
+ """
+ envs = set()
+ if job_queues is not None:
+ envs = set(job_queues)
+
+ result = []
+ for arn, job_queue in self._job_queues.items():
+ # Filter shortcut
+ if len(envs) > 0 and arn not in envs and job_queue.name not in envs:
+ continue
+
+ result.append(job_queue.describe())
+
+ return result
+
+ def update_job_queue(self, queue_name, priority, state, compute_env_order):
+ if queue_name is None:
+ raise ClientException("jobQueueName must be provided")
+
+ job_queue = self.get_job_queue(queue_name)
+ if job_queue is None:
+ raise ClientException("Job queue {0} does not exist".format(queue_name))
+
+ if state is not None:
+ if state not in ("ENABLED", "DISABLED"):
+ raise ClientException(
+ "state {0} must be one of ENABLED | DISABLED".format(state)
+ )
+
+ job_queue.state = state
+
+ if compute_env_order is not None:
+ if len(compute_env_order) == 0:
+ raise ClientException("At least 1 compute environment must be provided")
+ try:
+ # orders and extracts computeEnvironment names
+ ordered_compute_environments = [
+ item["computeEnvironment"]
+ for item in sorted(compute_env_order, key=lambda x: x["order"])
+ ]
+ env_objects = []
+ # Check each ARN exists, then make a list of compute env's
+ for arn in ordered_compute_environments:
+ env = self.get_compute_environment_by_arn(arn)
+ if env is None:
+ raise ClientException(
+ "Compute environment {0} does not exist".format(arn)
+ )
+ env_objects.append(env)
+ except Exception:
+ raise ClientException("computeEnvironmentOrder is malformed")
+
+ job_queue.env_order_json = compute_env_order
+ job_queue.environments = env_objects
+
+ if priority is not None:
+ job_queue.priority = priority
+
+ return queue_name, job_queue.arn
+
+ def delete_job_queue(self, queue_name):
+ job_queue = self.get_job_queue(queue_name)
+
+ if job_queue is not None:
+ del self._job_queues[job_queue.arn]
+
+ def register_job_definition(
+ self,
+ def_name,
+ parameters,
+ _type,
+ tags,
+ retry_strategy,
+ container_properties,
+ timeout,
+ platform_capabilities,
+ propagate_tags,
+ ):
+ if def_name is None:
+ raise ClientException("jobDefinitionName must be provided")
+
+ job_def = self.get_job_definition_by_name(def_name)
+ if retry_strategy is not None and "evaluateOnExit" in retry_strategy:
+ for strat in retry_strategy["evaluateOnExit"]:
+ if "action" in strat:
+ strat["action"] = strat["action"].lower()
+ if not tags:
+ tags = {}
+ if job_def is None:
+ job_def = JobDefinition(
+ def_name,
+ parameters,
+ _type,
+ container_properties,
+ tags=tags,
+ region_name=self.region_name,
+ retry_strategy=retry_strategy,
+ timeout=timeout,
+ backend=self,
+ platform_capabilities=platform_capabilities,
+ propagate_tags=propagate_tags,
+ )
+ else:
+ # Make new jobdef
+ job_def = job_def.update(
+ parameters, _type, container_properties, retry_strategy, tags, timeout
+ )
+
+ self._job_definitions[job_def.arn] = job_def
+
+ return def_name, job_def.arn, job_def.revision
+
+ def deregister_job_definition(self, def_name):
+ job_def = self.get_job_definition_by_arn(def_name)
+ if job_def is None and ":" in def_name:
+ name, revision = def_name.split(":", 1)
+ job_def = self.get_job_definition_by_name_revision(name, revision)
+
+ if job_def is not None:
+ self._job_definitions[job_def.arn].deregister()
+
+ def describe_job_definitions(
+ self, job_def_name=None, job_def_list=None, status=None
+ ):
+ """
+ Pagination is not yet implemented
+ """
+ jobs = []
+
+ # As a job name can reference multiple revisions, we get a list of them
+ if job_def_name is not None:
+ job_def = self.get_job_definitions(job_def_name)
+ if job_def is not None:
+ jobs.extend(job_def)
+ elif job_def_list is not None:
+ for job in job_def_list:
+ job_def = self.get_job_definitions(job)
+ if job_def is not None:
+ jobs.extend(job_def)
+ else:
+ jobs.extend(self._job_definitions.values())
+
+ # Got all the job defs were after, filter then by status
+ if status is not None:
+ return [job for job in jobs if job.status == status]
+ for job in jobs:
+ job.describe()
+ return jobs
+
+ def submit_job(
+ self,
+ job_name,
+ job_def_id,
+ job_queue,
+ depends_on=None,
+ container_overrides=None,
+ timeout=None,
+ ):
+ """
+ Parameters RetryStrategy and Parameters are not yet implemented.
+ """
+ # Look for job definition
+ job_def = self.get_job_definition(job_def_id)
+ if job_def is None:
+ raise ClientException(
+ "Job definition {0} does not exist".format(job_def_id)
+ )
+
+ queue = self.get_job_queue(job_queue)
+ if queue is None:
+ raise ClientException("Job queue {0} does not exist".format(job_queue))
+
+ job = Job(
+ job_name,
+ job_def,
+ queue,
+ log_backend=self.logs_backend,
+ container_overrides=container_overrides,
+ depends_on=depends_on,
+ all_jobs=self._jobs,
+ timeout=timeout,
+ )
+ self._jobs[job.job_id] = job
+
+ # Here comes the fun
+ job.start()
+
+ return job_name, job.job_id
+
+ def describe_jobs(self, jobs):
+ job_filter = set()
+ if jobs is not None:
+ job_filter = set(jobs)
+
+ result = []
+ for key, job in self._jobs.items():
+ if len(job_filter) > 0 and key not in job_filter:
+ continue
+
+ result.append(job.describe())
+
+ return result
+
+ def list_jobs(self, job_queue, job_status=None):
+ """
+ Pagination is not yet implemented
+ """
+ jobs = []
+
+ job_queue = self.get_job_queue(job_queue)
+ if job_queue is None:
+ raise ClientException("Job queue {0} does not exist".format(job_queue))
+
+ if job_status is not None and job_status not in (
+ "SUBMITTED",
+ "PENDING",
+ "RUNNABLE",
+ "STARTING",
+ "RUNNING",
+ "SUCCEEDED",
+ "FAILED",
+ ):
+ raise ClientException(
+ "Job status is not one of SUBMITTED | PENDING | RUNNABLE | STARTING | RUNNING | SUCCEEDED | FAILED"
+ )
+
+ for job in job_queue.jobs:
+ if job_status is not None and job.status != job_status:
+ continue
+
+ jobs.append(job)
+
+ return jobs
+
+ def cancel_job(self, job_id, reason):
+ job = self.get_job_by_id(job_id)
+ if job.status in ["SUBMITTED", "PENDING", "RUNNABLE"]:
+ job.terminate(reason)
+ # No-Op for jobs that have already started - user has to explicitly terminate those
+
+ def terminate_job(self, job_id, reason):
+ if job_id is None:
+ raise ClientException("Job ID does not exist")
+ if reason is None:
+ raise ClientException("Reason does not exist")
+
+ job = self.get_job_by_id(job_id)
+ if job is None:
+ raise ClientException("Job not found")
+
+ job.terminate(reason)
+
+ def tag_resource(self, resource_arn, tags):
+ tags = self.tagger.convert_dict_to_tags_input(tags or {})
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def list_tags_for_resource(self, resource_arn):
+ return self.tagger.get_tag_dict_for_resource(resource_arn)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+
+batch_backends = BackendDict(BatchBackend, "batch")
diff --git a/contrib/python/moto/py3/moto/batch/responses.py b/contrib/python/moto/py3/moto/batch/responses.py
new file mode 100644
index 0000000000..bd7ec5e55f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/responses.py
@@ -0,0 +1,269 @@
+from moto.core.responses import BaseResponse
+from .models import batch_backends
+from urllib.parse import urlsplit, unquote
+
+import json
+
+
+class BatchResponse(BaseResponse):
+ def _error(self, code, message):
+ return json.dumps({"__type": code, "message": message}), dict(status=400)
+
+ @property
+ def batch_backend(self):
+ """
+ :return: Batch Backend
+ :rtype: moto.batch.models.BatchBackend
+ """
+ return batch_backends[self.region]
+
+ @property
+ def json(self):
+ if self.body is None or self.body == "":
+ self._json = {}
+ elif not hasattr(self, "_json"):
+ try:
+ self._json = json.loads(self.body)
+ except ValueError:
+ print()
+ return self._json
+
+ def _get_param(self, param_name, if_none=None):
+ val = self.json.get(param_name)
+ if val is not None:
+ return val
+ return if_none
+
+ def _get_action(self):
+ # Return element after the /v1/*
+ return urlsplit(self.uri).path.lstrip("/").split("/")[1]
+
+ # CreateComputeEnvironment
+ def createcomputeenvironment(self):
+ compute_env_name = self._get_param("computeEnvironmentName")
+ compute_resource = self._get_param("computeResources")
+ service_role = self._get_param("serviceRole")
+ state = self._get_param("state")
+ _type = self._get_param("type")
+
+ name, arn = self.batch_backend.create_compute_environment(
+ compute_environment_name=compute_env_name,
+ _type=_type,
+ state=state,
+ compute_resources=compute_resource,
+ service_role=service_role,
+ )
+
+ result = {"computeEnvironmentArn": arn, "computeEnvironmentName": name}
+
+ return json.dumps(result)
+
+ # DescribeComputeEnvironments
+ def describecomputeenvironments(self):
+ compute_environments = self._get_param("computeEnvironments")
+
+ envs = self.batch_backend.describe_compute_environments(compute_environments)
+
+ result = {"computeEnvironments": envs}
+ return json.dumps(result)
+
+ # DeleteComputeEnvironment
+ def deletecomputeenvironment(self):
+ compute_environment = self._get_param("computeEnvironment")
+
+ self.batch_backend.delete_compute_environment(compute_environment)
+
+ return ""
+
+ # UpdateComputeEnvironment
+ def updatecomputeenvironment(self):
+ compute_env_name = self._get_param("computeEnvironment")
+ compute_resource = self._get_param("computeResources")
+ service_role = self._get_param("serviceRole")
+ state = self._get_param("state")
+
+ name, arn = self.batch_backend.update_compute_environment(
+ compute_environment_name=compute_env_name,
+ compute_resources=compute_resource,
+ service_role=service_role,
+ state=state,
+ )
+
+ result = {"computeEnvironmentArn": arn, "computeEnvironmentName": name}
+
+ return json.dumps(result)
+
+ # CreateJobQueue
+ def createjobqueue(self):
+ compute_env_order = self._get_param("computeEnvironmentOrder")
+ queue_name = self._get_param("jobQueueName")
+ priority = self._get_param("priority")
+ state = self._get_param("state")
+ tags = self._get_param("tags")
+
+ name, arn = self.batch_backend.create_job_queue(
+ queue_name=queue_name,
+ priority=priority,
+ state=state,
+ compute_env_order=compute_env_order,
+ tags=tags,
+ )
+
+ result = {"jobQueueArn": arn, "jobQueueName": name}
+
+ return json.dumps(result)
+
+ # DescribeJobQueues
+ def describejobqueues(self):
+ job_queues = self._get_param("jobQueues")
+
+ queues = self.batch_backend.describe_job_queues(job_queues)
+
+ result = {"jobQueues": queues}
+ return json.dumps(result)
+
+ # UpdateJobQueue
+ def updatejobqueue(self):
+ compute_env_order = self._get_param("computeEnvironmentOrder")
+ queue_name = self._get_param("jobQueue")
+ priority = self._get_param("priority")
+ state = self._get_param("state")
+
+ name, arn = self.batch_backend.update_job_queue(
+ queue_name=queue_name,
+ priority=priority,
+ state=state,
+ compute_env_order=compute_env_order,
+ )
+
+ result = {"jobQueueArn": arn, "jobQueueName": name}
+
+ return json.dumps(result)
+
+ # DeleteJobQueue
+ def deletejobqueue(self):
+ queue_name = self._get_param("jobQueue")
+
+ self.batch_backend.delete_job_queue(queue_name)
+
+ return ""
+
+ # RegisterJobDefinition
+ def registerjobdefinition(self):
+ container_properties = self._get_param("containerProperties")
+ def_name = self._get_param("jobDefinitionName")
+ parameters = self._get_param("parameters")
+ tags = self._get_param("tags")
+ retry_strategy = self._get_param("retryStrategy")
+ _type = self._get_param("type")
+ timeout = self._get_param("timeout")
+ platform_capabilities = self._get_param("platformCapabilities")
+ propagate_tags = self._get_param("propagateTags")
+ name, arn, revision = self.batch_backend.register_job_definition(
+ def_name=def_name,
+ parameters=parameters,
+ _type=_type,
+ tags=tags,
+ retry_strategy=retry_strategy,
+ container_properties=container_properties,
+ timeout=timeout,
+ platform_capabilities=platform_capabilities,
+ propagate_tags=propagate_tags,
+ )
+
+ result = {
+ "jobDefinitionArn": arn,
+ "jobDefinitionName": name,
+ "revision": revision,
+ }
+
+ return json.dumps(result)
+
+ # DeregisterJobDefinition
+ def deregisterjobdefinition(self):
+ queue_name = self._get_param("jobDefinition")
+
+ self.batch_backend.deregister_job_definition(queue_name)
+
+ return ""
+
+ # DescribeJobDefinitions
+ def describejobdefinitions(self):
+ job_def_name = self._get_param("jobDefinitionName")
+ job_def_list = self._get_param("jobDefinitions")
+ status = self._get_param("status")
+
+ job_defs = self.batch_backend.describe_job_definitions(
+ job_def_name, job_def_list, status
+ )
+
+ result = {"jobDefinitions": [job.describe() for job in job_defs]}
+ return json.dumps(result)
+
+ # SubmitJob
+ def submitjob(self):
+ container_overrides = self._get_param("containerOverrides")
+ depends_on = self._get_param("dependsOn")
+ job_def = self._get_param("jobDefinition")
+ job_name = self._get_param("jobName")
+ job_queue = self._get_param("jobQueue")
+ timeout = self._get_param("timeout")
+
+ name, job_id = self.batch_backend.submit_job(
+ job_name,
+ job_def,
+ job_queue,
+ depends_on=depends_on,
+ container_overrides=container_overrides,
+ timeout=timeout,
+ )
+
+ result = {"jobId": job_id, "jobName": name}
+
+ return json.dumps(result)
+
+ # DescribeJobs
+ def describejobs(self):
+ jobs = self._get_param("jobs")
+
+ return json.dumps({"jobs": self.batch_backend.describe_jobs(jobs)})
+
+ # ListJobs
+ def listjobs(self):
+ job_queue = self._get_param("jobQueue")
+ job_status = self._get_param("jobStatus")
+
+ jobs = self.batch_backend.list_jobs(job_queue, job_status)
+
+ result = {"jobSummaryList": [job.describe_short() for job in jobs]}
+ return json.dumps(result)
+
+ # TerminateJob
+ def terminatejob(self):
+ job_id = self._get_param("jobId")
+ reason = self._get_param("reason")
+
+ self.batch_backend.terminate_job(job_id, reason)
+
+ return ""
+
+ # CancelJob
+ def canceljob(self):
+ job_id = self._get_param("jobId")
+ reason = self._get_param("reason")
+ self.batch_backend.cancel_job(job_id, reason)
+
+ return ""
+
+ def tags(self):
+ resource_arn = unquote(self.path).split("/v1/tags/")[-1]
+ tags = self._get_param("tags")
+ if self.method == "POST":
+ self.batch_backend.tag_resource(resource_arn, tags)
+ return ""
+ if self.method == "GET":
+ tags = self.batch_backend.list_tags_for_resource(resource_arn)
+ return json.dumps({"tags": tags})
+ if self.method == "DELETE":
+ tag_keys = self.querystring.get("tagKeys")
+ self.batch_backend.untag_resource(resource_arn, tag_keys)
diff --git a/contrib/python/moto/py3/moto/batch/urls.py b/contrib/python/moto/py3/moto/batch/urls.py
new file mode 100644
index 0000000000..41f44ce7ea
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/urls.py
@@ -0,0 +1,24 @@
+from .responses import BatchResponse
+
+url_bases = [r"https?://batch\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/v1/createcomputeenvironment$": BatchResponse.dispatch,
+ "{0}/v1/describecomputeenvironments$": BatchResponse.dispatch,
+ "{0}/v1/deletecomputeenvironment": BatchResponse.dispatch,
+ "{0}/v1/updatecomputeenvironment": BatchResponse.dispatch,
+ "{0}/v1/createjobqueue": BatchResponse.dispatch,
+ "{0}/v1/describejobqueues": BatchResponse.dispatch,
+ "{0}/v1/updatejobqueue": BatchResponse.dispatch,
+ "{0}/v1/deletejobqueue": BatchResponse.dispatch,
+ "{0}/v1/registerjobdefinition": BatchResponse.dispatch,
+ "{0}/v1/deregisterjobdefinition": BatchResponse.dispatch,
+ "{0}/v1/describejobdefinitions": BatchResponse.dispatch,
+ "{0}/v1/submitjob": BatchResponse.dispatch,
+ "{0}/v1/describejobs": BatchResponse.dispatch,
+ "{0}/v1/listjobs": BatchResponse.dispatch,
+ "{0}/v1/terminatejob": BatchResponse.dispatch,
+ "{0}/v1/canceljob": BatchResponse.dispatch,
+ "{0}/v1/tags/(?P<arn_part_1>[^/]+)/(?P<arn_part_2>[^/]+)/?$": BatchResponse.dispatch,
+ "{0}/v1/tags/(?P<arn>[^/]+)/?$": BatchResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/batch/utils.py b/contrib/python/moto/py3/moto/batch/utils.py
new file mode 100644
index 0000000000..820e3d0d84
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch/utils.py
@@ -0,0 +1,31 @@
+def make_arn_for_compute_env(account_id, name, region_name):
+ return "arn:aws:batch:{0}:{1}:compute-environment/{2}".format(
+ region_name, account_id, name
+ )
+
+
+def make_arn_for_job_queue(account_id, name, region_name):
+ return "arn:aws:batch:{0}:{1}:job-queue/{2}".format(region_name, account_id, name)
+
+
+def make_arn_for_task_def(account_id, name, revision, region_name):
+ return "arn:aws:batch:{0}:{1}:job-definition/{2}:{3}".format(
+ region_name, account_id, name, revision
+ )
+
+
+def lowercase_first_key(some_dict):
+ new_dict = {}
+ for key, value in some_dict.items():
+ new_key = key[0].lower() + key[1:]
+ try:
+ if isinstance(value, dict):
+ new_dict[new_key] = lowercase_first_key(value)
+ elif all([isinstance(v, dict) for v in value]):
+ new_dict[new_key] = [lowercase_first_key(v) for v in value]
+ else:
+ new_dict[new_key] = value
+ except TypeError:
+ new_dict[new_key] = value
+
+ return new_dict
diff --git a/contrib/python/moto/py3/moto/batch_simple/__init__.py b/contrib/python/moto/py3/moto/batch_simple/__init__.py
new file mode 100644
index 0000000000..a28b9cce82
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch_simple/__init__.py
@@ -0,0 +1,5 @@
+from .models import batch_simple_backends
+from ..core.models import base_decorator
+
+batch_backend = batch_simple_backends["us-east-1"]
+mock_batch_simple = base_decorator(batch_simple_backends)
diff --git a/contrib/python/moto/py3/moto/batch_simple/models.py b/contrib/python/moto/py3/moto/batch_simple/models.py
new file mode 100644
index 0000000000..06ffdfd0a5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch_simple/models.py
@@ -0,0 +1,82 @@
+from ..batch.models import batch_backends, BaseBackend, Job, ClientException
+from ..core.utils import BackendDict
+
+import datetime
+
+
+class BatchSimpleBackend(BaseBackend):
+ """
+ Implements a Batch-Backend that does not use Docker containers. Submitted Jobs are simply marked as Success
+ Annotate your tests with `@mock_batch_simple`-decorator to use this Batch-implementation.
+ """
+
+ @property
+ def backend(self):
+ return batch_backends[self.region_name]
+
+ def __getattribute__(self, name):
+ """
+ Magic part that makes this class behave like a wrapper around the regular batch_backend
+ We intercept calls to `submit_job` and replace this with our own (non-Docker) implementation
+ Every other method call is send through to batch_backend
+ """
+ if name in [
+ "backend",
+ "region_name",
+ "urls",
+ "_url_module",
+ "__class__",
+ "url_bases",
+ ]:
+ return object.__getattribute__(self, name)
+ if name in ["submit_job"]:
+
+ def newfunc(*args, **kwargs):
+ attr = object.__getattribute__(self, name)
+ return attr(*args, **kwargs)
+
+ return newfunc
+ else:
+ return object.__getattribute__(self.backend, name)
+
+ def submit_job(
+ self,
+ job_name,
+ job_def_id,
+ job_queue,
+ depends_on=None,
+ container_overrides=None,
+ timeout=None,
+ ):
+ # Look for job definition
+ job_def = self.get_job_definition(job_def_id)
+ if job_def is None:
+ raise ClientException(
+ "Job definition {0} does not exist".format(job_def_id)
+ )
+
+ queue = self.get_job_queue(job_queue)
+ if queue is None:
+ raise ClientException("Job queue {0} does not exist".format(job_queue))
+
+ job = Job(
+ job_name,
+ job_def,
+ queue,
+ log_backend=self.logs_backend,
+ container_overrides=container_overrides,
+ depends_on=depends_on,
+ all_jobs=self._jobs,
+ timeout=timeout,
+ )
+ self.backend._jobs[job.job_id] = job
+
+ # We don't want to actually run the job - just mark it as succeeded
+ job.job_started_at = datetime.datetime.now()
+ job._start_attempt()
+ job._mark_stopped(success=True)
+
+ return job_name, job.job_id
+
+
+batch_simple_backends = BackendDict(BatchSimpleBackend, "batch")
diff --git a/contrib/python/moto/py3/moto/batch_simple/responses.py b/contrib/python/moto/py3/moto/batch_simple/responses.py
new file mode 100644
index 0000000000..789fa4453a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch_simple/responses.py
@@ -0,0 +1,12 @@
+from ..batch.responses import BatchResponse
+from .models import batch_simple_backends
+
+
+class BatchSimpleResponse(BatchResponse):
+ @property
+ def batch_backend(self):
+ """
+ :return: Batch Backend
+ :rtype: moto.batch.models.BatchBackend
+ """
+ return batch_simple_backends[self.region]
diff --git a/contrib/python/moto/py3/moto/batch_simple/urls.py b/contrib/python/moto/py3/moto/batch_simple/urls.py
new file mode 100644
index 0000000000..aaeae8a0f2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/batch_simple/urls.py
@@ -0,0 +1,6 @@
+from ..batch.urls import url_bases as batch_url_bases
+from ..batch.urls import url_paths as batch_url_paths
+from .responses import BatchSimpleResponse
+
+url_bases = batch_url_bases.copy()
+url_paths = {k: BatchSimpleResponse.dispatch for k in batch_url_paths}
diff --git a/contrib/python/moto/py3/moto/budgets/__init__.py b/contrib/python/moto/py3/moto/budgets/__init__.py
new file mode 100644
index 0000000000..22813972b6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/budgets/__init__.py
@@ -0,0 +1,4 @@
+from .models import budgets_backends
+from ..core.models import base_decorator
+
+mock_budgets = base_decorator(budgets_backends)
diff --git a/contrib/python/moto/py3/moto/budgets/exceptions.py b/contrib/python/moto/py3/moto/budgets/exceptions.py
new file mode 100644
index 0000000000..e16859e142
--- /dev/null
+++ b/contrib/python/moto/py3/moto/budgets/exceptions.py
@@ -0,0 +1,29 @@
+"""Exceptions raised by the budgets service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class DuplicateRecordException(JsonRESTError):
+ code = 400
+
+ def __init__(self, record_type, record_name):
+ super().__init__(
+ __class__.__name__,
+ f"Error creating {record_type}: {record_name} - the {record_type} already exists.",
+ )
+
+
+class NotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(__class__.__name__, message)
+
+
+class BudgetMissingLimit(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidParameterException",
+ "Unable to create/update budget - please provide one of the followings: Budget Limit/ Planned Budget Limit/ Auto Adjust Data",
+ )
diff --git a/contrib/python/moto/py3/moto/budgets/models.py b/contrib/python/moto/py3/moto/budgets/models.py
new file mode 100644
index 0000000000..a0841445e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/budgets/models.py
@@ -0,0 +1,129 @@
+from collections import defaultdict
+from copy import deepcopy
+from datetime import datetime
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import unix_time, BackendDict
+
+from .exceptions import BudgetMissingLimit, DuplicateRecordException, NotFoundException
+
+
+class Notification(BaseModel):
+ def __init__(self, details, subscribers):
+ self.details = details
+ self.subscribers = subscribers
+
+
+class Budget(BaseModel):
+ def __init__(self, budget, notifications):
+ if "BudgetLimit" not in budget and "PlannedBudgetLimits" not in budget:
+ raise BudgetMissingLimit()
+ # Storing the budget as a Dict for now - if we need more control, we can always read/write it back
+ self.budget = budget
+ self.notifications = [
+ Notification(details=x["Notification"], subscribers=x["Subscribers"])
+ for x in notifications
+ ]
+ self.budget["LastUpdatedTime"] = unix_time()
+ if "TimePeriod" not in self.budget:
+ first_day_of_month = datetime.now().replace(
+ day=1, hour=0, minute=0, second=0, microsecond=0
+ )
+ self.budget["TimePeriod"] = {
+ "Start": unix_time(first_day_of_month),
+ "End": 3706473600, # "2087-06-15T00:00:00+00:00"
+ }
+
+ def to_dict(self):
+ cp = deepcopy(self.budget)
+ if "CalculatedSpend" not in cp:
+ cp["CalculatedSpend"] = {
+ "ActualSpend": {"Amount": "0", "Unit": "USD"},
+ "ForecastedSpend": {"Amount": "0", "Unit": "USD"},
+ }
+ if self.budget["BudgetType"] == "COST" and "CostTypes" not in cp:
+ cp["CostTypes"] = {
+ "IncludeCredit": True,
+ "IncludeDiscount": True,
+ "IncludeOtherSubscription": True,
+ "IncludeRecurring": True,
+ "IncludeRefund": True,
+ "IncludeSubscription": True,
+ "IncludeSupport": True,
+ "IncludeTax": True,
+ "IncludeUpfront": True,
+ "UseAmortized": False,
+ "UseBlended": False,
+ }
+ return cp
+
+ def add_notification(self, details, subscribers):
+ self.notifications.append(Notification(details, subscribers))
+
+ def delete_notification(self, details):
+ self.notifications = [n for n in self.notifications if n.details != details]
+
+ def get_notifications(self):
+ return [n.details for n in self.notifications]
+
+
+class BudgetsBackend(BaseBackend):
+ """Implementation of Budgets APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ # {"account_id": {"budget_name": Budget}}
+ self.budgets = defaultdict(dict)
+
+ def create_budget(self, account_id, budget, notifications):
+ budget_name = budget["BudgetName"]
+ if budget_name in self.budgets[account_id]:
+ raise DuplicateRecordException(
+ record_type="budget", record_name=budget_name
+ )
+ self.budgets[account_id][budget_name] = Budget(budget, notifications)
+
+ def describe_budget(self, account_id, budget_name):
+ if budget_name not in self.budgets[account_id]:
+ raise NotFoundException(
+ f"Unable to get budget: {budget_name} - the budget doesn't exist."
+ )
+ return self.budgets[account_id][budget_name].to_dict()
+
+ def describe_budgets(self, account_id):
+ """
+ Pagination is not yet implemented
+ """
+ return [budget.to_dict() for budget in self.budgets[account_id].values()]
+
+ def delete_budget(self, account_id, budget_name):
+ if budget_name not in self.budgets[account_id]:
+ msg = f"Unable to delete budget: {budget_name} - the budget doesn't exist. Try creating it first. "
+ raise NotFoundException(msg)
+ self.budgets[account_id].pop(budget_name)
+
+ def create_notification(self, account_id, budget_name, notification, subscribers):
+ if budget_name not in self.budgets[account_id]:
+ raise NotFoundException(
+ "Unable to create notification - the budget doesn't exist."
+ )
+ self.budgets[account_id][budget_name].add_notification(
+ details=notification, subscribers=subscribers
+ )
+
+ def delete_notification(self, account_id, budget_name, notification):
+ if budget_name not in self.budgets[account_id]:
+ raise NotFoundException(
+ "Unable to delete notification - the budget doesn't exist."
+ )
+ self.budgets[account_id][budget_name].delete_notification(details=notification)
+
+ def describe_notifications_for_budget(self, account_id, budget_name):
+ """
+ Pagination has not yet been implemented
+ """
+ return self.budgets[account_id][budget_name].get_notifications()
+
+
+budgets_backends = BackendDict(
+ BudgetsBackend, "budgets", use_boto3_regions=False, additional_regions=["global"]
+)
diff --git a/contrib/python/moto/py3/moto/budgets/responses.py b/contrib/python/moto/py3/moto/budgets/responses.py
new file mode 100644
index 0000000000..eb0dfbfa25
--- /dev/null
+++ b/contrib/python/moto/py3/moto/budgets/responses.py
@@ -0,0 +1,68 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import budgets_backends
+
+
+class BudgetsResponse(BaseResponse):
+ @property
+ def backend(self):
+ return budgets_backends["global"]
+
+ def create_budget(self):
+ account_id = self._get_param("AccountId")
+ budget = self._get_param("Budget")
+ notifications = self._get_param("NotificationsWithSubscribers", [])
+ self.backend.create_budget(
+ account_id=account_id, budget=budget, notifications=notifications
+ )
+ return json.dumps(dict())
+
+ def describe_budget(self):
+ account_id = self._get_param("AccountId")
+ budget_name = self._get_param("BudgetName")
+ budget = self.backend.describe_budget(
+ account_id=account_id, budget_name=budget_name
+ )
+ return json.dumps(dict(Budget=budget))
+
+ def describe_budgets(self):
+ account_id = self._get_param("AccountId")
+ budgets = self.backend.describe_budgets(account_id=account_id)
+ return json.dumps(dict(Budgets=budgets, nextToken=None))
+
+ def delete_budget(self):
+ account_id = self._get_param("AccountId")
+ budget_name = self._get_param("BudgetName")
+ self.backend.delete_budget(account_id=account_id, budget_name=budget_name)
+ return json.dumps(dict())
+
+ def create_notification(self):
+ account_id = self._get_param("AccountId")
+ budget_name = self._get_param("BudgetName")
+ notification = self._get_param("Notification")
+ subscribers = self._get_param("Subscribers")
+ self.backend.create_notification(
+ account_id=account_id,
+ budget_name=budget_name,
+ notification=notification,
+ subscribers=subscribers,
+ )
+ return json.dumps(dict())
+
+ def delete_notification(self):
+ account_id = self._get_param("AccountId")
+ budget_name = self._get_param("BudgetName")
+ notification = self._get_param("Notification")
+ self.backend.delete_notification(
+ account_id=account_id, budget_name=budget_name, notification=notification
+ )
+ return json.dumps(dict())
+
+ def describe_notifications_for_budget(self):
+ account_id = self._get_param("AccountId")
+ budget_name = self._get_param("BudgetName")
+ notifications = self.backend.describe_notifications_for_budget(
+ account_id=account_id, budget_name=budget_name
+ )
+ return json.dumps(dict(Notifications=notifications, NextToken=None))
diff --git a/contrib/python/moto/py3/moto/budgets/urls.py b/contrib/python/moto/py3/moto/budgets/urls.py
new file mode 100644
index 0000000000..49840b4d1e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/budgets/urls.py
@@ -0,0 +1,10 @@
+from .responses import BudgetsResponse
+
+url_bases = [
+ r"https?://budgets\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": BudgetsResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/cloudformation/__init__.py b/contrib/python/moto/py3/moto/cloudformation/__init__.py
new file mode 100644
index 0000000000..7fb7471d00
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/__init__.py
@@ -0,0 +1,5 @@
+from .models import cloudformation_backends
+from ..core.models import base_decorator
+
+cloudformation_backend = cloudformation_backends["us-east-1"]
+mock_cloudformation = base_decorator(cloudformation_backends)
diff --git a/contrib/python/moto/py3/moto/cloudformation/custom_model.py b/contrib/python/moto/py3/moto/cloudformation/custom_model.py
new file mode 100644
index 0000000000..fe4ae5bc1f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/custom_model.py
@@ -0,0 +1,95 @@
+import json
+import threading
+
+from moto import settings
+from moto.core import CloudFormationModel
+from moto.awslambda import lambda_backends
+from uuid import uuid4
+
+
+class CustomModel(CloudFormationModel):
+ def __init__(self, region_name, request_id, logical_id, resource_name):
+ self.region_name = region_name
+ self.request_id = request_id
+ self.logical_id = logical_id
+ self.resource_name = resource_name
+ self.data = dict()
+ self._finished = False
+
+ def set_data(self, data):
+ self.data = data
+ self._finished = True
+
+ def is_created(self):
+ return self._finished
+
+ @property
+ def physical_resource_id(self):
+ return self.resource_name
+
+ @staticmethod
+ def cloudformation_type():
+ return "?"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ logical_id = kwargs["LogicalId"]
+ stack_id = kwargs["StackId"]
+ resource_type = kwargs["ResourceType"]
+ properties = cloudformation_json["Properties"]
+ service_token = properties["ServiceToken"]
+
+ backend = lambda_backends[region_name]
+ fn = backend.get_function(service_token)
+
+ request_id = str(uuid4())
+
+ custom_resource = CustomModel(
+ region_name, request_id, logical_id, resource_name
+ )
+
+ from moto.cloudformation import cloudformation_backends
+
+ stack = cloudformation_backends[region_name].get_stack(stack_id)
+ stack.add_custom_resource(custom_resource)
+
+ # A request will be send to this URL to indicate success/failure
+ # This request will be coming from inside a Docker container
+ # Note that, in order to reach the Moto host, the Moto-server should be listening on 0.0.0.0
+ #
+ # Alternative: Maybe we should let the user pass in a container-name where Moto is running?
+ # Similar to how we know for sure that the container in our CI is called 'motoserver'
+ host = f"{settings.moto_server_host()}:{settings.moto_server_port()}"
+ response_url = (
+ f"{host}/cloudformation_{region_name}/cfnresponse?stack={stack_id}"
+ )
+
+ event = {
+ "RequestType": "Create",
+ "ServiceToken": service_token,
+ "ResponseURL": response_url,
+ "StackId": stack_id,
+ "RequestId": request_id,
+ "LogicalResourceId": logical_id,
+ "ResourceType": resource_type,
+ "ResourceProperties": properties,
+ }
+
+ invoke_thread = threading.Thread(
+ target=fn.invoke, args=(json.dumps(event), {}, {})
+ )
+ invoke_thread.start()
+
+ return custom_resource
+
+ @classmethod
+ def has_cfn_attr(cls, attr): # pylint: disable=unused-argument
+ # We don't know which attributes are supported for third-party resources
+ return True
+
+ def get_cfn_attribute(self, attribute_name):
+ if attribute_name in self.data:
+ return self.data[attribute_name]
+ return None
diff --git a/contrib/python/moto/py3/moto/cloudformation/exceptions.py b/contrib/python/moto/py3/moto/cloudformation/exceptions.py
new file mode 100644
index 0000000000..52bf9d157f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/exceptions.py
@@ -0,0 +1,62 @@
+from werkzeug.exceptions import BadRequest
+from jinja2 import Template
+
+
+class UnformattedGetAttTemplateException(Exception):
+ description = (
+ "Template error: resource {0} does not support attribute type {1} in Fn::GetAtt"
+ )
+ status_code = 400
+
+
+class ValidationError(BadRequest):
+ def __init__(self, name_or_id=None, message=None):
+ if message is None:
+ message = "Stack with id {0} does not exist".format(name_or_id)
+
+ template = Template(ERROR_RESPONSE)
+ super().__init__()
+ self.description = template.render(code="ValidationError", message=message)
+
+
+class MissingParameterError(BadRequest):
+ def __init__(self, parameter_name):
+ template = Template(ERROR_RESPONSE)
+ super().__init__()
+ self.description = template.render(
+ code="Missing Parameter",
+ message="Missing parameter {0}".format(parameter_name),
+ )
+
+
+class ExportNotFound(BadRequest):
+ """Exception to raise if a template tries to import a non-existent export"""
+
+ def __init__(self, export_name):
+ template = Template(ERROR_RESPONSE)
+ super().__init__()
+ self.description = template.render(
+ code="ExportNotFound",
+ message="No export named {0} found.".format(export_name),
+ )
+
+
+class UnsupportedAttribute(ValidationError):
+ def __init__(self, resource, attr):
+ template = Template(ERROR_RESPONSE)
+ super().__init__()
+ self.description = template.render(
+ code="ValidationError",
+ message=f"Template error: resource {resource} does not support attribute type {attr} in Fn::GetAtt",
+ )
+
+
+ERROR_RESPONSE = """<ErrorResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ </Error>
+ <RequestId>cf4c737e-5ae2-11e4-a7c9-ad44eEXAMPLE</RequestId>
+</ErrorResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/cloudformation/models.py b/contrib/python/moto/py3/moto/cloudformation/models.py
new file mode 100644
index 0000000000..387d5747c5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/models.py
@@ -0,0 +1,923 @@
+from datetime import datetime, timedelta
+import json
+import yaml
+import uuid
+
+from collections import OrderedDict
+from yaml.parser import ParserError # pylint:disable=c-extension-no-member
+from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import (
+ iso_8601_datetime_with_milliseconds,
+ iso_8601_datetime_without_milliseconds,
+ BackendDict,
+)
+from moto.sns.models import sns_backends
+
+from .parsing import ResourceMap, OutputMap
+from .utils import (
+ generate_changeset_id,
+ generate_stack_id,
+ generate_stackset_arn,
+ generate_stackset_id,
+ yaml_tag_constructor,
+ validate_template_cfn_lint,
+)
+from .exceptions import ValidationError
+
+
+class FakeStackSet(BaseModel):
+ def __init__(
+ self,
+ stackset_id,
+ name,
+ template,
+ region="us-east-1",
+ status="ACTIVE",
+ description=None,
+ parameters=None,
+ tags=None,
+ admin_role="AWSCloudFormationStackSetAdministrationRole",
+ execution_role="AWSCloudFormationStackSetExecutionRole",
+ ):
+ self.id = stackset_id
+ self.arn = generate_stackset_arn(stackset_id, region)
+ self.name = name
+ self.template = template
+ self.description = description
+ self.parameters = parameters
+ self.tags = tags
+ self.admin_role = admin_role
+ self.execution_role = execution_role
+ self.status = status
+ self.instances = FakeStackInstances(parameters, self.id, self.name)
+ self.stack_instances = self.instances.stack_instances
+ self.operations = []
+
+ def _create_operation(
+ self, operation_id, action, status, accounts=None, regions=None
+ ):
+ accounts = accounts or []
+ regions = regions or []
+ operation = {
+ "OperationId": str(operation_id),
+ "Action": action,
+ "Status": status,
+ "CreationTimestamp": datetime.now(),
+ "EndTimestamp": datetime.now() + timedelta(minutes=2),
+ "Instances": [
+ {account: region} for account in accounts for region in regions
+ ],
+ }
+
+ self.operations += [operation]
+ return operation
+
+ def get_operation(self, operation_id):
+ for operation in self.operations:
+ if operation_id == operation["OperationId"]:
+ return operation
+ raise ValidationError(operation_id)
+
+ def update_operation(self, operation_id, status):
+ operation = self.get_operation(operation_id)
+ operation["Status"] = status
+ return operation_id
+
+ def delete(self):
+ self.status = "DELETED"
+
+ def update(
+ self,
+ template,
+ description,
+ parameters,
+ tags,
+ admin_role,
+ execution_role,
+ accounts,
+ regions,
+ operation_id=None,
+ ):
+ if not operation_id:
+ operation_id = uuid.uuid4()
+
+ self.template = template if template else self.template
+ self.description = description if description is not None else self.description
+ self.parameters = parameters if parameters else self.parameters
+ self.tags = tags if tags else self.tags
+ self.admin_role = admin_role if admin_role else self.admin_role
+ self.execution_role = execution_role if execution_role else self.execution_role
+
+ if accounts and regions:
+ self.update_instances(accounts, regions, self.parameters)
+
+ operation = self._create_operation(
+ operation_id=operation_id,
+ action="UPDATE",
+ status="SUCCEEDED",
+ accounts=accounts,
+ regions=regions,
+ )
+ return operation
+
+ def create_stack_instances(self, accounts, regions, parameters, operation_id=None):
+ if not operation_id:
+ operation_id = uuid.uuid4()
+ if not parameters:
+ parameters = self.parameters
+
+ self.instances.create_instances(accounts, regions, parameters)
+ self._create_operation(
+ operation_id=operation_id,
+ action="CREATE",
+ status="SUCCEEDED",
+ accounts=accounts,
+ regions=regions,
+ )
+
+ def delete_stack_instances(self, accounts, regions, operation_id=None):
+ if not operation_id:
+ operation_id = uuid.uuid4()
+
+ self.instances.delete(accounts, regions)
+
+ operation = self._create_operation(
+ operation_id=operation_id,
+ action="DELETE",
+ status="SUCCEEDED",
+ accounts=accounts,
+ regions=regions,
+ )
+ return operation
+
+ def update_instances(self, accounts, regions, parameters, operation_id=None):
+ if not operation_id:
+ operation_id = uuid.uuid4()
+
+ self.instances.update(accounts, regions, parameters)
+ operation = self._create_operation(
+ operation_id=operation_id,
+ action="UPDATE",
+ status="SUCCEEDED",
+ accounts=accounts,
+ regions=regions,
+ )
+ return operation
+
+
+class FakeStackInstances(BaseModel):
+ def __init__(self, parameters, stackset_id, stackset_name):
+ self.parameters = parameters if parameters else {}
+ self.stackset_id = stackset_id
+ self.stack_name = "StackSet-{}".format(stackset_id)
+ self.stackset_name = stackset_name
+ self.stack_instances = []
+
+ def create_instances(self, accounts, regions, parameters):
+ new_instances = []
+ for region in regions:
+ for account in accounts:
+ instance = {
+ "StackId": generate_stack_id(self.stack_name, region, account),
+ "StackSetId": self.stackset_id,
+ "Region": region,
+ "Account": account,
+ "Status": "CURRENT",
+ "ParameterOverrides": parameters if parameters else [],
+ }
+ new_instances.append(instance)
+ self.stack_instances += new_instances
+ return new_instances
+
+ def update(self, accounts, regions, parameters):
+ for account in accounts:
+ for region in regions:
+ instance = self.get_instance(account, region)
+ if parameters:
+ instance["ParameterOverrides"] = parameters
+ else:
+ instance["ParameterOverrides"] = []
+
+ def delete(self, accounts, regions):
+ for i, instance in enumerate(self.stack_instances):
+ if instance["Region"] in regions and instance["Account"] in accounts:
+ self.stack_instances.pop(i)
+
+ def get_instance(self, account, region):
+ for i, instance in enumerate(self.stack_instances):
+ if instance["Region"] == region and instance["Account"] == account:
+ return self.stack_instances[i]
+
+
+class FakeStack(BaseModel):
+ def __init__(
+ self,
+ stack_id,
+ name,
+ template,
+ parameters,
+ region_name,
+ notification_arns=None,
+ tags=None,
+ role_arn=None,
+ cross_stack_resources=None,
+ ):
+ self.stack_id = stack_id
+ self.name = name
+ self.template = template
+ if template != {}:
+ self._parse_template()
+ self.description = self.template_dict.get("Description")
+ else:
+ self.template_dict = {}
+ self.description = None
+ self.parameters = parameters
+ self.region_name = region_name
+ self.notification_arns = notification_arns if notification_arns else []
+ self.role_arn = role_arn
+ self.tags = tags if tags else {}
+ self.events = []
+ self.policy = ""
+
+ self.cross_stack_resources = cross_stack_resources or {}
+ self.resource_map = self._create_resource_map()
+
+ self.custom_resources = dict()
+
+ self.output_map = self._create_output_map()
+ self.creation_time = datetime.utcnow()
+ self.status = "CREATE_PENDING"
+
+ def has_template(self, other_template):
+ our_template = (
+ self.template
+ if isinstance(self.template, dict)
+ else json.loads(self.template)
+ )
+ return our_template == json.loads(other_template)
+
+ def has_parameters(self, other_parameters):
+ return self.parameters == other_parameters
+
+ def _create_resource_map(self):
+ resource_map = ResourceMap(
+ self.stack_id,
+ self.name,
+ self.parameters,
+ self.tags,
+ self.region_name,
+ self.template_dict,
+ self.cross_stack_resources,
+ )
+ resource_map.load()
+ return resource_map
+
+ def _create_output_map(self):
+ return OutputMap(self.resource_map, self.template_dict, self.stack_id)
+
+ @property
+ def creation_time_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.creation_time)
+
+ def _add_stack_event(
+ self, resource_status, resource_status_reason=None, resource_properties=None
+ ):
+
+ event = FakeEvent(
+ stack_id=self.stack_id,
+ stack_name=self.name,
+ logical_resource_id=self.name,
+ physical_resource_id=self.stack_id,
+ resource_type="AWS::CloudFormation::Stack",
+ resource_status=resource_status,
+ resource_status_reason=resource_status_reason,
+ resource_properties=resource_properties,
+ )
+
+ event.sendToSns(self.region_name, self.notification_arns)
+ self.events.append(event)
+
+ def _add_resource_event(
+ self,
+ logical_resource_id,
+ resource_status,
+ resource_status_reason=None,
+ resource_properties=None,
+ ):
+ # not used yet... feel free to help yourself
+ resource = self.resource_map[logical_resource_id]
+ self.events.append(
+ FakeEvent(
+ stack_id=self.stack_id,
+ stack_name=self.name,
+ logical_resource_id=logical_resource_id,
+ physical_resource_id=resource.physical_resource_id,
+ resource_type=resource.type,
+ resource_status=resource_status,
+ resource_status_reason=resource_status_reason,
+ resource_properties=resource_properties,
+ )
+ )
+
+ def _parse_template(self):
+ yaml.add_multi_constructor("", yaml_tag_constructor)
+ try:
+ self.template_dict = yaml.load(self.template, Loader=yaml.Loader)
+ except (ParserError, ScannerError):
+ self.template_dict = json.loads(self.template)
+
+ @property
+ def stack_parameters(self):
+ return self.resource_map.resolved_parameters
+
+ @property
+ def stack_resources(self):
+ return self.resource_map.values()
+
+ @property
+ def stack_outputs(self):
+ return [v for v in self.output_map.values() if v]
+
+ @property
+ def exports(self):
+ return self.output_map.exports
+
+ def add_custom_resource(self, custom_resource):
+ self.custom_resources[custom_resource.logical_id] = custom_resource
+
+ def get_custom_resource(self, custom_resource):
+ return self.custom_resources[custom_resource]
+
+ def create_resources(self):
+ self.status = "CREATE_IN_PROGRESS"
+ all_resources_ready = self.resource_map.create(self.template_dict)
+ # Set the description of the stack
+ self.description = self.template_dict.get("Description")
+ if all_resources_ready:
+ self.mark_creation_complete()
+
+ def verify_readiness(self):
+ if self.resource_map.creation_complete():
+ self.mark_creation_complete()
+
+ def mark_creation_complete(self):
+ self.status = "CREATE_COMPLETE"
+ self._add_stack_event("CREATE_COMPLETE")
+
+ def update(self, template, role_arn=None, parameters=None, tags=None):
+ self._add_stack_event(
+ "UPDATE_IN_PROGRESS", resource_status_reason="User Initiated"
+ )
+ self.template = template
+ self._parse_template()
+ self.resource_map.update(self.template_dict, parameters)
+ self.output_map = self._create_output_map()
+ self._add_stack_event("UPDATE_COMPLETE")
+ self.status = "UPDATE_COMPLETE"
+ self.role_arn = role_arn
+ # only overwrite tags if passed
+ if tags is not None:
+ self.tags = tags
+ # TODO: update tags in the resource map
+
+ def delete(self):
+ self._add_stack_event(
+ "DELETE_IN_PROGRESS", resource_status_reason="User Initiated"
+ )
+ self.resource_map.delete()
+ self._add_stack_event("DELETE_COMPLETE")
+ self.status = "DELETE_COMPLETE"
+
+
+class FakeChange(BaseModel):
+ def __init__(self, action, logical_resource_id, resource_type):
+ self.action = action
+ self.logical_resource_id = logical_resource_id
+ self.resource_type = resource_type
+
+
+class FakeChangeSet(BaseModel):
+ def __init__(
+ self,
+ change_set_type,
+ change_set_id,
+ change_set_name,
+ stack,
+ template,
+ parameters,
+ description,
+ notification_arns=None,
+ tags=None,
+ role_arn=None,
+ ):
+ self.change_set_type = change_set_type
+ self.change_set_id = change_set_id
+ self.change_set_name = change_set_name
+
+ self.stack = stack
+ self.stack_id = self.stack.stack_id
+ self.stack_name = self.stack.name
+ self.notification_arns = notification_arns
+ self.description = description
+ self.tags = tags
+ self.role_arn = role_arn
+ self.template = template
+ self.parameters = parameters
+ self._parse_template()
+
+ self.creation_time = datetime.utcnow()
+ self.changes = self.diff()
+
+ def _parse_template(self):
+ yaml.add_multi_constructor("", yaml_tag_constructor)
+ try:
+ self.template_dict = yaml.load(self.template, Loader=yaml.Loader)
+ except (ParserError, ScannerError):
+ self.template_dict = json.loads(self.template)
+
+ @property
+ def creation_time_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.creation_time)
+
+ def diff(self):
+ changes = []
+ resources_by_action = self.stack.resource_map.build_change_set_actions(
+ self.template_dict, self.parameters
+ )
+ for action, resources in resources_by_action.items():
+ for resource_name, resource in resources.items():
+ changes.append(
+ FakeChange(
+ action=action,
+ logical_resource_id=resource_name,
+ resource_type=resource["ResourceType"],
+ )
+ )
+ return changes
+
+ def apply(self):
+ self.stack.resource_map.update(self.template_dict, self.parameters)
+
+
+class FakeEvent(BaseModel):
+ def __init__(
+ self,
+ stack_id,
+ stack_name,
+ logical_resource_id,
+ physical_resource_id,
+ resource_type,
+ resource_status,
+ resource_status_reason=None,
+ resource_properties=None,
+ client_request_token=None,
+ ):
+ self.stack_id = stack_id
+ self.stack_name = stack_name
+ self.logical_resource_id = logical_resource_id
+ self.physical_resource_id = physical_resource_id
+ self.resource_type = resource_type
+ self.resource_status = resource_status
+ self.resource_status_reason = resource_status_reason
+ self.resource_properties = resource_properties
+ self.timestamp = datetime.utcnow()
+ self.event_id = uuid.uuid4()
+ self.client_request_token = client_request_token
+
+ def sendToSns(self, region, sns_topic_arns):
+ message = """StackId='{stack_id}'
+Timestamp='{timestamp}'
+EventId='{event_id}'
+LogicalResourceId='{logical_resource_id}'
+Namespace='{account_id}'
+ResourceProperties='{resource_properties}'
+ResourceStatus='{resource_status}'
+ResourceStatusReason='{resource_status_reason}'
+ResourceType='{resource_type}'
+StackName='{stack_name}'
+ClientRequestToken='{client_request_token}'""".format(
+ stack_id=self.stack_id,
+ timestamp=iso_8601_datetime_with_milliseconds(self.timestamp),
+ event_id=self.event_id,
+ logical_resource_id=self.logical_resource_id,
+ account_id=get_account_id(),
+ resource_properties=self.resource_properties,
+ resource_status=self.resource_status,
+ resource_status_reason=self.resource_status_reason,
+ resource_type=self.resource_type,
+ stack_name=self.stack_name,
+ client_request_token=self.client_request_token,
+ )
+
+ for sns_topic_arn in sns_topic_arns:
+ sns_backends[region].publish(
+ message, subject="AWS CloudFormation Notification", arn=sns_topic_arn
+ )
+
+
+def filter_stacks(all_stacks, status_filter):
+ filtered_stacks = []
+ if not status_filter:
+ return all_stacks
+ for stack in all_stacks:
+ if stack.status in status_filter:
+ filtered_stacks.append(stack)
+ return filtered_stacks
+
+
+class CloudFormationBackend(BaseBackend):
+ """
+ CustomResources are supported when running Moto in ServerMode.
+ Because creating these resources involves running a Lambda-function that informs the MotoServer about the status of the resources, the MotoServer has to be reachable for outside connections.
+ This means it has to run inside a Docker-container, or be started using `moto_server -h 0.0.0.0`.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.stacks = OrderedDict()
+ self.stacksets = OrderedDict()
+ self.deleted_stacks = {}
+ self.exports = OrderedDict()
+ self.change_sets = OrderedDict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "cloudformation", policy_supported=False
+ )
+
+ def _resolve_update_parameters(self, instance, incoming_params):
+ parameters = dict(
+ [
+ (parameter["parameter_key"], parameter["parameter_value"])
+ for parameter in incoming_params
+ if "parameter_value" in parameter
+ ]
+ )
+ previous = dict(
+ [
+ (
+ parameter["parameter_key"],
+ instance.parameters[parameter["parameter_key"]],
+ )
+ for parameter in incoming_params
+ if "use_previous_value" in parameter
+ ]
+ )
+ parameters.update(previous)
+
+ return parameters
+
+ def create_stack_set(
+ self,
+ name,
+ template,
+ parameters,
+ tags=None,
+ description=None,
+ admin_role=None,
+ execution_role=None,
+ ):
+ stackset_id = generate_stackset_id(name)
+ new_stackset = FakeStackSet(
+ stackset_id=stackset_id,
+ name=name,
+ template=template,
+ parameters=parameters,
+ description=description,
+ tags=tags,
+ admin_role=admin_role,
+ execution_role=execution_role,
+ )
+ self.stacksets[stackset_id] = new_stackset
+ return new_stackset
+
+ def get_stack_set(self, name):
+ stacksets = self.stacksets.keys()
+ if name in stacksets:
+ return self.stacksets[name]
+ for stackset in stacksets:
+ if self.stacksets[stackset].name == name:
+ return self.stacksets[stackset]
+ raise ValidationError(name)
+
+ def delete_stack_set(self, name):
+ stacksets = self.stacksets.keys()
+ if name in stacksets:
+ self.stacksets[name].delete()
+ for stackset in stacksets:
+ if self.stacksets[stackset].name == name:
+ self.stacksets[stackset].delete()
+
+ def create_stack_instances(
+ self, stackset_name, accounts, regions, parameters, operation_id=None
+ ):
+ stackset = self.get_stack_set(stackset_name)
+
+ stackset.create_stack_instances(
+ accounts=accounts,
+ regions=regions,
+ parameters=parameters,
+ operation_id=operation_id,
+ )
+ return stackset
+
+ def update_stack_set(
+ self,
+ stackset_name,
+ template=None,
+ description=None,
+ parameters=None,
+ tags=None,
+ admin_role=None,
+ execution_role=None,
+ accounts=None,
+ regions=None,
+ operation_id=None,
+ ):
+ stackset = self.get_stack_set(stackset_name)
+ resolved_parameters = self._resolve_update_parameters(
+ instance=stackset, incoming_params=parameters
+ )
+ update = stackset.update(
+ template=template,
+ description=description,
+ parameters=resolved_parameters,
+ tags=tags,
+ admin_role=admin_role,
+ execution_role=execution_role,
+ accounts=accounts,
+ regions=regions,
+ operation_id=operation_id,
+ )
+ return update
+
+ def delete_stack_instances(
+ self, stackset_name, accounts, regions, operation_id=None
+ ):
+ stackset = self.get_stack_set(stackset_name)
+ stackset.delete_stack_instances(accounts, regions, operation_id)
+ return stackset
+
+ def create_stack(
+ self,
+ name,
+ template,
+ parameters,
+ notification_arns=None,
+ tags=None,
+ role_arn=None,
+ ):
+ stack_id = generate_stack_id(name, self.region_name)
+ new_stack = FakeStack(
+ stack_id=stack_id,
+ name=name,
+ template=template,
+ parameters=parameters,
+ region_name=self.region_name,
+ notification_arns=notification_arns,
+ tags=tags,
+ role_arn=role_arn,
+ cross_stack_resources=self.exports,
+ )
+ self.stacks[stack_id] = new_stack
+ self._validate_export_uniqueness(new_stack)
+ for export in new_stack.exports:
+ self.exports[export.name] = export
+ new_stack._add_stack_event(
+ "CREATE_IN_PROGRESS", resource_status_reason="User Initiated"
+ )
+ new_stack.create_resources()
+ return new_stack
+
+ def create_change_set(
+ self,
+ stack_name,
+ change_set_name,
+ template,
+ parameters,
+ description,
+ change_set_type,
+ notification_arns=None,
+ tags=None,
+ role_arn=None,
+ ):
+ if change_set_type == "UPDATE":
+ for stack in self.stacks.values():
+ if stack.name == stack_name:
+ break
+ else:
+ raise ValidationError(stack_name)
+ else:
+ stack_id = generate_stack_id(stack_name, self.region_name)
+ stack = FakeStack(
+ stack_id=stack_id,
+ name=stack_name,
+ template={},
+ parameters=parameters,
+ region_name=self.region_name,
+ notification_arns=notification_arns,
+ tags=tags,
+ role_arn=role_arn,
+ )
+ self.stacks[stack_id] = stack
+ stack.status = "REVIEW_IN_PROGRESS"
+ stack._add_stack_event(
+ "REVIEW_IN_PROGRESS", resource_status_reason="User Initiated"
+ )
+
+ change_set_id = generate_changeset_id(change_set_name, self.region_name)
+
+ new_change_set = FakeChangeSet(
+ change_set_type=change_set_type,
+ change_set_id=change_set_id,
+ change_set_name=change_set_name,
+ stack=stack,
+ template=template,
+ parameters=parameters,
+ description=description,
+ notification_arns=notification_arns,
+ tags=tags,
+ role_arn=role_arn,
+ )
+ if (
+ change_set_type == "UPDATE"
+ and stack.has_template(template)
+ and stack.has_parameters(parameters)
+ ):
+ # Nothing has changed - mark it as such
+ new_change_set.status = "FAILED"
+ new_change_set.execution_status = "UNAVAILABLE"
+ new_change_set.status_reason = "The submitted information didn't contain changes. Submit different information to create a change set."
+ else:
+ new_change_set.status = "CREATE_COMPLETE"
+ new_change_set.execution_status = "AVAILABLE"
+ self.change_sets[change_set_id] = new_change_set
+ return change_set_id, stack.stack_id
+
+ def delete_change_set(self, change_set_name):
+ if change_set_name in self.change_sets:
+ # This means arn was passed in
+ del self.change_sets[change_set_name]
+ else:
+ for cs in self.change_sets:
+ if self.change_sets[cs].change_set_name == change_set_name:
+ to_delete = cs
+ break
+ del self.change_sets[to_delete]
+
+ def describe_change_set(self, change_set_name):
+ change_set = None
+ if change_set_name in self.change_sets:
+ # This means arn was passed in
+ change_set = self.change_sets[change_set_name]
+ else:
+ for cs in self.change_sets:
+ if self.change_sets[cs].change_set_name == change_set_name:
+ change_set = self.change_sets[cs]
+ if change_set is None:
+ raise ValidationError(change_set_name)
+ return change_set
+
+ def execute_change_set(self, change_set_name, stack_name=None):
+ if change_set_name in self.change_sets:
+ # This means arn was passed in
+ change_set = self.change_sets[change_set_name]
+ else:
+ for cs in self.change_sets:
+ if self.change_sets[cs].change_set_name == change_set_name:
+ change_set = self.change_sets[cs]
+
+ if change_set is None:
+ raise ValidationError(stack_name)
+
+ stack = self.stacks[change_set.stack_id]
+ # TODO: handle execution errors and implement rollback
+ if change_set.change_set_type == "CREATE":
+ stack._add_stack_event(
+ "CREATE_IN_PROGRESS", resource_status_reason="User Initiated"
+ )
+ change_set.apply()
+ stack._add_stack_event("CREATE_COMPLETE")
+ else:
+ stack._add_stack_event("UPDATE_IN_PROGRESS")
+ change_set.apply()
+ stack._add_stack_event("UPDATE_COMPLETE")
+
+ # set the execution status of the changeset
+ change_set.execution_status = "EXECUTE_COMPLETE"
+
+ # set the status of the stack
+ stack.status = f"{change_set.change_set_type}_COMPLETE"
+ stack.template = change_set.template
+ return True
+
+ def describe_stacks(self, name_or_stack_id):
+ stacks = self.stacks.values()
+ if name_or_stack_id:
+ for stack in stacks:
+ if stack.name == name_or_stack_id or stack.stack_id == name_or_stack_id:
+ return [stack]
+ if self.deleted_stacks:
+ deleted_stacks = self.deleted_stacks.values()
+ for stack in deleted_stacks:
+ if stack.stack_id == name_or_stack_id:
+ return [stack]
+ raise ValidationError(name_or_stack_id)
+ else:
+ return list(stacks)
+
+ def list_change_sets(self):
+ return self.change_sets.values()
+
+ def list_stacks(self, status_filter=None):
+ total_stacks = [v for v in self.stacks.values()] + [
+ v for v in self.deleted_stacks.values()
+ ]
+ return filter_stacks(total_stacks, status_filter)
+
+ def get_stack(self, name_or_stack_id):
+ all_stacks = dict(self.deleted_stacks, **self.stacks)
+ if name_or_stack_id in all_stacks:
+ # Lookup by stack id - deleted stacks incldued
+ return all_stacks[name_or_stack_id]
+ else:
+ # Lookup by stack name - undeleted stacks only
+ for stack in self.stacks.values():
+ if stack.name == name_or_stack_id:
+ return stack
+ raise ValidationError(name_or_stack_id)
+
+ def update_stack(self, name, template, role_arn=None, parameters=None, tags=None):
+ stack = self.get_stack(name)
+ resolved_parameters = self._resolve_update_parameters(
+ instance=stack, incoming_params=parameters
+ )
+ stack.update(template, role_arn, parameters=resolved_parameters, tags=tags)
+ return stack
+
+ def get_stack_policy(self, stack_name):
+ try:
+ stack = self.get_stack(stack_name)
+ except ValidationError:
+ raise ValidationError(message=f"Stack: {stack_name} does not exist")
+ return stack.policy
+
+ def set_stack_policy(self, stack_name, policy_body):
+ """
+ Note that Moto does no validation/parsing/enforcement of this policy - we simply persist it.
+ """
+ try:
+ stack = self.get_stack(stack_name)
+ except ValidationError:
+ raise ValidationError(message=f"Stack: {stack_name} does not exist")
+ stack.policy = policy_body
+
+ def list_stack_resources(self, stack_name_or_id):
+ stack = self.get_stack(stack_name_or_id)
+ return stack.stack_resources
+
+ def delete_stack(self, name_or_stack_id):
+ if name_or_stack_id in self.stacks:
+ # Delete by stack id
+ stack = self.stacks.pop(name_or_stack_id, None)
+ export_names = [export.name for export in stack.exports]
+ stack.delete()
+ self.deleted_stacks[stack.stack_id] = stack
+ for export_name in export_names:
+ self.exports.pop(export_name)
+ return self.stacks.pop(name_or_stack_id, None)
+ else:
+ # Delete by stack name
+ for stack in list(self.stacks.values()):
+ if stack.name == name_or_stack_id:
+ self.delete_stack(stack.stack_id)
+
+ def list_exports(self, token):
+ all_exports = list(self.exports.values())
+ if token is None:
+ exports = all_exports[0:100]
+ next_token = "100" if len(all_exports) > 100 else None
+ else:
+ token = int(token)
+ exports = all_exports[token : token + 100]
+ next_token = str(token + 100) if len(all_exports) > token + 100 else None
+ return exports, next_token
+
+ def validate_template(self, template):
+ return validate_template_cfn_lint(template)
+
+ def _validate_export_uniqueness(self, stack):
+ new_stack_export_names = [x.name for x in stack.exports]
+ export_names = self.exports.keys()
+ if not set(export_names).isdisjoint(new_stack_export_names):
+ raise ValidationError(
+ stack.stack_id,
+ message="Export names must be unique across a given region",
+ )
+
+
+cloudformation_backends = BackendDict(CloudFormationBackend, "cloudformation")
diff --git a/contrib/python/moto/py3/moto/cloudformation/parsing.py b/contrib/python/moto/py3/moto/cloudformation/parsing.py
new file mode 100644
index 0000000000..1d55c7a41e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/parsing.py
@@ -0,0 +1,866 @@
+import functools
+import json
+import logging
+import copy
+import warnings
+import re
+
+import collections.abc as collections_abc
+
+# This ugly section of imports is necessary because we
+# build the list of CloudFormationModel subclasses using
+# CloudFormationModel.__subclasses__(). However, if the class
+# definition of a subclass hasn't been executed yet - for example, if
+# the subclass's module hasn't been imported yet - then that subclass
+# doesn't exist yet, and __subclasses__ won't find it.
+# So we import here to populate the list of subclasses.
+from moto.apigateway import models # noqa # pylint: disable=all
+from moto.autoscaling import models # noqa # pylint: disable=all
+from moto.awslambda import models # noqa # pylint: disable=all
+from moto.batch import models # noqa # pylint: disable=all
+from moto.cloudformation.custom_model import CustomModel
+from moto.cloudwatch import models # noqa # pylint: disable=all
+from moto.datapipeline import models # noqa # pylint: disable=all
+from moto.dynamodb import models # noqa # pylint: disable=all
+from moto.ec2 import models as ec2_models
+from moto.ec2.models.core import TaggedEC2Resource
+from moto.ecr import models # noqa # pylint: disable=all
+from moto.ecs import models # noqa # pylint: disable=all
+from moto.efs import models # noqa # pylint: disable=all
+from moto.elb import models # noqa # pylint: disable=all
+from moto.elbv2 import models # noqa # pylint: disable=all
+from moto.events import models # noqa # pylint: disable=all
+from moto.iam import models # noqa # pylint: disable=all
+from moto.kinesis import models # noqa # pylint: disable=all
+from moto.kms import models # noqa # pylint: disable=all
+from moto.rds import models # noqa # pylint: disable=all
+from moto.rds import models # noqa # pylint: disable=all
+from moto.redshift import models # noqa # pylint: disable=all
+from moto.route53 import models # noqa # pylint: disable=all
+from moto.s3 import models # noqa # pylint: disable=all
+from moto.sagemaker import models # noqa # pylint: disable=all
+from moto.sns import models # noqa # pylint: disable=all
+from moto.sqs import models # noqa # pylint: disable=all
+from moto.stepfunctions import models # noqa # pylint: disable=all
+from moto.ssm import models # noqa # pylint: disable=all
+
+# End ugly list of imports
+
+from moto.core import get_account_id, CloudFormationModel
+from moto.s3.models import s3_backend
+from moto.s3.utils import bucket_and_name_from_url
+from moto.ssm import ssm_backends
+from .utils import random_suffix
+from .exceptions import (
+ ExportNotFound,
+ MissingParameterError,
+ UnformattedGetAttTemplateException,
+ ValidationError,
+ UnsupportedAttribute,
+)
+
+# List of supported CloudFormation models
+MODEL_LIST = CloudFormationModel.__subclasses__()
+MODEL_MAP = {model.cloudformation_type(): model for model in MODEL_LIST}
+NAME_TYPE_MAP = {
+ model.cloudformation_type(): model.cloudformation_name_type()
+ for model in MODEL_LIST
+}
+
+# Just ignore these models types for now
+NULL_MODELS = [
+ "AWS::CloudFormation::WaitCondition",
+ "AWS::CloudFormation::WaitConditionHandle",
+]
+
+DEFAULT_REGION = "us-east-1"
+
+logger = logging.getLogger("moto")
+
+
+class Output(object):
+ def __init__(self, connection=None):
+ self.connection = connection
+ self.description = None
+ self.key = None
+ self.value = None
+
+ def __repr__(self):
+ return 'Output:"%s"="%s"' % (self.key, self.value)
+
+
+class LazyDict(dict):
+ def __getitem__(self, key):
+ val = dict.__getitem__(self, key)
+ if callable(val):
+ val = val()
+ self[key] = val
+ return val
+
+
+def clean_json(resource_json, resources_map):
+ """
+ Cleanup the a resource dict. For now, this just means replacing any Ref node
+ with the corresponding physical_resource_id.
+
+ Eventually, this is where we would add things like function parsing (fn::)
+ """
+ if isinstance(resource_json, dict):
+ if "Ref" in resource_json:
+ # Parse resource reference
+ resource = resources_map[resource_json["Ref"]]
+ if hasattr(resource, "physical_resource_id"):
+ return resource.physical_resource_id
+ else:
+ return resource
+
+ if "Fn::FindInMap" in resource_json:
+ map_name = resource_json["Fn::FindInMap"][0]
+ map_path = resource_json["Fn::FindInMap"][1:]
+ result = resources_map[map_name]
+ for path in map_path:
+ if "Fn::Transform" in result:
+ result = resources_map[clean_json(path, resources_map)]
+ else:
+ result = result[clean_json(path, resources_map)]
+ return result
+
+ if "Fn::GetAtt" in resource_json:
+ resource = resources_map.get(resource_json["Fn::GetAtt"][0])
+ if resource is None:
+ return resource_json
+ try:
+ return resource.get_cfn_attribute(resource_json["Fn::GetAtt"][1])
+ except NotImplementedError as n:
+ logger.warning(str(n).format(resource_json["Fn::GetAtt"][0]))
+ except UnformattedGetAttTemplateException:
+ raise ValidationError(
+ "Bad Request",
+ UnformattedGetAttTemplateException.description.format(
+ resource_json["Fn::GetAtt"][0], resource_json["Fn::GetAtt"][1]
+ ),
+ )
+
+ if "Fn::If" in resource_json:
+ condition_name, true_value, false_value = resource_json["Fn::If"]
+ if resources_map.lazy_condition_map[condition_name]:
+ return clean_json(true_value, resources_map)
+ else:
+ return clean_json(false_value, resources_map)
+
+ if "Fn::Join" in resource_json:
+ join_list = clean_json(resource_json["Fn::Join"][1], resources_map)
+ return resource_json["Fn::Join"][0].join([str(x) for x in join_list])
+
+ if "Fn::Split" in resource_json:
+ to_split = clean_json(resource_json["Fn::Split"][1], resources_map)
+ return to_split.split(resource_json["Fn::Split"][0])
+
+ if "Fn::Select" in resource_json:
+ select_index = int(resource_json["Fn::Select"][0])
+ select_list = clean_json(resource_json["Fn::Select"][1], resources_map)
+ return select_list[select_index]
+
+ if "Fn::Sub" in resource_json:
+ if isinstance(resource_json["Fn::Sub"], list):
+ warnings.warn(
+ "Tried to parse Fn::Sub with variable mapping but it's not supported by moto's CloudFormation implementation"
+ )
+ else:
+ fn_sub_value = clean_json(resource_json["Fn::Sub"], resources_map)
+ to_sub = re.findall(r'(?=\${)[^!^"]*?}', fn_sub_value)
+ literals = re.findall(r'(?=\${!)[^"]*?}', fn_sub_value)
+ for sub in to_sub:
+ if "." in sub:
+ cleaned_ref = clean_json(
+ {
+ "Fn::GetAtt": re.findall(r'(?<=\${)[^"]*?(?=})', sub)[
+ 0
+ ].split(".")
+ },
+ resources_map,
+ )
+ else:
+ cleaned_ref = clean_json(
+ {"Ref": re.findall(r'(?<=\${)[^"]*?(?=})', sub)[0]},
+ resources_map,
+ )
+ fn_sub_value = fn_sub_value.replace(sub, cleaned_ref)
+ for literal in literals:
+ fn_sub_value = fn_sub_value.replace(
+ literal, literal.replace("!", "")
+ )
+ return fn_sub_value
+ pass
+
+ if "Fn::ImportValue" in resource_json:
+ cleaned_val = clean_json(resource_json["Fn::ImportValue"], resources_map)
+ values = [
+ x.value
+ for x in resources_map.cross_stack_resources.values()
+ if x.name == cleaned_val
+ ]
+ if any(values):
+ return values[0]
+ else:
+ raise ExportNotFound(cleaned_val)
+
+ if "Fn::GetAZs" in resource_json:
+ region = resource_json.get("Fn::GetAZs") or DEFAULT_REGION
+ result = []
+ # TODO: make this configurable, to reflect the real AWS AZs
+ for az in ("a", "b", "c", "d"):
+ result.append("%s%s" % (region, az))
+ return result
+
+ cleaned_json = {}
+ for key, value in resource_json.items():
+ cleaned_val = clean_json(value, resources_map)
+ if cleaned_val is None:
+ # If we didn't find anything, don't add this attribute
+ continue
+ cleaned_json[key] = cleaned_val
+ return cleaned_json
+ elif isinstance(resource_json, list):
+ return [clean_json(val, resources_map) for val in resource_json]
+ else:
+ return resource_json
+
+
+def resource_class_from_type(resource_type):
+ if resource_type in NULL_MODELS:
+ return None
+ if resource_type.startswith("Custom::"):
+ return CustomModel
+ if resource_type not in MODEL_MAP:
+ logger.warning("No Moto CloudFormation support for %s", resource_type)
+ return None
+
+ return MODEL_MAP.get(resource_type)
+
+
+def resource_name_property_from_type(resource_type):
+ for model in MODEL_LIST:
+ if model.cloudformation_type() == resource_type:
+ return model.cloudformation_name_type()
+ return NAME_TYPE_MAP.get(resource_type)
+
+
+def generate_resource_name(resource_type, stack_name, logical_id):
+ if resource_type in [
+ "AWS::ElasticLoadBalancingV2::TargetGroup",
+ "AWS::ElasticLoadBalancingV2::LoadBalancer",
+ ]:
+ # Target group names need to be less than 32 characters, so when cloudformation creates a name for you
+ # it makes sure to stay under that limit
+ name_prefix = "{0}-{1}".format(stack_name, logical_id)
+ my_random_suffix = random_suffix()
+ truncated_name_prefix = name_prefix[0 : 32 - (len(my_random_suffix) + 1)]
+ # if the truncated name ends in a dash, we'll end up with a double dash in the final name, which is
+ # not allowed
+ if truncated_name_prefix.endswith("-"):
+ truncated_name_prefix = truncated_name_prefix[:-1]
+ return "{0}-{1}".format(truncated_name_prefix, my_random_suffix)
+ elif resource_type == "AWS::S3::Bucket":
+ right_hand_part_of_name = "-{0}-{1}".format(logical_id, random_suffix())
+ max_stack_name_portion_len = 63 - len(right_hand_part_of_name)
+ return "{0}{1}".format(
+ stack_name[:max_stack_name_portion_len], right_hand_part_of_name
+ ).lower()
+ elif resource_type == "AWS::IAM::Policy":
+ return "{0}-{1}-{2}".format(stack_name[:5], logical_id[:4], random_suffix())
+ else:
+ return "{0}-{1}-{2}".format(stack_name, logical_id, random_suffix())
+
+
+def parse_resource(resource_json, resources_map):
+ resource_type = resource_json["Type"]
+ resource_class = resource_class_from_type(resource_type)
+ if not resource_class:
+ warnings.warn(
+ "Tried to parse {0} but it's not supported by moto's CloudFormation implementation".format(
+ resource_type
+ )
+ )
+ return None
+
+ if "Properties" not in resource_json:
+ resource_json["Properties"] = {}
+
+ resource_json = clean_json(resource_json, resources_map)
+
+ return resource_class, resource_json, resource_type
+
+
+def parse_resource_and_generate_name(logical_id, resource_json, resources_map):
+ resource_tuple = parse_resource(resource_json, resources_map)
+ if not resource_tuple:
+ return None
+ resource_class, resource_json, resource_type = resource_tuple
+
+ generated_resource_name = generate_resource_name(
+ resource_type, resources_map.get("AWS::StackName"), logical_id
+ )
+
+ resource_name_property = resource_name_property_from_type(resource_type)
+ if resource_name_property:
+ if (
+ "Properties" in resource_json
+ and resource_name_property in resource_json["Properties"]
+ ):
+ resource_name = resource_json["Properties"][resource_name_property]
+ else:
+ resource_name = generated_resource_name
+ else:
+ resource_name = generated_resource_name
+
+ return resource_class, resource_json, resource_name
+
+
+def parse_and_create_resource(logical_id, resource_json, resources_map, region_name):
+ condition = resource_json.get("Condition")
+ if condition and not resources_map.lazy_condition_map[condition]:
+ # If this has a False condition, don't create the resource
+ return None
+
+ resource_type = resource_json["Type"]
+ resource_tuple = parse_resource_and_generate_name(
+ logical_id, resource_json, resources_map
+ )
+ if not resource_tuple:
+ return None
+ resource_class, resource_json, resource_physical_name = resource_tuple
+ kwargs = {
+ "LogicalId": logical_id,
+ "StackId": resources_map.stack_id,
+ "ResourceType": resource_type,
+ }
+ resource = resource_class.create_from_cloudformation_json(
+ resource_physical_name, resource_json, region_name, **kwargs
+ )
+ resource.type = resource_type
+ resource.logical_resource_id = logical_id
+ return resource
+
+
+def parse_and_update_resource(logical_id, resource_json, resources_map, region_name):
+ resource_tuple = parse_resource_and_generate_name(
+ logical_id, resource_json, resources_map
+ )
+ if not resource_tuple:
+ return None
+ resource_class, resource_json, new_resource_name = resource_tuple
+ original_resource = resources_map[logical_id]
+ if not hasattr(
+ resource_class.update_from_cloudformation_json, "__isabstractmethod__"
+ ):
+ new_resource = resource_class.update_from_cloudformation_json(
+ original_resource=original_resource,
+ new_resource_name=new_resource_name,
+ cloudformation_json=resource_json,
+ region_name=region_name,
+ )
+ new_resource.type = resource_json["Type"]
+ new_resource.logical_resource_id = logical_id
+ return new_resource
+ else:
+ return None
+
+
+def parse_and_delete_resource(resource_name, resource_json, region_name):
+ resource_type = resource_json["Type"]
+ resource_class = resource_class_from_type(resource_type)
+ if not hasattr(
+ resource_class.delete_from_cloudformation_json, "__isabstractmethod__"
+ ):
+ resource_class.delete_from_cloudformation_json(
+ resource_name, resource_json, region_name
+ )
+
+
+def parse_condition(condition, resources_map, condition_map):
+ if isinstance(condition, bool):
+ return condition
+
+ condition_operator = list(condition.keys())[0]
+
+ condition_values = []
+ for value in list(condition.values())[0]:
+ # Check if we are referencing another Condition
+ if isinstance(value, dict) and "Condition" in value:
+ condition_values.append(condition_map[value["Condition"]])
+ else:
+ condition_values.append(clean_json(value, resources_map))
+
+ if condition_operator == "Fn::Equals":
+ if condition_values[1] in [True, False]:
+ return str(condition_values[0]).lower() == str(condition_values[1]).lower()
+ return condition_values[0] == condition_values[1]
+ elif condition_operator == "Fn::Not":
+ return not parse_condition(condition_values[0], resources_map, condition_map)
+ elif condition_operator == "Fn::And":
+ return all(
+ [
+ parse_condition(condition_value, resources_map, condition_map)
+ for condition_value in condition_values
+ ]
+ )
+ elif condition_operator == "Fn::Or":
+ return any(
+ [
+ parse_condition(condition_value, resources_map, condition_map)
+ for condition_value in condition_values
+ ]
+ )
+
+
+def parse_output(output_logical_id, output_json, resources_map):
+ output_json = clean_json(output_json, resources_map)
+ if "Value" not in output_json:
+ return None
+ output = Output()
+ output.key = output_logical_id
+ output.value = clean_json(output_json["Value"], resources_map)
+ output.description = output_json.get("Description")
+ return output
+
+
+class ResourceMap(collections_abc.Mapping):
+ """
+ This is a lazy loading map for resources. This allows us to create resources
+ without needing to create a full dependency tree. Upon creation, each
+ each resources is passed this lazy map that it can grab dependencies from.
+ """
+
+ def __init__(
+ self,
+ stack_id,
+ stack_name,
+ parameters,
+ tags,
+ region_name,
+ template,
+ cross_stack_resources,
+ ):
+ self._template = template
+ self._resource_json_map = template["Resources"] if template != {} else {}
+ self._region_name = region_name
+ self.input_parameters = parameters
+ self.tags = copy.deepcopy(tags)
+ self.resolved_parameters = {}
+ self.cross_stack_resources = cross_stack_resources
+ self.stack_id = stack_id
+
+ # Create the default resources
+ self._parsed_resources = {
+ "AWS::AccountId": get_account_id(),
+ "AWS::Region": self._region_name,
+ "AWS::StackId": stack_id,
+ "AWS::StackName": stack_name,
+ "AWS::URLSuffix": "amazonaws.com",
+ "AWS::NoValue": None,
+ "AWS::Partition": "aws",
+ }
+
+ def __getitem__(self, key):
+ resource_logical_id = key
+
+ if resource_logical_id in self._parsed_resources:
+ return self._parsed_resources[resource_logical_id]
+ else:
+ resource_json = self._resource_json_map.get(resource_logical_id)
+
+ if not resource_json:
+ raise KeyError(resource_logical_id)
+ new_resource = parse_and_create_resource(
+ resource_logical_id, resource_json, self, self._region_name
+ )
+ if new_resource is not None:
+ self._parsed_resources[resource_logical_id] = new_resource
+ return new_resource
+
+ def __iter__(self):
+ return iter(self.resources)
+
+ def __len__(self):
+ return len(self._resource_json_map)
+
+ def __get_resources_in_dependency_order(self):
+ resource_map = copy.deepcopy(self._resource_json_map)
+ resources_in_dependency_order = []
+
+ def recursively_get_dependencies(resource):
+ resource_info = resource_map[resource]
+
+ if "DependsOn" not in resource_info:
+ resources_in_dependency_order.append(resource)
+ del resource_map[resource]
+ return
+
+ dependencies = resource_info["DependsOn"]
+ if isinstance(dependencies, str): # Dependencies may be a string or list
+ dependencies = [dependencies]
+
+ for dependency in dependencies:
+ if dependency in resource_map:
+ recursively_get_dependencies(dependency)
+
+ resources_in_dependency_order.append(resource)
+ del resource_map[resource]
+
+ while resource_map:
+ recursively_get_dependencies(list(resource_map.keys())[0])
+
+ return resources_in_dependency_order
+
+ @property
+ def resources(self):
+ return self._resource_json_map.keys()
+
+ def load_mapping(self):
+ self._parsed_resources.update(self._template.get("Mappings", {}))
+
+ def transform_mapping(self):
+ for v in self._template.get("Mappings", {}).values():
+ if "Fn::Transform" in v:
+ name = v["Fn::Transform"]["Name"]
+ params = v["Fn::Transform"]["Parameters"]
+ if name == "AWS::Include":
+ location = params["Location"]
+ bucket_name, name = bucket_and_name_from_url(location)
+ key = s3_backend.get_object(bucket_name, name)
+ self._parsed_resources.update(json.loads(key.value))
+
+ def parse_ssm_parameter(self, value, value_type):
+ # The Value in SSM parameters is the SSM parameter path
+ # we need to use ssm_backend to retrieve the
+ # actual value from parameter store
+ parameter = ssm_backends[self._region_name].get_parameter(value)
+ actual_value = parameter.value
+ if value_type.find("List") > 0:
+ return actual_value.split(",")
+ return actual_value
+
+ def load_parameters(self):
+ parameter_slots = self._template.get("Parameters", {})
+ for parameter_name, parameter in parameter_slots.items():
+ # Set the default values.
+ value = parameter.get("Default")
+ value_type = parameter.get("Type")
+ if value_type.startswith("AWS::SSM::Parameter::") and value:
+ value = self.parse_ssm_parameter(value, value_type)
+ self.resolved_parameters[parameter_name] = value
+
+ # Set any input parameters that were passed
+ self.no_echo_parameter_keys = []
+ for key, value in self.input_parameters.items():
+ if key in self.resolved_parameters:
+ parameter_slot = parameter_slots[key]
+
+ value_type = parameter_slot.get("Type", "String")
+ if value_type.startswith("AWS::SSM::Parameter::"):
+ value = self.parse_ssm_parameter(value, value_type)
+ if value_type == "CommaDelimitedList" or value_type.startswith("List"):
+ value = value.split(",")
+
+ def _parse_number_parameter(num_string):
+ """CloudFormation NUMBER types can be an int or float.
+ Try int first and then fall back to float if that fails
+ """
+ try:
+ return int(num_string)
+ except ValueError:
+ return float(num_string)
+
+ if value_type == "List<Number>":
+ # The if statement directly above already converted
+ # to a list. Now we convert each element to a number
+ value = [_parse_number_parameter(v) for v in value]
+
+ if value_type == "Number":
+ value = _parse_number_parameter(value)
+
+ if parameter_slot.get("NoEcho"):
+ self.no_echo_parameter_keys.append(key)
+
+ self.resolved_parameters[key] = value
+
+ # Check if there are any non-default params that were not passed input
+ # params
+ for key, value in self.resolved_parameters.items():
+ if value is None:
+ raise MissingParameterError(key)
+
+ self._parsed_resources.update(self.resolved_parameters)
+
+ def load_conditions(self):
+ conditions = self._template.get("Conditions", {})
+ self.lazy_condition_map = LazyDict()
+ for condition_name, condition in conditions.items():
+ self.lazy_condition_map[condition_name] = functools.partial(
+ parse_condition,
+ condition,
+ self._parsed_resources,
+ self.lazy_condition_map,
+ )
+
+ for condition_name in self.lazy_condition_map:
+ self.lazy_condition_map[condition_name]
+
+ def validate_outputs(self):
+ outputs = self._template.get("Outputs") or {}
+ for value in outputs.values():
+ value = value.get("Value", {})
+ if "Fn::GetAtt" in value:
+ resource_type = self._resource_json_map.get(value["Fn::GetAtt"][0])[
+ "Type"
+ ]
+ attr = value["Fn::GetAtt"][1]
+ resource_class = resource_class_from_type(resource_type)
+ if not resource_class.has_cfn_attr(attr):
+ # AWS::SQS::Queue --> Queue
+ short_type = resource_type[resource_type.rindex(":") + 1 :]
+ raise UnsupportedAttribute(resource=short_type, attr=attr)
+
+ def load(self):
+ self.load_mapping()
+ self.transform_mapping()
+ self.load_parameters()
+ self.load_conditions()
+ self.validate_outputs()
+
+ def create(self, template):
+ # Since this is a lazy map, to create every object we just need to
+ # iterate through self.
+ # Assumes that self.load() has been called before
+ self._template = template
+ self._resource_json_map = template["Resources"]
+ self.tags.update(
+ {
+ "aws:cloudformation:stack-name": self.get("AWS::StackName"),
+ "aws:cloudformation:stack-id": self.get("AWS::StackId"),
+ }
+ )
+ all_resources_ready = True
+ for resource in self.__get_resources_in_dependency_order():
+ instance = self[resource]
+ if isinstance(instance, TaggedEC2Resource):
+ self.tags["aws:cloudformation:logical-id"] = resource
+ ec2_models.ec2_backends[self._region_name].create_tags(
+ [instance.physical_resource_id], self.tags
+ )
+ if instance and not instance.is_created():
+ all_resources_ready = False
+ return all_resources_ready
+
+ def creation_complete(self):
+ all_resources_ready = True
+ for resource in self.__get_resources_in_dependency_order():
+ instance = self[resource]
+ if instance and not instance.is_created():
+ all_resources_ready = False
+ return all_resources_ready
+
+ def build_resource_diff(self, other_template):
+
+ old = self._resource_json_map
+ new = other_template["Resources"]
+
+ resource_names_by_action = {
+ "Add": set(new) - set(old),
+ "Modify": set(
+ name for name in new if name in old and new[name] != old[name]
+ ),
+ "Remove": set(old) - set(new),
+ }
+
+ return resource_names_by_action
+
+ def build_change_set_actions(self, template, parameters):
+
+ resource_names_by_action = self.build_resource_diff(template)
+
+ resources_by_action = {"Add": {}, "Modify": {}, "Remove": {}}
+
+ for resource_name in resource_names_by_action["Add"]:
+ resources_by_action["Add"][resource_name] = {
+ "LogicalResourceId": resource_name,
+ "ResourceType": template["Resources"][resource_name]["Type"],
+ }
+
+ for resource_name in resource_names_by_action["Modify"]:
+ resources_by_action["Modify"][resource_name] = {
+ "LogicalResourceId": resource_name,
+ "ResourceType": template["Resources"][resource_name]["Type"],
+ }
+
+ for resource_name in resource_names_by_action["Remove"]:
+ resources_by_action["Remove"][resource_name] = {
+ "LogicalResourceId": resource_name,
+ "ResourceType": self._resource_json_map[resource_name]["Type"],
+ }
+
+ return resources_by_action
+
+ def update(self, template, parameters=None):
+
+ resource_names_by_action = self.build_resource_diff(template)
+
+ for logical_name in resource_names_by_action["Remove"]:
+ resource_json = self._resource_json_map[logical_name]
+ resource = self._parsed_resources[logical_name]
+ # ToDo: Standardize this.
+ if hasattr(resource, "physical_resource_id"):
+ resource_name = self._parsed_resources[
+ logical_name
+ ].physical_resource_id
+ else:
+ resource_name = None
+ parse_and_delete_resource(resource_name, resource_json, self._region_name)
+ self._parsed_resources.pop(logical_name)
+
+ self._template = template
+ if parameters:
+ self.input_parameters = parameters
+ self.load_mapping()
+ self.load_parameters()
+ self.load_conditions()
+
+ self._resource_json_map = template["Resources"]
+
+ for logical_name in resource_names_by_action["Add"]:
+
+ # call __getitem__ to initialize the resource
+ # TODO: usage of indexer to initalize the resource is questionable
+ _ = self[logical_name]
+
+ tries = 1
+ while resource_names_by_action["Modify"] and tries < 5:
+ for logical_name in resource_names_by_action["Modify"].copy():
+ resource_json = self._resource_json_map[logical_name]
+ try:
+ changed_resource = parse_and_update_resource(
+ logical_name, resource_json, self, self._region_name
+ )
+ except Exception as e:
+ # skip over dependency violations, and try again in a
+ # second pass
+ last_exception = e
+ else:
+ self._parsed_resources[logical_name] = changed_resource
+ resource_names_by_action["Modify"].remove(logical_name)
+ tries += 1
+ if tries == 5:
+ raise last_exception
+
+ def delete(self):
+ remaining_resources = set(self.resources)
+ tries = 1
+ while remaining_resources and tries < 5:
+ for resource in remaining_resources.copy():
+ parsed_resource = self._parsed_resources.get(resource)
+ try:
+ if (
+ not isinstance(parsed_resource, str)
+ and parsed_resource is not None
+ ):
+ if parsed_resource and hasattr(parsed_resource, "delete"):
+ parsed_resource.delete(self._region_name)
+ else:
+ if hasattr(parsed_resource, "physical_resource_id"):
+ resource_name = parsed_resource.physical_resource_id
+ else:
+ resource_name = None
+
+ resource_json = self._resource_json_map[
+ parsed_resource.logical_resource_id
+ ]
+
+ parse_and_delete_resource(
+ resource_name, resource_json, self._region_name
+ )
+
+ self._parsed_resources.pop(parsed_resource.logical_resource_id)
+ except Exception as e:
+ # skip over dependency violations, and try again in a
+ # second pass
+ last_exception = e
+ else:
+ remaining_resources.remove(resource)
+ tries += 1
+ if tries == 5:
+ raise last_exception
+
+
+class OutputMap(collections_abc.Mapping):
+ def __init__(self, resources, template, stack_id):
+ self._template = template
+ self._stack_id = stack_id
+
+ if "Outputs" in template and template["Outputs"] is None:
+ raise ValidationError(
+ stack_id, # not sure why we need to supply this when also supplying message
+ message="[/Outputs] 'null' values are not allowed in templates",
+ )
+
+ self._output_json_map = template.get("Outputs")
+
+ # Create the default resources
+ self._resource_map = resources
+ self._parsed_outputs = dict()
+
+ def __getitem__(self, key):
+ output_logical_id = key
+
+ if output_logical_id in self._parsed_outputs:
+ return self._parsed_outputs[output_logical_id]
+ else:
+ output_json = self._output_json_map.get(output_logical_id)
+ new_output = parse_output(
+ output_logical_id, output_json, self._resource_map
+ )
+ if new_output:
+ self._parsed_outputs[output_logical_id] = new_output
+ return new_output
+
+ def __iter__(self):
+ return iter(self.outputs)
+
+ def __len__(self):
+ return len(self._output_json_map)
+
+ @property
+ def outputs(self):
+ return self._output_json_map.keys() if self._output_json_map else []
+
+ @property
+ def exports(self):
+ exports = []
+ if self.outputs:
+ for value in self._output_json_map.values():
+ if value.get("Export"):
+ cleaned_name = clean_json(
+ value["Export"].get("Name"), self._resource_map
+ )
+ cleaned_value = clean_json(value.get("Value"), self._resource_map)
+ exports.append(Export(self._stack_id, cleaned_name, cleaned_value))
+ return exports
+
+
+class Export(object):
+ def __init__(self, exporting_stack_id, name, value):
+ self._exporting_stack_id = exporting_stack_id
+ self._name = name
+ self._value = value
+
+ @property
+ def exporting_stack_id(self):
+ return self._exporting_stack_id
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def value(self):
+ return self._value
diff --git a/contrib/python/moto/py3/moto/cloudformation/responses.py b/contrib/python/moto/py3/moto/cloudformation/responses.py
new file mode 100644
index 0000000000..32d1c9f11c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/responses.py
@@ -0,0 +1,1282 @@
+import json
+import yaml
+from urllib.parse import urlparse
+from yaml.parser import ParserError # pylint:disable=c-extension-no-member
+from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from moto.s3.models import s3_backend
+from moto.s3.exceptions import S3ClientError
+from moto.core import get_account_id
+from .models import cloudformation_backends
+from .exceptions import ValidationError, MissingParameterError
+from .utils import yaml_tag_constructor
+
+
+def get_template_summary_response_from_template(template_body):
+ def get_resource_types(template_dict):
+ resources = {}
+ for key, value in template_dict.items():
+ if key == "Resources":
+ resources = value
+
+ resource_types = []
+ for key, value in resources.items():
+ resource_types.append(value["Type"])
+ return resource_types
+
+ yaml.add_multi_constructor("", yaml_tag_constructor)
+
+ try:
+ template_dict = yaml.load(template_body, Loader=yaml.Loader)
+ except (ParserError, ScannerError):
+ template_dict = json.loads(template_body)
+
+ resources_types = get_resource_types(template_dict)
+ template_dict["resourceTypes"] = resources_types
+ return template_dict
+
+
+class CloudFormationResponse(BaseResponse):
+ @property
+ def cloudformation_backend(self):
+ return cloudformation_backends[self.region]
+
+ @classmethod
+ def cfnresponse(cls, *args, **kwargs): # pylint: disable=unused-argument
+ request, full_url, headers = args
+ full_url += "&Action=ProcessCfnResponse"
+ return cls.dispatch(request=request, full_url=full_url, headers=headers)
+
+ def _get_stack_from_s3_url(self, template_url):
+ template_url_parts = urlparse(template_url)
+ if "localhost" in template_url:
+ bucket_name, key_name = template_url_parts.path.lstrip("/").split("/", 1)
+ else:
+ if template_url_parts.netloc.endswith(
+ "amazonaws.com"
+ ) and template_url_parts.netloc.startswith("s3"):
+ # Handle when S3 url uses amazon url with bucket in path
+ # Also handles getting region as technically s3 is region'd
+
+ # region = template_url.netloc.split('.')[1]
+ bucket_name, key_name = template_url_parts.path.lstrip("/").split(
+ "/", 1
+ )
+ else:
+ bucket_name = template_url_parts.netloc.split(".")[0]
+ key_name = template_url_parts.path.lstrip("/")
+
+ key = s3_backend.get_object(bucket_name, key_name)
+ return key.value.decode("utf-8")
+
+ def _get_params_from_list(self, parameters_list):
+ # Hack dict-comprehension
+ return dict(
+ [
+ (parameter["parameter_key"], parameter["parameter_value"])
+ for parameter in parameters_list
+ ]
+ )
+
+ def _get_param_values(self, parameters_list, existing_params):
+ result = {}
+ for parameter in parameters_list:
+ if parameter.keys() >= {"parameter_key", "parameter_value"}:
+ result[parameter["parameter_key"]] = parameter["parameter_value"]
+ elif (
+ parameter.keys() >= {"parameter_key", "use_previous_value"}
+ and parameter["parameter_key"] in existing_params
+ ):
+ result[parameter["parameter_key"]] = existing_params[
+ parameter["parameter_key"]
+ ]
+ else:
+ raise MissingParameterError(parameter["parameter_key"])
+ return result
+
+ def process_cfn_response(self):
+ status = self._get_param("Status")
+ if status == "SUCCESS":
+ stack_id = self._get_param("StackId")
+ logical_resource_id = self._get_param("LogicalResourceId")
+ outputs = self._get_param("Data")
+ stack = self.cloudformation_backend.get_stack(stack_id)
+ custom_resource = stack.get_custom_resource(logical_resource_id)
+ custom_resource.set_data(outputs)
+ stack.verify_readiness()
+
+ return 200, {"status": 200}, json.dumps("{}")
+
+ def create_stack(self):
+ stack_name = self._get_param("StackName")
+ stack_body = self._get_param("TemplateBody")
+ template_url = self._get_param("TemplateURL")
+ role_arn = self._get_param("RoleARN")
+ parameters_list = self._get_list_prefix("Parameters.member")
+ tags = dict(
+ (item["key"], item["value"])
+ for item in self._get_list_prefix("Tags.member")
+ )
+
+ if self.stack_name_exists(new_stack_name=stack_name):
+ template = self.response_template(
+ CREATE_STACK_NAME_EXISTS_RESPONSE_TEMPLATE
+ )
+ return 400, {"status": 400}, template.render(name=stack_name)
+
+ parameters = self._get_params_from_list(parameters_list)
+
+ if template_url:
+ stack_body = self._get_stack_from_s3_url(template_url)
+ stack_notification_arns = self._get_multi_param("NotificationARNs.member")
+
+ stack = self.cloudformation_backend.create_stack(
+ name=stack_name,
+ template=stack_body,
+ parameters=parameters,
+ notification_arns=stack_notification_arns,
+ tags=tags,
+ role_arn=role_arn,
+ )
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreateStackResponse": {
+ "CreateStackResult": {"StackId": stack.stack_id}
+ }
+ }
+ )
+ else:
+ template = self.response_template(CREATE_STACK_RESPONSE_TEMPLATE)
+ return template.render(stack=stack)
+
+ def stack_name_exists(self, new_stack_name):
+ for stack in self.cloudformation_backend.stacks.values():
+ if stack.name == new_stack_name:
+ return True
+ return False
+
+ @amzn_request_id
+ def create_change_set(self):
+ stack_name = self._get_param("StackName")
+ change_set_name = self._get_param("ChangeSetName")
+ stack_body = self._get_param("TemplateBody")
+ template_url = self._get_param("TemplateURL")
+ description = self._get_param("Description")
+ role_arn = self._get_param("RoleARN")
+ update_or_create = self._get_param("ChangeSetType", "CREATE")
+ parameters_list = self._get_list_prefix("Parameters.member")
+ tags = dict(
+ (item["key"], item["value"])
+ for item in self._get_list_prefix("Tags.member")
+ )
+ parameters = {
+ param["parameter_key"]: param["parameter_value"]
+ for param in parameters_list
+ }
+ if template_url:
+ stack_body = self._get_stack_from_s3_url(template_url)
+ stack_notification_arns = self._get_multi_param("NotificationARNs.member")
+ change_set_id, stack_id = self.cloudformation_backend.create_change_set(
+ stack_name=stack_name,
+ change_set_name=change_set_name,
+ template=stack_body,
+ parameters=parameters,
+ description=description,
+ notification_arns=stack_notification_arns,
+ tags=tags,
+ role_arn=role_arn,
+ change_set_type=update_or_create,
+ )
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreateChangeSetResponse": {
+ "CreateChangeSetResult": {
+ "Id": change_set_id,
+ "StackId": stack_id,
+ }
+ }
+ }
+ )
+ else:
+ template = self.response_template(CREATE_CHANGE_SET_RESPONSE_TEMPLATE)
+ return template.render(stack_id=stack_id, change_set_id=change_set_id)
+
+ def delete_change_set(self):
+ change_set_name = self._get_param("ChangeSetName")
+
+ self.cloudformation_backend.delete_change_set(change_set_name=change_set_name)
+ if self.request_json:
+ return json.dumps(
+ {"DeleteChangeSetResponse": {"DeleteChangeSetResult": {}}}
+ )
+ else:
+ template = self.response_template(DELETE_CHANGE_SET_RESPONSE_TEMPLATE)
+ return template.render()
+
+ def describe_change_set(self):
+ change_set_name = self._get_param("ChangeSetName")
+ change_set = self.cloudformation_backend.describe_change_set(
+ change_set_name=change_set_name
+ )
+ template = self.response_template(DESCRIBE_CHANGE_SET_RESPONSE_TEMPLATE)
+ return template.render(change_set=change_set)
+
+ @amzn_request_id
+ def execute_change_set(self):
+ stack_name = self._get_param("StackName")
+ change_set_name = self._get_param("ChangeSetName")
+ self.cloudformation_backend.execute_change_set(
+ stack_name=stack_name, change_set_name=change_set_name
+ )
+ if self.request_json:
+ return json.dumps(
+ {"ExecuteChangeSetResponse": {"ExecuteChangeSetResult": {}}}
+ )
+ else:
+ template = self.response_template(EXECUTE_CHANGE_SET_RESPONSE_TEMPLATE)
+ return template.render()
+
+ def describe_stacks(self):
+ stack_name_or_id = None
+ if self._get_param("StackName"):
+ stack_name_or_id = self.querystring.get("StackName")[0]
+ token = self._get_param("NextToken")
+ stacks = self.cloudformation_backend.describe_stacks(stack_name_or_id)
+ stack_ids = [stack.stack_id for stack in stacks]
+ if token:
+ start = stack_ids.index(token) + 1
+ else:
+ start = 0
+ max_results = 50 # using this to mske testing of paginated stacks more convenient than default 1 MB
+ stacks_resp = stacks[start : start + max_results]
+ next_token = None
+ if len(stacks) > (start + max_results):
+ next_token = stacks_resp[-1].stack_id
+ template = self.response_template(DESCRIBE_STACKS_TEMPLATE)
+ return template.render(stacks=stacks_resp, next_token=next_token)
+
+ def describe_stack_resource(self):
+ stack_name = self._get_param("StackName")
+ stack = self.cloudformation_backend.get_stack(stack_name)
+ logical_resource_id = self._get_param("LogicalResourceId")
+
+ resource = None
+ for stack_resource in stack.stack_resources:
+ if stack_resource.logical_resource_id == logical_resource_id:
+ resource = stack_resource
+ break
+
+ if not resource:
+ message = "Resource {0} does not exist for stack {1}".format(
+ logical_resource_id, stack_name
+ )
+ raise ValidationError(stack_name, message)
+
+ template = self.response_template(DESCRIBE_STACK_RESOURCE_RESPONSE_TEMPLATE)
+ return template.render(stack=stack, resource=resource)
+
+ def describe_stack_resources(self):
+ stack_name = self._get_param("StackName")
+ stack = self.cloudformation_backend.get_stack(stack_name)
+
+ template = self.response_template(DESCRIBE_STACK_RESOURCES_RESPONSE)
+ return template.render(stack=stack)
+
+ def describe_stack_events(self):
+ stack_name = self._get_param("StackName")
+ stack = self.cloudformation_backend.get_stack(stack_name)
+
+ template = self.response_template(DESCRIBE_STACK_EVENTS_RESPONSE)
+ return template.render(stack=stack)
+
+ def list_change_sets(self):
+ change_sets = self.cloudformation_backend.list_change_sets()
+ template = self.response_template(LIST_CHANGE_SETS_RESPONSE)
+ return template.render(change_sets=change_sets)
+
+ def list_stacks(self):
+ status_filter = self._get_multi_param("StackStatusFilter.member")
+ stacks = self.cloudformation_backend.list_stacks(status_filter)
+ template = self.response_template(LIST_STACKS_RESPONSE)
+ return template.render(stacks=stacks)
+
+ def list_stack_resources(self):
+ stack_name_or_id = self._get_param("StackName")
+ resources = self.cloudformation_backend.list_stack_resources(stack_name_or_id)
+
+ template = self.response_template(LIST_STACKS_RESOURCES_RESPONSE)
+ return template.render(resources=resources)
+
+ def get_template(self):
+ name_or_stack_id = self.querystring.get("StackName")[0]
+ stack = self.cloudformation_backend.get_stack(name_or_stack_id)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "GetTemplateResponse": {
+ "GetTemplateResult": {
+ "TemplateBody": stack.template,
+ "ResponseMetadata": {
+ "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE"
+ },
+ }
+ }
+ }
+ )
+ else:
+ template = self.response_template(GET_TEMPLATE_RESPONSE_TEMPLATE)
+ return template.render(stack=stack)
+
+ def get_template_summary(self):
+ stack_name = self._get_param("StackName")
+ template_url = self._get_param("TemplateURL")
+ stack_body = self._get_param("TemplateBody")
+
+ if stack_name:
+ stack = self.cloudformation_backend.get_stack(stack_name)
+ if stack.status == "REVIEW_IN_PROGRESS":
+ raise ValidationError(
+ message="GetTemplateSummary cannot be called on REVIEW_IN_PROGRESS stacks."
+ )
+ stack_body = stack.template
+ elif template_url:
+ stack_body = self._get_stack_from_s3_url(template_url)
+
+ template_summary = get_template_summary_response_from_template(stack_body)
+ template = self.response_template(GET_TEMPLATE_SUMMARY_TEMPLATE)
+ return template.render(template_summary=template_summary)
+
+ def _validate_different_update(self, incoming_params, stack_body, old_stack):
+ if incoming_params and stack_body:
+ new_params = self._get_param_values(incoming_params, old_stack.parameters)
+ if old_stack.template == stack_body and old_stack.parameters == new_params:
+ raise ValidationError(
+ old_stack.name, message=f"Stack [{old_stack.name}] already exists"
+ )
+
+ def _validate_status(self, stack):
+ if stack.status == "ROLLBACK_COMPLETE":
+ raise ValidationError(
+ stack.stack_id,
+ message="Stack:{0} is in ROLLBACK_COMPLETE state and can not "
+ "be updated.".format(stack.stack_id),
+ )
+
+ def update_stack(self):
+ stack_name = self._get_param("StackName")
+ role_arn = self._get_param("RoleARN")
+ template_url = self._get_param("TemplateURL")
+ stack_body = self._get_param("TemplateBody")
+ stack = self.cloudformation_backend.get_stack(stack_name)
+ if self._get_param("UsePreviousTemplate") == "true":
+ stack_body = stack.template
+ elif not stack_body and template_url:
+ stack_body = self._get_stack_from_s3_url(template_url)
+
+ incoming_params = self._get_list_prefix("Parameters.member")
+ # boto3 is supposed to let you clear the tags by passing an empty value, but the request body doesn't
+ # end up containing anything we can use to differentiate between passing an empty value versus not
+ # passing anything. so until that changes, moto won't be able to clear tags, only update them.
+ tags = dict(
+ (item["key"], item["value"])
+ for item in self._get_list_prefix("Tags.member")
+ )
+ # so that if we don't pass the parameter, we don't clear all the tags accidentally
+ if not tags:
+ tags = None
+
+ stack = self.cloudformation_backend.get_stack(stack_name)
+ self._validate_different_update(incoming_params, stack_body, stack)
+ self._validate_status(stack)
+
+ stack = self.cloudformation_backend.update_stack(
+ name=stack_name,
+ template=stack_body,
+ role_arn=role_arn,
+ parameters=incoming_params,
+ tags=tags,
+ )
+ if self.request_json:
+ stack_body = {
+ "UpdateStackResponse": {"UpdateStackResult": {"StackId": stack.name}}
+ }
+ return json.dumps(stack_body)
+ else:
+ template = self.response_template(UPDATE_STACK_RESPONSE_TEMPLATE)
+ return template.render(stack=stack)
+
+ def delete_stack(self):
+ name_or_stack_id = self.querystring.get("StackName")[0]
+
+ self.cloudformation_backend.delete_stack(name_or_stack_id)
+ if self.request_json:
+ return json.dumps({"DeleteStackResponse": {"DeleteStackResult": {}}})
+ else:
+ template = self.response_template(DELETE_STACK_RESPONSE_TEMPLATE)
+ return template.render()
+
+ def list_exports(self):
+ token = self._get_param("NextToken")
+ exports, next_token = self.cloudformation_backend.list_exports(token=token)
+ template = self.response_template(LIST_EXPORTS_RESPONSE)
+ return template.render(exports=exports, next_token=next_token)
+
+ def validate_template(self):
+ template_body = self._get_param("TemplateBody")
+ template_url = self._get_param("TemplateURL")
+ if template_url:
+ template_body = self._get_stack_from_s3_url(template_url)
+
+ cfn_lint = self.cloudformation_backend.validate_template(template_body)
+ if cfn_lint:
+ raise ValidationError(cfn_lint[0].message)
+ description = ""
+ try:
+ description = json.loads(template_body)["Description"]
+ except (ValueError, KeyError):
+ pass
+ try:
+ description = yaml.load(template_body, Loader=yaml.Loader)["Description"]
+ except (ParserError, ScannerError, KeyError):
+ pass
+ template = self.response_template(VALIDATE_STACK_RESPONSE_TEMPLATE)
+ return template.render(description=description)
+
+ def create_stack_set(self):
+ stackset_name = self._get_param("StackSetName")
+ stack_body = self._get_param("TemplateBody")
+ template_url = self._get_param("TemplateURL")
+ parameters_list = self._get_list_prefix("Parameters.member")
+ tags = dict(
+ (item["key"], item["value"])
+ for item in self._get_list_prefix("Tags.member")
+ )
+
+ # Copy-Pasta - Hack dict-comprehension
+ parameters = dict(
+ [
+ (parameter["parameter_key"], parameter["parameter_value"])
+ for parameter in parameters_list
+ ]
+ )
+ if template_url:
+ stack_body = self._get_stack_from_s3_url(template_url)
+
+ stackset = self.cloudformation_backend.create_stack_set(
+ name=stackset_name, template=stack_body, parameters=parameters, tags=tags
+ )
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreateStackSetResponse": {
+ "CreateStackSetResult": {"StackSetId": stackset.id}
+ }
+ }
+ )
+ else:
+ template = self.response_template(CREATE_STACK_SET_RESPONSE_TEMPLATE)
+ return template.render(stackset=stackset)
+
+ def create_stack_instances(self):
+ stackset_name = self._get_param("StackSetName")
+ accounts = self._get_multi_param("Accounts.member")
+ regions = self._get_multi_param("Regions.member")
+ parameters = self._get_multi_param("ParameterOverrides.member")
+ self.cloudformation_backend.create_stack_instances(
+ stackset_name, accounts, regions, parameters
+ )
+ template = self.response_template(CREATE_STACK_INSTANCES_TEMPLATE)
+ return template.render()
+
+ def delete_stack_set(self):
+ stackset_name = self._get_param("StackSetName")
+ self.cloudformation_backend.delete_stack_set(stackset_name)
+ template = self.response_template(DELETE_STACK_SET_RESPONSE_TEMPLATE)
+ return template.render()
+
+ def delete_stack_instances(self):
+ stackset_name = self._get_param("StackSetName")
+ accounts = self._get_multi_param("Accounts.member")
+ regions = self._get_multi_param("Regions.member")
+ operation = self.cloudformation_backend.delete_stack_instances(
+ stackset_name, accounts, regions
+ )
+
+ template = self.response_template(DELETE_STACK_INSTANCES_TEMPLATE)
+ return template.render(operation=operation)
+
+ def describe_stack_set(self):
+ stackset_name = self._get_param("StackSetName")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+
+ if not stackset.admin_role:
+ stackset.admin_role = "arn:aws:iam::{AccountId}:role/AWSCloudFormationStackSetAdministrationRole".format(
+ AccountId=get_account_id()
+ )
+ if not stackset.execution_role:
+ stackset.execution_role = "AWSCloudFormationStackSetExecutionRole"
+
+ template = self.response_template(DESCRIBE_STACK_SET_RESPONSE_TEMPLATE)
+ return template.render(stackset=stackset)
+
+ def describe_stack_instance(self):
+ stackset_name = self._get_param("StackSetName")
+ account = self._get_param("StackInstanceAccount")
+ region = self._get_param("StackInstanceRegion")
+
+ instance = self.cloudformation_backend.get_stack_set(
+ stackset_name
+ ).instances.get_instance(account, region)
+ template = self.response_template(DESCRIBE_STACK_INSTANCE_TEMPLATE)
+ rendered = template.render(instance=instance)
+ return rendered
+
+ def list_stack_sets(self):
+ stacksets = self.cloudformation_backend.stacksets
+ template = self.response_template(LIST_STACK_SETS_TEMPLATE)
+ return template.render(stacksets=stacksets)
+
+ def list_stack_instances(self):
+ stackset_name = self._get_param("StackSetName")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+ template = self.response_template(LIST_STACK_INSTANCES_TEMPLATE)
+ return template.render(stackset=stackset)
+
+ def list_stack_set_operations(self):
+ stackset_name = self._get_param("StackSetName")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+ template = self.response_template(LIST_STACK_SET_OPERATIONS_RESPONSE_TEMPLATE)
+ return template.render(stackset=stackset)
+
+ def stop_stack_set_operation(self):
+ stackset_name = self._get_param("StackSetName")
+ operation_id = self._get_param("OperationId")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+ stackset.update_operation(operation_id, "STOPPED")
+ template = self.response_template(STOP_STACK_SET_OPERATION_RESPONSE_TEMPLATE)
+ return template.render()
+
+ def describe_stack_set_operation(self):
+ stackset_name = self._get_param("StackSetName")
+ operation_id = self._get_param("OperationId")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+ operation = stackset.get_operation(operation_id)
+ template = self.response_template(DESCRIBE_STACKSET_OPERATION_RESPONSE_TEMPLATE)
+ return template.render(stackset=stackset, operation=operation)
+
+ def list_stack_set_operation_results(self):
+ stackset_name = self._get_param("StackSetName")
+ operation_id = self._get_param("OperationId")
+ stackset = self.cloudformation_backend.get_stack_set(stackset_name)
+ operation = stackset.get_operation(operation_id)
+ template = self.response_template(
+ LIST_STACK_SET_OPERATION_RESULTS_RESPONSE_TEMPLATE
+ )
+ return template.render(operation=operation)
+
+ def update_stack_set(self):
+ stackset_name = self._get_param("StackSetName")
+ operation_id = self._get_param("OperationId")
+ description = self._get_param("Description")
+ execution_role = self._get_param("ExecutionRoleName")
+ admin_role = self._get_param("AdministrationRoleARN")
+ accounts = self._get_multi_param("Accounts.member")
+ regions = self._get_multi_param("Regions.member")
+ template_body = self._get_param("TemplateBody")
+ template_url = self._get_param("TemplateURL")
+ if template_url:
+ template_body = self._get_stack_from_s3_url(template_url)
+ tags = dict(
+ (item["key"], item["value"])
+ for item in self._get_list_prefix("Tags.member")
+ )
+ parameters_list = self._get_list_prefix("Parameters.member")
+
+ operation = self.cloudformation_backend.update_stack_set(
+ stackset_name=stackset_name,
+ template=template_body,
+ description=description,
+ parameters=parameters_list,
+ tags=tags,
+ admin_role=admin_role,
+ execution_role=execution_role,
+ accounts=accounts,
+ regions=regions,
+ operation_id=operation_id,
+ )
+
+ template = self.response_template(UPDATE_STACK_SET_RESPONSE_TEMPLATE)
+ return template.render(operation=operation)
+
+ def update_stack_instances(self):
+ stackset_name = self._get_param("StackSetName")
+ accounts = self._get_multi_param("Accounts.member")
+ regions = self._get_multi_param("Regions.member")
+ parameters = self._get_multi_param("ParameterOverrides.member")
+ operation = self.cloudformation_backend.get_stack_set(
+ stackset_name
+ ).update_instances(accounts, regions, parameters)
+ template = self.response_template(UPDATE_STACK_INSTANCES_RESPONSE_TEMPLATE)
+ return template.render(operation=operation)
+
+ def get_stack_policy(self):
+ stack_name = self._get_param("StackName")
+ policy = self.cloudformation_backend.get_stack_policy(stack_name)
+ template = self.response_template(GET_STACK_POLICY_RESPONSE)
+ return template.render(policy=policy)
+
+ def set_stack_policy(self):
+ stack_name = self._get_param("StackName")
+ policy_url = self._get_param("StackPolicyURL")
+ policy_body = self._get_param("StackPolicyBody")
+ if policy_body and policy_url:
+ raise ValidationError(
+ message="You cannot specify both StackPolicyURL and StackPolicyBody"
+ )
+ if policy_url:
+ try:
+ policy_body = self._get_stack_from_s3_url(policy_url)
+ except S3ClientError as s3_e:
+ raise ValidationError(
+ message=f"S3 error: Access Denied: {s3_e.error_type}"
+ )
+ self.cloudformation_backend.set_stack_policy(
+ stack_name, policy_body=policy_body
+ )
+ return SET_STACK_POLICY_RESPONSE
+
+
+VALIDATE_STACK_RESPONSE_TEMPLATE = """<ValidateTemplateResponse>
+ <ValidateTemplateResult>
+ <Capabilities></Capabilities>
+<CapabilitiesReason></CapabilitiesReason>
+<DeclaredTransforms></DeclaredTransforms>
+<Description>{{ description }}</Description>
+<Parameters></Parameters>
+</ValidateTemplateResult>
+</ValidateTemplateResponse>"""
+
+CREATE_STACK_RESPONSE_TEMPLATE = """<CreateStackResponse>
+ <CreateStackResult>
+ <StackId>{{ stack.stack_id }}</StackId>
+ </CreateStackResult>
+ <ResponseMetadata>
+ <RequestId>b9b4b068-3a41-11e5-94eb-example</RequestId>
+ </ResponseMetadata>
+</CreateStackResponse>
+"""
+
+CREATE_STACK_NAME_EXISTS_RESPONSE_TEMPLATE = """<ErrorResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>AlreadyExistsException</Code>
+ <Message>Stack [{{ name }}] already exists</Message>
+ </Error>
+ <RequestId>950ff8d7-812a-44b3-bb0c-9b271b954104</RequestId>
+</ErrorResponse>"""
+
+UPDATE_STACK_RESPONSE_TEMPLATE = """<UpdateStackResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <UpdateStackResult>
+ <StackId>{{ stack.stack_id }}</StackId>
+ </UpdateStackResult>
+ <ResponseMetadata>
+ <RequestId>b9b4b068-3a41-11e5-94eb-example</RequestId>
+ </ResponseMetadata>
+</UpdateStackResponse>
+"""
+
+CREATE_CHANGE_SET_RESPONSE_TEMPLATE = """<CreateStackResponse>
+ <CreateChangeSetResult>
+ <Id>{{change_set_id}}</Id>
+ <StackId>{{ stack_id }}</StackId>
+ </CreateChangeSetResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateStackResponse>
+"""
+
+DELETE_CHANGE_SET_RESPONSE_TEMPLATE = """<DeleteChangeSetResponse>
+ <DeleteChangeSetResult>
+ </DeleteChangeSetResult>
+ <ResponseMetadata>
+ <RequestId>3d3200a1-810e-3023-6cc3-example</RequestId>
+ </ResponseMetadata>
+</DeleteChangeSetResponse>
+"""
+
+DESCRIBE_CHANGE_SET_RESPONSE_TEMPLATE = """<DescribeChangeSetResponse>
+ <DescribeChangeSetResult>
+ <ChangeSetId>{{ change_set.change_set_id }}</ChangeSetId>
+ <ChangeSetName>{{ change_set.change_set_name }}</ChangeSetName>
+ <StackId>{{ change_set.stack_id }}</StackId>
+ <StackName>{{ change_set.stack_name }}</StackName>
+ <Description>{{ change_set.description }}</Description>
+ <Parameters>
+ {% for param_name, param_value in change_set.parameters.items() %}
+ <member>
+ <ParameterKey>{{ param_name }}</ParameterKey>
+ <ParameterValue>{{ param_value }}</ParameterValue>
+ </member>
+ {% endfor %}
+ </Parameters>
+ <CreationTime>{{ change_set.creation_time_iso_8601 }}</CreationTime>
+ <ExecutionStatus>{{ change_set.execution_status }}</ExecutionStatus>
+ <Status>{{ change_set.status }}</Status>
+ <StatusReason>{{ change_set.status_reason }}</StatusReason>
+ {% if change_set.notification_arns %}
+ <NotificationARNs>
+ {% for notification_arn in change_set.notification_arns %}
+ <member>{{ notification_arn }}</member>
+ {% endfor %}
+ </NotificationARNs>
+ {% else %}
+ <NotificationARNs/>
+ {% endif %}
+ {% if change_set.role_arn %}
+ <RoleARN>{{ change_set.role_arn }}</RoleARN>
+ {% endif %}
+ {% if change_set.changes %}
+ <Changes>
+ {% for change in change_set.changes %}
+ <member>
+ <Type>Resource</Type>
+ <ResourceChange>
+ <Action>{{ change.action }}</Action>
+ <LogicalResourceId>{{ change.logical_resource_id }}</LogicalResourceId>
+ <ResourceType>{{ change.resource_type }}</ResourceType>
+ </ResourceChange>
+ </member>
+ {% endfor %}
+ </Changes>
+ {% endif %}
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </DescribeChangeSetResult>
+</DescribeChangeSetResponse>"""
+
+EXECUTE_CHANGE_SET_RESPONSE_TEMPLATE = """<ExecuteChangeSetResponse>
+ <ExecuteChangeSetResult>
+ <ExecuteChangeSetResult/>
+ </ExecuteChangeSetResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ExecuteChangeSetResponse>
+"""
+
+DESCRIBE_STACKS_TEMPLATE = """<DescribeStacksResponse>
+ <DescribeStacksResult>
+ <Stacks>
+ {% for stack in stacks %}
+ <member>
+ <StackName>{{ stack.name }}</StackName>
+ <StackId>{{ stack.stack_id }}</StackId>
+ {% if stack.change_set_id %}
+ <ChangeSetId>{{ stack.change_set_id }}</ChangeSetId>
+ {% endif %}
+ <Description><![CDATA[{{ stack.description }}]]></Description>
+ <CreationTime>{{ stack.creation_time_iso_8601 }}</CreationTime>
+ <StackStatus>{{ stack.status }}</StackStatus>
+ {% if stack.notification_arns %}
+ <NotificationARNs>
+ {% for notification_arn in stack.notification_arns %}
+ <member>{{ notification_arn }}</member>
+ {% endfor %}
+ </NotificationARNs>
+ {% else %}
+ <NotificationARNs/>
+ {% endif %}
+ <DisableRollback>false</DisableRollback>
+ <Outputs>
+ {% for output in stack.stack_outputs %}
+ <member>
+ <OutputKey>{{ output.key }}</OutputKey>
+ <OutputValue>{{ output.value }}</OutputValue>
+ </member>
+ {% endfor %}
+ </Outputs>
+ <Parameters>
+ {% for param_name, param_value in stack.stack_parameters.items() %}
+ <member>
+ <ParameterKey>{{ param_name }}</ParameterKey>
+ {% if param_name in stack.resource_map.no_echo_parameter_keys %}
+ <ParameterValue>****</ParameterValue>
+ {% else %}
+ <ParameterValue>{{ param_value }}</ParameterValue>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Parameters>
+ {% if stack.role_arn %}
+ <RoleARN>{{ stack.role_arn }}</RoleARN>
+ {% endif %}
+ <Tags>
+ {% for tag_key, tag_value in stack.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </member>
+ {% endfor %}
+ </Stacks>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </DescribeStacksResult>
+</DescribeStacksResponse>"""
+
+DESCRIBE_STACK_RESOURCE_RESPONSE_TEMPLATE = """<DescribeStackResourceResponse>
+ <DescribeStackResourceResult>
+ <StackResourceDetail>
+ <StackId>{{ stack.stack_id }}</StackId>
+ <StackName>{{ stack.name }}</StackName>
+ <LogicalResourceId>{{ resource.logical_resource_id }}</LogicalResourceId>
+ <PhysicalResourceId>{{ resource.physical_resource_id }}</PhysicalResourceId>
+ <ResourceType>{{ resource.type }}</ResourceType>
+ <Timestamp>2010-07-27T22:27:28Z</Timestamp>
+ <ResourceStatus>{{ stack.status }}</ResourceStatus>
+ </StackResourceDetail>
+ </DescribeStackResourceResult>
+</DescribeStackResourceResponse>"""
+
+DESCRIBE_STACK_RESOURCES_RESPONSE = """<DescribeStackResourcesResponse>
+ <DescribeStackResourcesResult>
+ <StackResources>
+ {% for resource in stack.stack_resources %}
+ <member>
+ <StackId>{{ stack.stack_id }}</StackId>
+ <StackName>{{ stack.name }}</StackName>
+ <LogicalResourceId>{{ resource.logical_resource_id }}</LogicalResourceId>
+ <PhysicalResourceId>{{ resource.physical_resource_id }}</PhysicalResourceId>
+ <ResourceType>{{ resource.type }}</ResourceType>
+ <Timestamp>2010-07-27T22:27:28Z</Timestamp>
+ <ResourceStatus>{{ stack.status }}</ResourceStatus>
+ </member>
+ {% endfor %}
+ </StackResources>
+ </DescribeStackResourcesResult>
+</DescribeStackResourcesResponse>"""
+
+DESCRIBE_STACK_EVENTS_RESPONSE = """<DescribeStackEventsResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <DescribeStackEventsResult>
+ <StackEvents>
+ {% for event in stack.events[::-1] %}
+ <member>
+ <Timestamp>{{ event.timestamp.strftime('%Y-%m-%dT%H:%M:%S.%fZ') }}</Timestamp>
+ <ResourceStatus>{{ event.resource_status }}</ResourceStatus>
+ <StackId>{{ event.stack_id }}</StackId>
+ <EventId>{{ event.event_id }}</EventId>
+ <LogicalResourceId>{{ event.logical_resource_id }}</LogicalResourceId>
+ {% if event.resource_status_reason %}<ResourceStatusReason>{{ event.resource_status_reason }}</ResourceStatusReason>{% endif %}
+ <StackName>{{ event.stack_name }}</StackName>
+ <PhysicalResourceId>{{ event.physical_resource_id }}</PhysicalResourceId>
+ {% if event.resource_properties %}<ResourceProperties>{{ event.resource_properties }}</ResourceProperties>{% endif %}
+ <ResourceType>{{ event.resource_type }}</ResourceType>
+ </member>
+ {% endfor %}
+ </StackEvents>
+ </DescribeStackEventsResult>
+ <ResponseMetadata>
+ <RequestId>b9b4b068-3a41-11e5-94eb-example</RequestId>
+ </ResponseMetadata>
+</DescribeStackEventsResponse>"""
+
+LIST_CHANGE_SETS_RESPONSE = """<ListChangeSetsResponse>
+ <ListChangeSetsResult>
+ <Summaries>
+ {% for change_set in change_sets %}
+ <member>
+ <StackId>{{ change_set.stack_id }}</StackId>
+ <StackName>{{ change_set.stack_name }}</StackName>
+ <ChangeSetId>{{ change_set.change_set_id }}</ChangeSetId>
+ <ChangeSetName>{{ change_set.change_set_name }}</ChangeSetName>
+ <ExecutionStatus>{{ change_set.execution_status }}</ExecutionStatus>
+ <Status>{{ change_set.status }}</Status>
+ <StatusReason>{{ change_set.status_reason }}</StatusReason>
+ <CreationTime>2011-05-23T15:47:44Z</CreationTime>
+ <Description>{{ change_set.description }}</Description>
+ </member>
+ {% endfor %}
+ </Summaries>
+ </ListChangeSetsResult>
+</ListChangeSetsResponse>"""
+
+LIST_STACKS_RESPONSE = """<ListStacksResponse>
+ <ListStacksResult>
+ <StackSummaries>
+ {% for stack in stacks %}
+ <member>
+ <StackId>{{ stack.stack_id }}</StackId>
+ <StackStatus>{{ stack.status }}</StackStatus>
+ <StackName>{{ stack.name }}</StackName>
+ <CreationTime>{{ stack.creation_time_iso_8601 }}</CreationTime>
+ <TemplateDescription>{{ stack.description }}</TemplateDescription>
+ </member>
+ {% endfor %}
+ </StackSummaries>
+ </ListStacksResult>
+</ListStacksResponse>"""
+
+LIST_STACKS_RESOURCES_RESPONSE = """<ListStackResourcesResponse>
+ <ListStackResourcesResult>
+ <StackResourceSummaries>
+ {% for resource in resources %}
+ <member>
+ <ResourceStatus>CREATE_COMPLETE</ResourceStatus>
+ <LogicalResourceId>{{ resource.logical_resource_id }}</LogicalResourceId>
+ <LastUpdatedTimestamp>2011-06-21T20:15:58Z</LastUpdatedTimestamp>
+ <PhysicalResourceId>{{ resource.physical_resource_id }}</PhysicalResourceId>
+ <ResourceType>{{ resource.type }}</ResourceType>
+ </member>
+ {% endfor %}
+ </StackResourceSummaries>
+ </ListStackResourcesResult>
+ <ResponseMetadata>
+ <RequestId>2d06e36c-ac1d-11e0-a958-f9382b6eb86b</RequestId>
+ </ResponseMetadata>
+</ListStackResourcesResponse>"""
+
+GET_TEMPLATE_RESPONSE_TEMPLATE = """<GetTemplateResponse>
+ <GetTemplateResult>
+ <TemplateBody>{{ stack.template }}</TemplateBody>
+ </GetTemplateResult>
+ <ResponseMetadata>
+ <RequestId>b9b4b068-3a41-11e5-94eb-example</RequestId>
+ </ResponseMetadata>
+</GetTemplateResponse>"""
+
+DELETE_STACK_RESPONSE_TEMPLATE = """<DeleteStackResponse>
+ <ResponseMetadata>
+ <RequestId>5ccc7dcd-744c-11e5-be70-example</RequestId>
+ </ResponseMetadata>
+</DeleteStackResponse>
+"""
+
+LIST_EXPORTS_RESPONSE = """<ListExportsResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <ListExportsResult>
+ <Exports>
+ {% for export in exports %}
+ <member>
+ <ExportingStackId>{{ export.exporting_stack_id }}</ExportingStackId>
+ <Name>{{ export.name }}</Name>
+ <Value>{{ export.value }}</Value>
+ </member>
+ {% endfor %}
+ </Exports>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </ListExportsResult>
+ <ResponseMetadata>
+ <RequestId>5ccc7dcd-744c-11e5-be70-example</RequestId>
+ </ResponseMetadata>
+</ListExportsResponse>"""
+
+CREATE_STACK_SET_RESPONSE_TEMPLATE = """<CreateStackSetResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <CreateStackSetResult>
+ <StackSetId>{{ stackset.id }}</StackSetId>
+ </CreateStackSetResult>
+ <ResponseMetadata>
+ <RequestId>f457258c-391d-41d1-861f-example</RequestId>
+ </ResponseMetadata>
+</CreateStackSetResponse>
+"""
+
+DESCRIBE_STACK_SET_RESPONSE_TEMPLATE = """<DescribeStackSetResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <DescribeStackSetResult>
+ <StackSet>
+ <Capabilities/>
+ <StackSetARN>{{ stackset.arn }}</StackSetARN>
+ <ExecutionRoleName>{{ stackset.execution_role }}</ExecutionRoleName>
+ <AdministrationRoleARN>{{ stackset.admin_role }}</AdministrationRoleARN>
+ <StackSetId>{{ stackset.id }}</StackSetId>
+ <TemplateBody>{{ stackset.template }}</TemplateBody>
+ <StackSetName>{{ stackset.name }}</StackSetName>
+ <Parameters>
+ {% for param_name, param_value in stackset.parameters.items() %}
+ <member>
+ <ParameterKey>{{ param_name }}</ParameterKey>
+ <ParameterValue>{{ param_value }}</ParameterValue>
+ </member>
+ {% endfor %}
+ </Parameters>
+ <Tags>
+ {% for tag_key, tag_value in stackset.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ <Status>{{ stackset.status }}</Status>
+ </StackSet>
+ </DescribeStackSetResult>
+ <ResponseMetadata>
+ <RequestId>d8b64e11-5332-46e1-9603-example</RequestId>
+ </ResponseMetadata>
+</DescribeStackSetResponse>"""
+
+DELETE_STACK_SET_RESPONSE_TEMPLATE = """<DeleteStackSetResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <DeleteStackSetResult/>
+ <ResponseMetadata>
+ <RequestId>c35ec2d0-d69f-4c4d-9bd7-example</RequestId>
+ </ResponseMetadata>
+</DeleteStackSetResponse>"""
+
+CREATE_STACK_INSTANCES_TEMPLATE = """<CreateStackInstancesResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <CreateStackInstancesResult>
+ <OperationId>1459ad6d-63cc-4c96-a73e-example</OperationId>
+ </CreateStackInstancesResult>
+ <ResponseMetadata>
+ <RequestId>6b29f7e3-69be-4d32-b374-example</RequestId>
+ </ResponseMetadata>
+</CreateStackInstancesResponse>
+"""
+
+LIST_STACK_INSTANCES_TEMPLATE = """<ListStackInstancesResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <ListStackInstancesResult>
+ <Summaries>
+ {% for instance in stackset.stack_instances %}
+ <member>
+ <StackId>{{ instance.StackId }}</StackId>
+ <StackSetId>{{ instance.StackSetId }}</StackSetId>
+ <Region>{{ instance.Region }}</Region>
+ <Account>{{ instance.Account }}</Account>
+ <Status>{{ instance.Status }}</Status>
+ </member>
+ {% endfor %}
+ </Summaries>
+ </ListStackInstancesResult>
+ <ResponseMetadata>
+ <RequestId>83c27e73-b498-410f-993c-example</RequestId>
+ </ResponseMetadata>
+</ListStackInstancesResponse>
+"""
+
+DELETE_STACK_INSTANCES_TEMPLATE = """<DeleteStackInstancesResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <DeleteStackInstancesResult>
+ <OperationId>{{ operation.OperationId }}</OperationId>
+ </DeleteStackInstancesResult>
+ <ResponseMetadata>
+ <RequestId>e5325090-66f6-4ecd-a531-example</RequestId>
+ </ResponseMetadata>
+</DeleteStackInstancesResponse>
+"""
+
+DESCRIBE_STACK_INSTANCE_TEMPLATE = """<DescribeStackInstanceResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <DescribeStackInstanceResult>
+ <StackInstance>
+ <StackId>{{ instance.StackId }}</StackId>
+ <StackSetId>{{ instance.StackSetId }}</StackSetId>
+ {% if instance.ParameterOverrides %}
+ <ParameterOverrides>
+ {% for override in instance.ParameterOverrides %}
+ {% if override['ParameterKey'] or override['ParameterValue'] %}
+ <member>
+ <ParameterKey>{{ override.ParameterKey }}</ParameterKey>
+ <UsePreviousValue>false</UsePreviousValue>
+ <ParameterValue>{{ override.ParameterValue }}</ParameterValue>
+ </member>
+ {% endif %}
+ {% endfor %}
+ </ParameterOverrides>
+ {% else %}
+ <ParameterOverrides/>
+ {% endif %}
+ <Region>{{ instance.Region }}</Region>
+ <Account>{{ instance.Account }}</Account>
+ <Status>{{ instance.Status }}</Status>
+ </StackInstance>
+ </DescribeStackInstanceResult>
+ <ResponseMetadata>
+ <RequestId>c6c7be10-0343-4319-8a25-example</RequestId>
+ </ResponseMetadata>
+</DescribeStackInstanceResponse>
+"""
+
+LIST_STACK_SETS_TEMPLATE = """<ListStackSetsResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <ListStackSetsResult>
+ <Summaries>
+ {% for key, value in stacksets.items() %}
+ <member>
+ <StackSetName>{{ value.name }}</StackSetName>
+ <StackSetId>{{ value.id }}</StackSetId>
+ <Status>{{ value.status }}</Status>
+ </member>
+ {% endfor %}
+ </Summaries>
+ </ListStackSetsResult>
+ <ResponseMetadata>
+ <RequestId>4dcacb73-841e-4ed8-b335-example</RequestId>
+ </ResponseMetadata>
+</ListStackSetsResponse>
+"""
+
+UPDATE_STACK_INSTANCES_RESPONSE_TEMPLATE = """<UpdateStackInstancesResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <UpdateStackInstancesResult>
+ <OperationId>{{ operation }}</OperationId>
+ </UpdateStackInstancesResult>
+ <ResponseMetadata>
+ <RequestId>bdbf8e94-19b6-4ce4-af85-example</RequestId>
+ </ResponseMetadata>
+</UpdateStackInstancesResponse>
+"""
+
+UPDATE_STACK_SET_RESPONSE_TEMPLATE = """<UpdateStackSetResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <UpdateStackSetResult>
+ <OperationId>{{ operation.OperationId }}</OperationId>
+ </UpdateStackSetResult>
+ <ResponseMetadata>
+ <RequestId>adac907b-17e3-43e6-a254-example</RequestId>
+ </ResponseMetadata>
+</UpdateStackSetResponse>
+"""
+
+LIST_STACK_SET_OPERATIONS_RESPONSE_TEMPLATE = """<ListStackSetOperationsResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <ListStackSetOperationsResult>
+ <Summaries>
+ {% for operation in stackset.operations %}
+ <member>
+ <CreationTimestamp>{{ operation.CreationTimestamp }}</CreationTimestamp>
+ <OperationId>{{ operation.OperationId }}</OperationId>
+ <Action>{{ operation.Action }}</Action>
+ <EndTimestamp>{{ operation.EndTimestamp }}</EndTimestamp>
+ <Status>{{ operation.Status }}</Status>
+ </member>
+ {% endfor %}
+ </Summaries>
+ </ListStackSetOperationsResult>
+ <ResponseMetadata>
+ <RequestId>65b9d9be-08bb-4a43-9a21-example</RequestId>
+ </ResponseMetadata>
+</ListStackSetOperationsResponse>
+"""
+
+STOP_STACK_SET_OPERATION_RESPONSE_TEMPLATE = """<StopStackSetOperationResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <StopStackSetOperationResult/>
+ <ResponseMetadata>
+ <RequestId>2188554a-07c6-4396-b2c5-example</RequestId>
+ </ResponseMetadata>
+</StopStackSetOperationResponse>
+"""
+
+DESCRIBE_STACKSET_OPERATION_RESPONSE_TEMPLATE = (
+ """<DescribeStackSetOperationResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <DescribeStackSetOperationResult>
+ <StackSetOperation>
+ <ExecutionRoleName>{{ stackset.execution_role }}</ExecutionRoleName>
+ <AdministrationRoleARN>arn:aws:iam::"""
+ + get_account_id()
+ + """:role/{{ stackset.admin_role }}</AdministrationRoleARN>
+ <StackSetId>{{ stackset.id }}</StackSetId>
+ <CreationTimestamp>{{ operation.CreationTimestamp }}</CreationTimestamp>
+ <OperationId>{{ operation.OperationId }}</OperationId>
+ <Action>{{ operation.Action }}</Action>
+ <OperationPreferences>
+ <RegionOrder/>
+ </OperationPreferences>
+ <EndTimestamp>{{ operation.EndTimestamp }}</EndTimestamp>
+ <Status>{{ operation.Status }}</Status>
+ </StackSetOperation>
+ </DescribeStackSetOperationResult>
+ <ResponseMetadata>
+ <RequestId>2edc27b6-9ce2-486a-a192-example</RequestId>
+ </ResponseMetadata>
+</DescribeStackSetOperationResponse>
+"""
+)
+
+LIST_STACK_SET_OPERATION_RESULTS_RESPONSE_TEMPLATE = (
+ """<ListStackSetOperationResultsResponse xmlns="http://internal.amazon.com/coral/com.amazonaws.maestro.service.v20160713/">
+ <ListStackSetOperationResultsResult>
+ <Summaries>
+ {% for instance in operation.Instances %}
+ {% for account, region in instance.items() %}
+ <member>
+ <AccountGateResult>
+ <StatusReason>Function not found: arn:aws:lambda:us-west-2:"""
+ + get_account_id()
+ + """:function:AWSCloudFormationStackSetAccountGate</StatusReason>
+ <Status>SKIPPED</Status>
+ </AccountGateResult>
+ <Region>{{ region }}</Region>
+ <Account>{{ account }}</Account>
+ <Status>{{ operation.Status }}</Status>
+ </member>
+ {% endfor %}
+ {% endfor %}
+ </Summaries>
+ </ListStackSetOperationResultsResult>
+ <ResponseMetadata>
+ <RequestId>ac05a9ce-5f98-4197-a29b-example</RequestId>
+ </ResponseMetadata>
+</ListStackSetOperationResultsResponse>
+"""
+)
+
+# https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_GetTemplateSummary.html
+# TODO:implement fields: ResourceIdentifierSummaries, Capabilities, CapabilitiesReason
+GET_TEMPLATE_SUMMARY_TEMPLATE = """<GetTemplateSummaryResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <GetTemplateSummaryResult>
+ <Description>{{ template_summary.Description }}</Description>
+ {% for resource in template_summary.resourceTypes %}
+ <ResourceTypes>
+ <member>{{ resource }}</member>
+ </ResourceTypes>
+ {% endfor %}
+ <Parameters>
+ {% for k,p in template_summary.get('Parameters',{}).items() %}
+ <member>
+ <ParameterKey>{{ k }}</ParameterKey> ,
+ <Description>{{ p.get('Description', '') }}</Description>,
+ {% if p.Default %}
+ <DefaultValue>{{ p.Default }}</DefaultValue>
+ {% endif %}
+ <NoEcho>{{ p.get('NoEcho', False) }}</NoEcho>
+ <ParameterType>{{ p.get('Type', 'String') }}</ParameterType>
+ <ParameterConstraints>
+ {% if p.AllowedValues %}
+ <AllowedValues>
+ {% for v in p.AllowedValues %}
+ <member>{{ v }}</member>
+ {% endfor %}
+ </AllowedValues>
+ {% endif %}
+ </ParameterConstraints>
+ </member>
+ {% endfor %}
+ </Parameters>
+ <Version>{{ template_summary.AWSTemplateFormatVersion }}</Version>
+ </GetTemplateSummaryResult>
+ <ResponseMetadata>
+ <RequestId>b9b4b068-3a41-11e5-94eb-example</RequestId>
+ </ResponseMetadata>
+</GetTemplateSummaryResponse>
+"""
+
+SET_STACK_POLICY_RESPONSE = """<SetStackPolicyResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <ResponseMetadata>
+ <RequestId>abe48993-e23f-4167-b703-5b0f1b6aa84f</RequestId>
+ </ResponseMetadata>
+</SetStackPolicyResponse>"""
+
+
+GET_STACK_POLICY_RESPONSE = """<GetStackPolicyResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
+ <GetStackPolicyResult>
+ {% if policy %}
+ <StackPolicyBody>{{ policy }}</StackPolicyBody>
+ {% endif %}
+ </GetStackPolicyResult>
+ <ResponseMetadata>
+ <RequestId>e9e39eb6-1c05-4f0e-958a-b63f420e0a07</RequestId>
+ </ResponseMetadata>
+</GetStackPolicyResponse>"""
diff --git a/contrib/python/moto/py3/moto/cloudformation/urls.py b/contrib/python/moto/py3/moto/cloudformation/urls.py
new file mode 100644
index 0000000000..ca2f0d7d06
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/urls.py
@@ -0,0 +1,8 @@
+from .responses import CloudFormationResponse
+
+url_bases = [r"https?://cloudformation\.(.+)\.amazonaws\.com"]
+
+url_paths = {
+ "{0}/$": CloudFormationResponse.dispatch,
+ "{0}/cloudformation_(?P<region>[^/]+)/cfnresponse$": CloudFormationResponse.cfnresponse,
+}
diff --git a/contrib/python/moto/py3/moto/cloudformation/utils.py b/contrib/python/moto/py3/moto/cloudformation/utils.py
new file mode 100644
index 0000000000..024cd78b0f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudformation/utils.py
@@ -0,0 +1,92 @@
+import uuid
+import random
+import yaml
+import os
+import string
+
+from moto.core import get_account_id
+
+
+def generate_stack_id(stack_name, region="us-east-1", account=get_account_id()):
+ random_id = uuid.uuid4()
+ return "arn:aws:cloudformation:{}:{}:stack/{}/{}".format(
+ region, account, stack_name, random_id
+ )
+
+
+def generate_changeset_id(changeset_name, region_name):
+ random_id = uuid.uuid4()
+ return "arn:aws:cloudformation:{0}:{1}:changeSet/{2}/{3}".format(
+ region_name, get_account_id(), changeset_name, random_id
+ )
+
+
+def generate_stackset_id(stackset_name):
+ random_id = uuid.uuid4()
+ return "{}:{}".format(stackset_name, random_id)
+
+
+def generate_stackset_arn(stackset_id, region_name):
+ return "arn:aws:cloudformation:{}:{}:stackset/{}".format(
+ region_name, get_account_id(), stackset_id
+ )
+
+
+def random_suffix():
+ size = 12
+ chars = list(range(10)) + list(string.ascii_uppercase)
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def yaml_tag_constructor(loader, tag, node):
+ """convert shorthand intrinsic function to full name"""
+
+ def _f(loader, tag, node):
+ if tag == "!GetAtt":
+ if isinstance(node.value, list):
+ return node.value
+ return node.value.split(".")
+ elif type(node) == yaml.SequenceNode:
+ return loader.construct_sequence(node)
+ else:
+ return node.value
+
+ if tag == "!Ref":
+ key = "Ref"
+ else:
+ key = "Fn::{}".format(tag[1:])
+
+ return {key: _f(loader, tag, node)}
+
+
+def validate_template_cfn_lint(template):
+ # Importing cfnlint adds a significant overhead, so we keep it local
+ from cfnlint import decode, core
+
+ # Save the template to a temporary file -- cfn-lint requires a file
+ filename = "file.tmp"
+ with open(filename, "w") as file:
+ file.write(template)
+ abs_filename = os.path.abspath(filename)
+
+ # decode handles both yaml and json
+ try:
+ template, matches = decode.decode(abs_filename, False)
+ except TypeError:
+ # As of cfn-lint 0.39.0, the second argument (ignore_bad_template) was dropped
+ # https://github.com/aws-cloudformation/cfn-python-lint/pull/1580
+ template, matches = decode.decode(abs_filename)
+
+ # Set cfn-lint to info
+ core.configure_logging(None)
+
+ # Initialize the ruleset to be applied (no overrules, no excludes)
+ rules = core.get_rules([], [], [])
+
+ # Use us-east-1 region (spec file) for validation
+ regions = ["us-east-1"]
+
+ # Process all the rules and gather the errors
+ matches = core.run_checks(abs_filename, template, rules, regions)
+
+ return matches
diff --git a/contrib/python/moto/py3/moto/cloudfront/__init__.py b/contrib/python/moto/py3/moto/cloudfront/__init__.py
new file mode 100644
index 0000000000..b4c86b029b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudfront/__init__.py
@@ -0,0 +1,4 @@
+from .models import cloudfront_backends
+from ..core.models import base_decorator
+
+mock_cloudfront = base_decorator(cloudfront_backends)
diff --git a/contrib/python/moto/py3/moto/cloudfront/exceptions.py b/contrib/python/moto/py3/moto/cloudfront/exceptions.py
new file mode 100644
index 0000000000..2f4dc203d8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudfront/exceptions.py
@@ -0,0 +1,81 @@
+from moto.core.exceptions import RESTError
+
+EXCEPTION_RESPONSE = """<?xml version="1.0"?>
+<ErrorResponse xmlns="http://cloudfront.amazonaws.com/doc/2020-05-31/">
+ <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 CloudFrontException(RESTError):
+
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "cferror")
+ self.templates["cferror"] = EXCEPTION_RESPONSE
+ super().__init__(*args, **kwargs)
+
+
+class OriginDoesNotExist(CloudFrontException):
+
+ code = 404
+
+ def __init__(self, **kwargs):
+ super().__init__(
+ "NoSuchOrigin",
+ message="One or more of your origins or origin groups do not exist.",
+ **kwargs,
+ )
+
+
+class InvalidOriginServer(CloudFrontException):
+ def __init__(self, **kwargs):
+ super().__init__(
+ "InvalidOrigin",
+ message="The specified origin server does not exist or is not valid.",
+ **kwargs,
+ )
+
+
+class DomainNameNotAnS3Bucket(CloudFrontException):
+ def __init__(self, **kwargs):
+ super().__init__(
+ "InvalidArgument",
+ message="The parameter Origin DomainName does not refer to a valid S3 bucket.",
+ **kwargs,
+ )
+
+
+class DistributionAlreadyExists(CloudFrontException):
+ def __init__(self, dist_id, **kwargs):
+ super().__init__(
+ "DistributionAlreadyExists",
+ message=f"The caller reference that you are using to create a distribution is associated with another distribution. Already exists: {dist_id}",
+ **kwargs,
+ )
+
+
+class InvalidIfMatchVersion(CloudFrontException):
+ def __init__(self, **kwargs):
+ super().__init__(
+ "InvalidIfMatchVersion",
+ message="The If-Match version is missing or not valid for the resource.",
+ **kwargs,
+ )
+
+
+class NoSuchDistribution(CloudFrontException):
+
+ code = 404
+
+ def __init__(self, **kwargs):
+ super().__init__(
+ "NoSuchDistribution",
+ message="The specified distribution does not exist.",
+ **kwargs,
+ )
diff --git a/contrib/python/moto/py3/moto/cloudfront/models.py b/contrib/python/moto/py3/moto/cloudfront/models.py
new file mode 100644
index 0000000000..2d3dbf00eb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudfront/models.py
@@ -0,0 +1,258 @@
+import random
+import string
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.moto_api import state_manager
+from moto.moto_api._internal.managed_state_model import ManagedState
+from uuid import uuid4
+
+from .exceptions import (
+ OriginDoesNotExist,
+ InvalidOriginServer,
+ DomainNameNotAnS3Bucket,
+ DistributionAlreadyExists,
+ InvalidIfMatchVersion,
+ NoSuchDistribution,
+)
+
+
+class ActiveTrustedSigners:
+ def __init__(self):
+ self.enabled = False
+ self.quantity = 0
+ self.signers = []
+
+
+class ActiveTrustedKeyGroups:
+ def __init__(self):
+ self.enabled = False
+ self.quantity = 0
+ self.kg_key_pair_ids = []
+
+
+class LambdaFunctionAssociation:
+ def __init__(self):
+ self.arn = ""
+ self.event_type = ""
+ self.include_body = False
+
+
+class ForwardedValues:
+ def __init__(self):
+ self.query_string = ""
+ self.whitelisted_names = []
+ self.headers = []
+ self.query_string_cache_keys = []
+
+
+class DefaultCacheBehaviour:
+ def __init__(self, config):
+ self.target_origin_id = config["TargetOriginId"]
+ self.trusted_signers_enabled = False
+ self.trusted_signers = []
+ self.trusted_key_groups_enabled = False
+ self.trusted_key_groups = []
+ self.viewer_protocol_policy = config["ViewerProtocolPolicy"]
+ self.allowed_methods = ["HEAD", "GET"]
+ self.cached_methods = ["GET", "HEAD"]
+ self.smooth_streaming = True
+ self.compress = True
+ self.lambda_function_associations = []
+ self.function_associations = []
+ self.field_level_encryption_id = ""
+ self.forwarded_values = ForwardedValues()
+ self.min_ttl = 0
+ self.default_ttl = 0
+ self.max_ttl = 0
+
+
+class Logging:
+ def __init__(self):
+ self.enabled = False
+
+
+class ViewerCertificate:
+ def __init__(self):
+ self.cloud_front_default_certificate = True
+ self.min_protocol_version = "TLSv1"
+ self.certificate_source = "cloudfront"
+
+
+class Origin:
+ def __init__(self, origin):
+ self.id = origin["Id"]
+ self.domain_name = origin["DomainName"]
+ self.custom_headers = []
+ self.s3_access_identity = ""
+ self.custom_origin = None
+ self.origin_shield = None
+ self.connection_attempts = 3
+ self.connection_timeout = 10
+
+ if "S3OriginConfig" not in origin and "CustomOriginConfig" not in origin:
+ raise InvalidOriginServer
+
+ if "S3OriginConfig" in origin:
+ # Very rough validation
+ if not self.domain_name.endswith("amazonaws.com"):
+ raise DomainNameNotAnS3Bucket
+ self.s3_access_identity = origin["S3OriginConfig"]["OriginAccessIdentity"]
+
+
+class DistributionConfig:
+ def __init__(self, config):
+ self.config = config
+ self.aliases = config.get("Aliases", {}).get("Items", {}).get("CNAME", [])
+ self.comment = config.get("Comment", "")
+ self.default_cache_behavior = DefaultCacheBehaviour(
+ config["DefaultCacheBehavior"]
+ )
+ self.cache_behaviors = []
+ self.custom_error_responses = []
+ self.logging = Logging()
+ self.enabled = False
+ self.viewer_certificate = ViewerCertificate()
+ self.geo_restriction_type = "none"
+ self.geo_restrictions = []
+ self.caller_reference = config.get("CallerReference", str(uuid4()))
+ self.origins = config["Origins"]["Items"]["Origin"]
+ if not isinstance(self.origins, list):
+ self.origins = [self.origins]
+
+ # This check happens before any other Origins-validation
+ if self.default_cache_behavior.target_origin_id not in [
+ o["Id"] for o in self.origins
+ ]:
+ raise OriginDoesNotExist
+
+ self.origins = [Origin(o) for o in self.origins]
+ self.price_class = "PriceClass_All"
+ self.http_version = "http2"
+ self.is_ipv6_enabled = True
+
+
+class Distribution(BaseModel, ManagedState):
+ @staticmethod
+ def random_id(uppercase=True):
+ ascii_set = string.ascii_uppercase if uppercase else string.ascii_lowercase
+ chars = list(range(10)) + list(ascii_set)
+ resource_id = random.choice(ascii_set) + "".join(
+ str(random.choice(chars)) for _ in range(12)
+ )
+ return resource_id
+
+ def __init__(self, config):
+ # Configured ManagedState
+ super().__init__(
+ "cloudfront::distribution", transitions=[("InProgress", "Deployed")]
+ )
+ # Configure internal properties
+ self.distribution_id = Distribution.random_id()
+ self.arn = (
+ f"arn:aws:cloudfront:{get_account_id()}:distribution/{self.distribution_id}"
+ )
+ self.distribution_config = DistributionConfig(config)
+ self.active_trusted_signers = ActiveTrustedSigners()
+ self.active_trusted_key_groups = ActiveTrustedKeyGroups()
+ self.origin_groups = []
+ self.alias_icp_recordals = []
+ self.last_modified_time = "2021-11-27T10:34:26.802Z"
+ self.in_progress_invalidation_batches = 0
+ self.has_active_trusted_key_groups = False
+ self.domain_name = f"{Distribution.random_id(uppercase=False)}.cloudfront.net"
+
+ @property
+ def location(self):
+ return f"https://cloudfront.amazonaws.com/2020-05-31/distribution/{self.distribution_id}"
+
+ @property
+ def etag(self):
+ return Distribution.random_id()
+
+
+class CloudFrontBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.distributions = dict()
+
+ state_manager.register_default_transition(
+ "cloudfront::distribution", transition={"progression": "manual", "times": 1}
+ )
+
+ def create_distribution(self, distribution_config):
+ """
+ This has been tested against an S3-distribution with the
+ simplest possible configuration. Please raise an issue if
+ we're not persisting/returning the correct attributes for your
+ use-case.
+ """
+ dist = Distribution(distribution_config)
+ caller_reference = dist.distribution_config.caller_reference
+ existing_dist = self._distribution_with_caller_reference(caller_reference)
+ if existing_dist:
+ raise DistributionAlreadyExists(existing_dist.distribution_id)
+ self.distributions[dist.distribution_id] = dist
+ return dist, dist.location, dist.etag
+
+ def get_distribution(self, distribution_id):
+ if distribution_id not in self.distributions:
+ raise NoSuchDistribution
+ dist = self.distributions[distribution_id]
+ dist.advance()
+ return dist, dist.etag
+
+ def delete_distribution(self, distribution_id, if_match):
+ """
+ The IfMatch-value is ignored - any value is considered valid.
+ Calling this function without a value is invalid, per AWS' behaviour
+ """
+ if not if_match:
+ raise InvalidIfMatchVersion
+ if distribution_id not in self.distributions:
+ raise NoSuchDistribution
+ del self.distributions[distribution_id]
+
+ def list_distributions(self):
+ """
+ Pagination is not supported yet.
+ """
+ for dist in self.distributions.values():
+ dist.advance()
+ return self.distributions.values()
+
+ def _distribution_with_caller_reference(self, reference):
+ for dist in self.distributions.values():
+ config = dist.distribution_config
+ if config.caller_reference == reference:
+ return dist
+ return False
+
+ def update_distribution(self, DistributionConfig, Id, IfMatch):
+ """
+ The IfMatch-value is ignored - any value is considered valid.
+ Calling this function without a value is invalid, per AWS' behaviour
+ """
+ if Id not in self.distributions or Id is None:
+ raise NoSuchDistribution
+ if not IfMatch:
+ raise InvalidIfMatchVersion
+ if not DistributionConfig:
+ raise NoSuchDistribution
+ dist = self.distributions[Id]
+
+ aliases = DistributionConfig["Aliases"]["Items"]["CNAME"]
+ dist.distribution_config.config = DistributionConfig
+ dist.distribution_config.aliases = aliases
+ self.distributions[Id] = dist
+ dist.advance()
+ return dist, dist.location, dist.etag
+
+
+cloudfront_backends = BackendDict(
+ CloudFrontBackend,
+ "cloudfront",
+ use_boto3_regions=False,
+ additional_regions=["global"],
+)
+cloudfront_backend = cloudfront_backends["global"]
diff --git a/contrib/python/moto/py3/moto/cloudfront/responses.py b/contrib/python/moto/py3/moto/cloudfront/responses.py
new file mode 100644
index 0000000000..4888e00ad0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudfront/responses.py
@@ -0,0 +1,526 @@
+import xmltodict
+
+from moto.core.responses import BaseResponse
+from .models import cloudfront_backend
+
+
+XMLNS = "http://cloudfront.amazonaws.com/doc/2020-05-31/"
+
+
+class CloudFrontResponse(BaseResponse):
+ def _get_xml_body(self):
+ return xmltodict.parse(self.body, dict_constructor=dict)
+
+ def distributions(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_distribution()
+ if request.method == "GET":
+ return self.list_distributions()
+
+ def create_distribution(self):
+ params = self._get_xml_body()
+ distribution_config = params.get("DistributionConfig")
+ distribution, location, e_tag = cloudfront_backend.create_distribution(
+ distribution_config=distribution_config
+ )
+ template = self.response_template(CREATE_DISTRIBUTION_TEMPLATE)
+ response = template.render(distribution=distribution, xmlns=XMLNS)
+ headers = {"ETag": e_tag, "Location": location}
+ return 200, headers, response
+
+ def list_distributions(self):
+ distributions = cloudfront_backend.list_distributions()
+ template = self.response_template(LIST_TEMPLATE)
+ response = template.render(distributions=distributions)
+ return 200, {}, response
+
+ def individual_distribution(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ distribution_id = full_url.split("/")[-1]
+ if request.method == "DELETE":
+ if_match = self._get_param("If-Match")
+ cloudfront_backend.delete_distribution(distribution_id, if_match)
+ return 204, {}, ""
+ if request.method == "GET":
+ dist, etag = cloudfront_backend.get_distribution(distribution_id)
+ template = self.response_template(GET_DISTRIBUTION_TEMPLATE)
+ response = template.render(distribution=dist, xmlns=XMLNS)
+ return 200, {"ETag": etag}, response
+
+ def update_distribution(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ params = self._get_xml_body()
+ distribution_config = params.get("DistributionConfig")
+ dist_id = full_url.split("/")[-2]
+ if_match = headers["If-Match"]
+
+ dist, location, e_tag = cloudfront_backend.update_distribution(
+ DistributionConfig=distribution_config,
+ Id=dist_id,
+ IfMatch=if_match,
+ )
+ template = self.response_template(UPDATE_DISTRIBUTION_TEMPLATE)
+ response = template.render(distribution=dist, xmlns=XMLNS)
+ headers = {"ETag": e_tag, "Location": location}
+ return 200, headers, response
+
+
+DIST_META_TEMPLATE = """
+ <Id>{{ distribution.distribution_id }}</Id>
+ <ARN>{{ distribution.arn }}</ARN>
+ <Status>{{ distribution.status }}</Status>
+ <LastModifiedTime>{{ distribution.last_modified_time }}</LastModifiedTime>
+ <InProgressInvalidationBatches>{{ distribution.in_progress_invalidation_batches }}</InProgressInvalidationBatches>
+ <DomainName>{{ distribution.domain_name }}</DomainName>
+"""
+
+
+DIST_CONFIG_TEMPLATE = """
+ <CallerReference>{{ distribution.distribution_config.caller_reference }}</CallerReference>
+ <Aliases>
+ <Quantity>{{ distribution.distribution_config.aliases|length }}</Quantity>
+ <Items>
+ {% for alias in distribution.distribution_config.aliases %}
+ <CNAME>{{ alias }}</CNAME>
+ {% endfor %}
+ </Items>
+ </Aliases>
+ <DefaultRootObject>{{ distribution.distribution_config.default_distribution_object }}</DefaultRootObject>
+ <Origins>
+ <Quantity>{{ distribution.distribution_config.origins|length }}</Quantity>
+ <Items>
+ {% for origin in distribution.distribution_config.origins %}
+ <Origin>
+ <Id>{{ origin.id }}</Id>
+ <DomainName>{{ origin.domain_name }}</DomainName>
+ <OriginPath>{{ origin.origin_path }}</OriginPath>
+ <CustomHeaders>
+ <Quantity>{{ origin.custom_headers|length }}</Quantity>
+ <Items>
+ {% for header in origin.custom_headers %}
+ <HeaderName>{{ header.header_name }}</HeaderName>
+ <HeaderValue>{{ header.header_value }}</HeaderValue>
+ {% endfor %}
+ </Items>
+ </CustomHeaders>
+ <S3OriginConfig>
+ <OriginAccessIdentity>{{ origin.s3_access_identity }}</OriginAccessIdentity>
+ </S3OriginConfig>
+ {% if origin.custom_origin %}
+ <CustomOriginConfig>
+ <HTTPPort>{{ origin.custom_origin.http_port }}</HTTPPort>
+ <HTTPSPort>{{ origin.custom_origin.https_port }}</HTTPSPort>
+ <OriginProtocolPolicy>{{ OriginProtocolPolicy }}</OriginProtocolPolicy>
+ <OriginSslProtocols>
+ <Quantity>{{ origin.custom_origin.origin_ssl_protocols.quantity }}</Quantity>
+ <Items>
+ {% for protocol in origin.custom_origin.origin_ssl_protocols %}
+ {{ protocol }}
+ {% endfor %}
+ </Items>
+ </OriginSslProtocols>
+ <OriginReadTimeout>{{ origin.custom_origin.origin_read_timeout }}</OriginReadTimeout>
+ <OriginKeepaliveTimeout>{{ origin.custom_origin.origin_keepalive_timeout }}</OriginKeepaliveTimeout>
+ </CustomOriginConfig>
+ {% endif %}
+ <ConnectionAttempts>{{ origin.connection_attempts }}</ConnectionAttempts>
+ <ConnectionTimeout>{{ origin.connection_timeout }}</ConnectionTimeout>
+ {% if origin.origin_shield %}
+ <OriginShield>
+ <Enabled>{{ origin.origin_shield.enabled }}</Enabled>
+ <OriginShieldRegion>{{ OriginShieldRegion }}</OriginShieldRegion>
+ </OriginShield>
+ {% else %}
+ <OriginShield>
+ <Enabled>false</Enabled>
+ </OriginShield>
+ {% endif %}
+ </Origin>
+ {% endfor %}
+ </Items>
+ </Origins>
+ <OriginGroups>
+ <Quantity>{{ distribution.distribution_config.origin_groups|length }}</Quantity>
+ {% if distribution.distribution_config.origin_groups %}
+ <Items>
+ {% for origin_group in distribution.distribution_config.origin_groups %}
+ <Id>{{ origin_group.id }}</Id>
+ <FailoverCriteria>
+ <StatusCodes>
+ <Quantity>{{ origin_group.failover_criteria.status_codes.quantity }}</Quantity>
+ <Items>
+ {% for status_code_list in origin_group_list.failover_criteria.status_codes.StatusCodeList %}
+ <StatusCode>{{ status_code_list.status_code }}</StatusCode>
+ {% endfor %}
+ </Items>
+ </StatusCodes>
+ </FailoverCriteria>
+ <Members>
+ <Quantity>{{ origin_group.members.quantity }}</Quantity>
+ <Items>
+ {% for origin_group_member_list in origin_group.members.OriginGroupMemberList %}
+ <OriginId>{{ origin_group_member_list.origin_id }}</OriginId>
+ {% endfor %}
+ </Items>
+ </Members>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </OriginGroups>
+ <DefaultCacheBehavior>
+ <TargetOriginId>{{ distribution.distribution_config.default_cache_behavior.target_origin_id }}</TargetOriginId>
+ <TrustedSigners>
+ <Enabled>{{ distribution.distribution_config.default_cache_behavior.trusted_signers.enabled }}</Enabled>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.trusted_signers|length }}</Quantity>
+ <Items>
+ {% for aws_account_number in distribution.distribution_config.default_cache_behavior.trusted_signers %}
+ <AwsAccountNumber>{{ aws_account_number }}</AwsAccountNumber>
+ {% endfor %}
+ </Items>
+ </TrustedSigners>
+ <TrustedKeyGroups>
+ <Enabled>{{ distribution.distribution_config.default_cache_behavior.trusted_key_groups_enabled }}</Enabled>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.trusted_key_groups|length }}</Quantity>
+ <Items>
+ {% for key_group in distribution.distribution_config.default_cache_behavior.trusted_key_groups %}
+ <KeyGroup>{{ key_group }}</KeyGroup>
+ {% endfor %}
+ </Items>
+ </TrustedKeyGroups>
+ <ViewerProtocolPolicy>{{ distribution.distribution_config.default_cache_behavior.viewer_protocol_policy }}</ViewerProtocolPolicy>
+ <AllowedMethods>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.allowed_methods|length }}</Quantity>
+ <Items>
+ {% for method in distribution.distribution_config.default_cache_behavior.allowed_methods %}
+ <member>{{ method }}</member>
+ {% endfor %}
+ </Items>
+ <CachedMethods>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.cached_methods|length }}</Quantity>
+ <Items>
+ {% for method in distribution.distribution_config.default_cache_behavior.cached_methods %}
+ <member>{{ method }}</member>
+ {% endfor %}
+ </Items>
+ </CachedMethods>
+ </AllowedMethods>
+ <SmoothStreaming>{{ distribution.distribution_config.default_cache_behavior.smooth_streaming }}</SmoothStreaming>
+ <Compress>{{ 'true' if distribution.distribution_config.default_cache_behavior.compress else 'false' }}</Compress>
+ <LambdaFunctionAssociations>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.lambda_function_associations|length }}</Quantity>
+ {% if distribution.distribution_config.default_cache_behavior.lambda_function_associations %}
+ <Items>
+ {% for func in distribution.distribution_config.default_cache_behavior.lambda_function_associations %}
+ <LambdaFunctionARN>{{ func.arn }}</LambdaFunctionARN>
+ <EventType>{{ func.event_type }}</EventType>
+ <IncludeBody>{{ func.include_body }}</IncludeBody>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </LambdaFunctionAssociations>
+ <FunctionAssociations>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.function_associations|length }}</Quantity>
+ {% if distribution.distribution_config.default_cache_behavior.function_associations %}
+ <Items>
+ {% for func in distribution.distribution_config.default_cache_behavior.function_associations %}
+ <FunctionARN>{{ func.arn }}</FunctionARN>
+ <EventType>{{ func.event_type }}</EventType>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </FunctionAssociations>
+ <FieldLevelEncryptionId>{{ distribution.distribution_config.default_cache_behavior.field_level_encryption_id }}</FieldLevelEncryptionId>
+ <RealtimeLogConfigArn>{{ distribution.distribution_config.default_cache_behavior.realtime_log_config_arn }}</RealtimeLogConfigArn>
+ <CachePolicyId>{{ distribution.distribution_config.default_cache_behavior.cache_policy_id }}</CachePolicyId>
+ <OriginRequestPolicyId>{{ distribution.distribution_config.default_cache_behavior.origin_request_policy_id }}</OriginRequestPolicyId>
+ <ResponseHeadersPolicyId>{{ distribution.distribution_config.default_cache_behavior.response_headers_policy_id }}</ResponseHeadersPolicyId>
+ <ForwardedValues>
+ <QueryString>{{ distribution.distribution_config.default_cache_behavior.forwarded_values.query_string }}</QueryString>
+ <Cookies>
+ <Forward>{{ ItemSelection }}</Forward>
+ <WhitelistedNames>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.forwarded_values.whitelisted_names|length }}</Quantity>
+ <Items>
+ {% for name in distribution.distribution_config.default_cache_behavior.forwarded_values.whitelisted_names %}
+ <Name>{{ name }}</Name>
+ {% endfor %}
+ </Items>
+ </WhitelistedNames>
+ </Cookies>
+ <Headers>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.forwarded_values.headers|length }}</Quantity>
+ <Items>
+ {% for h in distribution.distribution_config.default_cache_behavior.forwarded_values.headers %}
+ <Name>{{ h }}</Name>
+ {% endfor %}
+ </Items>
+ </Headers>
+ <QueryStringCacheKeys>
+ <Quantity>{{ distribution.distribution_config.default_cache_behavior.forwarded_values.query_string_cache_keys|length }}</Quantity>
+ <Items>
+ {% for key in distribution.distribution_config.default_cache_behavior.forwarded_values.query_string_cache_keys %}
+ <Name>{{ key }}</Name>
+ {% endfor %}
+ </Items>
+ </QueryStringCacheKeys>
+ </ForwardedValues>
+ <MinTTL>{{ distribution.distribution_config.default_cache_behavior.min_ttl }}</MinTTL>
+ <DefaultTTL>{{ distribution.distribution_config.default_cache_behavior.default_ttl }}</DefaultTTL>
+ <MaxTTL>{{ distribution.distribution_config.default_cache_behavior.max_ttl }}</MaxTTL>
+ </DefaultCacheBehavior>
+ <CacheBehaviors>
+ <Quantity>{{ distribution.distribution_config.cache_behaviors|length }}</Quantity>
+ {% if distribution.distribution_config.cache_behaviors %}
+ <Items>
+ {% for behaviour in distribution.distribution_config.cache_behaviors %}
+ <PathPattern>{{ behaviour.path_pattern }}</PathPattern>
+ <TargetOriginId>{{ behaviour.target_origin_id }}</TargetOriginId>
+ <TrustedSigners>
+ <Enabled>{{ behaviour.trusted_signers.enabled }}</Enabled>
+ <Quantity>{{ behaviour.trusted_signers.quantity }}</Quantity>
+ <Items>
+ {% for account_nr in behaviour.trusted_signers %}
+ <AwsAccountNumber>{{ account_nr }}</AwsAccountNumber>
+ {% endfor %}
+ </Items>
+ </TrustedSigners>
+ <TrustedKeyGroups>
+ <Enabled>{{ cache_behavior_list.trusted_key_groups.enabled }}</Enabled>
+ <Quantity>{{ cache_behavior_list.trusted_key_groups.quantity }}</Quantity>
+ <Items>
+ {% for trusted_key_group_id_list in cache_behavior_list.trusted_key_groups.TrustedKeyGroupIdList %}
+ <KeyGroup>{{ trusted_key_group_id_list.key_group }}</KeyGroup>
+ {% endfor %}
+ </Items>
+ </TrustedKeyGroups>
+ <ViewerProtocolPolicy>{{ ViewerProtocolPolicy }}</ViewerProtocolPolicy>
+ <AllowedMethods>
+ <Quantity>{{ cache_behavior_list.allowed_methods.quantity }}</Quantity>
+ <Items>
+ {% for methods_list in cache_behavior_list.allowed_methods.MethodsList %}{{ Method }}{% endfor %}
+ </Items>
+ <CachedMethods>
+ <Quantity>{{ cache_behavior_list.allowed_methods.cached_methods.quantity }}</Quantity>
+ <Items>
+ {% for methods_list in cache_behavior_list.allowed_methods.cached_methods.MethodsList %}{{ Method }}{% endfor %}
+ </Items>
+ </CachedMethods>
+ </AllowedMethods>
+ <SmoothStreaming>{{ cache_behavior_list.smooth_streaming }}</SmoothStreaming>
+ <Compress>{{ cache_behavior_list.compress }}</Compress>
+ <LambdaFunctionAssociations>
+ <Quantity>{{ cache_behavior_list.lambda_function_associations.quantity }}</Quantity>
+ <Items>
+ {% for lambda_function_association_list in cache_behavior_list.lambda_function_associations.LambdaFunctionAssociationList %}
+ <LambdaFunctionARN>{{ LambdaFunctionARN }}</LambdaFunctionARN>
+ <EventType>{{ EventType }}</EventType>
+ <IncludeBody>{{ lambda_function_association_list.include_body }}</IncludeBody>
+ {% endfor %}
+ </Items>
+ </LambdaFunctionAssociations>
+ <FunctionAssociations>
+ <Quantity>{{ cache_behavior_list.function_associations.quantity }}</Quantity>
+ <Items>
+ {% for function_association_list in cache_behavior_list.function_associations.FunctionAssociationList %}
+ <FunctionARN>{{ FunctionARN }}</FunctionARN>
+ <EventType>{{ EventType }}</EventType>
+ {% endfor %}
+ </Items>
+ </FunctionAssociations>
+ <FieldLevelEncryptionId>{{ cache_behavior_list.field_level_encryption_id }}</FieldLevelEncryptionId>
+ <RealtimeLogConfigArn>{{ cache_behavior_list.realtime_log_config_arn }}</RealtimeLogConfigArn>
+ <CachePolicyId>{{ cache_behavior_list.cache_policy_id }}</CachePolicyId>
+ <OriginRequestPolicyId>{{ cache_behavior_list.origin_request_policy_id }}</OriginRequestPolicyId>
+ <ResponseHeadersPolicyId>{{ cache_behavior_list.response_headers_policy_id }}</ResponseHeadersPolicyId>
+ <ForwardedValues>
+ <QueryString>{{ cache_behavior_list.forwarded_values.query_string }}</QueryString>
+ <Cookies>
+ <Forward>{{ ItemSelection }}</Forward>
+ <WhitelistedNames>
+ <Quantity>{{ cache_behavior_list.forwarded_values.cookies.whitelisted_names.quantity }}</Quantity>
+ <Items>
+ {% for cookie_name_list in cache_behavior_list.forwarded_values.cookies.whitelisted_names.CookieNameList %}
+ <Name>{{ cookie_name_list.name }}</Name>
+ {% endfor %}
+ </Items>
+ </WhitelistedNames>
+ </Cookies>
+ <Headers>
+ <Quantity>{{ cache_behavior_list.forwarded_values.headers.quantity }}</Quantity>
+ <Items>
+ {% for header_list in cache_behavior_list.forwarded_values.headers.HeaderList %}
+ <Name>{{ header_list.name }}</Name>
+ {% endfor %}
+ </Items>
+ </Headers>
+ <QueryStringCacheKeys>
+ <Quantity>{{ cache_behavior_list.forwarded_values.query_string_cache_keys.quantity }}</Quantity>
+ <Items>
+ {% for query_string_cache_keys_list in cache_behavior_list.forwarded_values.query_string_cache_keys.QueryStringCacheKeysList %}
+ <Name>{{ query_string_cache_keys_list.name }}</Name>
+ {% endfor %}
+ </Items>
+ </QueryStringCacheKeys>
+ </ForwardedValues>
+ <MinTTL>{{ cache_behavior_list.min_ttl }}</MinTTL>
+ <DefaultTTL>{{ cache_behavior_list.default_ttl }}</DefaultTTL>
+ <MaxTTL>{{ cache_behavior_list.max_ttl }}</MaxTTL>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </CacheBehaviors>
+ <CustomErrorResponses>
+ <Quantity>{{ distribution.distribution_config.custom_error_responses|length }}</Quantity>
+ {% if distribution.distribution_config.custom_error_responses %}
+ <Items>
+ {% for response in distribution.distribution_config.custom_error_responses %}
+ <ErrorCode>{{ response.error_code }}</ErrorCode>
+ <ResponsePagePath>{{ response.response_page_path }}</ResponsePagePath>
+ <ResponseCode>{{ response.response_code }}</ResponseCode>
+ <ErrorCachingMinTTL>{{ response.error_caching_min_ttl }}</ErrorCachingMinTTL>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </CustomErrorResponses>
+ <Comment>{{ distribution.distribution_config.comment }}</Comment>
+ <Logging>
+ <Enabled>{{ distribution.distribution_config.logging.enabled }}</Enabled>
+ <IncludeCookies>{{ distribution.distribution_config.logging.include_cookies }}</IncludeCookies>
+ <Bucket>{{ distribution.distribution_config.logging.bucket }}</Bucket>
+ <Prefix>{{ distribution.distribution_config.logging.prefix }}</Prefix>
+ </Logging>
+ <PriceClass>{{ distribution.distribution_config.price_class }}</PriceClass>
+ <Enabled>{{ distribution.distribution_config.enabled }}</Enabled>
+ <ViewerCertificate>
+ <CloudFrontDefaultCertificate>{{ 'true' if distribution.distribution_config.viewer_certificate.cloud_front_default_certificate else 'false' }}</CloudFrontDefaultCertificate>
+ <IAMCertificateId>{{ distribution.distribution_config.viewer_certificate.iam_certificate_id }}</IAMCertificateId>
+ <ACMCertificateArn>{{ distribution.distribution_config.viewer_certificate.acm_certificate_arn }}</ACMCertificateArn>
+ <SSLSupportMethod>{{ SSLSupportMethod }}</SSLSupportMethod>
+ <MinimumProtocolVersion>{{ distribution.distribution_config.viewer_certificate.min_protocol_version }}</MinimumProtocolVersion>
+ <Certificate>{{ distribution.distribution_config.viewer_certificate.certificate }}</Certificate>
+ <CertificateSource>{{ distribution.distribution_config.viewer_certificate.certificate_source }}</CertificateSource>
+ </ViewerCertificate>
+ <Restrictions>
+ <GeoRestriction>
+ <RestrictionType>{{ distribution.distribution_config.geo_restriction_type }}</RestrictionType>
+ <Quantity>{{ distribution.distribution_config.geo_restrictions|length }}</Quantity>
+ {% if distribution.distribution_config.geo_restrictions %}
+ <Items>
+ {% for location in distribution.distribution_config.geo_restrictions %}
+ <Location>{{ location }}</Location>
+ {% endfor %}
+ </Items>
+ {% endif %}
+ </GeoRestriction>
+ </Restrictions>
+ <WebACLId>{{ distribution.distribution_config.web_acl_id }}</WebACLId>
+ <HttpVersion>{{ distribution.distribution_config.http_version }}</HttpVersion>
+ <IsIPV6Enabled>{{ 'true' if distribution.distribution_config.is_ipv6_enabled else 'false' }}</IsIPV6Enabled>
+"""
+
+
+DISTRIBUTION_TEMPLATE = (
+ DIST_META_TEMPLATE
+ + """
+ <ActiveTrustedSigners>
+ <Enabled>{{ distribution.active_trusted_signers.enabled }}</Enabled>
+ <Quantity>{{ distribution.active_trusted_signers.quantity }}</Quantity>
+ <Items>
+ {% for signer in distribution.active_trusted_signers.signers %}
+ <AwsAccountNumber>{{ signer.aws_account_number }}</AwsAccountNumber>
+ <KeyPairIds>
+ <Quantity>{{ signer.key_pair_ids.quantity }}</Quantity>
+ <Items>
+ {% for key_pair_id_list in signer.key_pair_ids.KeyPairIdList %}
+ <KeyPairId>{{ key_pair_id_list.key_pair_id }}</KeyPairId>
+ {% endfor %}
+ </Items>
+ </KeyPairIds>
+ {% endfor %}
+ </Items>
+ </ActiveTrustedSigners>
+ <ActiveTrustedKeyGroups>
+ <Enabled>{{ distribution.active_trusted_key_groups.enabled }}</Enabled>
+ <Quantity>{{ distribution.active_trusted_key_groups.quantity }}</Quantity>
+ <Items>
+ {% for kg_key_pair_id in distribution.active_trusted_key_groups.kg_key_pair_ids %}
+ <KeyGroupId>{{ kg_key_pair_id.key_group_id }}</KeyGroupId>
+ <KeyPairIds>
+ <Quantity>{{ kg_key_pair_id.key_pair_ids.quantity }}</Quantity>
+ <Items>
+ {% for key_pair_id_list in kg_key_pair_ids_list.key_pair_ids.KeyPairIdList %}
+ <KeyPairId>{{ key_pair_id_list.key_pair_id }}</KeyPairId>
+ {% endfor %}
+ </Items>
+ </KeyPairIds>
+ {% endfor %}
+ </Items>
+ </ActiveTrustedKeyGroups>
+ <DistributionConfig>
+ """
+ + DIST_CONFIG_TEMPLATE
+ + """
+ </DistributionConfig>
+ <AliasICPRecordals>
+ {% for a in distribution.alias_icp_recordals %}
+ <CNAME>{{ a.cname }}</CNAME>
+ <ICPRecordalStatus>{{ a.status }}</ICPRecordalStatus>
+ {% endfor %}
+ </AliasICPRecordals>"""
+)
+
+CREATE_DISTRIBUTION_TEMPLATE = (
+ """<?xml version="1.0"?>
+ <CreateDistributionResult xmlns="{{ xmlns }}">
+"""
+ + DISTRIBUTION_TEMPLATE
+ + """
+ </CreateDistributionResult>
+"""
+)
+
+GET_DISTRIBUTION_TEMPLATE = (
+ """<?xml version="1.0"?>
+ <Distribution xmlns="{{ xmlns }}">
+"""
+ + DISTRIBUTION_TEMPLATE
+ + """
+ </Distribution>
+"""
+)
+
+
+LIST_TEMPLATE = (
+ """<?xml version="1.0"?>
+<DistributionList xmlns="http://cloudfront.amazonaws.com/doc/2020-05-31/">
+ <Marker></Marker>
+ <MaxItems>100</MaxItems>
+ <IsTruncated>false</IsTruncated>
+ <Quantity>{{ distributions|length }}</Quantity>
+ {% if distributions %}
+ <Items>
+ {% for distribution in distributions %}
+ <DistributionSummary>
+ """
+ + DIST_META_TEMPLATE
+ + """
+ """
+ + DIST_CONFIG_TEMPLATE
+ + """
+ </DistributionSummary>
+ {% endfor %}
+ </Items>
+ {% endif %}
+</DistributionList>"""
+)
+
+UPDATE_DISTRIBUTION_TEMPLATE = (
+ """<?xml version="1.0"?>
+ <Distribution xmlns="{{ xmlns }}">
+"""
+ + DISTRIBUTION_TEMPLATE
+ + """
+ </Distribution>
+"""
+)
diff --git a/contrib/python/moto/py3/moto/cloudfront/urls.py b/contrib/python/moto/py3/moto/cloudfront/urls.py
new file mode 100644
index 0000000000..9f165d39be
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudfront/urls.py
@@ -0,0 +1,14 @@
+"""cloudfront base URL and path."""
+from .responses import CloudFrontResponse
+
+
+response = CloudFrontResponse()
+
+url_bases = [
+ r"https?://cloudfront\.amazonaws\.com",
+]
+url_paths = {
+ "{0}/2020-05-31/distribution$": response.distributions,
+ "{0}/2020-05-31/distribution/(?P<distribution_id>[^/]+)$": response.individual_distribution,
+ "{0}/2020-05-31/distribution/(?P<distribution_id>[^/]+)/config$": response.update_distribution,
+}
diff --git a/contrib/python/moto/py3/moto/cloudtrail/__init__.py b/contrib/python/moto/py3/moto/cloudtrail/__init__.py
new file mode 100644
index 0000000000..f15a80abb9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudtrail/__init__.py
@@ -0,0 +1,5 @@
+"""cloudtrail module initialization; sets value for base decorator."""
+from .models import cloudtrail_backends
+from ..core.models import base_decorator
+
+mock_cloudtrail = base_decorator(cloudtrail_backends)
diff --git a/contrib/python/moto/py3/moto/cloudtrail/exceptions.py b/contrib/python/moto/py3/moto/cloudtrail/exceptions.py
new file mode 100644
index 0000000000..6fe2b7654b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudtrail/exceptions.py
@@ -0,0 +1,72 @@
+"""Exceptions raised by the cloudtrail service."""
+from moto.core import get_account_id
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidParameterCombinationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterCombinationException", message)
+
+
+class S3BucketDoesNotExistException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("S3BucketDoesNotExistException", message)
+
+
+class InsufficientSnsTopicPolicyException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InsufficientSnsTopicPolicyException", message)
+
+
+class TrailNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ super().__init__(
+ "TrailNotFoundException",
+ f"Unknown trail: {name} for the user: {get_account_id()}",
+ )
+
+
+class InvalidTrailNameException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidTrailNameException", message)
+
+
+class TrailNameTooShort(InvalidTrailNameException):
+ def __init__(self, actual_length):
+ super().__init__(
+ f"Trail name too short. Minimum allowed length: 3 characters. Specified name length: {actual_length} characters."
+ )
+
+
+class TrailNameTooLong(InvalidTrailNameException):
+ def __init__(self, actual_length):
+ super().__init__(
+ f"Trail name too long. Maximum allowed length: 128 characters. Specified name length: {actual_length} characters."
+ )
+
+
+class TrailNameNotStartingCorrectly(InvalidTrailNameException):
+ def __init__(self):
+ super().__init__("Trail name must starts with a letter or number.")
+
+
+class TrailNameNotEndingCorrectly(InvalidTrailNameException):
+ def __init__(self):
+ super().__init__("Trail name must ends with a letter or number.")
+
+
+class TrailNameInvalidChars(InvalidTrailNameException):
+ def __init__(self):
+ super().__init__(
+ "Trail name or ARN can only contain uppercase letters, lowercase letters, numbers, periods (.), hyphens (-), and underscores (_)."
+ )
diff --git a/contrib/python/moto/py3/moto/cloudtrail/models.py b/contrib/python/moto/py3/moto/cloudtrail/models.py
new file mode 100644
index 0000000000..3c156fbe1a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudtrail/models.py
@@ -0,0 +1,407 @@
+import re
+import time
+
+from datetime import datetime
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
+from moto.utilities.tagging_service import TaggingService
+from .exceptions import (
+ S3BucketDoesNotExistException,
+ InsufficientSnsTopicPolicyException,
+ TrailNameTooLong,
+ TrailNameTooShort,
+ TrailNameNotStartingCorrectly,
+ TrailNameNotEndingCorrectly,
+ TrailNameInvalidChars,
+ TrailNotFoundException,
+)
+
+
+def datetime2int(date):
+ return int(time.mktime(date.timetuple()))
+
+
+class TrailStatus(object):
+ def __init__(self):
+ self.is_logging = False
+ self.latest_delivery_time = ""
+ self.latest_delivery_attempt = ""
+ self.start_logging_time = None
+ self.started = None
+ self.stopped = None
+
+ def start_logging(self):
+ self.is_logging = True
+ self.started = datetime.utcnow()
+ self.latest_delivery_time = datetime2int(datetime.utcnow())
+ self.latest_delivery_attempt = iso_8601_datetime_without_milliseconds(
+ datetime.utcnow()
+ )
+
+ def stop_logging(self):
+ self.is_logging = False
+ self.stopped = datetime.utcnow()
+
+ def description(self):
+ if self.is_logging:
+ self.latest_delivery_time = datetime2int(datetime.utcnow())
+ self.latest_delivery_attempt = iso_8601_datetime_without_milliseconds(
+ datetime.utcnow()
+ )
+ desc = {
+ "IsLogging": self.is_logging,
+ "LatestDeliveryAttemptTime": self.latest_delivery_attempt,
+ "LatestNotificationAttemptTime": "",
+ "LatestNotificationAttemptSucceeded": "",
+ "LatestDeliveryAttemptSucceeded": "",
+ "TimeLoggingStarted": "",
+ "TimeLoggingStopped": "",
+ }
+ if self.started:
+ desc["StartLoggingTime"] = datetime2int(self.started)
+ desc["TimeLoggingStarted"] = iso_8601_datetime_without_milliseconds(
+ self.started
+ )
+ desc["LatestDeliveryTime"] = self.latest_delivery_time
+ if self.stopped:
+ desc["StopLoggingTime"] = datetime2int(self.stopped)
+ desc["TimeLoggingStopped"] = iso_8601_datetime_without_milliseconds(
+ self.stopped
+ )
+ return desc
+
+
+class Trail(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ trail_name,
+ bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ is_global,
+ is_multi_region,
+ log_validation,
+ is_org_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ ):
+ self.region_name = region_name
+ self.trail_name = trail_name
+ self.bucket_name = bucket_name
+ self.s3_key_prefix = s3_key_prefix
+ self.sns_topic_name = sns_topic_name
+ self.is_multi_region = is_multi_region
+ self.log_validation = log_validation
+ self.is_org_trail = is_org_trail
+ self.include_global_service_events = is_global
+ self.cw_log_group_arn = cw_log_group_arn
+ self.cw_role_arn = cw_role_arn
+ self.kms_key_id = kms_key_id
+ self.check_name()
+ self.check_bucket_exists()
+ self.check_topic_exists()
+ self.status = TrailStatus()
+ self.event_selectors = list()
+ self.advanced_event_selectors = list()
+ self.insight_selectors = list()
+
+ @property
+ def arn(self):
+ return f"arn:aws:cloudtrail:{self.region_name}:{get_account_id()}:trail/{self.trail_name}"
+
+ @property
+ def topic_arn(self):
+ if self.sns_topic_name:
+ return f"arn:aws:sns:{self.region_name}:{get_account_id()}:{self.sns_topic_name}"
+ return None
+
+ def check_name(self):
+ if len(self.trail_name) < 3:
+ raise TrailNameTooShort(actual_length=len(self.trail_name))
+ if len(self.trail_name) > 128:
+ raise TrailNameTooLong(actual_length=len(self.trail_name))
+ if not re.match("^[0-9a-zA-Z]{1}.+$", self.trail_name):
+ raise TrailNameNotStartingCorrectly()
+ if not re.match(r".+[0-9a-zA-Z]{1}$", self.trail_name):
+ raise TrailNameNotEndingCorrectly()
+ if not re.match(r"^[.\-_0-9a-zA-Z]+$", self.trail_name):
+ raise TrailNameInvalidChars()
+
+ def check_bucket_exists(self):
+ from moto.s3.models import s3_backend
+
+ try:
+ s3_backend.get_bucket(self.bucket_name)
+ except Exception:
+ raise S3BucketDoesNotExistException(
+ f"S3 bucket {self.bucket_name} does not exist!"
+ )
+
+ def check_topic_exists(self):
+ if self.sns_topic_name:
+ from moto.sns import sns_backends
+
+ sns_backend = sns_backends[self.region_name]
+ try:
+ sns_backend.get_topic(self.topic_arn)
+ except Exception:
+ raise InsufficientSnsTopicPolicyException(
+ "SNS Topic does not exist or the topic policy is incorrect!"
+ )
+
+ def start_logging(self):
+ self.status.start_logging()
+
+ def stop_logging(self):
+ self.status.stop_logging()
+
+ def put_event_selectors(self, event_selectors, advanced_event_selectors):
+ if event_selectors:
+ self.event_selectors = event_selectors
+ elif advanced_event_selectors:
+ self.event_selectors = []
+ self.advanced_event_selectors = advanced_event_selectors
+
+ def get_event_selectors(self):
+ return self.event_selectors, self.advanced_event_selectors
+
+ def put_insight_selectors(self, insight_selectors):
+ self.insight_selectors.extend(insight_selectors)
+
+ def get_insight_selectors(self):
+ return self.insight_selectors
+
+ def update(
+ self,
+ s3_bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ include_global_service_events,
+ is_multi_region_trail,
+ enable_log_file_validation,
+ is_organization_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ ):
+ if s3_bucket_name is not None:
+ self.bucket_name = s3_bucket_name
+ if s3_key_prefix is not None:
+ self.s3_key_prefix = s3_key_prefix
+ if sns_topic_name is not None:
+ self.sns_topic_name = sns_topic_name
+ if include_global_service_events is not None:
+ self.include_global_service_events = include_global_service_events
+ if is_multi_region_trail is not None:
+ self.is_multi_region = is_multi_region_trail
+ if enable_log_file_validation is not None:
+ self.log_validation = enable_log_file_validation
+ if is_organization_trail is not None:
+ self.is_org_trail = is_organization_trail
+ if cw_log_group_arn is not None:
+ self.cw_log_group_arn = cw_log_group_arn
+ if cw_role_arn is not None:
+ self.cw_role_arn = cw_role_arn
+ if kms_key_id is not None:
+ self.kms_key_id = kms_key_id
+
+ def short(self):
+ return {
+ "Name": self.trail_name,
+ "TrailARN": self.arn,
+ "HomeRegion": self.region_name,
+ }
+
+ def description(self, include_region=False):
+ desc = {
+ "Name": self.trail_name,
+ "S3BucketName": self.bucket_name,
+ "IncludeGlobalServiceEvents": self.include_global_service_events,
+ "IsMultiRegionTrail": self.is_multi_region,
+ "TrailARN": self.arn,
+ "LogFileValidationEnabled": self.log_validation,
+ "IsOrganizationTrail": self.is_org_trail,
+ "HasCustomEventSelectors": False,
+ "HasInsightSelectors": False,
+ "CloudWatchLogsLogGroupArn": self.cw_log_group_arn,
+ "CloudWatchLogsRoleArn": self.cw_role_arn,
+ "KmsKeyId": self.kms_key_id,
+ }
+ if self.s3_key_prefix is not None:
+ desc["S3KeyPrefix"] = self.s3_key_prefix
+ if self.sns_topic_name is not None:
+ desc["SnsTopicName"] = self.sns_topic_name
+ desc["SnsTopicARN"] = self.topic_arn
+ if include_region:
+ desc["HomeRegion"] = self.region_name
+ return desc
+
+
+class CloudTrailBackend(BaseBackend):
+ """Implementation of CloudTrail APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.trails = dict()
+ self.tagging_service = TaggingService(tag_name="TagsList")
+
+ def create_trail(
+ self,
+ name,
+ bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ is_global,
+ is_multi_region,
+ log_validation,
+ is_org_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ tags_list,
+ ):
+ trail = Trail(
+ self.region_name,
+ name,
+ bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ is_global,
+ is_multi_region,
+ log_validation,
+ is_org_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ )
+ self.trails[name] = trail
+ self.tagging_service.tag_resource(trail.arn, tags_list)
+ return trail
+
+ def get_trail(self, name_or_arn):
+ if len(name_or_arn) < 3:
+ raise TrailNameTooShort(actual_length=len(name_or_arn))
+ if name_or_arn in self.trails:
+ return self.trails[name_or_arn]
+ for trail in self.trails.values():
+ if trail.arn == name_or_arn:
+ return trail
+ raise TrailNotFoundException(name_or_arn)
+
+ def get_trail_status(self, name):
+ if len(name) < 3:
+ raise TrailNameTooShort(actual_length=len(name))
+ trail_name = next(
+ (
+ trail.trail_name
+ for trail in self.trails.values()
+ if trail.trail_name == name or trail.arn == name
+ ),
+ None,
+ )
+ if not trail_name:
+ # This particular method returns the ARN as part of the error message
+ arn = (
+ f"arn:aws:cloudtrail:{self.region_name}:{get_account_id()}:trail/{name}"
+ )
+ raise TrailNotFoundException(name=arn)
+ trail = self.trails[trail_name]
+ return trail.status
+
+ def describe_trails(self, include_shadow_trails):
+ all_trails = []
+ if include_shadow_trails:
+ current_account = cloudtrail_backends[self.account_id]
+ for backend in current_account.values():
+ all_trails.extend(backend.trails.values())
+ else:
+ all_trails.extend(self.trails.values())
+ return all_trails
+
+ def list_trails(self):
+ return self.describe_trails(include_shadow_trails=True)
+
+ def start_logging(self, name):
+ trail = self.trails[name]
+ trail.start_logging()
+
+ def stop_logging(self, name):
+ trail = self.trails[name]
+ trail.stop_logging()
+
+ def delete_trail(self, name):
+ if name in self.trails:
+ del self.trails[name]
+
+ def update_trail(
+ self,
+ name,
+ s3_bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ include_global_service_events,
+ is_multi_region_trail,
+ enable_log_file_validation,
+ is_organization_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ ):
+ trail = self.get_trail(name_or_arn=name)
+ trail.update(
+ s3_bucket_name=s3_bucket_name,
+ s3_key_prefix=s3_key_prefix,
+ sns_topic_name=sns_topic_name,
+ include_global_service_events=include_global_service_events,
+ is_multi_region_trail=is_multi_region_trail,
+ enable_log_file_validation=enable_log_file_validation,
+ is_organization_trail=is_organization_trail,
+ cw_log_group_arn=cw_log_group_arn,
+ cw_role_arn=cw_role_arn,
+ kms_key_id=kms_key_id,
+ )
+ return trail
+
+ def put_event_selectors(
+ self, trail_name, event_selectors, advanced_event_selectors
+ ):
+ trail = self.get_trail(trail_name)
+ trail.put_event_selectors(event_selectors, advanced_event_selectors)
+ trail_arn = trail.arn
+ return trail_arn, event_selectors, advanced_event_selectors
+
+ def get_event_selectors(self, trail_name):
+ trail = self.get_trail(trail_name)
+ event_selectors, advanced_event_selectors = trail.get_event_selectors()
+ return trail.arn, event_selectors, advanced_event_selectors
+
+ def add_tags(self, resource_id, tags_list):
+ self.tagging_service.tag_resource(resource_id, tags_list)
+
+ def remove_tags(self, resource_id, tags_list):
+ self.tagging_service.untag_resource_using_tags(resource_id, tags_list)
+
+ def list_tags(self, resource_id_list):
+ """
+ Pagination is not yet implemented
+ """
+ resp = [{"ResourceId": r_id} for r_id in resource_id_list]
+ for item in resp:
+ item["TagsList"] = self.tagging_service.list_tags_for_resource(
+ item["ResourceId"]
+ )["TagsList"]
+ return resp
+
+ def put_insight_selectors(self, trail_name, insight_selectors):
+ trail = self.get_trail(trail_name)
+ trail.put_insight_selectors(insight_selectors)
+ return trail.arn, insight_selectors
+
+ def get_insight_selectors(self, trail_name):
+ trail = self.get_trail(trail_name)
+ return trail.arn, trail.get_insight_selectors()
+
+
+cloudtrail_backends = BackendDict(CloudTrailBackend, "cloudtrail")
diff --git a/contrib/python/moto/py3/moto/cloudtrail/responses.py b/contrib/python/moto/py3/moto/cloudtrail/responses.py
new file mode 100644
index 0000000000..9f6f0bb875
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudtrail/responses.py
@@ -0,0 +1,190 @@
+"""Handles incoming cloudtrail requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import cloudtrail_backends
+from .exceptions import InvalidParameterCombinationException
+
+
+class CloudTrailResponse(BaseResponse):
+ """Handler for CloudTrail requests and responses."""
+
+ @property
+ def cloudtrail_backend(self):
+ """Return backend instance specific for this region."""
+ return cloudtrail_backends[self.region]
+
+ def create_trail(self):
+ name = self._get_param("Name")
+ bucket_name = self._get_param("S3BucketName")
+ is_global = self._get_bool_param("IncludeGlobalServiceEvents", True)
+ is_multi_region = self._get_bool_param("IsMultiRegionTrail", False)
+ if not is_global and is_multi_region:
+ raise InvalidParameterCombinationException(
+ "Multi-Region trail must include global service events."
+ )
+ s3_key_prefix = self._get_param("S3KeyPrefix")
+ sns_topic_name = self._get_param("SnsTopicName")
+ log_validation = self._get_bool_param("EnableLogFileValidation", False)
+ is_org_trail = self._get_bool_param("IsOrganizationTrail", False)
+ cw_log_group_arn = self._get_param("CloudWatchLogsLogGroupArn")
+ cw_role_arn = self._get_param("CloudWatchLogsRoleArn")
+ kms_key_id = self._get_param("KmsKeyId")
+ tags_list = self._get_param("TagsList", [])
+ trail = self.cloudtrail_backend.create_trail(
+ name,
+ bucket_name,
+ s3_key_prefix,
+ sns_topic_name,
+ is_global,
+ is_multi_region,
+ log_validation,
+ is_org_trail,
+ cw_log_group_arn,
+ cw_role_arn,
+ kms_key_id,
+ tags_list,
+ )
+ return json.dumps(trail.description())
+
+ def get_trail(self):
+ name = self._get_param("Name")
+ trail = self.cloudtrail_backend.get_trail(name)
+ return json.dumps({"Trail": trail.description()})
+
+ def get_trail_status(self):
+ name = self._get_param("Name")
+ status = self.cloudtrail_backend.get_trail_status(name)
+ return json.dumps(status.description())
+
+ def describe_trails(self):
+ include_shadow_trails = self._get_bool_param("includeShadowTrails", True)
+ trails = self.cloudtrail_backend.describe_trails(include_shadow_trails)
+ return json.dumps(
+ {"trailList": [t.description(include_region=True) for t in trails]}
+ )
+
+ def list_trails(self):
+ all_trails = self.cloudtrail_backend.list_trails()
+ return json.dumps({"Trails": [t.short() for t in all_trails]})
+
+ def start_logging(self):
+ name = self._get_param("Name")
+ self.cloudtrail_backend.start_logging(name)
+ return json.dumps({})
+
+ def stop_logging(self):
+ name = self._get_param("Name")
+ self.cloudtrail_backend.stop_logging(name)
+ return json.dumps({})
+
+ def delete_trail(self):
+ name = self._get_param("Name")
+ self.cloudtrail_backend.delete_trail(name)
+ return json.dumps({})
+
+ def update_trail(self):
+ name = self._get_param("Name")
+ s3_bucket_name = self._get_param("S3BucketName")
+ s3_key_prefix = self._get_param("S3KeyPrefix")
+ sns_topic_name = self._get_param("SnsTopicName")
+ include_global_service_events = self._get_param("IncludeGlobalServiceEvents")
+ is_multi_region_trail = self._get_param("IsMultiRegionTrail")
+ enable_log_file_validation = self._get_param("EnableLogFileValidation")
+ is_organization_trail = self._get_param("IsOrganizationTrail")
+ cw_log_group_arn = self._get_param("CloudWatchLogsLogGroupArn")
+ cw_role_arn = self._get_param("CloudWatchLogsRoleArn")
+ kms_key_id = self._get_param("KmsKeyId")
+ trail = self.cloudtrail_backend.update_trail(
+ name=name,
+ s3_bucket_name=s3_bucket_name,
+ s3_key_prefix=s3_key_prefix,
+ sns_topic_name=sns_topic_name,
+ include_global_service_events=include_global_service_events,
+ is_multi_region_trail=is_multi_region_trail,
+ enable_log_file_validation=enable_log_file_validation,
+ is_organization_trail=is_organization_trail,
+ cw_log_group_arn=cw_log_group_arn,
+ cw_role_arn=cw_role_arn,
+ kms_key_id=kms_key_id,
+ )
+ return json.dumps(trail.description())
+
+ def put_event_selectors(self):
+ params = json.loads(self.body)
+ trail_name = params.get("TrailName")
+ event_selectors = params.get("EventSelectors")
+ advanced_event_selectors = params.get("AdvancedEventSelectors")
+ (
+ trail_arn,
+ event_selectors,
+ advanced_event_selectors,
+ ) = self.cloudtrail_backend.put_event_selectors(
+ trail_name=trail_name,
+ event_selectors=event_selectors,
+ advanced_event_selectors=advanced_event_selectors,
+ )
+ return json.dumps(
+ dict(
+ TrailARN=trail_arn,
+ EventSelectors=event_selectors,
+ AdvancedEventSelectors=advanced_event_selectors,
+ )
+ )
+
+ def get_event_selectors(self):
+ params = json.loads(self.body)
+ trail_name = params.get("TrailName")
+ (
+ trail_arn,
+ event_selectors,
+ advanced_event_selectors,
+ ) = self.cloudtrail_backend.get_event_selectors(trail_name=trail_name)
+ return json.dumps(
+ dict(
+ TrailARN=trail_arn,
+ EventSelectors=event_selectors,
+ AdvancedEventSelectors=advanced_event_selectors,
+ )
+ )
+
+ def add_tags(self):
+ params = json.loads(self.body)
+ resource_id = params.get("ResourceId")
+ tags_list = params.get("TagsList")
+ self.cloudtrail_backend.add_tags(resource_id=resource_id, tags_list=tags_list)
+ return json.dumps(dict())
+
+ def remove_tags(self):
+ resource_id = self._get_param("ResourceId")
+ tags_list = self._get_param("TagsList")
+ self.cloudtrail_backend.remove_tags(
+ resource_id=resource_id, tags_list=tags_list
+ )
+ return json.dumps(dict())
+
+ def list_tags(self):
+ params = json.loads(self.body)
+ resource_id_list = params.get("ResourceIdList")
+ resource_tag_list = self.cloudtrail_backend.list_tags(
+ resource_id_list=resource_id_list
+ )
+ return json.dumps(dict(ResourceTagList=resource_tag_list))
+
+ def put_insight_selectors(self):
+ trail_name = self._get_param("TrailName")
+ insight_selectors = self._get_param("InsightSelectors")
+ trail_arn, insight_selectors = self.cloudtrail_backend.put_insight_selectors(
+ trail_name=trail_name, insight_selectors=insight_selectors
+ )
+ return json.dumps(dict(TrailARN=trail_arn, InsightSelectors=insight_selectors))
+
+ def get_insight_selectors(self):
+ trail_name = self._get_param("TrailName")
+ trail_arn, insight_selectors = self.cloudtrail_backend.get_insight_selectors(
+ trail_name=trail_name
+ )
+ resp = {"TrailARN": trail_arn}
+ if insight_selectors:
+ resp["InsightSelectors"] = insight_selectors
+ return json.dumps(resp)
diff --git a/contrib/python/moto/py3/moto/cloudtrail/urls.py b/contrib/python/moto/py3/moto/cloudtrail/urls.py
new file mode 100644
index 0000000000..83e2deca00
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudtrail/urls.py
@@ -0,0 +1,11 @@
+"""cloudtrail base URL and path."""
+from .responses import CloudTrailResponse
+
+response = CloudTrailResponse()
+
+url_bases = [
+ r"https?://cloudtrail\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {"{0}/$": response.dispatch}
diff --git a/contrib/python/moto/py3/moto/cloudwatch/__init__.py b/contrib/python/moto/py3/moto/cloudwatch/__init__.py
new file mode 100644
index 0000000000..8114b68385
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/__init__.py
@@ -0,0 +1,4 @@
+from .models import cloudwatch_backends
+from ..core.models import base_decorator
+
+mock_cloudwatch = base_decorator(cloudwatch_backends)
diff --git a/contrib/python/moto/py3/moto/cloudwatch/exceptions.py b/contrib/python/moto/py3/moto/cloudwatch/exceptions.py
new file mode 100644
index 0000000000..4196cc9946
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/exceptions.py
@@ -0,0 +1,43 @@
+from moto.core.exceptions import RESTError
+
+
+class InvalidFormat(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(__class__.__name__, message)
+
+
+class InvalidParameterValue(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(__class__.__name__, message)
+
+
+class InvalidParameterCombination(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(__class__.__name__, message)
+
+
+class ResourceNotFound(RESTError):
+ code = 404
+
+ def __init__(self):
+ super().__init__(__class__.__name__, "Unknown")
+
+
+class ResourceNotFoundException(RESTError):
+ code = 404
+
+ def __init__(self):
+ super().__init__(__class__.__name__, "Unknown")
+
+
+class ValidationError(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(__class__.__name__, message)
diff --git a/contrib/python/moto/py3/moto/cloudwatch/models.py b/contrib/python/moto/py3/moto/cloudwatch/models.py
new file mode 100644
index 0000000000..3508b7d01c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/models.py
@@ -0,0 +1,706 @@
+import json
+
+from moto.core import BaseBackend, BaseModel, CloudWatchMetricProvider
+from moto.core.utils import (
+ iso_8601_datetime_without_milliseconds,
+ iso_8601_datetime_with_nanoseconds,
+ BackendDict,
+)
+from datetime import datetime, timedelta
+from dateutil.tz import tzutc
+from uuid import uuid4
+
+from .exceptions import (
+ InvalidFormat,
+ ResourceNotFound,
+ ValidationError,
+ InvalidParameterValue,
+ ResourceNotFoundException,
+)
+from .utils import make_arn_for_dashboard, make_arn_for_alarm
+from dateutil import parser
+
+from moto.core import get_account_id
+from ..utilities.tagging_service import TaggingService
+
+_EMPTY_LIST = tuple()
+
+
+class Dimension(object):
+ def __init__(self, name, value):
+ self.name = name
+ self.value = value
+
+ def __eq__(self, item):
+ if isinstance(item, Dimension):
+ return self.name == item.name and (
+ self.value is None or item.value is None or self.value == item.value
+ )
+ return False
+
+ def __ne__(self, item): # Only needed on Py2; Py3 defines it implicitly
+ return self != item
+
+ def __lt__(self, other):
+ return self.name < other.name and self.value < other.name
+
+
+class Metric(object):
+ def __init__(self, metric_name, namespace, dimensions):
+ self.metric_name = metric_name
+ self.namespace = namespace
+ self.dimensions = dimensions
+
+
+class MetricStat(object):
+ def __init__(self, metric, period, stat, unit):
+ self.metric = metric
+ self.period = period
+ self.stat = stat
+ self.unit = unit
+
+
+class MetricDataQuery(object):
+ def __init__(
+ self, query_id, label, period, return_data, expression=None, metric_stat=None
+ ):
+ self.id = query_id
+ self.label = label
+ self.period = period
+ self.return_data = return_data
+ self.expression = expression
+ self.metric_stat = metric_stat
+
+
+def daterange(start, stop, step=timedelta(days=1), inclusive=False):
+ """
+ This method will iterate from `start` to `stop` datetimes with a timedelta step of `step`
+ (supports iteration forwards or backwards in time)
+
+ :param start: start datetime
+ :param stop: end datetime
+ :param step: step size as a timedelta
+ :param inclusive: if True, last item returned will be as step closest to `end` (or `end` if no remainder).
+ """
+
+ # inclusive=False to behave like range by default
+ total_step_secs = step.total_seconds()
+ assert total_step_secs != 0
+
+ if total_step_secs > 0:
+ while start < stop:
+ yield start
+ start = start + step
+ else:
+ while stop < start:
+ yield start
+ start = start + step
+
+ if inclusive and start == stop:
+ yield start
+
+
+class FakeAlarm(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ name,
+ namespace,
+ metric_name,
+ metric_data_queries,
+ comparison_operator,
+ evaluation_periods,
+ datapoints_to_alarm,
+ period,
+ threshold,
+ statistic,
+ extended_statistic,
+ description,
+ dimensions,
+ alarm_actions,
+ ok_actions,
+ insufficient_data_actions,
+ unit,
+ actions_enabled,
+ treat_missing_data,
+ evaluate_low_sample_count_percentile,
+ threshold_metric_id,
+ rule=None,
+ ):
+ self.region_name = region_name
+ self.name = name
+ self.alarm_arn = make_arn_for_alarm(region_name, get_account_id(), name)
+ self.namespace = namespace
+ self.metric_name = metric_name
+ self.metric_data_queries = metric_data_queries
+ self.comparison_operator = comparison_operator
+ self.evaluation_periods = evaluation_periods
+ self.datapoints_to_alarm = datapoints_to_alarm
+ self.period = period
+ self.threshold = threshold
+ self.statistic = statistic
+ self.extended_statistic = extended_statistic
+ self.description = description
+ self.dimensions = [
+ Dimension(dimension["name"], dimension["value"]) for dimension in dimensions
+ ]
+ self.actions_enabled = True if actions_enabled is None else actions_enabled
+ self.alarm_actions = alarm_actions
+ self.ok_actions = ok_actions
+ self.insufficient_data_actions = insufficient_data_actions
+ self.unit = unit
+ self.configuration_updated_timestamp = iso_8601_datetime_with_nanoseconds(
+ datetime.now(tz=tzutc())
+ )
+ self.treat_missing_data = treat_missing_data
+ self.evaluate_low_sample_count_percentile = evaluate_low_sample_count_percentile
+ self.threshold_metric_id = threshold_metric_id
+
+ self.history = []
+
+ self.state_reason = "Unchecked: Initial alarm creation"
+ self.state_reason_data = "{}"
+ self.state_value = "OK"
+ self.state_updated_timestamp = iso_8601_datetime_with_nanoseconds(
+ datetime.now(tz=tzutc())
+ )
+
+ # only used for composite alarms
+ self.rule = rule
+
+ def update_state(self, reason, reason_data, state_value):
+ # History type, that then decides what the rest of the items are, can be one of ConfigurationUpdate | StateUpdate | Action
+ self.history.append(
+ (
+ "StateUpdate",
+ self.state_reason,
+ self.state_reason_data,
+ self.state_value,
+ self.state_updated_timestamp,
+ )
+ )
+
+ self.state_reason = reason
+ self.state_reason_data = reason_data
+ self.state_value = state_value
+ self.state_updated_timestamp = iso_8601_datetime_with_nanoseconds(
+ datetime.now(tz=tzutc())
+ )
+
+
+def are_dimensions_same(metric_dimensions, dimensions):
+ if len(metric_dimensions) != len(dimensions):
+ return False
+ for dimension in metric_dimensions:
+ for new_dimension in dimensions:
+ if (
+ dimension.name != new_dimension.name
+ or dimension.value != new_dimension.value
+ ):
+ return False
+ return True
+
+
+class MetricDatum(BaseModel):
+ def __init__(self, namespace, name, value, dimensions, timestamp, unit=None):
+ self.namespace = namespace
+ self.name = name
+ self.value = value
+ self.timestamp = timestamp or datetime.utcnow().replace(tzinfo=tzutc())
+ self.dimensions = [
+ Dimension(dimension["Name"], dimension["Value"]) for dimension in dimensions
+ ]
+ self.unit = unit
+
+ def filter(self, namespace, name, dimensions, already_present_metrics=None):
+ if namespace and namespace != self.namespace:
+ return False
+ if name and name != self.name:
+ return False
+
+ for metric in already_present_metrics or []:
+ if (
+ (
+ self.dimensions
+ and are_dimensions_same(metric.dimensions, self.dimensions)
+ )
+ and self.name == metric.name
+ and self.namespace == metric.namespace
+ ): # should be considered as already present only when name, namespace and dimensions all three are same
+ return False
+
+ if dimensions and any(
+ Dimension(d["Name"], d.get("Value")) not in self.dimensions
+ for d in dimensions
+ ):
+ return False
+ return True
+
+
+class Dashboard(BaseModel):
+ def __init__(self, name, body):
+ # Guaranteed to be unique for now as the name is also the key of a dictionary where they are stored
+ self.arn = make_arn_for_dashboard(get_account_id(), name)
+ self.name = name
+ self.body = body
+ self.last_modified = datetime.now()
+
+ @property
+ def last_modified_iso(self):
+ return self.last_modified.isoformat()
+
+ @property
+ def size(self):
+ return len(self)
+
+ def __len__(self):
+ return len(self.body)
+
+ def __repr__(self):
+ return "<CloudWatchDashboard {0}>".format(self.name)
+
+
+class Statistics:
+ def __init__(self, stats, dt):
+ self.timestamp = iso_8601_datetime_without_milliseconds(dt)
+ self.values = []
+ self.stats = stats
+ self.unit = None
+
+ @property
+ def sample_count(self):
+ if "SampleCount" not in self.stats:
+ return None
+
+ return len(self.values)
+
+ @property
+ def sum(self):
+ if "Sum" not in self.stats:
+ return None
+
+ return sum(self.values)
+
+ @property
+ def minimum(self):
+ if "Minimum" not in self.stats:
+ return None
+
+ return min(self.values)
+
+ @property
+ def maximum(self):
+ if "Maximum" not in self.stats:
+ return None
+
+ return max(self.values)
+
+ @property
+ def average(self):
+ if "Average" not in self.stats:
+ return None
+
+ # when moto is 3.4+ we can switch to the statistics module
+ return sum(self.values) / len(self.values)
+
+
+class CloudWatchBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.alarms = {}
+ self.dashboards = {}
+ self.metric_data = []
+ self.paged_metric_data = {}
+ self.tagger = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "monitoring"
+ )
+
+ @property
+ # Retrieve a list of all OOTB metrics that are provided by metrics providers
+ # Computed on the fly
+ def aws_metric_data(self):
+ providers = CloudWatchMetricProvider.__subclasses__()
+ md = []
+ for provider in providers:
+ md.extend(provider.get_cloudwatch_metrics())
+ return md
+
+ def put_metric_alarm(
+ self,
+ name,
+ namespace,
+ metric_name,
+ metric_data_queries,
+ comparison_operator,
+ evaluation_periods,
+ datapoints_to_alarm,
+ period,
+ threshold,
+ statistic,
+ extended_statistic,
+ description,
+ dimensions,
+ alarm_actions,
+ ok_actions,
+ insufficient_data_actions,
+ unit,
+ actions_enabled,
+ treat_missing_data,
+ evaluate_low_sample_count_percentile,
+ threshold_metric_id,
+ rule=None,
+ tags=None,
+ ):
+ if extended_statistic and not extended_statistic.startswith("p"):
+ raise InvalidParameterValue(
+ f"The value {extended_statistic} for parameter ExtendedStatistic is not supported."
+ )
+ if (
+ evaluate_low_sample_count_percentile
+ and evaluate_low_sample_count_percentile not in ("evaluate", "ignore")
+ ):
+ raise ValidationError(
+ f"Option {evaluate_low_sample_count_percentile} is not supported. "
+ "Supported options for parameter EvaluateLowSampleCountPercentile are evaluate and ignore."
+ )
+
+ alarm = FakeAlarm(
+ region_name=self.region_name,
+ name=name,
+ namespace=namespace,
+ metric_name=metric_name,
+ metric_data_queries=metric_data_queries,
+ comparison_operator=comparison_operator,
+ evaluation_periods=evaluation_periods,
+ datapoints_to_alarm=datapoints_to_alarm,
+ period=period,
+ threshold=threshold,
+ statistic=statistic,
+ extended_statistic=extended_statistic,
+ description=description,
+ dimensions=dimensions,
+ alarm_actions=alarm_actions,
+ ok_actions=ok_actions,
+ insufficient_data_actions=insufficient_data_actions,
+ unit=unit,
+ actions_enabled=actions_enabled,
+ treat_missing_data=treat_missing_data,
+ evaluate_low_sample_count_percentile=evaluate_low_sample_count_percentile,
+ threshold_metric_id=threshold_metric_id,
+ rule=rule,
+ )
+
+ self.alarms[name] = alarm
+ self.tagger.tag_resource(alarm.alarm_arn, tags)
+
+ return alarm
+
+ def get_all_alarms(self):
+ return self.alarms.values()
+
+ @staticmethod
+ def _list_element_starts_with(items, needle):
+ """True of any of the list elements starts with needle"""
+ for item in items:
+ if item.startswith(needle):
+ return True
+ return False
+
+ def get_alarms_by_action_prefix(self, action_prefix):
+ return [
+ alarm
+ for alarm in self.alarms.values()
+ if CloudWatchBackend._list_element_starts_with(
+ alarm.alarm_actions, action_prefix
+ )
+ ]
+
+ def get_alarms_by_alarm_name_prefix(self, name_prefix):
+ return [
+ alarm
+ for alarm in self.alarms.values()
+ if alarm.name.startswith(name_prefix)
+ ]
+
+ def get_alarms_by_alarm_names(self, alarm_names):
+ return [alarm for alarm in self.alarms.values() if alarm.name in alarm_names]
+
+ def get_alarms_by_state_value(self, target_state):
+ return filter(
+ lambda alarm: alarm.state_value == target_state, self.alarms.values()
+ )
+
+ def delete_alarms(self, alarm_names):
+ for alarm_name in alarm_names:
+ self.alarms.pop(alarm_name, None)
+
+ def put_metric_data(self, namespace, metric_data):
+ for i, metric in enumerate(metric_data):
+ if metric.get("Value") == "NaN":
+ raise InvalidParameterValue(
+ f"The value NaN for parameter MetricData.member.{i + 1}.Value is invalid."
+ )
+
+ for metric_member in metric_data:
+ # Preserve "datetime" for get_metric_statistics comparisons
+ timestamp = metric_member.get("Timestamp")
+ if timestamp is not None and type(timestamp) != datetime:
+ timestamp = parser.parse(timestamp)
+ self.metric_data.append(
+ MetricDatum(
+ namespace,
+ metric_member["MetricName"],
+ float(metric_member.get("Value", 0)),
+ metric_member.get("Dimensions.member", _EMPTY_LIST),
+ timestamp,
+ metric_member.get("Unit"),
+ )
+ )
+
+ def get_metric_data(
+ self, queries, start_time, end_time, scan_by="TimestampAscending"
+ ):
+
+ period_data = [
+ md for md in self.metric_data if start_time <= md.timestamp <= end_time
+ ]
+
+ results = []
+ for query in queries:
+ period_start_time = start_time
+ query_ns = query["metric_stat._metric._namespace"]
+ query_name = query["metric_stat._metric._metric_name"]
+ delta = timedelta(seconds=int(query["metric_stat._period"]))
+ dimensions = self._extract_dimensions_from_get_metric_data_query(query)
+ result_vals = []
+ timestamps = []
+ stat = query["metric_stat._stat"]
+ while period_start_time <= end_time:
+ period_end_time = period_start_time + delta
+ period_md = [
+ period_md
+ for period_md in period_data
+ if period_start_time <= period_md.timestamp < period_end_time
+ ]
+
+ query_period_data = [
+ md
+ for md in period_md
+ if md.namespace == query_ns and md.name == query_name
+ ]
+ if dimensions:
+ query_period_data = [
+ md
+ for md in period_md
+ if sorted(md.dimensions) == sorted(dimensions)
+ and md.name == query_name
+ ]
+
+ metric_values = [m.value for m in query_period_data]
+
+ if len(metric_values) > 0:
+ if stat == "SampleCount":
+ result_vals.append(len(metric_values))
+ elif stat == "Average":
+ result_vals.append(sum(metric_values) / len(metric_values))
+ elif stat == "Minimum":
+ result_vals.append(min(metric_values))
+ elif stat == "Maximum":
+ result_vals.append(max(metric_values))
+ elif stat == "Sum":
+ result_vals.append(sum(metric_values))
+ timestamps.append(
+ iso_8601_datetime_without_milliseconds(period_start_time)
+ )
+ period_start_time += delta
+ if scan_by == "TimestampDescending" and len(timestamps) > 0:
+ timestamps.reverse()
+ result_vals.reverse()
+ label = query["metric_stat._metric._metric_name"] + " " + stat
+ results.append(
+ {
+ "id": query["id"],
+ "label": label,
+ "vals": result_vals,
+ "timestamps": timestamps,
+ }
+ )
+ return results
+
+ def get_metric_statistics(
+ self,
+ namespace,
+ metric_name,
+ start_time,
+ end_time,
+ period,
+ stats,
+ dimensions,
+ unit=None,
+ ):
+ period_delta = timedelta(seconds=period)
+ # TODO: Also filter by unit and dimensions
+ filtered_data = [
+ md
+ for md in self.get_all_metrics()
+ if md.namespace == namespace
+ and md.name == metric_name
+ and start_time <= md.timestamp <= end_time
+ ]
+
+ if unit:
+ filtered_data = [md for md in filtered_data if md.unit == unit]
+ if dimensions:
+ filtered_data = [
+ md for md in filtered_data if md.filter(None, None, dimensions)
+ ]
+
+ # earliest to oldest
+ filtered_data = sorted(filtered_data, key=lambda x: x.timestamp)
+ if not filtered_data:
+ return []
+
+ idx = 0
+ data = list()
+ for dt in daterange(
+ filtered_data[0].timestamp,
+ filtered_data[-1].timestamp + period_delta,
+ period_delta,
+ ):
+ s = Statistics(stats, dt)
+ while idx < len(filtered_data) and filtered_data[idx].timestamp < (
+ dt + period_delta
+ ):
+ s.values.append(filtered_data[idx].value)
+ s.unit = filtered_data[idx].unit
+ idx += 1
+
+ if not s.values:
+ continue
+
+ data.append(s)
+
+ return data
+
+ def get_all_metrics(self):
+ return self.metric_data + self.aws_metric_data
+
+ def put_dashboard(self, name, body):
+ self.dashboards[name] = Dashboard(name, body)
+
+ def list_dashboards(self, prefix=""):
+ for key, value in self.dashboards.items():
+ if key.startswith(prefix):
+ yield value
+
+ def delete_dashboards(self, dashboards):
+ to_delete = set(dashboards)
+ all_dashboards = set(self.dashboards.keys())
+
+ left_over = to_delete - all_dashboards
+ if len(left_over) > 0:
+ # Some dashboards are not found
+ return (
+ False,
+ "The specified dashboard does not exist. [{0}]".format(
+ ", ".join(left_over)
+ ),
+ )
+
+ for dashboard in to_delete:
+ del self.dashboards[dashboard]
+
+ return True, None
+
+ def get_dashboard(self, dashboard):
+ return self.dashboards.get(dashboard)
+
+ def set_alarm_state(self, alarm_name, reason, reason_data, state_value):
+ try:
+ if reason_data is not None:
+ json.loads(reason_data)
+ except ValueError:
+ raise InvalidFormat("Unknown")
+
+ if alarm_name not in self.alarms:
+ raise ResourceNotFound
+
+ if state_value not in ("OK", "ALARM", "INSUFFICIENT_DATA"):
+ raise ValidationError(
+ "1 validation error detected: "
+ f"Value '{state_value}' at 'stateValue' failed to satisfy constraint: "
+ "Member must satisfy enum value set: [INSUFFICIENT_DATA, ALARM, OK]"
+ )
+
+ self.alarms[alarm_name].update_state(reason, reason_data, state_value)
+
+ def list_metrics(self, next_token, namespace, metric_name, dimensions):
+ if next_token:
+ if next_token not in self.paged_metric_data:
+ raise InvalidParameterValue("Request parameter NextToken is invalid")
+ else:
+ metrics = self.paged_metric_data[next_token]
+ del self.paged_metric_data[next_token] # Cant reuse same token twice
+ return self._get_paginated(metrics)
+ else:
+ metrics = self.get_filtered_metrics(metric_name, namespace, dimensions)
+ return self._get_paginated(metrics)
+
+ def get_filtered_metrics(self, metric_name, namespace, dimensions):
+ metrics = self.get_all_metrics()
+ new_metrics = []
+ for md in metrics:
+ if md.filter(
+ namespace=namespace,
+ name=metric_name,
+ dimensions=dimensions,
+ already_present_metrics=new_metrics,
+ ):
+ new_metrics.append(md)
+ return new_metrics
+
+ def list_tags_for_resource(self, arn):
+ return self.tagger.get_tag_dict_for_resource(arn)
+
+ def tag_resource(self, arn, tags):
+ if arn not in self.tagger.tags.keys():
+ raise ResourceNotFoundException
+
+ self.tagger.tag_resource(arn, tags)
+
+ def untag_resource(self, arn, tag_keys):
+ if arn not in self.tagger.tags.keys():
+ raise ResourceNotFoundException
+
+ self.tagger.untag_resource_using_names(arn, tag_keys)
+
+ def _get_paginated(self, metrics):
+ if len(metrics) > 500:
+ next_token = str(uuid4())
+ self.paged_metric_data[next_token] = metrics[500:]
+ return next_token, metrics[0:500]
+ else:
+ return None, metrics
+
+ def _extract_dimensions_from_get_metric_data_query(self, query):
+ dimensions = []
+ prefix = "metric_stat._metric._dimensions.member."
+ suffix_name = "._name"
+ suffix_value = "._value"
+ counter = 1
+
+ while query.get(f"{prefix}{counter}{suffix_name}") and counter <= 10:
+ name = query.get(f"{prefix}{counter}{suffix_name}")
+ value = query.get(f"{prefix}{counter}{suffix_value}")
+ dimensions.append(Dimension(name=name, value=value))
+ counter = counter + 1
+
+ return dimensions
+
+
+cloudwatch_backends = BackendDict(CloudWatchBackend, "cloudwatch")
diff --git a/contrib/python/moto/py3/moto/cloudwatch/responses.py b/contrib/python/moto/py3/moto/cloudwatch/responses.py
new file mode 100644
index 0000000000..778e533bf6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/responses.py
@@ -0,0 +1,737 @@
+import json
+
+from dateutil.parser import parse as dtparse
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import cloudwatch_backends, MetricDataQuery, MetricStat, Metric, Dimension
+from .exceptions import InvalidParameterCombination
+
+
+class CloudWatchResponse(BaseResponse):
+ @property
+ def cloudwatch_backend(self):
+ return cloudwatch_backends[self.region]
+
+ def _error(self, code, message, status=400):
+ template = self.response_template(ERROR_RESPONSE_TEMPLATE)
+ return template.render(code=code, message=message), dict(status=status)
+
+ @amzn_request_id
+ def put_metric_alarm(self):
+ name = self._get_param("AlarmName")
+ namespace = self._get_param("Namespace")
+ metric_name = self._get_param("MetricName")
+ metrics = self._get_multi_param("Metrics.member", skip_result_conversion=True)
+ metric_data_queries = None
+ if metrics:
+ metric_data_queries = []
+ for metric in metrics:
+ dimensions = []
+ dims = (
+ metric.get("MetricStat", {})
+ .get("Metric", {})
+ .get("Dimensions.member", [])
+ )
+ for dim in dims:
+ dimensions.append(
+ Dimension(name=dim.get("Name"), value=dim.get("Value"))
+ )
+ metric_stat = None
+ stat_metric_name = (
+ metric.get("MetricStat", {}).get("Metric", {}).get("MetricName")
+ )
+ if stat_metric_name:
+ stat_details = metric.get("MetricStat", {})
+ stat_metric_ns = stat_details.get("Metric", {}).get("Namespace")
+ metric_stat = MetricStat(
+ metric=Metric(
+ metric_name=stat_metric_name,
+ namespace=stat_metric_ns,
+ dimensions=dimensions,
+ ),
+ period=stat_details.get("Period"),
+ stat=stat_details.get("Stat"),
+ unit=stat_details.get("Unit"),
+ )
+ metric_data_queries.append(
+ MetricDataQuery(
+ query_id=metric.get("Id"),
+ label=metric.get("Label"),
+ period=metric.get("Period"),
+ return_data=metric.get("ReturnData"),
+ expression=metric.get("Expression"),
+ metric_stat=metric_stat,
+ )
+ )
+
+ comparison_operator = self._get_param("ComparisonOperator")
+ evaluation_periods = self._get_param("EvaluationPeriods")
+ datapoints_to_alarm = self._get_param("DatapointsToAlarm")
+ period = self._get_param("Period")
+ threshold = self._get_param("Threshold")
+ statistic = self._get_param("Statistic")
+ extended_statistic = self._get_param("ExtendedStatistic")
+ description = self._get_param("AlarmDescription")
+ dimensions = self._get_list_prefix("Dimensions.member")
+ alarm_actions = self._get_multi_param("AlarmActions.member")
+ ok_actions = self._get_multi_param("OKActions.member")
+ actions_enabled = self._get_param("ActionsEnabled")
+ insufficient_data_actions = self._get_multi_param(
+ "InsufficientDataActions.member"
+ )
+ unit = self._get_param("Unit")
+ treat_missing_data = self._get_param("TreatMissingData")
+ evaluate_low_sample_count_percentile = self._get_param(
+ "EvaluateLowSampleCountPercentile"
+ )
+ threshold_metric_id = self._get_param("ThresholdMetricId")
+ # fetch AlarmRule to re-use this method for composite alarms as well
+ rule = self._get_param("AlarmRule")
+ tags = self._get_multi_param("Tags.member")
+ alarm = self.cloudwatch_backend.put_metric_alarm(
+ name=name,
+ namespace=namespace,
+ metric_name=metric_name,
+ metric_data_queries=metric_data_queries,
+ comparison_operator=comparison_operator,
+ evaluation_periods=evaluation_periods,
+ datapoints_to_alarm=datapoints_to_alarm,
+ period=period,
+ threshold=threshold,
+ statistic=statistic,
+ extended_statistic=extended_statistic,
+ description=description,
+ dimensions=dimensions,
+ alarm_actions=alarm_actions,
+ ok_actions=ok_actions,
+ insufficient_data_actions=insufficient_data_actions,
+ unit=unit,
+ actions_enabled=actions_enabled,
+ treat_missing_data=treat_missing_data,
+ evaluate_low_sample_count_percentile=evaluate_low_sample_count_percentile,
+ threshold_metric_id=threshold_metric_id,
+ rule=rule,
+ tags=tags,
+ )
+ template = self.response_template(PUT_METRIC_ALARM_TEMPLATE)
+ return template.render(alarm=alarm)
+
+ @amzn_request_id
+ def describe_alarms(self):
+ action_prefix = self._get_param("ActionPrefix")
+ alarm_name_prefix = self._get_param("AlarmNamePrefix")
+ alarm_names = self._get_multi_param("AlarmNames.member")
+ state_value = self._get_param("StateValue")
+
+ if action_prefix:
+ alarms = self.cloudwatch_backend.get_alarms_by_action_prefix(action_prefix)
+ elif alarm_name_prefix:
+ alarms = self.cloudwatch_backend.get_alarms_by_alarm_name_prefix(
+ alarm_name_prefix
+ )
+ elif alarm_names:
+ alarms = self.cloudwatch_backend.get_alarms_by_alarm_names(alarm_names)
+ elif state_value:
+ alarms = self.cloudwatch_backend.get_alarms_by_state_value(state_value)
+ else:
+ alarms = self.cloudwatch_backend.get_all_alarms()
+
+ metric_alarms = [a for a in alarms if a.rule is None]
+ composite_alarms = [a for a in alarms if a.rule is not None]
+
+ template = self.response_template(DESCRIBE_ALARMS_TEMPLATE)
+ return template.render(
+ metric_alarms=metric_alarms, composite_alarms=composite_alarms
+ )
+
+ @amzn_request_id
+ def delete_alarms(self):
+ alarm_names = self._get_multi_param("AlarmNames.member")
+ self.cloudwatch_backend.delete_alarms(alarm_names)
+ template = self.response_template(DELETE_METRIC_ALARMS_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def put_metric_data(self):
+ namespace = self._get_param("Namespace")
+ metric_data = self._get_multi_param("MetricData.member")
+ self.cloudwatch_backend.put_metric_data(namespace, metric_data)
+ template = self.response_template(PUT_METRIC_DATA_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def get_metric_data(self):
+ start = dtparse(self._get_param("StartTime"))
+ end = dtparse(self._get_param("EndTime"))
+ scan_by = self._get_param("ScanBy")
+
+ queries = self._get_list_prefix("MetricDataQueries.member")
+ results = self.cloudwatch_backend.get_metric_data(
+ start_time=start, end_time=end, queries=queries, scan_by=scan_by
+ )
+
+ template = self.response_template(GET_METRIC_DATA_TEMPLATE)
+ return template.render(results=results)
+
+ @amzn_request_id
+ def get_metric_statistics(self):
+ namespace = self._get_param("Namespace")
+ metric_name = self._get_param("MetricName")
+ start_time = dtparse(self._get_param("StartTime"))
+ end_time = dtparse(self._get_param("EndTime"))
+ period = int(self._get_param("Period"))
+ statistics = self._get_multi_param("Statistics.member")
+ dimensions = self._get_multi_param("Dimensions.member")
+
+ # Unsupported Parameters (To Be Implemented)
+ unit = self._get_param("Unit")
+ extended_statistics = self._get_param("ExtendedStatistics")
+
+ if not statistics and not extended_statistics:
+ raise InvalidParameterCombination(
+ "Must specify either Statistics or ExtendedStatistics"
+ )
+
+ datapoints = self.cloudwatch_backend.get_metric_statistics(
+ namespace,
+ metric_name,
+ start_time,
+ end_time,
+ period,
+ statistics,
+ unit=unit,
+ dimensions=dimensions,
+ )
+ template = self.response_template(GET_METRIC_STATISTICS_TEMPLATE)
+ return template.render(label=metric_name, datapoints=datapoints)
+
+ @amzn_request_id
+ def list_metrics(self):
+ namespace = self._get_param("Namespace")
+ metric_name = self._get_param("MetricName")
+ dimensions = self._get_params().get("Dimensions", [])
+ next_token = self._get_param("NextToken")
+ next_token, metrics = self.cloudwatch_backend.list_metrics(
+ next_token, namespace, metric_name, dimensions
+ )
+ template = self.response_template(LIST_METRICS_TEMPLATE)
+ return template.render(metrics=metrics, next_token=next_token)
+
+ @amzn_request_id
+ def delete_dashboards(self):
+ dashboards = self._get_multi_param("DashboardNames.member")
+ if dashboards is None:
+ return self._error("InvalidParameterValue", "Need at least 1 dashboard")
+
+ status, error = self.cloudwatch_backend.delete_dashboards(dashboards)
+ if not status:
+ return self._error("ResourceNotFound", error)
+
+ template = self.response_template(DELETE_DASHBOARD_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def describe_alarm_history(self):
+ raise NotImplementedError()
+
+ @staticmethod
+ def filter_alarms(alarms, metric_name, namespace):
+ metric_filtered_alarms = []
+
+ for alarm in alarms:
+ if alarm.metric_name == metric_name and alarm.namespace == namespace:
+ metric_filtered_alarms.append(alarm)
+ return metric_filtered_alarms
+
+ @amzn_request_id
+ def describe_alarms_for_metric(self):
+ alarms = self.cloudwatch_backend.get_all_alarms()
+ namespace = self._get_param("Namespace")
+ metric_name = self._get_param("MetricName")
+ filtered_alarms = self.filter_alarms(alarms, metric_name, namespace)
+ template = self.response_template(DESCRIBE_METRIC_ALARMS_TEMPLATE)
+ return template.render(alarms=filtered_alarms)
+
+ @amzn_request_id
+ def disable_alarm_actions(self):
+ raise NotImplementedError()
+
+ @amzn_request_id
+ def enable_alarm_actions(self):
+ raise NotImplementedError()
+
+ @amzn_request_id
+ def get_dashboard(self):
+ dashboard_name = self._get_param("DashboardName")
+
+ dashboard = self.cloudwatch_backend.get_dashboard(dashboard_name)
+ if dashboard is None:
+ return self._error("ResourceNotFound", "Dashboard does not exist")
+
+ template = self.response_template(GET_DASHBOARD_TEMPLATE)
+ return template.render(dashboard=dashboard)
+
+ @amzn_request_id
+ def list_dashboards(self):
+ prefix = self._get_param("DashboardNamePrefix", "")
+
+ dashboards = self.cloudwatch_backend.list_dashboards(prefix)
+
+ template = self.response_template(LIST_DASHBOARD_RESPONSE)
+ return template.render(dashboards=dashboards)
+
+ @amzn_request_id
+ def put_dashboard(self):
+ name = self._get_param("DashboardName")
+ body = self._get_param("DashboardBody")
+
+ try:
+ json.loads(body)
+ except ValueError:
+ return self._error("InvalidParameterInput", "Body is invalid JSON")
+
+ self.cloudwatch_backend.put_dashboard(name, body)
+
+ template = self.response_template(PUT_DASHBOARD_RESPONSE)
+ return template.render()
+
+ @amzn_request_id
+ def set_alarm_state(self):
+ alarm_name = self._get_param("AlarmName")
+ reason = self._get_param("StateReason")
+ reason_data = self._get_param("StateReasonData")
+ state_value = self._get_param("StateValue")
+
+ self.cloudwatch_backend.set_alarm_state(
+ alarm_name, reason, reason_data, state_value
+ )
+
+ template = self.response_template(SET_ALARM_STATE_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def list_tags_for_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+
+ tags = self.cloudwatch_backend.list_tags_for_resource(resource_arn)
+
+ template = self.response_template(LIST_TAGS_FOR_RESOURCE_TEMPLATE)
+ return template.render(tags=tags)
+
+ @amzn_request_id
+ def tag_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+ tags = self._get_multi_param("Tags.member")
+
+ self.cloudwatch_backend.tag_resource(resource_arn, tags)
+
+ template = self.response_template(TAG_RESOURCE_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def untag_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ self.cloudwatch_backend.untag_resource(resource_arn, tag_keys)
+
+ template = self.response_template(UNTAG_RESOURCE_TEMPLATE)
+ return template.render()
+
+
+PUT_METRIC_ALARM_TEMPLATE = """<PutMetricAlarmResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ResponseMetadata>
+ <RequestId>
+ {{ request_id }}
+ </RequestId>
+ </ResponseMetadata>
+</PutMetricAlarmResponse>"""
+
+DESCRIBE_ALARMS_TEMPLATE = """<DescribeAlarmsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <DescribeAlarmsResult>
+ {% for tag_name, alarms in (('MetricAlarms', metric_alarms), ('CompositeAlarms', composite_alarms)) %}
+ <{{tag_name}}>
+ {% for alarm in alarms %}
+ <member>
+ <ActionsEnabled>{{ alarm.actions_enabled }}</ActionsEnabled>
+ <AlarmActions>
+ {% for action in alarm.alarm_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </AlarmActions>
+ <AlarmArn>{{ alarm.alarm_arn }}</AlarmArn>
+ <AlarmConfigurationUpdatedTimestamp>{{ alarm.configuration_updated_timestamp }}</AlarmConfigurationUpdatedTimestamp>
+ <AlarmDescription>{{ alarm.description or '' }}</AlarmDescription>
+ <AlarmName>{{ alarm.name }}</AlarmName>
+ <ComparisonOperator>{{ alarm.comparison_operator }}</ComparisonOperator>
+ {% if alarm.dimensions is not none %}
+ <Dimensions>
+ {% for dimension in alarm.dimensions %}
+ <member>
+ <Name>{{ dimension.name }}</Name>
+ <Value>{{ dimension.value }}</Value>
+ </member>
+ {% endfor %}
+ </Dimensions>
+ {% endif %}
+ <EvaluationPeriods>{{ alarm.evaluation_periods }}</EvaluationPeriods>
+ {% if alarm.datapoints_to_alarm is not none %}
+ <DatapointsToAlarm>{{ alarm.datapoints_to_alarm }}</DatapointsToAlarm>
+ {% endif %}
+ <InsufficientDataActions>
+ {% for action in alarm.insufficient_data_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </InsufficientDataActions>
+ {% if alarm.metric_name is not none %}
+ <MetricName>{{ alarm.metric_name }}</MetricName>
+ {% endif %}
+ {% if alarm.metric_data_queries is not none %}
+ <Metrics>
+ {% for metric in alarm.metric_data_queries %}
+ <member>
+ <Id>{{ metric.id }}</Id>
+ {% if metric.label is not none %}
+ <Label>{{ metric.label }}</Label>
+ {% endif %}
+ {% if metric.expression is not none %}
+ <Expression>{{ metric.expression }}</Expression>
+ {% endif %}
+ {% if metric.metric_stat is not none %}
+ <MetricStat>
+ <Metric>
+ <Namespace>{{ metric.metric_stat.metric.namespace }}</Namespace>
+ <MetricName>{{ metric.metric_stat.metric.metric_name }}</MetricName>
+ <Dimensions>
+ {% for dim in metric.metric_stat.metric.dimensions %}
+ <member>
+ <Name>{{ dim.name }}</Name>
+ <Value>{{ dim.value }}</Value>
+ </member>
+ {% endfor %}
+ </Dimensions>
+ </Metric>
+ {% if metric.metric_stat.period is not none %}
+ <Period>{{ metric.metric_stat.period }}</Period>
+ {% endif %}
+ <Stat>{{ metric.metric_stat.stat }}</Stat>
+ {% if metric.metric_stat.unit is not none %}
+ <Unit>{{ metric.metric_stat.unit }}</Unit>
+ {% endif %}
+ </MetricStat>
+ {% endif %}
+ {% if metric.period is not none %}
+ <Period>{{ metric.period }}</Period>
+ {% endif %}
+ <ReturnData>{{ metric.return_data }}</ReturnData>
+ </member>
+ {% endfor %}
+ </Metrics>
+ {% endif %}
+ {% if alarm.namespace is not none %}
+ <Namespace>{{ alarm.namespace }}</Namespace>
+ {% endif %}
+ <OKActions>
+ {% for action in alarm.ok_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </OKActions>
+ {% if alarm.period is not none %}
+ <Period>{{ alarm.period }}</Period>
+ {% endif %}
+ <StateReason>{{ alarm.state_reason }}</StateReason>
+ <StateReasonData>{{ alarm.state_reason_data }}</StateReasonData>
+ <StateUpdatedTimestamp>{{ alarm.state_updated_timestamp }}</StateUpdatedTimestamp>
+ <StateValue>{{ alarm.state_value }}</StateValue>
+ {% if alarm.statistic is not none %}
+ <Statistic>{{ alarm.statistic }}</Statistic>
+ {% endif %}
+ {% if alarm.extended_statistic is not none %}
+ <ExtendedStatistic>{{ alarm.extended_statistic }}</ExtendedStatistic>
+ {% endif %}
+ {% if alarm.threshold is not none %}
+ <Threshold>{{ alarm.threshold }}</Threshold>
+ {% endif %}
+ {% if alarm.unit is not none %}
+ <Unit>{{ alarm.unit }}</Unit>
+ {% endif %}
+ {% if alarm.treat_missing_data is not none %}
+ <TreatMissingData>{{ alarm.treat_missing_data }}</TreatMissingData>
+ {% endif %}
+ {% if alarm.evaluate_low_sample_count_percentile is not none %}
+ <EvaluateLowSampleCountPercentile>{{ alarm.evaluate_low_sample_count_percentile }}</EvaluateLowSampleCountPercentile>
+ {% endif %}
+ {% if alarm.threshold_metric_id is not none %}
+ <ThresholdMetricId>{{ alarm.threshold_metric_id }}</ThresholdMetricId>
+ {% endif %}
+ {% if alarm.rule is not none %}
+ <AlarmRule>{{ alarm.rule }}</AlarmRule>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </{{tag_name}}>
+ {% endfor %}
+ </DescribeAlarmsResult>
+</DescribeAlarmsResponse>"""
+
+DESCRIBE_METRIC_ALARMS_TEMPLATE = """<DescribeAlarmsForMetricResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <DescribeAlarmsForMetricResult>
+ <MetricAlarms>
+ {% for alarm in alarms %}
+ <member>
+ <ActionsEnabled>{{ alarm.actions_enabled }}</ActionsEnabled>
+ <AlarmActions>
+ {% for action in alarm.alarm_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </AlarmActions>
+ <AlarmArn>{{ alarm.alarm_arn }}</AlarmArn>
+ <AlarmConfigurationUpdatedTimestamp>{{ alarm.configuration_updated_timestamp }}</AlarmConfigurationUpdatedTimestamp>
+ <AlarmDescription>{{ alarm.description }}</AlarmDescription>
+ <AlarmName>{{ alarm.name }}</AlarmName>
+ <ComparisonOperator>{{ alarm.comparison_operator }}</ComparisonOperator>
+ <Dimensions>
+ {% for dimension in alarm.dimensions %}
+ <member>
+ <Name>{{ dimension.name }}</Name>
+ <Value>{{ dimension.value }}</Value>
+ </member>
+ {% endfor %}
+ </Dimensions>
+ <EvaluationPeriods>{{ alarm.evaluation_periods }}</EvaluationPeriods>
+ <InsufficientDataActions>
+ {% for action in alarm.insufficient_data_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </InsufficientDataActions>
+ <MetricName>{{ alarm.metric_name }}</MetricName>
+ <Namespace>{{ alarm.namespace }}</Namespace>
+ <OKActions>
+ {% for action in alarm.ok_actions %}
+ <member>{{ action }}</member>
+ {% endfor %}
+ </OKActions>
+ <Period>{{ alarm.period }}</Period>
+ <StateReason>{{ alarm.state_reason }}</StateReason>
+ <StateReasonData>{{ alarm.state_reason_data }}</StateReasonData>
+ <StateUpdatedTimestamp>{{ alarm.state_updated_timestamp }}</StateUpdatedTimestamp>
+ <StateValue>{{ alarm.state_value }}</StateValue>
+ <Statistic>{{ alarm.statistic }}</Statistic>
+ {% if alarm.threshold is not none %}
+ <Threshold>{{ alarm.threshold }}</Threshold>
+ {% endif %}
+ <Unit>{{ alarm.unit }}</Unit>
+ </member>
+ {% endfor %}
+ </MetricAlarms>
+ </DescribeAlarmsForMetricResult>
+</DescribeAlarmsForMetricResponse>"""
+
+DELETE_METRIC_ALARMS_TEMPLATE = """<DeleteMetricAlarmResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ResponseMetadata>
+ <RequestId>
+ {{ request_id }}
+ </RequestId>
+ </ResponseMetadata>
+</DeleteMetricAlarmResponse>"""
+
+PUT_METRIC_DATA_TEMPLATE = """<PutMetricDataResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ResponseMetadata>
+ <RequestId>
+ {{ request_id }}
+ </RequestId>
+ </ResponseMetadata>
+</PutMetricDataResponse>"""
+
+GET_METRIC_DATA_TEMPLATE = """<GetMetricDataResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <GetMetricDataResult>
+ <MetricDataResults>
+ {% for result in results %}
+ <member>
+ <Id>{{ result.id }}</Id>
+ <Label>{{ result.label }}</Label>
+ <StatusCode>Complete</StatusCode>
+ <Timestamps>
+ {% for val in result.timestamps %}
+ <member>{{ val }}</member>
+ {% endfor %}
+ </Timestamps>
+ <Values>
+ {% for val in result.vals %}
+ <member>{{ val }}</member>
+ {% endfor %}
+ </Values>
+ </member>
+ {% endfor %}
+ </MetricDataResults>
+ </GetMetricDataResult>
+ <ResponseMetadata>
+ <RequestId>
+ {{ request_id }}
+ </RequestId>
+ </ResponseMetadata>
+</GetMetricDataResponse>"""
+
+GET_METRIC_STATISTICS_TEMPLATE = """<GetMetricStatisticsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <GetMetricStatisticsResult>
+ <Label>{{ label }}</Label>
+ <Datapoints>
+ {% for datapoint in datapoints %}
+ <member>
+ {% if datapoint.sum is not none %}
+ <Sum>{{ datapoint.sum }}</Sum>
+ {% endif %}
+
+ {% if datapoint.average is not none %}
+ <Average>{{ datapoint.average }}</Average>
+ {% endif %}
+
+ {% if datapoint.maximum is not none %}
+ <Maximum>{{ datapoint.maximum }}</Maximum>
+ {% endif %}
+
+ {% if datapoint.minimum is not none %}
+ <Minimum>{{ datapoint.minimum }}</Minimum>
+ {% endif %}
+
+ {% if datapoint.sample_count is not none %}
+ <SampleCount>{{ datapoint.sample_count }}</SampleCount>
+ {% endif %}
+
+ {% if datapoint.extended_statistics is not none %}
+ <ExtendedStatistics>{{ datapoint.extended_statistics }}</ExtendedStatistics>
+ {% endif %}
+
+ <Timestamp>{{ datapoint.timestamp }}</Timestamp>
+ {% if datapoint.unit is not none %}
+ <Unit>{{ datapoint.unit }}</Unit>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Datapoints>
+ </GetMetricStatisticsResult>
+ <ResponseMetadata>
+ <RequestId>
+ {{ request_id }}
+ </RequestId>
+ </ResponseMetadata>
+</GetMetricStatisticsResponse>"""
+
+LIST_METRICS_TEMPLATE = """<ListMetricsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ListMetricsResult>
+ <Metrics>
+ {% for metric in metrics %}
+ <member>
+ <Dimensions>
+ {% for dimension in metric.dimensions %}
+ <member>
+ <Name>{{ dimension.name }}</Name>
+ <Value>{{ dimension.value }}</Value>
+ </member>
+ {% endfor %}
+ </Dimensions>
+ <MetricName>{{ metric.name }}</MetricName>
+ <Namespace>{{ metric.namespace }}</Namespace>
+ </member>
+ {% endfor %}
+ </Metrics>
+ {% if next_token is not none %}
+ <NextToken>
+ {{ next_token }}
+ </NextToken>
+ {% endif %}
+ </ListMetricsResult>
+</ListMetricsResponse>"""
+
+PUT_DASHBOARD_RESPONSE = """<PutDashboardResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <PutDashboardResult>
+ <DashboardValidationMessages/>
+ </PutDashboardResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</PutDashboardResponse>"""
+
+LIST_DASHBOARD_RESPONSE = """<ListDashboardsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ListDashboardsResult>
+ <DashboardEntries>
+ {% for dashboard in dashboards %}
+ <member>
+ <DashboardArn>{{ dashboard.arn }}</DashboardArn>
+ <LastModified>{{ dashboard.last_modified_iso }}</LastModified>
+ <Size>{{ dashboard.size }}</Size>
+ <DashboardName>{{ dashboard.name }}</DashboardName>
+ </member>
+ {% endfor %}
+ </DashboardEntries>
+ </ListDashboardsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ListDashboardsResponse>"""
+
+DELETE_DASHBOARD_TEMPLATE = """<DeleteDashboardsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <DeleteDashboardsResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeleteDashboardsResponse>"""
+
+GET_DASHBOARD_TEMPLATE = """<GetDashboardResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <GetDashboardResult>
+ <DashboardArn>{{ dashboard.arn }}</DashboardArn>
+ <DashboardBody>{{ dashboard.body }}</DashboardBody>
+ <DashboardName>{{ dashboard.name }}</DashboardName>
+ </GetDashboardResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</GetDashboardResponse>
+"""
+
+SET_ALARM_STATE_TEMPLATE = """<SetAlarmStateResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetAlarmStateResponse>"""
+
+ERROR_RESPONSE_TEMPLATE = """<ErrorResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ </Error>
+ <RequestId>{{ request_id }}</RequestId>
+</ErrorResponse>"""
+
+LIST_TAGS_FOR_RESOURCE_TEMPLATE = """<ListTagsForResourceResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <ListTagsForResourceResult>
+ <Tags>
+ {% for key, value in tags.items() %}
+ <member>
+ <Key>{{ key }}</Key>
+ <Value>{{ value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </ListTagsForResourceResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ListTagsForResourceResponse>
+"""
+
+TAG_RESOURCE_TEMPLATE = """<TagResourceResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <TagResourceResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</TagResourceResponse>"""
+
+UNTAG_RESOURCE_TEMPLATE = """<UntagResourceResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <UntagResourceResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</UntagResourceResponse>"""
diff --git a/contrib/python/moto/py3/moto/cloudwatch/urls.py b/contrib/python/moto/py3/moto/cloudwatch/urls.py
new file mode 100644
index 0000000000..4ebbaf0da0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/urls.py
@@ -0,0 +1,5 @@
+from .responses import CloudWatchResponse
+
+url_bases = [r"https?://monitoring\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": CloudWatchResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/cloudwatch/utils.py b/contrib/python/moto/py3/moto/cloudwatch/utils.py
new file mode 100644
index 0000000000..da9d93ac08
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cloudwatch/utils.py
@@ -0,0 +1,6 @@
+def make_arn_for_dashboard(account_id, name):
+ return "arn:aws:cloudwatch::{0}dashboard/{1}".format(account_id, name)
+
+
+def make_arn_for_alarm(region, account_id, alarm_name):
+ return "arn:aws:cloudwatch:{0}:{1}:alarm:{2}".format(region, account_id, alarm_name)
diff --git a/contrib/python/moto/py3/moto/codecommit/__init__.py b/contrib/python/moto/py3/moto/codecommit/__init__.py
new file mode 100644
index 0000000000..6c5a8f5adf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codecommit/__init__.py
@@ -0,0 +1,4 @@
+from .models import codecommit_backends
+from ..core.models import base_decorator
+
+mock_codecommit = base_decorator(codecommit_backends)
diff --git a/contrib/python/moto/py3/moto/codecommit/exceptions.py b/contrib/python/moto/py3/moto/codecommit/exceptions.py
new file mode 100644
index 0000000000..8e93dd1ad8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codecommit/exceptions.py
@@ -0,0 +1,35 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class RepositoryNameExistsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name):
+ super().__init__(
+ "RepositoryNameExistsException",
+ "Repository named {0} already exists".format(repository_name),
+ )
+
+
+class RepositoryDoesNotExistException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name):
+ super().__init__(
+ "RepositoryDoesNotExistException",
+ "{0} does not exist".format(repository_name),
+ )
+
+
+class InvalidRepositoryNameException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidRepositoryNameException",
+ "The repository name is not valid. Repository names can be any valid "
+ "combination of letters, numbers, "
+ "periods, underscores, and dashes between 1 and 100 characters in "
+ "length. Names are case sensitive. "
+ "For more information, see Limits in the AWS CodeCommit User Guide. ",
+ )
diff --git a/contrib/python/moto/py3/moto/codecommit/models.py b/contrib/python/moto/py3/moto/codecommit/models.py
new file mode 100644
index 0000000000..cdb535733b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codecommit/models.py
@@ -0,0 +1,74 @@
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from datetime import datetime
+from moto.core import get_account_id
+from .exceptions import RepositoryDoesNotExistException, RepositoryNameExistsException
+import uuid
+
+
+class CodeCommit(BaseModel):
+ def __init__(self, region, repository_description, repository_name):
+ current_date = iso_8601_datetime_with_milliseconds(datetime.utcnow())
+ self.repository_metadata = dict()
+ self.repository_metadata["repositoryName"] = repository_name
+ self.repository_metadata[
+ "cloneUrlSsh"
+ ] = "ssh://git-codecommit.{0}.amazonaws.com/v1/repos/{1}".format(
+ region, repository_name
+ )
+ self.repository_metadata[
+ "cloneUrlHttp"
+ ] = "https://git-codecommit.{0}.amazonaws.com/v1/repos/{1}".format(
+ region, repository_name
+ )
+ self.repository_metadata["creationDate"] = current_date
+ self.repository_metadata["lastModifiedDate"] = current_date
+ self.repository_metadata["repositoryDescription"] = repository_description
+ self.repository_metadata["repositoryId"] = str(uuid.uuid4())
+ self.repository_metadata["Arn"] = "arn:aws:codecommit:{0}:{1}:{2}".format(
+ region, get_account_id(), repository_name
+ )
+ self.repository_metadata["accountId"] = get_account_id()
+
+
+class CodeCommitBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.repositories = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "codecommit"
+ )
+
+ def create_repository(self, repository_name, repository_description):
+ repository = self.repositories.get(repository_name)
+ if repository:
+ raise RepositoryNameExistsException(repository_name)
+
+ self.repositories[repository_name] = CodeCommit(
+ self.region_name, repository_description, repository_name
+ )
+
+ return self.repositories[repository_name].repository_metadata
+
+ def get_repository(self, repository_name):
+ repository = self.repositories.get(repository_name)
+ if not repository:
+ raise RepositoryDoesNotExistException(repository_name)
+
+ return repository.repository_metadata
+
+ def delete_repository(self, repository_name):
+ repository = self.repositories.get(repository_name)
+
+ if repository:
+ self.repositories.pop(repository_name)
+ return repository.repository_metadata.get("repositoryId")
+
+ return None
+
+
+codecommit_backends = BackendDict(CodeCommitBackend, "codecommit")
diff --git a/contrib/python/moto/py3/moto/codecommit/responses.py b/contrib/python/moto/py3/moto/codecommit/responses.py
new file mode 100644
index 0000000000..5ccd771272
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codecommit/responses.py
@@ -0,0 +1,56 @@
+import json
+import re
+
+from moto.core.responses import BaseResponse
+from .models import codecommit_backends
+from .exceptions import InvalidRepositoryNameException
+
+
+def _is_repository_name_valid(repository_name):
+ name_regex = re.compile(r"[\w\.-]+")
+ result = name_regex.split(repository_name)
+ if len(result) > 0:
+ for match in result:
+ if len(match) > 0:
+ return False
+ return True
+
+
+class CodeCommitResponse(BaseResponse):
+ @property
+ def codecommit_backend(self):
+ return codecommit_backends[self.region]
+
+ def create_repository(self):
+ if not _is_repository_name_valid(self._get_param("repositoryName")):
+ raise InvalidRepositoryNameException()
+
+ repository_metadata = self.codecommit_backend.create_repository(
+ self._get_param("repositoryName"),
+ self._get_param("repositoryDescription"),
+ )
+
+ return json.dumps({"repositoryMetadata": repository_metadata})
+
+ def get_repository(self):
+ if not _is_repository_name_valid(self._get_param("repositoryName")):
+ raise InvalidRepositoryNameException()
+
+ repository_metadata = self.codecommit_backend.get_repository(
+ self._get_param("repositoryName")
+ )
+
+ return json.dumps({"repositoryMetadata": repository_metadata})
+
+ def delete_repository(self):
+ if not _is_repository_name_valid(self._get_param("repositoryName")):
+ raise InvalidRepositoryNameException()
+
+ repository_id = self.codecommit_backend.delete_repository(
+ self._get_param("repositoryName")
+ )
+
+ if repository_id:
+ return json.dumps({"repositoryId": repository_id})
+
+ return json.dumps({})
diff --git a/contrib/python/moto/py3/moto/codecommit/urls.py b/contrib/python/moto/py3/moto/codecommit/urls.py
new file mode 100644
index 0000000000..433d7da9fa
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codecommit/urls.py
@@ -0,0 +1,5 @@
+from .responses import CodeCommitResponse
+
+url_bases = [r"https?://codecommit\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": CodeCommitResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/codepipeline/__init__.py b/contrib/python/moto/py3/moto/codepipeline/__init__.py
new file mode 100644
index 0000000000..da1f1fa9d1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codepipeline/__init__.py
@@ -0,0 +1,4 @@
+from .models import codepipeline_backends
+from ..core.models import base_decorator
+
+mock_codepipeline = base_decorator(codepipeline_backends)
diff --git a/contrib/python/moto/py3/moto/codepipeline/exceptions.py b/contrib/python/moto/py3/moto/codepipeline/exceptions.py
new file mode 100644
index 0000000000..0f2489109c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codepipeline/exceptions.py
@@ -0,0 +1,38 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidStructureException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidStructureException", message)
+
+
+class PipelineNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("PipelineNotFoundException", message)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundException", message)
+
+
+class InvalidTagsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidTagsException", message)
+
+
+class TooManyTagsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, arn):
+ super().__init__(
+ "TooManyTagsException", "Tag limit exceeded for resource [{}].".format(arn)
+ )
diff --git a/contrib/python/moto/py3/moto/codepipeline/models.py b/contrib/python/moto/py3/moto/codepipeline/models.py
new file mode 100644
index 0000000000..5b73afc3f8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codepipeline/models.py
@@ -0,0 +1,215 @@
+import json
+from datetime import datetime
+
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+
+from moto.iam.exceptions import IAMNotFoundException
+
+from moto.iam import iam_backends
+
+from moto.codepipeline.exceptions import (
+ InvalidStructureException,
+ PipelineNotFoundException,
+ ResourceNotFoundException,
+ InvalidTagsException,
+ TooManyTagsException,
+)
+from moto.core import get_account_id, BaseBackend, BaseModel
+
+
+class CodePipeline(BaseModel):
+ def __init__(self, region, pipeline):
+ # the version number for a new pipeline is always 1
+ pipeline["version"] = 1
+
+ self.pipeline = self.add_default_values(pipeline)
+ self.tags = {}
+
+ self._arn = "arn:aws:codepipeline:{0}:{1}:{2}".format(
+ region, get_account_id(), pipeline["name"]
+ )
+ self._created = datetime.utcnow()
+ self._updated = datetime.utcnow()
+
+ @property
+ def metadata(self):
+ return {
+ "pipelineArn": self._arn,
+ "created": iso_8601_datetime_with_milliseconds(self._created),
+ "updated": iso_8601_datetime_with_milliseconds(self._updated),
+ }
+
+ def add_default_values(self, pipeline):
+ for stage in pipeline["stages"]:
+ for action in stage["actions"]:
+ if "runOrder" not in action:
+ action["runOrder"] = 1
+ if "configuration" not in action:
+ action["configuration"] = {}
+ if "outputArtifacts" not in action:
+ action["outputArtifacts"] = []
+ if "inputArtifacts" not in action:
+ action["inputArtifacts"] = []
+
+ return pipeline
+
+ def validate_tags(self, tags):
+ for tag in tags:
+ if tag["key"].startswith("aws:"):
+ raise InvalidTagsException(
+ "Not allowed to modify system tags. "
+ "System tags start with 'aws:'. "
+ "msg=[Caller is an end user and not allowed to mutate system tags]"
+ )
+
+ if (len(self.tags) + len(tags)) > 50:
+ raise TooManyTagsException(self._arn)
+
+
+class CodePipelineBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.pipelines = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "codepipeline", policy_supported=False
+ )
+
+ @property
+ def iam_backend(self):
+ return iam_backends["global"]
+
+ def create_pipeline(self, pipeline, tags):
+ if pipeline["name"] in self.pipelines:
+ raise InvalidStructureException(
+ "A pipeline with the name '{0}' already exists in account '{1}'".format(
+ pipeline["name"], get_account_id()
+ )
+ )
+
+ try:
+ role = self.iam_backend.get_role_by_arn(pipeline["roleArn"])
+ service_principal = json.loads(role.assume_role_policy_document)[
+ "Statement"
+ ][0]["Principal"]["Service"]
+ if "codepipeline.amazonaws.com" not in service_principal:
+ raise IAMNotFoundException("")
+ except IAMNotFoundException:
+ raise InvalidStructureException(
+ "CodePipeline is not authorized to perform AssumeRole on role {}".format(
+ pipeline["roleArn"]
+ )
+ )
+
+ if len(pipeline["stages"]) < 2:
+ raise InvalidStructureException(
+ "Pipeline has only 1 stage(s). There should be a minimum of 2 stages in a pipeline"
+ )
+
+ self.pipelines[pipeline["name"]] = CodePipeline(self.region_name, pipeline)
+
+ if tags:
+ self.pipelines[pipeline["name"]].validate_tags(tags)
+
+ new_tags = {tag["key"]: tag["value"] for tag in tags}
+ self.pipelines[pipeline["name"]].tags.update(new_tags)
+
+ return pipeline, sorted(tags, key=lambda i: i["key"])
+
+ def get_pipeline(self, name):
+ codepipeline = self.pipelines.get(name)
+
+ if not codepipeline:
+ raise PipelineNotFoundException(
+ "Account '{0}' does not have a pipeline with name '{1}'".format(
+ get_account_id(), name
+ )
+ )
+
+ return codepipeline.pipeline, codepipeline.metadata
+
+ def update_pipeline(self, pipeline):
+ codepipeline = self.pipelines.get(pipeline["name"])
+
+ if not codepipeline:
+ raise ResourceNotFoundException(
+ "The account with id '{0}' does not include a pipeline with the name '{1}'".format(
+ get_account_id(), pipeline["name"]
+ )
+ )
+
+ # version number is auto incremented
+ pipeline["version"] = codepipeline.pipeline["version"] + 1
+ codepipeline._updated = datetime.utcnow()
+ codepipeline.pipeline = codepipeline.add_default_values(pipeline)
+
+ return codepipeline.pipeline
+
+ def list_pipelines(self):
+ pipelines = []
+
+ for name, codepipeline in self.pipelines.items():
+ pipelines.append(
+ {
+ "name": name,
+ "version": codepipeline.pipeline["version"],
+ "created": codepipeline.metadata["created"],
+ "updated": codepipeline.metadata["updated"],
+ }
+ )
+
+ return sorted(pipelines, key=lambda i: i["name"])
+
+ def delete_pipeline(self, name):
+ self.pipelines.pop(name, None)
+
+ def list_tags_for_resource(self, arn):
+ name = arn.split(":")[-1]
+ pipeline = self.pipelines.get(name)
+
+ if not pipeline:
+ raise ResourceNotFoundException(
+ "The account with id '{0}' does not include a pipeline with the name '{1}'".format(
+ get_account_id(), name
+ )
+ )
+
+ tags = [{"key": key, "value": value} for key, value in pipeline.tags.items()]
+
+ return sorted(tags, key=lambda i: i["key"])
+
+ def tag_resource(self, arn, tags):
+ name = arn.split(":")[-1]
+ pipeline = self.pipelines.get(name)
+
+ if not pipeline:
+ raise ResourceNotFoundException(
+ "The account with id '{0}' does not include a pipeline with the name '{1}'".format(
+ get_account_id(), name
+ )
+ )
+
+ pipeline.validate_tags(tags)
+
+ for tag in tags:
+ pipeline.tags.update({tag["key"]: tag["value"]})
+
+ def untag_resource(self, arn, tag_keys):
+ name = arn.split(":")[-1]
+ pipeline = self.pipelines.get(name)
+
+ if not pipeline:
+ raise ResourceNotFoundException(
+ "The account with id '{0}' does not include a pipeline with the name '{1}'".format(
+ get_account_id(), name
+ )
+ )
+
+ for key in tag_keys:
+ pipeline.tags.pop(key, None)
+
+
+codepipeline_backends = BackendDict(CodePipelineBackend, "codepipeline")
diff --git a/contrib/python/moto/py3/moto/codepipeline/responses.py b/contrib/python/moto/py3/moto/codepipeline/responses.py
new file mode 100644
index 0000000000..d18c676020
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codepipeline/responses.py
@@ -0,0 +1,62 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import codepipeline_backends
+
+
+class CodePipelineResponse(BaseResponse):
+ @property
+ def codepipeline_backend(self):
+ return codepipeline_backends[self.region]
+
+ def create_pipeline(self):
+ pipeline, tags = self.codepipeline_backend.create_pipeline(
+ self._get_param("pipeline"), self._get_param("tags")
+ )
+
+ return json.dumps({"pipeline": pipeline, "tags": tags})
+
+ def get_pipeline(self):
+ pipeline, metadata = self.codepipeline_backend.get_pipeline(
+ self._get_param("name")
+ )
+
+ return json.dumps({"pipeline": pipeline, "metadata": metadata})
+
+ def update_pipeline(self):
+ pipeline = self.codepipeline_backend.update_pipeline(
+ self._get_param("pipeline")
+ )
+
+ return json.dumps({"pipeline": pipeline})
+
+ def list_pipelines(self):
+ pipelines = self.codepipeline_backend.list_pipelines()
+
+ return json.dumps({"pipelines": pipelines})
+
+ def delete_pipeline(self):
+ self.codepipeline_backend.delete_pipeline(self._get_param("name"))
+
+ return ""
+
+ def list_tags_for_resource(self):
+ tags = self.codepipeline_backend.list_tags_for_resource(
+ self._get_param("resourceArn")
+ )
+
+ return json.dumps({"tags": tags})
+
+ def tag_resource(self):
+ self.codepipeline_backend.tag_resource(
+ self._get_param("resourceArn"), self._get_param("tags")
+ )
+
+ return ""
+
+ def untag_resource(self):
+ self.codepipeline_backend.untag_resource(
+ self._get_param("resourceArn"), self._get_param("tagKeys")
+ )
+
+ return ""
diff --git a/contrib/python/moto/py3/moto/codepipeline/urls.py b/contrib/python/moto/py3/moto/codepipeline/urls.py
new file mode 100644
index 0000000000..610aa59edb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/codepipeline/urls.py
@@ -0,0 +1,5 @@
+from .responses import CodePipelineResponse
+
+url_bases = [r"https?://codepipeline\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": CodePipelineResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/__init__.py b/contrib/python/moto/py3/moto/cognitoidentity/__init__.py
new file mode 100644
index 0000000000..4ea132a841
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/__init__.py
@@ -0,0 +1,4 @@
+from .models import cognitoidentity_backends
+from ..core.models import base_decorator
+
+mock_cognitoidentity = base_decorator(cognitoidentity_backends)
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/exceptions.py b/contrib/python/moto/py3/moto/cognitoidentity/exceptions.py
new file mode 100644
index 0000000000..6749525363
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/exceptions.py
@@ -0,0 +1,25 @@
+import json
+
+from werkzeug.exceptions import BadRequest
+
+
+class ResourceNotFoundError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceNotFoundException"}
+ )
+
+
+class InvalidNameException(BadRequest):
+
+ message = "1 validation error detected: Value '{}' at 'identityPoolName' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\w\\s+=,.@-]+"
+
+ def __init__(self, name):
+ super().__init__()
+ self.description = json.dumps(
+ {
+ "message": InvalidNameException.message.format(name),
+ "__type": "ValidationException",
+ }
+ )
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/models.py b/contrib/python/moto/py3/moto/cognitoidentity/models.py
new file mode 100644
index 0000000000..10c974779e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/models.py
@@ -0,0 +1,196 @@
+import datetime
+import json
+import re
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from .exceptions import InvalidNameException, ResourceNotFoundError
+from .utils import get_random_identity_id
+
+
+class CognitoIdentity(BaseModel):
+ def __init__(self, region, identity_pool_name, **kwargs):
+ self.identity_pool_name = identity_pool_name
+
+ if not re.fullmatch(r"[\w\s+=,.@-]+", identity_pool_name):
+ raise InvalidNameException(identity_pool_name)
+
+ self.allow_unauthenticated_identities = kwargs.get(
+ "allow_unauthenticated_identities", ""
+ )
+ self.supported_login_providers = kwargs.get("supported_login_providers", {})
+ self.developer_provider_name = kwargs.get("developer_provider_name", "")
+ self.open_id_connect_provider_arns = kwargs.get(
+ "open_id_connect_provider_arns", []
+ )
+ self.cognito_identity_providers = kwargs.get("cognito_identity_providers", [])
+ self.saml_provider_arns = kwargs.get("saml_provider_arns", [])
+
+ self.identity_pool_id = get_random_identity_id(region)
+ self.creation_time = datetime.datetime.utcnow()
+
+ self.tags = kwargs.get("tags") or {}
+
+ def to_json(self):
+ return json.dumps(
+ {
+ "IdentityPoolId": self.identity_pool_id,
+ "IdentityPoolName": self.identity_pool_name,
+ "AllowUnauthenticatedIdentities": self.allow_unauthenticated_identities,
+ "SupportedLoginProviders": self.supported_login_providers,
+ "DeveloperProviderName": self.developer_provider_name,
+ "OpenIdConnectProviderARNs": self.open_id_connect_provider_arns,
+ "CognitoIdentityProviders": self.cognito_identity_providers,
+ "SamlProviderARNs": self.saml_provider_arns,
+ }
+ )
+
+
+class CognitoIdentityBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.identity_pools = OrderedDict()
+ self.pools_identities = {}
+
+ def describe_identity_pool(self, identity_pool_id):
+ identity_pool = self.identity_pools.get(identity_pool_id, None)
+
+ if not identity_pool:
+ raise ResourceNotFoundError(identity_pool_id)
+
+ response = json.dumps(
+ {
+ "AllowUnauthenticatedIdentities": identity_pool.allow_unauthenticated_identities,
+ "CognitoIdentityProviders": identity_pool.cognito_identity_providers,
+ "DeveloperProviderName": identity_pool.developer_provider_name,
+ "IdentityPoolId": identity_pool.identity_pool_id,
+ "IdentityPoolName": identity_pool.identity_pool_name,
+ "IdentityPoolTags": identity_pool.tags,
+ "OpenIdConnectProviderARNs": identity_pool.open_id_connect_provider_arns,
+ "SamlProviderARNs": identity_pool.saml_provider_arns,
+ "SupportedLoginProviders": identity_pool.supported_login_providers,
+ }
+ )
+
+ return response
+
+ def create_identity_pool(
+ self,
+ identity_pool_name,
+ allow_unauthenticated_identities,
+ supported_login_providers,
+ developer_provider_name,
+ open_id_connect_provider_arns,
+ cognito_identity_providers,
+ saml_provider_arns,
+ tags=None,
+ ):
+ new_identity = CognitoIdentity(
+ self.region_name,
+ identity_pool_name,
+ allow_unauthenticated_identities=allow_unauthenticated_identities,
+ supported_login_providers=supported_login_providers,
+ developer_provider_name=developer_provider_name,
+ open_id_connect_provider_arns=open_id_connect_provider_arns,
+ cognito_identity_providers=cognito_identity_providers,
+ saml_provider_arns=saml_provider_arns,
+ tags=tags,
+ )
+ self.identity_pools[new_identity.identity_pool_id] = new_identity
+ self.pools_identities.update(
+ {
+ new_identity.identity_pool_id: {
+ "IdentityPoolId": new_identity.identity_pool_id,
+ "Identities": [],
+ }
+ }
+ )
+ response = new_identity.to_json()
+ return response
+
+ def update_identity_pool(
+ self,
+ identity_pool_id,
+ identity_pool_name,
+ allow_unauthenticated,
+ login_providers,
+ provider_name,
+ provider_arns,
+ identity_providers,
+ saml_providers,
+ tags=None,
+ ):
+ """
+ The AllowClassic-parameter has not yet been implemented
+ """
+ pool = self.identity_pools[identity_pool_id]
+ pool.identity_pool_name = pool.identity_pool_name or identity_pool_name
+ if allow_unauthenticated is not None:
+ pool.allow_unauthenticated_identities = allow_unauthenticated
+ if login_providers is not None:
+ pool.supported_login_providers = login_providers
+ if provider_name:
+ pool.developer_provider_name = provider_name
+ if provider_arns is not None:
+ pool.open_id_connect_provider_arns = provider_arns
+ if identity_providers is not None:
+ pool.cognito_identity_providers = identity_providers
+ if saml_providers is not None:
+ pool.saml_provider_arns = saml_providers
+ if tags:
+ pool.tags = tags
+
+ response = pool.to_json()
+ return response
+
+ def get_id(self, identity_pool_id: str):
+ identity_id = {"IdentityId": get_random_identity_id(self.region_name)}
+ self.pools_identities[identity_pool_id]["Identities"].append(identity_id)
+ return json.dumps(identity_id)
+
+ def get_credentials_for_identity(self, identity_id):
+ duration = 90
+ now = datetime.datetime.utcnow()
+ expiration = now + datetime.timedelta(seconds=duration)
+ expiration_str = str(iso_8601_datetime_with_milliseconds(expiration))
+ response = json.dumps(
+ {
+ "Credentials": {
+ "AccessKeyId": "TESTACCESSKEY12345",
+ "Expiration": expiration_str,
+ "SecretKey": "ABCSECRETKEY",
+ "SessionToken": "ABC12345",
+ },
+ "IdentityId": identity_id,
+ }
+ )
+ return response
+
+ def get_open_id_token_for_developer_identity(self, identity_id):
+ response = json.dumps(
+ {
+ "IdentityId": identity_id,
+ "Token": get_random_identity_id(self.region_name),
+ }
+ )
+ return response
+
+ def get_open_id_token(self, identity_id):
+ response = json.dumps(
+ {
+ "IdentityId": identity_id,
+ "Token": get_random_identity_id(self.region_name),
+ }
+ )
+ return response
+
+ def list_identities(self, identity_pool_id):
+ """
+ The MaxResults-parameter has not yet been implemented
+ """
+ response = json.dumps(self.pools_identities[identity_pool_id])
+ return response
+
+
+cognitoidentity_backends = BackendDict(CognitoIdentityBackend, "cognito-identity")
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/responses.py b/contrib/python/moto/py3/moto/cognitoidentity/responses.py
new file mode 100644
index 0000000000..51b16bfec3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/responses.py
@@ -0,0 +1,83 @@
+from moto.core.responses import BaseResponse
+from .models import cognitoidentity_backends
+from .utils import get_random_identity_id
+
+
+class CognitoIdentityResponse(BaseResponse):
+ def create_identity_pool(self):
+ identity_pool_name = self._get_param("IdentityPoolName")
+ allow_unauthenticated_identities = self._get_param(
+ "AllowUnauthenticatedIdentities"
+ )
+ supported_login_providers = self._get_param("SupportedLoginProviders")
+ developer_provider_name = self._get_param("DeveloperProviderName")
+ open_id_connect_provider_arns = self._get_param("OpenIdConnectProviderARNs")
+ cognito_identity_providers = self._get_param("CognitoIdentityProviders")
+ saml_provider_arns = self._get_param("SamlProviderARNs")
+ pool_tags = self._get_param("IdentityPoolTags")
+
+ return cognitoidentity_backends[self.region].create_identity_pool(
+ identity_pool_name=identity_pool_name,
+ allow_unauthenticated_identities=allow_unauthenticated_identities,
+ supported_login_providers=supported_login_providers,
+ developer_provider_name=developer_provider_name,
+ open_id_connect_provider_arns=open_id_connect_provider_arns,
+ cognito_identity_providers=cognito_identity_providers,
+ saml_provider_arns=saml_provider_arns,
+ tags=pool_tags,
+ )
+
+ def update_identity_pool(self):
+ pool_id = self._get_param("IdentityPoolId")
+ pool_name = self._get_param("IdentityPoolName")
+ allow_unauthenticated = self._get_bool_param("AllowUnauthenticatedIdentities")
+ login_providers = self._get_param("SupportedLoginProviders")
+ provider_name = self._get_param("DeveloperProviderName")
+ provider_arns = self._get_param("OpenIdConnectProviderARNs")
+ identity_providers = self._get_param("CognitoIdentityProviders")
+ saml_providers = self._get_param("SamlProviderARNs")
+ pool_tags = self._get_param("IdentityPoolTags")
+
+ return cognitoidentity_backends[self.region].update_identity_pool(
+ identity_pool_id=pool_id,
+ identity_pool_name=pool_name,
+ allow_unauthenticated=allow_unauthenticated,
+ login_providers=login_providers,
+ provider_name=provider_name,
+ provider_arns=provider_arns,
+ identity_providers=identity_providers,
+ saml_providers=saml_providers,
+ tags=pool_tags,
+ )
+
+ def get_id(self):
+ return cognitoidentity_backends[self.region].get_id(
+ identity_pool_id=self._get_param("IdentityPoolId")
+ )
+
+ def describe_identity_pool(self):
+ return cognitoidentity_backends[self.region].describe_identity_pool(
+ self._get_param("IdentityPoolId")
+ )
+
+ def get_credentials_for_identity(self):
+ return cognitoidentity_backends[self.region].get_credentials_for_identity(
+ self._get_param("IdentityId")
+ )
+
+ def get_open_id_token_for_developer_identity(self):
+ return cognitoidentity_backends[
+ self.region
+ ].get_open_id_token_for_developer_identity(
+ self._get_param("IdentityId") or get_random_identity_id(self.region)
+ )
+
+ def get_open_id_token(self):
+ return cognitoidentity_backends[self.region].get_open_id_token(
+ self._get_param("IdentityId") or get_random_identity_id(self.region)
+ )
+
+ def list_identities(self):
+ return cognitoidentity_backends[self.region].list_identities(
+ self._get_param("IdentityPoolId") or get_random_identity_id(self.region)
+ )
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/urls.py b/contrib/python/moto/py3/moto/cognitoidentity/urls.py
new file mode 100644
index 0000000000..dd833cdd43
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/urls.py
@@ -0,0 +1,5 @@
+from .responses import CognitoIdentityResponse
+
+url_bases = [r"https?://cognito-identity\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": CognitoIdentityResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/cognitoidentity/utils.py b/contrib/python/moto/py3/moto/cognitoidentity/utils.py
new file mode 100644
index 0000000000..54016ad17b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidentity/utils.py
@@ -0,0 +1,5 @@
+from uuid import uuid4
+
+
+def get_random_identity_id(region):
+ return "{0}:{1}".format(region, uuid4())
diff --git a/contrib/python/moto/py3/moto/cognitoidp/__init__.py b/contrib/python/moto/py3/moto/cognitoidp/__init__.py
new file mode 100644
index 0000000000..09d8043c1a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/__init__.py
@@ -0,0 +1,4 @@
+from .models import cognitoidp_backends
+from ..core.models import base_decorator
+
+mock_cognitoidp = base_decorator(cognitoidp_backends)
diff --git a/contrib/python/moto/py3/moto/cognitoidp/exceptions.py b/contrib/python/moto/py3/moto/cognitoidp/exceptions.py
new file mode 100644
index 0000000000..9617acce72
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/exceptions.py
@@ -0,0 +1,67 @@
+import json
+from werkzeug.exceptions import BadRequest
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFoundError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceNotFoundException"}
+ )
+
+
+class UserNotFoundError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "UserNotFoundException"}
+ )
+
+
+class UsernameExistsException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "UsernameExistsException"}
+ )
+
+
+class GroupExistsException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "GroupExistsException"}
+ )
+
+
+class NotAuthorizedError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "NotAuthorizedException"}
+ )
+
+
+class UserNotConfirmedException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "UserNotConfirmedException"}
+ )
+
+
+class ExpiredCodeException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ExpiredCodeException"}
+ )
+
+
+class InvalidParameterException(JsonRESTError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__(
+ "InvalidParameterException", msg or "A parameter is specified incorrectly."
+ )
diff --git a/contrib/python/moto/py3/moto/cognitoidp/models.py b/contrib/python/moto/py3/moto/cognitoidp/models.py
new file mode 100644
index 0000000000..6c9da7750f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/models.py
@@ -0,0 +1,1863 @@
+import datetime
+import json
+import os
+import time
+import typing
+import uuid
+import enum
+import random
+from jose import jws
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel
+from moto.core import get_account_id
+from moto.core.utils import BackendDict
+from .exceptions import (
+ GroupExistsException,
+ NotAuthorizedError,
+ ResourceNotFoundError,
+ UserNotFoundError,
+ UsernameExistsException,
+ UserNotConfirmedException,
+ InvalidParameterException,
+ ExpiredCodeException,
+)
+from .utils import (
+ create_id,
+ check_secret_hash,
+ validate_username_format,
+ flatten_attrs,
+ expand_attrs,
+ PAGINATION_MODEL,
+)
+from moto.utilities.paginator import paginate
+from moto.utilities.utils import md5_hash
+
+
+class UserStatus(str, enum.Enum):
+ FORCE_CHANGE_PASSWORD = "FORCE_CHANGE_PASSWORD"
+ CONFIRMED = "CONFIRMED"
+ UNCONFIRMED = "UNCONFIRMED"
+ RESET_REQUIRED = "RESET_REQUIRED"
+
+
+class AuthFlow(str, enum.Enum):
+ # Order follows AWS' order
+ ADMIN_NO_SRP_AUTH = "ADMIN_NO_SRP_AUTH"
+ ADMIN_USER_PASSWORD_AUTH = "ADMIN_USER_PASSWORD_AUTH"
+ USER_SRP_AUTH = "USER_SRP_AUTH"
+ REFRESH_TOKEN_AUTH = "REFRESH_TOKEN_AUTH"
+ REFRESH_TOKEN = "REFRESH_TOKEN"
+ CUSTOM_AUTH = "CUSTOM_AUTH"
+ USER_PASSWORD_AUTH = "USER_PASSWORD_AUTH"
+
+ @classmethod
+ def list(cls):
+ return [e.value for e in cls]
+
+
+class CognitoIdpUserPoolAttribute(BaseModel):
+
+ STANDARD_SCHEMA = {
+ "sub": {
+ "AttributeDataType": "String",
+ "Mutable": False,
+ "Required": True,
+ "StringAttributeConstraints": {"MinLength": "1", "MaxLength": "2048"},
+ },
+ "name": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "given_name": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "family_name": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "middle_name": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "nickname": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "preferred_username": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "profile": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "picture": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "website": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "email": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "email_verified": {
+ "AttributeDataType": "Boolean",
+ "Mutable": True,
+ "Required": False,
+ },
+ "gender": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "birthdate": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "10", "MaxLength": "10"},
+ },
+ "zoneinfo": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "locale": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "phone_number": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "phone_number_verified": {
+ "AttributeDataType": "Boolean",
+ "Mutable": True,
+ "Required": False,
+ },
+ "address": {
+ "AttributeDataType": "String",
+ "Mutable": True,
+ "Required": False,
+ "StringAttributeConstraints": {"MinLength": "0", "MaxLength": "2048"},
+ },
+ "updated_at": {
+ "AttributeDataType": "Number",
+ "Mutable": True,
+ "Required": False,
+ "NumberAttributeConstraints": {"MinValue": "0"},
+ },
+ }
+
+ ATTRIBUTE_DATA_TYPES = {"Boolean", "DateTime", "String", "Number"}
+
+ def __init__(self, name, custom, schema):
+ self.name = name
+ self.custom = custom
+ attribute_data_type = schema.get("AttributeDataType", None)
+ if (
+ attribute_data_type
+ and attribute_data_type
+ not in CognitoIdpUserPoolAttribute.ATTRIBUTE_DATA_TYPES
+ ):
+ raise InvalidParameterException(
+ f"Validation error detected: Value '{attribute_data_type}' failed to satisfy constraint: Member must satisfy enum value set: [Boolean, Number, String, DateTime]"
+ )
+
+ if self.custom:
+ self._init_custom(schema)
+ else:
+ self._init_standard(schema)
+
+ def _init_custom(self, schema):
+ self.name = "custom:" + self.name
+ attribute_data_type = schema.get("AttributeDataType", None)
+ if not attribute_data_type:
+ raise InvalidParameterException(
+ "Invalid AttributeDataType input, consider using the provided AttributeDataType enum."
+ )
+ self.data_type = attribute_data_type
+ self.developer_only = schema.get("DeveloperOnlyAttribute", False)
+ if self.developer_only:
+ self.name = "dev:" + self.name
+ self.mutable = schema.get("Mutable", True)
+ if schema.get("Required", False):
+ raise InvalidParameterException(
+ "Required custom attributes are not supported currently."
+ )
+ self.required = False
+ self._init_constraints(schema, None, show_empty_constraints=True)
+
+ def _init_standard(self, schema):
+ attribute_data_type = schema.get("AttributeDataType", None)
+ default_attribute_data_type = CognitoIdpUserPoolAttribute.STANDARD_SCHEMA[
+ self.name
+ ]["AttributeDataType"]
+ if attribute_data_type and attribute_data_type != default_attribute_data_type:
+ raise InvalidParameterException(
+ f"You can not change AttributeDataType or set developerOnlyAttribute for standard schema attribute {self.name}"
+ )
+ self.data_type = default_attribute_data_type
+ if schema.get("DeveloperOnlyAttribute", False):
+ raise InvalidParameterException(
+ f"You can not change AttributeDataType or set developerOnlyAttribute for standard schema attribute {self.name}"
+ )
+ else:
+ self.developer_only = False
+ self.mutable = schema.get(
+ "Mutable", CognitoIdpUserPoolAttribute.STANDARD_SCHEMA[self.name]["Mutable"]
+ )
+ self.required = schema.get(
+ "Required",
+ CognitoIdpUserPoolAttribute.STANDARD_SCHEMA[self.name]["Required"],
+ )
+ constraints_key = None
+ if self.data_type == "Number":
+ constraints_key = "NumberAttributeConstraints"
+ elif self.data_type == "String":
+ constraints_key = "StringAttributeConstraints"
+ default_constraints = (
+ None
+ if not constraints_key
+ else CognitoIdpUserPoolAttribute.STANDARD_SCHEMA[self.name][constraints_key]
+ )
+ self._init_constraints(schema, default_constraints)
+
+ def _init_constraints(
+ self, schema, default_constraints, show_empty_constraints=False
+ ):
+ def numeric_limit(num, constraint_type):
+ if not num:
+ return
+ parsed = None
+ try:
+ parsed = int(num)
+ except ValueError:
+ pass
+ if parsed is None or parsed < 0:
+ raise InvalidParameterException(
+ f"Invalid {constraint_type} for schema attribute {self.name}"
+ )
+ return parsed
+
+ self.string_constraints = {} if show_empty_constraints else None
+ self.number_constraints = None
+
+ if "AttributeDataType" in schema:
+ # Quirk - schema is set/validated only if AttributeDataType is specified
+ if self.data_type == "String":
+ string_constraints = schema.get(
+ "StringAttributeConstraints", default_constraints
+ )
+ if not string_constraints:
+ return
+ min_len = numeric_limit(
+ string_constraints.get("MinLength", None),
+ "StringAttributeConstraints",
+ )
+ max_len = numeric_limit(
+ string_constraints.get("MaxLength", None),
+ "StringAttributeConstraints",
+ )
+ if (min_len and min_len > 2048) or (max_len and max_len > 2048):
+ raise InvalidParameterException(
+ f"user.{self.name}: String attributes cannot have a length of more than 2048"
+ )
+ if min_len and max_len and min_len > max_len:
+ raise InvalidParameterException(
+ f"user.{self.name}: Max length cannot be less than min length."
+ )
+ self.string_constraints = string_constraints
+ self.number_constraints = None
+ elif self.data_type == "Number":
+ number_constraints = schema.get(
+ "NumberAttributeConstraints", default_constraints
+ )
+ if not number_constraints:
+ return
+ # No limits on either min or max value
+ min_val = numeric_limit(
+ number_constraints.get("MinValue", None),
+ "NumberAttributeConstraints",
+ )
+ max_val = numeric_limit(
+ number_constraints.get("MaxValue", None),
+ "NumberAttributeConstraints",
+ )
+ if min_val and max_val and min_val > max_val:
+ raise InvalidParameterException(
+ f"user.{self.name}: Max value cannot be less than min value."
+ )
+ self.number_constraints = number_constraints
+ self.string_constraints = None
+ else:
+ self.number_constraints = None
+ self.string_constraints = None
+
+ def to_json(self):
+ return {
+ "Name": self.name,
+ "AttributeDataType": self.data_type,
+ "DeveloperOnlyAttribute": self.developer_only,
+ "Mutable": self.mutable,
+ "Required": self.required,
+ "NumberAttributeConstraints": self.number_constraints,
+ "StringAttributeConstraints": self.string_constraints,
+ }
+
+
+DEFAULT_USER_POOL_CONFIG = {
+ "Policies": {
+ "PasswordPolicy": {
+ "MinimumLength": 8,
+ "RequireUppercase": True,
+ "RequireLowercase": True,
+ "RequireNumbers": True,
+ "RequireSymbols": True,
+ "TemporaryPasswordValidityDays": 7,
+ }
+ },
+ "AdminCreateUserConfig": {
+ "AllowAdminCreateUserOnly": False,
+ "UnusedAccountValidityDays": 7,
+ "InviteMessageTemplate": {
+ "SMSMessage": "Your username is {username} and temporary password is {####}. ",
+ "EmailMessage": "Your username is {username} and temporary password is {####}. ",
+ "EmailSubject": "Your temporary password",
+ },
+ },
+ "EmailConfiguration": {"EmailSendingAccount": "COGNITO_DEFAULT"},
+ "VerificationMessageTemplate": {
+ "SmsMessage": "Your verification code is {####}. ",
+ "EmailMessage": "Your verification code is {####}. ",
+ "EmailSubject": "Your verification code",
+ "DefaultEmailOption": "CONFIRM_WITH_CODE",
+ },
+}
+
+
+class CognitoIdpUserPool(BaseModel):
+ def __init__(self, region, name, extended_config):
+ self.region = region
+ self.id = "{}_{}".format(self.region, str(uuid.uuid4().hex))
+ self.arn = "arn:aws:cognito-idp:{}:{}:userpool/{}".format(
+ self.region, get_account_id(), self.id
+ )
+ self.name = name
+ self.status = None
+
+ self.extended_config = DEFAULT_USER_POOL_CONFIG.copy()
+ self.extended_config.update(extended_config or {})
+
+ message_template = self.extended_config.get("VerificationMessageTemplate")
+ if message_template and "SmsVerificationMessage" not in extended_config:
+ self.extended_config["SmsVerificationMessage"] = message_template.get(
+ "SmsMessage"
+ )
+ if message_template and "EmailVerificationSubject" not in extended_config:
+ self.extended_config["EmailVerificationSubject"] = message_template.get(
+ "EmailSubject"
+ )
+ if message_template and "EmailVerificationMessage" not in extended_config:
+ self.extended_config["EmailVerificationMessage"] = message_template.get(
+ "EmailMessage"
+ )
+
+ self.creation_date = datetime.datetime.utcnow()
+ self.last_modified_date = datetime.datetime.utcnow()
+
+ self.mfa_config = "OFF"
+ self.sms_mfa_config = None
+ self.token_mfa_config = None
+
+ self.schema_attributes = {}
+ for schema in self.extended_config.pop("Schema", {}):
+ attribute = CognitoIdpUserPoolAttribute(
+ schema["Name"],
+ schema["Name"] not in CognitoIdpUserPoolAttribute.STANDARD_SCHEMA,
+ schema,
+ )
+ self.schema_attributes[attribute.name] = attribute
+ # If we do not have custom attributes, use the standard schema
+ if not self.schema_attributes:
+ for (
+ standard_attribute_name,
+ standard_attribute_schema,
+ ) in CognitoIdpUserPoolAttribute.STANDARD_SCHEMA.items():
+ self.schema_attributes[
+ standard_attribute_name
+ ] = CognitoIdpUserPoolAttribute(
+ standard_attribute_name, False, standard_attribute_schema
+ )
+
+ self.clients = OrderedDict()
+ self.identity_providers = OrderedDict()
+ self.groups = OrderedDict()
+ self.users = OrderedDict()
+ self.resource_servers = OrderedDict()
+ self.refresh_tokens = {}
+ self.access_tokens = {}
+ self.id_tokens = {}
+
+ with open(
+ os.path.join(os.path.dirname(__file__), "resources/jwks-private.json")
+ ) as f:
+ self.json_web_key = json.loads(f.read())
+
+ def _account_recovery_setting(self):
+ # AccountRecoverySetting is not present in DescribeUserPool response if the pool was created without
+ # specifying it, ForgotPassword works on default settings nonetheless
+ return self.extended_config.get(
+ "AccountRecoverySetting",
+ {
+ "RecoveryMechanisms": [
+ {"Priority": 1, "Name": "verified_phone_number"},
+ {"Priority": 2, "Name": "verified_email"},
+ ]
+ },
+ )
+
+ def _base_json(self):
+ return {
+ "Id": self.id,
+ "Arn": self.arn,
+ "Name": self.name,
+ "Status": self.status,
+ "CreationDate": time.mktime(self.creation_date.timetuple()),
+ "LastModifiedDate": time.mktime(self.last_modified_date.timetuple()),
+ "MfaConfiguration": self.mfa_config,
+ "EstimatedNumberOfUsers": len(self.users),
+ }
+
+ def to_json(self, extended=False):
+ user_pool_json = self._base_json()
+ if extended:
+ user_pool_json.update(self.extended_config)
+ user_pool_json.update(
+ {
+ "SchemaAttributes": [
+ att.to_json() for att in self.schema_attributes.values()
+ ]
+ }
+ )
+ else:
+ user_pool_json["LambdaConfig"] = (
+ self.extended_config.get("LambdaConfig") or {}
+ )
+
+ return user_pool_json
+
+ def _get_user(self, username):
+ """Find a user within a user pool by Username or any UsernameAttributes
+ (`email` or `phone_number` or both)"""
+ if self.extended_config.get("UsernameAttributes"):
+ attribute_types = self.extended_config["UsernameAttributes"]
+ for user in self.users.values():
+ if username in [
+ flatten_attrs(user.attributes).get(attribute_type)
+ for attribute_type in attribute_types
+ ]:
+ return user
+
+ return self.users.get(username)
+
+ def create_jwt(
+ self, client_id, username, token_use, expires_in=60 * 60, extra_data=None
+ ):
+ now = int(time.time())
+ payload = {
+ "iss": "https://cognito-idp.{}.amazonaws.com/{}".format(
+ self.region, self.id
+ ),
+ "sub": self._get_user(username).id,
+ "aud": client_id,
+ "token_use": token_use,
+ "auth_time": now,
+ "exp": now + expires_in,
+ "email": flatten_attrs(self._get_user(username).attributes).get("email"),
+ }
+ payload.update(extra_data or {})
+ headers = {"kid": "dummy"} # KID as present in jwks-public.json
+
+ return (
+ jws.sign(payload, self.json_web_key, headers, algorithm="RS256"),
+ expires_in,
+ )
+
+ def add_custom_attributes(self, custom_attributes):
+ attributes = []
+ for attribute_schema in custom_attributes:
+ base_name = attribute_schema["Name"]
+ target_name = "custom:" + base_name
+ if attribute_schema.get("DeveloperOnlyAttribute", False):
+ target_name = "dev:" + target_name
+ if target_name in self.schema_attributes:
+ raise InvalidParameterException(
+ f"custom:{base_name}: Existing attribute already has name {target_name}."
+ )
+ attribute = CognitoIdpUserPoolAttribute(base_name, True, attribute_schema)
+ attributes.append(attribute)
+ for attribute in attributes:
+ self.schema_attributes[attribute.name] = attribute
+
+ def create_id_token(self, client_id, username):
+ extra_data = self.get_user_extra_data_by_client_id(client_id, username)
+ id_token, expires_in = self.create_jwt(
+ client_id, username, "id", extra_data=extra_data
+ )
+ self.id_tokens[id_token] = (client_id, username)
+ return id_token, expires_in
+
+ def create_refresh_token(self, client_id, username):
+ refresh_token = str(uuid.uuid4())
+ self.refresh_tokens[refresh_token] = (client_id, username)
+ return refresh_token
+
+ def create_access_token(self, client_id, username):
+ extra_data = {}
+ user = self._get_user(username)
+ if len(user.groups) > 0:
+ extra_data["cognito:groups"] = [group.group_name for group in user.groups]
+
+ access_token, expires_in = self.create_jwt(
+ client_id, username, "access", extra_data=extra_data
+ )
+ self.access_tokens[access_token] = (client_id, username)
+ return access_token, expires_in
+
+ def create_tokens_from_refresh_token(self, refresh_token):
+ client_id, username = self.refresh_tokens.get(refresh_token)
+ if not username:
+ raise NotAuthorizedError(refresh_token)
+
+ access_token, expires_in = self.create_access_token(client_id, username)
+ id_token, _ = self.create_id_token(client_id, username)
+ return access_token, id_token, expires_in
+
+ def get_user_extra_data_by_client_id(self, client_id, username):
+ extra_data = {}
+ current_client = self.clients.get(client_id, None)
+ if current_client:
+ for readable_field in current_client.get_readable_fields():
+ attribute = list(
+ filter(
+ lambda f: f["Name"] == readable_field,
+ self._get_user(username).attributes,
+ )
+ )
+ if len(attribute) > 0:
+ extra_data.update({attribute[0]["Name"]: attribute[0]["Value"]})
+ return extra_data
+
+ def sign_out(self, username):
+ for token, token_tuple in list(self.refresh_tokens.items()):
+ if token_tuple is None:
+ continue
+ _, logged_in_user = token_tuple
+ if username == logged_in_user:
+ self.refresh_tokens[token] = None
+
+
+class CognitoIdpUserPoolDomain(BaseModel):
+ def __init__(self, user_pool_id, domain, custom_domain_config=None):
+ self.user_pool_id = user_pool_id
+ self.domain = domain
+ self.custom_domain_config = custom_domain_config or {}
+
+ def _distribution_name(self):
+ if self.custom_domain_config and "CertificateArn" in self.custom_domain_config:
+ unique_hash = md5_hash(
+ self.custom_domain_config["CertificateArn"].encode("utf-8")
+ ).hexdigest()
+ return f"{unique_hash[:16]}.cloudfront.net"
+ unique_hash = md5_hash(self.user_pool_id.encode("utf-8")).hexdigest()
+ return f"{unique_hash[:16]}.amazoncognito.com"
+
+ def to_json(self, extended=True):
+ distribution = self._distribution_name()
+ if extended:
+ return {
+ "UserPoolId": self.user_pool_id,
+ "AWSAccountId": str(uuid.uuid4()),
+ "CloudFrontDistribution": distribution,
+ "Domain": self.domain,
+ "S3Bucket": None,
+ "Status": "ACTIVE",
+ "Version": None,
+ }
+ elif distribution:
+ return {"CloudFrontDomain": distribution}
+ return None
+
+
+class CognitoIdpUserPoolClient(BaseModel):
+ def __init__(self, user_pool_id, generate_secret, extended_config):
+ self.user_pool_id = user_pool_id
+ self.id = create_id()
+ self.secret = str(uuid.uuid4())
+ self.generate_secret = generate_secret or False
+ self.extended_config = extended_config or {}
+
+ def _base_json(self):
+ return {
+ "ClientId": self.id,
+ "ClientName": self.extended_config.get("ClientName"),
+ "UserPoolId": self.user_pool_id,
+ }
+
+ def to_json(self, extended=False):
+ user_pool_client_json = self._base_json()
+ if self.generate_secret:
+ user_pool_client_json.update({"ClientSecret": self.secret})
+ if extended:
+ user_pool_client_json.update(self.extended_config)
+
+ return user_pool_client_json
+
+ def get_readable_fields(self):
+ return self.extended_config.get("ReadAttributes", [])
+
+
+class CognitoIdpIdentityProvider(BaseModel):
+ def __init__(self, name, extended_config):
+ self.name = name
+ self.extended_config = extended_config or {}
+ self.creation_date = datetime.datetime.utcnow()
+ self.last_modified_date = datetime.datetime.utcnow()
+
+ if "AttributeMapping" not in self.extended_config:
+ self.extended_config["AttributeMapping"] = {"username": "sub"}
+
+ def _base_json(self):
+ return {
+ "ProviderName": self.name,
+ "ProviderType": self.extended_config.get("ProviderType"),
+ "CreationDate": time.mktime(self.creation_date.timetuple()),
+ "LastModifiedDate": time.mktime(self.last_modified_date.timetuple()),
+ }
+
+ def to_json(self, extended=False):
+ identity_provider_json = self._base_json()
+ if extended:
+ identity_provider_json.update(self.extended_config)
+
+ return identity_provider_json
+
+
+class CognitoIdpGroup(BaseModel):
+ def __init__(self, user_pool_id, group_name, description, role_arn, precedence):
+ self.user_pool_id = user_pool_id
+ self.group_name = group_name
+ self.description = description or ""
+ self.role_arn = role_arn
+ self.precedence = precedence
+ self.last_modified_date = datetime.datetime.now()
+ self.creation_date = self.last_modified_date
+
+ # Users who are members of this group.
+ # Note that these links are bidirectional.
+ self.users = set()
+
+ def update(self, description, role_arn, precedence):
+ if description is not None:
+ self.description = description
+ if role_arn is not None:
+ self.role_arn = role_arn
+ if precedence is not None:
+ self.precedence = precedence
+ self.last_modified_date = datetime.datetime.now()
+
+ def to_json(self):
+ return {
+ "GroupName": self.group_name,
+ "UserPoolId": self.user_pool_id,
+ "Description": self.description,
+ "RoleArn": self.role_arn,
+ "Precedence": self.precedence,
+ "LastModifiedDate": time.mktime(self.last_modified_date.timetuple()),
+ "CreationDate": time.mktime(self.creation_date.timetuple()),
+ }
+
+
+class CognitoIdpUser(BaseModel):
+ def __init__(self, user_pool_id, username, password, status, attributes):
+ self.id = str(uuid.uuid4())
+ self.user_pool_id = user_pool_id
+ # Username is None when users sign up with an email or phone_number,
+ # and should be given the value of the internal id generate (sub)
+ self.username = username if username else self.id
+ self.password = password
+ self.status = status
+ self.enabled = True
+ self.attributes = attributes
+ self.attribute_lookup = flatten_attrs(attributes)
+ self.create_date = datetime.datetime.utcnow()
+ self.last_modified_date = datetime.datetime.utcnow()
+ self.sms_mfa_enabled = False
+ self.software_token_mfa_enabled = False
+ self.token_verified = False
+ self.confirmation_code = None
+ self.preferred_mfa_setting = None
+
+ # Groups this user is a member of.
+ # Note that these links are bidirectional.
+ self.groups = set()
+
+ self.update_attributes([{"Name": "sub", "Value": self.id}])
+
+ def _base_json(self):
+ return {
+ "UserPoolId": self.user_pool_id,
+ "Username": self.username,
+ "UserStatus": self.status,
+ "UserCreateDate": time.mktime(self.create_date.timetuple()),
+ "UserLastModifiedDate": time.mktime(self.last_modified_date.timetuple()),
+ }
+
+ # list_users brings back "Attributes" while admin_get_user brings back "UserAttributes".
+ def to_json(
+ self, extended=False, attributes_key="Attributes", attributes_to_get=None
+ ):
+ user_mfa_setting_list = []
+ if self.software_token_mfa_enabled:
+ user_mfa_setting_list.append("SOFTWARE_TOKEN_MFA")
+ elif self.sms_mfa_enabled:
+ user_mfa_setting_list.append("SMS_MFA")
+ user_json = self._base_json()
+ if extended:
+ attrs = [
+ attr
+ for attr in self.attributes
+ if not attributes_to_get or attr["Name"] in attributes_to_get
+ ]
+ user_json.update(
+ {
+ "Enabled": self.enabled,
+ attributes_key: attrs,
+ "MFAOptions": [],
+ "UserMFASettingList": user_mfa_setting_list,
+ "PreferredMfaSetting": self.preferred_mfa_setting or "",
+ }
+ )
+
+ return user_json
+
+ def update_attributes(self, new_attributes):
+ flat_attributes = flatten_attrs(self.attributes)
+ flat_attributes.update(flatten_attrs(new_attributes))
+ self.attribute_lookup = flat_attributes
+ self.attributes = expand_attrs(flat_attributes)
+
+ def delete_attributes(self, attrs_to_delete):
+ flat_attributes = flatten_attrs(self.attributes)
+ wrong_attrs = []
+ for attr in attrs_to_delete:
+ try:
+ flat_attributes.pop(attr)
+ except KeyError:
+ wrong_attrs.append(attr)
+ if wrong_attrs:
+ raise InvalidParameterException(
+ "Invalid user attributes: "
+ + "\n".join(
+ [
+ f"user.{w}: Attribute does not exist in the schema."
+ for w in wrong_attrs
+ ]
+ )
+ + "\n"
+ )
+ self.attribute_lookup = flat_attributes
+ self.attributes = expand_attrs(flat_attributes)
+
+
+class CognitoResourceServer(BaseModel):
+ def __init__(self, user_pool_id, identifier, name, scopes):
+ self.user_pool_id = user_pool_id
+ self.identifier = identifier
+ self.name = name
+ self.scopes = scopes
+
+ def to_json(self):
+ res = {
+ "UserPoolId": self.user_pool_id,
+ "Identifier": self.identifier,
+ "Name": self.name,
+ }
+
+ if len(self.scopes) != 0:
+ res.update({"Scopes": self.scopes})
+
+ return res
+
+
+class CognitoIdpBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.user_pools = OrderedDict()
+ self.user_pool_domains = OrderedDict()
+ self.sessions = {}
+
+ # User pool
+ def create_user_pool(self, name, extended_config):
+ user_pool = CognitoIdpUserPool(self.region_name, name, extended_config)
+ self.user_pools[user_pool.id] = user_pool
+ return user_pool
+
+ def set_user_pool_mfa_config(
+ self, user_pool_id, sms_config, token_config, mfa_config
+ ):
+ user_pool = self.describe_user_pool(user_pool_id)
+ user_pool.mfa_config = mfa_config
+ user_pool.sms_mfa_config = sms_config
+ user_pool.token_mfa_config = token_config
+
+ return self.get_user_pool_mfa_config(user_pool_id)
+
+ def get_user_pool_mfa_config(self, user_pool_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ return {
+ "SmsMfaConfiguration": user_pool.sms_mfa_config,
+ "SoftwareTokenMfaConfiguration": user_pool.token_mfa_config,
+ "MfaConfiguration": user_pool.mfa_config,
+ }
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_user_pools(self):
+ return list(self.user_pools.values())
+
+ def describe_user_pool(self, user_pool_id):
+ user_pool = self.user_pools.get(user_pool_id)
+ if not user_pool:
+ raise ResourceNotFoundError(f"User pool {user_pool_id} does not exist.")
+
+ return user_pool
+
+ def update_user_pool(self, user_pool_id, extended_config):
+ user_pool = self.describe_user_pool(user_pool_id)
+ user_pool.extended_config = extended_config
+
+ def delete_user_pool(self, user_pool_id):
+ self.describe_user_pool(user_pool_id)
+
+ del self.user_pools[user_pool_id]
+
+ # User pool domain
+ def create_user_pool_domain(self, user_pool_id, domain, custom_domain_config=None):
+ self.describe_user_pool(user_pool_id)
+
+ user_pool_domain = CognitoIdpUserPoolDomain(
+ user_pool_id, domain, custom_domain_config=custom_domain_config
+ )
+ self.user_pool_domains[domain] = user_pool_domain
+ return user_pool_domain
+
+ def describe_user_pool_domain(self, domain):
+ if domain not in self.user_pool_domains:
+ return None
+
+ return self.user_pool_domains[domain]
+
+ def delete_user_pool_domain(self, domain):
+ if domain not in self.user_pool_domains:
+ raise ResourceNotFoundError(domain)
+
+ del self.user_pool_domains[domain]
+
+ def update_user_pool_domain(self, domain, custom_domain_config):
+ if domain not in self.user_pool_domains:
+ raise ResourceNotFoundError(domain)
+
+ user_pool_domain = self.user_pool_domains[domain]
+ user_pool_domain.custom_domain_config = custom_domain_config
+ return user_pool_domain
+
+ # User pool client
+ def create_user_pool_client(self, user_pool_id, generate_secret, extended_config):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ user_pool_client = CognitoIdpUserPoolClient(
+ user_pool_id, generate_secret, extended_config
+ )
+ user_pool.clients[user_pool_client.id] = user_pool_client
+ return user_pool_client
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_user_pool_clients(self, user_pool_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ return list(user_pool.clients.values())
+
+ def describe_user_pool_client(self, user_pool_id, client_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ client = user_pool.clients.get(client_id)
+ if not client:
+ raise ResourceNotFoundError(client_id)
+
+ return client
+
+ def update_user_pool_client(self, user_pool_id, client_id, extended_config):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ client = user_pool.clients.get(client_id)
+ if not client:
+ raise ResourceNotFoundError(client_id)
+
+ client.extended_config.update(extended_config)
+ return client
+
+ def delete_user_pool_client(self, user_pool_id, client_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if client_id not in user_pool.clients:
+ raise ResourceNotFoundError(client_id)
+
+ del user_pool.clients[client_id]
+
+ # Identity provider
+ def create_identity_provider(self, user_pool_id, name, extended_config):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ identity_provider = CognitoIdpIdentityProvider(name, extended_config)
+ user_pool.identity_providers[name] = identity_provider
+ return identity_provider
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_identity_providers(self, user_pool_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ return list(user_pool.identity_providers.values())
+
+ def describe_identity_provider(self, user_pool_id, name):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ identity_provider = user_pool.identity_providers.get(name)
+ if not identity_provider:
+ raise ResourceNotFoundError(name)
+
+ return identity_provider
+
+ def update_identity_provider(self, user_pool_id, name, extended_config):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ identity_provider = user_pool.identity_providers.get(name)
+ if not identity_provider:
+ raise ResourceNotFoundError(name)
+
+ identity_provider.extended_config.update(extended_config)
+
+ return identity_provider
+
+ def delete_identity_provider(self, user_pool_id, name):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if name not in user_pool.identity_providers:
+ raise ResourceNotFoundError(name)
+
+ del user_pool.identity_providers[name]
+
+ # Group
+ def create_group(self, user_pool_id, group_name, description, role_arn, precedence):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ group = CognitoIdpGroup(
+ user_pool_id, group_name, description, role_arn, precedence
+ )
+ if group.group_name in user_pool.groups:
+ raise GroupExistsException("A group with the name already exists")
+ user_pool.groups[group.group_name] = group
+
+ return group
+
+ def get_group(self, user_pool_id, group_name):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if group_name not in user_pool.groups:
+ raise ResourceNotFoundError(group_name)
+
+ return user_pool.groups[group_name]
+
+ def list_groups(self, user_pool_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ return user_pool.groups.values()
+
+ def delete_group(self, user_pool_id, group_name):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if group_name not in user_pool.groups:
+ raise ResourceNotFoundError(group_name)
+
+ group = user_pool.groups[group_name]
+ for user in group.users:
+ user.groups.remove(group)
+
+ del user_pool.groups[group_name]
+
+ def update_group(self, user_pool_id, group_name, description, role_arn, precedence):
+ group = self.get_group(user_pool_id, group_name)
+
+ group.update(description, role_arn, precedence)
+
+ return group
+
+ def admin_add_user_to_group(self, user_pool_id, group_name, username):
+ group = self.get_group(user_pool_id, group_name)
+ user = self.admin_get_user(user_pool_id, username)
+
+ group.users.add(user)
+ user.groups.add(group)
+
+ def list_users_in_group(self, user_pool_id, group_name):
+ group = self.get_group(user_pool_id, group_name)
+ return list(group.users)
+
+ def admin_list_groups_for_user(self, user_pool_id, username):
+ user = self.admin_get_user(user_pool_id, username)
+ return list(user.groups)
+
+ def admin_remove_user_from_group(self, user_pool_id, group_name, username):
+ group = self.get_group(user_pool_id, group_name)
+ user = self.admin_get_user(user_pool_id, username)
+
+ group.users.discard(user)
+ user.groups.discard(group)
+
+ def admin_reset_user_password(self, user_pool_id, username):
+ user = self.admin_get_user(user_pool_id, username)
+ if not user.enabled:
+ raise NotAuthorizedError("User is disabled")
+ if user.status is UserStatus.RESET_REQUIRED:
+ return
+ if user.status is not UserStatus.CONFIRMED:
+ raise NotAuthorizedError(
+ "User password cannot be reset in the current state."
+ )
+ if (
+ user.attribute_lookup.get("email_verified", "false") == "false"
+ and user.attribute_lookup.get("phone_number_verified", "false") == "false"
+ ):
+ raise InvalidParameterException(
+ "Cannot reset password for the user as there is no registered/verified email or phone_number"
+ )
+ user.status = UserStatus.RESET_REQUIRED
+
+ # User
+ def admin_create_user(
+ self, user_pool_id, username, message_action, temporary_password, attributes
+ ):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if message_action and message_action == "RESEND":
+ self.admin_get_user(user_pool_id, username)
+ elif user_pool._get_user(username):
+ raise UsernameExistsException(username)
+
+ # UsernameAttributes are attributes (either `email` or `phone_number`
+ # or both) than can be used in the place of a unique username. If the
+ # user provides an email or phone number when signing up, the user pool
+ # performs the following steps:
+ # 1. populates the correct field (email, phone_number) with the value
+ # supplied for Username
+ # 2. generates a persistent GUID for the user that will be returned as
+ # the value of `Username` in the `get-user` and `list-users`
+ # operations, as well as the value of `sub` in `IdToken` and
+ # `AccessToken`
+ #
+ # ref: https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-aliases-settings
+ if user_pool.extended_config.get("UsernameAttributes"):
+ username_attributes = user_pool.extended_config["UsernameAttributes"]
+ # attribute_type should be one of `email`, `phone_number` or both
+ for attribute_type in username_attributes:
+ # check if provided username matches one of the attribute types in
+ # `UsernameAttributes`
+ if attribute_type in username_attributes and validate_username_format(
+ username, _format=attribute_type
+ ):
+ # insert provided username into new user's attributes under the
+ # correct key
+ flattened_attrs = flatten_attrs(attributes or {})
+ flattened_attrs.update({attribute_type: username})
+ attributes = expand_attrs(flattened_attrs)
+ # set username to None so that it will be default to the internal GUID
+ # when them user gets created
+ username = None
+ # once the username has been validated against a username attribute
+ # type, there is no need to attempt validation against the other
+ # type(s)
+ break
+
+ # The provided username has not matched the required format for any
+ # of the possible attributes
+ if username is not None:
+ raise InvalidParameterException(
+ "Username should be either an email or a phone number."
+ )
+
+ user = CognitoIdpUser(
+ user_pool_id,
+ username,
+ temporary_password,
+ UserStatus.FORCE_CHANGE_PASSWORD,
+ attributes,
+ )
+
+ user_pool.users[user.username] = user
+ return user
+
+ def admin_confirm_sign_up(self, user_pool_id, username):
+ user = self.admin_get_user(user_pool_id, username)
+ user.status = UserStatus["CONFIRMED"]
+ return ""
+
+ def admin_get_user(self, user_pool_id, username):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ user = user_pool._get_user(username)
+ if not user:
+ raise UserNotFoundError("User does not exist.")
+ return user
+
+ def get_user(self, access_token):
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user = self.admin_get_user(user_pool.id, username)
+ if (
+ not user
+ or not user.enabled
+ or user.status is not UserStatus.CONFIRMED
+ ):
+ raise NotAuthorizedError("username")
+ return user
+ raise NotAuthorizedError("Invalid token")
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_users(self, user_pool_id):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ return list(user_pool.users.values())
+
+ def admin_disable_user(self, user_pool_id, username):
+ user = self.admin_get_user(user_pool_id, username)
+ user.enabled = False
+
+ def admin_enable_user(self, user_pool_id, username):
+ user = self.admin_get_user(user_pool_id, username)
+ user.enabled = True
+
+ def admin_delete_user(self, user_pool_id, username):
+ user_pool = self.describe_user_pool(user_pool_id)
+ user = self.admin_get_user(user_pool_id, username)
+
+ for group in user.groups:
+ group.users.remove(user)
+
+ # use internal username
+ del user_pool.users[user.username]
+
+ def _log_user_in(self, user_pool, client, username):
+ refresh_token = user_pool.create_refresh_token(client.id, username)
+ access_token, id_token, expires_in = user_pool.create_tokens_from_refresh_token(
+ refresh_token
+ )
+
+ return {
+ "AuthenticationResult": {
+ "IdToken": id_token,
+ "AccessToken": access_token,
+ "RefreshToken": refresh_token,
+ "ExpiresIn": expires_in,
+ "TokenType": "Bearer",
+ }
+ }
+
+ def _validate_auth_flow(
+ self, auth_flow: str, valid_flows: typing.List[AuthFlow]
+ ) -> AuthFlow:
+ """validate auth_flow value and convert auth_flow to enum"""
+
+ try:
+ auth_flow = AuthFlow[auth_flow]
+ except KeyError:
+ raise InvalidParameterException(
+ f"1 validation error detected: Value '{auth_flow}' at 'authFlow' failed to satisfy constraint: "
+ f"Member must satisfy enum value set: "
+ f"{AuthFlow.list()}"
+ )
+
+ if auth_flow not in valid_flows:
+ raise InvalidParameterException("Initiate Auth method not supported")
+
+ return auth_flow
+
+ def admin_initiate_auth(self, user_pool_id, client_id, auth_flow, auth_parameters):
+ admin_auth_flows = [
+ AuthFlow.ADMIN_NO_SRP_AUTH,
+ AuthFlow.ADMIN_USER_PASSWORD_AUTH,
+ AuthFlow.REFRESH_TOKEN_AUTH,
+ AuthFlow.REFRESH_TOKEN,
+ ]
+ auth_flow = self._validate_auth_flow(
+ auth_flow=auth_flow, valid_flows=admin_auth_flows
+ )
+
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ client = user_pool.clients.get(client_id)
+ if not client:
+ raise ResourceNotFoundError(client_id)
+
+ if auth_flow in (AuthFlow.ADMIN_USER_PASSWORD_AUTH, AuthFlow.ADMIN_NO_SRP_AUTH):
+ username = auth_parameters.get("USERNAME")
+ password = auth_parameters.get("PASSWORD")
+ user = self.admin_get_user(user_pool_id, username)
+
+ if user.password != password:
+ raise NotAuthorizedError(username)
+
+ if user.status in [
+ UserStatus.FORCE_CHANGE_PASSWORD,
+ UserStatus.RESET_REQUIRED,
+ ]:
+ session = str(uuid.uuid4())
+ self.sessions[session] = user_pool
+
+ return {
+ "ChallengeName": "NEW_PASSWORD_REQUIRED",
+ "ChallengeParameters": {},
+ "Session": session,
+ }
+
+ return self._log_user_in(user_pool, client, username)
+ elif auth_flow is AuthFlow.REFRESH_TOKEN:
+ refresh_token = auth_parameters.get("REFRESH_TOKEN")
+ (
+ access_token,
+ id_token,
+ expires_in,
+ ) = user_pool.create_tokens_from_refresh_token(refresh_token)
+
+ return {
+ "AuthenticationResult": {
+ "IdToken": id_token,
+ "AccessToken": access_token,
+ "ExpiresIn": expires_in,
+ "TokenType": "Bearer",
+ }
+ }
+ else:
+ # We shouldn't get here due to enum validation of auth_flow
+ return None
+
+ def respond_to_auth_challenge(
+ self, session, client_id, challenge_name, challenge_responses
+ ):
+ if challenge_name == "PASSWORD_VERIFIER":
+ session = challenge_responses.get("PASSWORD_CLAIM_SECRET_BLOCK")
+
+ user_pool = self.sessions.get(session)
+ if not user_pool:
+ raise ResourceNotFoundError(session)
+
+ client = user_pool.clients.get(client_id)
+ if not client:
+ raise ResourceNotFoundError(client_id)
+
+ if challenge_name == "NEW_PASSWORD_REQUIRED":
+ username = challenge_responses.get("USERNAME")
+ new_password = challenge_responses.get("NEW_PASSWORD")
+ user = self.admin_get_user(user_pool.id, username)
+
+ user.password = new_password
+ user.status = UserStatus.CONFIRMED
+ del self.sessions[session]
+
+ return self._log_user_in(user_pool, client, username)
+ elif challenge_name == "PASSWORD_VERIFIER":
+ username = challenge_responses.get("USERNAME")
+ user = self.admin_get_user(user_pool.id, username)
+
+ password_claim_signature = challenge_responses.get(
+ "PASSWORD_CLAIM_SIGNATURE"
+ )
+ if not password_claim_signature:
+ raise ResourceNotFoundError(password_claim_signature)
+ password_claim_secret_block = challenge_responses.get(
+ "PASSWORD_CLAIM_SECRET_BLOCK"
+ )
+ if not password_claim_secret_block:
+ raise ResourceNotFoundError(password_claim_secret_block)
+ timestamp = challenge_responses.get("TIMESTAMP")
+ if not timestamp:
+ raise ResourceNotFoundError(timestamp)
+
+ if user.software_token_mfa_enabled:
+ return {
+ "ChallengeName": "SOFTWARE_TOKEN_MFA",
+ "Session": session,
+ "ChallengeParameters": {},
+ }
+
+ if user.sms_mfa_enabled:
+ return {
+ "ChallengeName": "SMS_MFA",
+ "Session": session,
+ "ChallengeParameters": {},
+ }
+
+ del self.sessions[session]
+ return self._log_user_in(user_pool, client, username)
+ elif challenge_name == "SOFTWARE_TOKEN_MFA":
+ username = challenge_responses.get("USERNAME")
+ self.admin_get_user(user_pool.id, username)
+
+ software_token_mfa_code = challenge_responses.get("SOFTWARE_TOKEN_MFA_CODE")
+ if not software_token_mfa_code:
+ raise ResourceNotFoundError(software_token_mfa_code)
+
+ if client.generate_secret:
+ secret_hash = challenge_responses.get("SECRET_HASH")
+ if not check_secret_hash(
+ client.secret, client.id, username, secret_hash
+ ):
+ raise NotAuthorizedError(secret_hash)
+
+ del self.sessions[session]
+ return self._log_user_in(user_pool, client, username)
+
+ else:
+ return {}
+
+ def confirm_forgot_password(self, client_id, username, password, confirmation_code):
+ for user_pool in self.user_pools.values():
+ if client_id in user_pool.clients and user_pool._get_user(username):
+ user = user_pool._get_user(username)
+ if (
+ confirmation_code.startswith("moto-confirmation-code:")
+ and user.confirmation_code != confirmation_code
+ ):
+ raise ExpiredCodeException(
+ "Invalid code provided, please request a code again."
+ )
+ user.password = password
+ user.confirmation_code = None
+ break
+ else:
+ raise ResourceNotFoundError(client_id)
+
+ def forgot_password(self, client_id, username):
+ """
+ The ForgotPassword operation is partially broken in AWS. If the input is 100% correct it works fine.
+
+ Otherwise you get semi-random garbage and HTTP 200 OK, for example:
+ - recovery for username which is not registered in any cognito pool
+ - recovery for username belonging to a different user pool than the client id is registered to
+ - phone-based recovery for a user without phone_number / phone_number_verified attributes
+ - same as above, but email / email_verified
+ """
+ for user_pool in self.user_pools.values():
+ if client_id in user_pool.clients:
+ recovery_settings = user_pool._account_recovery_setting()
+ user = user_pool._get_user(username)
+ break
+ else:
+ raise ResourceNotFoundError("Username/client id combination not found.")
+
+ confirmation_code = None
+ if user:
+ # An unfortunate bit of magic - confirmation_code is opt-in, as it's returned
+ # via a "x-moto-forgot-password-confirmation-code" http header, which is not the AWS way (should be SES, SNS, Cognito built-in email)
+ # Verification of user.confirmation_code vs received code will be performed only for codes
+ # beginning with 'moto-confirmation-code' prefix. All other codes are considered VALID.
+ confirmation_code = (
+ f"moto-confirmation-code:{random.randint(100_000, 999_999)}"
+ )
+ user.confirmation_code = confirmation_code
+
+ code_delivery_details = {
+ "Destination": username + "@h***.com"
+ if not user
+ else user.attribute_lookup.get("email", username + "@h***.com"),
+ "DeliveryMedium": "EMAIL",
+ "AttributeName": "email",
+ }
+ selected_recovery = min(
+ recovery_settings["RecoveryMechanisms"],
+ key=lambda recovery_mechanism: recovery_mechanism["Priority"],
+ )
+ if selected_recovery["Name"] == "admin_only":
+ raise NotAuthorizedError("Contact administrator to reset password.")
+ if selected_recovery["Name"] == "verified_phone_number":
+ code_delivery_details = {
+ "Destination": "+*******9934"
+ if not user
+ else user.attribute_lookup.get("phone_number", "+*******9934"),
+ "DeliveryMedium": "SMS",
+ "AttributeName": "phone_number",
+ }
+ return confirmation_code, {"CodeDeliveryDetails": code_delivery_details}
+
+ def change_password(self, access_token, previous_password, proposed_password):
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user = self.admin_get_user(user_pool.id, username)
+
+ if user.password != previous_password:
+ raise NotAuthorizedError(username)
+
+ user.password = proposed_password
+ if user.status in [
+ UserStatus.FORCE_CHANGE_PASSWORD,
+ UserStatus.RESET_REQUIRED,
+ ]:
+ user.status = UserStatus.CONFIRMED
+
+ break
+ else:
+ raise NotAuthorizedError(access_token)
+
+ def admin_update_user_attributes(self, user_pool_id, username, attributes):
+ user = self.admin_get_user(user_pool_id, username)
+
+ user.update_attributes(attributes)
+
+ def admin_delete_user_attributes(self, user_pool_id, username, attributes):
+ self.admin_get_user(user_pool_id, username).delete_attributes(attributes)
+
+ def admin_user_global_sign_out(self, user_pool_id, username):
+ user_pool = self.describe_user_pool(user_pool_id)
+ self.admin_get_user(user_pool_id, username)
+
+ user_pool.sign_out(username)
+
+ def global_sign_out(self, access_token):
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user_pool.sign_out(username)
+ return
+
+ raise NotAuthorizedError(access_token)
+
+ def create_resource_server(self, user_pool_id, identifier, name, scopes):
+ user_pool = self.describe_user_pool(user_pool_id)
+
+ if identifier in user_pool.resource_servers:
+ raise InvalidParameterException(
+ "%s already exists in user pool %s." % (identifier, user_pool_id)
+ )
+
+ resource_server = CognitoResourceServer(user_pool_id, identifier, name, scopes)
+ user_pool.resource_servers[identifier] = resource_server
+ return resource_server
+
+ def sign_up(self, client_id, username, password, attributes):
+ user_pool = None
+ for p in self.user_pools.values():
+ if client_id in p.clients:
+ user_pool = p
+ if user_pool is None:
+ raise ResourceNotFoundError(client_id)
+ elif user_pool._get_user(username):
+ raise UsernameExistsException(username)
+
+ # UsernameAttributes are attributes (either `email` or `phone_number`
+ # or both) than can be used in the place of a unique username. If the
+ # user provides an email or phone number when signing up, the user pool
+ # performs the following steps:
+ # 1. populates the correct field (email, phone_number) with the value
+ # supplied for Username
+ # 2. generates a persistent GUID for the user that will be returned as
+ # the value of `Username` in the `get-user` and `list-users`
+ # operations, as well as the value of `sub` in `IdToken` and
+ # `AccessToken`
+ #
+ # ref: https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-aliases-settings
+ if user_pool.extended_config.get("UsernameAttributes"):
+ username_attributes = user_pool.extended_config["UsernameAttributes"]
+ # attribute_type should be one of `email`, `phone_number` or both
+ for attribute_type in username_attributes:
+ # check if provided username matches one of the attribute types in
+ # `UsernameAttributes`
+ if attribute_type in username_attributes and validate_username_format(
+ username, _format=attribute_type
+ ):
+ # insert provided username into new user's attributes under the
+ # correct key
+ flattened_attrs = flatten_attrs(attributes or {})
+ flattened_attrs.update({attribute_type: username})
+ attributes = expand_attrs(flattened_attrs)
+ # set username to None so that it will be default to the internal GUID
+ # when them user gets created
+ username = None
+ # once the username has been validated against a username attribute
+ # type, there is no need to attempt validation against the other
+ # type(s)
+ break
+
+ # The provided username has not matched the required format for any
+ # of the possible attributes
+ if username is not None:
+ raise InvalidParameterException(
+ "Username should be either an email or a phone number."
+ )
+
+ user = CognitoIdpUser(
+ user_pool_id=user_pool.id,
+ username=username,
+ password=password,
+ attributes=attributes,
+ status=UserStatus.UNCONFIRMED,
+ )
+ user_pool.users[user.username] = user
+ return user
+
+ def confirm_sign_up(self, client_id, username):
+ user_pool = None
+ for p in self.user_pools.values():
+ if client_id in p.clients:
+ user_pool = p
+ if user_pool is None:
+ raise ResourceNotFoundError(client_id)
+
+ user = self.admin_get_user(user_pool.id, username)
+
+ user.status = UserStatus.CONFIRMED
+ return ""
+
+ def initiate_auth(self, client_id, auth_flow, auth_parameters):
+ user_auth_flows = [
+ AuthFlow.USER_SRP_AUTH,
+ AuthFlow.REFRESH_TOKEN_AUTH,
+ AuthFlow.REFRESH_TOKEN,
+ AuthFlow.CUSTOM_AUTH,
+ AuthFlow.USER_PASSWORD_AUTH,
+ ]
+
+ auth_flow = self._validate_auth_flow(
+ auth_flow=auth_flow, valid_flows=user_auth_flows
+ )
+
+ user_pool = None
+ for p in self.user_pools.values():
+ if client_id in p.clients:
+ user_pool = p
+ if user_pool is None:
+ raise ResourceNotFoundError(client_id)
+
+ client = p.clients.get(client_id)
+
+ if auth_flow is AuthFlow.USER_SRP_AUTH:
+ username = auth_parameters.get("USERNAME")
+ srp_a = auth_parameters.get("SRP_A")
+ if not srp_a:
+ raise ResourceNotFoundError(srp_a)
+ if client.generate_secret:
+ secret_hash = auth_parameters.get("SECRET_HASH")
+ if not check_secret_hash(
+ client.secret, client.id, username, secret_hash
+ ):
+ raise NotAuthorizedError(secret_hash)
+
+ user = self.admin_get_user(user_pool.id, username)
+
+ if user.status is UserStatus.UNCONFIRMED:
+ raise UserNotConfirmedException("User is not confirmed.")
+
+ session = str(uuid.uuid4())
+ self.sessions[session] = user_pool
+
+ return {
+ "ChallengeName": "PASSWORD_VERIFIER",
+ "Session": session,
+ "ChallengeParameters": {
+ "SALT": uuid.uuid4().hex,
+ "SRP_B": uuid.uuid4().hex,
+ "USERNAME": user.username,
+ "USER_ID_FOR_SRP": user.id,
+ "SECRET_BLOCK": session,
+ },
+ }
+ elif auth_flow is AuthFlow.USER_PASSWORD_AUTH:
+ username = auth_parameters.get("USERNAME")
+ password = auth_parameters.get("PASSWORD")
+
+ user = self.admin_get_user(user_pool.id, username)
+
+ if not user:
+ raise UserNotFoundError(username)
+
+ if user.password != password:
+ raise NotAuthorizedError("Incorrect username or password.")
+
+ if user.status is UserStatus.UNCONFIRMED:
+ raise UserNotConfirmedException("User is not confirmed.")
+
+ session = str(uuid.uuid4())
+ self.sessions[session] = user_pool
+
+ if user.status is UserStatus.FORCE_CHANGE_PASSWORD:
+ return {
+ "ChallengeName": "NEW_PASSWORD_REQUIRED",
+ "ChallengeParameters": {"USERNAME": user.username},
+ "Session": session,
+ }
+
+ access_token, expires_in = user_pool.create_access_token(
+ client_id, username
+ )
+ id_token, _ = user_pool.create_id_token(client_id, username)
+ refresh_token = user_pool.create_refresh_token(client_id, username)
+
+ return {
+ "AuthenticationResult": {
+ "IdToken": id_token,
+ "AccessToken": access_token,
+ "ExpiresIn": expires_in,
+ "RefreshToken": refresh_token,
+ "TokenType": "Bearer",
+ }
+ }
+ elif auth_flow in (AuthFlow.REFRESH_TOKEN, AuthFlow.REFRESH_TOKEN_AUTH):
+ refresh_token = auth_parameters.get("REFRESH_TOKEN")
+ if not refresh_token:
+ raise ResourceNotFoundError(refresh_token)
+
+ if user_pool.refresh_tokens[refresh_token] is None:
+ raise NotAuthorizedError("Refresh Token has been revoked")
+
+ client_id, username = user_pool.refresh_tokens[refresh_token]
+ if not username:
+ raise ResourceNotFoundError(username)
+
+ if client.generate_secret:
+ secret_hash = auth_parameters.get("SECRET_HASH")
+ if not check_secret_hash(
+ client.secret, client.id, username, secret_hash
+ ):
+ raise NotAuthorizedError(secret_hash)
+
+ (
+ access_token,
+ id_token,
+ expires_in,
+ ) = user_pool.create_tokens_from_refresh_token(refresh_token)
+
+ return {
+ "AuthenticationResult": {
+ "IdToken": id_token,
+ "AccessToken": access_token,
+ "ExpiresIn": expires_in,
+ "TokenType": "Bearer",
+ }
+ }
+ else:
+ # We shouldn't get here due to enum validation of auth_flow
+ return None
+
+ def associate_software_token(self, access_token):
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ self.admin_get_user(user_pool.id, username)
+
+ return {"SecretCode": str(uuid.uuid4())}
+
+ raise NotAuthorizedError(access_token)
+
+ def verify_software_token(self, access_token):
+ """
+ The parameter UserCode has not yet been implemented
+ """
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user = self.admin_get_user(user_pool.id, username)
+
+ user.token_verified = True
+
+ return {"Status": "SUCCESS"}
+
+ raise NotAuthorizedError(access_token)
+
+ def set_user_mfa_preference(
+ self, access_token, software_token_mfa_settings, sms_mfa_settings
+ ):
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user = self.admin_get_user(user_pool.id, username)
+
+ if software_token_mfa_settings and software_token_mfa_settings.get(
+ "Enabled"
+ ):
+ if user.token_verified:
+ user.software_token_mfa_enabled = True
+ else:
+ raise InvalidParameterException(
+ "User has not verified software token mfa"
+ )
+
+ if software_token_mfa_settings.get("PreferredMfa"):
+ user.preferred_mfa_setting = "SOFTWARE_TOKEN_MFA"
+ elif sms_mfa_settings and sms_mfa_settings["Enabled"]:
+ user.sms_mfa_enabled = True
+
+ if sms_mfa_settings.get("PreferredMfa"):
+ user.preferred_mfa_setting = "SMS_MFA"
+ return None
+
+ raise NotAuthorizedError(access_token)
+
+ def admin_set_user_mfa_preference(
+ self, user_pool_id, username, software_token_mfa_settings, sms_mfa_settings
+ ):
+ user = self.admin_get_user(user_pool_id, username)
+
+ if software_token_mfa_settings and software_token_mfa_settings.get("Enabled"):
+ if user.token_verified:
+ user.software_token_mfa_enabled = True
+ else:
+ raise InvalidParameterException(
+ "User has not verified software token mfa"
+ )
+
+ if software_token_mfa_settings.get("PreferredMfa"):
+ user.preferred_mfa_setting = "SOFTWARE_TOKEN_MFA"
+ elif sms_mfa_settings and sms_mfa_settings.get("Enabled"):
+ user.sms_mfa_enabled = True
+
+ if sms_mfa_settings.get("PreferredMfa"):
+ user.preferred_mfa_setting = "SMS_MFA"
+ return None
+
+ def admin_set_user_password(self, user_pool_id, username, password, permanent):
+ user = self.admin_get_user(user_pool_id, username)
+ user.password = password
+ if permanent:
+ user.status = UserStatus.CONFIRMED
+ else:
+ user.status = UserStatus.FORCE_CHANGE_PASSWORD
+
+ def add_custom_attributes(self, user_pool_id, custom_attributes):
+ user_pool = self.describe_user_pool(user_pool_id)
+ user_pool.add_custom_attributes(custom_attributes)
+
+ def update_user_attributes(self, access_token, attributes):
+ """
+ The parameter ClientMetadata has not yet been implemented. No CodeDeliveryDetails are returned.
+ """
+ for user_pool in self.user_pools.values():
+ if access_token in user_pool.access_tokens:
+ _, username = user_pool.access_tokens[access_token]
+ user = self.admin_get_user(user_pool.id, username)
+
+ user.update_attributes(attributes)
+ return
+
+ raise NotAuthorizedError(access_token)
+
+
+class RegionAgnosticBackend:
+ # Some operations are unauthenticated
+ # Without authentication-header, we lose the context of which region the request was send to
+ # This backend will cycle through all backends as a workaround
+
+ def _find_backend_by_access_token(self, access_token):
+ account_specific_backends = cognitoidp_backends[get_account_id()]
+ for region, backend in account_specific_backends.items():
+ if region == "global":
+ continue
+ for p in backend.user_pools.values():
+ if access_token in p.access_tokens:
+ return backend
+ return account_specific_backends["us-east-1"]
+
+ def _find_backend_for_clientid(self, client_id):
+ account_specific_backends = cognitoidp_backends[get_account_id()]
+ for region, backend in account_specific_backends.items():
+ if region == "global":
+ continue
+ for p in backend.user_pools.values():
+ if client_id in p.clients:
+ return backend
+ return account_specific_backends["us-east-1"]
+
+ def sign_up(self, client_id, username, password, attributes):
+ backend = self._find_backend_for_clientid(client_id)
+ return backend.sign_up(client_id, username, password, attributes)
+
+ def initiate_auth(self, client_id, auth_flow, auth_parameters):
+ backend = self._find_backend_for_clientid(client_id)
+ return backend.initiate_auth(client_id, auth_flow, auth_parameters)
+
+ def confirm_sign_up(self, client_id, username):
+ backend = self._find_backend_for_clientid(client_id)
+ return backend.confirm_sign_up(client_id, username)
+
+ def get_user(self, access_token):
+ backend = self._find_backend_by_access_token(access_token)
+ return backend.get_user(access_token)
+
+ def respond_to_auth_challenge(
+ self, session, client_id, challenge_name, challenge_responses
+ ):
+ backend = self._find_backend_for_clientid(client_id)
+ return backend.respond_to_auth_challenge(
+ session, client_id, challenge_name, challenge_responses
+ )
+
+
+cognitoidp_backends = BackendDict(CognitoIdpBackend, "cognito-idp")
+
+
+# Hack to help moto-server process requests on localhost, where the region isn't
+# specified in the host header. Some endpoints (change password, confirm forgot
+# password) have no authorization header from which to extract the region.
+def find_region_by_value(key, value):
+ account_specific_backends = cognitoidp_backends[get_account_id()]
+ for region in account_specific_backends:
+ backend = cognitoidp_backends[region]
+ for user_pool in backend.user_pools.values():
+ if key == "client_id" and value in user_pool.clients:
+ return region
+
+ if key == "access_token" and value in user_pool.access_tokens:
+ return region
+ # If we can't find the `client_id` or `access_token`, we just pass
+ # back a default backend region, which will raise the appropriate
+ # error message (e.g. NotAuthorized or NotFound).
+ return list(account_specific_backends)[0]
diff --git a/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-private.json b/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-private.json
new file mode 100644
index 0000000000..8dde9c336e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-private.json
@@ -0,0 +1,9 @@
+{
+ "alg": "RS256",
+ "d": "DrrLT2qMERN0Id-bNglOe6SVkUNF3MTIzrH-TVkMZhsHk8kyqiqt-8JbLQMh2gOgTIjpu93b2_UREGA0BGdWs34hv0v7Gx8uIngCY6e6XO8LDemOo-2VHZHl5Ew-lrRYhwq12c_c4mfavAdMzXHODrpXSnqLnbFK88S-3fu6Da4czc4Svo4v8MkGZk_fcTml3Y1jIFHxbbTWka37j4NLpAzdfvX--J086m-LbZ8CJL_lGMKbAKsWURMmzCFL9ZFH9JdzX79KeDOH0GrzGwS_cOsZHsCamF_CWrtG4asPt-SHyn_k0X4JJJgAWVA674VCqorMAPDVYIzKJOUMImmsEQ",
+ "e": "AQAB",
+ "kid": "dummy",
+ "kty": "RSA",
+ "n": "j1pT3xKbswmMySvCefmiD3mfDaRFpZ9Y3Jl4fF0hMaCRVAt_e0yR7BeueDfqmj_NhVSO0WB5ao5e8V-9RFQOtK8SrqKl3i01-CyWYPICwybaGKhbJJR0S_6cZ8n5kscF1MjpIlsJcCzm-yKgTc3Mxk6KtrLoNgRvMwGLeHUXPkhS9YHfDKRe864iMFOK4df69brIYEICG2VLduh0hXYa0i-J3drwm7vxNdX7pVpCDu34qJtYoWq6CXt3Tzfi3YfWp8cFjGNbaDa3WnCd2IXpp0TFsFS-cEsw5rJjSl5OllJGeZKBtLeyVTy9PYwnk7MW43WSYeYstbk9NluX4H8Iuw",
+ "use": "sig"
+}
diff --git a/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-public.json b/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-public.json
new file mode 100644
index 0000000000..a5309c7f57
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/resources/jwks-public.json
@@ -0,0 +1,12 @@
+{
+ "keys": [
+ {
+ "alg": "RS256",
+ "e": "AQAB",
+ "kid": "dummy",
+ "kty": "RSA",
+ "n": "j1pT3xKbswmMySvCefmiD3mfDaRFpZ9Y3Jl4fF0hMaCRVAt_e0yR7BeueDfqmj_NhVSO0WB5ao5e8V-9RFQOtK8SrqKl3i01-CyWYPICwybaGKhbJJR0S_6cZ8n5kscF1MjpIlsJcCzm-yKgTc3Mxk6KtrLoNgRvMwGLeHUXPkhS9YHfDKRe864iMFOK4df69brIYEICG2VLduh0hXYa0i-J3drwm7vxNdX7pVpCDu34qJtYoWq6CXt3Tzfi3YfWp8cFjGNbaDa3WnCd2IXpp0TFsFS-cEsw5rJjSl5OllJGeZKBtLeyVTy9PYwnk7MW43WSYeYstbk9NluX4H8Iuw",
+ "use": "sig"
+ }
+ ]
+}
diff --git a/contrib/python/moto/py3/moto/cognitoidp/responses.py b/contrib/python/moto/py3/moto/cognitoidp/responses.py
new file mode 100644
index 0000000000..4a134dfb52
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/responses.py
@@ -0,0 +1,640 @@
+import json
+import os
+import re
+
+from moto.core.responses import BaseResponse
+from .models import (
+ cognitoidp_backends,
+ find_region_by_value,
+ RegionAgnosticBackend,
+ UserStatus,
+)
+from .exceptions import InvalidParameterException
+
+
+region_agnostic_backend = RegionAgnosticBackend()
+
+
+class CognitoIdpResponse(BaseResponse):
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ # User pool
+ def create_user_pool(self):
+ name = self.parameters.pop("PoolName")
+ user_pool = cognitoidp_backends[self.region].create_user_pool(
+ name, self.parameters
+ )
+ return json.dumps({"UserPool": user_pool.to_json(extended=True)})
+
+ def set_user_pool_mfa_config(self):
+ user_pool_id = self._get_param("UserPoolId")
+ sms_config = self._get_param("SmsMfaConfiguration", None)
+ token_config = self._get_param("SoftwareTokenMfaConfiguration", None)
+ mfa_config = self._get_param("MfaConfiguration")
+
+ if mfa_config not in ["ON", "OFF", "OPTIONAL"]:
+ raise InvalidParameterException(
+ "[MfaConfiguration] must be one of 'ON', 'OFF', or 'OPTIONAL'."
+ )
+
+ if mfa_config in ["ON", "OPTIONAL"]:
+ if sms_config is None and token_config is None:
+ raise InvalidParameterException(
+ "At least one of [SmsMfaConfiguration] or [SoftwareTokenMfaConfiguration] must be provided."
+ )
+ if sms_config is not None:
+ if "SmsConfiguration" not in sms_config:
+ raise InvalidParameterException(
+ "[SmsConfiguration] is a required member of [SoftwareTokenMfaConfiguration]."
+ )
+
+ response = cognitoidp_backends[self.region].set_user_pool_mfa_config(
+ user_pool_id, sms_config, token_config, mfa_config
+ )
+ return json.dumps(response)
+
+ def get_user_pool_mfa_config(self):
+ user_pool_id = self._get_param("UserPoolId")
+ response = cognitoidp_backends[self.region].get_user_pool_mfa_config(
+ user_pool_id
+ )
+ return json.dumps(response)
+
+ def list_user_pools(self):
+ max_results = self._get_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ user_pools, next_token = cognitoidp_backends[self.region].list_user_pools(
+ max_results=max_results, next_token=next_token
+ )
+ response = {"UserPools": [user_pool.to_json() for user_pool in user_pools]}
+ if next_token:
+ response["NextToken"] = str(next_token)
+ return json.dumps(response)
+
+ def describe_user_pool(self):
+ user_pool_id = self._get_param("UserPoolId")
+ user_pool = cognitoidp_backends[self.region].describe_user_pool(user_pool_id)
+ return json.dumps({"UserPool": user_pool.to_json(extended=True)})
+
+ def update_user_pool(self):
+ user_pool_id = self._get_param("UserPoolId")
+ cognitoidp_backends[self.region].update_user_pool(user_pool_id, self.parameters)
+
+ def delete_user_pool(self):
+ user_pool_id = self._get_param("UserPoolId")
+ cognitoidp_backends[self.region].delete_user_pool(user_pool_id)
+ return ""
+
+ # User pool domain
+ def create_user_pool_domain(self):
+ domain = self._get_param("Domain")
+ user_pool_id = self._get_param("UserPoolId")
+ custom_domain_config = self._get_param("CustomDomainConfig")
+ user_pool_domain = cognitoidp_backends[self.region].create_user_pool_domain(
+ user_pool_id, domain, custom_domain_config
+ )
+ domain_description = user_pool_domain.to_json(extended=False)
+ if domain_description:
+ return json.dumps(domain_description)
+ return ""
+
+ def describe_user_pool_domain(self):
+ domain = self._get_param("Domain")
+ user_pool_domain = cognitoidp_backends[self.region].describe_user_pool_domain(
+ domain
+ )
+ domain_description = {}
+ if user_pool_domain:
+ domain_description = user_pool_domain.to_json()
+
+ return json.dumps({"DomainDescription": domain_description})
+
+ def delete_user_pool_domain(self):
+ domain = self._get_param("Domain")
+ cognitoidp_backends[self.region].delete_user_pool_domain(domain)
+ return ""
+
+ def update_user_pool_domain(self):
+ domain = self._get_param("Domain")
+ custom_domain_config = self._get_param("CustomDomainConfig")
+ user_pool_domain = cognitoidp_backends[self.region].update_user_pool_domain(
+ domain, custom_domain_config
+ )
+ domain_description = user_pool_domain.to_json(extended=False)
+ if domain_description:
+ return json.dumps(domain_description)
+ return ""
+
+ # User pool client
+ def create_user_pool_client(self):
+ user_pool_id = self.parameters.pop("UserPoolId")
+ generate_secret = self.parameters.pop("GenerateSecret", False)
+ user_pool_client = cognitoidp_backends[self.region].create_user_pool_client(
+ user_pool_id, generate_secret, self.parameters
+ )
+ return json.dumps({"UserPoolClient": user_pool_client.to_json(extended=True)})
+
+ def list_user_pool_clients(self):
+ user_pool_id = self._get_param("UserPoolId")
+ max_results = self._get_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ user_pool_clients, next_token = cognitoidp_backends[
+ self.region
+ ].list_user_pool_clients(
+ user_pool_id, max_results=max_results, next_token=next_token
+ )
+ response = {
+ "UserPoolClients": [
+ user_pool_client.to_json() for user_pool_client in user_pool_clients
+ ]
+ }
+ if next_token:
+ response["NextToken"] = str(next_token)
+ return json.dumps(response)
+
+ def describe_user_pool_client(self):
+ user_pool_id = self._get_param("UserPoolId")
+ client_id = self._get_param("ClientId")
+ user_pool_client = cognitoidp_backends[self.region].describe_user_pool_client(
+ user_pool_id, client_id
+ )
+ return json.dumps({"UserPoolClient": user_pool_client.to_json(extended=True)})
+
+ def update_user_pool_client(self):
+ user_pool_id = self.parameters.pop("UserPoolId")
+ client_id = self.parameters.pop("ClientId")
+ user_pool_client = cognitoidp_backends[self.region].update_user_pool_client(
+ user_pool_id, client_id, self.parameters
+ )
+ return json.dumps({"UserPoolClient": user_pool_client.to_json(extended=True)})
+
+ def delete_user_pool_client(self):
+ user_pool_id = self._get_param("UserPoolId")
+ client_id = self._get_param("ClientId")
+ cognitoidp_backends[self.region].delete_user_pool_client(
+ user_pool_id, client_id
+ )
+ return ""
+
+ # Identity provider
+ def create_identity_provider(self):
+ user_pool_id = self._get_param("UserPoolId")
+ name = self.parameters.pop("ProviderName")
+ identity_provider = cognitoidp_backends[self.region].create_identity_provider(
+ user_pool_id, name, self.parameters
+ )
+ return json.dumps(
+ {"IdentityProvider": identity_provider.to_json(extended=True)}
+ )
+
+ def list_identity_providers(self):
+ user_pool_id = self._get_param("UserPoolId")
+ max_results = self._get_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ identity_providers, next_token = cognitoidp_backends[
+ self.region
+ ].list_identity_providers(
+ user_pool_id, max_results=max_results, next_token=next_token
+ )
+ response = {
+ "Providers": [
+ identity_provider.to_json() for identity_provider in identity_providers
+ ]
+ }
+ if next_token:
+ response["NextToken"] = str(next_token)
+ return json.dumps(response)
+
+ def describe_identity_provider(self):
+ user_pool_id = self._get_param("UserPoolId")
+ name = self._get_param("ProviderName")
+ identity_provider = cognitoidp_backends[self.region].describe_identity_provider(
+ user_pool_id, name
+ )
+ return json.dumps(
+ {"IdentityProvider": identity_provider.to_json(extended=True)}
+ )
+
+ def update_identity_provider(self):
+ user_pool_id = self._get_param("UserPoolId")
+ name = self._get_param("ProviderName")
+ identity_provider = cognitoidp_backends[self.region].update_identity_provider(
+ user_pool_id, name, self.parameters
+ )
+ return json.dumps(
+ {"IdentityProvider": identity_provider.to_json(extended=True)}
+ )
+
+ def delete_identity_provider(self):
+ user_pool_id = self._get_param("UserPoolId")
+ name = self._get_param("ProviderName")
+ cognitoidp_backends[self.region].delete_identity_provider(user_pool_id, name)
+ return ""
+
+ # Group
+ def create_group(self):
+ group_name = self._get_param("GroupName")
+ user_pool_id = self._get_param("UserPoolId")
+ description = self._get_param("Description")
+ role_arn = self._get_param("RoleArn")
+ precedence = self._get_param("Precedence")
+
+ group = cognitoidp_backends[self.region].create_group(
+ user_pool_id, group_name, description, role_arn, precedence
+ )
+
+ return json.dumps({"Group": group.to_json()})
+
+ def get_group(self):
+ group_name = self._get_param("GroupName")
+ user_pool_id = self._get_param("UserPoolId")
+ group = cognitoidp_backends[self.region].get_group(user_pool_id, group_name)
+ return json.dumps({"Group": group.to_json()})
+
+ def list_groups(self):
+ user_pool_id = self._get_param("UserPoolId")
+ groups = cognitoidp_backends[self.region].list_groups(user_pool_id)
+ return json.dumps({"Groups": [group.to_json() for group in groups]})
+
+ def delete_group(self):
+ group_name = self._get_param("GroupName")
+ user_pool_id = self._get_param("UserPoolId")
+ cognitoidp_backends[self.region].delete_group(user_pool_id, group_name)
+ return ""
+
+ def update_group(self):
+ group_name = self._get_param("GroupName")
+ user_pool_id = self._get_param("UserPoolId")
+ description = self._get_param("Description")
+ role_arn = self._get_param("RoleArn")
+ precedence = self._get_param("Precedence")
+
+ group = cognitoidp_backends[self.region].update_group(
+ user_pool_id, group_name, description, role_arn, precedence
+ )
+
+ return json.dumps({"Group": group.to_json()})
+
+ def admin_add_user_to_group(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ group_name = self._get_param("GroupName")
+
+ cognitoidp_backends[self.region].admin_add_user_to_group(
+ user_pool_id, group_name, username
+ )
+
+ return ""
+
+ def list_users_in_group(self):
+ user_pool_id = self._get_param("UserPoolId")
+ group_name = self._get_param("GroupName")
+ users = cognitoidp_backends[self.region].list_users_in_group(
+ user_pool_id, group_name
+ )
+ return json.dumps({"Users": [user.to_json(extended=True) for user in users]})
+
+ def admin_list_groups_for_user(self):
+ username = self._get_param("Username")
+ user_pool_id = self._get_param("UserPoolId")
+ groups = cognitoidp_backends[self.region].admin_list_groups_for_user(
+ user_pool_id, username
+ )
+ return json.dumps({"Groups": [group.to_json() for group in groups]})
+
+ def admin_remove_user_from_group(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ group_name = self._get_param("GroupName")
+
+ cognitoidp_backends[self.region].admin_remove_user_from_group(
+ user_pool_id, group_name, username
+ )
+
+ return ""
+
+ def admin_reset_user_password(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ cognitoidp_backends[self.region].admin_reset_user_password(
+ user_pool_id, username
+ )
+ return ""
+
+ # User
+ def admin_create_user(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ message_action = self._get_param("MessageAction")
+ temporary_password = self._get_param("TemporaryPassword")
+ user = cognitoidp_backends[self.region].admin_create_user(
+ user_pool_id,
+ username,
+ message_action,
+ temporary_password,
+ self._get_param("UserAttributes", []),
+ )
+
+ return json.dumps({"User": user.to_json(extended=True)})
+
+ def admin_confirm_sign_up(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ return cognitoidp_backends[self.region].admin_confirm_sign_up(
+ user_pool_id, username
+ )
+
+ def admin_get_user(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ user = cognitoidp_backends[self.region].admin_get_user(user_pool_id, username)
+ return json.dumps(user.to_json(extended=True, attributes_key="UserAttributes"))
+
+ def get_user(self):
+ access_token = self._get_param("AccessToken")
+ user = region_agnostic_backend.get_user(access_token=access_token)
+ return json.dumps(user.to_json(extended=True, attributes_key="UserAttributes"))
+
+ def list_users(self):
+ user_pool_id = self._get_param("UserPoolId")
+ limit = self._get_param("Limit")
+ token = self._get_param("PaginationToken")
+ filt = self._get_param("Filter")
+ attributes_to_get = self._get_param("AttributesToGet")
+ users, token = cognitoidp_backends[self.region].list_users(
+ user_pool_id, limit=limit, pagination_token=token
+ )
+ if filt:
+ inherent_attributes = {
+ "cognito:user_status": lambda u: u.status,
+ "status": lambda u: "Enabled" if u.enabled else "Disabled",
+ "username": lambda u: u.username,
+ }
+ comparisons = {"=": lambda x, y: x == y, "^=": lambda x, y: x.startswith(y)}
+ allowed_attributes = [
+ "username",
+ "email",
+ "phone_number",
+ "name",
+ "given_name",
+ "family_name",
+ "preferred_username",
+ "cognito:user_status",
+ "status",
+ "sub",
+ ]
+
+ match = re.match(r"([\w:]+)\s*(=|\^=)\s*\"(.*)\"", filt)
+ if match:
+ name, op, value = match.groups()
+ else:
+ raise InvalidParameterException("Error while parsing filter")
+ if name not in allowed_attributes:
+ raise InvalidParameterException(f"Invalid search attribute: {name}")
+ compare = comparisons[op]
+ users = [
+ user
+ for user in users
+ if [
+ attr
+ for attr in user.attributes
+ if attr["Name"] == name and compare(attr["Value"], value)
+ ]
+ or (
+ name in inherent_attributes
+ and compare(inherent_attributes[name](user), value)
+ )
+ ]
+ response = {
+ "Users": [
+ user.to_json(extended=True, attributes_to_get=attributes_to_get)
+ for user in users
+ ]
+ }
+ if token:
+ response["PaginationToken"] = str(token)
+ return json.dumps(response)
+
+ def admin_disable_user(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ cognitoidp_backends[self.region].admin_disable_user(user_pool_id, username)
+ return ""
+
+ def admin_enable_user(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ cognitoidp_backends[self.region].admin_enable_user(user_pool_id, username)
+ return ""
+
+ def admin_delete_user(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ cognitoidp_backends[self.region].admin_delete_user(user_pool_id, username)
+ return ""
+
+ def admin_initiate_auth(self):
+ user_pool_id = self._get_param("UserPoolId")
+ client_id = self._get_param("ClientId")
+ auth_flow = self._get_param("AuthFlow")
+ auth_parameters = self._get_param("AuthParameters")
+
+ auth_result = cognitoidp_backends[self.region].admin_initiate_auth(
+ user_pool_id, client_id, auth_flow, auth_parameters
+ )
+
+ return json.dumps(auth_result)
+
+ def respond_to_auth_challenge(self):
+ session = self._get_param("Session")
+ client_id = self._get_param("ClientId")
+ challenge_name = self._get_param("ChallengeName")
+ challenge_responses = self._get_param("ChallengeResponses")
+ auth_result = region_agnostic_backend.respond_to_auth_challenge(
+ session, client_id, challenge_name, challenge_responses
+ )
+
+ return json.dumps(auth_result)
+
+ def forgot_password(self):
+ client_id = self._get_param("ClientId")
+ username = self._get_param("Username")
+ region = find_region_by_value("client_id", client_id)
+ print(f"Region: {region}")
+ confirmation_code, response = cognitoidp_backends[region].forgot_password(
+ client_id, username
+ )
+ self.response_headers[
+ "x-moto-forgot-password-confirmation-code"
+ ] = confirmation_code
+ return json.dumps(response)
+
+ # This endpoint receives no authorization header, so if moto-server is listening
+ # on localhost (doesn't get a region in the host header), it doesn't know what
+ # region's backend should handle the traffic, and we use `find_region_by_value` to
+ # solve that problem.
+ def confirm_forgot_password(self):
+ client_id = self._get_param("ClientId")
+ username = self._get_param("Username")
+ password = self._get_param("Password")
+ confirmation_code = self._get_param("ConfirmationCode")
+ region = find_region_by_value("client_id", client_id)
+ cognitoidp_backends[region].confirm_forgot_password(
+ client_id, username, password, confirmation_code
+ )
+ return ""
+
+ # Ditto the comment on confirm_forgot_password.
+ def change_password(self):
+ access_token = self._get_param("AccessToken")
+ previous_password = self._get_param("PreviousPassword")
+ proposed_password = self._get_param("ProposedPassword")
+ region = find_region_by_value("access_token", access_token)
+ cognitoidp_backends[region].change_password(
+ access_token, previous_password, proposed_password
+ )
+ return ""
+
+ def admin_update_user_attributes(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ attributes = self._get_param("UserAttributes")
+ cognitoidp_backends[self.region].admin_update_user_attributes(
+ user_pool_id, username, attributes
+ )
+ return ""
+
+ def admin_delete_user_attributes(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ attributes = self._get_param("UserAttributeNames")
+ cognitoidp_backends[self.region].admin_delete_user_attributes(
+ user_pool_id, username, attributes
+ )
+ return ""
+
+ def admin_user_global_sign_out(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ cognitoidp_backends[self.region].admin_user_global_sign_out(
+ user_pool_id, username
+ )
+ return ""
+
+ def global_sign_out(self):
+ access_token = self._get_param("AccessToken")
+ cognitoidp_backends[self.region].global_sign_out(access_token)
+ return ""
+
+ # Resource Server
+ def create_resource_server(self):
+ user_pool_id = self._get_param("UserPoolId")
+ identifier = self._get_param("Identifier")
+ name = self._get_param("Name")
+ scopes = self._get_param("Scopes")
+ resource_server = cognitoidp_backends[self.region].create_resource_server(
+ user_pool_id, identifier, name, scopes
+ )
+ return json.dumps({"ResourceServer": resource_server.to_json()})
+
+ def sign_up(self):
+ client_id = self._get_param("ClientId")
+ username = self._get_param("Username")
+ password = self._get_param("Password")
+ user = region_agnostic_backend.sign_up(
+ client_id=client_id,
+ username=username,
+ password=password,
+ attributes=self._get_param("UserAttributes", []),
+ )
+ return json.dumps(
+ {
+ "UserConfirmed": user.status == UserStatus["CONFIRMED"],
+ "UserSub": user.id,
+ }
+ )
+
+ def confirm_sign_up(self):
+ client_id = self._get_param("ClientId")
+ username = self._get_param("Username")
+ region_agnostic_backend.confirm_sign_up(client_id=client_id, username=username)
+ return ""
+
+ def initiate_auth(self):
+ client_id = self._get_param("ClientId")
+ auth_flow = self._get_param("AuthFlow")
+ auth_parameters = self._get_param("AuthParameters")
+
+ auth_result = region_agnostic_backend.initiate_auth(
+ client_id, auth_flow, auth_parameters
+ )
+
+ return json.dumps(auth_result)
+
+ def associate_software_token(self):
+ access_token = self._get_param("AccessToken")
+ result = cognitoidp_backends[self.region].associate_software_token(access_token)
+ return json.dumps(result)
+
+ def verify_software_token(self):
+ access_token = self._get_param("AccessToken")
+ result = cognitoidp_backends[self.region].verify_software_token(access_token)
+ return json.dumps(result)
+
+ def set_user_mfa_preference(self):
+ access_token = self._get_param("AccessToken")
+ software_token_mfa_settings = self._get_param("SoftwareTokenMfaSettings")
+ sms_mfa_settings = self._get_param("SMSMfaSettings")
+ cognitoidp_backends[self.region].set_user_mfa_preference(
+ access_token, software_token_mfa_settings, sms_mfa_settings
+ )
+ return ""
+
+ def admin_set_user_mfa_preference(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ software_token_mfa_settings = self._get_param("SoftwareTokenMfaSettings")
+ sms_mfa_settings = self._get_param("SMSMfaSettings")
+ cognitoidp_backends[self.region].admin_set_user_mfa_preference(
+ user_pool_id, username, software_token_mfa_settings, sms_mfa_settings
+ )
+ return ""
+
+ def admin_set_user_password(self):
+ user_pool_id = self._get_param("UserPoolId")
+ username = self._get_param("Username")
+ password = self._get_param("Password")
+ permanent = self._get_param("Permanent")
+ cognitoidp_backends[self.region].admin_set_user_password(
+ user_pool_id, username, password, permanent
+ )
+ return ""
+
+ def add_custom_attributes(self):
+ user_pool_id = self._get_param("UserPoolId")
+ custom_attributes = self._get_param("CustomAttributes")
+ cognitoidp_backends[self.region].add_custom_attributes(
+ user_pool_id, custom_attributes
+ )
+ return ""
+
+ def update_user_attributes(self):
+ access_token = self._get_param("AccessToken")
+ attributes = self._get_param("UserAttributes")
+ cognitoidp_backends[self.region].update_user_attributes(
+ access_token, attributes
+ )
+ return json.dumps({})
+
+
+class CognitoIdpJsonWebKeyResponse(BaseResponse):
+ def __init__(self):
+ import pkgutil
+ self.json_web_key = pkgutil.get_data(__package__, 'resources/jwks-public.json')
+
+ def serve_json_web_key(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ return 200, {"Content-Type": "application/json"}, self.json_web_key
diff --git a/contrib/python/moto/py3/moto/cognitoidp/urls.py b/contrib/python/moto/py3/moto/cognitoidp/urls.py
new file mode 100644
index 0000000000..7df8f3e6ec
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/urls.py
@@ -0,0 +1,8 @@
+from .responses import CognitoIdpResponse, CognitoIdpJsonWebKeyResponse
+
+url_bases = [r"https?://cognito-idp\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/$": CognitoIdpResponse.dispatch,
+ "{0}/(?P<user_pool_id>[^/]+)/.well-known/jwks.json$": CognitoIdpJsonWebKeyResponse().serve_json_web_key,
+}
diff --git a/contrib/python/moto/py3/moto/cognitoidp/utils.py b/contrib/python/moto/py3/moto/cognitoidp/utils.py
new file mode 100644
index 0000000000..8a4970957d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/cognitoidp/utils.py
@@ -0,0 +1,68 @@
+import random
+import string
+import hashlib
+import hmac
+import base64
+import re
+
+FORMATS = {
+ "email": r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
+ "phone_number": r"\+\d{,15}",
+}
+
+
+PAGINATION_MODEL = {
+ "list_user_pools": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 60,
+ "unique_attribute": "arn",
+ },
+ "list_user_pool_clients": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 60,
+ "unique_attribute": "id",
+ },
+ "list_identity_providers": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 60,
+ "unique_attribute": "name",
+ },
+ "list_users": {
+ "input_token": "pagination_token",
+ "limit_key": "limit",
+ "limit_default": 60,
+ "unique_attribute": "id",
+ },
+}
+
+
+def create_id():
+ size = 26
+ chars = list(range(10)) + list(string.ascii_lowercase)
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def check_secret_hash(app_client_secret, app_client_id, username, secret_hash):
+ key = bytes(str(app_client_secret).encode("latin-1"))
+ msg = bytes(str(username + app_client_id).encode("latin-1"))
+ new_digest = hmac.new(key, msg, hashlib.sha256).digest()
+ SECRET_HASH = base64.b64encode(new_digest).decode()
+ return SECRET_HASH == secret_hash
+
+
+def validate_username_format(username, _format="email"):
+ # if the value of the `_format` param other than `email` or `phone_number`,
+ # the default value for the regex will match nothing and the
+ # method will return None
+ return re.fullmatch(FORMATS.get(_format, r"a^"), username)
+
+
+def flatten_attrs(attrs):
+ return {attr["Name"]: attr["Value"] for attr in attrs}
+
+
+def expand_attrs(attrs):
+ return [{"Name": k, "Value": v} for k, v in attrs.items()]
diff --git a/contrib/python/moto/py3/moto/config/__init__.py b/contrib/python/moto/py3/moto/config/__init__.py
new file mode 100644
index 0000000000..9ca6a5917b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/__init__.py
@@ -0,0 +1,4 @@
+from .models import config_backends
+from ..core.models import base_decorator
+
+mock_config = base_decorator(config_backends)
diff --git a/contrib/python/moto/py3/moto/config/exceptions.py b/contrib/python/moto/py3/moto/config/exceptions.py
new file mode 100644
index 0000000000..3a117c219d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/exceptions.py
@@ -0,0 +1,377 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class NameTooLongException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name, location, max_limit=256):
+ message = (
+ f"1 validation error detected: Value '{name}' at '{location}' "
+ f"failed to satisfy constraint: Member must have length less "
+ f"than or equal to {max_limit}"
+ )
+ super().__init__("ValidationException", message)
+
+
+class InvalidConfigurationRecorderNameException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = (
+ f"The configuration recorder name '{name}' is not valid, blank string."
+ )
+ super().__init__("InvalidConfigurationRecorderNameException", message)
+
+
+class MaxNumberOfConfigurationRecordersExceededException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = (
+ f"Failed to put configuration recorder '{name}' because the maximum number of "
+ "configuration recorders: 1 is reached."
+ )
+ super().__init__("MaxNumberOfConfigurationRecordersExceededException", message)
+
+
+class InvalidRecordingGroupException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "The recording group provided is not valid"
+ super().__init__("InvalidRecordingGroupException", message)
+
+
+class InvalidResourceTypeException(JsonRESTError):
+ code = 400
+
+ def __init__(self, bad_list, good_list):
+ message = (
+ f"{len(bad_list)} validation error detected: Value '{bad_list}' at "
+ "'configurationRecorder.recordingGroup.resourceTypes' failed to satisfy constraint: "
+ f"Member must satisfy constraint: [Member must satisfy enum value set: {good_list}]"
+ )
+ # For PY2:
+ message = str(message)
+
+ super().__init__("ValidationException", message)
+
+
+class NoSuchConfigurationAggregatorException(JsonRESTError):
+ code = 400
+
+ def __init__(self, number=1):
+ if number == 1:
+ message = "The configuration aggregator does not exist. Check the configuration aggregator name and try again."
+ else:
+ message = (
+ "At least one of the configuration aggregators does not exist. Check the configuration aggregator"
+ " names and try again."
+ )
+ super().__init__("NoSuchConfigurationAggregatorException", message)
+
+
+class NoSuchConfigurationRecorderException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = (
+ f"Cannot find configuration recorder with the specified name '{name}'."
+ )
+ super().__init__("NoSuchConfigurationRecorderException", message)
+
+
+class InvalidDeliveryChannelNameException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = f"The delivery channel name '{name}' is not valid, blank string."
+ super().__init__("InvalidDeliveryChannelNameException", message)
+
+
+class NoSuchBucketException(JsonRESTError):
+ """We are *only* validating that there is value that is not '' here."""
+
+ code = 400
+
+ def __init__(self):
+ message = "Cannot find a S3 bucket with an empty bucket name."
+ super().__init__("NoSuchBucketException", message)
+
+
+class InvalidNextTokenException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "The nextToken provided is invalid"
+ super().__init__("InvalidNextTokenException", message)
+
+
+class InvalidS3KeyPrefixException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "The s3 key prefix '' is not valid, empty s3 key prefix."
+ super().__init__("InvalidS3KeyPrefixException", message)
+
+
+class InvalidSNSTopicARNException(JsonRESTError):
+ """We are *only* validating that there is value that is not '' here."""
+
+ code = 400
+
+ def __init__(self):
+ message = "The sns topic arn '' is not valid."
+ super().__init__("InvalidSNSTopicARNException", message)
+
+
+class InvalidDeliveryFrequency(JsonRESTError):
+ code = 400
+
+ def __init__(self, value, good_list):
+ message = (
+ f"1 validation error detected: Value '{value}' at "
+ "'deliveryChannel.configSnapshotDeliveryProperties.deliveryFrequency' failed to satisfy "
+ f"constraint: Member must satisfy enum value set: {good_list}"
+ )
+ super().__init__("InvalidDeliveryFrequency", message)
+
+
+class MaxNumberOfDeliveryChannelsExceededException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = f"Failed to put delivery channel '{name}' because the maximum number of delivery channels: 1 is reached."
+ super().__init__("MaxNumberOfDeliveryChannelsExceededException", message)
+
+
+class NoSuchDeliveryChannelException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = f"Cannot find delivery channel with specified name '{name}'."
+ super().__init__("NoSuchDeliveryChannelException", message)
+
+
+class NoAvailableConfigurationRecorderException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "Configuration recorder is not available to put delivery channel."
+ super().__init__("NoAvailableConfigurationRecorderException", message)
+
+
+class NoAvailableDeliveryChannelException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "Delivery channel is not available to start configuration recorder."
+ super().__init__("NoAvailableDeliveryChannelException", message)
+
+
+class LastDeliveryChannelDeleteFailedException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name):
+ message = (
+ f"Failed to delete last specified delivery channel with name '{name}', because there, "
+ "because there is a running configuration recorder."
+ )
+ super().__init__("LastDeliveryChannelDeleteFailedException", message)
+
+
+class TooManyAccountSources(JsonRESTError):
+ code = 400
+
+ def __init__(self, length):
+ locations = ["com.amazonaws.xyz"] * length
+
+ message = (
+ "Value '[{locations}]' at 'accountAggregationSources' failed to satisfy constraint: "
+ "Member must have length less than or equal to 1".format(
+ locations=", ".join(locations)
+ )
+ )
+ super().__init__("ValidationException", message)
+
+
+class DuplicateTags(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidInput",
+ "Duplicate tag keys found. Please note that Tag keys are case insensitive.",
+ )
+
+
+class TagKeyTooBig(JsonRESTError):
+ code = 400
+
+ def __init__(self, tag, param="tags.X.member.key"):
+ super().__init__(
+ "ValidationException",
+ f"1 validation error detected: Value '{tag}' at '{param}' failed to satisfy "
+ "constraint: Member must have length less than or equal to 128",
+ )
+
+
+class TagValueTooBig(JsonRESTError):
+ code = 400
+
+ def __init__(self, tag, param="tags.X.member.value"):
+ super().__init__(
+ "ValidationException",
+ f"1 validation error detected: Value '{tag}' at '{param}' failed to satisfy "
+ "constraint: Member must have length less than or equal to 256",
+ )
+
+
+class InvalidParameterValueException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterValueException", message)
+
+
+class InvalidTagCharacters(JsonRESTError):
+ code = 400
+
+ def __init__(self, tag, param="tags.X.member.key"):
+ message = f"1 validation error detected: Value '{tag}' at '{param}' failed to satisfy "
+ message += "constraint: Member must satisfy regular expression pattern: [\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]+"
+
+ super().__init__("ValidationException", message)
+
+
+class TooManyTags(JsonRESTError):
+ code = 400
+
+ def __init__(self, tags, param="tags"):
+ super().__init__(
+ "ValidationException",
+ f"1 validation error detected: Value '{tags}' at '{param}' failed to satisfy "
+ "constraint: Member must have length less than or equal to 50.",
+ )
+
+
+class InvalidResourceParameters(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "ValidationException",
+ "Both Resource ID and Resource Name " "cannot be specified in the request",
+ )
+
+
+class InvalidLimitException(JsonRESTError):
+ code = 400
+
+ def __init__(self, value):
+ super().__init__(
+ "InvalidLimitException",
+ f"Value '{value}' at 'limit' failed to satisfy constraint: Member"
+ " must have value less than or equal to 100",
+ )
+
+
+class TooManyResourceIds(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "ValidationException",
+ "The specified list had more than 20 resource ID's. "
+ "It must have '20' or less items",
+ )
+
+
+class ResourceNotDiscoveredException(JsonRESTError):
+ code = 400
+
+ def __init__(self, resource_type, resource):
+ super().__init__(
+ "ResourceNotDiscoveredException",
+ f"Resource {resource} of resourceType:{resource_type} is unknown or has not been discovered",
+ )
+
+
+class ResourceNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, resource_arn):
+ super().__init__(
+ "ResourceNotFoundException", f"ResourceArn '{resource_arn}' does not exist"
+ )
+
+
+class TooManyResourceKeys(JsonRESTError):
+ code = 400
+
+ def __init__(self, bad_list):
+ message = (
+ f"1 validation error detected: Value '{bad_list}' at "
+ "'resourceKeys' failed to satisfy constraint: "
+ "Member must have length less than or equal to 100"
+ )
+ super().__init__("ValidationException", message)
+
+
+class InvalidResultTokenException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ message = "The resultToken provided is invalid"
+ super().__init__("InvalidResultTokenException", message)
+
+
+class ValidationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
+
+
+class NoSuchOrganizationConformancePackException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("NoSuchOrganizationConformancePackException", message)
+
+
+class MaxNumberOfConfigRulesExceededException(JsonRESTError):
+ code = 400
+
+ def __init__(self, name, max_limit):
+ message = f"Failed to put config rule '{name}' because the maximum number of config rules: {max_limit} is reached."
+ super().__init__("MaxNumberOfConfigRulesExceededException", message)
+
+
+class ResourceInUseException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceInUseException", message)
+
+
+class InsufficientPermissionsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InsufficientPermissionsException", message)
+
+
+class NoSuchConfigRuleException(JsonRESTError):
+ code = 400
+
+ def __init__(self, rule_name):
+ message = f"The ConfigRule '{rule_name}' provided in the request is invalid. Please check the configRule name"
+ super().__init__("NoSuchConfigRuleException", message)
+
+
+class MissingRequiredConfigRuleParameterException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ParamValidationError", message)
diff --git a/contrib/python/moto/py3/moto/config/models.py b/contrib/python/moto/py3/moto/config/models.py
new file mode 100644
index 0000000000..b82ebbfeb7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/models.py
@@ -0,0 +1,1934 @@
+"""Implementation of the AWS Config Service APIs."""
+import json
+import re
+import time
+import random
+import string
+
+from datetime import datetime
+
+from moto.config.exceptions import (
+ InvalidResourceTypeException,
+ InvalidDeliveryFrequency,
+ InvalidConfigurationRecorderNameException,
+ NameTooLongException,
+ MaxNumberOfConfigurationRecordersExceededException,
+ InvalidRecordingGroupException,
+ NoSuchConfigurationRecorderException,
+ NoAvailableConfigurationRecorderException,
+ InvalidDeliveryChannelNameException,
+ NoSuchBucketException,
+ InvalidS3KeyPrefixException,
+ InvalidSNSTopicARNException,
+ MaxNumberOfDeliveryChannelsExceededException,
+ NoAvailableDeliveryChannelException,
+ NoSuchDeliveryChannelException,
+ LastDeliveryChannelDeleteFailedException,
+ TagKeyTooBig,
+ TooManyTags,
+ TagValueTooBig,
+ TooManyAccountSources,
+ InvalidParameterValueException,
+ InvalidNextTokenException,
+ NoSuchConfigurationAggregatorException,
+ InvalidTagCharacters,
+ DuplicateTags,
+ InvalidLimitException,
+ InvalidResourceParameters,
+ TooManyResourceIds,
+ ResourceNotDiscoveredException,
+ ResourceNotFoundException,
+ TooManyResourceKeys,
+ InvalidResultTokenException,
+ ValidationException,
+ NoSuchOrganizationConformancePackException,
+ MaxNumberOfConfigRulesExceededException,
+ InsufficientPermissionsException,
+ NoSuchConfigRuleException,
+ ResourceInUseException,
+ MissingRequiredConfigRuleParameterException,
+)
+
+from moto.core import BaseBackend, BaseModel
+from moto.core import get_account_id
+from moto.core.responses import AWSServiceSpec
+from moto.core.utils import BackendDict
+from moto.iam.config import role_config_query, policy_config_query
+from moto.s3.config import s3_config_query
+from moto.s3control.config import s3_account_public_access_block_query
+from moto.utilities.utils import load_resource
+
+
+POP_STRINGS = [
+ "capitalizeStart",
+ "CapitalizeStart",
+ "capitalizeArn",
+ "CapitalizeArn",
+ "capitalizeARN",
+ "CapitalizeARN",
+]
+DEFAULT_PAGE_SIZE = 100
+CONFIG_RULE_PAGE_SIZE = 25
+
+# Map the Config resource type to a backend:
+RESOURCE_MAP = {
+ "AWS::S3::Bucket": s3_config_query,
+ "AWS::S3::AccountPublicAccessBlock": s3_account_public_access_block_query,
+ "AWS::IAM::Role": role_config_query,
+ "AWS::IAM::Policy": policy_config_query,
+}
+
+CAMEL_TO_SNAKE_REGEX = re.compile(r"(?<!^)(?=[A-Z])")
+
+MAX_TAGS_IN_ARG = 50
+
+MANAGED_RULES = load_resource(__name__, "resources/aws_managed_rules.json")
+MANAGED_RULES_CONSTRAINTS = MANAGED_RULES["ManagedRules"]
+
+
+def datetime2int(date):
+ return int(time.mktime(date.timetuple()))
+
+
+def snake_to_camels(original, cap_start, cap_arn):
+ parts = original.split("_")
+
+ camel_cased = parts[0].lower() + "".join(p.title() for p in parts[1:])
+
+ if cap_arn:
+ camel_cased = camel_cased.replace(
+ "Arn", "ARN"
+ ) # Some config services use 'ARN' instead of 'Arn'
+
+ if cap_start:
+ camel_cased = camel_cased[0].upper() + camel_cased[1::]
+
+ return camel_cased
+
+
+def random_string():
+ """Returns a random set of 8 lowercase letters for the Config Aggregator ARN"""
+ chars = []
+ for _ in range(0, 8):
+ chars.append(random.choice(string.ascii_lowercase))
+
+ return "".join(chars)
+
+
+def validate_tag_key(tag_key, exception_param="tags.X.member.key"):
+ """Validates the tag key.
+
+ :param tag_key: The tag key to check against.
+ :param exception_param: The exception parameter to send over to help
+ format the message. This is to reflect
+ the difference between the tag and untag APIs.
+ :return:
+ """
+ # Validate that the key length is correct:
+ if len(tag_key) > 128:
+ raise TagKeyTooBig(tag_key, param=exception_param)
+
+ # Validate that the tag key fits the proper Regex:
+ # [\w\s_.:/=+\-@]+ SHOULD be the same as the Java regex on the AWS
+ # documentation: [\p{L}\p{Z}\p{N}_.:/=+\-@]+
+ match = re.findall(r"[\w\s_.:/=+\-@]+", tag_key)
+ # Kudos if you can come up with a better way of doing a global search :)
+ if not match or len(match[0]) < len(tag_key):
+ raise InvalidTagCharacters(tag_key, param=exception_param)
+
+
+def check_tag_duplicate(all_tags, tag_key):
+ """Validates that a tag key is not a duplicate
+
+ :param all_tags: Dict to check if there is a duplicate tag.
+ :param tag_key: The tag key to check against.
+ :return:
+ """
+ if all_tags.get(tag_key):
+ raise DuplicateTags()
+
+
+def validate_tags(tags):
+ proper_tags = {}
+
+ if len(tags) > MAX_TAGS_IN_ARG:
+ raise TooManyTags(tags)
+
+ for tag in tags:
+ # Validate the Key:
+ validate_tag_key(tag["Key"])
+ check_tag_duplicate(proper_tags, tag["Key"])
+
+ # Validate the Value:
+ if len(tag["Value"]) > 256:
+ raise TagValueTooBig(tag["Value"])
+
+ proper_tags[tag["Key"]] = tag["Value"]
+
+ return proper_tags
+
+
+def convert_to_class_args(dict_arg):
+ """Return dict that can be used to instantiate it's representative class.
+
+ Given a dictionary in the incoming API request, convert the keys to
+ snake case to use as arguments when instatiating the representative
+ class's __init__().
+ """
+ class_args = {}
+ for key, value in dict_arg.items():
+ class_args[CAMEL_TO_SNAKE_REGEX.sub("_", key).lower()] = value
+
+ # boto detects if extra/unknown arguments are provided, so it's not
+ # necessary to do so here.
+ return class_args
+
+
+class ConfigEmptyDictable(BaseModel):
+ """Base class to make serialization easy.
+
+ This assumes that the sub-class will NOT return 'None's in the JSON.
+ """
+
+ def __init__(self, capitalize_start=False, capitalize_arn=True):
+ """Assists with the serialization of the config object
+ :param capitalize_start: For some Config services, the first letter
+ is lowercase -- for others it's capital
+ :param capitalize_arn: For some Config services, the API expects
+ 'ARN' and for others, it expects 'Arn'
+ """
+ self.capitalize_start = capitalize_start
+ self.capitalize_arn = capitalize_arn
+
+ def to_dict(self):
+ data = {}
+ for item, value in self.__dict__.items():
+ # ignore private attributes
+ if not item.startswith("_") and value is not None:
+ if isinstance(value, ConfigEmptyDictable):
+ data[
+ snake_to_camels(
+ item, self.capitalize_start, self.capitalize_arn
+ )
+ ] = value.to_dict()
+ else:
+ data[
+ snake_to_camels(
+ item, self.capitalize_start, self.capitalize_arn
+ )
+ ] = value
+
+ # Cleanse the extra properties:
+ for prop in POP_STRINGS:
+ data.pop(prop, None)
+
+ return data
+
+
+class ConfigRecorderStatus(ConfigEmptyDictable):
+ def __init__(self, name):
+ super().__init__()
+
+ self.name = name
+ self.recording = False
+ self.last_start_time = None
+ self.last_stop_time = None
+ self.last_status = None
+ self.last_error_code = None
+ self.last_error_message = None
+ self.last_status_change_time = None
+
+ def start(self):
+ self.recording = True
+ self.last_status = "PENDING"
+ self.last_start_time = datetime2int(datetime.utcnow())
+ self.last_status_change_time = datetime2int(datetime.utcnow())
+
+ def stop(self):
+ self.recording = False
+ self.last_stop_time = datetime2int(datetime.utcnow())
+ self.last_status_change_time = datetime2int(datetime.utcnow())
+
+
+class ConfigDeliverySnapshotProperties(ConfigEmptyDictable):
+ def __init__(self, delivery_frequency):
+ super().__init__()
+
+ self.delivery_frequency = delivery_frequency
+
+
+class ConfigDeliveryChannel(ConfigEmptyDictable):
+ def __init__(
+ self, name, s3_bucket_name, prefix=None, sns_arn=None, snapshot_properties=None
+ ):
+ super().__init__()
+
+ self.name = name
+ self.s3_bucket_name = s3_bucket_name
+ self.s3_key_prefix = prefix
+ self.sns_topic_arn = sns_arn
+ self.config_snapshot_delivery_properties = snapshot_properties
+
+
+class RecordingGroup(ConfigEmptyDictable):
+ def __init__(
+ self,
+ all_supported=True,
+ include_global_resource_types=False,
+ resource_types=None,
+ ):
+ super().__init__()
+
+ self.all_supported = all_supported
+ self.include_global_resource_types = include_global_resource_types
+ self.resource_types = resource_types
+
+
+class ConfigRecorder(ConfigEmptyDictable):
+ def __init__(self, role_arn, recording_group, name="default", status=None):
+ super().__init__()
+
+ self.name = name
+ self.role_arn = role_arn
+ self.recording_group = recording_group
+
+ if not status:
+ self.status = ConfigRecorderStatus(name)
+ else:
+ self.status = status
+
+
+class AccountAggregatorSource(ConfigEmptyDictable):
+ def __init__(self, account_ids, aws_regions=None, all_aws_regions=None):
+ super().__init__(capitalize_start=True)
+
+ # Can't have both the regions and all_regions flag present -- also
+ # can't have them both missing:
+ if aws_regions and all_aws_regions:
+ raise InvalidParameterValueException(
+ "Your configuration aggregator contains a list of regions "
+ "and also specifies the use of all regions. You must choose "
+ "one of these options."
+ )
+
+ if not (aws_regions or all_aws_regions):
+ raise InvalidParameterValueException(
+ "Your request does not specify any regions. Select AWS Config-supported "
+ "regions and try again."
+ )
+
+ self.account_ids = account_ids
+ self.aws_regions = aws_regions
+
+ if not all_aws_regions:
+ all_aws_regions = False
+
+ self.all_aws_regions = all_aws_regions
+
+
+class OrganizationAggregationSource(ConfigEmptyDictable):
+ def __init__(self, role_arn, aws_regions=None, all_aws_regions=None):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+
+ # Can't have both the regions and all_regions flag present -- also
+ # can't have them both missing:
+ if aws_regions and all_aws_regions:
+ raise InvalidParameterValueException(
+ "Your configuration aggregator contains a list of regions and also specifies "
+ "the use of all regions. You must choose one of these options."
+ )
+
+ if not (aws_regions or all_aws_regions):
+ raise InvalidParameterValueException(
+ "Your request does not specify any regions. Select AWS Config-supported "
+ "regions and try again."
+ )
+
+ self.role_arn = role_arn
+ self.aws_regions = aws_regions
+
+ if not all_aws_regions:
+ all_aws_regions = False
+
+ self.all_aws_regions = all_aws_regions
+
+
+class ConfigAggregator(ConfigEmptyDictable):
+ def __init__(self, name, region, account_sources=None, org_source=None, tags=None):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+
+ self.configuration_aggregator_name = name
+ self.configuration_aggregator_arn = "arn:aws:config:{region}:{id}:config-aggregator/config-aggregator-{random}".format(
+ region=region, id=get_account_id(), random=random_string()
+ )
+ self.account_aggregation_sources = account_sources
+ self.organization_aggregation_source = org_source
+ self.creation_time = datetime2int(datetime.utcnow())
+ self.last_updated_time = datetime2int(datetime.utcnow())
+
+ # Tags are listed in the list_tags_for_resource API call.
+ self.tags = tags or {}
+
+ # Override the to_dict so that we can format the tags properly...
+ def to_dict(self):
+ result = super().to_dict()
+
+ # Override the account aggregation sources if present:
+ if self.account_aggregation_sources:
+ result["AccountAggregationSources"] = [
+ a.to_dict() for a in self.account_aggregation_sources
+ ]
+
+ if self.tags:
+ result["Tags"] = [
+ {"Key": key, "Value": value} for key, value in self.tags.items()
+ ]
+
+ return result
+
+
+class ConfigAggregationAuthorization(ConfigEmptyDictable):
+ def __init__(
+ self, current_region, authorized_account_id, authorized_aws_region, tags=None
+ ):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+
+ self.aggregation_authorization_arn = (
+ "arn:aws:config:{region}:{id}:aggregation-authorization/"
+ "{auth_account}/{auth_region}".format(
+ region=current_region,
+ id=get_account_id(),
+ auth_account=authorized_account_id,
+ auth_region=authorized_aws_region,
+ )
+ )
+ self.authorized_account_id = authorized_account_id
+ self.authorized_aws_region = authorized_aws_region
+ self.creation_time = datetime2int(datetime.utcnow())
+
+ # Tags are listed in the list_tags_for_resource API call.
+ self.tags = tags or {}
+
+
+class OrganizationConformancePack(ConfigEmptyDictable):
+ def __init__(
+ self,
+ region,
+ name,
+ delivery_s3_bucket,
+ delivery_s3_key_prefix=None,
+ input_parameters=None,
+ excluded_accounts=None,
+ ):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+
+ self._status = "CREATE_SUCCESSFUL"
+ self._unique_pack_name = "{0}-{1}".format(name, random_string())
+
+ self.conformance_pack_input_parameters = input_parameters or []
+ self.delivery_s3_bucket = delivery_s3_bucket
+ self.delivery_s3_key_prefix = delivery_s3_key_prefix
+ self.excluded_accounts = excluded_accounts or []
+ self.last_update_time = datetime2int(datetime.utcnow())
+ self.organization_conformance_pack_arn = (
+ "arn:aws:config:{0}:{1}:organization-conformance-pack/{2}".format(
+ region, get_account_id(), self._unique_pack_name
+ )
+ )
+ self.organization_conformance_pack_name = name
+
+ def update(
+ self,
+ delivery_s3_bucket,
+ delivery_s3_key_prefix,
+ input_parameters,
+ excluded_accounts,
+ ):
+ self._status = "UPDATE_SUCCESSFUL"
+
+ self.conformance_pack_input_parameters = input_parameters
+ self.delivery_s3_bucket = delivery_s3_bucket
+ self.delivery_s3_key_prefix = delivery_s3_key_prefix
+ self.excluded_accounts = excluded_accounts
+ self.last_update_time = datetime2int(datetime.utcnow())
+
+
+class Scope(ConfigEmptyDictable):
+
+ """Defines resources that can trigger an evaluation for the rule.
+
+ Per boto3 documentation, Scope can be one of:
+ - one or more resource types,
+ - combo of one resource type and one resource ID,
+ - combo of tag key and value.
+
+ If no scope is specified, evaluations are trigged when any resource
+ in the recording group changes.
+ """
+
+ def __init__(
+ self,
+ compliance_resource_types=None,
+ tag_key=None,
+ tag_value=None,
+ compliance_resource_id=None,
+ ):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+ self.tags = None
+ if tag_key or tag_value:
+ if tag_value and not tag_key:
+ raise InvalidParameterValueException(
+ "Tag key should not be empty when tag value is provided in scope"
+ )
+ if tag_key and len(tag_key) > 128:
+ raise TagKeyTooBig(tag_key, "ConfigRule.Scope.TagKey")
+ if tag_value and len(tag_value) > 256:
+ raise TagValueTooBig(tag_value, "ConfigRule.Scope.TagValue")
+ self.tags = {tag_key: tag_value}
+
+ # Can't use more than one combo to specify scope - either tags,
+ # resource types, or resource id and resource type.
+ if self.tags and (compliance_resource_types or compliance_resource_id):
+ raise InvalidParameterValueException(
+ "Scope cannot be applied to both resource and tag"
+ )
+
+ if compliance_resource_id and len(compliance_resource_types) != 1:
+ raise InvalidParameterValueException(
+ "A single resourceType should be provided when resourceId "
+ "is provided in scope"
+ )
+ self.compliance_resource_types = compliance_resource_types
+ self.compliance_resource_id = compliance_resource_id
+
+
+class SourceDetail(ConfigEmptyDictable):
+
+ """Source and type of event triggering AWS Config resource evaluation.
+
+ Applies only to customer rules.
+ """
+
+ MESSAGE_TYPES = {
+ "ConfigurationItemChangeNotification",
+ "ConfigurationSnapshotDeliveryCompleted",
+ "OversizedConfigurationItemChangeNotification",
+ "ScheduledNotification",
+ }
+ DEFAULT_FREQUENCY = "TwentyFour_Hours"
+ FREQUENCY_TYPES = {
+ "One_Hour",
+ "Six_Hours",
+ "Three_Hours",
+ "Twelve_Hours",
+ "TwentyFour_Hours",
+ }
+ EVENT_SOURCES = ["aws.config"]
+
+ def __init__(
+ self, event_source=None, message_type=None, maximum_execution_frequency=None
+ ):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+
+ # If the event_source or message_type fields are not provided,
+ # boto3 reports: "SourceDetails should be null/empty if the owner is
+ # AWS. SourceDetails should be provided if the owner is CUSTOM_LAMBDA."
+ # A more specific message will be used here instead.
+ if not event_source:
+ raise MissingRequiredConfigRuleParameterException(
+ "Missing required parameter in ConfigRule.SourceDetails: "
+ "'EventSource'"
+ )
+ if event_source not in SourceDetail.EVENT_SOURCES:
+ raise ValidationException(
+ f"Value '{event_source}' at "
+ f"'configRule.source.sourceDetails.eventSource' failed "
+ f"to satisfy constraint: Member must satisfy enum value set: {{"
+ + ", ".join((SourceDetail.EVENT_SOURCES))
+ + "}"
+ )
+
+ if not message_type:
+ # boto3 doesn't have a specific error if this field is missing.
+ raise MissingRequiredConfigRuleParameterException(
+ "Missing required parameter in ConfigRule.SourceDetails: 'MessageType'"
+ )
+ if message_type not in SourceDetail.MESSAGE_TYPES:
+ raise ValidationException(
+ f"Value '{message_type}' at "
+ f"'configRule.source.sourceDetails.message_type' failed "
+ f"to satisfy constraint: Member must satisfy enum value set: {{"
+ + ", ".join(sorted(SourceDetail.MESSAGE_TYPES))
+ + "}"
+ )
+
+ if maximum_execution_frequency:
+ if maximum_execution_frequency not in SourceDetail.FREQUENCY_TYPES:
+ raise ValidationException(
+ f"Value '{maximum_execution_frequency}' at "
+ f"'configRule.source.sourceDetails.maximumExecutionFrequency' "
+ f"failed to satisfy constraint: "
+ f"Member must satisfy enum value set: {{"
+ + ", ".join(sorted(SourceDetail.FREQUENCY_TYPES))
+ + "}"
+ )
+ if message_type in [
+ "ConfigurationItemChangeNotification",
+ "OversizedConfigurationItemChangeNotification",
+ ]:
+ raise InvalidParameterValueException(
+ "A maximum execution frequency is not allowed if "
+ "MessageType is ConfigurationItemChangeNotification or "
+ "OversizedConfigurationItemChangeNotification"
+ )
+ else:
+ # If no value is specified, use a default value for
+ # maximum_execution_frequency for message types representing a
+ # periodic trigger.
+ if message_type in [
+ "ScheduledNotification",
+ "ConfigurationSnapshotDeliveryCompleted",
+ ]:
+ maximum_execution_frequency = SourceDetail.DEFAULT_FREQUENCY
+
+ self.event_source = event_source
+ self.message_type = message_type
+ self.maximum_execution_frequency = maximum_execution_frequency
+
+
+class Source(ConfigEmptyDictable):
+
+ """Defines rule owner, id and notification for triggering evaluation."""
+
+ OWNERS = {"AWS", "CUSTOM_LAMBDA"}
+
+ def __init__(self, region, owner, source_identifier, source_details=None):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+ if owner not in Source.OWNERS:
+ raise ValidationException(
+ f"Value '{owner}' at 'configRule.source.owner' failed to "
+ f"satisfy constraint: Member must satisfy enum value set: {{"
+ + ", ".join(sorted(Source.OWNERS))
+ + "}"
+ )
+
+ if owner == "AWS":
+ # Can the Source ID be found in the dict of managed rule IDs?
+ if source_identifier not in MANAGED_RULES_CONSTRAINTS:
+ raise InvalidParameterValueException(
+ f"The sourceIdentifier {source_identifier} is invalid. "
+ f"Please refer to the documentation for a list of valid "
+ f"sourceIdentifiers that can be used when AWS is the Owner"
+ )
+ if source_details:
+ raise InvalidParameterValueException(
+ "SourceDetails should be null/empty if the owner is AWS. "
+ "SourceDetails should be provided if the owner is "
+ "CUSTOM_LAMBDA"
+ )
+
+ self.owner = owner
+ self.source_identifier = source_identifier
+ self.source_details = None
+ return
+
+ # Otherwise, owner == "CUSTOM_LAMBDA"
+ if not source_details:
+ raise InvalidParameterValueException(
+ "SourceDetails should be null/empty if the owner is AWS. "
+ "SourceDetails should be provided if the owner is CUSTOM_LAMBDA"
+ )
+
+ # Import is slow and as it's not needed for all config service
+ # operations, only load it if needed.
+ from moto.awslambda import lambda_backends
+
+ try:
+ lambda_backends[region].get_function(source_identifier)
+ except Exception:
+ raise InsufficientPermissionsException(
+ f"The AWS Lambda function {source_identifier} cannot be "
+ f"invoked. Check the specified function ARN, and check the "
+ f"function's permissions"
+ )
+
+ details = []
+ for detail in source_details:
+ detail_dict = convert_to_class_args(detail)
+ details.append(SourceDetail(**detail_dict))
+
+ self.source_details = details
+ self.owner = owner
+ self.source_identifier = source_identifier
+
+ def to_dict(self):
+ """Format the SourceDetails properly."""
+ result = super().to_dict()
+ if self.source_details:
+ result["SourceDetails"] = [x.to_dict() for x in self.source_details]
+ return result
+
+
+class ConfigRule(ConfigEmptyDictable):
+
+ """AWS Config Rule to evaluate compliance of resources to configuration.
+
+ Can be a managed or custom config rule. Contains the instantiations of
+ the Source and SourceDetail classes, and optionally the Scope class.
+ """
+
+ MAX_RULES = 150
+ RULE_STATES = {"ACTIVE", "DELETING", "DELETING_RESULTS", "EVALUATING"}
+
+ def __init__(self, region, config_rule, tags):
+ super().__init__(capitalize_start=True, capitalize_arn=False)
+ self.config_rule_name = config_rule.get("ConfigRuleName")
+ if config_rule.get("ConfigRuleArn") or config_rule.get("ConfigRuleId"):
+ raise InvalidParameterValueException(
+ "ConfigRule Arn and Id can not be specified when creating a "
+ "new ConfigRule. ConfigRule Arn and Id are generated by the "
+ "service. Please try the request again without specifying "
+ "ConfigRule Arn or Id"
+ )
+
+ self.maximum_execution_frequency = None # keeps pylint happy
+ self.modify_fields(region, config_rule, tags)
+ self.config_rule_id = f"config-rule-{random_string():.6}"
+ self.config_rule_arn = f"arn:aws:config:{region}:{get_account_id()}:config-rule/{self.config_rule_id}"
+
+ def modify_fields(self, region, config_rule, tags):
+ """Initialize or update ConfigRule fields."""
+ self.config_rule_state = config_rule.get("ConfigRuleState", "ACTIVE")
+ if self.config_rule_state not in ConfigRule.RULE_STATES:
+ raise ValidationException(
+ f"Value '{self.config_rule_state}' at "
+ f"'configRule.configRuleState' failed to satisfy constraint: "
+ f"Member must satisfy enum value set: {{"
+ + ", ".join(sorted(ConfigRule.RULE_STATES))
+ + "}"
+ )
+ if self.config_rule_state != "ACTIVE":
+ raise InvalidParameterValueException(
+ f"The ConfigRuleState {self.config_rule_state} is invalid. "
+ f"Only the following values are permitted: ACTIVE"
+ )
+
+ self.description = config_rule.get("Description")
+
+ self.scope = None
+ if "Scope" in config_rule:
+ scope_dict = convert_to_class_args(config_rule["Scope"])
+ self.scope = Scope(**scope_dict)
+
+ source_dict = convert_to_class_args(config_rule["Source"])
+ self.source = Source(region, **source_dict)
+
+ self.input_parameters = config_rule.get("InputParameters")
+ self.input_parameters_dict = {}
+ if self.input_parameters:
+ try:
+ # A dictionary will be more useful when these parameters
+ # are actually needed.
+ self.input_parameters_dict = json.loads(self.input_parameters)
+ except ValueError:
+ raise InvalidParameterValueException( # pylint: disable=raise-missing-from
+ f"Invalid json {self.input_parameters} passed in the "
+ f"InputParameters field"
+ )
+
+ self.maximum_execution_frequency = config_rule.get("MaximumExecutionFrequency")
+ if self.maximum_execution_frequency:
+ if self.maximum_execution_frequency not in SourceDetail.FREQUENCY_TYPES:
+ raise ValidationException(
+ f"Value '{self.maximum_execution_frequency}' at "
+ f"'configRule.maximumExecutionFrequency' failed to "
+ f"satisfy constraint: Member must satisfy enum value set: {{"
+ + ", ".join(sorted(SourceDetail.FREQUENCY_TYPES))
+ + "}"
+ )
+
+ # For an AWS managed rule, validate the parameters and trigger type.
+ # Verify the MaximumExecutionFrequency makes sense as well.
+ if self.source.owner == "AWS":
+ self.validate_managed_rule()
+ else:
+ # Per the AWS documentation for a custom rule, ConfigRule's
+ # MaximumExecutionFrequency can only be set if the message type
+ # is ConfigSnapshotDeliveryProperties. However, if
+ # ConfigSnapshotDeliveryProperties is used, the AWS console
+ # leaves the Trigger Type blank and doesn't show the frequency.
+ # If you edit the rule, it doesn't show the frequency either.
+ #
+ # If you provide two custom rules, one with a message type of
+ # ConfigurationSnapshotDeliveryCompleted, one with
+ # ScheduleNotification and specify a MaximumExecutionFrequency
+ # for each, the first one is shown on the AWS console and the
+ # second frequency is shown on the edit page.
+ #
+ # If you provide a custom rule for
+ # OversizedConfigurationItemChangeNotification (not a periodic
+ # trigger) with a MaximumExecutionFrequency for ConfigRule itself,
+ # boto3 doesn't complain and describe_config_rule() shows the
+ # frequency, but the AWS console and the edit page do not.
+ #
+ # So I'm not sure how to validate this situation or when to
+ # set this value to a default value.
+ pass
+
+ self.created_by = config_rule.get("CreatedBy")
+ if self.created_by:
+ raise InvalidParameterValueException(
+ "AWS Config populates the CreatedBy field for "
+ "ServiceLinkedConfigRule. Try again without populating the "
+ "CreatedBy field"
+ )
+
+ self.last_updated_time = datetime2int(datetime.utcnow())
+ self.tags = tags
+
+ def validate_managed_rule(self):
+ """Validate parameters specific to managed rules."""
+ rule_info = MANAGED_RULES_CONSTRAINTS[self.source.source_identifier]
+ param_names = self.input_parameters_dict.keys()
+
+ # Verify input parameter names are actual parameters for the rule ID.
+ if param_names:
+ allowed_names = {x["Name"] for x in rule_info["Parameters"]}
+ if not set(param_names).issubset(allowed_names):
+ raise InvalidParameterValueException(
+ "Unknown parameters provided in the inputParameters: "
+ + self.input_parameters
+ )
+
+ # Verify all the required parameters are specified.
+ required_names = {
+ x["Name"] for x in rule_info["Parameters"] if not x["Optional"]
+ }
+ diffs = required_names.difference(set(param_names))
+ if diffs:
+ raise InvalidParameterValueException(
+ "The required parameter ["
+ + ", ".join(sorted(diffs))
+ + "] is not present in the inputParameters"
+ )
+
+ # boto3 doesn't appear to be checking for valid types in the
+ # InputParameters. It did give an error if a unquoted number was
+ # used: "Blank spaces are not acceptable for input parameter:
+ # MinimumPasswordLength. InputParameters':
+ # '{"RequireNumbers":"true","MinimumPasswordLength":10}'
+ # but I'm not going to attempt to detect that error. I could
+ # check for ints, floats, strings and stringmaps, but boto3 doesn't
+ # check.
+
+ # WARNING: The AWS documentation indicates MaximumExecutionFrequency
+ # can be specified for managed rules triggered at a periodic frequency.
+ # However, boto3 allows a MaximumExecutionFrequency to be specified
+ # for a AWS managed rule regardless of the frequency type. Also of
+ # interest: triggers of "Configuration Changes and Periodic",
+ # i.e., both trigger types. But again, the trigger type is ignored.
+ # if rule_info["Trigger type"] == "Configuration changes":
+ # if self.maximum_execution_frequency:
+ # raise InvalidParameterValueException(
+ # "A maximum execution frequency is not allowed for "
+ # "rules triggered by configuration changes"
+ # )
+ #
+ # WARNING: boto3's describe_config_rule is not showing the
+ # MaximumExecutionFrequency value as being updated, but the AWS
+ # console shows the default value on the console. The default value
+ # is used even if the rule is non-periodic
+ # if "Periodic" in rule_info["Trigger type"]:
+ # if not self.maximum_execution_frequency:
+ # self.maximum_execution_frequency = SourceDetail.DEFAULT_FREQUENCY
+ # if not self.maximum_execution_frequency:
+ # self.maximum_execution_frequency = SourceDetail.DEFAULT_FREQUENCY
+
+ # Verify the rule is allowed for this region -- not yet implemented.
+
+
+class ConfigBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.recorders = {}
+ self.delivery_channels = {}
+ self.config_aggregators = {}
+ self.aggregation_authorizations = {}
+ self.organization_conformance_packs = {}
+ self.config_rules = {}
+ self.config_schema = None
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """List of dicts representing default VPC endpoints for this service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "config"
+ )
+
+ def _validate_resource_types(self, resource_list):
+ if not self.config_schema:
+ self.config_schema = AWSServiceSpec(
+ path="data/config/2014-11-12/service-2.json"
+ )
+
+ # Verify that each entry exists in the supported list:
+ bad_list = []
+ for resource in resource_list:
+ if resource not in self.config_schema.shapes["ResourceType"]["enum"]:
+ bad_list.append(resource)
+
+ if bad_list:
+ raise InvalidResourceTypeException(
+ bad_list, self.config_schema.shapes["ResourceType"]["enum"]
+ )
+
+ def _validate_delivery_snapshot_properties(self, properties):
+ if not self.config_schema:
+ self.config_schema = AWSServiceSpec(
+ path="data/config/2014-11-12/service-2.json"
+ )
+
+ # Verify that the deliveryFrequency is set to an acceptable value:
+ if (
+ properties.get("deliveryFrequency", None)
+ not in self.config_schema.shapes["MaximumExecutionFrequency"]["enum"]
+ ):
+ raise InvalidDeliveryFrequency(
+ properties.get("deliveryFrequency", None),
+ self.config_schema.shapes["MaximumExecutionFrequency"]["enum"],
+ )
+
+ def put_configuration_aggregator(self, config_aggregator):
+ # Validate the name:
+ if len(config_aggregator["ConfigurationAggregatorName"]) > 256:
+ raise NameTooLongException(
+ config_aggregator["ConfigurationAggregatorName"],
+ "configurationAggregatorName",
+ )
+
+ account_sources = None
+ org_source = None
+
+ # Tag validation:
+ tags = validate_tags(config_aggregator.get("Tags", []))
+
+ # Exception if both AccountAggregationSources and
+ # OrganizationAggregationSource are supplied:
+ if config_aggregator.get("AccountAggregationSources") and config_aggregator.get(
+ "OrganizationAggregationSource"
+ ):
+ raise InvalidParameterValueException(
+ "The configuration aggregator cannot be created because your "
+ "request contains both the AccountAggregationSource and the "
+ "OrganizationAggregationSource. Include only one aggregation "
+ "source and try again."
+ )
+
+ # If neither are supplied:
+ if not config_aggregator.get(
+ "AccountAggregationSources"
+ ) and not config_aggregator.get("OrganizationAggregationSource"):
+ raise InvalidParameterValueException(
+ "The configuration aggregator cannot be created because your "
+ "request is missing either the AccountAggregationSource or "
+ "the OrganizationAggregationSource. Include the "
+ "appropriate aggregation source and try again."
+ )
+
+ if config_aggregator.get("AccountAggregationSources"):
+ # Currently, only 1 account aggregation source can be set:
+ if len(config_aggregator["AccountAggregationSources"]) > 1:
+ raise TooManyAccountSources(
+ len(config_aggregator["AccountAggregationSources"])
+ )
+
+ account_sources = []
+ for source in config_aggregator["AccountAggregationSources"]:
+ account_sources.append(
+ AccountAggregatorSource(
+ source["AccountIds"],
+ aws_regions=source.get("AwsRegions"),
+ all_aws_regions=source.get("AllAwsRegions"),
+ )
+ )
+
+ else:
+ org_source = OrganizationAggregationSource(
+ config_aggregator["OrganizationAggregationSource"]["RoleArn"],
+ aws_regions=config_aggregator["OrganizationAggregationSource"].get(
+ "AwsRegions"
+ ),
+ all_aws_regions=config_aggregator["OrganizationAggregationSource"].get(
+ "AllAwsRegions"
+ ),
+ )
+
+ # Grab the existing one if it exists and update it:
+ if not self.config_aggregators.get(
+ config_aggregator["ConfigurationAggregatorName"]
+ ):
+ aggregator = ConfigAggregator(
+ config_aggregator["ConfigurationAggregatorName"],
+ self.region_name,
+ account_sources=account_sources,
+ org_source=org_source,
+ tags=tags,
+ )
+ self.config_aggregators[
+ config_aggregator["ConfigurationAggregatorName"]
+ ] = aggregator
+
+ else:
+ aggregator = self.config_aggregators[
+ config_aggregator["ConfigurationAggregatorName"]
+ ]
+ aggregator.tags = tags
+ aggregator.account_aggregation_sources = account_sources
+ aggregator.organization_aggregation_source = org_source
+ aggregator.last_updated_time = datetime2int(datetime.utcnow())
+
+ return aggregator.to_dict()
+
+ def describe_configuration_aggregators(self, names, token, limit):
+ limit = DEFAULT_PAGE_SIZE if not limit or limit < 0 else limit
+ agg_list = []
+ result = {"ConfigurationAggregators": []}
+
+ if names:
+ for name in names:
+ if not self.config_aggregators.get(name):
+ raise NoSuchConfigurationAggregatorException(number=len(names))
+
+ agg_list.append(name)
+
+ else:
+ agg_list = list(self.config_aggregators.keys())
+
+ # Empty?
+ if not agg_list:
+ return result
+
+ # Sort by name:
+ sorted_aggregators = sorted(agg_list)
+
+ # Get the start:
+ if not token:
+ start = 0
+ else:
+ # Tokens for this moto feature are just the next names of the items in the list:
+ if not self.config_aggregators.get(token):
+ raise InvalidNextTokenException()
+
+ start = sorted_aggregators.index(token)
+
+ # Get the list of items to collect:
+ agg_list = sorted_aggregators[start : (start + limit)]
+ result["ConfigurationAggregators"] = [
+ self.config_aggregators[agg].to_dict() for agg in agg_list
+ ]
+
+ if len(sorted_aggregators) > (start + limit):
+ result["NextToken"] = sorted_aggregators[start + limit]
+
+ return result
+
+ def delete_configuration_aggregator(self, config_aggregator):
+ if not self.config_aggregators.get(config_aggregator):
+ raise NoSuchConfigurationAggregatorException()
+
+ del self.config_aggregators[config_aggregator]
+
+ def put_aggregation_authorization(
+ self, authorized_account, authorized_region, tags
+ ):
+ # Tag validation:
+ tags = validate_tags(tags or [])
+
+ # Does this already exist?
+ key = "{}/{}".format(authorized_account, authorized_region)
+ agg_auth = self.aggregation_authorizations.get(key)
+ if not agg_auth:
+ agg_auth = ConfigAggregationAuthorization(
+ self.region_name, authorized_account, authorized_region, tags=tags
+ )
+ self.aggregation_authorizations[
+ "{}/{}".format(authorized_account, authorized_region)
+ ] = agg_auth
+ else:
+ # Only update the tags:
+ agg_auth.tags = tags
+
+ return agg_auth.to_dict()
+
+ def describe_aggregation_authorizations(self, token, limit):
+ limit = DEFAULT_PAGE_SIZE if not limit or limit < 0 else limit
+ result = {"AggregationAuthorizations": []}
+
+ if not self.aggregation_authorizations:
+ return result
+
+ # Sort by name:
+ sorted_authorizations = sorted(self.aggregation_authorizations.keys())
+
+ # Get the start:
+ if not token:
+ start = 0
+ else:
+ # Tokens for this moto feature are just the next names of the items in the list:
+ if not self.aggregation_authorizations.get(token):
+ raise InvalidNextTokenException()
+
+ start = sorted_authorizations.index(token)
+
+ # Get the list of items to collect:
+ auth_list = sorted_authorizations[start : (start + limit)]
+ result["AggregationAuthorizations"] = [
+ self.aggregation_authorizations[auth].to_dict() for auth in auth_list
+ ]
+
+ if len(sorted_authorizations) > (start + limit):
+ result["NextToken"] = sorted_authorizations[start + limit]
+
+ return result
+
+ def delete_aggregation_authorization(self, authorized_account, authorized_region):
+ # This will always return a 200 -- regardless if there is or isn't an existing
+ # aggregation authorization.
+ key = "{}/{}".format(authorized_account, authorized_region)
+ self.aggregation_authorizations.pop(key, None)
+
+ def put_configuration_recorder(self, config_recorder):
+ # Validate the name:
+ if not config_recorder.get("name"):
+ raise InvalidConfigurationRecorderNameException(config_recorder.get("name"))
+ if len(config_recorder.get("name")) > 256:
+ raise NameTooLongException(
+ config_recorder.get("name"), "configurationRecorder.name"
+ )
+
+ # We're going to assume that the passed in Role ARN is correct.
+
+ # Config currently only allows 1 configuration recorder for an account:
+ if len(self.recorders) == 1 and not self.recorders.get(config_recorder["name"]):
+ raise MaxNumberOfConfigurationRecordersExceededException(
+ config_recorder["name"]
+ )
+
+ # Is this updating an existing one?
+ recorder_status = None
+ if self.recorders.get(config_recorder["name"]):
+ recorder_status = self.recorders[config_recorder["name"]].status
+
+ # Validate the Recording Group:
+ if config_recorder.get("recordingGroup") is None:
+ recording_group = RecordingGroup()
+ else:
+ rgroup = config_recorder["recordingGroup"]
+
+ # If an empty dict is passed in, then bad:
+ if not rgroup:
+ raise InvalidRecordingGroupException()
+
+ # Can't have both the resource types specified and the other flags as True.
+ if rgroup.get("resourceTypes") and (
+ rgroup.get("allSupported", False)
+ or rgroup.get("includeGlobalResourceTypes", False)
+ ):
+ raise InvalidRecordingGroupException()
+
+ # Must supply resourceTypes if 'allSupported' is not supplied:
+ if not rgroup.get("allSupported") and not rgroup.get("resourceTypes"):
+ raise InvalidRecordingGroupException()
+
+ # Validate that the list provided is correct:
+ self._validate_resource_types(rgroup.get("resourceTypes", []))
+
+ recording_group = RecordingGroup(
+ all_supported=rgroup.get("allSupported", True),
+ include_global_resource_types=rgroup.get(
+ "includeGlobalResourceTypes", False
+ ),
+ resource_types=rgroup.get("resourceTypes", []),
+ )
+
+ self.recorders[config_recorder["name"]] = ConfigRecorder(
+ config_recorder["roleARN"],
+ recording_group,
+ name=config_recorder["name"],
+ status=recorder_status,
+ )
+
+ def describe_configuration_recorders(self, recorder_names):
+ recorders = []
+
+ if recorder_names:
+ for rname in recorder_names:
+ if not self.recorders.get(rname):
+ raise NoSuchConfigurationRecorderException(rname)
+
+ # Format the recorder:
+ recorders.append(self.recorders[rname].to_dict())
+
+ else:
+ for recorder in self.recorders.values():
+ recorders.append(recorder.to_dict())
+
+ return recorders
+
+ def describe_configuration_recorder_status(self, recorder_names):
+ recorders = []
+
+ if recorder_names:
+ for rname in recorder_names:
+ if not self.recorders.get(rname):
+ raise NoSuchConfigurationRecorderException(rname)
+
+ # Format the recorder:
+ recorders.append(self.recorders[rname].status.to_dict())
+
+ else:
+ for recorder in self.recorders.values():
+ recorders.append(recorder.status.to_dict())
+
+ return recorders
+
+ def put_delivery_channel(self, delivery_channel):
+ # Must have a configuration recorder:
+ if not self.recorders:
+ raise NoAvailableConfigurationRecorderException()
+
+ # Validate the name:
+ if not delivery_channel.get("name"):
+ raise InvalidDeliveryChannelNameException(delivery_channel.get("name"))
+ if len(delivery_channel.get("name")) > 256:
+ raise NameTooLongException(
+ delivery_channel.get("name"), "deliveryChannel.name"
+ )
+
+ # We are going to assume that the bucket exists -- but will verify if
+ # the bucket provided is blank:
+ if not delivery_channel.get("s3BucketName"):
+ raise NoSuchBucketException()
+
+ # We are going to assume that the bucket has the correct policy
+ # attached to it. We are only going to verify
+ # if the prefix provided is not an empty string:
+ if delivery_channel.get("s3KeyPrefix", None) == "":
+ raise InvalidS3KeyPrefixException()
+
+ # Ditto for SNS -- Only going to assume that the ARN provided is not
+ # an empty string:
+ if delivery_channel.get("snsTopicARN", None) == "":
+ raise InvalidSNSTopicARNException()
+
+ # Config currently only allows 1 delivery channel for an account:
+ if len(self.delivery_channels) == 1 and not self.delivery_channels.get(
+ delivery_channel["name"]
+ ):
+ raise MaxNumberOfDeliveryChannelsExceededException(delivery_channel["name"])
+
+ if not delivery_channel.get("configSnapshotDeliveryProperties"):
+ dprop = None
+
+ else:
+ # Validate the config snapshot delivery properties:
+ self._validate_delivery_snapshot_properties(
+ delivery_channel["configSnapshotDeliveryProperties"]
+ )
+
+ dprop = ConfigDeliverySnapshotProperties(
+ delivery_channel["configSnapshotDeliveryProperties"][
+ "deliveryFrequency"
+ ]
+ )
+
+ self.delivery_channels[delivery_channel["name"]] = ConfigDeliveryChannel(
+ delivery_channel["name"],
+ delivery_channel["s3BucketName"],
+ prefix=delivery_channel.get("s3KeyPrefix", None),
+ sns_arn=delivery_channel.get("snsTopicARN", None),
+ snapshot_properties=dprop,
+ )
+
+ def describe_delivery_channels(self, channel_names):
+ channels = []
+
+ if channel_names:
+ for cname in channel_names:
+ if not self.delivery_channels.get(cname):
+ raise NoSuchDeliveryChannelException(cname)
+
+ # Format the delivery channel:
+ channels.append(self.delivery_channels[cname].to_dict())
+
+ else:
+ for channel in self.delivery_channels.values():
+ channels.append(channel.to_dict())
+
+ return channels
+
+ def start_configuration_recorder(self, recorder_name):
+ if not self.recorders.get(recorder_name):
+ raise NoSuchConfigurationRecorderException(recorder_name)
+
+ # Must have a delivery channel available as well:
+ if not self.delivery_channels:
+ raise NoAvailableDeliveryChannelException()
+
+ # Start recording:
+ self.recorders[recorder_name].status.start()
+
+ def stop_configuration_recorder(self, recorder_name):
+ if not self.recorders.get(recorder_name):
+ raise NoSuchConfigurationRecorderException(recorder_name)
+
+ # Stop recording:
+ self.recorders[recorder_name].status.stop()
+
+ def delete_configuration_recorder(self, recorder_name):
+ if not self.recorders.get(recorder_name):
+ raise NoSuchConfigurationRecorderException(recorder_name)
+
+ del self.recorders[recorder_name]
+
+ def delete_delivery_channel(self, channel_name):
+ if not self.delivery_channels.get(channel_name):
+ raise NoSuchDeliveryChannelException(channel_name)
+
+ # Check if a channel is recording -- if so, bad -- (there can only be 1 recorder):
+ for recorder in self.recorders.values():
+ if recorder.status.recording:
+ raise LastDeliveryChannelDeleteFailedException(channel_name)
+
+ del self.delivery_channels[channel_name]
+
+ def list_discovered_resources(
+ self,
+ resource_type,
+ backend_region,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ ):
+ """Queries against AWS Config (non-aggregated) listing function.
+
+ The listing function must exist for the resource backend.
+
+ :param resource_type:
+ :param backend_region:
+ :param ids:
+ :param name:
+ :param limit:
+ :param next_token:
+ :return:
+ """
+ identifiers = []
+ new_token = None
+
+ limit = limit or DEFAULT_PAGE_SIZE
+ if limit > DEFAULT_PAGE_SIZE:
+ raise InvalidLimitException(limit)
+
+ if resource_ids and resource_name:
+ raise InvalidResourceParameters()
+
+ # Only 20 maximum Resource IDs:
+ if resource_ids and len(resource_ids) > 20:
+ raise TooManyResourceIds()
+
+ # If resource type exists and the backend region is implemented in
+ # moto, then call upon the resource type's Config Query class to
+ # retrieve the list of resources that match the criteria:
+ if RESOURCE_MAP.get(resource_type, {}):
+ # Is this a global resource type? -- if so, re-write the region to 'global':
+ backend_query_region = (
+ backend_region # Always provide the backend this request arrived from.
+ )
+ if RESOURCE_MAP[resource_type].backends.get("global"):
+ backend_region = "global"
+
+ # For non-aggregated queries, the we only care about the
+ # backend_region. Need to verify that moto has implemented
+ # the region for the given backend:
+ if RESOURCE_MAP[resource_type].backends.get(backend_region):
+ # Fetch the resources for the backend's region:
+ identifiers, new_token = RESOURCE_MAP[
+ resource_type
+ ].list_config_service_resources(
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=backend_query_region,
+ )
+
+ resource_identifiers = []
+ for identifier in identifiers:
+ item = {"resourceType": identifier["type"], "resourceId": identifier["id"]}
+
+ # Some resource types lack names:
+ if identifier.get("name"):
+ item["resourceName"] = identifier["name"]
+
+ resource_identifiers.append(item)
+
+ result = {"resourceIdentifiers": resource_identifiers}
+
+ if new_token:
+ result["nextToken"] = new_token
+
+ return result
+
+ def list_aggregate_discovered_resources(
+ self, aggregator_name, resource_type, filters, limit, next_token
+ ):
+ """Queries AWS Config listing function that must exist for resource backend.
+
+ As far a moto goes -- the only real difference between this function
+ and the `list_discovered_resources` function is that this will require
+ a Config Aggregator be set up a priori and can search based on resource
+ regions.
+
+ :param aggregator_name:
+ :param resource_type:
+ :param filters:
+ :param limit:
+ :param next_token:
+ :return:
+ """
+ if not self.config_aggregators.get(aggregator_name):
+ raise NoSuchConfigurationAggregatorException()
+
+ identifiers = []
+ new_token = None
+ filters = filters or {}
+
+ limit = limit or DEFAULT_PAGE_SIZE
+ if limit > DEFAULT_PAGE_SIZE:
+ raise InvalidLimitException(limit)
+
+ # If the resource type exists and the backend region is implemented
+ # in moto, then call upon the resource type's Config Query class to
+ # retrieve the list of resources that match the criteria:
+ if RESOURCE_MAP.get(resource_type, {}):
+ # We only care about a filter's Region, Resource Name, and Resource ID:
+ resource_region = filters.get("Region")
+ resource_id = [filters["ResourceId"]] if filters.get("ResourceId") else None
+ resource_name = filters.get("ResourceName")
+
+ identifiers, new_token = RESOURCE_MAP[
+ resource_type
+ ].list_config_service_resources(
+ resource_id,
+ resource_name,
+ limit,
+ next_token,
+ resource_region=resource_region,
+ aggregator=self.config_aggregators.get(aggregator_name).__dict__,
+ )
+
+ resource_identifiers = []
+ for identifier in identifiers:
+ item = {
+ "SourceAccountId": get_account_id(),
+ "SourceRegion": identifier["region"],
+ "ResourceType": identifier["type"],
+ "ResourceId": identifier["id"],
+ }
+ if identifier.get("name"):
+ item["ResourceName"] = identifier["name"]
+
+ resource_identifiers.append(item)
+
+ result = {"ResourceIdentifiers": resource_identifiers}
+
+ if new_token:
+ result["NextToken"] = new_token
+
+ return result
+
+ def get_resource_config_history(self, resource_type, resource_id, backend_region):
+ """Returns configuration of resource for the current regional backend.
+
+ Item returned in AWS Config format.
+
+ NOTE: This is --NOT-- returning history as it is not supported in
+ moto at this time. (PR's welcome!)
+
+ As such, the later_time, earlier_time, limit, and next_token are
+ ignored as this will only return 1 item. (If no items, it raises an
+ exception).
+ """
+ # If the type isn't implemented then we won't find the item:
+ if resource_type not in RESOURCE_MAP:
+ raise ResourceNotDiscoveredException(resource_type, resource_id)
+
+ # Is the resource type global?
+ backend_query_region = (
+ backend_region # Always provide the backend this request arrived from.
+ )
+ print(RESOURCE_MAP[resource_type].backends)
+ if RESOURCE_MAP[resource_type].backends.get("global"):
+ print("yes, its global")
+ backend_region = "global"
+
+ # If the backend region isn't implemented then we won't find the item:
+ if not RESOURCE_MAP[resource_type].backends.get(backend_region):
+ print(f"cant find {backend_region} for {resource_type}")
+ raise ResourceNotDiscoveredException(resource_type, resource_id)
+
+ # Get the item:
+ item = RESOURCE_MAP[resource_type].get_config_resource(
+ resource_id, backend_region=backend_query_region
+ )
+ if not item:
+ print("item not found")
+ raise ResourceNotDiscoveredException(resource_type, resource_id)
+
+ item["accountId"] = get_account_id()
+
+ return {"configurationItems": [item]}
+
+ def batch_get_resource_config(self, resource_keys, backend_region):
+ """Returns configuration of resource for the current regional backend.
+
+ Item is returned in AWS Config format.
+
+ :param resource_keys:
+ :param backend_region:
+ """
+ # Can't have more than 100 items
+ if len(resource_keys) > 100:
+ raise TooManyResourceKeys(
+ ["com.amazonaws.starling.dove.ResourceKey@12345"] * len(resource_keys)
+ )
+
+ results = []
+ for resource in resource_keys:
+ # Does the resource type exist?
+ if not RESOURCE_MAP.get(resource["resourceType"]):
+ # Not found so skip.
+ continue
+
+ # Is the resource type global?
+ config_backend_region = backend_region
+ backend_query_region = (
+ backend_region # Always provide the backend this request arrived from.
+ )
+ if RESOURCE_MAP[resource["resourceType"]].backends.get("global"):
+ config_backend_region = "global"
+
+ # If the backend region isn't implemented then we won't find the item:
+ if not RESOURCE_MAP[resource["resourceType"]].backends.get(
+ config_backend_region
+ ):
+ continue
+
+ # Get the item:
+ item = RESOURCE_MAP[resource["resourceType"]].get_config_resource(
+ resource["resourceId"], backend_region=backend_query_region
+ )
+ if not item:
+ continue
+
+ item["accountId"] = get_account_id()
+
+ results.append(item)
+
+ return {
+ "baseConfigurationItems": results,
+ "unprocessedResourceKeys": [],
+ } # At this time, moto is not adding unprocessed items.
+
+ def batch_get_aggregate_resource_config(
+ self, aggregator_name, resource_identifiers
+ ):
+ """Returns configuration of resource for current regional backend.
+
+ Item is returned in AWS Config format.
+
+ As far a moto goes -- the only real difference between this function
+ and the `batch_get_resource_config` function is that this will require
+ a Config Aggregator be set up a priori and can search based on resource
+ regions.
+
+ Note: moto will IGNORE the resource account ID in the search query.
+ """
+ if not self.config_aggregators.get(aggregator_name):
+ raise NoSuchConfigurationAggregatorException()
+
+ # Can't have more than 100 items
+ if len(resource_identifiers) > 100:
+ raise TooManyResourceKeys(
+ ["com.amazonaws.starling.dove.AggregateResourceIdentifier@12345"]
+ * len(resource_identifiers)
+ )
+
+ found = []
+ not_found = []
+ for identifier in resource_identifiers:
+ resource_type = identifier["ResourceType"]
+ resource_region = identifier["SourceRegion"]
+ resource_id = identifier["ResourceId"]
+ resource_name = identifier.get("ResourceName", None)
+
+ # Does the resource type exist?
+ if not RESOURCE_MAP.get(resource_type):
+ not_found.append(identifier)
+ continue
+
+ # Get the item:
+ item = RESOURCE_MAP[resource_type].get_config_resource(
+ resource_id,
+ resource_name=resource_name,
+ resource_region=resource_region,
+ )
+ if not item:
+ not_found.append(identifier)
+ continue
+
+ item["accountId"] = get_account_id()
+
+ # The 'tags' field is not included in aggregate results for some reason...
+ item.pop("tags", None)
+
+ found.append(item)
+
+ return {
+ "BaseConfigurationItems": found,
+ "UnprocessedResourceIdentifiers": not_found,
+ }
+
+ def put_evaluations(self, evaluations=None, result_token=None, test_mode=False):
+ if not evaluations:
+ raise InvalidParameterValueException(
+ "The Evaluations object in your request cannot be null."
+ "Add the required parameters and try again."
+ )
+
+ if not result_token:
+ raise InvalidResultTokenException()
+
+ # Moto only supports PutEvaluations with test mode currently
+ # (missing rule and token support).
+ if not test_mode:
+ raise NotImplementedError(
+ "PutEvaluations without TestMode is not yet implemented"
+ )
+
+ return {
+ "FailedEvaluations": [],
+ } # At this time, moto is not adding failed evaluations.
+
+ def put_organization_conformance_pack(
+ self,
+ name,
+ template_s3_uri,
+ template_body,
+ delivery_s3_bucket,
+ delivery_s3_key_prefix,
+ input_parameters,
+ excluded_accounts,
+ ):
+ # a real validation of the content of the template is missing at the moment
+ if not template_s3_uri and not template_body:
+ raise ValidationException("Template body is invalid")
+
+ if not re.match(r"s3://.*", template_s3_uri):
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '{}' at 'templateS3Uri' failed to satisfy constraint: "
+ "Member must satisfy regular expression pattern: "
+ "s3://.*".format(template_s3_uri)
+ )
+
+ pack = self.organization_conformance_packs.get(name)
+
+ if pack:
+ pack.update(
+ delivery_s3_bucket=delivery_s3_bucket,
+ delivery_s3_key_prefix=delivery_s3_key_prefix,
+ input_parameters=input_parameters,
+ excluded_accounts=excluded_accounts,
+ )
+ else:
+ pack = OrganizationConformancePack(
+ region=self.region_name,
+ name=name,
+ delivery_s3_bucket=delivery_s3_bucket,
+ delivery_s3_key_prefix=delivery_s3_key_prefix,
+ input_parameters=input_parameters,
+ excluded_accounts=excluded_accounts,
+ )
+
+ self.organization_conformance_packs[name] = pack
+
+ return {
+ "OrganizationConformancePackArn": pack.organization_conformance_pack_arn
+ }
+
+ def describe_organization_conformance_packs(self, names):
+ packs = []
+
+ for name in names:
+ pack = self.organization_conformance_packs.get(name)
+
+ if not pack:
+ raise NoSuchOrganizationConformancePackException(
+ "One or more organization conformance packs with "
+ "specified names are not present. Ensure your names are "
+ "correct and try your request again later."
+ )
+
+ packs.append(pack.to_dict())
+
+ return {"OrganizationConformancePacks": packs}
+
+ def describe_organization_conformance_pack_statuses(self, names):
+ packs = []
+ statuses = []
+
+ if names:
+ for name in names:
+ pack = self.organization_conformance_packs.get(name)
+
+ if not pack:
+ raise NoSuchOrganizationConformancePackException(
+ "One or more organization conformance packs with "
+ "specified names are not present. Ensure your names "
+ "are correct and try your request again later."
+ )
+
+ packs.append(pack)
+ else:
+ packs = list(self.organization_conformance_packs.values())
+
+ for pack in packs:
+ statuses.append(
+ {
+ "OrganizationConformancePackName": pack.organization_conformance_pack_name,
+ "Status": pack._status,
+ "LastUpdateTime": pack.last_update_time,
+ }
+ )
+
+ return {"OrganizationConformancePackStatuses": statuses}
+
+ def get_organization_conformance_pack_detailed_status(self, name):
+ pack = self.organization_conformance_packs.get(name)
+
+ if not pack:
+ raise NoSuchOrganizationConformancePackException(
+ "One or more organization conformance packs with specified names are not present. "
+ "Ensure your names are correct and try your request again later."
+ )
+
+ # actually here would be a list of all accounts in the organization
+ statuses = [
+ {
+ "AccountId": get_account_id(),
+ "ConformancePackName": "OrgConformsPack-{0}".format(
+ pack._unique_pack_name
+ ),
+ "Status": pack._status,
+ "LastUpdateTime": datetime2int(datetime.utcnow()),
+ }
+ ]
+
+ return {"OrganizationConformancePackDetailedStatuses": statuses}
+
+ def delete_organization_conformance_pack(self, name):
+ pack = self.organization_conformance_packs.get(name)
+
+ if not pack:
+ raise NoSuchOrganizationConformancePackException(
+ "Could not find an OrganizationConformancePack for given "
+ "request with resourceName {}".format(name)
+ )
+
+ self.organization_conformance_packs.pop(name)
+
+ def _match_arn(self, resource_arn):
+ """Return config instance that has a matching ARN."""
+ # The allowed resources are ConfigRule, ConfigurationAggregator,
+ # and AggregatorAuthorization.
+ allowed_resources = [
+ {
+ "configs": self.config_aggregators,
+ "arn_attribute": "configuration_aggregator_arn",
+ },
+ {
+ "configs": self.aggregation_authorizations,
+ "arn_attribute": "aggregation_authorization_arn",
+ },
+ {"configs": self.config_rules, "arn_attribute": "config_rule_arn"},
+ ]
+
+ # Find matching config for given resource_arn among all the
+ # allowed config resources.
+ matched_config = None
+ for resource in allowed_resources:
+ for config in resource["configs"].values():
+ if resource_arn == getattr(config, resource["arn_attribute"]):
+ matched_config = config
+ break
+
+ if not matched_config:
+ raise ResourceNotFoundException(resource_arn)
+ return matched_config
+
+ def tag_resource(self, resource_arn, tags):
+ """Add tags in config with a matching ARN."""
+ # Tag validation:
+ tags = validate_tags(tags)
+
+ # Find config with a matching ARN.
+ matched_config = self._match_arn(resource_arn)
+
+ # Merge the new tags with the existing tags.
+ matched_config.tags.update(tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ """Remove tags in config with a matching ARN.
+
+ If the tags in the tag_keys don't match any keys for that
+ ARN, they're just ignored.
+ """
+ if len(tag_keys) > MAX_TAGS_IN_ARG:
+ raise TooManyTags(tag_keys)
+
+ # Find config with a matching ARN.
+ matched_config = self._match_arn(resource_arn)
+
+ for tag_key in tag_keys:
+ matched_config.tags.pop(tag_key, None)
+
+ def list_tags_for_resource(
+ self, resource_arn, limit, next_token
+ ): # pylint: disable=unused-argument
+ """Return list of tags for AWS Config resource."""
+ # The limit argument is essentially ignored as a config instance
+ # can only have 50 tags, but we'll check the argument anyway.
+ # Although the boto3 documentation indicates the limit is 50, boto3
+ # accepts a limit value up to 100 as does the AWS CLI.
+ limit = limit or DEFAULT_PAGE_SIZE
+ if limit > DEFAULT_PAGE_SIZE:
+ raise InvalidLimitException(limit)
+
+ matched_config = self._match_arn(resource_arn)
+ return {
+ "Tags": [
+ {"Key": k, "Value": v} for k, v in sorted(matched_config.tags.items())
+ ]
+ }
+
+ def put_config_rule(self, config_rule, tags=None):
+ """Add/Update config rule for evaluating resource compliance.
+
+ TBD - Only the "accounting" of config rules are handled at the
+ moment. No events are created or triggered. There is no
+ interaction with the config recorder.
+ """
+ # If there is no rule_name, use the ARN or ID to get the
+ # rule_name.
+ rule_name = config_rule.get("ConfigRuleName")
+ if rule_name:
+ if len(rule_name) > 128:
+ raise NameTooLongException(rule_name, "configRule.configRuleName", 128)
+ else:
+ # Can we find the rule using the ARN or ID?
+ rule_arn = config_rule.get("ConfigRuleArn")
+ rule_id = config_rule.get("ConfigRuleId")
+ if not rule_arn and not rule_id:
+ raise InvalidParameterValueException(
+ "One or more identifiers needs to be provided. Provide "
+ "Name or Id or Arn"
+ )
+ for config_rule_obj in self.config_rules.values():
+ if rule_id and config_rule_obj.config_rule_id == rule_id:
+ rule_name = config_rule_obj.config_rule_name
+ break
+ if rule_arn and config_rule_obj.config_rule_arn == rule_arn:
+ rule_name = config_rule_obj.config_rule_name
+ break
+ else:
+ raise InvalidParameterValueException(
+ "One or more identifiers needs to be provided. Provide "
+ "Name or Id or Arn"
+ )
+
+ tags = validate_tags(tags or [])
+
+ # With the rule_name, determine whether it's for an existing rule
+ # or whether a new rule should be created.
+ rule = self.config_rules.get(rule_name)
+ if rule:
+ # Rule exists. Make sure it isn't in use for another activity.
+ rule_state = rule.config_rule_state
+ if rule_state != "ACTIVE":
+ activity = "deleted" if rule_state.startswith("DELET") else "evaluated"
+ raise ResourceInUseException(
+ f"The rule {rule_name} is currently being {activity}. "
+ f"Please retry after some time"
+ )
+
+ # Update the current rule.
+ rule.modify_fields(self.region_name, config_rule, tags)
+ else:
+ # Create a new ConfigRule if the limit hasn't been reached.
+ if len(self.config_rules) == ConfigRule.MAX_RULES:
+ raise MaxNumberOfConfigRulesExceededException(
+ rule_name, ConfigRule.MAX_RULES
+ )
+ rule = ConfigRule(self.region_name, config_rule, tags)
+ self.config_rules[rule_name] = rule
+ return ""
+
+ def describe_config_rules(self, config_rule_names, next_token):
+ """Return details for the given ConfigRule names or for all rules."""
+ result = {"ConfigRules": []}
+ if not self.config_rules:
+ return result
+
+ rule_list = []
+ if config_rule_names:
+ for name in config_rule_names:
+ if not self.config_rules.get(name):
+ raise NoSuchConfigRuleException(name)
+ rule_list.append(name)
+ else:
+ rule_list = list(self.config_rules.keys())
+
+ # The rules are not sorted alphanumerically.
+ sorted_rules = sorted(rule_list)
+ start = 0
+ if next_token:
+ if not self.config_rules.get(next_token):
+ raise InvalidNextTokenException()
+ start = sorted_rules.index(next_token)
+
+ rule_list = sorted_rules[start : start + CONFIG_RULE_PAGE_SIZE]
+ result["ConfigRules"] = [self.config_rules[x].to_dict() for x in rule_list]
+
+ if len(sorted_rules) > (start + CONFIG_RULE_PAGE_SIZE):
+ result["NextToken"] = sorted_rules[start + CONFIG_RULE_PAGE_SIZE]
+ return result
+
+ def delete_config_rule(self, rule_name):
+ """Delete config rule used for evaluating resource compliance."""
+ rule = self.config_rules.get(rule_name)
+ if not rule:
+ raise NoSuchConfigRuleException(rule_name)
+
+ # The following logic is not applicable for moto as far as I can tell.
+ # if rule.config_rule_state == "DELETING":
+ # raise ResourceInUseException(
+ # f"The rule {rule_name} is currently being deleted. Please "
+ # f"retry after some time"
+ # )
+ rule.config_rule_state = "DELETING"
+ self.config_rules.pop(rule_name)
+
+
+config_backends = BackendDict(ConfigBackend, "config")
diff --git a/contrib/python/moto/py3/moto/config/resources/aws_managed_rules.json b/contrib/python/moto/py3/moto/config/resources/aws_managed_rules.json
new file mode 100644
index 0000000000..e9c6a20261
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/resources/aws_managed_rules.json
@@ -0,0 +1,2310 @@
+{
+ "ManagedRules": {
+ "ACCESS_KEYS_ROTATED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "90",
+ "Name": "maxAccessKeyAge",
+ "Optional": false,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "ACCOUNT_PART_OF_ORGANIZATIONS": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "MasterAccountId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "ACM_CERTIFICATE_EXPIRATION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka), Europe (Milan) Region",
+ "Parameters": [
+ {
+ "Default": "14",
+ "Name": "daysToExpiration",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ALB_HTTP_DROP_INVALID_HEADER_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "ALB_HTTP_TO_HTTPS_REDIRECTION_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "ALB_WAF_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "wafWebAclIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_ASSOCIATED_WITH_WAF": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "WebAclArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_CACHE_ENABLED_AND_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_ENDPOINT_TYPE_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "endpointConfigurationTypes",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_EXECUTION_LOGGING_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "ERROR,INFO",
+ "Name": "loggingLevel",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_SSL_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "CertificateIDs",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "API_GW_XRAY_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "APPROVED_AMIS_BY_ID": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "amiIds",
+ "Optional": false,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "APPROVED_AMIS_BY_TAG": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "tag-key",
+ "Name": "amisByTagKeyAndValue",
+ "Optional": false,
+ "Type": "StringMap"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "AURORA_MYSQL_BACKTRACKING_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town), South America (Sao Paulo) Region",
+ "Parameters": [
+ {
+ "Name": "BacktrackWindowInHours",
+ "Optional": true,
+ "Type": "double"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "AURORA_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "AUTOSCALING_GROUP_ELB_HEALTHCHECK_REQUIRED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "AUTOSCALING_LAUNCH_CONFIG_PUBLIC_IP_DISABLED": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "BACKUP_PLAN_MIN_FREQUENCY_AND_MIN_RETENTION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Default": "1",
+ "Name": "requiredFrequencyValue",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "35",
+ "Name": "requiredRetentionDays",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "days",
+ "Name": "requiredFrequencyUnit",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "BACKUP_RECOVERY_POINT_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "BACKUP_RECOVERY_POINT_MANUAL_DELETION_DISABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "principalArnList",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "BACKUP_RECOVERY_POINT_MINIMUM_RETENTION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Default": "35",
+ "Name": "requiredRetentionDays",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "BEANSTALK_ENHANCED_HEALTH_REPORTING_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFORMATION_STACK_DRIFT_DETECTION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Paris), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "cloudformationRoleArn",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFORMATION_STACK_NOTIFICATION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Paris), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "snsTopic1",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopic2",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopic3",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopic4",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopic5",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_ACCESSLOGS_ENABLED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [
+ {
+ "Name": "S3BucketName",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_ASSOCIATED_WITH_WAF": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [
+ {
+ "Name": "wafWebAclIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_CUSTOM_SSL_CERTIFICATE": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_DEFAULT_ROOT_OBJECT_CONFIGURED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_ORIGIN_ACCESS_IDENTITY_ENABLED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_ORIGIN_FAILOVER_ENABLED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_SNI_ENABLED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDFRONT_VIEWER_POLICY_HTTPS": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDTRAIL_S3_DATAEVENTS_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "S3BucketNames",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "CLOUDTRAIL_SECURITY_TRAIL_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "CLOUDWATCH_ALARM_ACTION_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "true",
+ "Name": "alarmActionRequired",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Default": "true",
+ "Name": "insufficientDataActionRequired",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Default": "false",
+ "Name": "okActionRequired",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "action1",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "action2",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "action3",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "action4",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "action5",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDWATCH_ALARM_RESOURCE_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "resourceType",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "metricName",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "CLOUDWATCH_ALARM_SETTINGS_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "metricName",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "threshold",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "evaluationPeriods",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "300",
+ "Name": "period",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "comparisonOperator",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "statistic",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CLOUDWATCH_LOG_GROUP_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "KmsKeyId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "CLOUD_TRAIL_CLOUD_WATCH_LOGS_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "expectedDeliveryWindowAge",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "CLOUD_TRAIL_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "s3BucketName",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopicArn",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "cloudWatchLogsLogGroupArn",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "CLOUD_TRAIL_ENCRYPTION_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "CLOUD_TRAIL_LOG_FILE_VALIDATION_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "CMK_BACKING_KEY_ROTATION_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "CODEBUILD_PROJECT_ENVVAR_AWSCRED_CHECK": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CODEBUILD_PROJECT_SOURCE_REPO_URL_CHECK": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "CODEPIPELINE_DEPLOYMENT_COUNT_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "deploymentLimit",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CODEPIPELINE_REGION_FANOUT_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "3",
+ "Name": "regionFanoutFactor",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "CW_LOGGROUP_RETENTION_PERIOD_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "LogGroupNames",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "MinRetentionTime",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "DAX_ENCRYPTION_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Asia Pacific (Seoul), Canada (Central), Europe (Milan), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "DB_INSTANCE_BACKUP_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "backupRetentionPeriod",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "backupRetentionMinimum",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "preferredBackupWindow",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "checkReadReplicas",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "DESIRED_INSTANCE_TENANCY": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "tenancy",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "imageId",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "hostId",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "DESIRED_INSTANCE_TYPE": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "instanceType",
+ "Optional": false,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "DMS_REPLICATION_NOT_PUBLIC": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "DYNAMODB_AUTOSCALING_ENABLED": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West) Region",
+ "Parameters": [
+ {
+ "Name": "minProvisionedReadCapacity",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "maxProvisionedReadCapacity",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "targetReadUtilization",
+ "Optional": true,
+ "Type": "double"
+ },
+ {
+ "Name": "minProvisionedWriteCapacity",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "maxProvisionedWriteCapacity",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "targetWriteUtilization",
+ "Optional": true,
+ "Type": "double"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "DYNAMODB_IN_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "DYNAMODB_PITR_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "DYNAMODB_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "DYNAMODB_TABLE_ENCRYPTED_KMS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "DYNAMODB_TABLE_ENCRYPTION_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Europe (Milan), Europe (Stockholm), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "DYNAMODB_THROUGHPUT_LIMIT_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "80",
+ "Name": "accountRCUThresholdPercentage",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "80",
+ "Name": "accountWCUThresholdPercentage",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EBS_IN_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "EBS_OPTIMIZED_INSTANCE": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EBS_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EBS_SNAPSHOT_PUBLIC_RESTORABLE_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "EC2_EBS_ENCRYPTION_BY_DEFAULT": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "EC2_IMDSV2_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_INSTANCE_DETAILED_MONITORING_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_INSTANCE_MANAGED_BY_SSM": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_INSTANCE_MULTIPLE_ENI_CHECK": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "NetworkInterfaceIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_INSTANCE_NO_PUBLIC_IP": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_INSTANCE_PROFILE_ATTACHED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "IamInstanceProfileArnList",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_APPLICATIONS_BLACKLISTED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "applicationNames",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "platformType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_APPLICATIONS_REQUIRED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "applicationNames",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "platformType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_ASSOCIATION_COMPLIANCE_STATUS_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_INVENTORY_BLACKLISTED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "inventoryNames",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "platformType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_PATCH_COMPLIANCE_STATUS_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_MANAGEDINSTANCE_PLATFORM_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "platformType",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "platformVersion",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "agentVersion",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "platformName",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EC2_SECURITY_GROUP_ATTACHED_TO_ENI": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EC2_STOPPED_INSTANCE": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "30",
+ "Name": "AllowedDays",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EC2_VOLUME_INUSE_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "deleteOnTermination",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ECS_TASK_DEFINITION_USER_FOR_HOST_MODE_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "SkipInactiveTaskDefinitions",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "EFS_ENCRYPTED_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "KmsKeyId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EFS_IN_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "EFS_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EIP_ATTACHED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EKS_ENDPOINT_NO_PUBLIC_ACCESS": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), US West (N. California), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "EKS_SECRETS_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), US West (N. California), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "ELASTICACHE_REDIS_CLUSTER_AUTOMATIC_BACKUP_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Default": "15",
+ "Name": "snapshotRetentionPeriod",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "ELASTICSEARCH_ENCRYPTED_AT_REST": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "ELASTICSEARCH_IN_VPC_ONLY": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "ELASTICSEARCH_LOGS_TO_CLOUDWATCH": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West) Region",
+ "Parameters": [
+ {
+ "Name": "logTypes",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ELASTICSEARCH_NODE_TO_NODE_ENCRYPTION_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "ELASTIC_BEANSTALK_MANAGED_UPDATES_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "UpdateLevel",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ELBV2_ACM_CERTIFICATE_REQUIRED": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "AcmCertificatesAllowed",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "ELB_ACM_CERTIFICATE_REQUIRED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_CROSS_ZONE_LOAD_BALANCING_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_CUSTOM_SECURITY_POLICY_SSL_CHECK": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "sslProtocolsAndCiphers",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_DELETION_PROTECTION_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_LOGGING_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "s3BucketNames",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_PREDEFINED_SECURITY_POLICY_SSL_CHECK": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "predefinedPolicyName",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ELB_TLS_HTTPS_LISTENERS_ONLY": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "EMR_KERBEROS_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "TicketLifetimeInHours",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "Realm",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "Domain",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "AdminServer",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "KdcServer",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "EMR_MASTER_NO_PUBLIC_IP": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "ENCRYPTED_VOLUMES": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "kmsId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "FMS_SHIELD_RESOURCE_POLICY_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "webACLId",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceTypes",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "excludeResourceTags",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Name": "fmsManagedToken",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "fmsRemediationEnabled",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "FMS_WEBACL_RESOURCE_POLICY_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "webACLId",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "excludeResourceTags",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Name": "fmsManagedToken",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "fmsRemediationEnabled",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "FMS_WEBACL_RULEGROUP_ASSOCIATION_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "ruleGroups",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "fmsManagedToken",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "fmsRemediationEnabled",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "FSX_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "GUARDDUTY_ENABLED_CENTRALIZED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "CentralMonitoringAccount",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "GUARDDUTY_NON_ARCHIVED_FINDINGS": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Middle East (Bahrain), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "30",
+ "Name": "daysLowSev",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "7",
+ "Name": "daysMediumSev",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "1",
+ "Name": "daysHighSev",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "IAM_CUSTOMER_POLICY_BLOCKED_KMS_ACTIONS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "blockedActionsPatterns",
+ "Optional": false,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_GROUP_HAS_USERS_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_INLINE_POLICY_BLOCKED_KMS_ACTIONS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "blockedActionsPatterns",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "excludeRoleByManagementAccount",
+ "Optional": true,
+ "Type": "boolean"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_NO_INLINE_POLICY_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_PASSWORD_POLICY": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "true",
+ "Name": "RequireUppercaseCharacters",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Default": "true",
+ "Name": "RequireLowercaseCharacters",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Default": "true",
+ "Name": "RequireSymbols",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Default": "true",
+ "Name": "RequireNumbers",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Default": "14",
+ "Name": "MinimumPasswordLength",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "24",
+ "Name": "PasswordReusePrevention",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "90",
+ "Name": "MaxPasswordAge",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "IAM_POLICY_BLACKLISTED_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "arn",
+ "Name": "policyArns",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "exceptionList",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_POLICY_IN_USE": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "policyARN",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "policyUsageType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "IAM_POLICY_NO_STATEMENTS_WITH_ADMIN_ACCESS": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_POLICY_NO_STATEMENTS_WITH_FULL_ACCESS": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_ROLE_MANAGED_POLICY_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "managedPolicyArns",
+ "Optional": false,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_ROOT_ACCESS_KEY_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "IAM_USER_GROUP_MEMBERSHIP_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "groupNames",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_USER_MFA_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "IAM_USER_NO_POLICIES_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "IAM_USER_UNUSED_CREDENTIALS_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "90",
+ "Name": "maxCredentialUsageAge",
+ "Optional": false,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "INCOMING_SSH_DISABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "INSTANCES_IN_VPC": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "vpcId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "INTERNET_GATEWAY_AUTHORIZED_VPC_ONLY": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "AuthorizedVpcIds",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "KMS_CMK_NOT_SCHEDULED_FOR_DELETION": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyIds",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "LAMBDA_CONCURRENCY_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "ConcurrencyLimitLow",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "ConcurrencyLimitHigh",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "LAMBDA_DLQ_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "dlqArns",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "LAMBDA_FUNCTION_PUBLIC_ACCESS_PROHIBITED": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "LAMBDA_FUNCTION_SETTINGS_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "runtime",
+ "Optional": false,
+ "Type": "CSV"
+ },
+ {
+ "Name": "role",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Default": "3",
+ "Name": "timeout",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "128",
+ "Name": "memorySize",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "LAMBDA_INSIDE_VPC": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "subnetIds",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "MFA_ENABLED_FOR_IAM_CONSOLE_ACCESS": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "MULTI_REGION_CLOUD_TRAIL_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "s3BucketName",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "snsTopicArn",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "cloudWatchLogsLogGroupArn",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "includeManagementEvents",
+ "Optional": true,
+ "Type": "boolean"
+ },
+ {
+ "Name": "readWriteType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "NO_UNRESTRICTED_ROUTE_TO_IGW": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "routeTableIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_AUTOMATIC_MINOR_VERSION_UPGRADE_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_CLUSTER_DELETION_PROTECTION_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka), Middle East (Bahrain), South America (Sao Paulo) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_CLUSTER_IAM_AUTHENTICATION_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Middle East (Bahrain), South America (Sao Paulo) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_CLUSTER_MULTI_AZ_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Middle East (Bahrain), South America (Sao Paulo) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_ENHANCED_MONITORING_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "monitoringInterval",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_INSTANCE_DELETION_PROTECTION_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "databaseEngines",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_INSTANCE_IAM_AUTHENTICATION_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Hong Kong), Asia Pacific (Osaka), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_INSTANCE_PUBLIC_ACCESS_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_IN_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "RDS_LOGGING_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "additionalLogs",
+ "Optional": true,
+ "Type": "StringMap"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_MULTI_AZ_SUPPORT": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_RESOURCES_PROTECTED_BY_BACKUP_PLAN": {
+ "AWS Region": "All supported AWS regions except China (Beijing), Africa (Cape Town), Asia Pacific (Osaka), Europe (Milan), AWS GovCloud (US-East), AWS GovCloud (US-West), US West (Oregon), and China (Ningxia) Region",
+ "Parameters": [
+ {
+ "Name": "resourceTags",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "resourceId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "RDS_SNAPSHOTS_PUBLIC_PROHIBITED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_SNAPSHOT_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "RDS_STORAGE_ENCRYPTED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "kmsKeyId",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_BACKUP_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Ningxia), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "MinRetentionPeriod",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Name": "MaxRetentionPeriod",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_CLUSTER_CONFIGURATION_CHECK": {
+ "AWS Region": "All supported AWS regions except Middle East (Bahrain) Region",
+ "Parameters": [
+ {
+ "Default": "true",
+ "Name": "clusterDbEncrypted",
+ "Optional": false,
+ "Type": "boolean"
+ },
+ {
+ "Default": "true",
+ "Name": "loggingEnabled",
+ "Optional": false,
+ "Type": "boolean"
+ },
+ {
+ "Default": "dc1.large",
+ "Name": "nodeTypes",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_CLUSTER_KMS_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_CLUSTER_MAINTENANCESETTINGS_CHECK": {
+ "AWS Region": "All supported AWS regions except Middle East (Bahrain) Region",
+ "Parameters": [
+ {
+ "Default": "true",
+ "Name": "allowVersionUpgrade",
+ "Optional": false,
+ "Type": "boolean"
+ },
+ {
+ "Name": "preferredMaintenanceWindow",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Default": "1",
+ "Name": "automatedSnapshotRetentionPeriod",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_CLUSTER_PUBLIC_ACCESS_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_ENHANCED_VPC_ROUTING_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "REDSHIFT_REQUIRE_TLS_SSL": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "REQUIRED_TAGS": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Default": "CostCenter",
+ "Name": "tag1Key",
+ "Optional": false,
+ "Type": "String"
+ },
+ {
+ "Name": "tag1Value",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "tag2Key",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "tag2Value",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "tag3Key",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "tag3Value",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "tag4Key",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "tag4Value",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "tag5Key",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "tag5Value",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "tag6Key",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "tag6Value",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "RESTRICTED_INCOMING_TRAFFIC": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Default": "20",
+ "Name": "blockedPort1",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "21",
+ "Name": "blockedPort2",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "3389",
+ "Name": "blockedPort3",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "3306",
+ "Name": "blockedPort4",
+ "Optional": true,
+ "Type": "int"
+ },
+ {
+ "Default": "4333",
+ "Name": "blockedPort5",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "ROOT_ACCOUNT_HARDWARE_MFA_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "ROOT_ACCOUNT_MFA_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka), Europe (Milan), Middle East (Bahrain) Region",
+ "Parameters": [
+ {
+ "Default": "True",
+ "Name": "IgnorePublicAcls",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Default": "True",
+ "Name": "BlockPublicPolicy",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Default": "True",
+ "Name": "BlockPublicAcls",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Default": "True",
+ "Name": "RestrictPublicBuckets",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes (current status not checked, only evaluted when changes generate new events)"
+ },
+ "S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS_PERIODIC": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West) Region",
+ "Parameters": [
+ {
+ "Name": "IgnorePublicAcls",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "BlockPublicPolicy",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "BlockPublicAcls",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "RestrictPublicBuckets",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "S3_BUCKET_BLACKLISTED_ACTIONS_PROHIBITED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "blacklistedActionPattern",
+ "Optional": false,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_DEFAULT_LOCK_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "mode",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_LEVEL_PUBLIC_ACCESS_PROHIBITED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "excludedPublicBuckets",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_LOGGING_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "targetBucket",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "targetPrefix",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_POLICY_GRANTEE_CHECK": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "awsPrincipals",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "servicePrincipals",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "federatedUsers",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "ipAddresses",
+ "Optional": true,
+ "Type": "CSV"
+ },
+ {
+ "Name": "vpcIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_POLICY_NOT_MORE_PERMISSIVE": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "controlPolicy",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_PUBLIC_READ_PROHIBITED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes and Periodic"
+ },
+ "S3_BUCKET_PUBLIC_WRITE_PROHIBITED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes and Periodic"
+ },
+ "S3_BUCKET_REPLICATION_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_SSL_REQUESTS_ONLY": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_BUCKET_VERSIONING_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "isMfaDeleteEnabled",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "S3_DEFAULT_ENCRYPTION_KMS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "SAGEMAKER_ENDPOINT_CONFIGURATION_KMS_KEY_CONFIGURED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "SAGEMAKER_NOTEBOOK_INSTANCE_KMS_KEY_CONFIGURED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "SAGEMAKER_NOTEBOOK_NO_DIRECT_INTERNET_ACCESS": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "SECRETSMANAGER_ROTATION_ENABLED_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "maximumAllowedRotationFrequency",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "SECRETSMANAGER_SCHEDULED_ROTATION_SUCCESS_CHECK": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "SECRETSMANAGER_SECRET_PERIODIC_ROTATION": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "maxDaysSinceRotation",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "SECRETSMANAGER_SECRET_UNUSED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "unusedForDays",
+ "Optional": true,
+ "Type": "int"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "SECRETSMANAGER_USING_CMK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "SECURITYHUB_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "SERVICE_VPC_ENDPOINT_ENABLED": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "serviceName",
+ "Optional": false,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "SHIELD_ADVANCED_ENABLED_AUTORENEW": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "SHIELD_DRT_ACCESS": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "SNS_ENCRYPTED_KMS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "kmsKeyIds",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "SSM_DOCUMENT_NOT_PUBLIC": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Periodic"
+ },
+ "SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "VPC_DEFAULT_SECURITY_GROUP_CLOSED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "VPC_FLOW_LOGS_ENABLED": {
+ "AWS Region": "All supported AWS regions",
+ "Parameters": [
+ {
+ "Name": "trafficType",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "VPC_NETWORK_ACL_UNUSED_CHECK": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "VPC_SG_OPEN_ONLY_TO_AUTHORIZED_PORTS": {
+ "AWS Region": "All supported AWS regions except Asia Pacific (Osaka) Region",
+ "Parameters": [
+ {
+ "Name": "authorizedTcpPorts",
+ "Optional": true,
+ "Type": "String"
+ },
+ {
+ "Name": "authorizedUdpPorts",
+ "Optional": true,
+ "Type": "String"
+ }
+ ],
+ "Trigger type": "Configuration changes"
+ },
+ "VPC_VPN_2_TUNNELS_UP": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), Asia Pacific (Osaka), Middle East (Bahrain) Region",
+ "Parameters": [],
+ "Trigger type": "Configuration changes"
+ },
+ "WAFV2_LOGGING_ENABLED": {
+ "AWS Region": "All supported AWS regions except China (Beijing), China (Ningxia), AWS GovCloud (US-East), AWS GovCloud (US-West), Asia Pacific (Osaka), Europe (Milan), Africa (Cape Town) Region",
+ "Parameters": [
+ {
+ "Name": "KinesisFirehoseDeliveryStreamArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Periodic"
+ },
+ "WAF_CLASSIC_LOGGING_ENABLED": {
+ "AWS Region": "Only available in US East (N. Virginia) Region",
+ "Parameters": [
+ {
+ "Name": "KinesisFirehoseDeliveryStreamArns",
+ "Optional": true,
+ "Type": "CSV"
+ }
+ ],
+ "Trigger type": "Periodic"
+ }
+ }
+} \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/config/responses.py b/contrib/python/moto/py3/moto/config/responses.py
new file mode 100644
index 0000000000..8c226b3d93
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/responses.py
@@ -0,0 +1,236 @@
+import json
+from moto.core.responses import BaseResponse
+from .models import config_backends
+
+
+class ConfigResponse(BaseResponse):
+ @property
+ def config_backend(self):
+ return config_backends[self.region]
+
+ def put_configuration_recorder(self):
+ self.config_backend.put_configuration_recorder(
+ self._get_param("ConfigurationRecorder")
+ )
+ return ""
+
+ def put_configuration_aggregator(self):
+ aggregator = self.config_backend.put_configuration_aggregator(
+ json.loads(self.body)
+ )
+ schema = {"ConfigurationAggregator": aggregator}
+ return json.dumps(schema)
+
+ def describe_configuration_aggregators(self):
+ aggregators = self.config_backend.describe_configuration_aggregators(
+ self._get_param("ConfigurationAggregatorNames"),
+ self._get_param("NextToken"),
+ self._get_param("Limit"),
+ )
+ return json.dumps(aggregators)
+
+ def delete_configuration_aggregator(self):
+ self.config_backend.delete_configuration_aggregator(
+ self._get_param("ConfigurationAggregatorName")
+ )
+ return ""
+
+ def put_aggregation_authorization(self):
+ agg_auth = self.config_backend.put_aggregation_authorization(
+ self._get_param("AuthorizedAccountId"),
+ self._get_param("AuthorizedAwsRegion"),
+ self._get_param("Tags"),
+ )
+ schema = {"AggregationAuthorization": agg_auth}
+ return json.dumps(schema)
+
+ def describe_aggregation_authorizations(self):
+ authorizations = self.config_backend.describe_aggregation_authorizations(
+ self._get_param("NextToken"), self._get_param("Limit")
+ )
+
+ return json.dumps(authorizations)
+
+ def delete_aggregation_authorization(self):
+ self.config_backend.delete_aggregation_authorization(
+ self._get_param("AuthorizedAccountId"),
+ self._get_param("AuthorizedAwsRegion"),
+ )
+
+ return ""
+
+ def describe_configuration_recorders(self):
+ recorders = self.config_backend.describe_configuration_recorders(
+ self._get_param("ConfigurationRecorderNames")
+ )
+ schema = {"ConfigurationRecorders": recorders}
+ return json.dumps(schema)
+
+ def describe_configuration_recorder_status(self):
+ recorder_statuses = self.config_backend.describe_configuration_recorder_status(
+ self._get_param("ConfigurationRecorderNames")
+ )
+ schema = {"ConfigurationRecordersStatus": recorder_statuses}
+ return json.dumps(schema)
+
+ def put_delivery_channel(self):
+ self.config_backend.put_delivery_channel(self._get_param("DeliveryChannel"))
+ return ""
+
+ def describe_delivery_channels(self):
+ delivery_channels = self.config_backend.describe_delivery_channels(
+ self._get_param("DeliveryChannelNames")
+ )
+ schema = {"DeliveryChannels": delivery_channels}
+ return json.dumps(schema)
+
+ def describe_delivery_channel_status(self):
+ raise NotImplementedError()
+
+ def delete_delivery_channel(self):
+ self.config_backend.delete_delivery_channel(
+ self._get_param("DeliveryChannelName")
+ )
+ return ""
+
+ def delete_configuration_recorder(self):
+ self.config_backend.delete_configuration_recorder(
+ self._get_param("ConfigurationRecorderName")
+ )
+ return ""
+
+ def start_configuration_recorder(self):
+ self.config_backend.start_configuration_recorder(
+ self._get_param("ConfigurationRecorderName")
+ )
+ return ""
+
+ def stop_configuration_recorder(self):
+ self.config_backend.stop_configuration_recorder(
+ self._get_param("ConfigurationRecorderName")
+ )
+ return ""
+
+ def list_discovered_resources(self):
+ schema = self.config_backend.list_discovered_resources(
+ self._get_param("resourceType"),
+ self.region,
+ self._get_param("resourceIds"),
+ self._get_param("resourceName"),
+ self._get_param("limit"),
+ self._get_param("nextToken"),
+ )
+ return json.dumps(schema)
+
+ def list_aggregate_discovered_resources(self):
+ schema = self.config_backend.list_aggregate_discovered_resources(
+ self._get_param("ConfigurationAggregatorName"),
+ self._get_param("ResourceType"),
+ self._get_param("Filters"),
+ self._get_param("Limit"),
+ self._get_param("NextToken"),
+ )
+ return json.dumps(schema)
+
+ def list_tags_for_resource(self):
+ schema = self.config_backend.list_tags_for_resource(
+ self._get_param("ResourceArn"),
+ self._get_param("Limit"),
+ self._get_param("NextToken"),
+ )
+ return json.dumps(schema)
+
+ def get_resource_config_history(self):
+ schema = self.config_backend.get_resource_config_history(
+ self._get_param("resourceType"), self._get_param("resourceId"), self.region
+ )
+ return json.dumps(schema)
+
+ def batch_get_resource_config(self):
+ schema = self.config_backend.batch_get_resource_config(
+ self._get_param("resourceKeys"), self.region
+ )
+ return json.dumps(schema)
+
+ def batch_get_aggregate_resource_config(self):
+ schema = self.config_backend.batch_get_aggregate_resource_config(
+ self._get_param("ConfigurationAggregatorName"),
+ self._get_param("ResourceIdentifiers"),
+ )
+ return json.dumps(schema)
+
+ def put_evaluations(self):
+ evaluations = self.config_backend.put_evaluations(
+ self._get_param("Evaluations"),
+ self._get_param("ResultToken"),
+ self._get_param("TestMode"),
+ )
+ return json.dumps(evaluations)
+
+ def put_organization_conformance_pack(self):
+ conformance_pack = self.config_backend.put_organization_conformance_pack(
+ name=self._get_param("OrganizationConformancePackName"),
+ template_s3_uri=self._get_param("TemplateS3Uri"),
+ template_body=self._get_param("TemplateBody"),
+ delivery_s3_bucket=self._get_param("DeliveryS3Bucket"),
+ delivery_s3_key_prefix=self._get_param("DeliveryS3KeyPrefix"),
+ input_parameters=self._get_param("ConformancePackInputParameters"),
+ excluded_accounts=self._get_param("ExcludedAccounts"),
+ )
+
+ return json.dumps(conformance_pack)
+
+ def describe_organization_conformance_packs(self):
+ conformance_packs = self.config_backend.describe_organization_conformance_packs(
+ self._get_param("OrganizationConformancePackNames")
+ )
+ return json.dumps(conformance_packs)
+
+ def describe_organization_conformance_pack_statuses(self):
+ statuses = self.config_backend.describe_organization_conformance_pack_statuses(
+ self._get_param("OrganizationConformancePackNames")
+ )
+ return json.dumps(statuses)
+
+ def get_organization_conformance_pack_detailed_status(self):
+ # 'Filters' parameter is not implemented yet
+ statuses = (
+ self.config_backend.get_organization_conformance_pack_detailed_status(
+ self._get_param("OrganizationConformancePackName")
+ )
+ )
+ return json.dumps(statuses)
+
+ def delete_organization_conformance_pack(self):
+ self.config_backend.delete_organization_conformance_pack(
+ self._get_param("OrganizationConformancePackName")
+ )
+ return ""
+
+ def tag_resource(self):
+ self.config_backend.tag_resource(
+ self._get_param("ResourceArn"), self._get_param("Tags")
+ )
+ return ""
+
+ def untag_resource(self):
+ self.config_backend.untag_resource(
+ self._get_param("ResourceArn"), self._get_param("TagKeys")
+ )
+ return ""
+
+ def put_config_rule(self):
+ self.config_backend.put_config_rule(
+ self._get_param("ConfigRule"), self._get_param("Tags")
+ )
+ return ""
+
+ def describe_config_rules(self):
+ rules = self.config_backend.describe_config_rules(
+ self._get_param("ConfigRuleNames"), self._get_param("NextToken")
+ )
+ return json.dumps(rules)
+
+ def delete_config_rule(self):
+ self.config_backend.delete_config_rule(self._get_param("ConfigRuleName"))
+ return ""
diff --git a/contrib/python/moto/py3/moto/config/urls.py b/contrib/python/moto/py3/moto/config/urls.py
new file mode 100644
index 0000000000..ed6c8b99b8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/config/urls.py
@@ -0,0 +1,5 @@
+from .responses import ConfigResponse
+
+url_bases = [r"https?://config\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": ConfigResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/core/__init__.py b/contrib/python/moto/py3/moto/core/__init__.py
new file mode 100644
index 0000000000..0a1dd5d296
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/__init__.py
@@ -0,0 +1,10 @@
+from .models import get_account_id, ACCOUNT_ID # noqa
+from .base_backend import BaseBackend # noqa
+from .common_models import BaseModel # noqa
+from .common_models import CloudFormationModel, CloudWatchMetricProvider # noqa
+from .models import patch_client, patch_resource # noqa
+from .responses import ActionAuthenticatorMixin
+
+set_initial_no_auth_action_count = (
+ ActionAuthenticatorMixin.set_initial_no_auth_action_count
+)
diff --git a/contrib/python/moto/py3/moto/core/base_backend.py b/contrib/python/moto/py3/moto/core/base_backend.py
new file mode 100644
index 0000000000..a6d3d97cbf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/base_backend.py
@@ -0,0 +1,166 @@
+import random
+import re
+import string
+from collections import defaultdict
+from .utils import convert_regex_to_flask_path
+
+
+model_data = defaultdict(dict)
+
+
+class InstanceTrackerMeta(type):
+ def __new__(meta, name, bases, dct):
+ cls = super(InstanceTrackerMeta, meta).__new__(meta, name, bases, dct)
+ if name == "BaseModel":
+ return cls
+
+ service = cls.__module__.split(".")[1]
+ if name not in model_data[service]:
+ model_data[service][name] = cls
+ cls.instances = []
+ return cls
+
+
+class BaseBackend:
+ def __init__(self, region_name, account_id=None):
+ self.region_name = region_name
+ self.account_id = account_id
+
+ def _reset_model_refs(self):
+ # Remove all references to the models stored
+ for models in model_data.values():
+ for model in models.values():
+ model.instances = []
+
+ def reset(self):
+ region_name = self.region_name
+ account_id = self.account_id
+ self._reset_model_refs()
+ self.__dict__ = {}
+ self.__init__(region_name, account_id)
+
+ @property
+ def _url_module(self):
+ backend_module = self.__class__.__module__
+ backend_urls_module_name = backend_module.replace("models", "urls")
+ backend_urls_module = __import__(
+ backend_urls_module_name, fromlist=["url_bases", "url_paths"]
+ )
+ return backend_urls_module
+
+ @property
+ def urls(self):
+ """
+ A dictionary of the urls to be mocked with this service and the handlers
+ that should be called in their place
+ """
+ url_bases = self.url_bases
+ unformatted_paths = self._url_module.url_paths
+
+ urls = {}
+ for url_base in url_bases:
+ # The default URL_base will look like: http://service.[..].amazonaws.com/...
+ # This extension ensures support for the China regions
+ cn_url_base = re.sub(r"amazonaws\\?.com$", "amazonaws.com.cn", url_base)
+ for url_path, handler in unformatted_paths.items():
+ url = url_path.format(url_base)
+ urls[url] = handler
+ cn_url = url_path.format(cn_url_base)
+ urls[cn_url] = handler
+
+ return urls
+
+ @property
+ def url_paths(self):
+ """
+ A dictionary of the paths of the urls to be mocked with this service and
+ the handlers that should be called in their place
+ """
+ unformatted_paths = self._url_module.url_paths
+
+ paths = {}
+ for unformatted_path, handler in unformatted_paths.items():
+ path = unformatted_path.format("")
+ paths[path] = handler
+
+ return paths
+
+ @property
+ def url_bases(self):
+ """
+ A list containing the url_bases extracted from urls.py
+ """
+ return self._url_module.url_bases
+
+ @property
+ def flask_paths(self):
+ """
+ The url paths that will be used for the flask server
+ """
+ paths = {}
+ for url_path, handler in self.url_paths.items():
+ url_path = convert_regex_to_flask_path(url_path)
+ paths[url_path] = handler
+
+ return paths
+
+ @staticmethod
+ def default_vpc_endpoint_service(
+ service_region, zones
+ ): # pylint: disable=unused-argument
+ """Invoke the factory method for any VPC endpoint(s) services."""
+ return None
+
+ @staticmethod
+ def vpce_random_number():
+ """Return random number for a VPC endpoint service ID."""
+ return "".join([random.choice(string.hexdigits.lower()) for i in range(17)])
+
+ @staticmethod
+ def default_vpc_endpoint_service_factory(
+ service_region,
+ zones,
+ service="",
+ service_type="Interface",
+ private_dns_names=True,
+ special_service_name="",
+ policy_supported=True,
+ base_endpoint_dns_names=None,
+ ): # pylint: disable=too-many-arguments
+ """List of dicts representing default VPC endpoints for this service."""
+ if special_service_name:
+ service_name = f"com.amazonaws.{service_region}.{special_service_name}"
+ else:
+ service_name = f"com.amazonaws.{service_region}.{service}"
+
+ if not base_endpoint_dns_names:
+ base_endpoint_dns_names = [f"{service}.{service_region}.vpce.amazonaws.com"]
+
+ endpoint_service = {
+ "AcceptanceRequired": False,
+ "AvailabilityZones": zones,
+ "BaseEndpointDnsNames": base_endpoint_dns_names,
+ "ManagesVpcEndpoints": False,
+ "Owner": "amazon",
+ "ServiceId": f"vpce-svc-{BaseBackend.vpce_random_number()}",
+ "ServiceName": service_name,
+ "ServiceType": [{"ServiceType": service_type}],
+ "Tags": [],
+ "VpcEndpointPolicySupported": policy_supported,
+ }
+
+ # Don't know how private DNS names are different, so for now just
+ # one will be added.
+ if private_dns_names:
+ endpoint_service[
+ "PrivateDnsName"
+ ] = f"{service}.{service_region}.amazonaws.com"
+ endpoint_service["PrivateDnsNameVerificationState"] = "verified"
+ endpoint_service["PrivateDnsNames"] = [
+ {"PrivateDnsName": f"{service}.{service_region}.amazonaws.com"}
+ ]
+ return [endpoint_service]
+
+ # def list_config_service_resources(self, resource_ids, resource_name, limit, next_token):
+ # """For AWS Config. This will list all of the resources of the given type and optional resource name and region"""
+ # raise NotImplementedError()
diff --git a/contrib/python/moto/py3/moto/core/botocore_stubber.py b/contrib/python/moto/py3/moto/core/botocore_stubber.py
new file mode 100644
index 0000000000..faf25b617d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/botocore_stubber.py
@@ -0,0 +1,65 @@
+from collections import defaultdict
+from io import BytesIO
+from botocore.awsrequest import AWSResponse
+from moto.core.exceptions import HTTPException
+
+
+class MockRawResponse(BytesIO):
+ def __init__(self, response_input):
+ if isinstance(response_input, str):
+ response_input = response_input.encode("utf-8")
+ super().__init__(response_input)
+
+ def stream(self, **kwargs): # pylint: disable=unused-argument
+ contents = self.read()
+ while contents:
+ yield contents
+ contents = self.read()
+
+
+class BotocoreStubber:
+ def __init__(self):
+ self.enabled = False
+ self.methods = defaultdict(list)
+
+ def reset(self):
+ self.methods.clear()
+
+ def register_response(self, method, pattern, response):
+ matchers = self.methods[method]
+ matchers.append((pattern, response))
+
+ def __call__(self, event_name, request, **kwargs):
+ if not self.enabled:
+ return None
+ response = None
+ response_callback = None
+ found_index = None
+ matchers = self.methods.get(request.method)
+
+ base_url = request.url.split("?", 1)[0]
+ for i, (pattern, callback) in enumerate(matchers):
+ if pattern.match(base_url):
+ if found_index is None:
+ found_index = i
+ response_callback = callback
+ else:
+ matchers.pop(found_index)
+ break
+
+ if response_callback is not None:
+ for header, value in request.headers.items():
+ if isinstance(value, bytes):
+ request.headers[header] = value.decode("utf-8")
+ try:
+ status, headers, body = response_callback(
+ request, request.url, request.headers
+ )
+ except HTTPException as e:
+ status = e.code
+ headers = e.get_headers()
+ body = e.get_body()
+ body = MockRawResponse(body)
+ response = AWSResponse(request.url, status, headers, body)
+
+ return response
diff --git a/contrib/python/moto/py3/moto/core/common_models.py b/contrib/python/moto/py3/moto/core/common_models.py
new file mode 100644
index 0000000000..f8226ca9f6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/common_models.py
@@ -0,0 +1,176 @@
+from abc import abstractmethod
+from .base_backend import InstanceTrackerMeta
+
+
+class BaseModel(metaclass=InstanceTrackerMeta):
+ def __new__(cls, *args, **kwargs): # pylint: disable=unused-argument
+ instance = super(BaseModel, cls).__new__(cls)
+ cls.instances.append(instance)
+ return instance
+
+
+# Parent class for every Model that can be instantiated by CloudFormation
+# On subclasses, implement all methods as @staticmethod to ensure correct behaviour of the CF parser
+class CloudFormationModel(BaseModel):
+ @staticmethod
+ @abstractmethod
+ def cloudformation_name_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html
+ # This must be implemented as a staticmethod with no parameters
+ # Return None for resources that do not have a name property
+ pass
+
+ @staticmethod
+ @abstractmethod
+ def cloudformation_type():
+ # This must be implemented as a staticmethod with no parameters
+ # See for example https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html
+ return "AWS::SERVICE::RESOURCE"
+
+ @classmethod
+ @abstractmethod
+ def has_cfn_attr(cls, attr):
+ # Used for validation
+ # If a template creates an Output for an attribute that does not exist, an error should be thrown
+ return True
+
+ @classmethod
+ @abstractmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ # This must be implemented as a classmethod with parameters:
+ # cls, resource_name, cloudformation_json, region_name
+ # Extract the resource parameters from the cloudformation json
+ # and return an instance of the resource class
+ pass
+
+ @classmethod
+ @abstractmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # This must be implemented as a classmethod with parameters:
+ # cls, original_resource, new_resource_name, cloudformation_json, region_name
+ # Extract the resource parameters from the cloudformation json,
+ # delete the old resource and return the new one. Optionally inspect
+ # the change in parameters and no-op when nothing has changed.
+ pass
+
+ @classmethod
+ @abstractmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # This must be implemented as a classmethod with parameters:
+ # cls, resource_name, cloudformation_json, region_name
+ # Extract the resource parameters from the cloudformation json
+ # and delete the resource. Do not include a return statement.
+ pass
+
+ @abstractmethod
+ def is_created(self):
+ # Verify whether the resource was created successfully
+ # Assume True after initialization
+ # Custom resources may need time after init before they are created successfully
+ return True
+
+
+class ConfigQueryModel:
+ def __init__(self, backends):
+ """Inits based on the resource type's backends (1 for each region if applicable)"""
+ self.backends = backends
+
+ def list_config_service_resources(
+ self,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=None,
+ resource_region=None,
+ aggregator=None,
+ ):
+ """For AWS Config. This will list all of the resources of the given type and optional resource name and region.
+
+ This supports both aggregated and non-aggregated listing. The following notes the difference:
+
+ - Non-Aggregated Listing -
+ This only lists resources within a region. The way that this is implemented in moto is based on the region
+ for the resource backend.
+
+ You must set the `backend_region` to the region that the API request arrived from. resource_region can be set to `None`.
+
+ - Aggregated Listing -
+ This lists resources from all potential regional backends. For non-global resource types, this should collect a full
+ list of resources from all the backends, and then be able to filter from the resource region. This is because an
+ aggregator can aggregate resources from multiple regions. In moto, aggregated regions will *assume full aggregation
+ from all resources in all regions for a given resource type*.
+
+ The `backend_region` should be set to `None` for these queries, and the `resource_region` should optionally be set to
+ the `Filters` region parameter to filter out resources that reside in a specific region.
+
+ For aggregated listings, pagination logic should be set such that the next page can properly span all the region backends.
+ As such, the proper way to implement is to first obtain a full list of results from all the region backends, and then filter
+ from there. It may be valuable to make this a concatenation of the region and resource name.
+
+ :param resource_ids: A list of resource IDs
+ :param resource_name: The individual name of a resource
+ :param limit: How many per page
+ :param next_token: The item that will page on
+ :param backend_region: The region for the backend to pull results from. Set to `None` if this is an aggregated query.
+ :param resource_region: The region for where the resources reside to pull results from. Set to `None` if this is a
+ non-aggregated query.
+ :param aggregator: If the query is an aggregated query, *AND* the resource has "non-standard" aggregation logic (mainly, IAM),
+ you'll need to pass aggregator used. In most cases, this should be omitted/set to `None`. See the
+ conditional logic under `if aggregator` in the moto/iam/config.py for the IAM example.
+
+ :return: This should return a list of Dicts that have the following fields:
+ [
+ {
+ 'type': 'AWS::The AWS Config data type',
+ 'name': 'The name of the resource',
+ 'id': 'The ID of the resource',
+ 'region': 'The region of the resource -- if global, then you may want to have the calling logic pass in the
+ aggregator region in for the resource region -- or just us-east-1 :P'
+ }
+ , ...
+ ]
+ """
+ raise NotImplementedError()
+
+ def get_config_resource(
+ self, resource_id, resource_name=None, backend_region=None, resource_region=None
+ ):
+ """For AWS Config. This will query the backend for the specific resource type configuration.
+
+ This supports both aggregated, and non-aggregated fetching -- for batched fetching -- the Config batching requests
+ will call this function N times to fetch the N objects needing to be fetched.
+
+ - Non-Aggregated Fetching -
+ This only fetches a resource config within a region. The way that this is implemented in moto is based on the region
+ for the resource backend.
+
+ You must set the `backend_region` to the region that the API request arrived from. `resource_region` should be set to `None`.
+
+ - Aggregated Fetching -
+ This fetches resources from all potential regional backends. For non-global resource types, this should collect a full
+ list of resources from all the backends, and then be able to filter from the resource region. This is because an
+ aggregator can aggregate resources from multiple regions. In moto, aggregated regions will *assume full aggregation
+ from all resources in all regions for a given resource type*.
+
+ ...
+ :param resource_id:
+ :param resource_name:
+ :param backend_region:
+ :param resource_region:
+ :return:
+ """
+ raise NotImplementedError()
+
+
+class CloudWatchMetricProvider(object):
+ @staticmethod
+ @abstractmethod
+ def get_cloudwatch_metrics():
+ pass
diff --git a/contrib/python/moto/py3/moto/core/custom_responses_mock.py b/contrib/python/moto/py3/moto/core/custom_responses_mock.py
new file mode 100644
index 0000000000..c75ff33e0e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/custom_responses_mock.py
@@ -0,0 +1,189 @@
+import responses
+import types
+from io import BytesIO
+from http.client import responses as http_responses
+from urllib.parse import urlparse
+from werkzeug.wrappers import Request
+
+from moto.utilities.distutils_version import LooseVersion
+
+try:
+ from importlib.metadata import version
+except ImportError:
+ from importlib_metadata import version
+
+
+RESPONSES_VERSION = version("responses")
+
+
+class CallbackResponse(responses.CallbackResponse):
+ """
+ Need to subclass so we can change a couple things
+ """
+
+ def get_response(self, request):
+ """
+ Need to override this so we can pass decode_content=False
+ """
+ if not isinstance(request, Request):
+ url = urlparse(request.url)
+ if request.body is None:
+ body = None
+ elif isinstance(request.body, str):
+ body = BytesIO(request.body.encode("UTF-8"))
+ elif hasattr(request.body, "read"):
+ body = BytesIO(request.body.read())
+ else:
+ body = BytesIO(request.body)
+ req = Request.from_values(
+ path="?".join([url.path, url.query]),
+ input_stream=body,
+ content_length=request.headers.get("Content-Length"),
+ content_type=request.headers.get("Content-Type"),
+ method=request.method,
+ base_url="{scheme}://{netloc}".format(
+ scheme=url.scheme, netloc=url.netloc
+ ),
+ headers=[(k, v) for k, v in request.headers.items()],
+ )
+ request = req
+ headers = self.get_headers()
+
+ result = self.callback(request)
+ if isinstance(result, Exception):
+ raise result
+
+ status, r_headers, body = result
+ body = responses._handle_body(body)
+ headers.update(r_headers)
+
+ return responses.HTTPResponse(
+ status=status,
+ reason=http_responses.get(status),
+ body=body,
+ headers=headers,
+ preload_content=False,
+ # Need to not decode_content to mimic requests
+ decode_content=False,
+ )
+
+ def _url_matches(self, url, other, match_querystring=False):
+ """
+ Need to override this so we can fix querystrings breaking regex matching
+ """
+ if not match_querystring:
+ other = other.split("?", 1)[0]
+
+ if isinstance(url, str):
+ if responses._has_unicode(url):
+ url = responses._clean_unicode(url)
+ if not isinstance(other, str):
+ other = other.encode("ascii").decode("utf8")
+ return self._url_matches_strict(url, other)
+ elif isinstance(url, responses.Pattern) and url.match(other):
+ return True
+ else:
+ return False
+
+
+def not_implemented_callback(request): # pylint: disable=unused-argument
+ status = 400
+ headers = {}
+ response = "The method is not implemented"
+
+ return status, headers, response
+
+
+# Modify behaviour of the matcher to only/always return the first match
+# Default behaviour is to return subsequent matches for subsequent requests, which leads to https://github.com/spulec/moto/issues/2567
+# - First request matches on the appropriate S3 URL
+# - Same request, executed again, will be matched on the subsequent match, which happens to be the catch-all, not-yet-implemented, callback
+# Fix: Always return the first match
+def _find_first_match_legacy(self, request):
+ all_possibles = self._matches + responses._default_mock._matches
+ matches = [match for match in all_possibles if match.matches(request)]
+
+ # Look for implemented callbacks first
+ implemented_matches = [
+ m
+ for m in matches
+ if type(m) is not CallbackResponse or m.callback != not_implemented_callback
+ ]
+ if implemented_matches:
+ return implemented_matches[0]
+ elif matches:
+ # We had matches, but all were of type not_implemented_callback
+ return matches[0]
+ return None
+
+
+# Internal API changed: this method should be used for Responses 0.12.1 < .. < 0.17.0
+def _find_first_match(self, request):
+ matches = []
+ match_failed_reasons = []
+ all_possibles = self._matches + responses._default_mock._matches
+ for match in all_possibles:
+ match_result, reason = match.matches(request)
+ if match_result:
+ matches.append(match)
+ else:
+ match_failed_reasons.append(reason)
+
+ # Look for implemented callbacks first
+ implemented_matches = [
+ m
+ for m in matches
+ if type(m) is not CallbackResponse or m.callback != not_implemented_callback
+ ]
+ if implemented_matches:
+ return implemented_matches[0], []
+ elif matches:
+ # We had matches, but all were of type not_implemented_callback
+ return matches[0], match_failed_reasons
+
+ return None, match_failed_reasons
+
+
+def get_response_mock():
+ """
+ The responses-library is crucial in ensuring that requests to AWS are intercepted, and routed to the right backend.
+ However, as our usecase is different from a 'typical' responses-user, Moto always needs some custom logic to ensure responses behaves in a way that works for us.
+
+ For older versions, that meant changing the internal logic
+ For later versions, > 0.17.0, we can use a custom registry, and extend the logic instead of overriding it
+
+ For all versions, we need to add passthrough to allow non-AWS requests to work
+ """
+ responses_mock = None
+
+ if LooseVersion(RESPONSES_VERSION) < LooseVersion("0.12.1"):
+ responses_mock = responses.RequestsMock(assert_all_requests_are_fired=False)
+ responses_mock._find_match = types.MethodType(
+ _find_first_match_legacy, responses_mock
+ )
+ elif LooseVersion(RESPONSES_VERSION) >= LooseVersion("0.17.0"):
+ from .responses_custom_registry import CustomRegistry
+
+ responses_mock = responses.RequestsMock(
+ assert_all_requests_are_fired=False, registry=CustomRegistry
+ )
+ else:
+ responses_mock = responses.RequestsMock(assert_all_requests_are_fired=False)
+ responses_mock._find_match = types.MethodType(_find_first_match, responses_mock)
+
+ responses_mock.add_passthru("http")
+ return responses_mock
+
+
+def reset_responses_mock(responses_mock):
+ if LooseVersion(RESPONSES_VERSION) < LooseVersion("0.12.1"):
+ responses_mock.reset()
+ elif LooseVersion(RESPONSES_VERSION) >= LooseVersion("0.17.0"):
+ from .responses_custom_registry import CustomRegistry
+
+ responses_mock.reset()
+ # No way to set the registry directly (yet..)
+ responses_mock._set_registry(CustomRegistry)
+ responses_mock.add_passthru("http")
+ else:
+ responses_mock.reset()
diff --git a/contrib/python/moto/py3/moto/core/exceptions.py b/contrib/python/moto/py3/moto/core/exceptions.py
new file mode 100644
index 0000000000..7c4b3db5b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/exceptions.py
@@ -0,0 +1,159 @@
+from werkzeug.exceptions import HTTPException
+from jinja2 import DictLoader, Environment
+import json
+
+# TODO: add "<Type>Sender</Type>" to error responses below?
+
+
+SINGLE_ERROR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>{{error_type}}</Code>
+ <Message>{{message}}</Message>
+ {% block extra %}{% endblock %}
+ <{{request_id_tag}}>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</{{request_id_tag}}>
+</Error>
+"""
+
+WRAPPED_SINGLE_ERROR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ErrorResponse{% if xmlns is defined %} xmlns="{{xmlns}}"{% endif %}>
+ <Error>
+ <Code>{{error_type}}</Code>
+ <Message>{{message}}</Message>
+ {% block extra %}{% endblock %}
+ <{{request_id_tag}}>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</{{request_id_tag}}>
+ </Error>
+</ErrorResponse>"""
+
+ERROR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <ErrorResponse>
+ <Errors>
+ <Error>
+ <Code>{{error_type}}</Code>
+ <Message><![CDATA[{{message}}]]></Message>
+ {% block extra %}{% endblock %}
+ </Error>
+ </Errors>
+ <{{request_id_tag}}>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</{{request_id_tag}}>
+</ErrorResponse>
+"""
+
+
+class RESTError(HTTPException):
+ code = 400
+ # most APIs use <RequestId>, but some APIs (including EC2, S3) use <RequestID>
+ request_id_tag_name = "RequestId"
+
+ templates = {
+ "single_error": SINGLE_ERROR_RESPONSE,
+ "wrapped_single_error": WRAPPED_SINGLE_ERROR_RESPONSE,
+ "error": ERROR_RESPONSE,
+ }
+
+ def __init__(self, error_type, message, template="error", **kwargs):
+ super().__init__()
+ self.error_type = error_type
+ self.message = message
+
+ if template in self.templates.keys():
+ env = Environment(loader=DictLoader(self.templates))
+ self.description = env.get_template(template).render(
+ error_type=error_type,
+ message=message,
+ request_id_tag=self.request_id_tag_name,
+ **kwargs
+ )
+ self.content_type = "application/xml"
+
+ def get_headers(self, *args, **kwargs): # pylint: disable=unused-argument
+ return {
+ "X-Amzn-ErrorType": self.error_type or "UnknownError",
+ "Content-Type": self.content_type,
+ }
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ return self.description
+
+
+class DryRunClientError(RESTError):
+ code = 412
+
+
+class JsonRESTError(RESTError):
+ def __init__(self, error_type, message, template="error_json", **kwargs):
+ super().__init__(error_type, message, template, **kwargs)
+ self.description = json.dumps(
+ {"__type": self.error_type, "message": self.message}
+ )
+ self.content_type = "application/json"
+
+ def get_body(self, *args, **kwargs):
+ return self.description
+
+
+class SignatureDoesNotMatchError(RESTError):
+ code = 403
+
+ def __init__(self):
+ super().__init__(
+ "SignatureDoesNotMatch",
+ "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.",
+ )
+
+
+class InvalidClientTokenIdError(RESTError):
+ code = 403
+
+ def __init__(self):
+ super().__init__(
+ "InvalidClientTokenId",
+ "The security token included in the request is invalid.",
+ )
+
+
+class AccessDeniedError(RESTError):
+ code = 403
+
+ def __init__(self, user_arn, action):
+ super().__init__(
+ "AccessDenied",
+ "User: {user_arn} is not authorized to perform: {operation}".format(
+ user_arn=user_arn, operation=action
+ ),
+ )
+
+
+class AuthFailureError(RESTError):
+ code = 401
+
+ def __init__(self):
+ super().__init__(
+ "AuthFailure",
+ "AWS was not able to validate the provided access credentials",
+ )
+
+
+class AWSError(JsonRESTError):
+ TYPE = None
+ STATUS = 400
+
+ def __init__(self, message, exception_type=None, status=None):
+ super().__init__(exception_type or self.TYPE, message)
+ self.code = status or self.STATUS
+
+
+class InvalidNextTokenException(JsonRESTError):
+ """For AWS Config resource listing. This will be used by many different resource types, and so it is in moto.core."""
+
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidNextTokenException", "The nextToken provided is invalid"
+ )
+
+
+class InvalidToken(AWSError):
+ code = 400
+
+ def __init__(self, message="Invalid token"):
+ super().__init__("Invalid Token: {}".format(message), "InvalidToken")
diff --git a/contrib/python/moto/py3/moto/core/models.py b/contrib/python/moto/py3/moto/core/models.py
new file mode 100644
index 0000000000..8b70ececa0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/models.py
@@ -0,0 +1,405 @@
+import functools
+import inspect
+import itertools
+import os
+import re
+import unittest
+from types import FunctionType
+from unittest.mock import patch
+
+import boto3
+import botocore
+import responses
+from botocore.config import Config
+from botocore.handlers import BUILTIN_HANDLERS
+
+from moto import settings
+from .botocore_stubber import BotocoreStubber
+from .custom_responses_mock import (
+ get_response_mock,
+ CallbackResponse,
+ not_implemented_callback,
+ reset_responses_mock,
+)
+from .utils import convert_flask_to_responses_response
+
+ACCOUNT_ID = os.environ.get("MOTO_ACCOUNT_ID", "123456789012")
+
+
+def _get_default_account_id():
+ return ACCOUNT_ID
+
+
+account_id_resolver = _get_default_account_id
+
+
+def get_account_id():
+ return account_id_resolver()
+
+
+class BaseMockAWS:
+ nested_count = 0
+ mocks_active = False
+
+ def __init__(self, backends):
+ from moto.instance_metadata import instance_metadata_backend
+ from moto.moto_api._internal.models import moto_api_backend
+
+ self.backends = backends
+
+ self.backends_for_urls = {}
+ default_backends = {
+ "instance_metadata": instance_metadata_backend,
+ "moto_api": moto_api_backend,
+ }
+ if "us-east-1" in self.backends:
+ # We only need to know the URL for a single region - they will be the same everywhere
+ self.backends_for_urls["us-east-1"] = self.backends["us-east-1"]
+ elif "global" in self.backends:
+ # If us-east-1 is not available, it's probably a global service
+ self.backends_for_urls["global"] = self.backends["global"]
+ self.backends_for_urls.update(default_backends)
+
+ self.FAKE_KEYS = {
+ "AWS_ACCESS_KEY_ID": "foobar_key",
+ "AWS_SECRET_ACCESS_KEY": "foobar_secret",
+ }
+ self.ORIG_KEYS = {}
+ self.default_session_mock = patch("boto3.DEFAULT_SESSION", None)
+
+ if self.__class__.nested_count == 0:
+ self.reset()
+
+ def __call__(self, func, reset=True):
+ if inspect.isclass(func):
+ return self.decorate_class(func)
+ return self.decorate_callable(func, reset)
+
+ def __enter__(self):
+ self.start()
+ return self
+
+ def __exit__(self, *args):
+ self.stop()
+
+ def start(self, reset=True):
+ if not self.__class__.mocks_active:
+ self.default_session_mock.start()
+ self.mock_env_variables()
+ self.__class__.mocks_active = True
+
+ self.__class__.nested_count += 1
+ if reset:
+ for backend in self.backends.values():
+ backend.reset()
+
+ self.enable_patching(reset)
+
+ def stop(self):
+ self.__class__.nested_count -= 1
+
+ if self.__class__.nested_count < 0:
+ raise RuntimeError("Called stop() before start().")
+
+ if self.__class__.nested_count == 0:
+ if self.__class__.mocks_active:
+ try:
+ self.default_session_mock.stop()
+ except RuntimeError:
+ # We only need to check for this exception in Python 3.6 and 3.7
+ # https://bugs.python.org/issue36366
+ pass
+ self.unmock_env_variables()
+ self.__class__.mocks_active = False
+ self.disable_patching()
+
+ def decorate_callable(self, func, reset):
+ def wrapper(*args, **kwargs):
+ self.start(reset=reset)
+ try:
+ result = func(*args, **kwargs)
+ finally:
+ self.stop()
+ return result
+
+ functools.update_wrapper(wrapper, func)
+ wrapper.__wrapped__ = func
+ return wrapper
+
+ def decorate_class(self, klass):
+ direct_methods = get_direct_methods_of(klass)
+ defined_classes = set(
+ x for x, y in klass.__dict__.items() if inspect.isclass(y)
+ )
+
+ # Get a list of all userdefined superclasses
+ superclasses = [
+ c for c in klass.__mro__ if c not in [unittest.TestCase, object]
+ ]
+ # Get a list of all userdefined methods
+ supermethods = list(
+ itertools.chain(*[get_direct_methods_of(c) for c in superclasses])
+ )
+ # Check whether the user has overridden the setUp-method
+ has_setup_method = (
+ ("setUp" in supermethods and unittest.TestCase in klass.__mro__)
+ or "setup" in supermethods
+ or "setup_method" in supermethods
+ )
+
+ for attr in itertools.chain(direct_methods, defined_classes):
+ if attr.startswith("_"):
+ continue
+
+ attr_value = getattr(klass, attr)
+ if not hasattr(attr_value, "__call__"):
+ continue
+ if not hasattr(attr_value, "__name__"):
+ continue
+
+ # Check if this is a classmethod. If so, skip patching
+ if inspect.ismethod(attr_value) and attr_value.__self__ is klass:
+ continue
+
+ # Check if this is a staticmethod. If so, skip patching
+ for cls in inspect.getmro(klass):
+ if attr_value.__name__ not in cls.__dict__:
+ continue
+ bound_attr_value = cls.__dict__[attr_value.__name__]
+ if not isinstance(bound_attr_value, staticmethod):
+ break
+ else:
+ # It is a staticmethod, skip patching
+ continue
+
+ try:
+ # Special case for UnitTests-class
+ is_test_method = attr.startswith(unittest.TestLoader.testMethodPrefix)
+ should_reset = False
+ if attr in ["setUp", "setup_method"]:
+ should_reset = True
+ elif not has_setup_method and is_test_method:
+ should_reset = True
+ else:
+ # Method is unrelated to the test setup
+ # Method is a test, but was already reset while executing the setUp-method
+ pass
+ setattr(klass, attr, self(attr_value, reset=should_reset))
+ except TypeError:
+ # Sometimes we can't set this for built-in types
+ continue
+ return klass
+
+ def mock_env_variables(self):
+ # "Mock" the AWS credentials as they can't be mocked in Botocore currently
+ # self.env_variables_mocks = mock.patch.dict(os.environ, FAKE_KEYS)
+ # self.env_variables_mocks.start()
+ for k, v in self.FAKE_KEYS.items():
+ self.ORIG_KEYS[k] = os.environ.get(k, None)
+ os.environ[k] = v
+
+ def unmock_env_variables(self):
+ # This doesn't work in Python2 - for some reason, unmocking clears the entire os.environ dict
+ # Obviously bad user experience, and also breaks pytest - as it uses PYTEST_CURRENT_TEST as an env var
+ # self.env_variables_mocks.stop()
+ for k, v in self.ORIG_KEYS.items():
+ if v:
+ os.environ[k] = v
+ else:
+ del os.environ[k]
+
+
+def get_direct_methods_of(klass):
+ return set(
+ x
+ for x, y in klass.__dict__.items()
+ if isinstance(y, (FunctionType, classmethod, staticmethod))
+ )
+
+
+RESPONSES_METHODS = [
+ responses.GET,
+ responses.DELETE,
+ responses.HEAD,
+ responses.OPTIONS,
+ responses.PATCH,
+ responses.POST,
+ responses.PUT,
+]
+
+botocore_mock = responses.RequestsMock(
+ assert_all_requests_are_fired=False,
+ target="botocore.vendored.requests.adapters.HTTPAdapter.send",
+)
+
+responses_mock = get_response_mock()
+
+BOTOCORE_HTTP_METHODS = ["GET", "DELETE", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
+
+
+botocore_stubber = BotocoreStubber()
+BUILTIN_HANDLERS.append(("before-send", botocore_stubber))
+
+
+def patch_client(client):
+ """
+ Explicitly patch a boto3-client
+ """
+ """
+ Adding the botocore_stubber to the BUILTIN_HANDLERS, as above, will mock everything as long as the import ordering is correct
+ - user: start mock_service decorator
+ - system: imports core.model
+ - system: adds the stubber to the BUILTIN_HANDLERS
+ - user: create a boto3 client - which will use the BUILTIN_HANDLERS
+
+ But, if for whatever reason the imports are wrong and the client is created first, it doesn't know about our stub yet
+ This method can be used to tell a client that it needs to be mocked, and append the botocore_stubber after creation
+ :param client:
+ :return:
+ """
+ if isinstance(client, botocore.client.BaseClient):
+ client.meta.events.register("before-send", botocore_stubber)
+ else:
+ raise Exception(f"Argument {client} should be of type boto3.client")
+
+
+def patch_resource(resource):
+ """
+ Explicitly patch a boto3-resource
+ """
+ if hasattr(resource, "meta") and isinstance(
+ resource.meta, boto3.resources.factory.ResourceMeta
+ ):
+ patch_client(resource.meta.client)
+ else:
+ raise Exception(f"Argument {resource} should be of type boto3.resource")
+
+
+class BotocoreEventMockAWS(BaseMockAWS):
+ def reset(self):
+ botocore_stubber.reset()
+ reset_responses_mock(responses_mock)
+
+ def enable_patching(self, reset=True): # pylint: disable=unused-argument
+ botocore_stubber.enabled = True
+ for method in BOTOCORE_HTTP_METHODS:
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ pattern = re.compile(key)
+ botocore_stubber.register_response(method, pattern, value)
+
+ if not hasattr(responses_mock, "_patcher") or not hasattr(
+ responses_mock._patcher, "target"
+ ):
+ responses_mock.start()
+
+ for method in RESPONSES_METHODS:
+ # for backend in default_backends.values():
+ for backend in self.backends_for_urls.values():
+ for key, value in backend.urls.items():
+ responses_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(key),
+ callback=convert_flask_to_responses_response(value),
+ )
+ )
+ responses_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(r"https?://.+\.amazonaws.com/.*"),
+ callback=not_implemented_callback,
+ )
+ )
+ botocore_mock.add(
+ CallbackResponse(
+ method=method,
+ url=re.compile(r"https?://.+\.amazonaws.com/.*"),
+ callback=not_implemented_callback,
+ )
+ )
+
+ def disable_patching(self):
+ botocore_stubber.enabled = False
+ self.reset()
+
+ try:
+ responses_mock.stop()
+ except RuntimeError:
+ pass
+
+
+MockAWS = BotocoreEventMockAWS
+
+
+class ServerModeMockAWS(BaseMockAWS):
+ def __init__(self, *args, **kwargs):
+ self.test_server_mode_endpoint = settings.test_server_mode_endpoint()
+ super().__init__(*args, **kwargs)
+
+ def reset(self):
+ call_reset_api = os.environ.get("MOTO_CALL_RESET_API")
+ if not call_reset_api or call_reset_api.lower() != "false":
+ import requests
+
+ requests.post(f"{self.test_server_mode_endpoint}/moto-api/reset")
+
+ def enable_patching(self, reset=True):
+ if self.__class__.nested_count == 1 and reset:
+ # Just started
+ self.reset()
+
+ from boto3 import client as real_boto3_client, resource as real_boto3_resource
+
+ def fake_boto3_client(*args, **kwargs):
+ region = self._get_region(*args, **kwargs)
+ if region:
+ if "config" in kwargs:
+ kwargs["config"].__dict__["user_agent_extra"] += " region/" + region
+ else:
+ config = Config(user_agent_extra="region/" + region)
+ kwargs["config"] = config
+ if "endpoint_url" not in kwargs:
+ kwargs["endpoint_url"] = self.test_server_mode_endpoint
+ return real_boto3_client(*args, **kwargs)
+
+ def fake_boto3_resource(*args, **kwargs):
+ if "endpoint_url" not in kwargs:
+ kwargs["endpoint_url"] = self.test_server_mode_endpoint
+ return real_boto3_resource(*args, **kwargs)
+
+ self._client_patcher = patch("boto3.client", fake_boto3_client)
+ self._resource_patcher = patch("boto3.resource", fake_boto3_resource)
+ self._client_patcher.start()
+ self._resource_patcher.start()
+
+ def _get_region(self, *args, **kwargs):
+ if "region_name" in kwargs:
+ return kwargs["region_name"]
+ if type(args) == tuple and len(args) == 2:
+ _, region = args
+ return region
+ return None
+
+ def disable_patching(self):
+ if self._client_patcher:
+ self._client_patcher.stop()
+ self._resource_patcher.stop()
+
+
+class base_decorator:
+ mock_backend = MockAWS
+
+ def __init__(self, backends):
+ self.backends = backends
+
+ def __call__(self, func=None):
+ if settings.TEST_SERVER_MODE:
+ mocked_backend = ServerModeMockAWS(self.backends)
+ else:
+ mocked_backend = self.mock_backend(self.backends)
+
+ if func:
+ return mocked_backend(func)
+ else:
+ return mocked_backend
diff --git a/contrib/python/moto/py3/moto/core/responses.py b/contrib/python/moto/py3/moto/core/responses.py
new file mode 100644
index 0000000000..57d3172ebb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/responses.py
@@ -0,0 +1,1054 @@
+import functools
+from collections import defaultdict
+import datetime
+import json
+import logging
+import re
+import requests
+
+import pytz
+
+from moto.core.exceptions import DryRunClientError
+
+from jinja2 import Environment, DictLoader, TemplateNotFound
+
+from urllib.parse import parse_qs, parse_qsl, urlparse
+
+import xmltodict
+from werkzeug.exceptions import HTTPException
+
+import boto3
+from collections import OrderedDict
+from moto.core.utils import camelcase_to_underscores, method_names_from_class
+from moto.utilities.utils import load_resource
+from moto import settings
+
+log = logging.getLogger(__name__)
+
+
+def _decode_dict(d):
+ decoded = OrderedDict()
+ for key, value in d.items():
+ if isinstance(key, bytes):
+ newkey = key.decode("utf-8")
+ elif isinstance(key, (list, tuple)):
+ newkey = []
+ for k in key:
+ if isinstance(k, bytes):
+ newkey.append(k.decode("utf-8"))
+ else:
+ newkey.append(k)
+ else:
+ newkey = key
+
+ if isinstance(value, bytes):
+ newvalue = value.decode("utf-8")
+ elif isinstance(value, (list, tuple)):
+ newvalue = []
+ for v in value:
+ if isinstance(v, bytes):
+ newvalue.append(v.decode("utf-8"))
+ else:
+ newvalue.append(v)
+ else:
+ newvalue = value
+
+ decoded[newkey] = newvalue
+ return decoded
+
+
+class DynamicDictLoader(DictLoader):
+ """
+ Note: There's a bug in jinja2 pre-2.7.3 DictLoader where caching does not work.
+ Including the fixed (current) method version here to ensure performance benefit
+ even for those using older jinja versions.
+ """
+
+ def get_source(self, environment, template):
+ if template in self.mapping:
+ source = self.mapping[template]
+ return source, None, lambda: source == self.mapping.get(template)
+ raise TemplateNotFound(template)
+
+ def update(self, mapping):
+ self.mapping.update(mapping)
+
+ def contains(self, template):
+ return bool(template in self.mapping)
+
+
+class _TemplateEnvironmentMixin(object):
+ LEFT_PATTERN = re.compile(r"[\s\n]+<")
+ RIGHT_PATTERN = re.compile(r">[\s\n]+")
+
+ def __init__(self):
+ super().__init__()
+ self.loader = DynamicDictLoader({})
+ self.environment = Environment(
+ loader=self.loader, autoescape=self.should_autoescape
+ )
+
+ @property
+ def should_autoescape(self):
+ # Allow for subclass to overwrite
+ return False
+
+ def contains_template(self, template_id):
+ return self.loader.contains(template_id)
+
+ def response_template(self, source):
+ template_id = id(source)
+ if not self.contains_template(template_id):
+ collapsed = re.sub(
+ self.RIGHT_PATTERN, ">", re.sub(self.LEFT_PATTERN, "<", source)
+ )
+ self.loader.update({template_id: collapsed})
+ self.environment = Environment(
+ loader=self.loader,
+ autoescape=self.should_autoescape,
+ trim_blocks=True,
+ lstrip_blocks=True,
+ )
+ return self.environment.get_template(template_id)
+
+
+class ActionAuthenticatorMixin(object):
+
+ request_count = 0
+
+ def _authenticate_and_authorize_action(self, iam_request_cls):
+ if (
+ ActionAuthenticatorMixin.request_count
+ >= settings.INITIAL_NO_AUTH_ACTION_COUNT
+ ):
+ iam_request = iam_request_cls(
+ method=self.method, path=self.path, data=self.data, headers=self.headers
+ )
+ iam_request.check_signature()
+ iam_request.check_action_permitted()
+ else:
+ ActionAuthenticatorMixin.request_count += 1
+
+ def _authenticate_and_authorize_normal_action(self):
+ from moto.iam.access_control import IAMRequest
+
+ self._authenticate_and_authorize_action(IAMRequest)
+
+ def _authenticate_and_authorize_s3_action(self):
+ from moto.iam.access_control import S3IAMRequest
+
+ self._authenticate_and_authorize_action(S3IAMRequest)
+
+ @staticmethod
+ def set_initial_no_auth_action_count(initial_no_auth_action_count):
+ _test_server_mode_endpoint = settings.test_server_mode_endpoint()
+
+ def decorator(function):
+ def wrapper(*args, **kwargs):
+ if settings.TEST_SERVER_MODE:
+ response = requests.post(
+ f"{_test_server_mode_endpoint}/moto-api/reset-auth",
+ data=str(initial_no_auth_action_count).encode("utf-8"),
+ )
+ original_initial_no_auth_action_count = response.json()[
+ "PREVIOUS_INITIAL_NO_AUTH_ACTION_COUNT"
+ ]
+ else:
+ original_initial_no_auth_action_count = (
+ settings.INITIAL_NO_AUTH_ACTION_COUNT
+ )
+ original_request_count = ActionAuthenticatorMixin.request_count
+ settings.INITIAL_NO_AUTH_ACTION_COUNT = initial_no_auth_action_count
+ ActionAuthenticatorMixin.request_count = 0
+ try:
+ result = function(*args, **kwargs)
+ finally:
+ if settings.TEST_SERVER_MODE:
+ requests.post(
+ f"{_test_server_mode_endpoint}/moto-api/reset-auth",
+ data=str(original_initial_no_auth_action_count).encode(
+ "utf-8"
+ ),
+ )
+ else:
+ ActionAuthenticatorMixin.request_count = original_request_count
+ settings.INITIAL_NO_AUTH_ACTION_COUNT = (
+ original_initial_no_auth_action_count
+ )
+ return result
+
+ functools.update_wrapper(wrapper, function)
+ wrapper.__wrapped__ = function
+ return wrapper
+
+ return decorator
+
+
+class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
+
+ default_region = "us-east-1"
+ # to extract region, use [^.]
+ region_regex = re.compile(r"\.(?P<region>[a-z]{2}-[a-z]+-\d{1})\.amazonaws\.com")
+ region_from_useragent_regex = re.compile(
+ r"region/(?P<region>[a-z]{2}-[a-z]+-\d{1})"
+ )
+ # Note: technically, we could remove "member" from the regex below... (leaving it for clarity)
+ param_list_regex = re.compile(r"^(\.?[^.]*(\.member|\.[^.]+)?)\.(\d+)\.?")
+ param_regex = re.compile(r"([^\.]*)\.(\w+)(\..+)?")
+ access_key_regex = re.compile(
+ r"AWS.*(?P<access_key>(?<![A-Z0-9])[A-Z0-9]{20}(?![A-Z0-9]))[:/]"
+ )
+ aws_service_spec = None
+
+ @classmethod
+ def dispatch(cls, *args, **kwargs):
+ return cls()._dispatch(*args, **kwargs)
+
+ def setup_class(self, request, full_url, headers):
+ querystring = OrderedDict()
+ if hasattr(request, "body"):
+ # Boto
+ self.body = request.body
+ else:
+ # Flask server
+
+ # FIXME: At least in Flask==0.10.1, request.data is an empty string
+ # and the information we want is in request.form. Keeping self.body
+ # definition for back-compatibility
+ self.body = request.data
+
+ querystring = OrderedDict()
+ for key, value in request.form.items():
+ querystring[key] = [value]
+
+ raw_body = self.body
+ if isinstance(self.body, bytes):
+ self.body = self.body.decode("utf-8")
+
+ if not querystring:
+ querystring.update(
+ parse_qs(urlparse(full_url).query, keep_blank_values=True)
+ )
+ if not querystring:
+ if (
+ "json" in request.headers.get("content-type", [])
+ and self.aws_service_spec
+ ):
+ decoded = json.loads(self.body)
+
+ target = request.headers.get("x-amz-target") or request.headers.get(
+ "X-Amz-Target"
+ )
+ _, method = target.split(".")
+ input_spec = self.aws_service_spec.input_spec(method)
+ flat = flatten_json_request_body("", decoded, input_spec)
+ for key, value in flat.items():
+ querystring[key] = [value]
+ elif self.body:
+ try:
+ querystring.update(
+ OrderedDict(
+ (key, [value])
+ for key, value in parse_qsl(
+ raw_body, keep_blank_values=True
+ )
+ )
+ )
+ except (UnicodeEncodeError, UnicodeDecodeError):
+ pass # ignore encoding errors, as the body may not contain a legitimate querystring
+ if not querystring:
+ querystring.update(headers)
+
+ try:
+ querystring = _decode_dict(querystring)
+ except UnicodeDecodeError:
+ pass # ignore decoding errors, as the body may not contain a legitimate querystring
+
+ self.uri = full_url
+ self.path = urlparse(full_url).path
+ self.querystring = querystring
+ self.data = querystring
+ self.method = request.method
+ self.region = self.get_region_from_url(request, full_url)
+ self.uri_match = None
+
+ self.headers = request.headers
+ if "host" not in self.headers:
+ self.headers["host"] = urlparse(full_url).netloc
+ self.response_headers = {"server": "amazon.com"}
+
+ def get_region_from_url(self, request, full_url):
+ url_match = self.region_regex.search(full_url)
+ user_agent_match = self.region_from_useragent_regex.search(
+ request.headers.get("User-Agent", "")
+ )
+ if url_match:
+ region = url_match.group(1)
+ elif user_agent_match:
+ region = user_agent_match.group(1)
+ elif (
+ "Authorization" in request.headers
+ and "AWS4" in request.headers["Authorization"]
+ ):
+ region = request.headers["Authorization"].split(",")[0].split("/")[2]
+ else:
+ region = self.default_region
+ return region
+
+ def get_current_user(self):
+ """
+ Returns the access key id used in this request as the current user id
+ """
+ if "Authorization" in self.headers:
+ match = self.access_key_regex.search(self.headers["Authorization"])
+ if match:
+ return match.group(1)
+
+ if self.querystring.get("AWSAccessKeyId"):
+ return self.querystring.get("AWSAccessKeyId")
+ else:
+ # Should we raise an unauthorized exception instead?
+ return "111122223333"
+
+ def _dispatch(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self.call_action()
+
+ def uri_to_regexp(self, uri):
+ """converts uri w/ placeholder to regexp
+ '/cars/{carName}/drivers/{DriverName}'
+ -> '^/cars/.*/drivers/[^/]*$'
+
+ '/cars/{carName}/drivers/{DriverName}/drive'
+ -> '^/cars/.*/drivers/.*/drive$'
+
+ """
+
+ def _convert(elem, is_last):
+ if not re.match("^{.*}$", elem):
+ return elem
+ name = (
+ elem.replace("{", "")
+ .replace("}", "")
+ .replace("+", "")
+ .replace("-", "_")
+ )
+ if is_last:
+ return "(?P<%s>[^/]+)" % name
+ return "(?P<%s>.*)" % name
+
+ elems = uri.split("/")
+ num_elems = len(elems)
+ regexp = "^{}$".format(
+ "/".join(
+ [_convert(elem, (i == num_elems - 1)) for i, elem in enumerate(elems)]
+ )
+ )
+ return regexp
+
+ def _get_action_from_method_and_request_uri(self, method, request_uri):
+ """basically used for `rest-json` APIs
+ You can refer to example from link below
+ https://github.com/boto/botocore/blob/develop/botocore/data/iot/2015-05-28/service-2.json
+ """
+
+ # service response class should have 'SERVICE_NAME' class member,
+ # if you want to get action from method and url
+ if not hasattr(self, "SERVICE_NAME"):
+ return None
+ service = self.SERVICE_NAME
+ conn = boto3.client(service, region_name=self.region)
+
+ # make cache if it does not exist yet
+ if not hasattr(self, "method_urls"):
+ self.method_urls = defaultdict(lambda: defaultdict(str))
+ op_names = conn._service_model.operation_names
+ for op_name in op_names:
+ op_model = conn._service_model.operation_model(op_name)
+ _method = op_model.http["method"]
+ uri_regexp = self.uri_to_regexp(op_model.http["requestUri"])
+ self.method_urls[_method][uri_regexp] = op_model.name
+ regexp_and_names = self.method_urls[method]
+ for regexp, name in regexp_and_names.items():
+ match = re.match(regexp, request_uri)
+ self.uri_match = match
+ if match:
+ return name
+ return None
+
+ def _get_action(self):
+ action = self.querystring.get("Action", [""])[0]
+ if not action: # Some services use a header for the action
+ # Headers are case-insensitive. Probably a better way to do this.
+ match = self.headers.get("x-amz-target") or self.headers.get("X-Amz-Target")
+ if match:
+ action = match.split(".")[-1]
+ # get action from method and uri
+ if not action:
+ return self._get_action_from_method_and_request_uri(self.method, self.path)
+ return action
+
+ def call_action(self):
+ headers = self.response_headers
+
+ try:
+ self._authenticate_and_authorize_normal_action()
+ except HTTPException as http_error:
+ response = http_error.description, dict(status=http_error.code)
+ return self._send_response(headers, response)
+
+ action = camelcase_to_underscores(self._get_action())
+ method_names = method_names_from_class(self.__class__)
+ if action in method_names:
+ method = getattr(self, action)
+ try:
+ response = method()
+ except HTTPException as http_error:
+ response_headers = dict(http_error.get_headers() or [])
+ response_headers["status"] = http_error.code
+ response = http_error.description, response_headers
+
+ if isinstance(response, str):
+ return 200, headers, response
+ else:
+ return self._send_response(headers, response)
+
+ if not action:
+ return 404, headers, ""
+
+ raise NotImplementedError(
+ "The {0} action has not been implemented".format(action)
+ )
+
+ @staticmethod
+ def _send_response(headers, response):
+ if response is None:
+ response = "", {}
+ if len(response) == 2:
+ body, new_headers = response
+ else:
+ status, new_headers, body = response
+ status = new_headers.get("status", 200)
+ headers.update(new_headers)
+ # Cast status to string
+ if "status" in headers:
+ headers["status"] = str(headers["status"])
+ return status, headers, body
+
+ def _get_param(self, param_name, if_none=None):
+ val = self.querystring.get(param_name)
+ if val is not None:
+ return val[0]
+
+ # try to get json body parameter
+ if self.body is not None:
+ try:
+ return json.loads(self.body)[param_name]
+ except ValueError:
+ pass
+ except KeyError:
+ pass
+ # try to get path parameter
+ if self.uri_match:
+ try:
+ return self.uri_match.group(param_name)
+ except IndexError:
+ # do nothing if param is not found
+ pass
+ return if_none
+
+ def _get_int_param(self, param_name, if_none=None):
+ val = self._get_param(param_name)
+ if val is not None:
+ return int(val)
+ return if_none
+
+ def _get_bool_param(self, param_name, if_none=None):
+ val = self._get_param(param_name)
+ if val is not None:
+ val = str(val)
+ if val.lower() == "true":
+ return True
+ elif val.lower() == "false":
+ return False
+ return if_none
+
+ def _get_multi_param_dict(self, param_prefix):
+ return self._get_multi_param_helper(param_prefix, skip_result_conversion=True)
+
+ def _get_multi_param_helper(
+ self, param_prefix, skip_result_conversion=False, tracked_prefixes=None
+ ):
+ value_dict = dict()
+ tracked_prefixes = (
+ tracked_prefixes or set()
+ ) # prefixes which have already been processed
+
+ for name, value in self.querystring.items():
+ if not name.startswith(param_prefix):
+ continue
+
+ if len(name) > len(param_prefix) and not name[
+ len(param_prefix) :
+ ].startswith("."):
+ continue
+
+ match = (
+ self.param_list_regex.search(name[len(param_prefix) :])
+ if len(name) > len(param_prefix)
+ else None
+ )
+ if match:
+ prefix = param_prefix + match.group(1)
+ value = self._get_multi_param(prefix)
+ tracked_prefixes.add(prefix)
+ name = prefix
+ value_dict[name] = value
+ else:
+ match = self.param_regex.search(name[len(param_prefix) :])
+ if match:
+ # enable access to params that are lists of dicts, e.g., "TagSpecification.1.ResourceType=.."
+ sub_attr = "%s%s.%s" % (
+ name[: len(param_prefix)],
+ match.group(1),
+ match.group(2),
+ )
+ if match.group(3):
+ value = self._get_multi_param_helper(
+ sub_attr,
+ tracked_prefixes=tracked_prefixes,
+ skip_result_conversion=skip_result_conversion,
+ )
+ else:
+ value = self._get_param(sub_attr)
+ tracked_prefixes.add(sub_attr)
+ value_dict[name] = value
+ else:
+ value_dict[name] = value[0]
+
+ if not value_dict:
+ return None
+
+ if skip_result_conversion or len(value_dict) > 1:
+ # strip off period prefix
+ value_dict = {
+ name[len(param_prefix) + 1 :]: value
+ for name, value in value_dict.items()
+ }
+ for k in list(value_dict.keys()):
+ parts = k.split(".")
+ if len(parts) != 2 or parts[1] != "member":
+ value_dict[parts[0]] = value_dict.pop(k)
+ else:
+ value_dict = list(value_dict.values())[0]
+
+ return value_dict
+
+ def _get_multi_param(self, param_prefix, skip_result_conversion=False):
+ """
+ Given a querystring of ?LaunchConfigurationNames.member.1=my-test-1&LaunchConfigurationNames.member.2=my-test-2
+ this will return ['my-test-1', 'my-test-2']
+ """
+ if param_prefix.endswith("."):
+ prefix = param_prefix
+ else:
+ prefix = param_prefix + "."
+ values = []
+ index = 1
+ while True:
+ value_dict = self._get_multi_param_helper(
+ prefix + str(index), skip_result_conversion=skip_result_conversion
+ )
+ if not value_dict and value_dict != "":
+ break
+
+ values.append(value_dict)
+ index += 1
+
+ return values
+
+ def _get_dict_param(self, param_prefix):
+ """
+ Given a parameter dict of
+ {
+ 'Instances.SlaveInstanceType': ['m1.small'],
+ 'Instances.InstanceCount': ['1']
+ }
+
+ returns
+ {
+ "slave_instance_type": "m1.small",
+ "instance_count": "1",
+ }
+ """
+ params = {}
+ for key, value in self.querystring.items():
+ if key.startswith(param_prefix):
+ params[camelcase_to_underscores(key.replace(param_prefix, ""))] = value[
+ 0
+ ]
+ return params
+
+ def _get_params(self):
+ """
+ Given a querystring of
+ {
+ 'Action': ['CreatRule'],
+ 'Conditions.member.1.Field': ['http-header'],
+ 'Conditions.member.1.HttpHeaderConfig.HttpHeaderName': ['User-Agent'],
+ 'Conditions.member.1.HttpHeaderConfig.Values.member.1': ['curl'],
+ 'Actions.member.1.FixedResponseConfig.StatusCode': ['200'],
+ 'Actions.member.1.FixedResponseConfig.ContentType': ['text/plain'],
+ 'Actions.member.1.Type': ['fixed-response']
+ }
+
+ returns
+ {
+ 'Action': 'CreatRule',
+ 'Conditions': [
+ {
+ 'Field': 'http-header',
+ 'HttpHeaderConfig': {
+ 'HttpHeaderName': 'User-Agent',
+ 'Values': ['curl']
+ }
+ }
+ ],
+ 'Actions': [
+ {
+ 'Type': 'fixed-response',
+ 'FixedResponseConfig': {
+ 'StatusCode': '200',
+ 'ContentType': 'text/plain'
+ }
+ }
+ ]
+ }
+ """
+ params = {}
+ for k, v in sorted(self.querystring.items()):
+ self._parse_param(k, v[0], params)
+ return params
+
+ def _parse_param(self, key, value, params):
+ keylist = key.split(".")
+ obj = params
+ for i, key in enumerate(keylist[:-1]):
+ if key in obj:
+ # step into
+ parent = obj
+ obj = obj[key]
+ else:
+ if key == "member":
+ if not isinstance(obj, list):
+ # initialize list
+ # reset parent
+ obj = []
+ parent[keylist[i - 1]] = obj
+ elif isinstance(obj, dict):
+ # initialize dict
+ obj[key] = {}
+ # step into
+ parent = obj
+ obj = obj[key]
+ elif key.isdigit():
+ index = int(key) - 1
+ if len(obj) <= index:
+ # initialize list element
+ obj.insert(index, {})
+ # step into
+ parent = obj
+ obj = obj[index]
+ if isinstance(obj, list):
+ obj.append(value)
+ else:
+ obj[keylist[-1]] = value
+
+ def _get_list_prefix(self, param_prefix):
+ """
+ Given a query dict like
+ {
+ 'Steps.member.1.Name': ['example1'],
+ 'Steps.member.1.ActionOnFailure': ['TERMINATE_JOB_FLOW'],
+ 'Steps.member.1.HadoopJarStep.Jar': ['streaming1.jar'],
+ 'Steps.member.2.Name': ['example2'],
+ 'Steps.member.2.ActionOnFailure': ['TERMINATE_JOB_FLOW'],
+ 'Steps.member.2.HadoopJarStep.Jar': ['streaming2.jar'],
+ }
+
+ returns
+ [{
+ 'name': u'example1',
+ 'action_on_failure': u'TERMINATE_JOB_FLOW',
+ 'hadoop_jar_step._jar': u'streaming1.jar',
+ }, {
+ 'name': u'example2',
+ 'action_on_failure': u'TERMINATE_JOB_FLOW',
+ 'hadoop_jar_step._jar': u'streaming2.jar',
+ }]
+ """
+ results = []
+ param_index = 1
+ while True:
+ index_prefix = "{0}.{1}.".format(param_prefix, param_index)
+ new_items = {}
+ for key, value in self.querystring.items():
+ if key.startswith(index_prefix):
+ new_items[
+ camelcase_to_underscores(key.replace(index_prefix, ""))
+ ] = value[0]
+ if not new_items:
+ break
+ results.append(new_items)
+ param_index += 1
+ return results
+
+ def _get_map_prefix(self, param_prefix, key_end=".key", value_end=".value"):
+ results = {}
+ param_index = 1
+ while 1:
+ index_prefix = "{0}.{1}.".format(param_prefix, param_index)
+
+ k, v = None, None
+ for key, value in self.querystring.items():
+ if key.startswith(index_prefix):
+ if key.endswith(key_end):
+ k = value[0]
+ elif key.endswith(value_end):
+ v = value[0]
+
+ if not (k and v is not None):
+ break
+
+ results[k] = v
+ param_index += 1
+
+ return results
+
+ def _get_object_map(self, prefix, name="Name", value="Value"):
+ """
+ Given a query dict like
+ {
+ Prefix.1.Name: [u'event'],
+ Prefix.1.Value.StringValue: [u'order_cancelled'],
+ Prefix.1.Value.DataType: [u'String'],
+ Prefix.2.Name: [u'store'],
+ Prefix.2.Value.StringValue: [u'example_corp'],
+ Prefix.2.Value.DataType [u'String'],
+ }
+
+ returns
+ {
+ 'event': {
+ 'DataType': 'String',
+ 'StringValue': 'example_corp'
+ },
+ 'store': {
+ 'DataType': 'String',
+ 'StringValue': 'order_cancelled'
+ }
+ }
+ """
+ object_map = {}
+ index = 1
+ while True:
+ # Loop through looking for keys representing object name
+ name_key = "{0}.{1}.{2}".format(prefix, index, name)
+ obj_name = self.querystring.get(name_key)
+ if not obj_name:
+ # Found all keys
+ break
+
+ obj = {}
+ value_key_prefix = "{0}.{1}.{2}.".format(prefix, index, value)
+ for k, v in self.querystring.items():
+ if k.startswith(value_key_prefix):
+ _, value_key = k.split(value_key_prefix, 1)
+ obj[value_key] = v[0]
+
+ object_map[obj_name[0]] = obj
+
+ index += 1
+
+ return object_map
+
+ @property
+ def request_json(self):
+ return "JSON" in self.querystring.get("ContentType", [])
+
+ def error_on_dryrun(self):
+ self.is_not_dryrun()
+
+ def is_not_dryrun(self, action=None):
+ action = action or self._get_param("Action")
+ if "true" in self.querystring.get("DryRun", ["false"]):
+ message = (
+ "An error occurred (DryRunOperation) when calling the %s operation: Request would have succeeded, but DryRun flag is set"
+ % action
+ )
+ raise DryRunClientError(error_type="DryRunOperation", message=message)
+ return True
+
+
+class _RecursiveDictRef(object):
+ """Store a recursive reference to dict."""
+
+ def __init__(self):
+ self.key = None
+ self.dic = {}
+
+ def __repr__(self):
+ return "{!r}".format(self.dic)
+
+ def __getattr__(self, key):
+ return self.dic.__getattr__(key)
+
+ def __getitem__(self, key):
+ return self.dic.__getitem__(key)
+
+ def set_reference(self, key, dic):
+ """Set the RecursiveDictRef object to keep reference to dict object
+ (dic) at the key.
+
+ """
+ self.key = key
+ self.dic = dic
+
+
+class AWSServiceSpec(object):
+ """Parse data model from botocore. This is used to recover type info
+ for fields in AWS API XML response.
+
+ """
+
+ def __init__(self, path):
+ spec = load_resource("botocore", path)
+
+ self.metadata = spec["metadata"]
+ self.operations = spec["operations"]
+ self.shapes = spec["shapes"]
+
+ def input_spec(self, operation):
+ try:
+ op = self.operations[operation]
+ except KeyError:
+ raise ValueError("Invalid operation: {}".format(operation))
+ if "input" not in op:
+ return {}
+ shape = self.shapes[op["input"]["shape"]]
+ return self._expand(shape)
+
+ def output_spec(self, operation):
+ """Produce a JSON with a valid API response syntax for operation, but
+ with type information. Each node represented by a key has the
+ value containing field type, e.g.,
+
+ output_spec["SomeBooleanNode"] => {"type": "boolean"}
+
+ """
+ try:
+ op = self.operations[operation]
+ except KeyError:
+ raise ValueError("Invalid operation: {}".format(operation))
+ if "output" not in op:
+ return {}
+ shape = self.shapes[op["output"]["shape"]]
+ return self._expand(shape)
+
+ def _expand(self, shape):
+ def expand(dic, seen=None):
+ seen = seen or {}
+ if dic["type"] == "structure":
+ nodes = {}
+ for k, v in dic["members"].items():
+ seen_till_here = dict(seen)
+ if k in seen_till_here:
+ nodes[k] = seen_till_here[k]
+ continue
+ seen_till_here[k] = _RecursiveDictRef()
+ nodes[k] = expand(self.shapes[v["shape"]], seen_till_here)
+ seen_till_here[k].set_reference(k, nodes[k])
+ nodes["type"] = "structure"
+ return nodes
+
+ elif dic["type"] == "list":
+ seen_till_here = dict(seen)
+ shape = dic["member"]["shape"]
+ if shape in seen_till_here:
+ return seen_till_here[shape]
+ seen_till_here[shape] = _RecursiveDictRef()
+ expanded = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, expanded)
+ return {"type": "list", "member": expanded}
+
+ elif dic["type"] == "map":
+ seen_till_here = dict(seen)
+ node = {"type": "map"}
+
+ if "shape" in dic["key"]:
+ shape = dic["key"]["shape"]
+ seen_till_here[shape] = _RecursiveDictRef()
+ node["key"] = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, node["key"])
+ else:
+ node["key"] = dic["key"]["type"]
+
+ if "shape" in dic["value"]:
+ shape = dic["value"]["shape"]
+ seen_till_here[shape] = _RecursiveDictRef()
+ node["value"] = expand(self.shapes[shape], seen_till_here)
+ seen_till_here[shape].set_reference(shape, node["value"])
+ else:
+ node["value"] = dic["value"]["type"]
+
+ return node
+
+ else:
+ return {"type": dic["type"]}
+
+ return expand(shape)
+
+
+def to_str(value, spec):
+ vtype = spec["type"]
+ if vtype == "boolean":
+ return "true" if value else "false"
+ elif vtype == "integer":
+ return str(value)
+ elif vtype == "float":
+ return str(value)
+ elif vtype == "double":
+ return str(value)
+ elif vtype == "timestamp":
+ return (
+ datetime.datetime.utcfromtimestamp(value)
+ .replace(tzinfo=pytz.utc)
+ .isoformat()
+ )
+ elif vtype == "string":
+ return str(value)
+ elif value is None:
+ return "null"
+ else:
+ raise TypeError("Unknown type {}".format(vtype))
+
+
+def from_str(value, spec):
+ vtype = spec["type"]
+ if vtype == "boolean":
+ return True if value == "true" else False
+ elif vtype == "integer":
+ return int(value)
+ elif vtype == "float":
+ return float(value)
+ elif vtype == "double":
+ return float(value)
+ elif vtype == "timestamp":
+ return value
+ elif vtype == "string":
+ return value
+ raise TypeError("Unknown type {}".format(vtype))
+
+
+def flatten_json_request_body(prefix, dict_body, spec):
+ """Convert a JSON request body into query params."""
+ if len(spec) == 1 and "type" in spec:
+ return {prefix: to_str(dict_body, spec)}
+
+ flat = {}
+ for key, value in dict_body.items():
+ node_type = spec[key]["type"]
+ if node_type == "list":
+ for idx, v in enumerate(value, 1):
+ pref = key + ".member." + str(idx)
+ flat.update(flatten_json_request_body(pref, v, spec[key]["member"]))
+ elif node_type == "map":
+ for idx, (k, v) in enumerate(value.items(), 1):
+ pref = key + ".entry." + str(idx)
+ flat.update(
+ flatten_json_request_body(pref + ".key", k, spec[key]["key"])
+ )
+ flat.update(
+ flatten_json_request_body(pref + ".value", v, spec[key]["value"])
+ )
+ else:
+ flat.update(flatten_json_request_body(key, value, spec[key]))
+
+ if prefix:
+ prefix = prefix + "."
+ return dict((prefix + k, v) for k, v in flat.items())
+
+
+def xml_to_json_response(service_spec, operation, xml, result_node=None):
+ """Convert rendered XML response to JSON for use with boto3."""
+
+ def transform(value, spec):
+ """Apply transformations to make the output JSON comply with the
+ expected form. This function applies:
+
+ (1) Type cast to nodes with "type" property (e.g., 'true' to
+ True). XML field values are all in text so this step is
+ necessary to convert it to valid JSON objects.
+
+ (2) Squashes "member" nodes to lists.
+
+ """
+ if len(spec) == 1:
+ return from_str(value, spec)
+
+ od = OrderedDict()
+ for k, v in value.items():
+ if k.startswith("@"):
+ continue
+
+ if k not in spec:
+ # this can happen when with an older version of
+ # botocore for which the node in XML template is not
+ # defined in service spec.
+ log.warning("Field %s is not defined by the botocore version in use", k)
+ continue
+
+ if spec[k]["type"] == "list":
+ if v is None:
+ od[k] = []
+ elif len(spec[k]["member"]) == 1:
+ if isinstance(v["member"], list):
+ od[k] = transform(v["member"], spec[k]["member"])
+ else:
+ od[k] = [transform(v["member"], spec[k]["member"])]
+ elif isinstance(v["member"], list):
+ od[k] = [transform(o, spec[k]["member"]) for o in v["member"]]
+ elif isinstance(v["member"], (OrderedDict, dict)):
+ od[k] = [transform(v["member"], spec[k]["member"])]
+ else:
+ raise ValueError("Malformatted input")
+ elif spec[k]["type"] == "map":
+ if v is None:
+ od[k] = {}
+ else:
+ items = (
+ [v["entry"]] if not isinstance(v["entry"], list) else v["entry"]
+ )
+ for item in items:
+ key = from_str(item["key"], spec[k]["key"])
+ val = from_str(item["value"], spec[k]["value"])
+ if k not in od:
+ od[k] = {}
+ od[k][key] = val
+ else:
+ if v is None:
+ od[k] = None
+ else:
+ od[k] = transform(v, spec[k])
+ return od
+
+ dic = xmltodict.parse(xml)
+ output_spec = service_spec.output_spec(operation)
+ try:
+ for k in result_node or (operation + "Response", operation + "Result"):
+ dic = dic[k]
+ except KeyError:
+ return None
+ else:
+ return transform(dic, output_spec)
+ return None
diff --git a/contrib/python/moto/py3/moto/core/responses_custom_registry.py b/contrib/python/moto/py3/moto/core/responses_custom_registry.py
new file mode 100644
index 0000000000..2e87dd6aba
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/responses_custom_registry.py
@@ -0,0 +1,40 @@
+# This will only exist in responses >= 0.17
+import responses
+from .custom_responses_mock import CallbackResponse, not_implemented_callback
+
+
+class CustomRegistry(responses.registries.FirstMatchRegistry):
+ """
+ Custom Registry that returns requests in an order that makes sense for Moto:
+ - Implemented callbacks take precedence over non-implemented-callbacks
+ - CallbackResponses are not discarded after first use - users can mock the same URL as often as they like
+ """
+
+ def add(self, response):
+ if response not in self.registered:
+ super().add(response)
+
+ def find(self, request):
+ all_possibles = responses._default_mock._registry.registered + self.registered
+ found = []
+ match_failed_reasons = []
+ for response in all_possibles:
+ match_result, reason = response.matches(request)
+ if match_result:
+ found.append(response)
+ else:
+ match_failed_reasons.append(reason)
+
+ # Look for implemented callbacks first
+ implemented_matches = [
+ m
+ for m in found
+ if type(m) is not CallbackResponse or m.callback != not_implemented_callback
+ ]
+ if implemented_matches:
+ return implemented_matches[0], match_failed_reasons
+ elif found:
+ # We had matches, but all were of type not_implemented_callback
+ return found[0], match_failed_reasons
+ else:
+ return None, match_failed_reasons
diff --git a/contrib/python/moto/py3/moto/core/utils.py b/contrib/python/moto/py3/moto/core/utils.py
new file mode 100644
index 0000000000..c1c3c8ec38
--- /dev/null
+++ b/contrib/python/moto/py3/moto/core/utils.py
@@ -0,0 +1,534 @@
+from functools import wraps
+
+import binascii
+import datetime
+import inspect
+import random
+import re
+import string
+from botocore.exceptions import ClientError
+from boto3 import Session
+from moto.settings import allow_unknown_region
+from threading import RLock
+from urllib.parse import urlparse
+
+
+REQUEST_ID_LONG = string.digits + string.ascii_uppercase
+HEX_CHARS = list(range(10)) + ["a", "b", "c", "d", "e", "f"]
+
+
+def camelcase_to_underscores(argument):
+ """Converts a camelcase param like theNewAttribute to the equivalent
+ python underscore variable like the_new_attribute"""
+ result = ""
+ prev_char_title = True
+ if not argument:
+ return argument
+ for index, char in enumerate(argument):
+ try:
+ next_char_title = argument[index + 1].istitle()
+ except IndexError:
+ next_char_title = True
+
+ upper_to_lower = char.istitle() and not next_char_title
+ lower_to_upper = char.istitle() and not prev_char_title
+
+ if index and (upper_to_lower or lower_to_upper):
+ # Only add underscore if char is capital, not first letter, and next
+ # char is not capital
+ result += "_"
+ prev_char_title = char.istitle()
+ if not char.isspace(): # Only add non-whitespace
+ result += char.lower()
+ return result
+
+
+def underscores_to_camelcase(argument):
+ """Converts a camelcase param like the_new_attribute to the equivalent
+ camelcase version like theNewAttribute. Note that the first letter is
+ NOT capitalized by this function"""
+ result = ""
+ previous_was_underscore = False
+ for char in argument:
+ if char != "_":
+ if previous_was_underscore:
+ result += char.upper()
+ else:
+ result += char
+ previous_was_underscore = char == "_"
+ return result
+
+
+def pascal_to_camelcase(argument):
+ """Converts a PascalCase param to the camelCase equivalent"""
+ return argument[0].lower() + argument[1:]
+
+
+def camelcase_to_pascal(argument):
+ """Converts a camelCase param to the PascalCase equivalent"""
+ return argument[0].upper() + argument[1:]
+
+
+def method_names_from_class(clazz):
+ predicate = inspect.isfunction
+ return [x[0] for x in inspect.getmembers(clazz, predicate=predicate)]
+
+
+def get_random_hex(length=8):
+ return "".join(str(random.choice(HEX_CHARS)) for _ in range(length))
+
+
+def get_random_message_id():
+ return "{0}-{1}-{2}-{3}-{4}".format(
+ get_random_hex(8),
+ get_random_hex(4),
+ get_random_hex(4),
+ get_random_hex(4),
+ get_random_hex(12),
+ )
+
+
+def convert_regex_to_flask_path(url_path):
+ """
+ Converts a regex matching url to one that can be used with flask
+ """
+ for token in ["$"]:
+ url_path = url_path.replace(token, "")
+
+ def caller(reg):
+ match_name, match_pattern = reg.groups()
+ return '<regex("{0}"):{1}>'.format(match_pattern, match_name)
+
+ url_path = re.sub(r"\(\?P<(.*?)>(.*?)\)", caller, url_path)
+
+ if url_path.endswith("/?"):
+ # Flask does own handling of trailing slashes
+ url_path = url_path.rstrip("/?")
+ return url_path
+
+
+class convert_to_flask_response(object):
+ def __init__(self, callback):
+ self.callback = callback
+
+ @property
+ def __name__(self):
+ # For instance methods, use class and method names. Otherwise
+ # use module and method name
+ if inspect.ismethod(self.callback):
+ outer = self.callback.__self__.__class__.__name__
+ else:
+ outer = self.callback.__module__
+ return "{0}.{1}".format(outer, self.callback.__name__)
+
+ def __call__(self, args=None, **kwargs):
+ from flask import request, Response
+
+ try:
+ result = self.callback(request, request.url, dict(request.headers))
+ except ClientError as exc:
+ result = 400, {}, exc.response["Error"]["Message"]
+ # result is a status, headers, response tuple
+ if len(result) == 3:
+ status, headers, content = result
+ else:
+ status, headers, content = 200, {}, result
+
+ response = Response(response=content, status=status, headers=headers)
+ if request.method == "HEAD" and "content-length" in headers:
+ response.headers["Content-Length"] = headers["content-length"]
+ return response
+
+
+class convert_flask_to_responses_response(object):
+ def __init__(self, callback):
+ self.callback = callback
+
+ @property
+ def __name__(self):
+ # For instance methods, use class and method names. Otherwise
+ # use module and method name
+ if inspect.ismethod(self.callback):
+ outer = self.callback.__self__.__class__.__name__
+ else:
+ outer = self.callback.__module__
+ return "{0}.{1}".format(outer, self.callback.__name__)
+
+ def __call__(self, request, *args, **kwargs):
+ for key, val in request.headers.items():
+ if isinstance(val, bytes):
+ request.headers[key] = val.decode("utf-8")
+
+ result = self.callback(request, request.url, request.headers)
+ status, headers, response = result
+ return status, headers, response
+
+
+def iso_8601_datetime_with_milliseconds(datetime):
+ return datetime.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
+
+
+# Even Python does not support nanoseconds, other languages like Go do (needed for Terraform)
+def iso_8601_datetime_with_nanoseconds(datetime):
+ return datetime.strftime("%Y-%m-%dT%H:%M:%S.%f000Z")
+
+
+def iso_8601_datetime_without_milliseconds(datetime):
+ return None if datetime is None else datetime.strftime("%Y-%m-%dT%H:%M:%SZ")
+
+
+def iso_8601_datetime_without_milliseconds_s3(datetime):
+ return None if datetime is None else datetime.strftime("%Y-%m-%dT%H:%M:%S.000Z")
+
+
+RFC1123 = "%a, %d %b %Y %H:%M:%S GMT"
+
+
+def rfc_1123_datetime(datetime):
+ return datetime.strftime(RFC1123)
+
+
+def str_to_rfc_1123_datetime(value):
+ return datetime.datetime.strptime(value, RFC1123)
+
+
+def unix_time(dt=None):
+ dt = dt or datetime.datetime.utcnow()
+ epoch = datetime.datetime.utcfromtimestamp(0)
+ delta = dt - epoch
+ return (delta.days * 86400) + (delta.seconds + (delta.microseconds / 1e6))
+
+
+def unix_time_millis(dt=None):
+ return unix_time(dt) * 1000.0
+
+
+def gen_amz_crc32(response, headerdict=None):
+ if not isinstance(response, bytes):
+ response = response.encode("utf-8")
+
+ crc = binascii.crc32(response)
+
+ if headerdict is not None and isinstance(headerdict, dict):
+ headerdict.update({"x-amz-crc32": str(crc)})
+
+ return crc
+
+
+def gen_amzn_requestid_long(headerdict=None):
+ req_id = "".join([random.choice(REQUEST_ID_LONG) for _ in range(0, 52)])
+
+ if headerdict is not None and isinstance(headerdict, dict):
+ headerdict.update({"x-amzn-requestid": req_id})
+
+ return req_id
+
+
+def amz_crc32(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ response = f(*args, **kwargs)
+
+ headers = {}
+ status = 200
+
+ if isinstance(response, str):
+ body = response
+ else:
+ if len(response) == 2:
+ body, new_headers = response
+ status = new_headers.get("status", 200)
+ else:
+ status, new_headers, body = response
+ headers.update(new_headers)
+ # Cast status to string
+ if "status" in headers:
+ headers["status"] = str(headers["status"])
+
+ try:
+ # Doesnt work on python2 for some odd unicode strings
+ gen_amz_crc32(body, headers)
+ except Exception:
+ pass
+
+ return status, headers, body
+
+ return _wrapper
+
+
+def amzn_request_id(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ response = f(*args, **kwargs)
+
+ headers = {}
+ status = 200
+
+ if isinstance(response, str):
+ body = response
+ else:
+ if len(response) == 2:
+ body, new_headers = response
+ status = new_headers.get("status", 200)
+ else:
+ status, new_headers, body = response
+ headers.update(new_headers)
+
+ request_id = gen_amzn_requestid_long(headers)
+
+ # Update request ID in XML
+ try:
+ body = re.sub(r"(?<=<RequestId>).*(?=<\/RequestId>)", request_id, body)
+ except Exception: # Will just ignore if it cant work on bytes (which are str's on python2)
+ pass
+
+ return status, headers, body
+
+ return _wrapper
+
+
+def path_url(url):
+ parsed_url = urlparse(url)
+ path = parsed_url.path
+ if not path:
+ path = "/"
+ if parsed_url.query:
+ path = path + "?" + parsed_url.query
+ return path
+
+
+def tags_from_query_string(
+ querystring_dict, prefix="Tag", key_suffix="Key", value_suffix="Value"
+):
+ response_values = {}
+ for key in querystring_dict.keys():
+ if key.startswith(prefix) and key.endswith(key_suffix):
+ tag_index = key.replace(prefix + ".", "").replace("." + key_suffix, "")
+ tag_key = querystring_dict.get(
+ "{prefix}.{index}.{key_suffix}".format(
+ prefix=prefix, index=tag_index, key_suffix=key_suffix
+ )
+ )[0]
+ tag_value_key = "{prefix}.{index}.{value_suffix}".format(
+ prefix=prefix, index=tag_index, value_suffix=value_suffix
+ )
+ if tag_value_key in querystring_dict:
+ response_values[tag_key] = querystring_dict.get(tag_value_key)[0]
+ else:
+ response_values[tag_key] = None
+ return response_values
+
+
+def tags_from_cloudformation_tags_list(tags_list):
+ """Return tags in dict form from cloudformation resource tags form (list of dicts)"""
+ tags = {}
+ for entry in tags_list:
+ key = entry["Key"]
+ value = entry["Value"]
+ tags[key] = value
+
+ return tags
+
+
+def remap_nested_keys(root, key_transform):
+ """This remap ("recursive map") function is used to traverse and
+ transform the dictionary keys of arbitrarily nested structures.
+ List comprehensions do not recurse, making it tedious to apply
+ transforms to all keys in a tree-like structure.
+
+ A common issue for `moto` is changing the casing of dict keys:
+
+ >>> remap_nested_keys({'KeyName': 'Value'}, camelcase_to_underscores)
+ {'key_name': 'Value'}
+
+ Args:
+ root: The target data to traverse. Supports iterables like
+ :class:`list`, :class:`tuple`, and :class:`dict`.
+ key_transform (callable): This function is called on every
+ dictionary key found in *root*.
+ """
+ if isinstance(root, (list, tuple)):
+ return [remap_nested_keys(item, key_transform) for item in root]
+ if isinstance(root, dict):
+ return {
+ key_transform(k): remap_nested_keys(v, key_transform)
+ for k, v in root.items()
+ }
+ return root
+
+
+def merge_dicts(dict1, dict2, remove_nulls=False):
+ """Given two arbitrarily nested dictionaries, merge the second dict into the first.
+
+ :param dict dict1: the dictionary to be updated.
+ :param dict dict2: a dictionary of keys/values to be merged into dict1.
+
+ :param bool remove_nulls: If true, updated values equal to None or an empty dictionary
+ will be removed from dict1.
+ """
+ for key in dict2:
+ if isinstance(dict2[key], dict):
+ if key in dict1 and key in dict2:
+ merge_dicts(dict1[key], dict2[key], remove_nulls)
+ else:
+ dict1[key] = dict2[key]
+ if dict1[key] == {} and remove_nulls:
+ dict1.pop(key)
+ else:
+ dict1[key] = dict2[key]
+ if dict1[key] is None and remove_nulls:
+ dict1.pop(key)
+
+
+def aws_api_matches(pattern, string):
+ """
+ AWS API can match a value based on a glob, or an exact match
+ """
+ # use a negative lookback regex to match stars that are not prefixed with a backslash
+ # and replace all stars not prefixed w/ a backslash with '.*' to take this from "glob" to PCRE syntax
+ pattern, _ = re.subn(r"(?<!\\)\*", r".*", pattern)
+
+ # ? in the AWS glob form becomes .? in regex
+ # also, don't substitute it if it is prefixed w/ a backslash
+ pattern, _ = re.subn(r"(?<!\\)\?", r".?", pattern)
+
+ # aws api seems to anchor
+ anchored_pattern = f"^{pattern}$"
+
+ if re.match(anchored_pattern, str(string)):
+ return True
+ else:
+ return False
+
+
+def extract_region_from_aws_authorization(string):
+ auth = string or ""
+ region = re.sub(r".*Credential=[^/]+/[^/]+/([^/]+)/.*", r"\1", auth)
+ if region == auth:
+ return None
+ return region
+
+
+backend_lock = RLock()
+
+
+class BackendDict(dict):
+ """
+ Data Structure to store everything related to a specific service.
+ Format:
+ [account_id: str]: AccountSpecificBackend
+ [account_id: str][region: str] = BaseBackend
+
+ Full multi-account support is not yet available. We will always return account_id 123456789012, regardless of the input.
+
+ To not break existing usage patterns, the following data access pattern is also supported:
+ [region: str] = BaseBackend
+
+ This will automatically resolve to:
+ [default_account_id][region: str] = BaseBackend
+ """
+
+ def __init__(
+ self, backend, service_name, use_boto3_regions=True, additional_regions=None
+ ):
+ self.backend = backend
+ self.service_name = service_name
+ self._use_boto3_regions = use_boto3_regions
+ self._additional_regions = additional_regions
+
+ def __contains__(self, account_id_or_region):
+ """
+ Possible data access patterns:
+ backend_dict[account_id][region_name]
+ backend_dict[region_name]
+ backend_dict[unknown_region]
+
+ The latter two will be phased out in the future, and we can remove this method.
+ """
+ if re.match(r"[0-9]+", account_id_or_region):
+ self._create_account_specific_backend("123456789012")
+ return True
+ else:
+ region = account_id_or_region
+ self._create_account_specific_backend("123456789012")
+ return region in self["123456789012"]
+
+ def get(self, account_id_or_region, if_none=None):
+ if self.__contains__(account_id_or_region):
+ return self.__getitem__(account_id_or_region)
+ return if_none
+
+ def __getitem__(self, account_id_or_region):
+ """
+ Possible data access patterns:
+ backend_dict[account_id][region_name]
+ backend_dict[region_name]
+ backend_dict[unknown_region]
+
+ The latter two will be phased out in the future.
+ """
+ if re.match(r"[0-9]+", account_id_or_region):
+ self._create_account_specific_backend("123456789012")
+ return super().__getitem__("123456789012")
+ else:
+ region_name = account_id_or_region
+ return self["123456789012"][region_name]
+
+ def _create_account_specific_backend(self, account_id):
+ with backend_lock:
+ if account_id not in self.keys():
+ self[account_id] = AccountSpecificBackend(
+ service_name=self.service_name,
+ account_id=account_id,
+ backend=self.backend,
+ use_boto3_regions=self._use_boto3_regions,
+ additional_regions=self._additional_regions,
+ )
+
+
+class AccountSpecificBackend(dict):
+ """
+ Dictionary storing the data for a service in a specific account.
+ Data access pattern:
+ account_specific_backend[region: str] = backend: BaseBackend
+ """
+
+ def __init__(
+ self, service_name, account_id, backend, use_boto3_regions, additional_regions
+ ):
+ self.service_name = service_name
+ self.account_id = account_id
+ self.backend = backend
+ self.regions = []
+ if use_boto3_regions:
+ sess = Session()
+ self.regions.extend(sess.get_available_regions(service_name))
+ self.regions.extend(
+ sess.get_available_regions(service_name, partition_name="aws-us-gov")
+ )
+ self.regions.extend(
+ sess.get_available_regions(service_name, partition_name="aws-cn")
+ )
+ self.regions.extend(additional_regions or [])
+
+ def reset(self):
+ for region_specific_backend in self.values():
+ region_specific_backend.reset()
+
+ def __contains__(self, region):
+ return region in self.regions or region in self.keys()
+
+ def __getitem__(self, region_name):
+ if region_name in self.keys():
+ return super().__getitem__(region_name)
+ # Create the backend for a specific region
+ with backend_lock:
+ if region_name in self.regions and region_name not in self.keys():
+ super().__setitem__(
+ region_name, self.backend(region_name, account_id=self.account_id)
+ )
+ if region_name not in self.regions and allow_unknown_region():
+ super().__setitem__(
+ region_name, self.backend(region_name, account_id=self.account_id)
+ )
+ return super().__getitem__(region_name)
diff --git a/contrib/python/moto/py3/moto/databrew/__init__.py b/contrib/python/moto/py3/moto/databrew/__init__.py
new file mode 100644
index 0000000000..34fff819d5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/databrew/__init__.py
@@ -0,0 +1,4 @@
+from .models import databrew_backends
+from ..core.models import base_decorator
+
+mock_databrew = base_decorator(databrew_backends)
diff --git a/contrib/python/moto/py3/moto/databrew/exceptions.py b/contrib/python/moto/py3/moto/databrew/exceptions.py
new file mode 100644
index 0000000000..187bd2c8f6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/databrew/exceptions.py
@@ -0,0 +1,53 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class DataBrewClientError(JsonRESTError):
+ code = 400
+
+
+class AlreadyExistsException(DataBrewClientError):
+ def __init__(self, typ):
+ super().__init__("AlreadyExistsException", "%s already exists." % (typ))
+
+
+class ConflictException(DataBrewClientError):
+ code = 409
+
+ def __init__(self, message, **kwargs):
+ super().__init__("ConflictException", message, **kwargs)
+
+
+class ValidationException(DataBrewClientError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ValidationException", message, **kwargs)
+
+
+class RulesetAlreadyExistsException(AlreadyExistsException):
+ def __init__(self):
+ super().__init__("Ruleset")
+
+
+class EntityNotFoundException(DataBrewClientError):
+ def __init__(self, msg):
+ super().__init__("EntityNotFoundException", msg)
+
+
+class ResourceNotFoundException(DataBrewClientError):
+ code = 404
+
+ def __init__(self, message, **kwargs):
+ super().__init__("ResourceNotFoundException", message, **kwargs)
+
+
+class RulesetNotFoundException(EntityNotFoundException):
+ def __init__(self, recipe_name):
+ super().__init__("Ruleset %s not found." % recipe_name)
+
+
+class ServiceQuotaExceededException(JsonRESTError):
+ code = 402
+
+ def __init__(self):
+ super().__init__(
+ "ServiceQuotaExceededException", "A service quota is exceeded."
+ )
diff --git a/contrib/python/moto/py3/moto/databrew/models.py b/contrib/python/moto/py3/moto/databrew/models.py
new file mode 100644
index 0000000000..379091923f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/databrew/models.py
@@ -0,0 +1,463 @@
+from collections import OrderedDict
+from copy import deepcopy
+import math
+from datetime import datetime
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.utilities.paginator import paginate
+
+from .exceptions import (
+ AlreadyExistsException,
+ ConflictException,
+ ValidationException,
+ RulesetAlreadyExistsException,
+ RulesetNotFoundException,
+ ResourceNotFoundException,
+)
+
+
+class DataBrewBackend(BaseBackend):
+ PAGINATION_MODEL = {
+ "list_recipes": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ "list_recipe_versions": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ "list_rulesets": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ "list_datasets": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ }
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.recipes = OrderedDict()
+ self.rulesets = OrderedDict()
+ self.datasets = OrderedDict()
+
+ @staticmethod
+ def validate_length(param, param_name, max_length):
+ if len(param) > max_length:
+ raise ValidationException(
+ f"1 validation error detected: Value '{param}' at '{param_name}' failed to "
+ f"satisfy constraint: Member must have length less than or equal to {max_length}"
+ )
+
+ def create_recipe(self, recipe_name, recipe_description, recipe_steps, tags):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_CreateRecipe.html
+ if recipe_name in self.recipes:
+ raise ConflictException(f"The recipe {recipe_name} already exists")
+
+ recipe = FakeRecipe(
+ self.region_name, recipe_name, recipe_description, recipe_steps, tags
+ )
+ self.recipes[recipe_name] = recipe
+ return recipe.latest_working
+
+ def delete_recipe_version(self, recipe_name, recipe_version):
+ if not FakeRecipe.version_is_valid(recipe_version, latest_published=False):
+ raise ValidationException(
+ f"Recipe {recipe_name} version {recipe_version} is invalid."
+ )
+
+ try:
+ recipe = self.recipes[recipe_name]
+ except KeyError:
+ raise ResourceNotFoundException(f"The recipe {recipe_name} wasn't found")
+
+ if (
+ recipe_version != FakeRecipe.LATEST_WORKING
+ and float(recipe_version) not in recipe.versions
+ ):
+ raise ResourceNotFoundException(
+ f"The recipe {recipe_name} version {recipe_version } wasn't found."
+ )
+
+ if recipe_version in (
+ FakeRecipe.LATEST_WORKING,
+ str(recipe.latest_working.version),
+ ):
+ if recipe.latest_published is not None:
+ # Can only delete latest working version when there are no others
+ raise ValidationException(
+ f"Recipe version {recipe_version} is not allowed to be deleted"
+ )
+ else:
+ del self.recipes[recipe_name]
+ else:
+ recipe.delete_published_version(recipe_version)
+
+ def update_recipe(self, recipe_name, recipe_description, recipe_steps):
+ if recipe_name not in self.recipes:
+ raise ResourceNotFoundException(f"The recipe {recipe_name} wasn't found")
+
+ recipe = self.recipes[recipe_name]
+ recipe.update(recipe_description, recipe_steps)
+
+ return recipe.latest_working
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_recipes(self, recipe_version=None):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipes.html
+ if recipe_version == FakeRecipe.LATEST_WORKING:
+ version = "latest_working"
+ elif recipe_version in (None, FakeRecipe.LATEST_PUBLISHED):
+ version = "latest_published"
+ else:
+ raise ValidationException(
+ f"Invalid version {recipe_version}. "
+ "Valid versions are LATEST_PUBLISHED and LATEST_WORKING."
+ )
+ recipes = [getattr(self.recipes[key], version) for key in self.recipes]
+ return [r for r in recipes if r is not None]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_recipe_versions(self, recipe_name):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipeVersions.html
+ self.validate_length(recipe_name, "name", 255)
+
+ recipe = self.recipes.get(recipe_name)
+ if recipe is None:
+ return []
+
+ latest_working = recipe.latest_working
+
+ recipe_versions = [
+ recipe_version
+ for recipe_version in recipe.versions.values()
+ if recipe_version is not latest_working
+ ]
+ return [r for r in recipe_versions if r is not None]
+
+ def get_recipe(self, recipe_name, recipe_version=None):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_DescribeRecipe.html
+ self.validate_length(recipe_name, "name", 255)
+
+ if recipe_version is None:
+ recipe_version = FakeRecipe.LATEST_PUBLISHED
+ else:
+ self.validate_length(recipe_version, "recipeVersion", 16)
+ if not FakeRecipe.version_is_valid(recipe_version):
+ raise ValidationException(
+ f"Recipe {recipe_name} version {recipe_version} isn't valid."
+ )
+
+ recipe = None
+ if recipe_name in self.recipes:
+ if recipe_version == FakeRecipe.LATEST_PUBLISHED:
+ recipe = self.recipes[recipe_name].latest_published
+ elif recipe_version == FakeRecipe.LATEST_WORKING:
+ recipe = self.recipes[recipe_name].latest_working
+ else:
+ recipe = self.recipes[recipe_name].versions.get(float(recipe_version))
+ if recipe is None:
+ raise ResourceNotFoundException(
+ f"The recipe {recipe_name} for version {recipe_version} wasn't found."
+ )
+ return recipe
+
+ def publish_recipe(self, recipe_name, description=None):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_PublishRecipe.html
+ self.validate_length(recipe_name, "name", 255)
+ try:
+ self.recipes[recipe_name].publish(description)
+ except KeyError:
+ raise ResourceNotFoundException(f"Recipe {recipe_name} wasn't found")
+
+ def create_ruleset(
+ self, ruleset_name, ruleset_description, ruleset_rules, ruleset_target_arn, tags
+ ):
+ if ruleset_name in self.rulesets:
+ raise RulesetAlreadyExistsException()
+
+ ruleset = FakeRuleset(
+ self.region_name,
+ ruleset_name,
+ ruleset_description,
+ ruleset_rules,
+ ruleset_target_arn,
+ tags,
+ )
+ self.rulesets[ruleset_name] = ruleset
+ return ruleset
+
+ def update_ruleset(self, ruleset_name, ruleset_description, ruleset_rules, tags):
+ if ruleset_name not in self.rulesets:
+ raise RulesetNotFoundException(ruleset_name)
+
+ ruleset = self.rulesets[ruleset_name]
+ if ruleset_description is not None:
+ ruleset.description = ruleset_description
+ if ruleset_rules is not None:
+ ruleset.rules = ruleset_rules
+ if tags is not None:
+ ruleset.tags = tags
+
+ return ruleset
+
+ def get_ruleset(self, ruleset_name):
+ if ruleset_name not in self.rulesets:
+ raise RulesetNotFoundException(ruleset_name)
+ return self.rulesets[ruleset_name]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_rulesets(self):
+ return list(self.rulesets.values())
+
+ def delete_ruleset(self, ruleset_name):
+ if ruleset_name not in self.rulesets:
+ raise RulesetNotFoundException(ruleset_name)
+
+ del self.rulesets[ruleset_name]
+
+ def create_dataset(
+ self,
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_options,
+ tags,
+ ):
+ if dataset_name in self.datasets:
+ raise AlreadyExistsException(dataset_name)
+
+ dataset = FakeDataset(
+ self.region_name,
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_options,
+ tags,
+ )
+ self.datasets[dataset_name] = dataset
+ return dataset
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_datasets(self):
+ return list(self.datasets.values())
+
+ def update_dataset(
+ self,
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_options,
+ tags,
+ ):
+
+ if dataset_name not in self.datasets:
+ raise ResourceNotFoundException("One or more resources can't be found.")
+
+ dataset = self.datasets[dataset_name]
+
+ if dataset_format is not None:
+ dataset.format = dataset_format
+ if dataset_format_options is not None:
+ dataset.format_options = dataset_format_options
+ if dataset_input is not None:
+ dataset.input = dataset_input
+ if dataset_path_options is not None:
+ dataset.path_options = dataset_path_options
+ if tags is not None:
+ dataset.tags = tags
+
+ return dataset
+
+ def delete_dataset(self, dataset_name):
+ if dataset_name not in self.datasets:
+ raise ResourceNotFoundException("One or more resources can't be found.")
+
+ del self.datasets[dataset_name]
+
+ def describe_dataset(self, dataset_name):
+ if dataset_name not in self.datasets:
+ raise ResourceNotFoundException("One or more resources can't be found.")
+
+ return self.datasets[dataset_name]
+
+
+class FakeRecipe(BaseModel):
+ INITIAL_VERSION = 0.1
+ LATEST_WORKING = "LATEST_WORKING"
+ LATEST_PUBLISHED = "LATEST_PUBLISHED"
+
+ @classmethod
+ def version_is_valid(cls, version, latest_working=True, latest_published=True):
+ validity = True
+
+ if len(version) < 1 or len(version) > 16:
+ validity = False
+ else:
+ try:
+ version = float(version)
+ except ValueError:
+ if not (
+ (version == cls.LATEST_WORKING and latest_working)
+ or (version == cls.LATEST_PUBLISHED and latest_published)
+ ):
+ validity = False
+ return validity
+
+ def __init__(
+ self, region_name, recipe_name, recipe_description, recipe_steps, tags
+ ):
+ self.versions = OrderedDict()
+ self.versions[self.INITIAL_VERSION] = FakeRecipeVersion(
+ region_name,
+ recipe_name,
+ recipe_description,
+ recipe_steps,
+ tags,
+ version=self.INITIAL_VERSION,
+ )
+ self.latest_working = self.versions[self.INITIAL_VERSION]
+ self.latest_published = None
+
+ def publish(self, description=None):
+ self.latest_published = self.latest_working
+ self.latest_working = deepcopy(self.latest_working)
+ self.latest_published.publish(description)
+ del self.versions[self.latest_working.version]
+ self.versions[self.latest_published.version] = self.latest_published
+ self.latest_working.version = self.latest_published.version + 0.1
+ self.versions[self.latest_working.version] = self.latest_working
+
+ def update(self, description, steps):
+ if description is not None:
+ self.latest_working.description = description
+ if steps is not None:
+ self.latest_working.steps = steps
+
+ def delete_published_version(self, version):
+ version = float(version)
+ assert version.is_integer()
+ if version == self.latest_published.version:
+ prev_version = version - 1.0
+ # Iterate back through the published versions until we find one that exists
+ while prev_version >= 1.0:
+ if prev_version in self.versions:
+ self.latest_published = self.versions[prev_version]
+ break
+ prev_version -= 1.0
+ else:
+ # Didn't find an earlier published version
+ self.latest_published = None
+ del self.versions[version]
+
+
+class FakeRecipeVersion(BaseModel):
+ def __init__(
+ self, region_name, recipe_name, recipe_description, recipe_steps, tags, version
+ ):
+ self.region_name = region_name
+ self.name = recipe_name
+ self.description = recipe_description
+ self.steps = recipe_steps
+ self.created_time = datetime.now()
+ self.tags = tags
+ self.published_date = None
+ self.version = version
+
+ def as_dict(self):
+ dict_recipe = {
+ "Name": self.name,
+ "Steps": self.steps,
+ "Description": self.description,
+ "CreateDate": "%.3f" % self.created_time.timestamp(),
+ "Tags": self.tags or dict(),
+ "RecipeVersion": str(self.version),
+ }
+ if self.published_date is not None:
+ dict_recipe["PublishedDate"] = "%.3f" % self.published_date.timestamp()
+
+ return dict_recipe
+
+ def publish(self, description):
+ self.version = float(math.ceil(self.version))
+ self.published_date = datetime.now()
+ if description is not None:
+ self.description = description
+
+
+class FakeRuleset(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ ruleset_name,
+ ruleset_description,
+ ruleset_rules,
+ ruleset_target_arn,
+ tags,
+ ):
+ self.region_name = region_name
+ self.name = ruleset_name
+ self.description = ruleset_description
+ self.rules = ruleset_rules
+ self.target_arn = ruleset_target_arn
+ self.created_time = datetime.now()
+
+ self.tags = tags
+
+ def as_dict(self):
+ return {
+ "Name": self.name,
+ "Rules": self.rules,
+ "Description": self.description,
+ "TargetArn": self.target_arn,
+ "CreateTime": self.created_time.isoformat(),
+ "Tags": self.tags or dict(),
+ }
+
+
+class FakeDataset(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_options,
+ tags,
+ ):
+ self.region_name = region_name
+ self.name = dataset_name
+ self.format = dataset_format
+ self.format_options = dataset_format_options
+ self.input = dataset_input
+ self.path_options = dataset_path_options
+ self.created_time = datetime.now()
+ self.tags = tags
+
+ def as_dict(self):
+ return {
+ "Name": self.name,
+ "Format": self.format,
+ "FormatOptions": self.format_options,
+ "Input": self.input,
+ "PathOptions": self.path_options,
+ "CreateTime": self.created_time.isoformat(),
+ "Tags": self.tags or dict(),
+ }
+
+
+databrew_backends = BackendDict(DataBrewBackend, "databrew")
diff --git a/contrib/python/moto/py3/moto/databrew/responses.py b/contrib/python/moto/py3/moto/databrew/responses.py
new file mode 100644
index 0000000000..422dc74a5c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/databrew/responses.py
@@ -0,0 +1,300 @@
+import json
+from urllib.parse import urlparse
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import databrew_backends
+
+
+class DataBrewResponse(BaseResponse):
+ SERVICE_NAME = "databrew"
+
+ @property
+ def databrew_backend(self):
+ """Return backend instance specific for this region."""
+ return databrew_backends[self.region]
+
+ # region Recipes
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ @amzn_request_id
+ def create_recipe(self):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_CreateRecipe.html
+ recipe_description = self.parameters.get("Description")
+ recipe_steps = self.parameters.get("Steps")
+ recipe_name = self.parameters.get("Name")
+ tags = self.parameters.get("Tags")
+ return json.dumps(
+ self.databrew_backend.create_recipe(
+ recipe_name, recipe_description, recipe_steps, tags
+ ).as_dict()
+ )
+
+ @amzn_request_id
+ def delete_recipe_version(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_DeleteRecipeVersion.html
+ if request.method == "DELETE":
+ parsed_url = urlparse(full_url)
+ split_path = parsed_url.path.strip("/").split("/")
+ recipe_name = split_path[1]
+ recipe_version = split_path[3]
+ self.databrew_backend.delete_recipe_version(recipe_name, recipe_version)
+ return (
+ 200,
+ {},
+ json.dumps({"Name": recipe_name, "RecipeVersion": recipe_version}),
+ )
+
+ @amzn_request_id
+ def list_recipes(self):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipes.html
+ next_token = self._get_param("NextToken", self._get_param("nextToken"))
+ max_results = self._get_int_param(
+ "MaxResults", self._get_int_param("maxResults")
+ )
+ recipe_version = self._get_param(
+ "RecipeVersion", self._get_param("recipeVersion")
+ )
+
+ # pylint: disable=unexpected-keyword-arg, unbalanced-tuple-unpacking
+ recipe_list, next_token = self.databrew_backend.list_recipes(
+ next_token=next_token,
+ max_results=max_results,
+ recipe_version=recipe_version,
+ )
+ return json.dumps(
+ {
+ "Recipes": [recipe.as_dict() for recipe in recipe_list],
+ "NextToken": next_token,
+ }
+ )
+
+ @amzn_request_id
+ def list_recipe_versions(self, request, full_url, headers):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipeVersions.html
+ self.setup_class(request, full_url, headers)
+ recipe_name = self._get_param("Name", self._get_param("name"))
+ next_token = self._get_param("NextToken", self._get_param("nextToken"))
+ max_results = self._get_int_param(
+ "MaxResults", self._get_int_param("maxResults")
+ )
+
+ # pylint: disable=unexpected-keyword-arg, unbalanced-tuple-unpacking
+ recipe_list, next_token = self.databrew_backend.list_recipe_versions(
+ recipe_name=recipe_name, next_token=next_token, max_results=max_results
+ )
+ return json.dumps(
+ {
+ "Recipes": [recipe.as_dict() for recipe in recipe_list],
+ "NextToken": next_token,
+ }
+ )
+
+ @amzn_request_id
+ def publish_recipe(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ parsed_url = urlparse(full_url)
+ recipe_name = parsed_url.path.strip("/").split("/", 2)[1]
+ recipe_description = self.parameters.get("Description")
+ self.databrew_backend.publish_recipe(recipe_name, recipe_description)
+ return 200, {}, json.dumps({"Name": recipe_name})
+
+ def put_recipe_response(self, recipe_name):
+ recipe_description = self.parameters.get("Description")
+ recipe_steps = self.parameters.get("Steps")
+
+ self.databrew_backend.update_recipe(
+ recipe_name, recipe_description, recipe_steps
+ )
+ return 200, {}, json.dumps({"Name": recipe_name})
+
+ def get_recipe_response(self, recipe_name):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_DescribeRecipe.html
+ recipe_version = self._get_param(
+ "RecipeVersion", self._get_param("recipeVersion")
+ )
+ recipe = self.databrew_backend.get_recipe(
+ recipe_name, recipe_version=recipe_version
+ )
+ return 200, {}, json.dumps(recipe.as_dict())
+
+ @amzn_request_id
+ def recipe_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+
+ recipe_name = parsed_url.path.rstrip("/").rsplit("/", 1)[1]
+
+ if request.method == "PUT":
+ return self.put_recipe_response(recipe_name)
+ elif request.method == "GET":
+ return self.get_recipe_response(recipe_name)
+
+ # endregion
+
+ # region Rulesets
+
+ @amzn_request_id
+ def create_ruleset(self):
+ ruleset_description = self.parameters.get("Description")
+ ruleset_rules = self.parameters.get("Rules")
+ ruleset_name = self.parameters.get("Name")
+ ruleset_target_arn = self.parameters.get("TargetArn")
+ tags = self.parameters.get("Tags")
+
+ return json.dumps(
+ self.databrew_backend.create_ruleset(
+ ruleset_name,
+ ruleset_description,
+ ruleset_rules,
+ ruleset_target_arn,
+ tags,
+ ).as_dict()
+ )
+
+ def put_ruleset_response(self, ruleset_name):
+ ruleset_description = self.parameters.get("Description")
+ ruleset_rules = self.parameters.get("Rules")
+ tags = self.parameters.get("Tags")
+
+ ruleset = self.databrew_backend.update_ruleset(
+ ruleset_name, ruleset_description, ruleset_rules, tags
+ )
+ return 200, {}, json.dumps(ruleset.as_dict())
+
+ def get_ruleset_response(self, ruleset_name):
+ ruleset = self.databrew_backend.get_ruleset(ruleset_name)
+ return 201, {}, json.dumps(ruleset.as_dict())
+
+ def delete_ruleset_response(self, ruleset_name):
+ self.databrew_backend.delete_ruleset(ruleset_name)
+ return 204, {}, ""
+
+ @amzn_request_id
+ def ruleset_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+
+ ruleset_name = parsed_url.path.split("/")[-1]
+
+ if request.method == "PUT":
+ response = self.put_ruleset_response(ruleset_name)
+ return response
+ elif request.method == "GET":
+ return self.get_ruleset_response(ruleset_name)
+ elif request.method == "DELETE":
+ return self.delete_ruleset_response(ruleset_name)
+
+ @amzn_request_id
+ def list_rulesets(self):
+ # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRulesets.html
+ next_token = self._get_param("NextToken", self._get_param("nextToken"))
+ max_results = self._get_int_param(
+ "MaxResults", self._get_int_param("maxResults")
+ )
+
+ # pylint: disable=unexpected-keyword-arg, unbalanced-tuple-unpacking
+ ruleset_list, next_token = self.databrew_backend.list_rulesets(
+ next_token=next_token, max_results=max_results
+ )
+ return json.dumps(
+ {
+ "Rulesets": [ruleset.as_dict() for ruleset in ruleset_list],
+ "NextToken": next_token,
+ }
+ )
+
+ # endregion
+
+ # region Datasets
+
+ @amzn_request_id
+ def create_dataset(self):
+ dataset_name = self.parameters.get("Name")
+ dataset_format = self.parameters.get("Format")
+ dataset_format_options = self.parameters.get("FormatOptions")
+ dataset_input = self.parameters.get("Input")
+ dataset_path_otions = self.parameters.get("PathOptions")
+ dataset_tags = self.parameters.get("Tags")
+
+ return json.dumps(
+ self.databrew_backend.create_dataset(
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_otions,
+ dataset_tags,
+ ).as_dict()
+ )
+
+ @amzn_request_id
+ def list_datasets(self):
+ next_token = self._get_param("NextToken", self._get_param("nextToken"))
+ max_results = self._get_int_param(
+ "MaxResults", self._get_int_param("maxResults")
+ )
+
+ # pylint: disable=unexpected-keyword-arg, unbalanced-tuple-unpacking
+ dataset_list, next_token = self.databrew_backend.list_datasets(
+ next_token=next_token, max_results=max_results
+ )
+
+ return json.dumps(
+ {
+ "Datasets": [dataset.as_dict() for dataset in dataset_list],
+ "NextToken": next_token,
+ }
+ )
+
+ @amzn_request_id
+ def update_dataset(self, dataset_name):
+ dataset_format = self.parameters.get("Format")
+ dataset_format_options = self.parameters.get("FormatOptions")
+ dataset_input = self.parameters.get("Input")
+ dataset_path_otions = self.parameters.get("PathOptions")
+ dataset_tags = self.parameters.get("Tags")
+
+ dataset = self.databrew_backend.update_dataset(
+ dataset_name,
+ dataset_format,
+ dataset_format_options,
+ dataset_input,
+ dataset_path_otions,
+ dataset_tags,
+ )
+ return 200, {}, json.dumps(dataset.as_dict())
+
+ @amzn_request_id
+ def delete_dataset(self, dataset_name):
+ self.databrew_backend.delete_dataset(dataset_name)
+ return 200, {}, json.dumps({"Name": dataset_name})
+
+ @amzn_request_id
+ def describe_dataset(self, dataset_name):
+ dataset = self.databrew_backend.describe_dataset(dataset_name)
+ return 200, {}, json.dumps(dataset.as_dict())
+
+ @amzn_request_id
+ def dataset_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+
+ dataset_name = parsed_url.path.split("/")[-1]
+
+ if request.method == "POST":
+ return self.create_dataset()
+ elif request.method == "GET" and dataset_name:
+ return self.describe_dataset(dataset_name)
+ elif request.method == "GET":
+ return self.list_datasets()
+ elif request.method == "DELETE":
+ return self.delete_dataset(dataset_name)
+ elif request.method == "PUT":
+ return self.update_dataset(dataset_name)
+
+ # endregion
diff --git a/contrib/python/moto/py3/moto/databrew/urls.py b/contrib/python/moto/py3/moto/databrew/urls.py
new file mode 100644
index 0000000000..d8508e55c5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/databrew/urls.py
@@ -0,0 +1,15 @@
+from .responses import DataBrewResponse
+
+url_bases = [r"https?://databrew\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/recipeVersions$": DataBrewResponse().list_recipe_versions,
+ "{0}/recipes$": DataBrewResponse.dispatch,
+ "{0}/recipes/(?P<recipe_name>[^/]+)$": DataBrewResponse().recipe_response,
+ "{0}/recipes/(?P<recipe_name>[^/]+)/recipeVersion/(?P<recipe_version>[^/]+)": DataBrewResponse().delete_recipe_version,
+ "{0}/recipes/(?P<recipe_name>[^/]+)/publishRecipe$": DataBrewResponse().publish_recipe,
+ "{0}/rulesets$": DataBrewResponse.dispatch,
+ "{0}/rulesets/(?P<ruleset_name>[^/]+)$": DataBrewResponse().ruleset_response,
+ "{0}/datasets$": DataBrewResponse.dispatch,
+ "{0}/datasets/(?P<dataset_name>[^/]+)$": DataBrewResponse().dataset_response,
+}
diff --git a/contrib/python/moto/py3/moto/datapipeline/__init__.py b/contrib/python/moto/py3/moto/datapipeline/__init__.py
new file mode 100644
index 0000000000..4287cee032
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datapipeline/__init__.py
@@ -0,0 +1,4 @@
+from .models import datapipeline_backends
+from ..core.models import base_decorator
+
+mock_datapipeline = base_decorator(datapipeline_backends)
diff --git a/contrib/python/moto/py3/moto/datapipeline/models.py b/contrib/python/moto/py3/moto/datapipeline/models.py
new file mode 100644
index 0000000000..cd611d2e1b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datapipeline/models.py
@@ -0,0 +1,153 @@
+import datetime
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import BackendDict
+from .utils import get_random_pipeline_id, remove_capitalization_of_dict_keys
+
+
+class PipelineObject(BaseModel):
+ def __init__(self, object_id, name, fields):
+ self.object_id = object_id
+ self.name = name
+ self.fields = fields
+
+ def to_json(self):
+ return {"fields": self.fields, "id": self.object_id, "name": self.name}
+
+
+class Pipeline(CloudFormationModel):
+ def __init__(self, name, unique_id, **kwargs):
+ self.name = name
+ self.unique_id = unique_id
+ self.description = kwargs.get("description", "")
+ self.pipeline_id = get_random_pipeline_id()
+ self.creation_time = datetime.datetime.utcnow()
+ self.objects = []
+ self.status = "PENDING"
+ self.tags = kwargs.get("tags", [])
+
+ @property
+ def physical_resource_id(self):
+ return self.pipeline_id
+
+ def to_meta_json(self):
+ return {"id": self.pipeline_id, "name": self.name}
+
+ def to_json(self):
+ return {
+ "description": self.description,
+ "fields": [
+ {"key": "@pipelineState", "stringValue": self.status},
+ {"key": "description", "stringValue": self.description},
+ {"key": "name", "stringValue": self.name},
+ {
+ "key": "@creationTime",
+ "stringValue": datetime.datetime.strftime(
+ self.creation_time, "%Y-%m-%dT%H-%M-%S"
+ ),
+ },
+ {"key": "@id", "stringValue": self.pipeline_id},
+ {"key": "@sphere", "stringValue": "PIPELINE"},
+ {"key": "@version", "stringValue": "1"},
+ {"key": "@userId", "stringValue": "924374875933"},
+ {"key": "@accountId", "stringValue": "924374875933"},
+ {"key": "uniqueId", "stringValue": self.unique_id},
+ ],
+ "name": self.name,
+ "pipelineId": self.pipeline_id,
+ "tags": self.tags,
+ }
+
+ def set_pipeline_objects(self, pipeline_objects):
+ self.objects = [
+ PipelineObject(
+ pipeline_object["id"],
+ pipeline_object["name"],
+ pipeline_object["fields"],
+ )
+ for pipeline_object in remove_capitalization_of_dict_keys(pipeline_objects)
+ ]
+
+ def activate(self):
+ self.status = "SCHEDULED"
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html
+ return "AWS::DataPipeline::Pipeline"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ datapipeline_backend = datapipeline_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ cloudformation_unique_id = "cf-" + resource_name
+ pipeline = datapipeline_backend.create_pipeline(
+ resource_name, cloudformation_unique_id
+ )
+ datapipeline_backend.put_pipeline_definition(
+ pipeline.pipeline_id, properties["PipelineObjects"]
+ )
+
+ if properties["Activate"]:
+ pipeline.activate()
+ return pipeline
+
+
+class DataPipelineBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.pipelines = OrderedDict()
+
+ def create_pipeline(self, name, unique_id, **kwargs):
+ pipeline = Pipeline(name, unique_id, **kwargs)
+ self.pipelines[pipeline.pipeline_id] = pipeline
+ return pipeline
+
+ def list_pipelines(self):
+ return self.pipelines.values()
+
+ def describe_pipelines(self, pipeline_ids):
+ pipelines = [
+ pipeline
+ for pipeline in self.pipelines.values()
+ if pipeline.pipeline_id in pipeline_ids
+ ]
+ return pipelines
+
+ def get_pipeline(self, pipeline_id):
+ return self.pipelines[pipeline_id]
+
+ def delete_pipeline(self, pipeline_id):
+ self.pipelines.pop(pipeline_id, None)
+
+ def put_pipeline_definition(self, pipeline_id, pipeline_objects):
+ pipeline = self.get_pipeline(pipeline_id)
+ pipeline.set_pipeline_objects(pipeline_objects)
+
+ def get_pipeline_definition(self, pipeline_id):
+ pipeline = self.get_pipeline(pipeline_id)
+ return pipeline.objects
+
+ def describe_objects(self, object_ids, pipeline_id):
+ pipeline = self.get_pipeline(pipeline_id)
+ pipeline_objects = [
+ pipeline_object
+ for pipeline_object in pipeline.objects
+ if pipeline_object.object_id in object_ids
+ ]
+ return pipeline_objects
+
+ def activate_pipeline(self, pipeline_id):
+ pipeline = self.get_pipeline(pipeline_id)
+ pipeline.activate()
+
+
+datapipeline_backends = BackendDict(DataPipelineBackend, "datapipeline")
diff --git a/contrib/python/moto/py3/moto/datapipeline/responses.py b/contrib/python/moto/py3/moto/datapipeline/responses.py
new file mode 100644
index 0000000000..cba52609be
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datapipeline/responses.py
@@ -0,0 +1,108 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import datapipeline_backends
+
+
+class DataPipelineResponse(BaseResponse):
+ @property
+ def parameters(self):
+ # TODO this should really be moved to core/responses.py
+ if self.body:
+ return json.loads(self.body)
+ else:
+ return self.querystring
+
+ @property
+ def datapipeline_backend(self):
+ return datapipeline_backends[self.region]
+
+ def create_pipeline(self):
+ name = self.parameters.get("name")
+ unique_id = self.parameters.get("uniqueId")
+ description = self.parameters.get("description", "")
+ tags = self.parameters.get("tags", [])
+ pipeline = self.datapipeline_backend.create_pipeline(
+ name, unique_id, description=description, tags=tags
+ )
+ return json.dumps({"pipelineId": pipeline.pipeline_id})
+
+ def list_pipelines(self):
+ pipelines = list(self.datapipeline_backend.list_pipelines())
+ pipeline_ids = [pipeline.pipeline_id for pipeline in pipelines]
+ max_pipelines = 50
+ marker = self.parameters.get("marker")
+ if marker:
+ start = pipeline_ids.index(marker) + 1
+ else:
+ start = 0
+ pipelines_resp = pipelines[start : start + max_pipelines]
+ has_more_results = False
+ marker = None
+ if start + max_pipelines < len(pipeline_ids) - 1:
+ has_more_results = True
+ marker = pipelines_resp[-1].pipeline_id
+ return json.dumps(
+ {
+ "hasMoreResults": has_more_results,
+ "marker": marker,
+ "pipelineIdList": [
+ pipeline.to_meta_json() for pipeline in pipelines_resp
+ ],
+ }
+ )
+
+ def describe_pipelines(self):
+ pipeline_ids = self.parameters["pipelineIds"]
+ pipelines = self.datapipeline_backend.describe_pipelines(pipeline_ids)
+
+ return json.dumps(
+ {"pipelineDescriptionList": [pipeline.to_json() for pipeline in pipelines]}
+ )
+
+ def delete_pipeline(self):
+ pipeline_id = self.parameters["pipelineId"]
+ self.datapipeline_backend.delete_pipeline(pipeline_id)
+ return json.dumps({})
+
+ def put_pipeline_definition(self):
+ pipeline_id = self.parameters["pipelineId"]
+ pipeline_objects = self.parameters["pipelineObjects"]
+
+ self.datapipeline_backend.put_pipeline_definition(pipeline_id, pipeline_objects)
+ return json.dumps({"errored": False})
+
+ def get_pipeline_definition(self):
+ pipeline_id = self.parameters["pipelineId"]
+ pipeline_definition = self.datapipeline_backend.get_pipeline_definition(
+ pipeline_id
+ )
+ return json.dumps(
+ {
+ "pipelineObjects": [
+ pipeline_object.to_json() for pipeline_object in pipeline_definition
+ ]
+ }
+ )
+
+ def describe_objects(self):
+ pipeline_id = self.parameters["pipelineId"]
+ object_ids = self.parameters["objectIds"]
+
+ pipeline_objects = self.datapipeline_backend.describe_objects(
+ object_ids, pipeline_id
+ )
+ return json.dumps(
+ {
+ "hasMoreResults": False,
+ "marker": None,
+ "pipelineObjects": [
+ pipeline_object.to_json() for pipeline_object in pipeline_objects
+ ],
+ }
+ )
+
+ def activate_pipeline(self):
+ pipeline_id = self.parameters["pipelineId"]
+ self.datapipeline_backend.activate_pipeline(pipeline_id)
+ return json.dumps({})
diff --git a/contrib/python/moto/py3/moto/datapipeline/urls.py b/contrib/python/moto/py3/moto/datapipeline/urls.py
new file mode 100644
index 0000000000..c777697051
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datapipeline/urls.py
@@ -0,0 +1,5 @@
+from .responses import DataPipelineResponse
+
+url_bases = [r"https?://datapipeline\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": DataPipelineResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/datapipeline/utils.py b/contrib/python/moto/py3/moto/datapipeline/utils.py
new file mode 100644
index 0000000000..cb9c5e46c9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datapipeline/utils.py
@@ -0,0 +1,22 @@
+import collections.abc as collections_abc
+from moto.core.utils import get_random_hex
+
+
+def get_random_pipeline_id():
+ return "df-{0}".format(get_random_hex(length=19))
+
+
+def remove_capitalization_of_dict_keys(obj):
+ if isinstance(obj, collections_abc.Mapping):
+ result = obj.__class__()
+ for key, value in obj.items():
+ normalized_key = key[:1].lower() + key[1:]
+ result[normalized_key] = remove_capitalization_of_dict_keys(value)
+ return result
+ elif isinstance(obj, collections_abc.Iterable) and not isinstance(obj, str):
+ result = obj.__class__()
+ for item in obj:
+ result += (remove_capitalization_of_dict_keys(item),)
+ return result
+ else:
+ return obj
diff --git a/contrib/python/moto/py3/moto/datasync/__init__.py b/contrib/python/moto/py3/moto/datasync/__init__.py
new file mode 100644
index 0000000000..f9b9ff1aaf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datasync/__init__.py
@@ -0,0 +1,5 @@
+from ..core.models import base_decorator
+from .models import datasync_backends
+
+datasync_backend = datasync_backends["us-east-1"]
+mock_datasync = base_decorator(datasync_backends)
diff --git a/contrib/python/moto/py3/moto/datasync/exceptions.py b/contrib/python/moto/py3/moto/datasync/exceptions.py
new file mode 100644
index 0000000000..184be55656
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datasync/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class DataSyncClientError(JsonRESTError):
+ code = 400
+
+
+class InvalidRequestException(DataSyncClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__("InvalidRequestException", msg or "The request is not valid.")
diff --git a/contrib/python/moto/py3/moto/datasync/models.py b/contrib/python/moto/py3/moto/datasync/models.py
new file mode 100644
index 0000000000..32135aa828
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datasync/models.py
@@ -0,0 +1,229 @@
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import InvalidRequestException
+
+
+class Location(BaseModel):
+ def __init__(
+ self, location_uri, region_name=None, typ=None, metadata=None, arn_counter=0
+ ):
+ self.uri = location_uri
+ self.region_name = region_name
+ self.metadata = metadata
+ self.typ = typ
+ # Generate ARN
+ self.arn = "arn:aws:datasync:{0}:111222333444:location/loc-{1}".format(
+ region_name, str(arn_counter).zfill(17)
+ )
+
+
+class Task(BaseModel):
+ def __init__(
+ self,
+ source_location_arn,
+ destination_location_arn,
+ name,
+ region_name,
+ arn_counter=0,
+ metadata=None,
+ ):
+ self.source_location_arn = source_location_arn
+ self.destination_location_arn = destination_location_arn
+ self.name = name
+ self.metadata = metadata
+ # For simplicity Tasks are either available or running
+ self.status = "AVAILABLE"
+ self.current_task_execution_arn = None
+ # Generate ARN
+ self.arn = "arn:aws:datasync:{0}:111222333444:task/task-{1}".format(
+ region_name, str(arn_counter).zfill(17)
+ )
+
+
+class TaskExecution(BaseModel):
+
+ # For simplicity, task_execution can never fail
+ # Some documentation refers to this list:
+ # 'Status': 'QUEUED'|'LAUNCHING'|'PREPARING'|'TRANSFERRING'|'VERIFYING'|'SUCCESS'|'ERROR'
+ # Others refers to this list:
+ # INITIALIZING | PREPARING | TRANSFERRING | VERIFYING | SUCCESS/FAILURE
+ # Checking with AWS Support...
+ TASK_EXECUTION_INTERMEDIATE_STATES = (
+ "INITIALIZING",
+ # 'QUEUED', 'LAUNCHING',
+ "PREPARING",
+ "TRANSFERRING",
+ "VERIFYING",
+ )
+
+ TASK_EXECUTION_FAILURE_STATES = ("ERROR",)
+ TASK_EXECUTION_SUCCESS_STATES = ("SUCCESS",)
+ # Also COMPLETED state?
+
+ def __init__(self, task_arn, arn_counter=0):
+ self.task_arn = task_arn
+ self.arn = "{0}/execution/exec-{1}".format(task_arn, str(arn_counter).zfill(17))
+ self.status = self.TASK_EXECUTION_INTERMEDIATE_STATES[0]
+
+ # Simulate a task execution
+ def iterate_status(self):
+ if self.status in self.TASK_EXECUTION_FAILURE_STATES:
+ return
+ if self.status in self.TASK_EXECUTION_SUCCESS_STATES:
+ return
+ if self.status in self.TASK_EXECUTION_INTERMEDIATE_STATES:
+ for i, status in enumerate(self.TASK_EXECUTION_INTERMEDIATE_STATES):
+ if status == self.status:
+ if i < len(self.TASK_EXECUTION_INTERMEDIATE_STATES) - 1:
+ self.status = self.TASK_EXECUTION_INTERMEDIATE_STATES[i + 1]
+ else:
+ self.status = self.TASK_EXECUTION_SUCCESS_STATES[0]
+ return
+ raise Exception(
+ "TaskExecution.iterate_status: Unknown status={0}".format(self.status)
+ )
+
+ def cancel(self):
+ if self.status not in self.TASK_EXECUTION_INTERMEDIATE_STATES:
+ raise InvalidRequestException(
+ "Sync task cannot be cancelled in its current status: {0}".format(
+ self.status
+ )
+ )
+ self.status = "ERROR"
+
+
+class DataSyncBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ # Always increase when new things are created
+ # This ensures uniqueness
+ self.arn_counter = 0
+ self.locations = OrderedDict()
+ self.tasks = OrderedDict()
+ self.task_executions = OrderedDict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "datasync"
+ )
+
+ def create_location(self, location_uri, typ=None, metadata=None):
+ """
+ # AWS DataSync allows for duplicate LocationUris
+ for arn, location in self.locations.items():
+ if location.uri == location_uri:
+ raise Exception('Location already exists')
+ """
+ if not typ:
+ raise Exception("Location type must be specified")
+ self.arn_counter = self.arn_counter + 1
+ location = Location(
+ location_uri,
+ region_name=self.region_name,
+ arn_counter=self.arn_counter,
+ metadata=metadata,
+ typ=typ,
+ )
+ self.locations[location.arn] = location
+ return location.arn
+
+ def _get_location(self, location_arn, typ):
+ if location_arn not in self.locations:
+ raise InvalidRequestException(
+ "Location {0} is not found.".format(location_arn)
+ )
+ location = self.locations[location_arn]
+ if location.typ != typ:
+ raise InvalidRequestException(
+ "Invalid Location type: {0}".format(location.typ)
+ )
+ return location
+
+ def delete_location(self, location_arn):
+ if location_arn in self.locations:
+ del self.locations[location_arn]
+ else:
+ raise InvalidRequestException
+
+ def create_task(
+ self, source_location_arn, destination_location_arn, name, metadata=None
+ ):
+ if source_location_arn not in self.locations:
+ raise InvalidRequestException(
+ "Location {0} not found.".format(source_location_arn)
+ )
+ if destination_location_arn not in self.locations:
+ raise InvalidRequestException(
+ "Location {0} not found.".format(destination_location_arn)
+ )
+ self.arn_counter = self.arn_counter + 1
+ task = Task(
+ source_location_arn,
+ destination_location_arn,
+ name,
+ region_name=self.region_name,
+ arn_counter=self.arn_counter,
+ metadata=metadata,
+ )
+ self.tasks[task.arn] = task
+ return task.arn
+
+ def _get_task(self, task_arn):
+ if task_arn in self.tasks:
+ return self.tasks[task_arn]
+ else:
+ raise InvalidRequestException
+
+ def update_task(self, task_arn, name, metadata):
+ if task_arn in self.tasks:
+ task = self.tasks[task_arn]
+ task.name = name
+ task.metadata = metadata
+ else:
+ raise InvalidRequestException(
+ "Sync task {0} is not found.".format(task_arn)
+ )
+
+ def delete_task(self, task_arn):
+ if task_arn in self.tasks:
+ del self.tasks[task_arn]
+ else:
+ raise InvalidRequestException
+
+ def start_task_execution(self, task_arn):
+ self.arn_counter = self.arn_counter + 1
+ if task_arn in self.tasks:
+ task = self.tasks[task_arn]
+ if task.status == "AVAILABLE":
+ task_execution = TaskExecution(task_arn, arn_counter=self.arn_counter)
+ self.task_executions[task_execution.arn] = task_execution
+ self.tasks[task_arn].current_task_execution_arn = task_execution.arn
+ self.tasks[task_arn].status = "RUNNING"
+ return task_execution.arn
+ raise InvalidRequestException("Invalid request.")
+
+ def _get_task_execution(self, task_execution_arn):
+ if task_execution_arn in self.task_executions:
+ return self.task_executions[task_execution_arn]
+ else:
+ raise InvalidRequestException
+
+ def cancel_task_execution(self, task_execution_arn):
+ if task_execution_arn in self.task_executions:
+ task_execution = self.task_executions[task_execution_arn]
+ task_execution.cancel()
+ task_arn = task_execution.task_arn
+ self.tasks[task_arn].current_task_execution_arn = None
+ self.tasks[task_arn].status = "AVAILABLE"
+ return
+ raise InvalidRequestException(
+ "Sync task {0} is not found.".format(task_execution_arn)
+ )
+
+
+datasync_backends = BackendDict(DataSyncBackend, "datasync")
diff --git a/contrib/python/moto/py3/moto/datasync/responses.py b/contrib/python/moto/py3/moto/datasync/responses.py
new file mode 100644
index 0000000000..8f04055bbb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datasync/responses.py
@@ -0,0 +1,160 @@
+import json
+
+from moto.core.responses import BaseResponse
+
+from .models import datasync_backends
+
+
+class DataSyncResponse(BaseResponse):
+ @property
+ def datasync_backend(self):
+ return datasync_backends[self.region]
+
+ def list_locations(self):
+ locations = list()
+ for arn, location in self.datasync_backend.locations.items():
+ locations.append({"LocationArn": arn, "LocationUri": location.uri})
+ return json.dumps({"Locations": locations})
+
+ def _get_location(self, location_arn, typ):
+ return self.datasync_backend._get_location(location_arn, typ)
+
+ def create_location_s3(self):
+ # s3://bucket_name/folder/
+ s3_bucket_arn = self._get_param("S3BucketArn")
+ subdirectory = self._get_param("Subdirectory")
+ metadata = {"S3Config": self._get_param("S3Config")}
+ location_uri_elts = ["s3:/", s3_bucket_arn.split(":")[-1]]
+ if subdirectory:
+ location_uri_elts.append(subdirectory)
+ location_uri = "/".join(location_uri_elts)
+ arn = self.datasync_backend.create_location(
+ location_uri, metadata=metadata, typ="S3"
+ )
+ return json.dumps({"LocationArn": arn})
+
+ def describe_location_s3(self):
+ location_arn = self._get_param("LocationArn")
+ location = self._get_location(location_arn, typ="S3")
+ return json.dumps(
+ {
+ "LocationArn": location.arn,
+ "LocationUri": location.uri,
+ "S3Config": location.metadata["S3Config"],
+ }
+ )
+
+ def create_location_smb(self):
+ # smb://smb.share.fqdn/AWS_Test/
+ subdirectory = self._get_param("Subdirectory")
+ server_hostname = self._get_param("ServerHostname")
+ metadata = {
+ "AgentArns": self._get_param("AgentArns"),
+ "User": self._get_param("User"),
+ "Domain": self._get_param("Domain"),
+ "MountOptions": self._get_param("MountOptions"),
+ }
+
+ location_uri = "/".join(["smb:/", server_hostname, subdirectory])
+ arn = self.datasync_backend.create_location(
+ location_uri, metadata=metadata, typ="SMB"
+ )
+ return json.dumps({"LocationArn": arn})
+
+ def describe_location_smb(self):
+ location_arn = self._get_param("LocationArn")
+ location = self._get_location(location_arn, typ="SMB")
+ return json.dumps(
+ {
+ "LocationArn": location.arn,
+ "LocationUri": location.uri,
+ "AgentArns": location.metadata["AgentArns"],
+ "User": location.metadata["User"],
+ "Domain": location.metadata["Domain"],
+ "MountOptions": location.metadata["MountOptions"],
+ }
+ )
+
+ def delete_location(self):
+ location_arn = self._get_param("LocationArn")
+ self.datasync_backend.delete_location(location_arn)
+ return json.dumps({})
+
+ def create_task(self):
+ destination_location_arn = self._get_param("DestinationLocationArn")
+ source_location_arn = self._get_param("SourceLocationArn")
+ name = self._get_param("Name")
+ metadata = {
+ "CloudWatchLogGroupArn": self._get_param("CloudWatchLogGroupArn"),
+ "Options": self._get_param("Options"),
+ "Excludes": self._get_param("Excludes"),
+ "Tags": self._get_param("Tags"),
+ }
+ arn = self.datasync_backend.create_task(
+ source_location_arn, destination_location_arn, name, metadata=metadata
+ )
+ return json.dumps({"TaskArn": arn})
+
+ def update_task(self):
+ task_arn = self._get_param("TaskArn")
+ self.datasync_backend.update_task(
+ task_arn,
+ name=self._get_param("Name"),
+ metadata={
+ "CloudWatchLogGroupArn": self._get_param("CloudWatchLogGroupArn"),
+ "Options": self._get_param("Options"),
+ "Excludes": self._get_param("Excludes"),
+ "Tags": self._get_param("Tags"),
+ },
+ )
+ return json.dumps({})
+
+ def list_tasks(self):
+ tasks = list()
+ for arn, task in self.datasync_backend.tasks.items():
+ tasks.append({"Name": task.name, "Status": task.status, "TaskArn": arn})
+ return json.dumps({"Tasks": tasks})
+
+ def delete_task(self):
+ task_arn = self._get_param("TaskArn")
+ self.datasync_backend.delete_task(task_arn)
+ return json.dumps({})
+
+ def describe_task(self):
+ task_arn = self._get_param("TaskArn")
+ task = self.datasync_backend._get_task(task_arn)
+ return json.dumps(
+ {
+ "TaskArn": task.arn,
+ "Status": task.status,
+ "Name": task.name,
+ "CurrentTaskExecutionArn": task.current_task_execution_arn,
+ "SourceLocationArn": task.source_location_arn,
+ "DestinationLocationArn": task.destination_location_arn,
+ "CloudWatchLogGroupArn": task.metadata["CloudWatchLogGroupArn"],
+ "Options": task.metadata["Options"],
+ "Excludes": task.metadata["Excludes"],
+ }
+ )
+
+ def start_task_execution(self):
+ task_arn = self._get_param("TaskArn")
+ arn = self.datasync_backend.start_task_execution(task_arn)
+ return json.dumps({"TaskExecutionArn": arn})
+
+ def cancel_task_execution(self):
+ task_execution_arn = self._get_param("TaskExecutionArn")
+ self.datasync_backend.cancel_task_execution(task_execution_arn)
+ return json.dumps({})
+
+ def describe_task_execution(self):
+ task_execution_arn = self._get_param("TaskExecutionArn")
+ task_execution = self.datasync_backend._get_task_execution(task_execution_arn)
+ result = json.dumps(
+ {"TaskExecutionArn": task_execution.arn, "Status": task_execution.status}
+ )
+ if task_execution.status == "SUCCESS":
+ self.datasync_backend.tasks[task_execution.task_arn].status = "AVAILABLE"
+ # Simulate task being executed
+ task_execution.iterate_status()
+ return result
diff --git a/contrib/python/moto/py3/moto/datasync/urls.py b/contrib/python/moto/py3/moto/datasync/urls.py
new file mode 100644
index 0000000000..be1d6a1dd7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/datasync/urls.py
@@ -0,0 +1,5 @@
+from .responses import DataSyncResponse
+
+url_bases = [r"https?://(.*\.)?(datasync)\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": DataSyncResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/dax/__init__.py b/contrib/python/moto/py3/moto/dax/__init__.py
new file mode 100644
index 0000000000..21ac86e6e6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/__init__.py
@@ -0,0 +1,5 @@
+"""dax module initialization; sets value for base decorator."""
+from .models import dax_backends
+from ..core.models import base_decorator
+
+mock_dax = base_decorator(dax_backends)
diff --git a/contrib/python/moto/py3/moto/dax/exceptions.py b/contrib/python/moto/py3/moto/dax/exceptions.py
new file mode 100644
index 0000000000..96a18b52d2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/exceptions.py
@@ -0,0 +1,13 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidParameterValueException(JsonRESTError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValueException", message)
+
+
+class ClusterNotFoundFault(JsonRESTError):
+ def __init__(self, name=None):
+ # DescribeClusters and DeleteCluster use a different message for the same error
+ msg = f"Cluster {name} not found." if name else "Cluster not found."
+ super().__init__("ClusterNotFoundFault", msg)
diff --git a/contrib/python/moto/py3/moto/dax/models.py b/contrib/python/moto/py3/moto/dax/models.py
new file mode 100644
index 0000000000..fd4d1a746d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/models.py
@@ -0,0 +1,262 @@
+"""DAXBackend class with methods for supported APIs."""
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, get_random_hex, unix_time
+from moto.moto_api import state_manager
+from moto.moto_api._internal.managed_state_model import ManagedState
+from moto.utilities.tagging_service import TaggingService
+from moto.utilities.paginator import paginate
+
+from .exceptions import ClusterNotFoundFault
+from .utils import PAGINATION_MODEL
+
+
+class DaxParameterGroup(BaseModel):
+ def __init__(self):
+ self.name = "default.dax1.0"
+ self.status = "in-sync"
+
+ def to_json(self):
+ return {
+ "ParameterGroupName": self.name,
+ "ParameterApplyStatus": self.status,
+ "NodeIdsToReboot": [],
+ }
+
+
+class DaxNode:
+ def __init__(self, endpoint, name, index):
+ self.node_id = f"{name}-{chr(ord('a')+index)}" # name-a, name-b, etc
+ self.node_endpoint = {
+ "Address": f"{self.node_id}.{endpoint.cluster_hex}.nodes.dax-clusters.{endpoint.region}.amazonaws.com",
+ "Port": endpoint.port,
+ }
+ self.create_time = unix_time()
+ # AWS spreads nodes across zones, i.e. three nodes will probably end up in us-east-1a, us-east-1b, us-east-1c
+ # For simplicity, we'll 'deploy' everything to us-east-1a
+ self.availability_zone = f"{endpoint.region}a"
+ self.status = "available"
+ self.parameter_status = "in-sync"
+
+ def to_json(self):
+ return {
+ "NodeId": self.node_id,
+ "Endpoint": self.node_endpoint,
+ "NodeCreateTime": self.create_time,
+ "AvailabilityZone": self.availability_zone,
+ "NodeStatus": self.status,
+ "ParameterGroupStatus": self.parameter_status,
+ }
+
+
+class DaxEndpoint:
+ def __init__(self, name, cluster_hex, region):
+ self.name = name
+ self.cluster_hex = cluster_hex
+ self.region = region
+ self.port = 8111
+
+ def to_json(self, full=False):
+ dct = {"Port": self.port}
+ if full:
+ dct[
+ "Address"
+ ] = f"{self.name}.{self.cluster_hex}.dax-clusters.{self.region}.amazonaws.com"
+ dct["URL"] = f"dax://{dct['Address']}"
+ return dct
+
+
+class DaxCluster(BaseModel, ManagedState):
+ def __init__(
+ self,
+ region,
+ name,
+ description,
+ node_type,
+ replication_factor,
+ iam_role_arn,
+ sse_specification,
+ encryption_type,
+ ):
+ # Configure ManagedState
+ super().__init__(
+ model_name="dax::cluster",
+ transitions=[("creating", "available"), ("deleting", "deleted")],
+ )
+ # Set internal properties
+ self.name = name
+ self.description = description
+ self.arn = f"arn:aws:dax:{region}:{get_account_id()}:cache/{self.name}"
+ self.node_type = node_type
+ self.replication_factor = replication_factor
+ self.cluster_hex = get_random_hex(6)
+ self.endpoint = DaxEndpoint(
+ name=name, cluster_hex=self.cluster_hex, region=region
+ )
+ self.nodes = [self._create_new_node(i) for i in range(0, replication_factor)]
+ self.preferred_maintenance_window = "thu:23:30-fri:00:30"
+ self.subnet_group = "default"
+ self.iam_role_arn = iam_role_arn
+ self.parameter_group = DaxParameterGroup()
+ self.security_groups = [
+ {"SecurityGroupIdentifier": f"sg-{get_random_hex(10)}", "Status": "active"}
+ ]
+ self.sse_specification = sse_specification
+ self.encryption_type = encryption_type
+
+ def _create_new_node(self, idx):
+ return DaxNode(endpoint=self.endpoint, name=self.name, index=idx)
+
+ def increase_replication_factor(self, new_replication_factor):
+ for idx in range(self.replication_factor, new_replication_factor):
+ self.nodes.append(self._create_new_node(idx))
+ self.replication_factor = new_replication_factor
+
+ def decrease_replication_factor(self, new_replication_factor, node_ids_to_remove):
+ if node_ids_to_remove:
+ self.nodes = [n for n in self.nodes if n.node_id not in node_ids_to_remove]
+ else:
+ self.nodes = self.nodes[0:new_replication_factor]
+ self.replication_factor = new_replication_factor
+
+ def delete(self):
+ self.status = "deleting"
+
+ def is_deleted(self):
+ return self.status == "deleted"
+
+ def to_json(self):
+ use_full_repr = self.status == "available"
+ dct = {
+ "ClusterName": self.name,
+ "Description": self.description,
+ "ClusterArn": self.arn,
+ "TotalNodes": self.replication_factor,
+ "ActiveNodes": 0,
+ "NodeType": self.node_type,
+ "Status": self.status,
+ "ClusterDiscoveryEndpoint": self.endpoint.to_json(use_full_repr),
+ "PreferredMaintenanceWindow": self.preferred_maintenance_window,
+ "SubnetGroup": self.subnet_group,
+ "IamRoleArn": self.iam_role_arn,
+ "ParameterGroup": self.parameter_group.to_json(),
+ "SSEDescription": {
+ "Status": "ENABLED"
+ if self.sse_specification.get("Enabled") is True
+ else "DISABLED"
+ },
+ "ClusterEndpointEncryptionType": self.encryption_type,
+ "SecurityGroups": self.security_groups,
+ }
+ if use_full_repr:
+ dct["Nodes"] = [n.to_json() for n in self.nodes]
+ return dct
+
+
+class DAXBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._clusters = dict()
+ self._tagger = TaggingService()
+
+ state_manager.register_default_transition(
+ model_name="dax::cluster", transition={"progression": "manual", "times": 4}
+ )
+
+ @property
+ def clusters(self):
+ self._clusters = {
+ name: cluster
+ for name, cluster in self._clusters.items()
+ if cluster.status != "deleted"
+ }
+ return self._clusters
+
+ def create_cluster(
+ self,
+ cluster_name,
+ node_type,
+ description,
+ replication_factor,
+ iam_role_arn,
+ tags,
+ sse_specification,
+ encryption_type,
+ ):
+ """
+ The following parameters are not yet processed:
+ AvailabilityZones, SubnetGroupNames, SecurityGroups, PreferredMaintenanceWindow, NotificationTopicArn, ParameterGroupName
+ """
+ cluster = DaxCluster(
+ region=self.region_name,
+ name=cluster_name,
+ description=description,
+ node_type=node_type,
+ replication_factor=replication_factor,
+ iam_role_arn=iam_role_arn,
+ sse_specification=sse_specification,
+ encryption_type=encryption_type,
+ )
+ self.clusters[cluster_name] = cluster
+ self._tagger.tag_resource(cluster.arn, tags)
+ return cluster
+
+ def delete_cluster(self, cluster_name):
+ if cluster_name not in self.clusters:
+ raise ClusterNotFoundFault()
+ self.clusters[cluster_name].delete()
+ return self.clusters[cluster_name]
+
+ @paginate(PAGINATION_MODEL)
+ def describe_clusters(self, cluster_names):
+ clusters = self.clusters
+ if not cluster_names:
+ cluster_names = clusters.keys()
+
+ for name in cluster_names:
+ if name in self.clusters:
+ self.clusters[name].advance()
+
+ # Clusters may have been deleted while advancing the states
+ clusters = self.clusters
+ for name in cluster_names:
+ if name not in self.clusters:
+ raise ClusterNotFoundFault(name)
+ return [cluster for name, cluster in clusters.items() if name in cluster_names]
+
+ def list_tags(self, resource_name):
+ """
+ Pagination is not yet implemented
+ """
+ # resource_name can be the name, or the full ARN
+ name = resource_name.split("/")[-1]
+ if name not in self.clusters:
+ raise ClusterNotFoundFault()
+ return self._tagger.list_tags_for_resource(self.clusters[name].arn)
+
+ def increase_replication_factor(self, cluster_name, new_replication_factor):
+ """
+ The AvailabilityZones-parameter is not yet implemented
+ """
+ if cluster_name not in self.clusters:
+ raise ClusterNotFoundFault()
+ self.clusters[cluster_name].increase_replication_factor(new_replication_factor)
+ return self.clusters[cluster_name]
+
+ def decrease_replication_factor(
+ self,
+ cluster_name,
+ new_replication_factor,
+ node_ids_to_remove,
+ ):
+ """
+ The AvailabilityZones-parameter is not yet implemented
+ """
+ if cluster_name not in self.clusters:
+ raise ClusterNotFoundFault()
+ self.clusters[cluster_name].decrease_replication_factor(
+ new_replication_factor, node_ids_to_remove
+ )
+ return self.clusters[cluster_name]
+
+
+dax_backends = BackendDict(DAXBackend, "dax")
diff --git a/contrib/python/moto/py3/moto/dax/responses.py b/contrib/python/moto/py3/moto/dax/responses.py
new file mode 100644
index 0000000000..3ebd66026c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/responses.py
@@ -0,0 +1,112 @@
+import json
+import re
+
+from moto.core.responses import BaseResponse
+from .exceptions import InvalidParameterValueException
+from .models import dax_backends
+
+
+class DAXResponse(BaseResponse):
+ @property
+ def dax_backend(self):
+ return dax_backends[self.region]
+
+ def create_cluster(self):
+ params = json.loads(self.body)
+ cluster_name = params.get("ClusterName")
+ node_type = params.get("NodeType")
+ description = params.get("Description")
+ replication_factor = params.get("ReplicationFactor")
+ iam_role_arn = params.get("IamRoleArn")
+ tags = params.get("Tags", [])
+ sse_specification = params.get("SSESpecification", {})
+ encryption_type = params.get("ClusterEndpointEncryptionType", "NONE")
+
+ self._validate_arn(iam_role_arn)
+ self._validate_name(cluster_name)
+
+ cluster = self.dax_backend.create_cluster(
+ cluster_name=cluster_name,
+ node_type=node_type,
+ description=description,
+ replication_factor=replication_factor,
+ iam_role_arn=iam_role_arn,
+ tags=tags,
+ sse_specification=sse_specification,
+ encryption_type=encryption_type,
+ )
+ return json.dumps(dict(Cluster=cluster.to_json()))
+
+ def delete_cluster(self):
+ cluster_name = json.loads(self.body).get("ClusterName")
+ cluster = self.dax_backend.delete_cluster(cluster_name)
+ return json.dumps(dict(Cluster=cluster.to_json()))
+
+ def describe_clusters(self):
+ params = json.loads(self.body)
+ cluster_names = params.get("ClusterNames", [])
+ max_results = params.get("MaxResults")
+ next_token = params.get("NextToken")
+
+ for name in cluster_names:
+ self._validate_name(name)
+
+ clusters, next_token = self.dax_backend.describe_clusters(
+ cluster_names=cluster_names, max_results=max_results, next_token=next_token
+ )
+ return json.dumps(
+ {"Clusters": [c.to_json() for c in clusters], "NextToken": next_token}
+ )
+
+ def _validate_arn(self, arn):
+ if not arn.startswith("arn:"):
+ raise InvalidParameterValueException(f"ARNs must start with 'arn:': {arn}")
+ sections = arn.split(":")
+ if len(sections) < 3:
+ raise InvalidParameterValueException(
+ f"Second colon partition not found: {arn}"
+ )
+ if len(sections) < 4:
+ raise InvalidParameterValueException(f"Third colon vendor not found: {arn}")
+ if len(sections) < 5:
+ raise InvalidParameterValueException(
+ f"Fourth colon (region/namespace delimiter) not found: {arn}"
+ )
+ if len(sections) < 6:
+ raise InvalidParameterValueException(
+ f"Fifth colon (namespace/relative-id delimiter) not found: {arn}"
+ )
+
+ def _validate_name(self, name):
+ msg = "Cluster ID specified is not a valid identifier. Identifiers must begin with a letter; must contain only ASCII letters, digits, and hyphens; and must not end with a hyphen or contain two consecutive hyphens."
+ if not re.match("^[a-z][a-z0-9-]+[a-z0-9]$", name):
+ raise InvalidParameterValueException(msg)
+ if "--" in name:
+ raise InvalidParameterValueException(msg)
+
+ def list_tags(self):
+ params = json.loads(self.body)
+ resource_name = params.get("ResourceName")
+ tags = self.dax_backend.list_tags(resource_name=resource_name)
+ return json.dumps(tags)
+
+ def increase_replication_factor(self):
+ params = json.loads(self.body)
+ cluster_name = params.get("ClusterName")
+ new_replication_factor = params.get("NewReplicationFactor")
+ cluster = self.dax_backend.increase_replication_factor(
+ cluster_name=cluster_name, new_replication_factor=new_replication_factor
+ )
+ return json.dumps({"Cluster": cluster.to_json()})
+
+ def decrease_replication_factor(self):
+ params = json.loads(self.body)
+ cluster_name = params.get("ClusterName")
+ new_replication_factor = params.get("NewReplicationFactor")
+ node_ids_to_remove = params.get("NodeIdsToRemove")
+ cluster = self.dax_backend.decrease_replication_factor(
+ cluster_name=cluster_name,
+ new_replication_factor=new_replication_factor,
+ node_ids_to_remove=node_ids_to_remove,
+ )
+ return json.dumps({"Cluster": cluster.to_json()})
diff --git a/contrib/python/moto/py3/moto/dax/urls.py b/contrib/python/moto/py3/moto/dax/urls.py
new file mode 100644
index 0000000000..ed4fe11bcb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/urls.py
@@ -0,0 +1,11 @@
+"""dax base URL and path."""
+from .responses import DAXResponse
+
+url_bases = [
+ r"https?://dax\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": DAXResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/dax/utils.py b/contrib/python/moto/py3/moto/dax/utils.py
new file mode 100644
index 0000000000..f4a27d2300
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dax/utils.py
@@ -0,0 +1,8 @@
+PAGINATION_MODEL = {
+ "describe_clusters": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "arn",
+ },
+}
diff --git a/contrib/python/moto/py3/moto/dms/__init__.py b/contrib/python/moto/py3/moto/dms/__init__.py
new file mode 100644
index 0000000000..af997e2c16
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/__init__.py
@@ -0,0 +1,5 @@
+from .models import dms_backends
+from ..core.models import base_decorator
+
+dms_backend = dms_backends["us-east-1"]
+mock_dms = base_decorator(dms_backends)
diff --git a/contrib/python/moto/py3/moto/dms/exceptions.py b/contrib/python/moto/py3/moto/dms/exceptions.py
new file mode 100644
index 0000000000..f0c4dc29bc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/exceptions.py
@@ -0,0 +1,20 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class DmsClientError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFoundFault(DmsClientError):
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundFault", message)
+
+
+class InvalidResourceStateFault(DmsClientError):
+ def __init__(self, message):
+ super().__init__("InvalidResourceStateFault", message)
+
+
+class ResourceAlreadyExistsFault(DmsClientError):
+ def __init__(self, message):
+ super().__init__("ResourceAlreadyExistsFault", message)
diff --git a/contrib/python/moto/py3/moto/dms/models.py b/contrib/python/moto/py3/moto/dms/models.py
new file mode 100644
index 0000000000..d50a0aae5e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/models.py
@@ -0,0 +1,190 @@
+import json
+
+from datetime import datetime
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import (
+ InvalidResourceStateFault,
+ ResourceAlreadyExistsFault,
+ ResourceNotFoundFault,
+)
+from .utils import filter_tasks
+
+
+class DatabaseMigrationServiceBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.replication_tasks = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "dms"
+ )
+
+ def create_replication_task(
+ self,
+ replication_task_identifier,
+ source_endpoint_arn,
+ target_endpoint_arn,
+ replication_instance_arn,
+ migration_type,
+ table_mappings,
+ replication_task_settings,
+ ):
+ """
+ The following parameters are not yet implemented:
+ CDCStartTime, CDCStartPosition, CDCStopPosition, Tags, TaskData, ResourceIdentifier
+ """
+ replication_task = FakeReplicationTask(
+ replication_task_identifier=replication_task_identifier,
+ source_endpoint_arn=source_endpoint_arn,
+ target_endpoint_arn=target_endpoint_arn,
+ replication_instance_arn=replication_instance_arn,
+ migration_type=migration_type,
+ table_mappings=table_mappings,
+ replication_task_settings=replication_task_settings,
+ region_name=self.region_name,
+ )
+
+ if self.replication_tasks.get(replication_task.arn):
+ raise ResourceAlreadyExistsFault(
+ "The resource you are attempting to create already exists."
+ )
+
+ self.replication_tasks[replication_task.arn] = replication_task
+
+ return replication_task
+
+ def start_replication_task(self, replication_task_arn):
+ """
+ The following parameters have not yet been implemented:
+ StartReplicationTaskType, CDCStartTime, CDCStartPosition, CDCStopPosition
+ """
+ if not self.replication_tasks.get(replication_task_arn):
+ raise ResourceNotFoundFault("Replication task could not be found.")
+
+ return self.replication_tasks[replication_task_arn].start()
+
+ def stop_replication_task(self, replication_task_arn):
+ if not self.replication_tasks.get(replication_task_arn):
+ raise ResourceNotFoundFault("Replication task could not be found.")
+
+ return self.replication_tasks[replication_task_arn].stop()
+
+ def delete_replication_task(self, replication_task_arn):
+ if not self.replication_tasks.get(replication_task_arn):
+ raise ResourceNotFoundFault("Replication task could not be found.")
+
+ task = self.replication_tasks[replication_task_arn]
+ task.delete()
+ self.replication_tasks.pop(replication_task_arn)
+
+ return task
+
+ def describe_replication_tasks(self, filters, max_records):
+ """
+ The parameter WithoutSettings has not yet been implemented
+ """
+ replication_tasks = filter_tasks(self.replication_tasks.values(), filters)
+
+ if max_records and max_records > 0:
+ replication_tasks = replication_tasks[:max_records]
+
+ return replication_tasks
+
+
+class FakeReplicationTask(BaseModel):
+ def __init__(
+ self,
+ replication_task_identifier,
+ migration_type,
+ replication_instance_arn,
+ source_endpoint_arn,
+ target_endpoint_arn,
+ table_mappings,
+ replication_task_settings,
+ region_name,
+ ):
+ self.id = replication_task_identifier
+ self.region = region_name
+ self.migration_type = migration_type
+ self.replication_instance_arn = replication_instance_arn
+ self.source_endpoint_arn = source_endpoint_arn
+ self.target_endpoint_arn = target_endpoint_arn
+ self.table_mappings = table_mappings
+ self.replication_task_settings = replication_task_settings
+
+ self.status = "creating"
+
+ self.creation_date = datetime.utcnow()
+ self.start_date = None
+ self.stop_date = None
+
+ @property
+ def arn(self):
+ return "arn:aws:dms:{region}:{account_id}:task:{task_id}".format(
+ region=self.region, account_id=get_account_id(), task_id=self.id
+ )
+
+ def to_dict(self):
+ start_date = self.start_date.isoformat() if self.start_date else None
+ stop_date = self.stop_date.isoformat() if self.stop_date else None
+
+ return {
+ "ReplicationTaskIdentifier": self.id,
+ "SourceEndpointArn": self.source_endpoint_arn,
+ "TargetEndpointArn": self.target_endpoint_arn,
+ "ReplicationInstanceArn": self.replication_instance_arn,
+ "MigrationType": self.migration_type,
+ "TableMappings": json.dumps(self.table_mappings),
+ "ReplicationTaskSettings": json.dumps(self.replication_task_settings),
+ "Status": self.status,
+ "ReplicationTaskCreationDate": self.creation_date.isoformat(),
+ "ReplicationTaskStartDate": start_date,
+ "ReplicationTaskArn": self.arn,
+ "ReplicationTaskStats": {
+ "FullLoadProgressPercent": 100,
+ "ElapsedTimeMillis": 100,
+ "TablesLoaded": 1,
+ "TablesLoading": 0,
+ "TablesQueued": 0,
+ "TablesErrored": 0,
+ "FreshStartDate": start_date,
+ "StartDate": start_date,
+ "StopDate": stop_date,
+ "FullLoadStartDate": start_date,
+ "FullLoadFinishDate": stop_date,
+ },
+ }
+
+ def ready(self):
+ self.status = "ready"
+ return self
+
+ def start(self):
+ self.status = "starting"
+ self.start_date = datetime.utcnow()
+ self.run()
+ return self
+
+ def stop(self):
+ if self.status != "running":
+ raise InvalidResourceStateFault("Replication task is not running")
+
+ self.status = "stopped"
+ self.stop_date = datetime.utcnow()
+ return self
+
+ def delete(self):
+ self.status = "deleting"
+ return self
+
+ def run(self):
+ self.status = "running"
+ return self
+
+
+dms_backends = BackendDict(DatabaseMigrationServiceBackend, "dms")
diff --git a/contrib/python/moto/py3/moto/dms/responses.py b/contrib/python/moto/py3/moto/dms/responses.py
new file mode 100644
index 0000000000..cf671f4e1c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/responses.py
@@ -0,0 +1,66 @@
+from moto.core.responses import BaseResponse
+from .models import dms_backends
+import json
+
+
+class DatabaseMigrationServiceResponse(BaseResponse):
+ SERVICE_NAME = "dms"
+
+ @property
+ def dms_backend(self):
+ return dms_backends[self.region]
+
+ def create_replication_task(self):
+ replication_task_identifier = self._get_param("ReplicationTaskIdentifier")
+ source_endpoint_arn = self._get_param("SourceEndpointArn")
+ target_endpoint_arn = self._get_param("TargetEndpointArn")
+ replication_instance_arn = self._get_param("ReplicationInstanceArn")
+ migration_type = self._get_param("MigrationType")
+ table_mappings = self._get_param("TableMappings")
+ replication_task_settings = self._get_param("ReplicationTaskSettings")
+ replication_task = self.dms_backend.create_replication_task(
+ replication_task_identifier=replication_task_identifier,
+ source_endpoint_arn=source_endpoint_arn,
+ target_endpoint_arn=target_endpoint_arn,
+ replication_instance_arn=replication_instance_arn,
+ migration_type=migration_type,
+ table_mappings=table_mappings,
+ replication_task_settings=replication_task_settings,
+ )
+
+ return json.dumps({"ReplicationTask": replication_task.to_dict()})
+
+ def start_replication_task(self):
+ replication_task_arn = self._get_param("ReplicationTaskArn")
+ replication_task = self.dms_backend.start_replication_task(
+ replication_task_arn=replication_task_arn
+ )
+
+ return json.dumps({"ReplicationTask": replication_task.to_dict()})
+
+ def stop_replication_task(self):
+ replication_task_arn = self._get_param("ReplicationTaskArn")
+ replication_task = self.dms_backend.stop_replication_task(
+ replication_task_arn=replication_task_arn
+ )
+
+ return json.dumps({"ReplicationTask": replication_task.to_dict()})
+
+ def delete_replication_task(self):
+ replication_task_arn = self._get_param("ReplicationTaskArn")
+ replication_task = self.dms_backend.delete_replication_task(
+ replication_task_arn=replication_task_arn
+ )
+
+ return json.dumps({"ReplicationTask": replication_task.to_dict()})
+
+ def describe_replication_tasks(self):
+ filters = self._get_list_prefix("Filters.member")
+ max_records = self._get_int_param("MaxRecords")
+ replication_tasks = self.dms_backend.describe_replication_tasks(
+ filters=filters, max_records=max_records
+ )
+
+ return json.dumps(
+ dict(ReplicationTasks=[t.to_dict() for t in replication_tasks])
+ )
diff --git a/contrib/python/moto/py3/moto/dms/urls.py b/contrib/python/moto/py3/moto/dms/urls.py
new file mode 100644
index 0000000000..c340c449ad
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/urls.py
@@ -0,0 +1,8 @@
+from .responses import DatabaseMigrationServiceResponse
+
+url_bases = [r"https?://dms\.(.+)\.amazonaws\.com"]
+
+
+url_paths = {
+ "{0}/$": DatabaseMigrationServiceResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/dms/utils.py b/contrib/python/moto/py3/moto/dms/utils.py
new file mode 100644
index 0000000000..cff278e125
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dms/utils.py
@@ -0,0 +1,46 @@
+def match_task_arn(task, arns):
+ return task["ReplicationTaskArn"] in arns
+
+
+def match_task_id(task, ids):
+ return task["ReplicationTaskIdentifier"] in ids
+
+
+def match_task_migration_type(task, migration_types):
+ return task["MigrationType"] in migration_types
+
+
+def match_task_endpoint_arn(task, endpoint_arns):
+ return (
+ task["SourceEndpointArn"] in endpoint_arns
+ or task["TargetEndpointArn"] in endpoint_arns
+ )
+
+
+def match_task_replication_instance_arn(task, replication_instance_arns):
+ return task["ReplicationInstanceArn"] in replication_instance_arns
+
+
+task_filter_functions = {
+ "replication-task-arn": match_task_arn,
+ "replication-task-id": match_task_id,
+ "migration-type": match_task_migration_type,
+ "endpoint-arn": match_task_endpoint_arn,
+ "replication-instance-arn": match_task_replication_instance_arn,
+}
+
+
+def filter_tasks(tasks, filters):
+ matching_tasks = tasks
+
+ for f in filters:
+ filter_function = task_filter_functions[f["Name"]]
+
+ if not filter_function:
+ continue
+
+ matching_tasks = filter(
+ lambda task: filter_function(task, f["Values"]), matching_tasks
+ )
+
+ return matching_tasks
diff --git a/contrib/python/moto/py3/moto/ds/__init__.py b/contrib/python/moto/py3/moto/ds/__init__.py
new file mode 100644
index 0000000000..7195bf1896
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/__init__.py
@@ -0,0 +1,5 @@
+"""ds module initialization; sets value for base decorator."""
+from .models import ds_backends
+from ..core.models import base_decorator
+
+mock_ds = base_decorator(ds_backends)
diff --git a/contrib/python/moto/py3/moto/ds/exceptions.py b/contrib/python/moto/py3/moto/ds/exceptions.py
new file mode 100644
index 0000000000..b5d1ff05f4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/exceptions.py
@@ -0,0 +1,105 @@
+"""Exceptions raised by the Directory Service service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class DsValidationException(JsonRESTError):
+ """Report one of more parameter validation errors."""
+
+ code = 400
+
+ def __init__(self, error_tuples):
+ """Validation errors are concatenated into one exception message.
+
+ error_tuples is a list of tuples. Each tuple contains:
+
+ - name of invalid parameter,
+ - value of invalid parameter,
+ - string describing the constraints for that parameter.
+ """
+ msg_leader = (
+ f"{len(error_tuples)} "
+ f"validation error{'s' if len(error_tuples) > 1 else ''} detected: "
+ )
+ msgs = []
+ for arg_name, arg_value, constraint in error_tuples:
+ value = "at" if "assword" in arg_name else f"'{arg_value}' at"
+ msgs.append(
+ f"Value {value} '{arg_name}' failed to satisfy constraint: "
+ f"Member must {constraint}"
+ )
+ super().__init__("ValidationException", msg_leader + "; ".join(msgs))
+
+
+class ClientException(JsonRESTError):
+ """Client exception has occurred. VPC parameters are invalid."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ClientException", message)
+
+
+class DirectoryLimitExceededException(JsonRESTError):
+ """Maximum number of directories in region has been reached."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DirectoryLimitExceededException", message)
+
+
+class EntityDoesNotExistException(JsonRESTError):
+ """The specified entity could not be found."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("EntityDoesNotExistException", message)
+
+
+class EntityAlreadyExistsException(JsonRESTError):
+ """The specified entity already exists."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("EntityAlreadyExistsException", message)
+
+
+class InvalidNextTokenException(JsonRESTError):
+ """Invalid next token parameter used to return a list of entities."""
+
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidNextTokenException",
+ "Invalid value passed for the NextToken parameter",
+ )
+
+
+class InvalidParameterException(JsonRESTError):
+ """Invalid parameter."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterException", message)
+
+
+class TagLimitExceededException(JsonRESTError):
+ """The maximum allowed number of tags was exceeded."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("TagLimitExceededException", message)
+
+
+class ValidationException(JsonRESTError):
+ """Tag validation failed."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/ds/models.py b/contrib/python/moto/py3/moto/ds/models.py
new file mode 100644
index 0000000000..de42344ae1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/models.py
@@ -0,0 +1,505 @@
+"""DirectoryServiceBackend class with methods for supported APIs."""
+from datetime import datetime, timezone
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import get_random_hex, BackendDict
+from moto.ds.exceptions import (
+ ClientException,
+ DirectoryLimitExceededException,
+ EntityAlreadyExistsException,
+ EntityDoesNotExistException,
+ InvalidParameterException,
+ TagLimitExceededException,
+ ValidationException,
+)
+from moto.ds.utils import PAGINATION_MODEL
+from moto.ds.validations import validate_args
+from moto.ec2.exceptions import InvalidSubnetIdError
+from moto.ec2 import ec2_backends
+from moto.utilities.paginator import paginate
+from moto.utilities.tagging_service import TaggingService
+
+
+class Directory(BaseModel): # pylint: disable=too-many-instance-attributes
+ """Representation of a Simple AD Directory.
+
+ When the "create" API for a Simple AD or a Microsoft AD directory is
+ invoked, two domain controllers and a DNS server are supposed to be
+ created. That is NOT done for the fake directories.
+
+ However, the DnsIpAddrs attribute is supposed to contain the IP addresses
+ of the DNS servers. For a AD Connecter, the DnsIpAddrs are provided when
+ the directory is created, but the ConnectSettings.ConnectIps values should
+ contain the IP addresses of the DNS servers or domain controllers in the
+ directory to which the AD connector is connected.
+
+ Instead, the dns_ip_addrs attribute or ConnectIPs attribute for the fake
+ directories will contain IPs picked from the subnets' CIDR blocks.
+ """
+
+ # The assumption here is that the limits are the same for all regions.
+ CLOUDONLY_DIRECTORIES_LIMIT = 10
+ CLOUDONLY_MICROSOFT_AD_LIMIT = 20
+ CONNECTED_DIRECTORIES_LIMIT = 10
+
+ MAX_TAGS_PER_DIRECTORY = 50
+
+ def __init__(
+ self,
+ region,
+ name,
+ password,
+ directory_type,
+ size=None,
+ vpc_settings=None,
+ connect_settings=None,
+ short_name=None,
+ description=None,
+ edition=None,
+ ): # pylint: disable=too-many-arguments
+ self.region = region
+ self.name = name
+ self.password = password
+ self.directory_type = directory_type
+ self.size = size
+ self.vpc_settings = vpc_settings
+ self.connect_settings = connect_settings
+ self.short_name = short_name
+ self.description = description
+ self.edition = edition
+
+ # Calculated or default values for the directory attributes.
+ self.directory_id = f"d-{get_random_hex(10)}"
+ self.access_url = f"{self.directory_id}.awsapps.com"
+ self.alias = self.directory_id
+ self.desired_number_of_domain_controllers = 0
+ self.sso_enabled = False
+ self.stage = "Active"
+ self.launch_time = datetime.now(timezone.utc).isoformat()
+ self.stage_last_updated_date_time = datetime.now(timezone.utc).isoformat()
+
+ if self.directory_type == "ADConnector":
+ self.security_group_id = self.create_security_group(
+ self.connect_settings["VpcId"]
+ )
+ self.eni_ids, self.subnet_ips = self.create_eni(
+ self.security_group_id, self.connect_settings["SubnetIds"]
+ )
+ self.connect_settings["SecurityGroupId"] = self.security_group_id
+ self.connect_settings["ConnectIps"] = self.subnet_ips
+ self.dns_ip_addrs = self.connect_settings["CustomerDnsIps"]
+
+ else:
+ self.security_group_id = self.create_security_group(
+ self.vpc_settings["VpcId"]
+ )
+ self.eni_ids, self.subnet_ips = self.create_eni(
+ self.security_group_id, self.vpc_settings["SubnetIds"]
+ )
+ self.vpc_settings["SecurityGroupId"] = self.security_group_id
+ self.dns_ip_addrs = self.subnet_ips
+
+ def create_security_group(self, vpc_id):
+ """Create security group for the network interface."""
+ security_group_info = ec2_backends[self.region].create_security_group(
+ name=f"{self.directory_id}_controllers",
+ description=(
+ f"AWS created security group for {self.directory_id} "
+ f"directory controllers"
+ ),
+ vpc_id=vpc_id,
+ )
+ return security_group_info.id
+
+ def delete_security_group(self):
+ """Delete the given security group."""
+ ec2_backends[self.region].delete_security_group(group_id=self.security_group_id)
+
+ def create_eni(self, security_group_id, subnet_ids):
+ """Return ENI ids and primary addresses created for each subnet."""
+ eni_ids = []
+ subnet_ips = []
+ for subnet_id in subnet_ids:
+ eni_info = ec2_backends[self.region].create_network_interface(
+ subnet=subnet_id,
+ private_ip_address=None,
+ group_ids=[security_group_id],
+ description=f"AWS created network interface for {self.directory_id}",
+ )
+ eni_ids.append(eni_info.id)
+ subnet_ips.append(eni_info.private_ip_address)
+ return eni_ids, subnet_ips
+
+ def delete_eni(self):
+ """Delete ENI for each subnet and the security group."""
+ for eni_id in self.eni_ids:
+ ec2_backends[self.region].delete_network_interface(eni_id)
+
+ def update_alias(self, alias):
+ """Change default alias to given alias."""
+ self.alias = alias
+ self.access_url = f"{alias}.awsapps.com"
+
+ def enable_sso(self, new_state):
+ """Enable/disable sso based on whether new_state is True or False."""
+ self.sso_enabled = new_state
+
+ def to_dict(self):
+ """Create a dictionary of attributes for Directory."""
+ attributes = {
+ "AccessUrl": self.access_url,
+ "Alias": self.alias,
+ "DirectoryId": self.directory_id,
+ "DesiredNumberOfDomainControllers": self.desired_number_of_domain_controllers,
+ "DnsIpAddrs": self.dns_ip_addrs,
+ "LaunchTime": self.launch_time,
+ "Name": self.name,
+ "SsoEnabled": self.sso_enabled,
+ "Stage": self.stage,
+ "StageLastUpdatedDateTime": self.stage_last_updated_date_time,
+ "Type": self.directory_type,
+ }
+
+ if self.edition:
+ attributes["Edition"] = self.edition
+ if self.size:
+ attributes["Size"] = self.size
+ if self.short_name:
+ attributes["ShortName"] = self.short_name
+ if self.description:
+ attributes["Description"] = self.description
+
+ if self.vpc_settings:
+ attributes["VpcSettings"] = self.vpc_settings
+ else:
+ attributes["ConnectSettings"] = self.connect_settings
+ attributes["ConnectSettings"]["CustomerDnsIps"] = None
+ return attributes
+
+
+class DirectoryServiceBackend(BaseBackend):
+ """Implementation of DirectoryService APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.directories = {}
+ self.tagger = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """List of dicts representing default VPC endpoints for this service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ds"
+ )
+
+ @staticmethod
+ def _verify_subnets(region, vpc_settings):
+ """Verify subnets are valid, else raise an exception.
+
+ If settings are valid, add AvailabilityZones to vpc_settings.
+ """
+ if len(vpc_settings["SubnetIds"]) != 2:
+ raise InvalidParameterException(
+ "Invalid subnet ID(s). They must correspond to two subnets "
+ "in different Availability Zones."
+ )
+
+ # Subnet IDs are checked before the VPC ID. The Subnet IDs must
+ # be valid and in different availability zones.
+ try:
+ subnets = ec2_backends[region].get_all_subnets(
+ subnet_ids=vpc_settings["SubnetIds"]
+ )
+ except InvalidSubnetIdError as exc:
+ raise InvalidParameterException(
+ "Invalid subnet ID(s). They must correspond to two subnets "
+ "in different Availability Zones."
+ ) from exc
+
+ regions = [subnet.availability_zone for subnet in subnets]
+ if regions[0] == regions[1]:
+ raise ClientException(
+ "Invalid subnet ID(s). The two subnets must be in "
+ "different Availability Zones."
+ )
+
+ vpcs = ec2_backends[region].describe_vpcs()
+ if vpc_settings["VpcId"] not in [x.id for x in vpcs]:
+ raise ClientException("Invalid VPC ID.")
+ vpc_settings["AvailabilityZones"] = regions
+
+ def connect_directory(
+ self,
+ region,
+ name,
+ short_name,
+ password,
+ description,
+ size,
+ connect_settings,
+ tags,
+ ): # pylint: disable=too-many-arguments
+ """Create a fake AD Connector."""
+ if len(self.directories) > Directory.CONNECTED_DIRECTORIES_LIMIT:
+ raise DirectoryLimitExceededException(
+ f"Directory limit exceeded. A maximum of "
+ f"{Directory.CONNECTED_DIRECTORIES_LIMIT} directories may be created"
+ )
+
+ validate_args(
+ [
+ ("password", password),
+ ("size", size),
+ ("name", name),
+ ("description", description),
+ ("shortName", short_name),
+ (
+ "connectSettings.vpcSettings.subnetIds",
+ connect_settings["SubnetIds"],
+ ),
+ (
+ "connectSettings.customerUserName",
+ connect_settings["CustomerUserName"],
+ ),
+ ("connectSettings.customerDnsIps", connect_settings["CustomerDnsIps"]),
+ ]
+ )
+ # ConnectSettings and VpcSettings both have a VpcId and Subnets.
+ self._verify_subnets(region, connect_settings)
+
+ errmsg = self.tagger.validate_tags(tags or [])
+ if errmsg:
+ raise ValidationException(errmsg)
+ if len(tags) > Directory.MAX_TAGS_PER_DIRECTORY:
+ raise DirectoryLimitExceededException("Tag Limit is exceeding")
+
+ directory = Directory(
+ region,
+ name,
+ password,
+ "ADConnector",
+ size=size,
+ connect_settings=connect_settings,
+ short_name=short_name,
+ description=description,
+ )
+ self.directories[directory.directory_id] = directory
+ self.tagger.tag_resource(directory.directory_id, tags or [])
+ return directory.directory_id
+
+ def create_directory(
+ self, region, name, short_name, password, description, size, vpc_settings, tags
+ ): # pylint: disable=too-many-arguments
+ """Create a fake Simple Ad Directory."""
+ if len(self.directories) > Directory.CLOUDONLY_DIRECTORIES_LIMIT:
+ raise DirectoryLimitExceededException(
+ f"Directory limit exceeded. A maximum of "
+ f"{Directory.CLOUDONLY_DIRECTORIES_LIMIT} directories may be created"
+ )
+
+ # botocore doesn't look for missing vpc_settings, but boto3 does.
+ if not vpc_settings:
+ raise InvalidParameterException("VpcSettings must be specified.")
+ validate_args(
+ [
+ ("password", password),
+ ("size", size),
+ ("name", name),
+ ("description", description),
+ ("shortName", short_name),
+ ("vpcSettings.subnetIds", vpc_settings["SubnetIds"]),
+ ]
+ )
+ self._verify_subnets(region, vpc_settings)
+
+ errmsg = self.tagger.validate_tags(tags or [])
+ if errmsg:
+ raise ValidationException(errmsg)
+ if len(tags) > Directory.MAX_TAGS_PER_DIRECTORY:
+ raise DirectoryLimitExceededException("Tag Limit is exceeding")
+
+ directory = Directory(
+ region,
+ name,
+ password,
+ "SimpleAD",
+ size=size,
+ vpc_settings=vpc_settings,
+ short_name=short_name,
+ description=description,
+ )
+ self.directories[directory.directory_id] = directory
+ self.tagger.tag_resource(directory.directory_id, tags or [])
+ return directory.directory_id
+
+ def _validate_directory_id(self, directory_id):
+ """Raise an exception if the directory id is invalid or unknown."""
+ # Validation of ID takes precedence over a check for its existence.
+ validate_args([("directoryId", directory_id)])
+ if directory_id not in self.directories:
+ raise EntityDoesNotExistException(
+ f"Directory {directory_id} does not exist"
+ )
+
+ def create_alias(self, directory_id, alias):
+ """Create and assign an alias to a directory."""
+ self._validate_directory_id(directory_id)
+
+ # The default alias name is the same as the directory name. Check
+ # whether this directory was already given an alias.
+ directory = self.directories[directory_id]
+ if directory.alias != directory_id:
+ raise InvalidParameterException(
+ "The directory in the request already has an alias. That "
+ "alias must be deleted before a new alias can be created."
+ )
+
+ # Is the alias already in use?
+ if alias in [x.alias for x in self.directories.values()]:
+ raise EntityAlreadyExistsException(f"Alias '{alias}' already exists.")
+ validate_args([("alias", alias)])
+
+ directory.update_alias(alias)
+ return {"DirectoryId": directory_id, "Alias": alias}
+
+ def create_microsoft_ad(
+ self,
+ region,
+ name,
+ short_name,
+ password,
+ description,
+ vpc_settings,
+ edition,
+ tags,
+ ): # pylint: disable=too-many-arguments
+ """Create a fake Microsoft Ad Directory."""
+ if len(self.directories) > Directory.CLOUDONLY_MICROSOFT_AD_LIMIT:
+ raise DirectoryLimitExceededException(
+ f"Directory limit exceeded. A maximum of "
+ f"{Directory.CLOUDONLY_MICROSOFT_AD_LIMIT} directories may be created"
+ )
+
+ # boto3 looks for missing vpc_settings for create_microsoft_ad().
+ validate_args(
+ [
+ ("password", password),
+ ("edition", edition),
+ ("name", name),
+ ("description", description),
+ ("shortName", short_name),
+ ("vpcSettings.subnetIds", vpc_settings["SubnetIds"]),
+ ]
+ )
+ self._verify_subnets(region, vpc_settings)
+
+ errmsg = self.tagger.validate_tags(tags or [])
+ if errmsg:
+ raise ValidationException(errmsg)
+ if len(tags) > Directory.MAX_TAGS_PER_DIRECTORY:
+ raise DirectoryLimitExceededException("Tag Limit is exceeding")
+
+ directory = Directory(
+ region,
+ name,
+ password,
+ "MicrosoftAD",
+ vpc_settings=vpc_settings,
+ short_name=short_name,
+ description=description,
+ edition=edition,
+ )
+ self.directories[directory.directory_id] = directory
+ self.tagger.tag_resource(directory.directory_id, tags or [])
+ return directory.directory_id
+
+ def delete_directory(self, directory_id):
+ """Delete directory with the matching ID."""
+ self._validate_directory_id(directory_id)
+ self.directories[directory_id].delete_eni()
+ self.directories[directory_id].delete_security_group()
+ self.tagger.delete_all_tags_for_resource(directory_id)
+ self.directories.pop(directory_id)
+ return directory_id
+
+ def disable_sso(self, directory_id, username=None, password=None):
+ """Disable single-sign on for a directory."""
+ self._validate_directory_id(directory_id)
+ validate_args([("ssoPassword", password), ("userName", username)])
+ directory = self.directories[directory_id]
+ directory.enable_sso(False)
+
+ def enable_sso(self, directory_id, username=None, password=None):
+ """Enable single-sign on for a directory."""
+ self._validate_directory_id(directory_id)
+ validate_args([("ssoPassword", password), ("userName", username)])
+
+ directory = self.directories[directory_id]
+ if directory.alias == directory_id:
+ raise ClientException(
+ f"An alias is required before enabling SSO. DomainId={directory_id}"
+ )
+
+ directory = self.directories[directory_id]
+ directory.enable_sso(True)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def describe_directories(self, directory_ids=None):
+ """Return info on all directories or directories with matching IDs."""
+ for directory_id in directory_ids or self.directories:
+ self._validate_directory_id(directory_id)
+
+ directories = list(self.directories.values())
+ if directory_ids:
+ directories = [x for x in directories if x.directory_id in directory_ids]
+ return sorted(directories, key=lambda x: x.launch_time)
+
+ def get_directory_limits(self):
+ """Return hard-coded limits for the directories."""
+ counts = {"SimpleAD": 0, "MicrosoftAD": 0, "ConnectedAD": 0}
+ for directory in self.directories.values():
+ if directory.directory_type == "SimpleAD":
+ counts["SimpleAD"] += 1
+ elif directory.directory_type in ["MicrosoftAD", "SharedMicrosoftAD"]:
+ counts["MicrosoftAD"] += 1
+ elif directory.directory_type == "ADConnector":
+ counts["ConnectedAD"] += 1
+
+ return {
+ "CloudOnlyDirectoriesLimit": Directory.CLOUDONLY_DIRECTORIES_LIMIT,
+ "CloudOnlyDirectoriesCurrentCount": counts["SimpleAD"],
+ "CloudOnlyDirectoriesLimitReached": counts["SimpleAD"]
+ == Directory.CLOUDONLY_DIRECTORIES_LIMIT,
+ "CloudOnlyMicrosoftADLimit": Directory.CLOUDONLY_MICROSOFT_AD_LIMIT,
+ "CloudOnlyMicrosoftADCurrentCount": counts["MicrosoftAD"],
+ "CloudOnlyMicrosoftADLimitReached": counts["MicrosoftAD"]
+ == Directory.CLOUDONLY_MICROSOFT_AD_LIMIT,
+ "ConnectedDirectoriesLimit": Directory.CONNECTED_DIRECTORIES_LIMIT,
+ "ConnectedDirectoriesCurrentCount": counts["ConnectedAD"],
+ "ConnectedDirectoriesLimitReached": counts["ConnectedAD"]
+ == Directory.CONNECTED_DIRECTORIES_LIMIT,
+ }
+
+ def add_tags_to_resource(self, resource_id, tags):
+ """Add or overwrite one or more tags for specified directory."""
+ self._validate_directory_id(resource_id)
+ errmsg = self.tagger.validate_tags(tags)
+ if errmsg:
+ raise ValidationException(errmsg)
+ if len(tags) > Directory.MAX_TAGS_PER_DIRECTORY:
+ raise TagLimitExceededException("Tag limit exceeded")
+ self.tagger.tag_resource(resource_id, tags)
+
+ def remove_tags_from_resource(self, resource_id, tag_keys):
+ """Removes tags from a directory."""
+ self._validate_directory_id(resource_id)
+ self.tagger.untag_resource_using_names(resource_id, tag_keys)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_tags_for_resource(self, resource_id):
+ """List all tags on a directory."""
+ self._validate_directory_id(resource_id)
+ return self.tagger.list_tags_for_resource(resource_id).get("Tags")
+
+
+ds_backends = BackendDict(DirectoryServiceBackend, service_name="ds")
diff --git a/contrib/python/moto/py3/moto/ds/responses.py b/contrib/python/moto/py3/moto/ds/responses.py
new file mode 100644
index 0000000000..9d852a9659
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/responses.py
@@ -0,0 +1,163 @@
+"""Handles Directory Service requests, invokes methods, returns responses."""
+import json
+
+from moto.core.exceptions import InvalidToken
+from moto.core.responses import BaseResponse
+from moto.ds.exceptions import InvalidNextTokenException
+from moto.ds.models import ds_backends
+
+
+class DirectoryServiceResponse(BaseResponse):
+ """Handler for DirectoryService requests and responses."""
+
+ @property
+ def ds_backend(self):
+ """Return backend instance specific for this region."""
+ return ds_backends[self.region]
+
+ def connect_directory(self):
+ """Create an AD Connector to connect to a self-managed directory."""
+ name = self._get_param("Name")
+ short_name = self._get_param("ShortName")
+ password = self._get_param("Password")
+ description = self._get_param("Description")
+ size = self._get_param("Size")
+ connect_settings = self._get_param("ConnectSettings")
+ tags = self._get_param("Tags", [])
+ directory_id = self.ds_backend.connect_directory(
+ region=self.region,
+ name=name,
+ short_name=short_name,
+ password=password,
+ description=description,
+ size=size,
+ connect_settings=connect_settings,
+ tags=tags,
+ )
+ return json.dumps({"DirectoryId": directory_id})
+
+ def create_directory(self):
+ """Create a Simple AD directory."""
+ name = self._get_param("Name")
+ short_name = self._get_param("ShortName")
+ password = self._get_param("Password")
+ description = self._get_param("Description")
+ size = self._get_param("Size")
+ vpc_settings = self._get_param("VpcSettings")
+ tags = self._get_param("Tags", [])
+ directory_id = self.ds_backend.create_directory(
+ region=self.region,
+ name=name,
+ short_name=short_name,
+ password=password,
+ description=description,
+ size=size,
+ vpc_settings=vpc_settings,
+ tags=tags,
+ )
+ return json.dumps({"DirectoryId": directory_id})
+
+ def create_alias(self):
+ """Create an alias and assign the alias to the directory."""
+ directory_id = self._get_param("DirectoryId")
+ alias = self._get_param("Alias")
+ response = self.ds_backend.create_alias(directory_id, alias)
+ return json.dumps(response)
+
+ def create_microsoft_ad(self):
+ """Create a Microsoft AD directory."""
+ name = self._get_param("Name")
+ short_name = self._get_param("ShortName")
+ password = self._get_param("Password")
+ description = self._get_param("Description")
+ vpc_settings = self._get_param("VpcSettings")
+ edition = self._get_param("Edition")
+ tags = self._get_param("Tags", [])
+ directory_id = self.ds_backend.create_microsoft_ad(
+ region=self.region,
+ name=name,
+ short_name=short_name,
+ password=password,
+ description=description,
+ vpc_settings=vpc_settings,
+ edition=edition,
+ tags=tags,
+ )
+ return json.dumps({"DirectoryId": directory_id})
+
+ def delete_directory(self):
+ """Delete a Directory Service directory."""
+ directory_id_arg = self._get_param("DirectoryId")
+ directory_id = self.ds_backend.delete_directory(directory_id_arg)
+ return json.dumps({"DirectoryId": directory_id})
+
+ def describe_directories(self):
+ """Return directory info for the given IDs or all IDs."""
+ directory_ids = self._get_param("DirectoryIds")
+ next_token = self._get_param("NextToken")
+ limit = self._get_int_param("Limit")
+ try:
+ (directories, next_token) = self.ds_backend.describe_directories(
+ directory_ids, next_token=next_token, limit=limit
+ )
+ except InvalidToken as exc:
+ raise InvalidNextTokenException() from exc
+
+ response = {"DirectoryDescriptions": [x.to_dict() for x in directories]}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def disable_sso(self):
+ """Disable single-sign on for a directory."""
+ directory_id = self._get_param("DirectoryId")
+ username = self._get_param("UserName")
+ password = self._get_param("Password")
+ self.ds_backend.disable_sso(directory_id, username, password)
+ return ""
+
+ def enable_sso(self):
+ """Enable single-sign on for a directory."""
+ directory_id = self._get_param("DirectoryId")
+ username = self._get_param("UserName")
+ password = self._get_param("Password")
+ self.ds_backend.enable_sso(directory_id, username, password)
+ return ""
+
+ def get_directory_limits(self):
+ """Return directory limit information for the current region."""
+ limits = self.ds_backend.get_directory_limits()
+ return json.dumps({"DirectoryLimits": limits})
+
+ def add_tags_to_resource(self):
+ """Add or overwrite on or more tags for specified directory."""
+ resource_id = self._get_param("ResourceId")
+ tags = self._get_param("Tags")
+ self.ds_backend.add_tags_to_resource(resource_id=resource_id, tags=tags)
+ return ""
+
+ def remove_tags_from_resource(self):
+ """Removes tags from a directory."""
+ resource_id = self._get_param("ResourceId")
+ tag_keys = self._get_param("TagKeys")
+ self.ds_backend.remove_tags_from_resource(
+ resource_id=resource_id, tag_keys=tag_keys
+ )
+ return ""
+
+ def list_tags_for_resource(self):
+ """Lists all tags on a directory."""
+ resource_id = self._get_param("ResourceId")
+ next_token = self._get_param("NextToken")
+ limit = self._get_param("Limit")
+ try:
+ (tags, next_token) = self.ds_backend.list_tags_for_resource(
+ resource_id=resource_id, next_token=next_token, limit=limit
+ )
+ except InvalidToken as exc:
+ raise InvalidNextTokenException() from exc
+
+ response = {"Tags": tags}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/ds/urls.py b/contrib/python/moto/py3/moto/ds/urls.py
new file mode 100644
index 0000000000..4ee1c8e426
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/urls.py
@@ -0,0 +1,11 @@
+"""ds base URL and path."""
+from .responses import DirectoryServiceResponse
+
+url_bases = [
+ r"https?://ds\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": DirectoryServiceResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/ds/utils.py b/contrib/python/moto/py3/moto/ds/utils.py
new file mode 100644
index 0000000000..f297d393b3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/utils.py
@@ -0,0 +1,16 @@
+"""Pagination control model for DirectoryService."""
+
+PAGINATION_MODEL = {
+ "describe_directories": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 100, # This should be the sum of the directory limits
+ "unique_attribute": "directory_id",
+ },
+ "list_tags_for_resource": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 50,
+ "unique_attribute": "Key",
+ },
+}
diff --git a/contrib/python/moto/py3/moto/ds/validations.py b/contrib/python/moto/py3/moto/ds/validations.py
new file mode 100644
index 0000000000..03d6b4216e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ds/validations.py
@@ -0,0 +1,147 @@
+"""DirectoryServiceBackend checks that result in ValidationException.
+
+Note that ValidationExceptions are accumulative.
+"""
+import re
+
+from moto.ds.exceptions import DsValidationException
+
+
+def validate_args(validators):
+ """Raise exception if any of the validations fails.
+
+ validators is a list of tuples each containing the following:
+ (printable field name, field value)
+
+ The error messages are accumulated before the exception is raised.
+ """
+ validation_map = {
+ "alias": validate_alias,
+ "description": validate_description,
+ "directoryId": validate_directory_id,
+ "connectSettings.customerDnsIps": validate_dns_ips,
+ "edition": validate_edition,
+ "name": validate_name,
+ "password": validate_password,
+ "shortName": validate_short_name,
+ "size": validate_size,
+ "ssoPassword": validate_sso_password,
+ "connectSettings.vpcSettings.subnetIds": validate_subnet_ids,
+ "connectSettings.customerUserName": validate_user_name,
+ "userName": validate_user_name,
+ "vpcSettings.subnetIds": validate_subnet_ids,
+ }
+ err_msgs = []
+ # This eventually could be a switch (python 3.10), elminating the need
+ # for the above map and individual functions.
+ for (fieldname, value) in validators:
+ msg = validation_map[fieldname](value)
+ if msg:
+ err_msgs.append((fieldname, value, msg))
+ if err_msgs:
+ raise DsValidationException(err_msgs)
+
+
+def validate_alias(value):
+ """Raise exception if alias fails to conform to length and constraints."""
+ if len(value) > 62:
+ return "have length less than or equal to 62"
+
+ alias_pattern = r"^(?!D-|d-)([\da-zA-Z]+)([-]*[\da-zA-Z])*$"
+ if not re.match(alias_pattern, value):
+ return rf"satisfy regular expression pattern: {alias_pattern}"
+ return ""
+
+
+def validate_description(value):
+ """Raise exception if description exceeds length."""
+ if value and len(value) > 128:
+ return "have length less than or equal to 128"
+ return ""
+
+
+def validate_directory_id(value):
+ """Raise exception if the directory id is invalid."""
+ id_pattern = r"^d-[0-9a-f]{10}$"
+ if not re.match(id_pattern, value):
+ return rf"satisfy regular expression pattern: {id_pattern}"
+ return ""
+
+
+def validate_dns_ips(value):
+ """Raise exception if DNS IPs fail to match constraints."""
+ dnsip_pattern = (
+ r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}"
+ r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
+ )
+ for dnsip in value:
+ if not re.match(dnsip_pattern, dnsip):
+ return rf"satisfy regular expression pattern: {dnsip_pattern}"
+ return ""
+
+
+def validate_edition(value):
+ """Raise exception if edition not one of the allowed values."""
+ if value and value not in ["Enterprise", "Standard"]:
+ return "satisfy enum value set: [Enterprise, Standard]"
+ return ""
+
+
+def validate_name(value):
+ """Raise exception if name fails to match constraints."""
+ name_pattern = r"^([a-zA-Z0-9]+[\.-])+([a-zA-Z0-9])+$"
+ if not re.match(name_pattern, value):
+ return rf"satisfy regular expression pattern: {name_pattern}"
+ return ""
+
+
+def validate_password(value):
+ """Raise exception if password fails to match constraints."""
+ passwd_pattern = (
+ r"^(?=^.{8,64}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|"
+ r"(?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z])|"
+ r"(?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z])|"
+ r"(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s]))^.*$"
+ )
+ if not re.match(passwd_pattern, value):
+ return rf"satisfy regular expression pattern: {passwd_pattern}"
+ return ""
+
+
+def validate_short_name(value):
+ """Raise exception if short name fails to match constraints."""
+ short_name_pattern = r'^[^\/:*?"<>|.]+[^\/:*?"<>|]*$'
+ if value and not re.match(short_name_pattern, value):
+ return rf"satisfy regular expression pattern: {short_name_pattern}"
+ return ""
+
+
+def validate_size(value):
+ """Raise exception if size fails to match constraints."""
+ if value.lower() not in ["small", "large"]:
+ return "satisfy enum value set: [Small, Large]"
+ return ""
+
+
+def validate_sso_password(value):
+ """Raise exception is SSO password exceeds length."""
+ if value and len(value) > 128:
+ return "have length less than or equal to 128"
+ return ""
+
+
+def validate_subnet_ids(value):
+ """Raise exception is subnet IDs fail to match constraints."""
+ subnet_id_pattern = r"^(subnet-[0-9a-f]{8}|subnet-[0-9a-f]{17})$"
+ for subnet in value:
+ if not re.match(subnet_id_pattern, subnet):
+ return rf"satisfy regular expression pattern: {subnet_id_pattern}"
+ return ""
+
+
+def validate_user_name(value):
+ """Raise exception is username fails to match constraints."""
+ username_pattern = r"^[a-zA-Z0-9._-]+$"
+ if value and not re.match(username_pattern, value):
+ return rf"satisfy regular expression pattern: {username_pattern}"
+ return ""
diff --git a/contrib/python/moto/py3/moto/dynamodb/__init__.py b/contrib/python/moto/py3/moto/dynamodb/__init__.py
new file mode 100644
index 0000000000..0f01dbaf2d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/__init__.py
@@ -0,0 +1,5 @@
+from moto.dynamodb.models import dynamodb_backends
+from ..core.models import base_decorator
+
+dynamodb_backend = dynamodb_backends["us-east-1"]
+mock_dynamodb = base_decorator(dynamodb_backends)
diff --git a/contrib/python/moto/py3/moto/dynamodb/comparisons.py b/contrib/python/moto/py3/moto/dynamodb/comparisons.py
new file mode 100644
index 0000000000..ce7dc5a95a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/comparisons.py
@@ -0,0 +1,1222 @@
+import re
+from collections import deque
+from collections import namedtuple
+
+from moto.dynamodb.exceptions import ConditionAttributeIsReservedKeyword
+from moto.dynamodb.parsing.reserved_keywords import ReservedKeywords
+
+
+def get_filter_expression(expr, names, values):
+ """
+ Parse a filter expression into an Op.
+
+ Examples
+ expr = 'Id > 5 AND attribute_exists(test) AND Id BETWEEN 5 AND 6 OR length < 6 AND contains(test, 1) AND 5 IN (4,5, 6) OR (Id < 5 AND 5 > Id)'
+ expr = 'Id > 5 AND Subs < 7'
+ """
+ parser = ConditionExpressionParser(expr, names, values)
+ return parser.parse()
+
+
+def get_expected(expected):
+ """
+ Parse a filter expression into an Op.
+
+ Examples
+ expr = 'Id > 5 AND attribute_exists(test) AND Id BETWEEN 5 AND 6 OR length < 6 AND contains(test, 1) AND 5 IN (4,5, 6) OR (Id < 5 AND 5 > Id)'
+ expr = 'Id > 5 AND Subs < 7'
+ """
+ ops = {
+ "EQ": OpEqual,
+ "NE": OpNotEqual,
+ "LE": OpLessThanOrEqual,
+ "LT": OpLessThan,
+ "GE": OpGreaterThanOrEqual,
+ "GT": OpGreaterThan,
+ "NOT_NULL": FuncAttrExists,
+ "NULL": FuncAttrNotExists,
+ "CONTAINS": FuncContains,
+ "NOT_CONTAINS": FuncNotContains,
+ "BEGINS_WITH": FuncBeginsWith,
+ "IN": FuncIn,
+ "BETWEEN": FuncBetween,
+ }
+
+ # NOTE: Always uses ConditionalOperator=AND
+ conditions = []
+ for key, cond in expected.items():
+ path = AttributePath([key])
+ if "Exists" in cond:
+ if cond["Exists"]:
+ conditions.append(FuncAttrExists(path))
+ else:
+ conditions.append(FuncAttrNotExists(path))
+ elif "Value" in cond:
+ conditions.append(OpEqual(path, AttributeValue(cond["Value"])))
+ elif "ComparisonOperator" in cond:
+ operator_name = cond["ComparisonOperator"]
+ values = [AttributeValue(v) for v in cond.get("AttributeValueList", [])]
+ OpClass = ops[operator_name]
+ conditions.append(OpClass(path, *values))
+
+ # NOTE: Ignore ConditionalOperator
+ ConditionalOp = OpAnd
+ if conditions:
+ output = conditions[0]
+ for condition in conditions[1:]:
+ output = ConditionalOp(output, condition)
+ else:
+ return OpDefault(None, None)
+
+ return output
+
+
+class Op(object):
+ """
+ Base class for a FilterExpression operator
+ """
+
+ OP = ""
+
+ def __init__(self, lhs, rhs):
+ self.lhs = lhs
+ self.rhs = rhs
+
+ def expr(self, item):
+ raise NotImplementedError("Expr not defined for {0}".format(type(self)))
+
+ def __repr__(self):
+ return "({0} {1} {2})".format(self.lhs, self.OP, self.rhs)
+
+
+# TODO add tests for all of these
+
+EQ_FUNCTION = lambda item_value, test_value: item_value == test_value # noqa
+NE_FUNCTION = lambda item_value, test_value: item_value != test_value # noqa
+LE_FUNCTION = lambda item_value, test_value: item_value <= test_value # noqa
+LT_FUNCTION = lambda item_value, test_value: item_value < test_value # noqa
+GE_FUNCTION = lambda item_value, test_value: item_value >= test_value # noqa
+GT_FUNCTION = lambda item_value, test_value: item_value > test_value # noqa
+
+COMPARISON_FUNCS = {
+ "EQ": EQ_FUNCTION,
+ "=": EQ_FUNCTION,
+ "NE": NE_FUNCTION,
+ "!=": NE_FUNCTION,
+ "LE": LE_FUNCTION,
+ "<=": LE_FUNCTION,
+ "LT": LT_FUNCTION,
+ "<": LT_FUNCTION,
+ "GE": GE_FUNCTION,
+ ">=": GE_FUNCTION,
+ "GT": GT_FUNCTION,
+ ">": GT_FUNCTION,
+ # NULL means the value should not exist at all
+ "NULL": lambda item_value: False,
+ # NOT_NULL means the value merely has to exist, and values of None are valid
+ "NOT_NULL": lambda item_value: True,
+ "CONTAINS": lambda item_value, test_value: test_value in item_value,
+ "NOT_CONTAINS": lambda item_value, test_value: test_value not in item_value,
+ "BEGINS_WITH": lambda item_value, test_value: item_value.startswith(test_value),
+ "IN": lambda item_value, *test_values: item_value in test_values,
+ "BETWEEN": lambda item_value, lower_test_value, upper_test_value: lower_test_value
+ <= item_value
+ <= upper_test_value,
+}
+
+
+def get_comparison_func(range_comparison):
+ return COMPARISON_FUNCS.get(range_comparison)
+
+
+class RecursionStopIteration(StopIteration):
+ pass
+
+
+class ConditionExpressionParser:
+ def __init__(
+ self,
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ ):
+ self.condition_expression = condition_expression
+ self.expression_attribute_names = expression_attribute_names
+ self.expression_attribute_values = expression_attribute_values
+
+ def parse(self):
+ """Returns a syntax tree for the expression.
+
+ The tree, and all of the nodes in the tree are a tuple of
+ - kind: str
+ - children/value:
+ list of nodes for parent nodes
+ value for leaf nodes
+
+ Raises ValueError if the condition expression is invalid
+ Raises KeyError if expression attribute names/values are invalid
+
+ Here are the types of nodes that can be returned.
+ The types of child nodes are denoted with a colon (:).
+ An arbitrary number of children is denoted with ...
+
+ Condition:
+ ('OR', [lhs : Condition, rhs : Condition])
+ ('AND', [lhs: Condition, rhs: Condition])
+ ('NOT', [argument: Condition])
+ ('PARENTHESES', [argument: Condition])
+ ('FUNCTION', [('LITERAL', function_name: str), argument: Operand, ...])
+ ('BETWEEN', [query: Operand, low: Operand, high: Operand])
+ ('IN', [query: Operand, possible_value: Operand, ...])
+ ('COMPARISON', [lhs: Operand, ('LITERAL', comparator: str), rhs: Operand])
+
+ Operand:
+ ('EXPRESSION_ATTRIBUTE_VALUE', value: dict, e.g. {'S': 'foobar'})
+ ('PATH', [('LITERAL', path_element: str), ...])
+ NOTE: Expression attribute names will be expanded
+ ('FUNCTION', [('LITERAL', 'size'), argument: Operand])
+
+ Literal:
+ ('LITERAL', value: str)
+
+ """
+ if not self.condition_expression:
+ return OpDefault(None, None)
+ nodes = self._lex_condition_expression()
+ nodes = self._parse_paths(nodes)
+ # NOTE: The docs say that functions should be parsed after
+ # IN, BETWEEN, and comparisons like <=.
+ # However, these expressions are invalid as function arguments,
+ # so it is okay to parse functions first. This needs to be done
+ # to interpret size() correctly as an operand.
+ nodes = self._apply_functions(nodes)
+ nodes = self._apply_comparator(nodes)
+ nodes = self._apply_in(nodes)
+ nodes = self._apply_between(nodes)
+ nodes = self._apply_parens_and_booleans(nodes)
+ node = nodes[0]
+ op = self._make_op_condition(node)
+ return op
+
+ class Kind:
+ """Enum defining types of nodes in the syntax tree."""
+
+ # Condition nodes
+ # ---------------
+ OR = "OR"
+ AND = "AND"
+ NOT = "NOT"
+ PARENTHESES = "PARENTHESES"
+ FUNCTION = "FUNCTION"
+ BETWEEN = "BETWEEN"
+ IN = "IN"
+ COMPARISON = "COMPARISON"
+
+ # Operand nodes
+ # -------------
+ EXPRESSION_ATTRIBUTE_VALUE = "EXPRESSION_ATTRIBUTE_VALUE"
+ PATH = "PATH"
+
+ # Literal nodes
+ # --------------
+ LITERAL = "LITERAL"
+
+ class Nonterminal:
+ """Enum defining nonterminals for productions."""
+
+ CONDITION = "CONDITION"
+ OPERAND = "OPERAND"
+ COMPARATOR = "COMPARATOR"
+ FUNCTION_NAME = "FUNCTION_NAME"
+ IDENTIFIER = "IDENTIFIER"
+ AND = "AND"
+ OR = "OR"
+ NOT = "NOT"
+ BETWEEN = "BETWEEN"
+ IN = "IN"
+ COMMA = "COMMA"
+ LEFT_PAREN = "LEFT_PAREN"
+ RIGHT_PAREN = "RIGHT_PAREN"
+ WHITESPACE = "WHITESPACE"
+
+ Node = namedtuple("Node", ["nonterminal", "kind", "text", "value", "children"])
+
+ @classmethod
+ def raise_exception_if_keyword(cls, attribute):
+ if attribute.upper() in ReservedKeywords.get_reserved_keywords():
+ raise ConditionAttributeIsReservedKeyword(attribute)
+
+ def _lex_condition_expression(self):
+ nodes = deque()
+ remaining_expression = self.condition_expression
+ while remaining_expression:
+ node, remaining_expression = self._lex_one_node(remaining_expression)
+ if node.nonterminal == self.Nonterminal.WHITESPACE:
+ continue
+ nodes.append(node)
+ return nodes
+
+ def _lex_one_node(self, remaining_expression):
+ # TODO: Handle indexing like [1]
+ attribute_regex = r"(:|#)?[A-z0-9\-_]+"
+ patterns = [
+ (self.Nonterminal.WHITESPACE, re.compile(r"^ +")),
+ (
+ self.Nonterminal.COMPARATOR,
+ re.compile(
+ "^("
+ # Put long expressions first for greedy matching
+ "<>|"
+ "<=|"
+ ">=|"
+ "=|"
+ "<|"
+ ">)"
+ ),
+ ),
+ (
+ self.Nonterminal.OPERAND,
+ re.compile(
+ r"^{attribute_regex}(\.{attribute_regex}|\[[0-9]\])*".format(
+ attribute_regex=attribute_regex
+ )
+ ),
+ ),
+ (self.Nonterminal.COMMA, re.compile(r"^,")),
+ (self.Nonterminal.LEFT_PAREN, re.compile(r"^\(")),
+ (self.Nonterminal.RIGHT_PAREN, re.compile(r"^\)")),
+ ]
+
+ for nonterminal, pattern in patterns:
+ match = pattern.match(remaining_expression)
+ if match:
+ match_text = match.group()
+ break
+ else: # pragma: no cover
+ raise ValueError(
+ "Cannot parse condition starting at:{}".format(remaining_expression)
+ )
+
+ node = self.Node(
+ nonterminal=nonterminal,
+ kind=self.Kind.LITERAL,
+ text=match_text,
+ value=match_text,
+ children=[],
+ )
+
+ remaining_expression = remaining_expression[len(match_text) :]
+
+ return node, remaining_expression
+
+ def _parse_paths(self, nodes):
+ output = deque()
+
+ while nodes:
+ node = nodes.popleft()
+
+ if node.nonterminal == self.Nonterminal.OPERAND:
+ path = node.value.replace("[", ".[").split(".")
+ children = [self._parse_path_element(name) for name in path]
+ if len(children) == 1:
+ child = children[0]
+ if child.nonterminal != self.Nonterminal.IDENTIFIER:
+ output.append(child)
+ continue
+ else:
+ for child in children:
+ self._assert(
+ child.nonterminal == self.Nonterminal.IDENTIFIER,
+ "Cannot use {} in path".format(child.text),
+ [node],
+ )
+ output.append(
+ self.Node(
+ nonterminal=self.Nonterminal.OPERAND,
+ kind=self.Kind.PATH,
+ text=node.text,
+ value=None,
+ children=children,
+ )
+ )
+ else:
+ output.append(node)
+ return output
+
+ def _parse_path_element(self, name):
+ reserved = {
+ "and": self.Nonterminal.AND,
+ "or": self.Nonterminal.OR,
+ "in": self.Nonterminal.IN,
+ "between": self.Nonterminal.BETWEEN,
+ "not": self.Nonterminal.NOT,
+ }
+
+ functions = {
+ "attribute_exists",
+ "attribute_not_exists",
+ "attribute_type",
+ "begins_with",
+ "contains",
+ "size",
+ }
+
+ if name.lower() in reserved:
+ # e.g. AND
+ nonterminal = reserved[name.lower()]
+ return self.Node(
+ nonterminal=nonterminal,
+ kind=self.Kind.LITERAL,
+ text=name,
+ value=name,
+ children=[],
+ )
+ elif name in functions:
+ # e.g. attribute_exists
+ return self.Node(
+ nonterminal=self.Nonterminal.FUNCTION_NAME,
+ kind=self.Kind.LITERAL,
+ text=name,
+ value=name,
+ children=[],
+ )
+ elif name.startswith(":"):
+ # e.g. :value0
+ return self.Node(
+ nonterminal=self.Nonterminal.OPERAND,
+ kind=self.Kind.EXPRESSION_ATTRIBUTE_VALUE,
+ text=name,
+ value=self._lookup_expression_attribute_value(name),
+ children=[],
+ )
+ elif name.startswith("#"):
+ # e.g. #name0
+ return self.Node(
+ nonterminal=self.Nonterminal.IDENTIFIER,
+ kind=self.Kind.LITERAL,
+ text=name,
+ value=self._lookup_expression_attribute_name(name),
+ children=[],
+ )
+ elif name.startswith("["):
+ # e.g. [123]
+ if not name.endswith("]"): # pragma: no cover
+ raise ValueError("Bad path element {}".format(name))
+ return self.Node(
+ nonterminal=self.Nonterminal.IDENTIFIER,
+ kind=self.Kind.LITERAL,
+ text=name,
+ value=int(name[1:-1]),
+ children=[],
+ )
+ else:
+ # e.g. ItemId
+ self.raise_exception_if_keyword(name)
+ return self.Node(
+ nonterminal=self.Nonterminal.IDENTIFIER,
+ kind=self.Kind.LITERAL,
+ text=name,
+ value=name,
+ children=[],
+ )
+
+ def _lookup_expression_attribute_value(self, name):
+ return self.expression_attribute_values[name]
+
+ def _lookup_expression_attribute_name(self, name):
+ return self.expression_attribute_names[name]
+
+ # NOTE: The following constructions are ordered from high precedence to low precedence
+ # according to
+ # https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Precedence
+ #
+ # = <> < <= > >=
+ # IN
+ # BETWEEN
+ # attribute_exists attribute_not_exists begins_with contains
+ # Parentheses
+ # NOT
+ # AND
+ # OR
+ #
+ # The grammar is taken from
+ # https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Syntax
+ #
+ # condition-expression ::=
+ # operand comparator operand
+ # operand BETWEEN operand AND operand
+ # operand IN ( operand (',' operand (, ...) ))
+ # function
+ # condition AND condition
+ # condition OR condition
+ # NOT condition
+ # ( condition )
+ #
+ # comparator ::=
+ # =
+ # <>
+ # <
+ # <=
+ # >
+ # >=
+ #
+ # function ::=
+ # attribute_exists (path)
+ # attribute_not_exists (path)
+ # attribute_type (path, type)
+ # begins_with (path, substr)
+ # contains (path, operand)
+ # size (path)
+
+ def _matches(self, nodes, production):
+ """Check if the nodes start with the given production.
+
+ Parameters
+ ----------
+ nodes: list of Node
+ production: list of str
+ The name of a Nonterminal, or '*' for anything
+
+ """
+ if len(nodes) < len(production):
+ return False
+ for i in range(len(production)):
+ if production[i] == "*":
+ continue
+ expected = getattr(self.Nonterminal, production[i])
+ if nodes[i].nonterminal != expected:
+ return False
+ return True
+
+ def _apply_comparator(self, nodes):
+ """Apply condition := operand comparator operand."""
+ output = deque()
+
+ while nodes:
+ if self._matches(nodes, ["*", "COMPARATOR"]):
+ self._assert(
+ self._matches(nodes, ["OPERAND", "COMPARATOR", "OPERAND"]),
+ "Bad comparison",
+ list(nodes)[:3],
+ )
+ lhs = nodes.popleft()
+ comparator = nodes.popleft()
+ rhs = nodes.popleft()
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.COMPARISON,
+ text=" ".join([lhs.text, comparator.text, rhs.text]),
+ value=None,
+ children=[lhs, comparator, rhs],
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+ return output
+
+ def _apply_in(self, nodes):
+ """Apply condition := operand IN ( operand , ... )."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["*", "IN"]):
+ self._assert(
+ self._matches(nodes, ["OPERAND", "IN", "LEFT_PAREN"]),
+ "Bad IN expression",
+ list(nodes)[:3],
+ )
+ lhs = nodes.popleft()
+ in_node = nodes.popleft()
+ left_paren = nodes.popleft()
+ all_children = [lhs, in_node, left_paren]
+ rhs = []
+ while True:
+ if self._matches(nodes, ["OPERAND", "COMMA"]):
+ operand = nodes.popleft()
+ separator = nodes.popleft()
+ all_children += [operand, separator]
+ rhs.append(operand)
+ elif self._matches(nodes, ["OPERAND", "RIGHT_PAREN"]):
+ operand = nodes.popleft()
+ separator = nodes.popleft()
+ all_children += [operand, separator]
+ rhs.append(operand)
+ break # Close
+ else:
+ self._assert(False, "Bad IN expression starting at", nodes)
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.IN,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=[lhs] + rhs,
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+ return output
+
+ def _apply_between(self, nodes):
+ """Apply condition := operand BETWEEN operand AND operand."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["*", "BETWEEN"]):
+ self._assert(
+ self._matches(
+ nodes, ["OPERAND", "BETWEEN", "OPERAND", "AND", "OPERAND"]
+ ),
+ "Bad BETWEEN expression",
+ list(nodes)[:5],
+ )
+ lhs = nodes.popleft()
+ between_node = nodes.popleft()
+ low = nodes.popleft()
+ and_node = nodes.popleft()
+ high = nodes.popleft()
+ all_children = [lhs, between_node, low, and_node, high]
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.BETWEEN,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=[lhs, low, high],
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+ return output
+
+ def _apply_functions(self, nodes):
+ """Apply condition := function_name (operand , ...)."""
+ output = deque()
+ either_kind = {self.Kind.PATH, self.Kind.EXPRESSION_ATTRIBUTE_VALUE}
+ expected_argument_kind_map = {
+ "attribute_exists": [{self.Kind.PATH}],
+ "attribute_not_exists": [{self.Kind.PATH}],
+ "attribute_type": [either_kind, {self.Kind.EXPRESSION_ATTRIBUTE_VALUE}],
+ "begins_with": [either_kind, either_kind],
+ "contains": [either_kind, either_kind],
+ "size": [{self.Kind.PATH}],
+ }
+ while nodes:
+ if self._matches(nodes, ["FUNCTION_NAME"]):
+ self._assert(
+ self._matches(
+ nodes, ["FUNCTION_NAME", "LEFT_PAREN", "OPERAND", "*"]
+ ),
+ "Bad function expression at",
+ list(nodes)[:4],
+ )
+ function_name = nodes.popleft()
+ left_paren = nodes.popleft()
+ all_children = [function_name, left_paren]
+ arguments = []
+ while True:
+ if self._matches(nodes, ["OPERAND", "COMMA"]):
+ operand = nodes.popleft()
+ separator = nodes.popleft()
+ all_children += [operand, separator]
+ arguments.append(operand)
+ elif self._matches(nodes, ["OPERAND", "RIGHT_PAREN"]):
+ operand = nodes.popleft()
+ separator = nodes.popleft()
+ all_children += [operand, separator]
+ arguments.append(operand)
+ break # Close paren
+ else:
+ self._assert(
+ False,
+ "Bad function expression",
+ all_children + list(nodes)[:2],
+ )
+ expected_kinds = expected_argument_kind_map[function_name.value]
+ self._assert(
+ len(arguments) == len(expected_kinds),
+ "Wrong number of arguments in",
+ all_children,
+ )
+ for i in range(len(expected_kinds)):
+ self._assert(
+ arguments[i].kind in expected_kinds[i],
+ "Wrong type for argument %d in" % i,
+ all_children,
+ )
+ if function_name.value == "size":
+ nonterminal = self.Nonterminal.OPERAND
+ else:
+ nonterminal = self.Nonterminal.CONDITION
+ nodes.appendleft(
+ self.Node(
+ nonterminal=nonterminal,
+ kind=self.Kind.FUNCTION,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=[function_name] + arguments,
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+ return output
+
+ def _apply_parens_and_booleans(self, nodes, left_paren=None):
+ """Apply condition := ( condition ) and booleans."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["LEFT_PAREN"]):
+ parsed = self._apply_parens_and_booleans(
+ nodes, left_paren=nodes.popleft()
+ )
+ self._assert(len(parsed) >= 1, "Failed to close parentheses at", nodes)
+ parens = parsed.popleft()
+ self._assert(
+ parens.kind == self.Kind.PARENTHESES,
+ "Failed to close parentheses at",
+ nodes,
+ )
+ output.append(parens)
+ nodes = parsed
+ elif self._matches(nodes, ["RIGHT_PAREN"]):
+ self._assert(left_paren is not None, "Unmatched ) at", nodes)
+ close_paren = nodes.popleft()
+ children = self._apply_booleans(output)
+ all_children = [left_paren] + list(children) + [close_paren]
+ return deque(
+ [
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.PARENTHESES,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=list(children),
+ )
+ ]
+ + list(nodes)
+ )
+ else:
+ output.append(nodes.popleft())
+
+ self._assert(left_paren is None, "Unmatched ( at", list(output))
+ return self._apply_booleans(output)
+
+ def _apply_booleans(self, nodes):
+ """Apply and, or, and not constructions."""
+ nodes = self._apply_not(nodes)
+ nodes = self._apply_and(nodes)
+ nodes = self._apply_or(nodes)
+ # The expression should reduce to a single condition
+ self._assert(len(nodes) == 1, "Unexpected expression at", list(nodes)[1:])
+ self._assert(
+ nodes[0].nonterminal == self.Nonterminal.CONDITION,
+ "Incomplete condition",
+ nodes,
+ )
+ return nodes
+
+ def _apply_not(self, nodes):
+ """Apply condition := NOT condition."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["NOT"]):
+ self._assert(
+ self._matches(nodes, ["NOT", "CONDITION"]),
+ "Bad NOT expression",
+ list(nodes)[:2],
+ )
+ not_node = nodes.popleft()
+ child = nodes.popleft()
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.NOT,
+ text=" ".join([not_node.text, child.text]),
+ value=None,
+ children=[child],
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+
+ return output
+
+ def _apply_and(self, nodes):
+ """Apply condition := condition AND condition."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["*", "AND"]):
+ self._assert(
+ self._matches(nodes, ["CONDITION", "AND", "CONDITION"]),
+ "Bad AND expression",
+ list(nodes)[:3],
+ )
+ lhs = nodes.popleft()
+ and_node = nodes.popleft()
+ rhs = nodes.popleft()
+ all_children = [lhs, and_node, rhs]
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.AND,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=[lhs, rhs],
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+
+ return output
+
+ def _apply_or(self, nodes):
+ """Apply condition := condition OR condition."""
+ output = deque()
+ while nodes:
+ if self._matches(nodes, ["*", "OR"]):
+ self._assert(
+ self._matches(nodes, ["CONDITION", "OR", "CONDITION"]),
+ "Bad OR expression",
+ list(nodes)[:3],
+ )
+ lhs = nodes.popleft()
+ or_node = nodes.popleft()
+ rhs = nodes.popleft()
+ all_children = [lhs, or_node, rhs]
+ nodes.appendleft(
+ self.Node(
+ nonterminal=self.Nonterminal.CONDITION,
+ kind=self.Kind.OR,
+ text=" ".join([t.text for t in all_children]),
+ value=None,
+ children=[lhs, rhs],
+ )
+ )
+ else:
+ output.append(nodes.popleft())
+
+ return output
+
+ def _make_operand(self, node):
+ if node.kind == self.Kind.PATH:
+ return AttributePath([child.value for child in node.children])
+ elif node.kind == self.Kind.EXPRESSION_ATTRIBUTE_VALUE:
+ return AttributeValue(node.value)
+ elif node.kind == self.Kind.FUNCTION:
+ # size()
+ function_node = node.children[0]
+ arguments = node.children[1:]
+ function_name = function_node.value
+ arguments = [self._make_operand(arg) for arg in arguments]
+ return FUNC_CLASS[function_name](*arguments)
+ else: # pragma: no cover
+ raise ValueError("Unknown operand: %r" % node)
+
+ def _make_op_condition(self, node):
+ if node.kind == self.Kind.OR:
+ lhs, rhs = node.children
+ return OpOr(self._make_op_condition(lhs), self._make_op_condition(rhs))
+ elif node.kind == self.Kind.AND:
+ lhs, rhs = node.children
+ return OpAnd(self._make_op_condition(lhs), self._make_op_condition(rhs))
+ elif node.kind == self.Kind.NOT:
+ (child,) = node.children
+ return OpNot(self._make_op_condition(child))
+ elif node.kind == self.Kind.PARENTHESES:
+ (child,) = node.children
+ return self._make_op_condition(child)
+ elif node.kind == self.Kind.FUNCTION:
+ function_node = node.children[0]
+ arguments = node.children[1:]
+ function_name = function_node.value
+ arguments = [self._make_operand(arg) for arg in arguments]
+ return FUNC_CLASS[function_name](*arguments)
+ elif node.kind == self.Kind.BETWEEN:
+ query, low, high = node.children
+ return FuncBetween(
+ self._make_operand(query),
+ self._make_operand(low),
+ self._make_operand(high),
+ )
+ elif node.kind == self.Kind.IN:
+ query = node.children[0]
+ possible_values = node.children[1:]
+ query = self._make_operand(query)
+ possible_values = [self._make_operand(v) for v in possible_values]
+ return FuncIn(query, *possible_values)
+ elif node.kind == self.Kind.COMPARISON:
+ lhs, comparator, rhs = node.children
+ return COMPARATOR_CLASS[comparator.value](
+ self._make_operand(lhs), self._make_operand(rhs)
+ )
+ else: # pragma: no cover
+ raise ValueError("Unknown expression node kind %r" % node.kind)
+
+ def _assert(self, condition, message, nodes):
+ if not condition:
+ raise ValueError(message + " " + " ".join([t.text for t in nodes]))
+
+
+class Operand(object):
+ def expr(self, item):
+ raise NotImplementedError
+
+ def get_type(self, item):
+ raise NotImplementedError
+
+
+class AttributePath(Operand):
+ def __init__(self, path):
+ """Initialize the AttributePath.
+
+ Parameters
+ ----------
+ path: list of int/str
+
+ """
+ assert len(path) >= 1
+ self.path = path
+
+ def _get_attr(self, item):
+ if item is None:
+ return None
+
+ base = self.path[0]
+ if base not in item.attrs:
+ return None
+ attr = item.attrs[base]
+
+ for name in self.path[1:]:
+ attr = attr.child_attr(name)
+ if attr is None:
+ return None
+
+ return attr
+
+ def expr(self, item):
+ attr = self._get_attr(item)
+ if attr is None:
+ return None
+ else:
+ return attr.cast_value
+
+ def get_type(self, item):
+ attr = self._get_attr(item)
+ if attr is None:
+ return None
+ else:
+ return attr.type
+
+ def __repr__(self):
+ return ".".join(self.path)
+
+
+class AttributeValue(Operand):
+ def __init__(self, value):
+ """Initialize the AttributePath.
+
+ Parameters
+ ----------
+ value: dict
+ e.g. {'N': '1.234'}
+
+ """
+ self.type = list(value.keys())[0]
+ self.value = value[self.type]
+
+ def expr(self, item):
+ # TODO: Reuse DynamoType code
+ if self.type == "N":
+ try:
+ return int(self.value)
+ except ValueError:
+ return float(self.value)
+ elif self.type in ["SS", "NS", "BS"]:
+ sub_type = self.type[0]
+ return set([AttributeValue({sub_type: v}).expr(item) for v in self.value])
+ elif self.type == "L":
+ return [AttributeValue(v).expr(item) for v in self.value]
+ elif self.type == "M":
+ return dict(
+ [(k, AttributeValue(v).expr(item)) for k, v in self.value.items()]
+ )
+ else:
+ return self.value
+ return self.value
+
+ def get_type(self, item):
+ return self.type
+
+ def __repr__(self):
+ return repr(self.value)
+
+
+class OpDefault(Op):
+ OP = "NONE"
+
+ def expr(self, item):
+ """If no condition is specified, always True."""
+ return True
+
+
+class OpNot(Op):
+ OP = "NOT"
+
+ def __init__(self, lhs):
+ super().__init__(lhs, None)
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ return not lhs
+
+ def __str__(self):
+ return "({0} {1})".format(self.OP, self.lhs)
+
+
+class OpAnd(Op):
+ OP = "AND"
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ return lhs and self.rhs.expr(item)
+
+
+class OpLessThan(Op):
+ OP = "<"
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ # In python3 None is not a valid comparator when using < or > so must be handled specially
+ if lhs is not None and rhs is not None:
+ return lhs < rhs
+ else:
+ return False
+
+
+class OpGreaterThan(Op):
+ OP = ">"
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ # In python3 None is not a valid comparator when using < or > so must be handled specially
+ if lhs is not None and rhs is not None:
+ return lhs > rhs
+ else:
+ return False
+
+
+class OpEqual(Op):
+ OP = "="
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ return lhs == rhs
+
+
+class OpNotEqual(Op):
+ OP = "<>"
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ return lhs != rhs
+
+
+class OpLessThanOrEqual(Op):
+ OP = "<="
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ # In python3 None is not a valid comparator when using < or > so must be handled specially
+ if lhs is not None and rhs is not None:
+ return lhs <= rhs
+ else:
+ return False
+
+
+class OpGreaterThanOrEqual(Op):
+ OP = ">="
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ rhs = self.rhs.expr(item)
+ # In python3 None is not a valid comparator when using < or > so must be handled specially
+ if lhs is not None and rhs is not None:
+ return lhs >= rhs
+ else:
+ return False
+
+
+class OpOr(Op):
+ OP = "OR"
+
+ def expr(self, item):
+ lhs = self.lhs.expr(item)
+ return lhs or self.rhs.expr(item)
+
+
+class Func(object):
+ """
+ Base class for a FilterExpression function
+ """
+
+ FUNC = "Unknown"
+
+ def __init__(self, *arguments):
+ self.arguments = arguments
+
+ def expr(self, item):
+ raise NotImplementedError
+
+ def __repr__(self):
+ return "{0}({1})".format(
+ self.FUNC, " ".join([repr(arg) for arg in self.arguments])
+ )
+
+
+class FuncAttrExists(Func):
+ FUNC = "attribute_exists"
+
+ def __init__(self, attribute):
+ self.attr = attribute
+ super().__init__(attribute)
+
+ def expr(self, item):
+ return self.attr.get_type(item) is not None
+
+
+def FuncAttrNotExists(attribute):
+ return OpNot(FuncAttrExists(attribute))
+
+
+class FuncAttrType(Func):
+ FUNC = "attribute_type"
+
+ def __init__(self, attribute, _type):
+ self.attr = attribute
+ self.type = _type
+ super().__init__(attribute, _type)
+
+ def expr(self, item):
+ return self.attr.get_type(item) == self.type.expr(item)
+
+
+class FuncBeginsWith(Func):
+ FUNC = "begins_with"
+
+ def __init__(self, attribute, substr):
+ self.attr = attribute
+ self.substr = substr
+ super().__init__(attribute, substr)
+
+ def expr(self, item):
+ if self.attr.get_type(item) != "S":
+ return False
+ if self.substr.get_type(item) != "S":
+ return False
+ return self.attr.expr(item).startswith(self.substr.expr(item))
+
+
+class FuncContains(Func):
+ FUNC = "contains"
+
+ def __init__(self, attribute, operand):
+ self.attr = attribute
+ self.operand = operand
+ super().__init__(attribute, operand)
+
+ def expr(self, item):
+ if self.attr.get_type(item) in ("S", "SS", "NS", "BS", "L"):
+ try:
+ return self.operand.expr(item) in self.attr.expr(item)
+ except TypeError:
+ return False
+ return False
+
+
+def FuncNotContains(attribute, operand):
+ return OpNot(FuncContains(attribute, operand))
+
+
+class FuncSize(Func):
+ FUNC = "size"
+
+ def __init__(self, attribute):
+ self.attr = attribute
+ super().__init__(attribute)
+
+ def expr(self, item):
+ if self.attr.get_type(item) is None:
+ raise ValueError("Invalid attribute name {0}".format(self.attr))
+
+ if self.attr.get_type(item) in ("S", "SS", "NS", "B", "BS", "L", "M"):
+ return len(self.attr.expr(item))
+ raise ValueError("Invalid filter expression")
+
+
+class FuncBetween(Func):
+ FUNC = "BETWEEN"
+
+ def __init__(self, attribute, start, end):
+ self.attr = attribute
+ self.start = start
+ self.end = end
+ super().__init__(attribute, start, end)
+
+ def expr(self, item):
+ # In python3 None is not a valid comparator when using < or > so must be handled specially
+ start = self.start.expr(item)
+ attr = self.attr.expr(item)
+ end = self.end.expr(item)
+ # Need to verify whether start has a valid value
+ # Can't just check 'if start', because start could be 0, which is a valid integer
+ start_has_value = start is not None and (isinstance(start, int) or start)
+ end_has_value = end is not None and (isinstance(end, int) or end)
+ if start_has_value and attr and end_has_value:
+ return start <= attr <= end
+ elif start is None and attr is None:
+ # None is between None and None as well as None is between None and any number
+ return True
+ elif start is None and attr and end:
+ return attr <= end
+ else:
+ return False
+
+
+class FuncIn(Func):
+ FUNC = "IN"
+
+ def __init__(self, attribute, *possible_values):
+ self.attr = attribute
+ self.possible_values = possible_values
+ super().__init__(attribute, *possible_values)
+
+ def expr(self, item):
+ for possible_value in self.possible_values:
+ if self.attr.expr(item) == possible_value.expr(item):
+ return True
+
+ return False
+
+
+COMPARATOR_CLASS = {
+ "<": OpLessThan,
+ ">": OpGreaterThan,
+ "<=": OpLessThanOrEqual,
+ ">=": OpGreaterThanOrEqual,
+ "=": OpEqual,
+ "<>": OpNotEqual,
+}
+
+FUNC_CLASS = {
+ "attribute_exists": FuncAttrExists,
+ "attribute_not_exists": FuncAttrNotExists,
+ "attribute_type": FuncAttrType,
+ "begins_with": FuncBeginsWith,
+ "contains": FuncContains,
+ "size": FuncSize,
+ "between": FuncBetween,
+}
diff --git a/contrib/python/moto/py3/moto/dynamodb/exceptions.py b/contrib/python/moto/py3/moto/dynamodb/exceptions.py
new file mode 100644
index 0000000000..b08448aa91
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/exceptions.py
@@ -0,0 +1,318 @@
+import json
+from moto.core.exceptions import JsonRESTError
+from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH
+
+
+class DynamodbException(JsonRESTError):
+ pass
+
+
+class MockValidationException(DynamodbException):
+ error_type = "com.amazonaws.dynamodb.v20111205#ValidationException"
+
+ def __init__(self, message):
+ super().__init__(MockValidationException.error_type, message=message)
+ self.exception_msg = message
+
+
+class InvalidIndexNameError(MockValidationException):
+ pass
+
+
+class InvalidUpdateExpressionInvalidDocumentPath(MockValidationException):
+ invalid_update_expression_msg = (
+ "The document path provided in the update expression is invalid for update"
+ )
+
+ def __init__(self):
+ super().__init__(self.invalid_update_expression_msg)
+
+
+class InvalidUpdateExpression(MockValidationException):
+ invalid_update_expr_msg = "Invalid UpdateExpression: {update_expression_error}"
+
+ def __init__(self, update_expression_error):
+ self.update_expression_error = update_expression_error
+ super().__init__(
+ self.invalid_update_expr_msg.format(
+ update_expression_error=update_expression_error
+ )
+ )
+
+
+class InvalidConditionExpression(MockValidationException):
+ invalid_condition_expr_msg = (
+ "Invalid ConditionExpression: {condition_expression_error}"
+ )
+
+ def __init__(self, condition_expression_error):
+ self.condition_expression_error = condition_expression_error
+ super().__init__(
+ self.invalid_condition_expr_msg.format(
+ condition_expression_error=condition_expression_error
+ )
+ )
+
+
+class ConditionAttributeIsReservedKeyword(InvalidConditionExpression):
+ attribute_is_keyword_msg = (
+ "Attribute name is a reserved keyword; reserved keyword: {keyword}"
+ )
+
+ def __init__(self, keyword):
+ self.keyword = keyword
+ super().__init__(self.attribute_is_keyword_msg.format(keyword=keyword))
+
+
+class AttributeDoesNotExist(MockValidationException):
+ attr_does_not_exist_msg = (
+ "The provided expression refers to an attribute that does not exist in the item"
+ )
+
+ def __init__(self):
+ super().__init__(self.attr_does_not_exist_msg)
+
+
+class ProvidedKeyDoesNotExist(MockValidationException):
+ provided_key_does_not_exist_msg = (
+ "The provided key element does not match the schema"
+ )
+
+ def __init__(self):
+ super().__init__(self.provided_key_does_not_exist_msg)
+
+
+class ExpressionAttributeNameNotDefined(InvalidUpdateExpression):
+ name_not_defined_msg = "An expression attribute name used in the document path is not defined; attribute name: {n}"
+
+ def __init__(self, attribute_name):
+ self.not_defined_attribute_name = attribute_name
+ super().__init__(self.name_not_defined_msg.format(n=attribute_name))
+
+
+class AttributeIsReservedKeyword(InvalidUpdateExpression):
+ attribute_is_keyword_msg = (
+ "Attribute name is a reserved keyword; reserved keyword: {keyword}"
+ )
+
+ def __init__(self, keyword):
+ self.keyword = keyword
+ super().__init__(self.attribute_is_keyword_msg.format(keyword=keyword))
+
+
+class ExpressionAttributeValueNotDefined(InvalidUpdateExpression):
+ attr_value_not_defined_msg = "An expression attribute value used in expression is not defined; attribute value: {attribute_value}"
+
+ def __init__(self, attribute_value):
+ self.attribute_value = attribute_value
+ super().__init__(
+ self.attr_value_not_defined_msg.format(attribute_value=attribute_value)
+ )
+
+
+class UpdateExprSyntaxError(InvalidUpdateExpression):
+ update_expr_syntax_error_msg = "Syntax error; {error_detail}"
+
+ def __init__(self, error_detail):
+ self.error_detail = error_detail
+ super().__init__(
+ self.update_expr_syntax_error_msg.format(error_detail=error_detail)
+ )
+
+
+class InvalidTokenException(UpdateExprSyntaxError):
+ token_detail_msg = 'token: "{token}", near: "{near}"'
+
+ def __init__(self, token, near):
+ self.token = token
+ self.near = near
+ super().__init__(self.token_detail_msg.format(token=token, near=near))
+
+
+class InvalidExpressionAttributeNameKey(MockValidationException):
+ invalid_expr_attr_name_msg = (
+ 'ExpressionAttributeNames contains invalid key: Syntax error; key: "{key}"'
+ )
+
+ def __init__(self, key):
+ self.key = key
+ super().__init__(self.invalid_expr_attr_name_msg.format(key=key))
+
+
+class ItemSizeTooLarge(MockValidationException):
+ item_size_too_large_msg = "Item size has exceeded the maximum allowed size"
+
+ def __init__(self):
+ super().__init__(self.item_size_too_large_msg)
+
+
+class ItemSizeToUpdateTooLarge(MockValidationException):
+ item_size_to_update_too_large_msg = (
+ "Item size to update has exceeded the maximum allowed size"
+ )
+
+ def __init__(self):
+ super().__init__(self.item_size_to_update_too_large_msg)
+
+
+class HashKeyTooLong(MockValidationException):
+ # deliberately no space between of and {lim}
+ key_too_large_msg = "One or more parameter values were invalid: Size of hashkey has exceeded the maximum size limit of{lim} bytes".format(
+ lim=HASH_KEY_MAX_LENGTH
+ )
+
+ def __init__(self):
+ super().__init__(self.key_too_large_msg)
+
+
+class RangeKeyTooLong(MockValidationException):
+ key_too_large_msg = "One or more parameter values were invalid: Aggregated size of all range keys has exceeded the size limit of {lim} bytes".format(
+ lim=RANGE_KEY_MAX_LENGTH
+ )
+
+ def __init__(self):
+ super().__init__(self.key_too_large_msg)
+
+
+class IncorrectOperandType(InvalidUpdateExpression):
+ inv_operand_msg = "Incorrect operand type for operator or function; operator or function: {f}, operand type: {t}"
+
+ def __init__(self, operator_or_function, operand_type):
+ self.operator_or_function = operator_or_function
+ self.operand_type = operand_type
+ super().__init__(
+ self.inv_operand_msg.format(f=operator_or_function, t=operand_type)
+ )
+
+
+class IncorrectDataType(MockValidationException):
+ inc_data_type_msg = "An operand in the update expression has an incorrect data type"
+
+ def __init__(self):
+ super().__init__(self.inc_data_type_msg)
+
+
+class ConditionalCheckFailed(DynamodbException):
+ error_type = "com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException"
+
+ def __init__(self, msg=None):
+ super().__init__(
+ ConditionalCheckFailed.error_type, msg or "The conditional request failed"
+ )
+
+
+class TransactionCanceledException(DynamodbException):
+ cancel_reason_msg = "Transaction cancelled, please refer cancellation reasons for specific reasons [{}]"
+ error_type = "com.amazonaws.dynamodb.v20120810#TransactionCanceledException"
+
+ def __init__(self, errors):
+ msg = self.cancel_reason_msg.format(
+ ", ".join([str(code) for code, _ in errors])
+ )
+ super().__init__(
+ error_type=TransactionCanceledException.error_type, message=msg
+ )
+ reasons = [
+ {"Code": code, "Message": message} if code else {"Code": "None"}
+ for code, message in errors
+ ]
+ self.description = json.dumps(
+ {
+ "__type": TransactionCanceledException.error_type,
+ "CancellationReasons": reasons,
+ "Message": msg,
+ }
+ )
+
+
+class MultipleTransactionsException(MockValidationException):
+ msg = "Transaction request cannot include multiple operations on one item"
+
+ def __init__(self):
+ super().__init__(self.msg)
+
+
+class TooManyTransactionsException(MockValidationException):
+ msg = "Validation error at transactItems: Member must have length less than or equal to 25."
+
+ def __init__(self):
+ super().__init__(self.msg)
+
+
+class EmptyKeyAttributeException(MockValidationException):
+ empty_str_msg = "One or more parameter values were invalid: An AttributeValue may not contain an empty string"
+ # AWS has a different message for empty index keys
+ empty_index_msg = "One or more parameter values are not valid. The update expression attempted to update a secondary index key to a value that is not supported. The AttributeValue for a key attribute cannot contain an empty string value."
+
+ def __init__(self, key_in_index=False):
+ super().__init__(self.empty_index_msg if key_in_index else self.empty_str_msg)
+
+
+class UpdateHashRangeKeyException(MockValidationException):
+ msg = "One or more parameter values were invalid: Cannot update attribute {}. This attribute is part of the key"
+
+ def __init__(self, key_name):
+ super().__init__(self.msg.format(key_name))
+
+
+class InvalidAttributeTypeError(MockValidationException):
+ msg = "One or more parameter values were invalid: Type mismatch for key {} expected: {} actual: {}"
+
+ def __init__(self, name, expected_type, actual_type):
+ super().__init__(self.msg.format(name, expected_type, actual_type))
+
+
+class TooManyAddClauses(InvalidUpdateExpression):
+ msg = 'The "ADD" section can only be used once in an update expression;'
+
+ def __init__(self):
+ super().__init__(self.msg)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ def __init__(self, msg=None):
+ err = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ super().__init__(err, msg or "Requested resource not found")
+
+
+class TableNotFoundException(JsonRESTError):
+ def __init__(self, name):
+ err = "com.amazonaws.dynamodb.v20111205#TableNotFoundException"
+ msg = "Table not found: {}".format(name)
+ super().__init__(err, msg)
+
+
+class SourceTableNotFoundException(JsonRESTError):
+ def __init__(self, source_table_name):
+ er = "com.amazonaws.dynamodb.v20111205#SourceTableNotFoundException"
+ super().__init__(er, "Source table not found: %s" % source_table_name)
+
+
+class BackupNotFoundException(JsonRESTError):
+ def __init__(self, backup_arn):
+ er = "com.amazonaws.dynamodb.v20111205#BackupNotFoundException"
+ super().__init__(er, "Backup not found: %s" % backup_arn)
+
+
+class TableAlreadyExistsException(JsonRESTError):
+ def __init__(self, target_table_name):
+ er = "com.amazonaws.dynamodb.v20111205#TableAlreadyExistsException"
+ super().__init__(er, "Table already exists: %s" % target_table_name)
+
+
+class ResourceInUseException(JsonRESTError):
+ def __init__(self):
+ er = "com.amazonaws.dynamodb.v20111205#ResourceInUseException"
+ super().__init__(er, "Resource in use")
+
+
+class StreamAlreadyEnabledException(JsonRESTError):
+ def __init__(self):
+ er = "com.amazonaws.dynamodb.v20111205#ResourceInUseException"
+ super().__init__(er, "Cannot enable stream")
+
+
+class InvalidConversion(JsonRESTError):
+ def __init__(self):
+ er = "SerializationException"
+ super().__init__(er, "NUMBER_VALUE cannot be converted to String")
diff --git a/contrib/python/moto/py3/moto/dynamodb/limits.py b/contrib/python/moto/py3/moto/dynamodb/limits.py
new file mode 100644
index 0000000000..d7b38fe89d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/limits.py
@@ -0,0 +1,5 @@
+# https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-partition-sort-keys
+# measured in bytes
+# <= not <
+HASH_KEY_MAX_LENGTH = 2048
+RANGE_KEY_MAX_LENGTH = 1024
diff --git a/contrib/python/moto/py3/moto/dynamodb/models/__init__.py b/contrib/python/moto/py3/moto/dynamodb/models/__init__.py
new file mode 100644
index 0000000000..69c6bd36ed
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/models/__init__.py
@@ -0,0 +1,1867 @@
+from collections import defaultdict
+import copy
+import datetime
+import decimal
+import json
+import re
+import uuid
+
+from collections import OrderedDict
+from moto.core import get_account_id
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import unix_time, unix_time_millis, BackendDict
+from moto.core.exceptions import JsonRESTError
+from moto.dynamodb.comparisons import get_filter_expression
+from moto.dynamodb.comparisons import get_expected
+from moto.dynamodb.exceptions import (
+ InvalidIndexNameError,
+ ItemSizeTooLarge,
+ ItemSizeToUpdateTooLarge,
+ HashKeyTooLong,
+ RangeKeyTooLong,
+ ConditionalCheckFailed,
+ TransactionCanceledException,
+ EmptyKeyAttributeException,
+ InvalidAttributeTypeError,
+ MultipleTransactionsException,
+ TooManyTransactionsException,
+ TableNotFoundException,
+ ResourceNotFoundException,
+ SourceTableNotFoundException,
+ TableAlreadyExistsException,
+ BackupNotFoundException,
+ ResourceInUseException,
+ StreamAlreadyEnabledException,
+ MockValidationException,
+ InvalidConversion,
+)
+from moto.dynamodb.models.utilities import bytesize
+from moto.dynamodb.models.dynamo_type import DynamoType
+from moto.dynamodb.parsing.executors import UpdateExpressionExecutor
+from moto.dynamodb.parsing.expressions import UpdateExpressionParser
+from moto.dynamodb.parsing.validators import UpdateExpressionValidator
+from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH
+
+
+class DynamoJsonEncoder(json.JSONEncoder):
+ def default(self, o):
+ if hasattr(o, "to_json"):
+ return o.to_json()
+
+
+def dynamo_json_dump(dynamo_object):
+ return json.dumps(dynamo_object, cls=DynamoJsonEncoder)
+
+
+# https://github.com/spulec/moto/issues/1874
+# Ensure that the total size of an item does not exceed 400kb
+class LimitedSizeDict(dict):
+ def __init__(self, *args, **kwargs):
+ self.update(*args, **kwargs)
+
+ def __setitem__(self, key, value):
+ current_item_size = sum(
+ [
+ item.size() if type(item) == DynamoType else bytesize(str(item))
+ for item in (list(self.keys()) + list(self.values()))
+ ]
+ )
+ new_item_size = bytesize(key) + (
+ value.size() if type(value) == DynamoType else bytesize(str(value))
+ )
+ # Official limit is set to 400000 (400KB)
+ # Manual testing confirms that the actual limit is between 409 and 410KB
+ # We'll set the limit to something in between to be safe
+ if (current_item_size + new_item_size) > 405000:
+ raise ItemSizeTooLarge
+ super().__setitem__(key, value)
+
+
+class Item(BaseModel):
+ def __init__(self, hash_key, range_key, attrs):
+ self.hash_key = hash_key
+ self.range_key = range_key
+
+ self.attrs = LimitedSizeDict()
+ for key, value in attrs.items():
+ self.attrs[key] = DynamoType(value)
+
+ def __eq__(self, other):
+ return all(
+ [
+ self.hash_key == other.hash_key,
+ self.range_key == other.range_key,
+ self.attrs == other.attrs,
+ ]
+ )
+
+ def __repr__(self):
+ return "Item: {0}".format(self.to_json())
+
+ def size(self):
+ return sum(bytesize(key) + value.size() for key, value in self.attrs.items())
+
+ def to_json(self):
+ attributes = {}
+ for attribute_key, attribute in self.attrs.items():
+ attributes[attribute_key] = {attribute.type: attribute.value}
+
+ return {"Attributes": attributes}
+
+ def describe_attrs(self, attributes):
+ if attributes:
+ included = {}
+ for key, value in self.attrs.items():
+ if key in attributes:
+ included[key] = value
+ else:
+ included = self.attrs
+ return {"Item": included}
+
+ def validate_no_empty_key_values(self, attribute_updates, key_attributes):
+ for attribute_name, update_action in attribute_updates.items():
+ action = update_action.get("Action") or "PUT" # PUT is default
+ if action == "DELETE":
+ continue
+ new_value = next(iter(update_action["Value"].values()))
+ if action == "PUT" and new_value == "" and attribute_name in key_attributes:
+ raise EmptyKeyAttributeException
+
+ def update_with_attribute_updates(self, attribute_updates):
+ for attribute_name, update_action in attribute_updates.items():
+ # Use default Action value, if no explicit Action is passed.
+ # Default value is 'Put', according to
+ # Boto3 DynamoDB.Client.update_item documentation.
+ action = update_action.get("Action", "PUT")
+ if action == "DELETE" and "Value" not in update_action:
+ if attribute_name in self.attrs:
+ del self.attrs[attribute_name]
+ continue
+ new_value = list(update_action["Value"].values())[0]
+ if action == "PUT":
+ # TODO deal with other types
+ if set(update_action["Value"].keys()) == set(["SS"]):
+ self.attrs[attribute_name] = DynamoType({"SS": new_value})
+ elif isinstance(new_value, list):
+ self.attrs[attribute_name] = DynamoType({"L": new_value})
+ elif isinstance(new_value, dict):
+ self.attrs[attribute_name] = DynamoType({"M": new_value})
+ elif set(update_action["Value"].keys()) == set(["N"]):
+ self.attrs[attribute_name] = DynamoType({"N": new_value})
+ elif set(update_action["Value"].keys()) == set(["NULL"]):
+ if attribute_name in self.attrs:
+ del self.attrs[attribute_name]
+ else:
+ self.attrs[attribute_name] = DynamoType({"S": new_value})
+ elif action == "ADD":
+ if set(update_action["Value"].keys()) == set(["N"]):
+ existing = self.attrs.get(attribute_name, DynamoType({"N": "0"}))
+ self.attrs[attribute_name] = DynamoType(
+ {
+ "N": str(
+ decimal.Decimal(existing.value)
+ + decimal.Decimal(new_value)
+ )
+ }
+ )
+ elif set(update_action["Value"].keys()) == set(["SS"]):
+ existing = self.attrs.get(attribute_name, DynamoType({"SS": {}}))
+ new_set = set(existing.value).union(set(new_value))
+ self.attrs[attribute_name] = DynamoType({"SS": list(new_set)})
+ elif set(update_action["Value"].keys()) == {"L"}:
+ existing = self.attrs.get(attribute_name, DynamoType({"L": []}))
+ new_list = existing.value + new_value
+ self.attrs[attribute_name] = DynamoType({"L": new_list})
+ else:
+ # TODO: implement other data types
+ raise NotImplementedError(
+ "ADD not supported for %s"
+ % ", ".join(update_action["Value"].keys())
+ )
+ elif action == "DELETE":
+ if set(update_action["Value"].keys()) == set(["SS"]):
+ existing = self.attrs.get(attribute_name, DynamoType({"SS": {}}))
+ new_set = set(existing.value).difference(set(new_value))
+ self.attrs[attribute_name] = DynamoType({"SS": list(new_set)})
+ else:
+ raise NotImplementedError(
+ "ADD not supported for %s"
+ % ", ".join(update_action["Value"].keys())
+ )
+ else:
+ raise NotImplementedError(
+ "%s action not support for update_with_attribute_updates" % action
+ )
+
+ # Filter using projection_expression
+ # Ensure a deep copy is used to filter, otherwise actual data will be removed
+ def filter(self, projection_expression):
+ expressions = [x.strip() for x in projection_expression.split(",")]
+ top_level_expressions = [
+ expr[0 : expr.index(".")] for expr in expressions if "." in expr
+ ]
+ for attr in list(self.attrs):
+ if attr not in expressions and attr not in top_level_expressions:
+ self.attrs.pop(attr)
+ if attr in top_level_expressions:
+ relevant_expressions = [
+ expr[len(attr + ".") :]
+ for expr in expressions
+ if expr.startswith(attr + ".")
+ ]
+ self.attrs[attr].filter(relevant_expressions)
+
+
+class StreamRecord(BaseModel):
+ def __init__(self, table, stream_type, event_name, old, new, seq):
+ old_a = old.to_json()["Attributes"] if old is not None else {}
+ new_a = new.to_json()["Attributes"] if new is not None else {}
+
+ rec = old if old is not None else new
+ keys = {table.hash_key_attr: rec.hash_key.to_json()}
+ if table.range_key_attr is not None:
+ keys[table.range_key_attr] = rec.range_key.to_json()
+
+ self.record = {
+ "eventID": uuid.uuid4().hex,
+ "eventName": event_name,
+ "eventSource": "aws:dynamodb",
+ "eventVersion": "1.0",
+ "awsRegion": "us-east-1",
+ "dynamodb": {
+ "StreamViewType": stream_type,
+ "ApproximateCreationDateTime": datetime.datetime.utcnow().isoformat(),
+ "SequenceNumber": str(seq),
+ "SizeBytes": 1,
+ "Keys": keys,
+ },
+ }
+
+ if stream_type in ("NEW_IMAGE", "NEW_AND_OLD_IMAGES"):
+ self.record["dynamodb"]["NewImage"] = new_a
+ if stream_type in ("OLD_IMAGE", "NEW_AND_OLD_IMAGES"):
+ self.record["dynamodb"]["OldImage"] = old_a
+
+ # This is a substantial overestimate but it's the easiest to do now
+ self.record["dynamodb"]["SizeBytes"] = len(
+ dynamo_json_dump(self.record["dynamodb"])
+ )
+
+ def to_json(self):
+ return self.record
+
+
+class StreamShard(BaseModel):
+ def __init__(self, table):
+ self.table = table
+ self.id = "shardId-00000001541626099285-f35f62ef"
+ self.starting_sequence_number = 1100000000017454423009
+ self.items = []
+ self.created_on = datetime.datetime.utcnow()
+
+ def to_json(self):
+ return {
+ "ShardId": self.id,
+ "SequenceNumberRange": {
+ "StartingSequenceNumber": str(self.starting_sequence_number)
+ },
+ }
+
+ def add(self, old, new):
+ t = self.table.stream_specification["StreamViewType"]
+ if old is None:
+ event_name = "INSERT"
+ elif new is None:
+ event_name = "REMOVE"
+ else:
+ event_name = "MODIFY"
+ seq = len(self.items) + self.starting_sequence_number
+ self.items.append(StreamRecord(self.table, t, event_name, old, new, seq))
+ result = None
+ from moto.awslambda import lambda_backends
+
+ for arn, esm in self.table.lambda_event_source_mappings.items():
+ region = arn[
+ len("arn:aws:lambda:") : arn.index(":", len("arn:aws:lambda:"))
+ ]
+
+ result = lambda_backends[region].send_dynamodb_items(
+ arn, self.items, esm.event_source_arn
+ )
+
+ if result:
+ self.items = []
+
+ def get(self, start, quantity):
+ start -= self.starting_sequence_number
+ assert start >= 0
+ end = start + quantity
+ return [i.to_json() for i in self.items[start:end]]
+
+
+class SecondaryIndex(BaseModel):
+ def project(self, item):
+ """
+ Enforces the ProjectionType of this Index (LSI/GSI)
+ Removes any non-wanted attributes from the item
+ :param item:
+ :return:
+ """
+ if self.projection:
+ projection_type = self.projection.get("ProjectionType", None)
+ key_attributes = self.table_key_attrs + [
+ key["AttributeName"] for key in self.schema
+ ]
+
+ if projection_type == "KEYS_ONLY":
+ item.filter(",".join(key_attributes))
+ elif projection_type == "INCLUDE":
+ allowed_attributes = key_attributes + self.projection.get(
+ "NonKeyAttributes", []
+ )
+ item.filter(",".join(allowed_attributes))
+ # ALL is handled implicitly by not filtering
+ return item
+
+
+class LocalSecondaryIndex(SecondaryIndex):
+ def __init__(self, index_name, schema, projection, table_key_attrs):
+ self.name = index_name
+ self.schema = schema
+ self.projection = projection
+ self.table_key_attrs = table_key_attrs
+
+ def describe(self):
+ return {
+ "IndexName": self.name,
+ "KeySchema": self.schema,
+ "Projection": self.projection,
+ }
+
+ @staticmethod
+ def create(dct, table_key_attrs):
+ return LocalSecondaryIndex(
+ index_name=dct["IndexName"],
+ schema=dct["KeySchema"],
+ projection=dct["Projection"],
+ table_key_attrs=table_key_attrs,
+ )
+
+
+class GlobalSecondaryIndex(SecondaryIndex):
+ def __init__(
+ self,
+ index_name,
+ schema,
+ projection,
+ table_key_attrs,
+ status="ACTIVE",
+ throughput=None,
+ ):
+ self.name = index_name
+ self.schema = schema
+ self.projection = projection
+ self.table_key_attrs = table_key_attrs
+ self.status = status
+ self.throughput = throughput or {
+ "ReadCapacityUnits": 0,
+ "WriteCapacityUnits": 0,
+ }
+
+ def describe(self):
+ return {
+ "IndexName": self.name,
+ "KeySchema": self.schema,
+ "Projection": self.projection,
+ "IndexStatus": self.status,
+ "ProvisionedThroughput": self.throughput,
+ }
+
+ @staticmethod
+ def create(dct, table_key_attrs):
+ return GlobalSecondaryIndex(
+ index_name=dct["IndexName"],
+ schema=dct["KeySchema"],
+ projection=dct["Projection"],
+ table_key_attrs=table_key_attrs,
+ throughput=dct.get("ProvisionedThroughput", None),
+ )
+
+ def update(self, u):
+ self.name = u.get("IndexName", self.name)
+ self.schema = u.get("KeySchema", self.schema)
+ self.projection = u.get("Projection", self.projection)
+ self.throughput = u.get("ProvisionedThroughput", self.throughput)
+
+
+class Table(CloudFormationModel):
+ def __init__(
+ self,
+ table_name,
+ region,
+ schema=None,
+ attr=None,
+ throughput=None,
+ billing_mode=None,
+ indexes=None,
+ global_indexes=None,
+ streams=None,
+ sse_specification=None,
+ tags=None,
+ ):
+ self.name = table_name
+ self.attr = attr
+ self.schema = schema
+ self.range_key_attr = None
+ self.hash_key_attr = None
+ self.range_key_type = None
+ self.hash_key_type = None
+ for elem in schema:
+ attr_type = [
+ a["AttributeType"]
+ for a in attr
+ if a["AttributeName"] == elem["AttributeName"]
+ ][0]
+ if elem["KeyType"] == "HASH":
+ self.hash_key_attr = elem["AttributeName"]
+ self.hash_key_type = attr_type
+ else:
+ self.range_key_attr = elem["AttributeName"]
+ self.range_key_type = attr_type
+ self.table_key_attrs = [
+ key for key in (self.hash_key_attr, self.range_key_attr) if key
+ ]
+ self.billing_mode = billing_mode
+ if throughput is None:
+ self.throughput = {"WriteCapacityUnits": 0, "ReadCapacityUnits": 0}
+ else:
+ self.throughput = throughput
+ self.throughput["NumberOfDecreasesToday"] = 0
+ self.indexes = [
+ LocalSecondaryIndex.create(i, self.table_key_attrs)
+ for i in (indexes if indexes else [])
+ ]
+ self.global_indexes = [
+ GlobalSecondaryIndex.create(i, self.table_key_attrs)
+ for i in (global_indexes if global_indexes else [])
+ ]
+ self.created_at = datetime.datetime.utcnow()
+ self.items = defaultdict(dict)
+ self.table_arn = self._generate_arn(table_name)
+ self.tags = tags or []
+ self.ttl = {
+ "TimeToLiveStatus": "DISABLED" # One of 'ENABLING'|'DISABLING'|'ENABLED'|'DISABLED',
+ # 'AttributeName': 'string' # Can contain this
+ }
+ self.stream_specification = {"StreamEnabled": False}
+ self.latest_stream_label = None
+ self.stream_shard = None
+ self.set_stream_specification(streams)
+ self.lambda_event_source_mappings = {}
+ self.continuous_backups = {
+ "ContinuousBackupsStatus": "ENABLED", # One of 'ENABLED'|'DISABLED', it's enabled by default
+ "PointInTimeRecoveryDescription": {
+ "PointInTimeRecoveryStatus": "DISABLED" # One of 'ENABLED'|'DISABLED'
+ },
+ }
+ self.sse_specification = sse_specification
+ if sse_specification and "KMSMasterKeyId" not in self.sse_specification:
+ self.sse_specification["KMSMasterKeyId"] = self._get_default_encryption_key(
+ region
+ )
+
+ def _get_default_encryption_key(self, region):
+ from moto.kms import kms_backends
+
+ # https://aws.amazon.com/kms/features/#AWS_Service_Integration
+ # An AWS managed CMK is created automatically when you first create
+ # an encrypted resource using an AWS service integrated with KMS.
+ kms = kms_backends[region]
+ ddb_alias = "alias/aws/dynamodb"
+ if not kms.alias_exists(ddb_alias):
+ key = kms.create_key(
+ policy="",
+ key_usage="ENCRYPT_DECRYPT",
+ customer_master_key_spec="SYMMETRIC_DEFAULT",
+ description="Default master key that protects my DynamoDB table storage",
+ tags=None,
+ region=region,
+ )
+ kms.add_alias(key.id, ddb_alias)
+ ebs_key = kms.describe_key(ddb_alias)
+ return ebs_key.arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn", "StreamArn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.table_arn
+ elif attribute_name == "StreamArn" and self.stream_specification:
+ return self.describe()["TableDescription"]["LatestStreamArn"]
+
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def attribute_keys(self):
+ # A set of all the hash or range attributes for all indexes
+ def keys_from_index(idx):
+ schema = idx.schema
+ return [attr["AttributeName"] for attr in schema]
+
+ fieldnames = copy.copy(self.table_key_attrs)
+ for idx in self.indexes + self.global_indexes:
+ fieldnames += keys_from_index(idx)
+ return fieldnames
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "TableName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html
+ return "AWS::DynamoDB::Table"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ params = {}
+
+ if "KeySchema" in properties:
+ params["schema"] = properties["KeySchema"]
+ if "AttributeDefinitions" in properties:
+ params["attr"] = properties["AttributeDefinitions"]
+ if "GlobalSecondaryIndexes" in properties:
+ params["global_indexes"] = properties["GlobalSecondaryIndexes"]
+ if "ProvisionedThroughput" in properties:
+ params["throughput"] = properties["ProvisionedThroughput"]
+ if "LocalSecondaryIndexes" in properties:
+ params["indexes"] = properties["LocalSecondaryIndexes"]
+ if "StreamSpecification" in properties:
+ params["streams"] = properties["StreamSpecification"]
+
+ table = dynamodb_backends[region_name].create_table(
+ name=resource_name, **params
+ )
+ return table
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ table = dynamodb_backends[region_name].delete_table(name=resource_name)
+ return table
+
+ def _generate_arn(self, name):
+ return f"arn:aws:dynamodb:us-east-1:{get_account_id()}:table/{name}"
+
+ def set_stream_specification(self, streams):
+ self.stream_specification = streams
+ if streams and (streams.get("StreamEnabled") or streams.get("StreamViewType")):
+ self.stream_specification["StreamEnabled"] = True
+ self.latest_stream_label = datetime.datetime.utcnow().isoformat()
+ self.stream_shard = StreamShard(self)
+ else:
+ self.stream_specification = {"StreamEnabled": False}
+
+ def describe(self, base_key="TableDescription"):
+ results = {
+ base_key: {
+ "AttributeDefinitions": self.attr,
+ "ProvisionedThroughput": self.throughput,
+ "BillingModeSummary": {"BillingMode": self.billing_mode},
+ "TableSizeBytes": 0,
+ "TableName": self.name,
+ "TableStatus": "ACTIVE",
+ "TableArn": self.table_arn,
+ "KeySchema": self.schema,
+ "ItemCount": len(self),
+ "CreationDateTime": unix_time(self.created_at),
+ "GlobalSecondaryIndexes": [
+ index.describe() for index in self.global_indexes
+ ],
+ "LocalSecondaryIndexes": [index.describe() for index in self.indexes],
+ }
+ }
+ if self.latest_stream_label:
+ results[base_key]["LatestStreamLabel"] = self.latest_stream_label
+ results[base_key][
+ "LatestStreamArn"
+ ] = f"{self.table_arn}/stream/{self.latest_stream_label}"
+ if self.stream_specification and self.stream_specification["StreamEnabled"]:
+ results[base_key]["StreamSpecification"] = self.stream_specification
+ if self.sse_specification and self.sse_specification.get("Enabled") is True:
+ results[base_key]["SSEDescription"] = {
+ "Status": "ENABLED",
+ "SSEType": "KMS",
+ "KMSMasterKeyArn": self.sse_specification.get("KMSMasterKeyId"),
+ }
+ return results
+
+ def __len__(self):
+ return sum(
+ [(len(value) if self.has_range_key else 1) for value in self.items.values()]
+ )
+
+ @property
+ def hash_key_names(self):
+ keys = [self.hash_key_attr]
+ for index in self.global_indexes:
+ hash_key = None
+ for key in index.schema:
+ if key["KeyType"] == "HASH":
+ hash_key = key["AttributeName"]
+ keys.append(hash_key)
+ return keys
+
+ @property
+ def range_key_names(self):
+ keys = [self.range_key_attr]
+ for index in self.global_indexes:
+ range_key = None
+ for key in index.schema:
+ if key["KeyType"] == "RANGE":
+ range_key = keys.append(key["AttributeName"])
+ keys.append(range_key)
+ return keys
+
+ def _validate_key_sizes(self, item_attrs):
+ for hash_name in self.hash_key_names:
+ hash_value = item_attrs.get(hash_name)
+ if hash_value:
+ if DynamoType(hash_value).size() > HASH_KEY_MAX_LENGTH:
+ raise HashKeyTooLong
+ for range_name in self.range_key_names:
+ range_value = item_attrs.get(range_name)
+ if range_value:
+ if DynamoType(range_value).size() > RANGE_KEY_MAX_LENGTH:
+ raise RangeKeyTooLong
+
+ def _validate_item_types(self, item_attrs):
+ for key, value in item_attrs.items():
+ if type(value) == dict:
+ self._validate_item_types(value)
+ elif type(value) == int and key == "N":
+ raise InvalidConversion
+
+ def put_item(
+ self,
+ item_attrs,
+ expected=None,
+ condition_expression=None,
+ expression_attribute_names=None,
+ expression_attribute_values=None,
+ overwrite=False,
+ ):
+ if self.hash_key_attr not in item_attrs.keys():
+ raise MockValidationException(
+ "One or more parameter values were invalid: Missing the key "
+ + self.hash_key_attr
+ + " in the item"
+ )
+ hash_value = DynamoType(item_attrs.get(self.hash_key_attr))
+ if self.has_range_key:
+ if self.range_key_attr not in item_attrs.keys():
+ raise MockValidationException(
+ "One or more parameter values were invalid: Missing the key "
+ + self.range_key_attr
+ + " in the item"
+ )
+ range_value = DynamoType(item_attrs.get(self.range_key_attr))
+ else:
+ range_value = None
+
+ if hash_value.type != self.hash_key_type:
+ raise InvalidAttributeTypeError(
+ self.hash_key_attr,
+ expected_type=self.hash_key_type,
+ actual_type=hash_value.type,
+ )
+ if range_value and range_value.type != self.range_key_type:
+ raise InvalidAttributeTypeError(
+ self.range_key_attr,
+ expected_type=self.range_key_type,
+ actual_type=range_value.type,
+ )
+
+ self._validate_key_sizes(item_attrs)
+
+ self._validate_item_types(item_attrs)
+
+ if expected is None:
+ expected = {}
+ lookup_range_value = range_value
+ else:
+ expected_range_value = expected.get(self.range_key_attr, {}).get("Value")
+ if expected_range_value is None:
+ lookup_range_value = range_value
+ else:
+ lookup_range_value = DynamoType(expected_range_value)
+ current = self.get_item(hash_value, lookup_range_value)
+ item = Item(hash_value, range_value, item_attrs)
+
+ if not overwrite:
+ if not get_expected(expected).expr(current):
+ raise ConditionalCheckFailed
+ condition_op = get_filter_expression(
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ )
+ if not condition_op.expr(current):
+ raise ConditionalCheckFailed
+
+ if range_value:
+ self.items[hash_value][range_value] = item
+ else:
+ self.items[hash_value] = item
+
+ if self.stream_shard is not None:
+ self.stream_shard.add(current, item)
+
+ return item
+
+ def __nonzero__(self):
+ return True
+
+ def __bool__(self):
+ return self.__nonzero__()
+
+ @property
+ def has_range_key(self):
+ return self.range_key_attr is not None
+
+ def get_item(self, hash_key, range_key=None, projection_expression=None):
+ if self.has_range_key and not range_key:
+ raise MockValidationException(
+ "Table has a range key, but no range key was passed into get_item"
+ )
+ try:
+ result = None
+
+ if range_key:
+ result = self.items[hash_key][range_key]
+ elif hash_key in self.items:
+ result = self.items[hash_key]
+
+ if projection_expression and result:
+ result = copy.deepcopy(result)
+ result.filter(projection_expression)
+
+ if not result:
+ raise KeyError
+
+ return result
+ except KeyError:
+ return None
+
+ def delete_item(self, hash_key, range_key):
+ try:
+ if range_key:
+ item = self.items[hash_key].pop(range_key)
+ else:
+ item = self.items.pop(hash_key)
+
+ if self.stream_shard is not None:
+ self.stream_shard.add(item, None)
+
+ return item
+ except KeyError:
+ return None
+
+ def query(
+ self,
+ hash_key,
+ range_comparison,
+ range_objs,
+ limit,
+ exclusive_start_key,
+ scan_index_forward,
+ projection_expression,
+ index_name=None,
+ filter_expression=None,
+ **filter_kwargs,
+ ):
+ results = []
+
+ if index_name:
+ all_indexes = self.all_indexes()
+ indexes_by_name = dict((i.name, i) for i in all_indexes)
+ if index_name not in indexes_by_name:
+ raise MockValidationException(
+ "Invalid index: %s for table: %s. Available indexes are: %s"
+ % (index_name, self.name, ", ".join(indexes_by_name.keys()))
+ )
+
+ index = indexes_by_name[index_name]
+ try:
+ index_hash_key = [
+ key for key in index.schema if key["KeyType"] == "HASH"
+ ][0]
+ except IndexError:
+ raise MockValidationException(
+ "Missing Hash Key. KeySchema: %s" % index.name
+ )
+
+ try:
+ index_range_key = [
+ key for key in index.schema if key["KeyType"] == "RANGE"
+ ][0]
+ except IndexError:
+ index_range_key = None
+
+ possible_results = []
+ for item in self.all_items():
+ if not isinstance(item, Item):
+ continue
+ item_hash_key = item.attrs.get(index_hash_key["AttributeName"])
+ if index_range_key is None:
+ if item_hash_key and item_hash_key == hash_key:
+ possible_results.append(item)
+ else:
+ item_range_key = item.attrs.get(index_range_key["AttributeName"])
+ if item_hash_key and item_hash_key == hash_key and item_range_key:
+ possible_results.append(item)
+ else:
+ possible_results = [
+ item
+ for item in list(self.all_items())
+ if isinstance(item, Item) and item.hash_key == hash_key
+ ]
+
+ if range_comparison:
+ if index_name and not index_range_key:
+ raise ValueError(
+ "Range Key comparison but no range key found for index: %s"
+ % index_name
+ )
+
+ elif index_name:
+ for result in possible_results:
+ if result.attrs.get(index_range_key["AttributeName"]).compare(
+ range_comparison, range_objs
+ ):
+ results.append(result)
+ else:
+ for result in possible_results:
+ if result.range_key.compare(range_comparison, range_objs):
+ results.append(result)
+
+ if filter_kwargs:
+ for result in possible_results:
+ for field, value in filter_kwargs.items():
+ dynamo_types = [
+ DynamoType(ele) for ele in value["AttributeValueList"]
+ ]
+ if result.attrs.get(field).compare(
+ value["ComparisonOperator"], dynamo_types
+ ):
+ results.append(result)
+
+ if not range_comparison and not filter_kwargs:
+ # If we're not filtering on range key or on an index return all
+ # values
+ results = possible_results
+
+ if index_name:
+
+ if index_range_key:
+
+ # Convert to float if necessary to ensure proper ordering
+ def conv(x):
+ return float(x.value) if x.type == "N" else x.value
+
+ results.sort(
+ key=lambda item: conv(item.attrs[index_range_key["AttributeName"]])
+ if item.attrs.get(index_range_key["AttributeName"])
+ else None
+ )
+ else:
+ results.sort(key=lambda item: item.range_key)
+
+ if scan_index_forward is False:
+ results.reverse()
+
+ scanned_count = len(list(self.all_items()))
+
+ results = copy.deepcopy(results)
+ if index_name:
+ index = self.get_index(index_name)
+ for result in results:
+ index.project(result)
+
+ results, last_evaluated_key = self._trim_results(
+ results, limit, exclusive_start_key, scanned_index=index_name
+ )
+
+ if filter_expression is not None:
+ results = [item for item in results if filter_expression.expr(item)]
+
+ if projection_expression:
+ for result in results:
+ result.filter(projection_expression)
+
+ return results, scanned_count, last_evaluated_key
+
+ def all_items(self):
+ for hash_set in self.items.values():
+ if self.range_key_attr:
+ for item in hash_set.values():
+ yield item
+ else:
+ yield hash_set
+
+ def all_indexes(self):
+ return (self.global_indexes or []) + (self.indexes or [])
+
+ def get_index(self, index_name, error_if_not=False):
+ all_indexes = self.all_indexes()
+ indexes_by_name = dict((i.name, i) for i in all_indexes)
+ if error_if_not and index_name not in indexes_by_name:
+ raise InvalidIndexNameError(
+ "The table does not have the specified index: %s" % index_name
+ )
+ return indexes_by_name[index_name]
+
+ def has_idx_items(self, index_name):
+
+ idx = self.get_index(index_name)
+ idx_col_set = set([i["AttributeName"] for i in idx.schema])
+
+ for hash_set in self.items.values():
+ if self.range_key_attr:
+ for item in hash_set.values():
+ if idx_col_set.issubset(set(item.attrs)):
+ yield item
+ else:
+ if idx_col_set.issubset(set(hash_set.attrs)):
+ yield hash_set
+
+ def scan(
+ self,
+ filters,
+ limit,
+ exclusive_start_key,
+ filter_expression=None,
+ index_name=None,
+ projection_expression=None,
+ ):
+ results = []
+ scanned_count = 0
+
+ if index_name:
+ self.get_index(index_name, error_if_not=True)
+ items = self.has_idx_items(index_name)
+ else:
+ items = self.all_items()
+
+ for item in items:
+ scanned_count += 1
+ passes_all_conditions = True
+ for (
+ attribute_name,
+ (comparison_operator, comparison_objs),
+ ) in filters.items():
+ attribute = item.attrs.get(attribute_name)
+
+ if attribute:
+ # Attribute found
+ if not attribute.compare(comparison_operator, comparison_objs):
+ passes_all_conditions = False
+ break
+ elif comparison_operator == "NULL":
+ # Comparison is NULL and we don't have the attribute
+ continue
+ else:
+ # No attribute found and comparison is no NULL. This item
+ # fails
+ passes_all_conditions = False
+ break
+
+ if passes_all_conditions:
+ results.append(item)
+
+ results, last_evaluated_key = self._trim_results(
+ results, limit, exclusive_start_key, scanned_index=index_name
+ )
+
+ if filter_expression is not None:
+ results = [item for item in results if filter_expression.expr(item)]
+
+ if projection_expression:
+ results = copy.deepcopy(results)
+ for result in results:
+ result.filter(projection_expression)
+
+ return results, scanned_count, last_evaluated_key
+
+ def _trim_results(self, results, limit, exclusive_start_key, scanned_index=None):
+ if exclusive_start_key is not None:
+ hash_key = DynamoType(exclusive_start_key.get(self.hash_key_attr))
+ range_key = exclusive_start_key.get(self.range_key_attr)
+ if range_key is not None:
+ range_key = DynamoType(range_key)
+ for i in range(len(results)):
+ if (
+ results[i].hash_key == hash_key
+ and results[i].range_key == range_key
+ ):
+ results = results[i + 1 :]
+ break
+
+ last_evaluated_key = None
+ size_limit = 1000000 # DynamoDB has a 1MB size limit
+ item_size = sum(res.size() for res in results)
+ if item_size > size_limit:
+ item_size = idx = 0
+ while item_size + results[idx].size() < size_limit:
+ item_size += results[idx].size()
+ idx += 1
+ limit = min(limit, idx) if limit else idx
+ if limit and len(results) > limit:
+ results = results[:limit]
+ last_evaluated_key = {self.hash_key_attr: results[-1].hash_key}
+ if results[-1].range_key is not None:
+ last_evaluated_key[self.range_key_attr] = results[-1].range_key
+
+ if scanned_index:
+ idx = self.get_index(scanned_index)
+ idx_col_list = [i["AttributeName"] for i in idx.schema]
+ for col in idx_col_list:
+ last_evaluated_key[col] = results[-1].attrs[col]
+
+ return results, last_evaluated_key
+
+ def delete(self, region_name):
+ dynamodb_backends[region_name].delete_table(self.name)
+
+
+class RestoredTable(Table):
+ def __init__(self, name, region, backup):
+ params = self._parse_params_from_backup(backup)
+ super().__init__(name, region=region, **params)
+ self.indexes = copy.deepcopy(backup.table.indexes)
+ self.global_indexes = copy.deepcopy(backup.table.global_indexes)
+ self.items = copy.deepcopy(backup.table.items)
+ # Restore Attrs
+ self.source_backup_arn = backup.arn
+ self.source_table_arn = backup.table.table_arn
+ self.restore_date_time = self.created_at
+
+ @staticmethod
+ def _parse_params_from_backup(backup):
+ params = {
+ "schema": copy.deepcopy(backup.table.schema),
+ "attr": copy.deepcopy(backup.table.attr),
+ "throughput": copy.deepcopy(backup.table.throughput),
+ }
+ return params
+
+ def describe(self, base_key="TableDescription"):
+ result = super().describe(base_key=base_key)
+ result[base_key]["RestoreSummary"] = {
+ "SourceBackupArn": self.source_backup_arn,
+ "SourceTableArn": self.source_table_arn,
+ "RestoreDateTime": unix_time(self.restore_date_time),
+ "RestoreInProgress": False,
+ }
+ return result
+
+
+class RestoredPITTable(Table):
+ def __init__(self, name, region, source):
+ params = self._parse_params_from_table(source)
+ super().__init__(name, region=region, **params)
+ self.indexes = copy.deepcopy(source.indexes)
+ self.global_indexes = copy.deepcopy(source.global_indexes)
+ self.items = copy.deepcopy(source.items)
+ # Restore Attrs
+ self.source_table_arn = source.table_arn
+ self.restore_date_time = self.created_at
+
+ @staticmethod
+ def _parse_params_from_table(table):
+ params = {
+ "schema": copy.deepcopy(table.schema),
+ "attr": copy.deepcopy(table.attr),
+ "throughput": copy.deepcopy(table.throughput),
+ }
+ return params
+
+ def describe(self, base_key="TableDescription"):
+ result = super().describe(base_key=base_key)
+ result[base_key]["RestoreSummary"] = {
+ "SourceTableArn": self.source_table_arn,
+ "RestoreDateTime": unix_time(self.restore_date_time),
+ "RestoreInProgress": False,
+ }
+ return result
+
+
+class Backup(object):
+ def __init__(self, backend, name, table, status=None, type_=None):
+ self.backend = backend
+ self.name = name
+ self.table = copy.deepcopy(table)
+ self.status = status or "AVAILABLE"
+ self.type = type_ or "USER"
+ self.creation_date_time = datetime.datetime.utcnow()
+ self.identifier = self._make_identifier()
+
+ def _make_identifier(self):
+ timestamp = int(unix_time_millis(self.creation_date_time))
+ timestamp_padded = str("0" + str(timestamp))[-16:16]
+ guid = str(uuid.uuid4())
+ guid_shortened = guid[:8]
+ return "{}-{}".format(timestamp_padded, guid_shortened)
+
+ @property
+ def arn(self):
+ return "arn:aws:dynamodb:{region}:{account}:table/{table_name}/backup/{identifier}".format(
+ region=self.backend.region_name,
+ account=get_account_id(),
+ table_name=self.table.name,
+ identifier=self.identifier,
+ )
+
+ @property
+ def details(self):
+ details = {
+ "BackupArn": self.arn,
+ "BackupName": self.name,
+ "BackupSizeBytes": 123,
+ "BackupStatus": self.status,
+ "BackupType": self.type,
+ "BackupCreationDateTime": unix_time(self.creation_date_time),
+ }
+ return details
+
+ @property
+ def summary(self):
+ summary = {
+ "TableName": self.table.name,
+ # 'TableId': 'string',
+ "TableArn": self.table.table_arn,
+ "BackupArn": self.arn,
+ "BackupName": self.name,
+ "BackupCreationDateTime": unix_time(self.creation_date_time),
+ # 'BackupExpiryDateTime': datetime(2015, 1, 1),
+ "BackupStatus": self.status,
+ "BackupType": self.type,
+ "BackupSizeBytes": 123,
+ }
+ return summary
+
+ @property
+ def description(self):
+ source_table_details = self.table.describe()["TableDescription"]
+ source_table_details["TableCreationDateTime"] = source_table_details[
+ "CreationDateTime"
+ ]
+ description = {
+ "BackupDetails": self.details,
+ "SourceTableDetails": source_table_details,
+ }
+ return description
+
+
+class DynamoDBBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.tables = OrderedDict()
+ self.backups = OrderedDict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ # No 'vpce' in the base endpoint DNS name
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region,
+ zones,
+ "dynamodb",
+ "Gateway",
+ private_dns_names=False,
+ base_endpoint_dns_names=[f"dynamodb.{service_region}.amazonaws.com"],
+ )
+
+ def create_table(self, name, **params):
+ if name in self.tables:
+ raise ResourceInUseException
+ table = Table(name, region=self.region_name, **params)
+ self.tables[name] = table
+ return table
+
+ def delete_table(self, name):
+ if name not in self.tables:
+ raise ResourceNotFoundException
+ return self.tables.pop(name, None)
+
+ def describe_endpoints(self):
+ return [
+ {
+ "Address": "dynamodb.{}.amazonaws.com".format(self.region_name),
+ "CachePeriodInMinutes": 1440,
+ }
+ ]
+
+ def tag_resource(self, table_arn, tags):
+ for table in self.tables:
+ if self.tables[table].table_arn == table_arn:
+ self.tables[table].tags.extend(tags)
+
+ def untag_resource(self, table_arn, tag_keys):
+ for table in self.tables:
+ if self.tables[table].table_arn == table_arn:
+ self.tables[table].tags = [
+ tag for tag in self.tables[table].tags if tag["Key"] not in tag_keys
+ ]
+
+ def list_tags_of_resource(self, table_arn):
+ for table in self.tables:
+ if self.tables[table].table_arn == table_arn:
+ return self.tables[table].tags
+ raise ResourceNotFoundException
+
+ def list_tables(self, limit, exclusive_start_table_name):
+ all_tables = list(self.tables.keys())
+
+ if exclusive_start_table_name:
+ try:
+ last_table_index = all_tables.index(exclusive_start_table_name)
+ except ValueError:
+ start = len(all_tables)
+ else:
+ start = last_table_index + 1
+ else:
+ start = 0
+
+ if limit:
+ tables = all_tables[start : start + limit]
+ else:
+ tables = all_tables[start:]
+
+ if limit and len(all_tables) > start + limit:
+ return tables, tables[-1]
+ return tables, None
+
+ def describe_table(self, name):
+ table = self.get_table(name)
+ return table.describe(base_key="Table")
+
+ def update_table(
+ self,
+ name,
+ attr_definitions,
+ global_index,
+ throughput,
+ billing_mode,
+ stream_spec,
+ ):
+ table = self.get_table(name)
+ if attr_definitions:
+ table.attr = attr_definitions
+ if global_index:
+ table = self.update_table_global_indexes(name, global_index)
+ if throughput:
+ table = self.update_table_throughput(name, throughput)
+ if billing_mode:
+ table = self.update_table_billing_mode(name, billing_mode)
+ if stream_spec:
+ table = self.update_table_streams(name, stream_spec)
+ return table
+
+ def update_table_throughput(self, name, throughput):
+ table = self.tables[name]
+ table.throughput = throughput
+ return table
+
+ def update_table_billing_mode(self, name, billing_mode):
+ table = self.tables[name]
+ table.billing_mode = billing_mode
+ return table
+
+ def update_table_streams(self, name, stream_specification):
+ table = self.tables[name]
+ if (
+ stream_specification.get("StreamEnabled")
+ or stream_specification.get("StreamViewType")
+ ) and table.latest_stream_label:
+ raise StreamAlreadyEnabledException
+ table.set_stream_specification(stream_specification)
+ return table
+
+ def update_table_global_indexes(self, name, global_index_updates):
+ table = self.tables[name]
+ gsis_by_name = dict((i.name, i) for i in table.global_indexes)
+ for gsi_update in global_index_updates:
+ gsi_to_create = gsi_update.get("Create")
+ gsi_to_update = gsi_update.get("Update")
+ gsi_to_delete = gsi_update.get("Delete")
+
+ if gsi_to_delete:
+ index_name = gsi_to_delete["IndexName"]
+ if index_name not in gsis_by_name:
+ raise ValueError(
+ "Global Secondary Index does not exist, but tried to delete: %s"
+ % gsi_to_delete["IndexName"]
+ )
+
+ del gsis_by_name[index_name]
+
+ if gsi_to_update:
+ index_name = gsi_to_update["IndexName"]
+ if index_name not in gsis_by_name:
+ raise ValueError(
+ "Global Secondary Index does not exist, but tried to update: %s"
+ % index_name
+ )
+ gsis_by_name[index_name].update(gsi_to_update)
+
+ if gsi_to_create:
+ if gsi_to_create["IndexName"] in gsis_by_name:
+ raise ValueError(
+ "Global Secondary Index already exists: %s"
+ % gsi_to_create["IndexName"]
+ )
+
+ gsis_by_name[gsi_to_create["IndexName"]] = GlobalSecondaryIndex.create(
+ gsi_to_create, table.table_key_attrs
+ )
+
+ # in python 3.6, dict.values() returns a dict_values object, but we expect it to be a list in other
+ # parts of the codebase
+ table.global_indexes = list(gsis_by_name.values())
+ return table
+
+ def put_item(
+ self,
+ table_name,
+ item_attrs,
+ expected=None,
+ condition_expression=None,
+ expression_attribute_names=None,
+ expression_attribute_values=None,
+ overwrite=False,
+ ):
+ table = self.get_table(table_name)
+ return table.put_item(
+ item_attrs,
+ expected,
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ overwrite,
+ )
+
+ def get_table_keys_name(self, table_name, keys):
+ """
+ Given a set of keys, extracts the key and range key
+ """
+ table = self.tables.get(table_name)
+ if not table:
+ return None, None
+ else:
+ if len(keys) == 1:
+ for key in keys:
+ if key in table.hash_key_names:
+ return key, None
+ # for potential_hash, potential_range in zip(table.hash_key_names, table.range_key_names):
+ # if set([potential_hash, potential_range]) == set(keys):
+ # return potential_hash, potential_range
+ potential_hash, potential_range = None, None
+ for key in set(keys):
+ if key in table.hash_key_names:
+ potential_hash = key
+ elif key in table.range_key_names:
+ potential_range = key
+ return potential_hash, potential_range
+
+ def get_keys_value(self, table, keys):
+ if table.hash_key_attr not in keys or (
+ table.has_range_key and table.range_key_attr not in keys
+ ):
+ # "Table has a range key, but no range key was passed into get_item"
+ raise MockValidationException("Validation Exception")
+ hash_key = DynamoType(keys[table.hash_key_attr])
+ range_key = (
+ DynamoType(keys[table.range_key_attr]) if table.has_range_key else None
+ )
+ return hash_key, range_key
+
+ def get_schema(self, table_name, index_name):
+ table = self.get_table(table_name)
+ if index_name:
+ all_indexes = (table.global_indexes or []) + (table.indexes or [])
+ indexes_by_name = dict((i.name, i) for i in all_indexes)
+ if index_name not in indexes_by_name:
+ raise ResourceNotFoundException(
+ "Invalid index: {} for table: {}. Available indexes are: {}".format(
+ index_name, table_name, ", ".join(indexes_by_name.keys())
+ )
+ )
+
+ return indexes_by_name[index_name].schema
+ else:
+ return table.schema
+
+ def get_table(self, table_name):
+ if table_name not in self.tables:
+ raise ResourceNotFoundException()
+ return self.tables.get(table_name)
+
+ def get_item(self, table_name, keys, projection_expression=None):
+ table = self.get_table(table_name)
+ hash_key, range_key = self.get_keys_value(table, keys)
+ return table.get_item(hash_key, range_key, projection_expression)
+
+ def query(
+ self,
+ table_name,
+ hash_key_dict,
+ range_comparison,
+ range_value_dicts,
+ limit,
+ exclusive_start_key,
+ scan_index_forward,
+ projection_expression,
+ index_name=None,
+ expr_names=None,
+ expr_values=None,
+ filter_expression=None,
+ **filter_kwargs,
+ ):
+ table = self.get_table(table_name)
+
+ hash_key = DynamoType(hash_key_dict)
+ range_values = [DynamoType(range_value) for range_value in range_value_dicts]
+
+ filter_expression = get_filter_expression(
+ filter_expression, expr_names, expr_values
+ )
+
+ return table.query(
+ hash_key,
+ range_comparison,
+ range_values,
+ limit,
+ exclusive_start_key,
+ scan_index_forward,
+ projection_expression,
+ index_name,
+ filter_expression,
+ **filter_kwargs,
+ )
+
+ def scan(
+ self,
+ table_name,
+ filters,
+ limit,
+ exclusive_start_key,
+ filter_expression,
+ expr_names,
+ expr_values,
+ index_name,
+ projection_expression,
+ ):
+ table = self.get_table(table_name)
+
+ scan_filters = {}
+ for key, (comparison_operator, comparison_values) in filters.items():
+ dynamo_types = [DynamoType(value) for value in comparison_values]
+ scan_filters[key] = (comparison_operator, dynamo_types)
+
+ filter_expression = get_filter_expression(
+ filter_expression, expr_names, expr_values
+ )
+
+ projection_expression = ",".join(
+ [
+ expr_names.get(attr, attr)
+ for attr in projection_expression.replace(" ", "").split(",")
+ ]
+ )
+
+ return table.scan(
+ scan_filters,
+ limit,
+ exclusive_start_key,
+ filter_expression,
+ index_name,
+ projection_expression,
+ )
+
+ def update_item(
+ self,
+ table_name,
+ key,
+ update_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ attribute_updates=None,
+ expected=None,
+ condition_expression=None,
+ ):
+ table = self.get_table(table_name)
+
+ # Support spaces between operators in an update expression
+ # E.g. `a = b + c` -> `a=b+c`
+ if update_expression:
+ # Parse expression to get validation errors
+ update_expression_ast = UpdateExpressionParser.make(update_expression)
+ update_expression = re.sub(r"\s*([=\+-])\s*", "\\1", update_expression)
+ update_expression_ast.validate()
+
+ if all([table.hash_key_attr in key, table.range_key_attr in key]):
+ # Covers cases where table has hash and range keys, ``key`` param
+ # will be a dict
+ hash_value = DynamoType(key[table.hash_key_attr])
+ range_value = DynamoType(key[table.range_key_attr])
+ elif table.hash_key_attr in key:
+ # Covers tables that have a range key where ``key`` param is a dict
+ hash_value = DynamoType(key[table.hash_key_attr])
+ range_value = None
+ else:
+ # Covers other cases
+ hash_value = DynamoType(key)
+ range_value = None
+
+ item = table.get_item(hash_value, range_value)
+ orig_item = copy.deepcopy(item)
+
+ if not expected:
+ expected = {}
+
+ if not get_expected(expected).expr(item):
+ raise ConditionalCheckFailed
+ condition_op = get_filter_expression(
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ )
+ if not condition_op.expr(item):
+ raise ConditionalCheckFailed
+
+ # Update does not fail on new items, so create one
+ if item is None:
+ if update_expression:
+ # Validate AST before creating anything
+ item = Item(hash_value, range_value, attrs={})
+ UpdateExpressionValidator(
+ update_expression_ast,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ item=item,
+ table=table,
+ ).validate()
+ data = {table.hash_key_attr: {hash_value.type: hash_value.value}}
+ if range_value:
+ data.update(
+ {table.range_key_attr: {range_value.type: range_value.value}}
+ )
+
+ table.put_item(data)
+ item = table.get_item(hash_value, range_value)
+
+ if attribute_updates:
+ item.validate_no_empty_key_values(attribute_updates, table.attribute_keys)
+
+ if update_expression:
+ validator = UpdateExpressionValidator(
+ update_expression_ast,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ item=item,
+ table=table,
+ )
+ validated_ast = validator.validate()
+ try:
+ UpdateExpressionExecutor(
+ validated_ast, item, expression_attribute_names
+ ).execute()
+ except ItemSizeTooLarge:
+ raise ItemSizeToUpdateTooLarge()
+ else:
+ item.update_with_attribute_updates(attribute_updates)
+ if table.stream_shard is not None:
+ table.stream_shard.add(orig_item, item)
+ return item
+
+ def delete_item(
+ self,
+ table_name,
+ key,
+ expression_attribute_names=None,
+ expression_attribute_values=None,
+ condition_expression=None,
+ ):
+ table = self.get_table(table_name)
+
+ hash_value, range_value = self.get_keys_value(table, key)
+ item = table.get_item(hash_value, range_value)
+
+ condition_op = get_filter_expression(
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ )
+ if not condition_op.expr(item):
+ raise ConditionalCheckFailed
+
+ return table.delete_item(hash_value, range_value)
+
+ def update_time_to_live(self, table_name, ttl_spec):
+ table = self.tables.get(table_name)
+ if table is None:
+ raise JsonRESTError("ResourceNotFound", "Table not found")
+
+ if "Enabled" not in ttl_spec or "AttributeName" not in ttl_spec:
+ raise JsonRESTError(
+ "InvalidParameterValue",
+ "TimeToLiveSpecification does not contain Enabled and AttributeName",
+ )
+
+ if ttl_spec["Enabled"]:
+ table.ttl["TimeToLiveStatus"] = "ENABLED"
+ else:
+ table.ttl["TimeToLiveStatus"] = "DISABLED"
+ table.ttl["AttributeName"] = ttl_spec["AttributeName"]
+
+ def describe_time_to_live(self, table_name):
+ table = self.tables.get(table_name)
+ if table is None:
+ raise JsonRESTError("ResourceNotFound", "Table not found")
+
+ return table.ttl
+
+ def transact_write_items(self, transact_items):
+ if len(transact_items) > 25:
+ raise TooManyTransactionsException()
+ # Create a backup in case any of the transactions fail
+ original_table_state = copy.deepcopy(self.tables)
+ target_items = set()
+
+ def check_unicity(table_name, key):
+ item = (str(table_name), str(key))
+ if item in target_items:
+ raise MultipleTransactionsException()
+ target_items.add(item)
+
+ errors = []
+ for item in transact_items:
+ try:
+ if "ConditionCheck" in item:
+ item = item["ConditionCheck"]
+ key = item["Key"]
+ table_name = item["TableName"]
+ check_unicity(table_name, key)
+ condition_expression = item.get("ConditionExpression", None)
+ expression_attribute_names = item.get(
+ "ExpressionAttributeNames", None
+ )
+ expression_attribute_values = item.get(
+ "ExpressionAttributeValues", None
+ )
+ current = self.get_item(table_name, key)
+
+ condition_op = get_filter_expression(
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ )
+ if not condition_op.expr(current):
+ raise ConditionalCheckFailed()
+ elif "Put" in item:
+ item = item["Put"]
+ attrs = item["Item"]
+ table_name = item["TableName"]
+ condition_expression = item.get("ConditionExpression", None)
+ expression_attribute_names = item.get(
+ "ExpressionAttributeNames", None
+ )
+ expression_attribute_values = item.get(
+ "ExpressionAttributeValues", None
+ )
+ self.put_item(
+ table_name,
+ attrs,
+ condition_expression=condition_expression,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ )
+ elif "Delete" in item:
+ item = item["Delete"]
+ key = item["Key"]
+ table_name = item["TableName"]
+ check_unicity(table_name, key)
+ condition_expression = item.get("ConditionExpression", None)
+ expression_attribute_names = item.get(
+ "ExpressionAttributeNames", None
+ )
+ expression_attribute_values = item.get(
+ "ExpressionAttributeValues", None
+ )
+ self.delete_item(
+ table_name,
+ key,
+ condition_expression=condition_expression,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ )
+ elif "Update" in item:
+ item = item["Update"]
+ key = item["Key"]
+ table_name = item["TableName"]
+ check_unicity(table_name, key)
+ update_expression = item["UpdateExpression"]
+ condition_expression = item.get("ConditionExpression", None)
+ expression_attribute_names = item.get(
+ "ExpressionAttributeNames", None
+ )
+ expression_attribute_values = item.get(
+ "ExpressionAttributeValues", None
+ )
+ self.update_item(
+ table_name,
+ key,
+ update_expression=update_expression,
+ condition_expression=condition_expression,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ )
+ else:
+ raise ValueError
+ errors.append((None, None))
+ except MultipleTransactionsException:
+ # Rollback to the original state, and reraise the error
+ self.tables = original_table_state
+ raise MultipleTransactionsException()
+ except Exception as e: # noqa: E722 Do not use bare except
+ errors.append((type(e).__name__, e.message))
+ if set(errors) != set([(None, None)]):
+ # Rollback to the original state, and reraise the errors
+ self.tables = original_table_state
+ raise TransactionCanceledException(errors)
+
+ def describe_continuous_backups(self, table_name):
+ try:
+ table = self.get_table(table_name)
+ except ResourceNotFoundException:
+ raise TableNotFoundException(table_name)
+
+ return table.continuous_backups
+
+ def update_continuous_backups(self, table_name, point_in_time_spec):
+ try:
+ table = self.get_table(table_name)
+ except ResourceNotFoundException:
+ raise TableNotFoundException(table_name)
+
+ if (
+ point_in_time_spec["PointInTimeRecoveryEnabled"]
+ and table.continuous_backups["PointInTimeRecoveryDescription"][
+ "PointInTimeRecoveryStatus"
+ ]
+ == "DISABLED"
+ ):
+ table.continuous_backups["PointInTimeRecoveryDescription"] = {
+ "PointInTimeRecoveryStatus": "ENABLED",
+ "EarliestRestorableDateTime": unix_time(),
+ "LatestRestorableDateTime": unix_time(),
+ }
+ elif not point_in_time_spec["PointInTimeRecoveryEnabled"]:
+ table.continuous_backups["PointInTimeRecoveryDescription"] = {
+ "PointInTimeRecoveryStatus": "DISABLED"
+ }
+
+ return table.continuous_backups
+
+ def get_backup(self, backup_arn):
+ if backup_arn not in self.backups:
+ raise BackupNotFoundException(backup_arn)
+ return self.backups.get(backup_arn)
+
+ def list_backups(self, table_name):
+ backups = list(self.backups.values())
+ if table_name is not None:
+ backups = [backup for backup in backups if backup.table.name == table_name]
+ return backups
+
+ def create_backup(self, table_name, backup_name):
+ try:
+ table = self.get_table(table_name)
+ except ResourceNotFoundException:
+ raise TableNotFoundException(table_name)
+ backup = Backup(self, backup_name, table)
+ self.backups[backup.arn] = backup
+ return backup
+
+ def delete_backup(self, backup_arn):
+ backup = self.get_backup(backup_arn)
+ if backup is None:
+ raise KeyError()
+ backup_deleted = self.backups.pop(backup_arn)
+ backup_deleted.status = "DELETED"
+ return backup_deleted
+
+ def describe_backup(self, backup_arn):
+ backup = self.get_backup(backup_arn)
+ if backup is None:
+ raise KeyError()
+ return backup
+
+ def restore_table_from_backup(self, target_table_name, backup_arn):
+ backup = self.get_backup(backup_arn)
+ if target_table_name in self.tables:
+ raise TableAlreadyExistsException(target_table_name)
+ new_table = RestoredTable(
+ target_table_name, region=self.region_name, backup=backup
+ )
+ self.tables[target_table_name] = new_table
+ return new_table
+
+ def restore_table_to_point_in_time(self, target_table_name, source_table_name):
+ """
+ Currently this only accepts the source and target table elements, and will
+ copy all items from the source without respect to other arguments.
+ """
+
+ try:
+ source = self.get_table(source_table_name)
+ except ResourceNotFoundException:
+ raise SourceTableNotFoundException(source_table_name)
+ if target_table_name in self.tables:
+ raise TableAlreadyExistsException(target_table_name)
+ new_table = RestoredPITTable(
+ target_table_name, region=self.region_name, source=source
+ )
+ self.tables[target_table_name] = new_table
+ return new_table
+
+ ######################
+ # LIST of methods where the logic completely resides in responses.py
+ # Duplicated here so that the implementation coverage script is aware
+ # TODO: Move logic here
+ ######################
+
+ def batch_get_item(self):
+ pass
+
+ def batch_write_item(self):
+ pass
+
+ def transact_get_items(self):
+ pass
+
+
+dynamodb_backends = BackendDict(DynamoDBBackend, "dynamodb")
diff --git a/contrib/python/moto/py3/moto/dynamodb/models/dynamo_type.py b/contrib/python/moto/py3/moto/dynamodb/models/dynamo_type.py
new file mode 100644
index 0000000000..2bf79663c1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/models/dynamo_type.py
@@ -0,0 +1,240 @@
+from moto.dynamodb.comparisons import get_comparison_func
+from moto.dynamodb.exceptions import IncorrectDataType
+from moto.dynamodb.models.utilities import bytesize
+
+
+class DDBType(object):
+ """
+ Official documentation at https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html
+ """
+
+ BINARY_SET = "BS"
+ NUMBER_SET = "NS"
+ STRING_SET = "SS"
+ STRING = "S"
+ NUMBER = "N"
+ MAP = "M"
+ LIST = "L"
+ BOOLEAN = "BOOL"
+ BINARY = "B"
+ NULL = "NULL"
+
+
+class DDBTypeConversion(object):
+ _human_type_mapping = {
+ val: key.replace("_", " ")
+ for key, val in DDBType.__dict__.items()
+ if key.upper() == key
+ }
+
+ @classmethod
+ def get_human_type(cls, abbreviated_type):
+ """
+ Args:
+ abbreviated_type(str): An attribute of DDBType
+
+ Returns:
+ str: The human readable form of the DDBType.
+ """
+ return cls._human_type_mapping.get(abbreviated_type, abbreviated_type)
+
+
+class DynamoType(object):
+ """
+ http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModelDataTypes
+ """
+
+ def __init__(self, type_as_dict):
+ if type(type_as_dict) == DynamoType:
+ self.type = type_as_dict.type
+ self.value = type_as_dict.value
+ else:
+ self.type = list(type_as_dict)[0]
+ self.value = list(type_as_dict.values())[0]
+ if self.is_list():
+ self.value = [DynamoType(val) for val in self.value]
+ elif self.is_map():
+ self.value = dict((k, DynamoType(v)) for k, v in self.value.items())
+
+ def filter(self, projection_expressions):
+ nested_projections = [
+ expr[0 : expr.index(".")] for expr in projection_expressions if "." in expr
+ ]
+ if self.is_map():
+ expressions_to_delete = []
+ for attr in self.value:
+ if (
+ attr not in projection_expressions
+ and attr not in nested_projections
+ ):
+ expressions_to_delete.append(attr)
+ elif attr in nested_projections:
+ relevant_expressions = [
+ expr[len(attr + ".") :]
+ for expr in projection_expressions
+ if expr.startswith(attr + ".")
+ ]
+ self.value[attr].filter(relevant_expressions)
+ for expr in expressions_to_delete:
+ self.value.pop(expr)
+
+ def __hash__(self):
+ return hash((self.type, self.value))
+
+ def __eq__(self, other):
+ return self.type == other.type and self.value == other.value
+
+ def __ne__(self, other):
+ return self.type != other.type or self.value != other.value
+
+ def __lt__(self, other):
+ return self.cast_value < other.cast_value
+
+ def __le__(self, other):
+ return self.cast_value <= other.cast_value
+
+ def __gt__(self, other):
+ return self.cast_value > other.cast_value
+
+ def __ge__(self, other):
+ return self.cast_value >= other.cast_value
+
+ def __repr__(self):
+ return "DynamoType: {0}".format(self.to_json())
+
+ def __add__(self, other):
+ if self.type != other.type:
+ raise TypeError("Different types of operandi is not allowed.")
+ if self.is_number():
+ self_value = float(self.value) if "." in self.value else int(self.value)
+ other_value = float(other.value) if "." in other.value else int(other.value)
+ return DynamoType(
+ {DDBType.NUMBER: "{v}".format(v=self_value + other_value)}
+ )
+ else:
+ raise IncorrectDataType()
+
+ def __sub__(self, other):
+ if self.type != other.type:
+ raise TypeError("Different types of operandi is not allowed.")
+ if self.type == DDBType.NUMBER:
+ self_value = float(self.value) if "." in self.value else int(self.value)
+ other_value = float(other.value) if "." in other.value else int(other.value)
+ return DynamoType(
+ {DDBType.NUMBER: "{v}".format(v=self_value - other_value)}
+ )
+ else:
+ raise TypeError("Sum only supported for Numbers.")
+
+ def __getitem__(self, item):
+ if isinstance(item, str):
+ # If our DynamoType is a map it should be subscriptable with a key
+ if self.type == DDBType.MAP:
+ return self.value[item]
+ elif isinstance(item, int):
+ # If our DynamoType is a list is should be subscriptable with an index
+ if self.type == DDBType.LIST:
+ return self.value[item]
+ raise TypeError(
+ "This DynamoType {dt} is not subscriptable by a {it}".format(
+ dt=self.type, it=type(item)
+ )
+ )
+
+ def __setitem__(self, key, value):
+ if isinstance(key, int):
+ if self.is_list():
+ if key >= len(self.value):
+ # DynamoDB doesn't care you are out of box just add it to the end.
+ self.value.append(value)
+ else:
+ self.value[key] = value
+ elif isinstance(key, str):
+ if self.is_map():
+ self.value[key] = value
+ else:
+ raise NotImplementedError("No set_item for {t}".format(t=type(key)))
+
+ @property
+ def cast_value(self):
+ if self.is_number():
+ try:
+ return int(self.value)
+ except ValueError:
+ return float(self.value)
+ elif self.is_set():
+ sub_type = self.type[0]
+ return set([DynamoType({sub_type: v}).cast_value for v in self.value])
+ elif self.is_list():
+ return [DynamoType(v).cast_value for v in self.value]
+ elif self.is_map():
+ return dict([(k, DynamoType(v).cast_value) for k, v in self.value.items()])
+ else:
+ return self.value
+
+ def child_attr(self, key):
+ """
+ Get Map or List children by key. str for Map, int for List.
+
+ Returns DynamoType or None.
+ """
+ if isinstance(key, str) and self.is_map():
+ if key in self.value:
+ return DynamoType(self.value[key])
+
+ if isinstance(key, int) and self.is_list():
+ idx = key
+ if 0 <= idx < len(self.value):
+ return DynamoType(self.value[idx])
+
+ return None
+
+ def size(self):
+ if self.is_number():
+ value_size = len(str(self.value))
+ elif self.is_set():
+ sub_type = self.type[0]
+ value_size = sum([DynamoType({sub_type: v}).size() for v in self.value])
+ elif self.is_list():
+ value_size = sum([v.size() for v in self.value])
+ elif self.is_map():
+ value_size = sum(
+ [bytesize(k) + DynamoType(v).size() for k, v in self.value.items()]
+ )
+ elif type(self.value) == bool:
+ value_size = 1
+ else:
+ value_size = bytesize(self.value)
+ return value_size
+
+ def to_json(self):
+ return {self.type: self.value}
+
+ def compare(self, range_comparison, range_objs):
+ """
+ Compares this type against comparison filters
+ """
+ range_values = [obj.cast_value for obj in range_objs]
+ comparison_func = get_comparison_func(range_comparison)
+ return comparison_func(self.cast_value, *range_values)
+
+ def is_number(self):
+ return self.type == DDBType.NUMBER
+
+ def is_set(self):
+ return self.type in (DDBType.STRING_SET, DDBType.NUMBER_SET, DDBType.BINARY_SET)
+
+ def is_list(self):
+ return self.type == DDBType.LIST
+
+ def is_map(self):
+ return self.type == DDBType.MAP
+
+ def same_type(self, other):
+ return self.type == other.type
+
+ def pop(self, key, *args, **kwargs):
+ if self.is_map() or self.is_list():
+ self.value.pop(key, *args, **kwargs)
+ else:
+ raise TypeError("pop not supported for DynamoType {t}".format(t=self.type))
diff --git a/contrib/python/moto/py3/moto/dynamodb/models/utilities.py b/contrib/python/moto/py3/moto/dynamodb/models/utilities.py
new file mode 100644
index 0000000000..28c6676f53
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/models/utilities.py
@@ -0,0 +1,2 @@
+def bytesize(val):
+ return len(val.encode("utf-8"))
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/__init__.py b/contrib/python/moto/py3/moto/dynamodb/parsing/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/__init__.py
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/ast_nodes.py b/contrib/python/moto/py3/moto/dynamodb/parsing/ast_nodes.py
new file mode 100644
index 0000000000..6c7176d698
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/ast_nodes.py
@@ -0,0 +1,370 @@
+import abc
+from abc import abstractmethod
+from collections import deque
+
+from moto.dynamodb.models import DynamoType
+from ..exceptions import TooManyAddClauses
+
+
+class Node(metaclass=abc.ABCMeta):
+ def __init__(self, children=None):
+ self.type = self.__class__.__name__
+ assert children is None or isinstance(children, list)
+ self.children = children
+ self.parent = None
+
+ if isinstance(children, list):
+ for child in children:
+ if isinstance(child, Node):
+ child.set_parent(self)
+
+ def set_parent(self, parent_node):
+ self.parent = parent_node
+
+ def validate(self):
+ if self.type == "UpdateExpression":
+ nr_of_clauses = len(self.find_clauses(UpdateExpressionAddClause))
+ if nr_of_clauses > 1:
+ raise TooManyAddClauses()
+
+ def find_clauses(self, clause_type):
+ clauses = []
+ for child in self.children or []:
+ if isinstance(child, clause_type):
+ clauses.append(child)
+ elif isinstance(child, Expression):
+ clauses.extend(child.find_clauses(clause_type))
+ return clauses
+
+
+class LeafNode(Node):
+ """A LeafNode is a Node where none of the children are Nodes themselves."""
+
+ def __init__(self, children=None):
+ super().__init__(children)
+
+
+class Expression(Node, metaclass=abc.ABCMeta):
+ """
+ Abstract Syntax Tree representing the expression
+
+ For the Grammar start here and jump down into the classes at the righ-hand side to look further. Nodes marked with
+ a star are abstract and won't appear in the final AST.
+
+ Expression* => UpdateExpression
+ Expression* => ConditionExpression
+ """
+
+
+class UpdateExpression(Expression):
+ """
+ UpdateExpression => UpdateExpressionClause*
+ UpdateExpression => UpdateExpressionClause* UpdateExpression
+ """
+
+
+class UpdateExpressionClause(UpdateExpression, metaclass=abc.ABCMeta):
+ """
+ UpdateExpressionClause* => UpdateExpressionSetClause
+ UpdateExpressionClause* => UpdateExpressionRemoveClause
+ UpdateExpressionClause* => UpdateExpressionAddClause
+ UpdateExpressionClause* => UpdateExpressionDeleteClause
+ """
+
+
+class UpdateExpressionSetClause(UpdateExpressionClause):
+ """
+ UpdateExpressionSetClause => SET SetActions
+ """
+
+
+class UpdateExpressionSetActions(UpdateExpressionClause):
+ """
+ UpdateExpressionSetClause => SET SetActions
+
+ SetActions => SetAction
+ SetActions => SetAction , SetActions
+
+ """
+
+
+class UpdateExpressionSetAction(UpdateExpressionClause):
+ """
+ SetAction => Path = Value
+ """
+
+
+class UpdateExpressionRemoveActions(UpdateExpressionClause):
+ """
+ UpdateExpressionSetClause => REMOVE RemoveActions
+
+ RemoveActions => RemoveAction
+ RemoveActions => RemoveAction , RemoveActions
+ """
+
+
+class UpdateExpressionRemoveAction(UpdateExpressionClause):
+ """
+ RemoveAction => Path
+ """
+
+
+class UpdateExpressionAddActions(UpdateExpressionClause):
+ """
+ UpdateExpressionAddClause => ADD RemoveActions
+
+ AddActions => AddAction
+ AddActions => AddAction , AddActions
+ """
+
+
+class UpdateExpressionAddAction(UpdateExpressionClause):
+ """
+ AddAction => Path Value
+ """
+
+
+class UpdateExpressionDeleteActions(UpdateExpressionClause):
+ """
+ UpdateExpressionDeleteClause => DELETE RemoveActions
+
+ DeleteActions => DeleteAction
+ DeleteActions => DeleteAction , DeleteActions
+ """
+
+
+class UpdateExpressionDeleteAction(UpdateExpressionClause):
+ """
+ DeleteAction => Path Value
+ """
+
+
+class UpdateExpressionPath(UpdateExpressionClause):
+ pass
+
+
+class UpdateExpressionValue(UpdateExpressionClause):
+ """
+ Value => Operand
+ Value => Operand + Value
+ Value => Operand - Value
+ """
+
+
+class UpdateExpressionGroupedValue(UpdateExpressionClause):
+ """
+ GroupedValue => ( Value )
+ """
+
+
+class UpdateExpressionRemoveClause(UpdateExpressionClause):
+ """
+ UpdateExpressionRemoveClause => REMOVE RemoveActions
+ """
+
+
+class UpdateExpressionAddClause(UpdateExpressionClause):
+ """
+ UpdateExpressionAddClause => ADD AddActions
+ """
+
+
+class UpdateExpressionDeleteClause(UpdateExpressionClause):
+ """
+ UpdateExpressionDeleteClause => DELETE DeleteActions
+ """
+
+
+class ExpressionPathDescender(Node):
+ """Node identifying descender into nested structure (.) in expression"""
+
+
+class ExpressionSelector(LeafNode):
+ """Node identifying selector [selection_index] in expresion"""
+
+ def __init__(self, selection_index):
+ try:
+ super().__init__(children=[int(selection_index)])
+ except ValueError:
+ assert (
+ False
+ ), "Expression selector must be an int, this is a bug in the moto library."
+
+ def get_index(self):
+ return self.children[0]
+
+
+class ExpressionAttribute(LeafNode):
+ """An attribute identifier as used in the DDB item"""
+
+ def __init__(self, attribute):
+ super().__init__(children=[attribute])
+
+ def get_attribute_name(self):
+ return self.children[0]
+
+
+class ExpressionAttributeName(LeafNode):
+ """An ExpressionAttributeName is an alias for an attribute identifier"""
+
+ def __init__(self, attribute_name):
+ super().__init__(children=[attribute_name])
+
+ def get_attribute_name_placeholder(self):
+ return self.children[0]
+
+
+class ExpressionAttributeValue(LeafNode):
+ """An ExpressionAttributeValue is an alias for an value"""
+
+ def __init__(self, value):
+ super().__init__(children=[value])
+
+ def get_value_name(self):
+ return self.children[0]
+
+
+class ExpressionValueOperator(LeafNode):
+ """An ExpressionValueOperator is an operation that works on 2 values"""
+
+ def __init__(self, value):
+ super().__init__(children=[value])
+
+ def get_operator(self):
+ return self.children[0]
+
+
+class UpdateExpressionFunction(Node):
+ """
+ A Node representing a function of an Update Expression. The first child is the function name the others are the
+ arguments.
+ """
+
+ def get_function_name(self):
+ return self.children[0]
+
+ def get_nth_argument(self, n=1):
+ """Return nth element where n is a 1-based index."""
+ assert n >= 1
+ return self.children[n]
+
+
+class DDBTypedValue(Node):
+ """
+ A node representing a DDBTyped value. This can be any structure as supported by DyanmoDB. The node only has 1 child
+ which is the value of type `DynamoType`.
+ """
+
+ def __init__(self, value):
+ assert isinstance(value, DynamoType), "DDBTypedValue must be of DynamoType"
+ super().__init__(children=[value])
+
+ def get_value(self):
+ return self.children[0]
+
+
+class NoneExistingPath(LeafNode):
+ """A placeholder for Paths that did not exist in the Item."""
+
+ def __init__(self, creatable=False):
+ super().__init__(children=[creatable])
+
+ def is_creatable(self):
+ """Can this path be created if need be. For example path creating element in a dictionary or creating a new
+ attribute under root level of an item."""
+ return self.children[0]
+
+
+class DepthFirstTraverser(object):
+ """
+ Helper class that allows depth first traversal and to implement custom processing for certain AST nodes. The
+ processor of a node must return the new resulting node. This node will be placed in the tree. Processing of a
+ node using this traverser should therefore only transform child nodes. The returned node will get the same parent
+ as the node before processing had.
+ """
+
+ @abstractmethod
+ def _processing_map(self):
+ """
+ A map providing a processing function per node class type to a function that takes in a Node object and
+ processes it. A Node can only be processed by a single function and they are considered in order. Therefore if
+ multiple classes from a single class hierarchy strain are used the more specific classes have to be put before
+ the less specific ones. That requires overriding `nodes_to_be_processed`. If no multiple classes form a single
+ class hierarchy strain are used the default implementation of `nodes_to_be_processed` should be OK.
+ Returns:
+ dict: Mapping a Node Class to a processing function.
+ """
+ pass
+
+ def nodes_to_be_processed(self):
+ """Cached accessor for getting Node types that need to be processed."""
+ return tuple(k for k in self._processing_map().keys())
+
+ def process(self, node):
+ """Process a Node"""
+ for class_key, processor in self._processing_map().items():
+ if isinstance(node, class_key):
+ return processor(node)
+
+ def pre_processing_of_child(self, parent_node, child_id):
+ """Hook that is called pre-processing of the child at position `child_id`"""
+ pass
+
+ def traverse_node_recursively(self, node, child_id=-1):
+ """
+ Traverse nodes depth first processing nodes bottom up (if root node is considered the top).
+
+ Args:
+ node(Node): The node which is the last node to be processed but which allows to identify all the
+ work (which is in the children)
+ child_id(int): The index in the list of children from the parent that this node corresponds to
+
+ Returns:
+ Node: The node of the new processed AST
+ """
+ if isinstance(node, Node):
+ parent_node = node.parent
+ if node.children is not None:
+ for i, child_node in enumerate(node.children):
+ self.pre_processing_of_child(node, i)
+ self.traverse_node_recursively(child_node, i)
+ # noinspection PyTypeChecker
+ if isinstance(node, self.nodes_to_be_processed()):
+ node = self.process(node)
+ node.parent = parent_node
+ parent_node.children[child_id] = node
+ return node
+
+ def traverse(self, node):
+ return self.traverse_node_recursively(node)
+
+
+class NodeDepthLeftTypeFetcher(object):
+ """Helper class to fetch a node of a specific type. Depth left-first traversal"""
+
+ def __init__(self, node_type, root_node):
+ assert issubclass(node_type, Node)
+ self.node_type = node_type
+ self.root_node = root_node
+ self.queue = deque()
+ self.add_nodes_left_to_right_depth_first(self.root_node)
+
+ def add_nodes_left_to_right_depth_first(self, node):
+ if isinstance(node, Node) and node.children is not None:
+ for child_node in node.children:
+ self.add_nodes_left_to_right_depth_first(child_node)
+ self.queue.append(child_node)
+ self.queue.append(node)
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ return self.__next__()
+
+ def __next__(self):
+ while len(self.queue) > 0:
+ candidate = self.queue.popleft()
+ if isinstance(candidate, self.node_type):
+ return candidate
+ raise StopIteration
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/executors.py b/contrib/python/moto/py3/moto/dynamodb/parsing/executors.py
new file mode 100644
index 0000000000..2b403ff14c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/executors.py
@@ -0,0 +1,298 @@
+from abc import abstractmethod
+
+from moto.dynamodb.exceptions import (
+ IncorrectOperandType,
+ IncorrectDataType,
+ ProvidedKeyDoesNotExist,
+)
+from moto.dynamodb.models import DynamoType
+from moto.dynamodb.models.dynamo_type import DDBTypeConversion, DDBType
+from moto.dynamodb.parsing.ast_nodes import (
+ UpdateExpressionSetAction,
+ UpdateExpressionDeleteAction,
+ UpdateExpressionRemoveAction,
+ UpdateExpressionAddAction,
+ UpdateExpressionPath,
+ DDBTypedValue,
+ ExpressionAttribute,
+ ExpressionSelector,
+ ExpressionAttributeName,
+)
+from moto.dynamodb.parsing.validators import ExpressionPathResolver
+
+
+class NodeExecutor(object):
+ def __init__(self, ast_node, expression_attribute_names):
+ self.node = ast_node
+ self.expression_attribute_names = expression_attribute_names
+
+ @abstractmethod
+ def execute(self, item):
+ pass
+
+ def get_item_part_for_path_nodes(self, item, path_nodes):
+ """
+ For a list of path nodes travers the item by following the path_nodes
+ Args:
+ item(Item):
+ path_nodes(list):
+
+ Returns:
+
+ """
+ if len(path_nodes) == 0:
+ return item.attrs
+ else:
+ return ExpressionPathResolver(
+ self.expression_attribute_names
+ ).resolve_expression_path_nodes_to_dynamo_type(item, path_nodes)
+
+ def get_item_before_end_of_path(self, item):
+ """
+ Get the part ot the item where the item will perform the action. For most actions this should be the parent. As
+ that element will need to be modified by the action.
+ Args:
+ item(Item):
+
+ Returns:
+ DynamoType or dict: The path to be set
+ """
+ return self.get_item_part_for_path_nodes(
+ item, self.get_path_expression_nodes()[:-1]
+ )
+
+ def get_item_at_end_of_path(self, item):
+ """
+ For a DELETE the path points at the stringset so we need to evaluate the full path.
+ Args:
+ item(Item):
+
+ Returns:
+ DynamoType or dict: The path to be set
+ """
+ return self.get_item_part_for_path_nodes(item, self.get_path_expression_nodes())
+
+ # Get the part ot the item where the item will perform the action. For most actions this should be the parent. As
+ # that element will need to be modified by the action.
+ get_item_part_in_which_to_perform_action = get_item_before_end_of_path
+
+ def get_path_expression_nodes(self):
+ update_expression_path = self.node.children[0]
+ assert isinstance(update_expression_path, UpdateExpressionPath)
+ return update_expression_path.children
+
+ def get_element_to_action(self):
+ return self.get_path_expression_nodes()[-1]
+
+ def get_action_value(self):
+ """
+
+ Returns:
+ DynamoType: The value to be set
+ """
+ ddb_typed_value = self.node.children[1]
+ assert isinstance(ddb_typed_value, DDBTypedValue)
+ dynamo_type_value = ddb_typed_value.children[0]
+ assert isinstance(dynamo_type_value, DynamoType)
+ return dynamo_type_value
+
+
+class SetExecutor(NodeExecutor):
+ def execute(self, item):
+ self.set(
+ item_part_to_modify_with_set=self.get_item_part_in_which_to_perform_action(
+ item
+ ),
+ element_to_set=self.get_element_to_action(),
+ value_to_set=self.get_action_value(),
+ expression_attribute_names=self.expression_attribute_names,
+ )
+
+ @classmethod
+ def set(
+ cls,
+ item_part_to_modify_with_set,
+ element_to_set,
+ value_to_set,
+ expression_attribute_names,
+ ):
+ if isinstance(element_to_set, ExpressionAttribute):
+ attribute_name = element_to_set.get_attribute_name()
+ item_part_to_modify_with_set[attribute_name] = value_to_set
+ elif isinstance(element_to_set, ExpressionSelector):
+ index = element_to_set.get_index()
+ item_part_to_modify_with_set[index] = value_to_set
+ elif isinstance(element_to_set, ExpressionAttributeName):
+ attribute_name = expression_attribute_names[
+ element_to_set.get_attribute_name_placeholder()
+ ]
+ item_part_to_modify_with_set[attribute_name] = value_to_set
+ else:
+ raise NotImplementedError(
+ "Moto does not support setting {t} yet".format(t=type(element_to_set))
+ )
+
+
+class DeleteExecutor(NodeExecutor):
+ operator = "operator: DELETE"
+
+ def execute(self, item):
+ string_set_to_remove = self.get_action_value()
+ assert isinstance(string_set_to_remove, DynamoType)
+ if not string_set_to_remove.is_set():
+ raise IncorrectOperandType(
+ self.operator,
+ DDBTypeConversion.get_human_type(string_set_to_remove.type),
+ )
+
+ string_set = self.get_item_at_end_of_path(item)
+ assert isinstance(string_set, DynamoType)
+ if string_set.type != string_set_to_remove.type:
+ raise IncorrectDataType()
+ # String set is currently implemented as a list
+ string_set_list = string_set.value
+
+ stringset_to_remove_list = string_set_to_remove.value
+
+ for value in stringset_to_remove_list:
+ try:
+ string_set_list.remove(value)
+ except (KeyError, ValueError):
+ # DynamoDB does not mind if value is not present
+ pass
+
+ # DynamoDB does not support empty sets. If we've deleted
+ # the last item in the set, we have to remove the attribute.
+ if not string_set_list:
+ element = self.get_element_to_action()
+ if isinstance(element, ExpressionAttributeName):
+ attribute_name = self.expression_attribute_names[
+ element.get_attribute_name_placeholder()
+ ]
+ elif isinstance(element, ExpressionAttribute):
+ attribute_name = element.get_attribute_name()
+ else:
+ raise NotImplementedError(
+ "Moto does not support deleting {t} yet".format(t=type(element))
+ )
+ container = self.get_item_before_end_of_path(item)
+ del container[attribute_name]
+
+
+class RemoveExecutor(NodeExecutor):
+ def execute(self, item):
+ element_to_remove = self.get_element_to_action()
+ if isinstance(element_to_remove, ExpressionAttribute):
+ attribute_name = element_to_remove.get_attribute_name()
+ self.get_item_part_in_which_to_perform_action(item).pop(
+ attribute_name, None
+ )
+ elif isinstance(element_to_remove, ExpressionAttributeName):
+ attribute_name = self.expression_attribute_names[
+ element_to_remove.get_attribute_name_placeholder()
+ ]
+ self.get_item_part_in_which_to_perform_action(item).pop(
+ attribute_name, None
+ )
+ elif isinstance(element_to_remove, ExpressionSelector):
+ index = element_to_remove.get_index()
+ try:
+ self.get_item_part_in_which_to_perform_action(item).pop(index)
+ except IndexError:
+ # DynamoDB does not care that index is out of bounds, it will just do nothing.
+ pass
+ else:
+ raise NotImplementedError(
+ "Moto does not support setting {t} yet".format(
+ t=type(element_to_remove)
+ )
+ )
+
+
+class AddExecutor(NodeExecutor):
+ def execute(self, item):
+ value_to_add = self.get_action_value()
+ if isinstance(value_to_add, DynamoType):
+ if value_to_add.is_set():
+ try:
+ current_string_set = self.get_item_at_end_of_path(item)
+ except ProvidedKeyDoesNotExist:
+ current_string_set = DynamoType({value_to_add.type: []})
+ SetExecutor.set(
+ item_part_to_modify_with_set=self.get_item_before_end_of_path(
+ item
+ ),
+ element_to_set=self.get_element_to_action(),
+ value_to_set=current_string_set,
+ expression_attribute_names=self.expression_attribute_names,
+ )
+ assert isinstance(current_string_set, DynamoType)
+ if not current_string_set.type == value_to_add.type:
+ raise IncorrectDataType()
+ # Sets are implemented as list
+ for value in value_to_add.value:
+ if value in current_string_set.value:
+ continue
+ else:
+ current_string_set.value.append(value)
+ elif value_to_add.type == DDBType.NUMBER:
+ try:
+ existing_value = self.get_item_at_end_of_path(item)
+ except ProvidedKeyDoesNotExist:
+ existing_value = DynamoType({DDBType.NUMBER: "0"})
+
+ assert isinstance(existing_value, DynamoType)
+ if not existing_value.type == DDBType.NUMBER:
+ raise IncorrectDataType()
+ new_value = existing_value + value_to_add
+ SetExecutor.set(
+ item_part_to_modify_with_set=self.get_item_before_end_of_path(item),
+ element_to_set=self.get_element_to_action(),
+ value_to_set=new_value,
+ expression_attribute_names=self.expression_attribute_names,
+ )
+ else:
+ raise IncorrectDataType()
+
+
+class UpdateExpressionExecutor(object):
+ execution_map = {
+ UpdateExpressionSetAction: SetExecutor,
+ UpdateExpressionAddAction: AddExecutor,
+ UpdateExpressionRemoveAction: RemoveExecutor,
+ UpdateExpressionDeleteAction: DeleteExecutor,
+ }
+
+ def __init__(self, update_ast, item, expression_attribute_names):
+ self.update_ast = update_ast
+ self.item = item
+ self.expression_attribute_names = expression_attribute_names
+
+ def execute(self, node=None):
+ """
+ As explained in moto.dynamodb2.parsing.expressions.NestableExpressionParserMixin._create_node the order of nodes
+ in the AST can be translated of the order of statements in the expression. As such we can start at the root node
+ and process the nodes 1-by-1. If no specific execution for the node type is defined we can execute the children
+ in order since it will be a container node that is expandable and left child will be first in the statement.
+
+ Args:
+ node(Node):
+
+ Returns:
+ None
+ """
+ if node is None:
+ node = self.update_ast
+
+ node_executor = self.get_specific_execution(node)
+ if node_executor is None:
+ for node in node.children:
+ self.execute(node)
+ else:
+ node_executor(node, self.expression_attribute_names).execute(self.item)
+
+ def get_specific_execution(self, node):
+ for node_class in self.execution_map:
+ if isinstance(node, node_class):
+ return self.execution_map[node_class]
+ return None
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/expressions.py b/contrib/python/moto/py3/moto/dynamodb/parsing/expressions.py
new file mode 100644
index 0000000000..b3d2562cc0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/expressions.py
@@ -0,0 +1,1043 @@
+import logging
+from abc import abstractmethod
+import abc
+from collections import deque
+
+from moto.dynamodb.parsing.ast_nodes import (
+ UpdateExpression,
+ UpdateExpressionSetClause,
+ UpdateExpressionSetActions,
+ UpdateExpressionSetAction,
+ UpdateExpressionRemoveActions,
+ UpdateExpressionRemoveAction,
+ UpdateExpressionPath,
+ UpdateExpressionValue,
+ UpdateExpressionGroupedValue,
+ UpdateExpressionRemoveClause,
+ ExpressionPathDescender,
+ ExpressionSelector,
+ ExpressionAttribute,
+ ExpressionAttributeName,
+ ExpressionAttributeValue,
+ ExpressionValueOperator,
+ UpdateExpressionFunction,
+ UpdateExpressionAddClause,
+ UpdateExpressionAddActions,
+ UpdateExpressionAddAction,
+ UpdateExpressionDeleteAction,
+ UpdateExpressionDeleteActions,
+ UpdateExpressionDeleteClause,
+)
+from moto.dynamodb.exceptions import InvalidTokenException, InvalidUpdateExpression
+from moto.dynamodb.parsing.tokens import Token, ExpressionTokenizer
+
+
+logger = logging.getLogger(__name__)
+
+
+class NestableExpressionParserMixin(object):
+ """
+ For nodes that can be nested in themselves (recursive). Take for example UpdateExpression's grammar:
+
+ UpdateExpression => UpdateExpressionClause*
+ UpdateExpression => UpdateExpressionClause* UpdateExpression
+
+ If we consider it of structure
+ NestableExpression => TargetClause*
+ NestableExpression => TargetClause* NestableExpression
+
+ This pattern comes back multiple times. This Mixin adds re-usability for that type of pattern.
+
+ This approach is taken since it allows to remain the ordering of the Nodes as how the corresponding tokens where
+ in the originating expression.
+ """
+
+ def __init__(self):
+ self.target_clauses = deque()
+
+ def _parse_target_clause(self, factory_class):
+ """
+
+ Args:
+ factory_class: The factory for the target clause e.g. UpdateExpressionSetClauseParser
+
+ Returns:
+
+ """
+ logger.debug(
+ "Move token pos {pos} to continue parsing with specific factory class {fc}".format(
+ pos=self.token_pos, fc=factory_class.__class__.__name__
+ )
+ )
+ # noinspection PyProtectedMember
+ ast, token_pos = factory_class(**self._initializer_args())._parse_with_pos()
+ self.target_clauses.append(ast)
+ logger.debug(
+ "Continue where previous parsing ended {token_pos}".format(
+ token_pos=token_pos
+ )
+ )
+ self.token_pos = token_pos
+
+ @abstractmethod
+ def _initializer_args(self):
+ """
+ Get the arguments of the initializer. This is implemented by the calling class. See ExpressionParser for an
+ example.
+
+ Returns:
+ dict: A dictionary of the initializer arguments
+ """
+
+ @classmethod
+ @abstractmethod
+ def _nestable_class(cls):
+ """
+ Get the class of the Node that will be created that would be nested. For the example in the docstring this would
+ be UpdateExpression
+
+ Returns:
+ class: The class of the Nodes that will be created.
+ """
+
+ def _create_node(self):
+ """
+ target_clauses has the nodes in order of encountering. Go through them backwards and build the tree bottom up.
+
+ This way left-deep-descending traversal will process nodes in order.
+
+ Continuing the example of an UpdateExpression:
+ For example SET a=3 REMOVE b
+ UpdateExpression
+ / \
+ SET a=3 UpdateExpression
+ |
+ REMOVE b
+
+ self.target_clauses looks like: ( SET a=3 >> REMOVE b )
+ Returns:
+ moto.dynamodb2.ast_nodes.Node: Node of an AST representing the Expression as produced by the factory.
+ """
+ assert len(self.target_clauses) > 0, "No nodes for {cn}".format(
+ cn=self.__class__.__name__
+ )
+ target_node = self._nestable_class()(children=[self.target_clauses.pop()])
+ while len(self.target_clauses) > 0:
+ target_node = self._nestable_class()(
+ children=[self.target_clauses.pop(), target_node]
+ )
+ return target_node
+
+
+class ExpressionParser(metaclass=abc.ABCMeta):
+ """Abstract class"""
+
+ def __init__(self, expression_token_list, token_pos=0):
+ """
+
+ Args:
+ expression_token_list:
+ token_pos(int): Location where parsing is
+ """
+ self.token_list = expression_token_list
+ self.token_pos = token_pos
+
+ def _initializer_args(self):
+ return {"expression_token_list": self.token_list, "token_pos": self.token_pos}
+
+ @abstractmethod
+ def _parse(self):
+ """
+ Start parsing the token_list from token_pos for the factory type.
+
+ Returns:
+ moto.dynamodb2.ast_nodes.Node: AST which is root node of resulting abstract syntax tree
+ """
+
+ @classmethod
+ def is_possible_start(cls, token):
+ return token is not None and cls._is_possible_start(token)
+
+ @classmethod
+ @abstractmethod
+ def _is_possible_start(cls, token):
+ """
+
+ Args:
+ token(moto.dynamodb2.tokens.Token):
+
+ Returns:
+ bool: True if token is a possible start for entries processed by `cls`
+ """
+
+ def _parse_with_pos(self):
+ """
+ Start parsing the token_list from token_pos for the factory type and also return the resulting token_pos.
+
+ Returns:
+ (ast, token_pos): tuple of AST which is root node of resulting abstract syntax tree and token_pos is the
+ position in the tokenlist.
+ """
+ return self._parse(), self.token_pos
+
+ def parse(self):
+ return self._parse()
+
+ def get_next_token_type(self):
+ """
+ Get the type of the next token to be processed
+
+ Returns:
+ str: Token type or None if no more next token
+ """
+ try:
+ return self.get_next_token().type
+ except AttributeError:
+ return None
+
+ def get_next_token(self):
+ """
+ Get the next token to be processed
+
+ Returns:
+ moto.dynamodb2.tokens.Token: or None if no more next token
+ """
+ try:
+ return self.token_list[self.token_pos]
+ except IndexError:
+ return None
+
+ def get_next_token_value(self):
+ """
+ Get the value of the next token to be processed
+
+ Returns:
+ str: value or None if no more next token
+ """
+ try:
+ return self.get_next_token().value
+ except AttributeError:
+ return None
+
+ def is_at_end(self):
+ """Return boolean indicating whether we are at end of the parsing"""
+ return self.token_pos == len(self.token_list)
+
+ def is_at_start(self):
+ """Return boolean indicating whether we are at start of the parsing"""
+ return self.token_pos == 0
+
+ def get_last_token_value(self):
+ """Get the last token that was correctly parsed or return empty string"""
+ if self.token_pos > 0:
+ return self.token_list[self.token_pos - 1].value
+ else:
+ return ""
+
+ def get_last_token_type(self):
+ """Get the last token type that was correctly parsed or return None"""
+ if self.token_pos > 0:
+ return self.token_list[self.token_pos - 1].type
+ else:
+ return None
+
+ def get_2nd_last_token_value_if_last_was_whitespace(self):
+ """Get the 2nd last token that was correctly parsed if last one was whitespace or return empty string"""
+ if self.token_pos > 1 and self.get_last_token_type() == Token.WHITESPACE:
+ return self.token_list[self.token_pos - 2].value
+ else:
+ return ""
+
+ def get_following_token_value(self):
+ """Get the token value after the one that is being parsed or empty string if non existent."""
+ try:
+ return self.token_list[self.token_pos + 1].value
+ except IndexError:
+ return ""
+
+ def get_following_token_type(self):
+ """Get the token type after the one that is being parsed or None if non existent."""
+ try:
+ return self.token_list[self.token_pos + 1].type
+ except IndexError:
+ return None
+
+ def get_2nd_following_token_value_if_following_was_whitespace(self):
+ """Get the 2nd following token that was correctly parsed if 1st one was whitespace or return empty string"""
+ if self.get_following_token_type() == Token.WHITESPACE:
+ try:
+ return self.token_list[self.token_pos + 2].value
+ except IndexError:
+ return ""
+ else:
+ return ""
+
+ def skip_white_space(self):
+ try:
+ while self.get_next_token_type() == Token.WHITESPACE:
+ self.token_pos += 1
+ except IndexError:
+ assert self.token_pos > 0, "We should always have positive indexes"
+ logger.debug("We are out of range so end is reached")
+
+ def process_token_of_type(self, token_type):
+ """
+ Maker sure the next token is of type `token_type` if not raise unexpected token
+ Args:
+ token_type: A token type
+
+ Returns:
+ str: The value if the token is of type `token_type`
+ """
+ if self.get_next_token_type() == token_type:
+ token_value = self.get_next_token_value()
+ self.goto_next_significant_token()
+ return token_value
+ else:
+ self.raise_unexpected_token()
+
+ def goto_next_significant_token(self):
+ """Continue past current token and skip all whitespaces"""
+ self.token_pos += 1
+ self.skip_white_space()
+
+ def raise_unexpected_token(self):
+ if self.is_at_end():
+ problematic_token = "<EOF>"
+ problematic_token_in_near = ""
+ else:
+ problematic_token_in_near = problematic_token = self.get_next_token_value()
+
+ near = "".join(
+ [
+ self.get_2nd_last_token_value_if_last_was_whitespace(),
+ self.get_last_token_value(),
+ problematic_token_in_near,
+ self.get_following_token_value(),
+ self.get_2nd_following_token_value_if_following_was_whitespace(),
+ ]
+ )
+
+ raise InvalidTokenException(problematic_token, near)
+
+
+class NestableBinExpressionParser(ExpressionParser):
+ """
+ For nodes that can be nested in themselves (recursive) but with an operation. Take for example
+ UpdateExpressionValue's grammar:
+
+ Value => Operand*
+ Value => Operand* + Value
+ Value => Operand* - Value
+
+ If we consider it of structure
+ NestableBinExpression => TargetClause*
+ NestableBinExpression => TargetClause* BinOp NestableBinExpression
+
+ This pattern comes back multiple times. This Mixin adds re-usability for that type of pattern.
+
+ This approach is taken since it allows to remain the ordering of the Nodes as how the corresponding tokens where
+ in the originating expression.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.target_nodes = deque()
+
+ def _parse_target_clause(self, factory_class):
+ """
+
+ Args:
+ factory_class: The factory for the target clause e.g. UpdateExpressionSetClauseParser
+
+ Returns:
+
+ """
+ # noinspection PyProtectedMember
+ ast, self.token_pos = factory_class(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.target_nodes.append(ast)
+ logger.debug(
+ "Continue where previous parsing ended {token_pos}".format(
+ token_pos=self.token_pos
+ )
+ )
+
+ def _parse(self):
+ self._parse_target_clause(self._operand_factory_class())
+ while self._binop_factory_class().is_possible_start(self.get_next_token()):
+ self._parse_target_clause(self._binop_factory_class())
+ if self._operand_factory_class().is_possible_start(self.get_next_token()):
+ self._parse_target_clause(self._operand_factory_class())
+ else:
+ self.raise_unexpected_token()
+ return self._create_node()
+
+ @abstractmethod
+ def _operand_factory_class(self):
+ """
+ Get the Parser class of the Operands for the Binary operations/actions.
+
+ Returns:
+ class:
+ """
+
+ @abstractmethod
+ def _binop_factory_class(self):
+ """
+ Get a factory that gets the possible binary operation.
+
+ Returns:
+ class: A class extending ExpressionParser
+ """
+
+ def _create_node(self):
+ """
+ target_clauses has the nodes in order of encountering. Go through them forward and build the tree bottom up.
+ For simplicity docstring will use Operand Node rather than the specific node
+
+ This way left-deep-descending traversal will process nodes in order.
+
+ Continuing the example of an UpdateExpressionValue:
+ For example value => a + :val - :val2
+ UpdateExpressionValue
+ / | \
+ UpdateExpressionValue BinOp Operand
+ / | | | |
+ UpdateExpressionValue BinOp Operand - :val2
+ / | |
+ Operand + :val
+ |
+ a
+
+ self.target_nodes looks like: ( a >> + >> :val >> - >> :val2 )
+ Returns:
+ moto.dynamodb2.ast_nodes.Node: Node of an AST representing the Expression as produced by the factory.
+ """
+ if len(self.target_nodes) == 1:
+ return UpdateExpressionValue(children=[self.target_nodes.popleft()])
+ else:
+ target_node = UpdateExpressionValue(
+ children=[
+ self.target_nodes.popleft(),
+ self.target_nodes.popleft(),
+ self.target_nodes.popleft(),
+ ]
+ )
+ while len(self.target_nodes) >= 2:
+ target_node = UpdateExpressionValue(
+ children=[
+ target_node,
+ self.target_nodes.popleft(),
+ self.target_nodes.popleft(),
+ ]
+ )
+ assert len(self.target_nodes) == 0
+ return target_node
+
+
+class UpdateExpressionParser(ExpressionParser, NestableExpressionParserMixin):
+ """
+ Parser to create update expressions
+ """
+
+ @classmethod
+ def _sub_factories(cls):
+ return [
+ UpdateExpressionSetClauseParser,
+ UpdateExpressionAddClauseParser,
+ UpdateExpressionDeleteClauseParser,
+ UpdateExpressionRemoveClauseParser,
+ ]
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ pass
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ NestableExpressionParserMixin.__init__(self)
+
+ @classmethod
+ def _nestable_class(cls):
+ return UpdateExpression
+
+ def _parse_expression_clause(self, factory_class):
+ return self._parse_target_clause(factory_class)
+
+ def _parse_by_a_subfactory(self):
+ for sub_factory in self._sub_factories():
+ if sub_factory.is_possible_start(self.get_next_token()):
+ self._parse_expression_clause(sub_factory)
+ return True
+ return False
+
+ def _parse(self):
+ """
+ Update Expression is the top-most node therefore it is expected to end up at the end of the expression.
+ """
+ while True:
+ self.skip_white_space()
+ if self.is_at_end():
+ logger.debug("End reached")
+ break
+ elif self._parse_by_a_subfactory():
+ continue
+ else:
+ self.raise_unexpected_token()
+
+ return self._create_node()
+
+ @classmethod
+ def make(cls, expression_str):
+ token_list = ExpressionTokenizer.make_list(expression_str)
+ return cls(token_list).parse()
+
+
+class UpdateExpressionSetClauseParser(ExpressionParser):
+ """
+ UpdateExpressionSetClause => SET SetActions
+ """
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type == Token.ATTRIBUTE and token.value.upper() == "SET"
+
+ def _parse(self):
+ assert self.is_possible_start(self.get_next_token())
+ self.goto_next_significant_token()
+ ast, self.token_pos = UpdateExpressionSetActionsParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ # noinspection PyProtectedMember
+ return UpdateExpressionSetClause(children=[ast])
+
+
+class UpdateExpressionActionsParser(ExpressionParser, NestableExpressionParserMixin):
+ """
+ UpdateExpressionSetActions
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ NestableExpressionParserMixin.__init__(self)
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ raise RuntimeError(
+ "{class_name} cannot be identified by the next token.".format(
+ class_name=cls._nestable_class().__name__
+ )
+ )
+
+ @classmethod
+ @abstractmethod
+ def _nestable_class(cls):
+ return UpdateExpressionSetActions
+
+ @classmethod
+ @abstractmethod
+ def _nested_expression_parser_class(cls):
+ """Returns the parser for the query part that creates the nested nodes"""
+
+ def _parse(self):
+ """
+ UpdateExpressionSetActions is inside the expression so it can be followed by others. Process SetActions one by
+ one until no more SetAction.
+ """
+ self.skip_white_space()
+
+ while self._nested_expression_parser_class().is_possible_start(
+ self.get_next_token()
+ ):
+ self._parse_target_clause(self._nested_expression_parser_class())
+ self.skip_white_space()
+ if self.get_next_token_type() == Token.COMMA:
+ self.goto_next_significant_token()
+ if self.is_at_end():
+ # The expression should not end with a comma
+ self.raise_unexpected_token()
+ else:
+ break
+
+ if len(self.target_clauses) == 0:
+ logger.debug(
+ "Didn't encounter a single {nc} in {nepc}.".format(
+ nc=self._nestable_class().__name__,
+ nepc=self._nested_expression_parser_class().__name__,
+ )
+ )
+ self.raise_unexpected_token()
+
+ return self._create_node()
+
+
+class UpdateExpressionSetActionsParser(UpdateExpressionActionsParser):
+ """
+ UpdateExpressionSetActions
+ """
+
+ @classmethod
+ def _nested_expression_parser_class(cls):
+ return UpdateExpressionSetActionParser
+
+ @classmethod
+ def _nestable_class(cls):
+ return UpdateExpressionSetActions
+
+
+class UpdateExpressionSetActionParser(ExpressionParser):
+ """
+ SetAction => Path = Value
+
+ So we create an UpdateExpressionSetAction Node that has 2 children. Left child Path and right child Value.
+ """
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return UpdateExpressionPathParser.is_possible_start(token)
+
+ def _parse(self):
+ """
+ UpdateExpressionSetActionParser only gets called when expecting a SetAction. So we should be aggressive on
+ raising invalid Tokens. We can thus do the following:
+ 1) Process path
+ 2) skip whitespace if there are any
+ 3) Process equal-sign token
+ 4) skip whitespace if there are any
+ 3) Process value
+
+ """
+ path, self.token_pos = UpdateExpressionPathParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.skip_white_space()
+ self.process_token_of_type(Token.EQUAL_SIGN)
+ self.skip_white_space()
+ value, self.token_pos = UpdateExpressionValueParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ return UpdateExpressionSetAction(children=[path, value])
+
+
+class UpdateExpressionPathParser(ExpressionParser):
+ """
+ Paths are selectors within items to specify a part within an Item. DynamoDB does not impose much restrictions on the
+ data it stores but it does store more strict restrictions on how they are represented in UpdateExpression's.
+
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.path_nodes = []
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ """
+ Args:
+ token(Token): the token to be checked
+
+ Returns:
+ bool: Whether the token could be the start of an UpdateExpressionPath
+ """
+ if token.type == Token.ATTRIBUTE_NAME:
+ return True
+ elif token.type == Token.ATTRIBUTE and token.value.upper() != "REMOVE":
+ """We have to make sure remove is not passed"""
+ return True
+ return False
+
+ def _parse(self):
+ return self.process_path()
+
+ def process_path(self):
+ self.parse_path()
+ return UpdateExpressionPath(children=self.path_nodes)
+
+ def parse_path(self):
+ """
+ A path is comprised of:
+ - Attribute: the name of an attribute as how it is stored which has no special characters
+ - ATTRIBUTE_NAME: A placeholder that has no special characters except leading # to refer to attributes that
+ have a name that is not allowed in an UpdateExpression)
+ - DOT's: These are used to decent in a nested structure. When a DOT is in a path expression it is never part
+ of an attribute name but always means to descent into a MAP. We will call each descend a patch
+ chain
+ - SELECTORs: E.g.: [1] These are used to select an element in ordered datatypes like a list.
+
+ Whitespaces can be between all these elements that build a path. For SELECTORs it is also allowed to have
+ whitespaces between brackets and numbers but the number cannot be split up with spaces
+
+ Attributes and attribute_names must be separated with DOT's.
+ Returns:
+ UpdateExpressionPath:
+ """
+ self.parse_path_chain()
+ while self.is_next_token_start_of_patch_chain():
+ self.process_dot()
+ self.parse_path_chain()
+
+ def is_next_token_start_of_patch_chain(self):
+ return self.get_next_token_type() == Token.DOT
+
+ def process_dot(self):
+ self.path_nodes.append(ExpressionPathDescender())
+ self.goto_next_significant_token()
+
+ def parse_path_chain(self):
+ self.process_attribute_identifying_token()
+ self.skip_white_space()
+ while self.is_next_token_start_of_selector():
+ self.process_selector()
+ self.skip_white_space()
+
+ def process_attribute_identifying_token(self):
+ if self.get_next_token_type() == Token.ATTRIBUTE:
+ self.path_nodes.append(ExpressionAttribute(self.get_next_token_value()))
+ elif self.get_next_token_type() == Token.ATTRIBUTE_NAME:
+ self.path_nodes.append(ExpressionAttributeName(self.get_next_token_value()))
+ else:
+ self.raise_unexpected_token()
+
+ self.goto_next_significant_token()
+
+ def is_next_token_start_of_selector(self):
+ return self.get_next_token_type() == Token.OPEN_SQUARE_BRACKET
+
+ def process_selector(self):
+ """
+ Process the selector is only called when a selector must be processed. So do the following actions:
+ - skip opening bracket
+ - skip optional spaces
+ - read numeric literal
+ - skip optional spaces
+ - pass closing bracket
+ """
+ self.process_token_of_type(Token.OPEN_SQUARE_BRACKET)
+ selector_value = self.process_token_of_type(Token.NUMBER)
+ self.process_token_of_type(Token.CLOSE_SQUARE_BRACKET)
+ self.path_nodes.append(ExpressionSelector(selector_value))
+
+
+class UpdateExpressionValueParser(NestableBinExpressionParser):
+ @classmethod
+ def _is_possible_start(cls, token):
+ return UpdateExpressionOperandParser.is_possible_start(token)
+
+ def _operand_factory_class(self):
+ return UpdateExpressionOperandParser
+
+ def _binop_factory_class(self):
+ return UpdateExpressionValueOperatorParser
+
+
+class UpdateExpressionGroupedValueParser(ExpressionParser):
+ """
+ A grouped value is an Update Expression value clause that is surrounded by round brackets. Each Operand can be
+ a grouped value by itself.
+ """
+
+ def _parse(self):
+ self.process_token_of_type(Token.OPEN_ROUND_BRACKET)
+ value, self.token_pos = UpdateExpressionValueParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.process_token_of_type(Token.CLOSE_ROUND_BRACKET)
+ return UpdateExpressionGroupedValue(children=value)
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type == Token.OPEN_ROUND_BRACKET
+
+
+class UpdateExpressionValueOperatorParser(ExpressionParser):
+ OPERATION_TOKENS = [Token.PLUS_SIGN, Token.MINUS_SIGN]
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type in cls.OPERATION_TOKENS
+
+ def _parse(self):
+ operation_value = self.get_next_token_value()
+ assert operation_value in self.OPERATION_TOKENS
+ self.goto_next_significant_token()
+ return ExpressionValueOperator(operation_value)
+
+
+class UpdateExpressionOperandParser(ExpressionParser):
+ """
+ Grammar
+ Operand* => AttributeValue
+ Operand* => UpdateExpressionFunction
+ Operand* => Path
+ Operand* => GroupedValue
+ """
+
+ @classmethod
+ def _sub_factories(cls):
+ return [
+ UpdateExpressionAttributeValueParser,
+ UpdateExpressionFunctionParser,
+ UpdateExpressionPathParser,
+ UpdateExpressionGroupedValueParser,
+ ]
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return any(parser.is_possible_start(token) for parser in cls._sub_factories())
+
+ def _parse(self):
+ for factory in self._sub_factories():
+ if factory.is_possible_start(self.get_next_token()):
+ node, self.token_pos = factory(
+ **self._initializer_args()
+ )._parse_with_pos()
+ return node
+ self.raise_unexpected_token()
+
+
+class UpdateExpressionAttributeValueParser(ExpressionParser):
+ def _parse(self):
+ attr_value = ExpressionAttributeValue(
+ self.process_token_of_type(Token.ATTRIBUTE_VALUE)
+ )
+ return attr_value
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type == Token.ATTRIBUTE_VALUE
+
+
+class UpdateExpressionAttributeValueOrPathParser(ExpressionParser):
+ def _parse(self):
+ if UpdateExpressionAttributeValueParser.is_possible_start(
+ self.get_next_token()
+ ):
+ token, self.token_pos = UpdateExpressionAttributeValueParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ else:
+ token, self.token_pos = UpdateExpressionPathParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ return token
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return any(
+ [
+ UpdateExpressionAttributeValueParser.is_possible_start(token),
+ UpdateExpressionPathParser.is_possible_start(token),
+ ]
+ )
+
+
+class UpdateExpressionFunctionParser(ExpressionParser):
+ """
+ A helper to process a function of an Update Expression
+ """
+
+ # Map function to the factories for its elements
+ FUNCTIONS = {
+ "if_not_exists": [
+ UpdateExpressionPathParser,
+ UpdateExpressionAttributeValueOrPathParser,
+ ],
+ "list_append": [UpdateExpressionOperandParser, UpdateExpressionOperandParser],
+ }
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ """
+ Check whether a token is supposed to be a function
+ Args:
+ token(Token): the token to check
+
+ Returns:
+ bool: True if token is the start of a function.
+ """
+ if token.type == Token.ATTRIBUTE:
+ return token.value in cls.FUNCTIONS.keys()
+ else:
+ return False
+
+ def _parse(self):
+ function_name = self.get_next_token_value()
+ if function_name not in self.FUNCTIONS.keys():
+ # Function names are case sensitive
+ raise InvalidUpdateExpression(function_name)
+ self.goto_next_significant_token()
+ self.process_token_of_type(Token.OPEN_ROUND_BRACKET)
+ function_elements = [function_name]
+ function_arguments = self.FUNCTIONS[function_name]
+ for i, func_elem_factory in enumerate(function_arguments):
+ func_elem, self.token_pos = func_elem_factory(
+ **self._initializer_args()
+ )._parse_with_pos()
+ function_elements.append(func_elem)
+ if i + 1 < len(function_arguments):
+ self.skip_white_space()
+ self.process_token_of_type(Token.COMMA)
+ self.process_token_of_type(Token.CLOSE_ROUND_BRACKET)
+ return UpdateExpressionFunction(children=function_elements)
+
+
+class UpdateExpressionRemoveClauseParser(ExpressionParser):
+ """
+ UpdateExpressionRemoveClause => REMOVE RemoveActions
+ """
+
+ def _parse(self):
+ assert self.is_possible_start(self.get_next_token())
+ self.goto_next_significant_token()
+ ast, self.token_pos = UpdateExpressionRemoveActionsParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ # noinspection PyProtectedMember
+ return UpdateExpressionRemoveClause(children=[ast])
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ """REMOVE is not a keyword"""
+ return token.type == Token.ATTRIBUTE and token.value.upper() == "REMOVE"
+
+
+class UpdateExpressionRemoveActionsParser(UpdateExpressionActionsParser):
+ """
+ UpdateExpressionSetActions
+ """
+
+ @classmethod
+ def _nested_expression_parser_class(cls):
+ return UpdateExpressionRemoveActionParser
+
+ @classmethod
+ def _nestable_class(cls):
+ return UpdateExpressionRemoveActions
+
+
+class UpdateExpressionRemoveActionParser(ExpressionParser):
+ """
+ RemoveAction => Path = Value
+
+ So we create an UpdateExpressionSetAction Node that has 2 children. Left child Path and right child Value.
+ """
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return UpdateExpressionPathParser.is_possible_start(token)
+
+ def _parse(self):
+ """
+ UpdateExpressionRemoveActionParser only gets called when expecting a RemoveAction. So we should be aggressive on
+ raising invalid Tokens. We can thus do the following:
+ 1) Process path
+ 2) skip whitespace if there are any
+
+ """
+ path, self.token_pos = UpdateExpressionPathParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.skip_white_space()
+ return UpdateExpressionRemoveAction(children=[path])
+
+
+class UpdateExpressionAddClauseParser(ExpressionParser):
+ def _parse(self):
+ assert self.is_possible_start(self.get_next_token())
+ self.goto_next_significant_token()
+ ast, self.token_pos = UpdateExpressionAddActionsParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ # noinspection PyProtectedMember
+ return UpdateExpressionAddClause(children=[ast])
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type == Token.ATTRIBUTE and token.value.upper() == "ADD"
+
+
+class UpdateExpressionAddActionsParser(UpdateExpressionActionsParser):
+ """
+ UpdateExpressionSetActions
+ """
+
+ @classmethod
+ def _nested_expression_parser_class(cls):
+ return UpdateExpressionAddActionParser
+
+ @classmethod
+ def _nestable_class(cls):
+ return UpdateExpressionAddActions
+
+
+class UpdateExpressionPathValueParser(ExpressionParser, metaclass=abc.ABCMeta):
+ def _parse_path_and_value(self):
+ """
+ UpdateExpressionAddActionParser only gets called when expecting an AddAction. So we should be aggressive on
+ raising invalid Tokens. We can thus do the following:
+ 1) Process path
+ 2) skip whitespace if there are any
+ 3) Process a value
+ 4) skip whitespace if there are any
+
+ Returns:
+ [path, value]: A list containing the Path node and the AttributeValue nodes
+ """
+ path, self.token_pos = UpdateExpressionPathParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.skip_white_space()
+ value, self.token_pos = UpdateExpressionAttributeValueParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ self.skip_white_space()
+ return [path, value]
+
+
+class UpdateExpressionAddActionParser(UpdateExpressionPathValueParser):
+ @classmethod
+ def _is_possible_start(cls, token):
+ return UpdateExpressionPathParser.is_possible_start(token)
+
+ def _parse(self):
+ return UpdateExpressionAddAction(children=self._parse_path_and_value())
+
+
+class UpdateExpressionDeleteClauseParser(ExpressionParser):
+ def _parse(self):
+ assert self.is_possible_start(self.get_next_token())
+ self.goto_next_significant_token()
+ ast, self.token_pos = UpdateExpressionDeleteActionsParser(
+ **self._initializer_args()
+ )._parse_with_pos()
+ # noinspection PyProtectedMember
+ return UpdateExpressionDeleteClause(children=[ast])
+
+ @classmethod
+ def _is_possible_start(cls, token):
+ return token.type == Token.ATTRIBUTE and token.value.upper() == "DELETE"
+
+
+class UpdateExpressionDeleteActionsParser(UpdateExpressionActionsParser):
+ """
+ UpdateExpressionSetActions
+ """
+
+ @classmethod
+ def _nested_expression_parser_class(cls):
+ return UpdateExpressionDeleteActionParser
+
+ @classmethod
+ def _nestable_class(cls):
+ return UpdateExpressionDeleteActions
+
+
+class UpdateExpressionDeleteActionParser(UpdateExpressionPathValueParser):
+ @classmethod
+ def _is_possible_start(cls, token):
+ return UpdateExpressionPathParser.is_possible_start(token)
+
+ def _parse(self):
+ return UpdateExpressionDeleteAction(children=self._parse_path_and_value())
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.py b/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.py
new file mode 100644
index 0000000000..7fa8ddb152
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.py
@@ -0,0 +1,27 @@
+from moto.utilities.utils import load_resource
+
+
+class ReservedKeywords(list):
+ """
+ DynamoDB has an extensive list of keywords. Keywords are considered when validating the expression Tree.
+ Not earlier since an update expression like "SET path = VALUE 1" fails with:
+ 'Invalid UpdateExpression: Syntax error; token: "1", near: "VALUE 1"'
+ """
+
+ KEYWORDS = None
+
+ @classmethod
+ def get_reserved_keywords(cls):
+ if cls.KEYWORDS is None:
+ cls.KEYWORDS = cls._get_reserved_keywords()
+ return cls.KEYWORDS
+
+ @classmethod
+ def _get_reserved_keywords(cls):
+ """
+ Get a list of reserved keywords of DynamoDB
+ """
+ reserved_keywords = load_resource(
+ __name__, "reserved_keywords.txt", as_json=False
+ )
+ return reserved_keywords.split()
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.txt b/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.txt
new file mode 100644
index 0000000000..7c0106127a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/reserved_keywords.txt
@@ -0,0 +1,573 @@
+ABORT
+ABSOLUTE
+ACTION
+ADD
+AFTER
+AGENT
+AGGREGATE
+ALL
+ALLOCATE
+ALTER
+ANALYZE
+AND
+ANY
+ARCHIVE
+ARE
+ARRAY
+AS
+ASC
+ASCII
+ASENSITIVE
+ASSERTION
+ASYMMETRIC
+AT
+ATOMIC
+ATTACH
+ATTRIBUTE
+AUTH
+AUTHORIZATION
+AUTHORIZE
+AUTO
+AVG
+BACK
+BACKUP
+BASE
+BATCH
+BEFORE
+BEGIN
+BETWEEN
+BIGINT
+BINARY
+BIT
+BLOB
+BLOCK
+BOOLEAN
+BOTH
+BREADTH
+BUCKET
+BULK
+BY
+BYTE
+CALL
+CALLED
+CALLING
+CAPACITY
+CASCADE
+CASCADED
+CASE
+CAST
+CATALOG
+CHAR
+CHARACTER
+CHECK
+CLASS
+CLOB
+CLOSE
+CLUSTER
+CLUSTERED
+CLUSTERING
+CLUSTERS
+COALESCE
+COLLATE
+COLLATION
+COLLECTION
+COLUMN
+COLUMNS
+COMBINE
+COMMENT
+COMMIT
+COMPACT
+COMPILE
+COMPRESS
+CONDITION
+CONFLICT
+CONNECT
+CONNECTION
+CONSISTENCY
+CONSISTENT
+CONSTRAINT
+CONSTRAINTS
+CONSTRUCTOR
+CONSUMED
+CONTINUE
+CONVERT
+COPY
+CORRESPONDING
+COUNT
+COUNTER
+CREATE
+CROSS
+CUBE
+CURRENT
+CURSOR
+CYCLE
+DATA
+DATABASE
+DATE
+DATETIME
+DAY
+DEALLOCATE
+DEC
+DECIMAL
+DECLARE
+DEFAULT
+DEFERRABLE
+DEFERRED
+DEFINE
+DEFINED
+DEFINITION
+DELETE
+DELIMITED
+DEPTH
+DEREF
+DESC
+DESCRIBE
+DESCRIPTOR
+DETACH
+DETERMINISTIC
+DIAGNOSTICS
+DIRECTORIES
+DISABLE
+DISCONNECT
+DISTINCT
+DISTRIBUTE
+DO
+DOMAIN
+DOUBLE
+DROP
+DUMP
+DURATION
+DYNAMIC
+EACH
+ELEMENT
+ELSE
+ELSEIF
+EMPTY
+ENABLE
+END
+EQUAL
+EQUALS
+ERROR
+ESCAPE
+ESCAPED
+EVAL
+EVALUATE
+EXCEEDED
+EXCEPT
+EXCEPTION
+EXCEPTIONS
+EXCLUSIVE
+EXEC
+EXECUTE
+EXISTS
+EXIT
+EXPLAIN
+EXPLODE
+EXPORT
+EXPRESSION
+EXTENDED
+EXTERNAL
+EXTRACT
+FAIL
+FALSE
+FAMILY
+FETCH
+FIELDS
+FILE
+FILTER
+FILTERING
+FINAL
+FINISH
+FIRST
+FIXED
+FLATTERN
+FLOAT
+FOR
+FORCE
+FOREIGN
+FORMAT
+FORWARD
+FOUND
+FREE
+FROM
+FULL
+FUNCTION
+FUNCTIONS
+GENERAL
+GENERATE
+GET
+GLOB
+GLOBAL
+GO
+GOTO
+GRANT
+GREATER
+GROUP
+GROUPING
+HANDLER
+HASH
+HAVE
+HAVING
+HEAP
+HIDDEN
+HOLD
+HOUR
+IDENTIFIED
+IDENTITY
+IF
+IGNORE
+IMMEDIATE
+IMPORT
+IN
+INCLUDING
+INCLUSIVE
+INCREMENT
+INCREMENTAL
+INDEX
+INDEXED
+INDEXES
+INDICATOR
+INFINITE
+INITIALLY
+INLINE
+INNER
+INNTER
+INOUT
+INPUT
+INSENSITIVE
+INSERT
+INSTEAD
+INT
+INTEGER
+INTERSECT
+INTERVAL
+INTO
+INVALIDATE
+IS
+ISOLATION
+ITEM
+ITEMS
+ITERATE
+JOIN
+KEY
+KEYS
+LAG
+LANGUAGE
+LARGE
+LAST
+LATERAL
+LEAD
+LEADING
+LEAVE
+LEFT
+LENGTH
+LESS
+LEVEL
+LIKE
+LIMIT
+LIMITED
+LINES
+LIST
+LOAD
+LOCAL
+LOCALTIME
+LOCALTIMESTAMP
+LOCATION
+LOCATOR
+LOCK
+LOCKS
+LOG
+LOGED
+LONG
+LOOP
+LOWER
+MAP
+MATCH
+MATERIALIZED
+MAX
+MAXLEN
+MEMBER
+MERGE
+METHOD
+METRICS
+MIN
+MINUS
+MINUTE
+MISSING
+MOD
+MODE
+MODIFIES
+MODIFY
+MODULE
+MONTH
+MULTI
+MULTISET
+NAME
+NAMES
+NATIONAL
+NATURAL
+NCHAR
+NCLOB
+NEW
+NEXT
+NO
+NONE
+NOT
+NULL
+NULLIF
+NUMBER
+NUMERIC
+OBJECT
+OF
+OFFLINE
+OFFSET
+OLD
+ON
+ONLINE
+ONLY
+OPAQUE
+OPEN
+OPERATOR
+OPTION
+OR
+ORDER
+ORDINALITY
+OTHER
+OTHERS
+OUT
+OUTER
+OUTPUT
+OVER
+OVERLAPS
+OVERRIDE
+OWNER
+PAD
+PARALLEL
+PARAMETER
+PARAMETERS
+PARTIAL
+PARTITION
+PARTITIONED
+PARTITIONS
+PATH
+PERCENT
+PERCENTILE
+PERMISSION
+PERMISSIONS
+PIPE
+PIPELINED
+PLAN
+POOL
+POSITION
+PRECISION
+PREPARE
+PRESERVE
+PRIMARY
+PRIOR
+PRIVATE
+PRIVILEGES
+PROCEDURE
+PROCESSED
+PROJECT
+PROJECTION
+PROPERTY
+PROVISIONING
+PUBLIC
+PUT
+QUERY
+QUIT
+QUORUM
+RAISE
+RANDOM
+RANGE
+RANK
+RAW
+READ
+READS
+REAL
+REBUILD
+RECORD
+RECURSIVE
+REDUCE
+REF
+REFERENCE
+REFERENCES
+REFERENCING
+REGEXP
+REGION
+REINDEX
+RELATIVE
+RELEASE
+REMAINDER
+RENAME
+REPEAT
+REPLACE
+REQUEST
+RESET
+RESIGNAL
+RESOURCE
+RESPONSE
+RESTORE
+RESTRICT
+RESULT
+RETURN
+RETURNING
+RETURNS
+REVERSE
+REVOKE
+RIGHT
+ROLE
+ROLES
+ROLLBACK
+ROLLUP
+ROUTINE
+ROW
+ROWS
+RULE
+RULES
+SAMPLE
+SATISFIES
+SAVE
+SAVEPOINT
+SCAN
+SCHEMA
+SCOPE
+SCROLL
+SEARCH
+SECOND
+SECTION
+SEGMENT
+SEGMENTS
+SELECT
+SELF
+SEMI
+SENSITIVE
+SEPARATE
+SEQUENCE
+SERIALIZABLE
+SESSION
+SET
+SETS
+SHARD
+SHARE
+SHARED
+SHORT
+SHOW
+SIGNAL
+SIMILAR
+SIZE
+SKEWED
+SMALLINT
+SNAPSHOT
+SOME
+SOURCE
+SPACE
+SPACES
+SPARSE
+SPECIFIC
+SPECIFICTYPE
+SPLIT
+SQL
+SQLCODE
+SQLERROR
+SQLEXCEPTION
+SQLSTATE
+SQLWARNING
+START
+STATE
+STATIC
+STATUS
+STORAGE
+STORE
+STORED
+STREAM
+STRING
+STRUCT
+STYLE
+SUB
+SUBMULTISET
+SUBPARTITION
+SUBSTRING
+SUBTYPE
+SUM
+SUPER
+SYMMETRIC
+SYNONYM
+SYSTEM
+TABLE
+TABLESAMPLE
+TEMP
+TEMPORARY
+TERMINATED
+TEXT
+THAN
+THEN
+THROUGHPUT
+TIME
+TIMESTAMP
+TIMEZONE
+TINYINT
+TO
+TOKEN
+TOTAL
+TOUCH
+TRAILING
+TRANSACTION
+TRANSFORM
+TRANSLATE
+TRANSLATION
+TREAT
+TRIGGER
+TRIM
+TRUE
+TRUNCATE
+TTL
+TUPLE
+TYPE
+UNDER
+UNDO
+UNION
+UNIQUE
+UNIT
+UNKNOWN
+UNLOGGED
+UNNEST
+UNPROCESSED
+UNSIGNED
+UNTIL
+UPDATE
+UPPER
+URL
+USAGE
+USE
+USER
+USERS
+USING
+UUID
+VACUUM
+VALUE
+VALUED
+VALUES
+VARCHAR
+VARIABLE
+VARIANCE
+VARINT
+VARYING
+VIEW
+VIEWS
+VIRTUAL
+VOID
+WAIT
+WHEN
+WHENEVER
+WHERE
+WHILE
+WINDOW
+WITH
+WITHIN
+WITHOUT
+WORK
+WRAPPED
+WRITE
+YEAR
+ZONE
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/tokens.py b/contrib/python/moto/py3/moto/dynamodb/parsing/tokens.py
new file mode 100644
index 0000000000..a83cf7ef37
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/tokens.py
@@ -0,0 +1,215 @@
+import re
+
+from moto.dynamodb.exceptions import (
+ InvalidTokenException,
+ InvalidExpressionAttributeNameKey,
+)
+
+
+class Token(object):
+ _TOKEN_INSTANCE = None
+ MINUS_SIGN = "-"
+ PLUS_SIGN = "+"
+ SPACE_SIGN = " "
+ EQUAL_SIGN = "="
+ OPEN_ROUND_BRACKET = "("
+ CLOSE_ROUND_BRACKET = ")"
+ COMMA = ","
+ SPACE = " "
+ DOT = "."
+ OPEN_SQUARE_BRACKET = "["
+ CLOSE_SQUARE_BRACKET = "]"
+
+ SPECIAL_CHARACTERS = [
+ MINUS_SIGN,
+ PLUS_SIGN,
+ SPACE_SIGN,
+ EQUAL_SIGN,
+ OPEN_ROUND_BRACKET,
+ CLOSE_ROUND_BRACKET,
+ COMMA,
+ SPACE,
+ DOT,
+ OPEN_SQUARE_BRACKET,
+ CLOSE_SQUARE_BRACKET,
+ ]
+
+ # Attribute: an identifier that is an attribute
+ ATTRIBUTE = 0
+ # Place holder for attribute name
+ ATTRIBUTE_NAME = 1
+ # Placeholder for attribute value starts with :
+ ATTRIBUTE_VALUE = 2
+ # WhiteSpace shall be grouped together
+ WHITESPACE = 3
+ # Placeholder for a number
+ NUMBER = 4
+
+ PLACEHOLDER_NAMES = {
+ ATTRIBUTE: "Attribute",
+ ATTRIBUTE_NAME: "AttributeName",
+ ATTRIBUTE_VALUE: "AttributeValue",
+ WHITESPACE: "Whitespace",
+ NUMBER: "Number",
+ }
+
+ def __init__(self, token_type, value):
+ assert (
+ token_type in self.SPECIAL_CHARACTERS
+ or token_type in self.PLACEHOLDER_NAMES
+ )
+ self.type = token_type
+ self.value = value
+
+ def __repr__(self):
+ if isinstance(self.type, int):
+ return 'Token("{tt}", "{tv}")'.format(
+ tt=self.PLACEHOLDER_NAMES[self.type], tv=self.value
+ )
+ else:
+ return 'Token("{tt}", "{tv}")'.format(tt=self.type, tv=self.value)
+
+ def __eq__(self, other):
+ return self.type == other.type and self.value == other.value
+
+
+class ExpressionTokenizer(object):
+ """
+ Takes a string and returns a list of tokens. While attribute names in DynamoDB must be between 1 and 255 characters
+ long there are no other restrictions for attribute names. For expressions however there are additional rules. If an
+ attribute name does not adhere then it must be passed via an ExpressionAttributeName. This tokenizer is aware of the
+ rules of Expression attributes.
+
+ We consider a Token as a tuple which has the tokenType
+
+ From https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html
+ 1) If an attribute name begins with a number or contains a space, a special character, or a reserved word, you
+ must use an expression attribute name to replace that attribute's name in the expression.
+ => So spaces,+,- or other special characters do identify tokens in update expressions
+
+ 2) When using a dot (.) in an attribute name you must use expression-attribute-names. A dot in an expression
+ will be interpreted as a separator in a document path
+
+ 3) For a nested structure if you want to use expression_attribute_names you must specify one per part of the
+ path. Since for members of expression_attribute_names the . is part of the name
+
+ """
+
+ @classmethod
+ def is_simple_token_character(cls, character):
+ return character.isalnum() or character in ("_", ":", "#")
+
+ @classmethod
+ def is_possible_token_boundary(cls, character):
+ return (
+ character in Token.SPECIAL_CHARACTERS
+ or not cls.is_simple_token_character(character)
+ )
+
+ @classmethod
+ def is_expression_attribute(cls, input_string):
+ return re.compile("^[a-zA-Z0-9][a-zA-Z0-9_]*$").match(input_string) is not None
+
+ @classmethod
+ def is_expression_attribute_name(cls, input_string):
+ """
+ https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html
+ An expression attribute name must begin with a pound sign (#), and be followed by one or more alphanumeric
+ characters.
+ """
+ return input_string.startswith("#") and cls.is_expression_attribute(
+ input_string[1:]
+ )
+
+ @classmethod
+ def is_expression_attribute_value(cls, input_string):
+ return re.compile("^:[a-zA-Z0-9_]*$").match(input_string) is not None
+
+ def raise_unexpected_token(self):
+ """If during parsing an unexpected token is encountered"""
+ if len(self.token_list) == 0:
+ near = ""
+ else:
+ if len(self.token_list) == 1:
+ near = self.token_list[-1].value
+ else:
+ if self.token_list[-1].type == Token.WHITESPACE:
+ # Last token was whitespace take 2nd last token value as well to help User orientate
+ near = self.token_list[-2].value + self.token_list[-1].value
+ else:
+ near = self.token_list[-1].value
+
+ problematic_token = self.staged_characters[0]
+ raise InvalidTokenException(problematic_token, near + self.staged_characters)
+
+ def __init__(self, input_expression_str):
+ self.input_expression_str = input_expression_str
+ self.token_list = []
+ self.staged_characters = ""
+
+ @classmethod
+ def make_list(cls, input_expression_str):
+ assert isinstance(input_expression_str, str)
+
+ return ExpressionTokenizer(input_expression_str)._make_list()
+
+ def add_token(self, token_type, token_value):
+ self.token_list.append(Token(token_type, token_value))
+
+ def add_token_from_stage(self, token_type):
+ self.add_token(token_type, self.staged_characters)
+ self.staged_characters = ""
+
+ @classmethod
+ def is_numeric(cls, input_str):
+ return re.compile("[0-9]+").match(input_str) is not None
+
+ def process_staged_characters(self):
+ if len(self.staged_characters) == 0:
+ return
+ if self.staged_characters.startswith("#"):
+ if self.is_expression_attribute_name(self.staged_characters):
+ self.add_token_from_stage(Token.ATTRIBUTE_NAME)
+ else:
+ raise InvalidExpressionAttributeNameKey(self.staged_characters)
+ elif self.is_numeric(self.staged_characters):
+ self.add_token_from_stage(Token.NUMBER)
+ elif self.is_expression_attribute(self.staged_characters):
+ self.add_token_from_stage(Token.ATTRIBUTE)
+ elif self.is_expression_attribute_value(self.staged_characters):
+ self.add_token_from_stage(Token.ATTRIBUTE_VALUE)
+ else:
+ self.raise_unexpected_token()
+
+ def _make_list(self):
+ """
+ Just go through characters if a character is not a token boundary stage it for adding it as a grouped token
+ later if it is a tokenboundary process staged characters and then process the token boundary as well.
+ """
+ for character in self.input_expression_str:
+ if not self.is_possible_token_boundary(character):
+ self.staged_characters += character
+ else:
+ self.process_staged_characters()
+
+ if character == Token.SPACE:
+ if (
+ len(self.token_list) > 0
+ and self.token_list[-1].type == Token.WHITESPACE
+ ):
+ self.token_list[-1].value = (
+ self.token_list[-1].value + character
+ )
+ else:
+ self.add_token(Token.WHITESPACE, character)
+ elif character in Token.SPECIAL_CHARACTERS:
+ self.add_token(character, character)
+ elif not self.is_simple_token_character(character):
+ self.staged_characters += character
+ self.raise_unexpected_token()
+ else:
+ raise NotImplementedError(
+ "Encountered character which was not implemented : " + character
+ )
+ self.process_staged_characters()
+ return self.token_list
diff --git a/contrib/python/moto/py3/moto/dynamodb/parsing/validators.py b/contrib/python/moto/py3/moto/dynamodb/parsing/validators.py
new file mode 100644
index 0000000000..3969665b0b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/parsing/validators.py
@@ -0,0 +1,415 @@
+"""
+See docstring class Validator below for more details on validation
+"""
+from abc import abstractmethod
+from copy import deepcopy
+
+from moto.dynamodb.exceptions import (
+ AttributeIsReservedKeyword,
+ ExpressionAttributeValueNotDefined,
+ AttributeDoesNotExist,
+ ExpressionAttributeNameNotDefined,
+ IncorrectOperandType,
+ InvalidUpdateExpressionInvalidDocumentPath,
+ ProvidedKeyDoesNotExist,
+ EmptyKeyAttributeException,
+ UpdateHashRangeKeyException,
+)
+from moto.dynamodb.models import DynamoType
+from moto.dynamodb.parsing.ast_nodes import (
+ ExpressionAttribute,
+ UpdateExpressionPath,
+ UpdateExpressionSetAction,
+ UpdateExpressionAddAction,
+ UpdateExpressionDeleteAction,
+ UpdateExpressionRemoveAction,
+ DDBTypedValue,
+ ExpressionAttributeValue,
+ ExpressionAttributeName,
+ DepthFirstTraverser,
+ NoneExistingPath,
+ UpdateExpressionFunction,
+ ExpressionPathDescender,
+ UpdateExpressionValue,
+ ExpressionValueOperator,
+ ExpressionSelector,
+)
+from moto.dynamodb.parsing.reserved_keywords import ReservedKeywords
+
+
+class ExpressionAttributeValueProcessor(DepthFirstTraverser):
+ def __init__(self, expression_attribute_values):
+ self.expression_attribute_values = expression_attribute_values
+
+ def _processing_map(self):
+ return {
+ ExpressionAttributeValue: self.replace_expression_attribute_value_with_value
+ }
+
+ def replace_expression_attribute_value_with_value(self, node):
+ """A node representing an Expression Attribute Value. Resolve and replace value"""
+ assert isinstance(node, ExpressionAttributeValue)
+ attribute_value_name = node.get_value_name()
+ try:
+ target = self.expression_attribute_values[attribute_value_name]
+ except KeyError:
+ raise ExpressionAttributeValueNotDefined(
+ attribute_value=attribute_value_name
+ )
+ return DDBTypedValue(DynamoType(target))
+
+
+class ExpressionPathResolver(object):
+ def __init__(self, expression_attribute_names):
+ self.expression_attribute_names = expression_attribute_names
+
+ @classmethod
+ def raise_exception_if_keyword(cls, attribute):
+ if attribute.upper() in ReservedKeywords.get_reserved_keywords():
+ raise AttributeIsReservedKeyword(attribute)
+
+ def resolve_expression_path(self, item, update_expression_path):
+ assert isinstance(update_expression_path, UpdateExpressionPath)
+ return self.resolve_expression_path_nodes(item, update_expression_path.children)
+
+ def resolve_expression_path_nodes(self, item, update_expression_path_nodes):
+ target = item.attrs
+
+ for child in update_expression_path_nodes:
+ # First replace placeholder with attribute_name
+ attr_name = None
+ if isinstance(child, ExpressionAttributeName):
+ attr_placeholder = child.get_attribute_name_placeholder()
+ try:
+ attr_name = self.expression_attribute_names[attr_placeholder]
+ except KeyError:
+ raise ExpressionAttributeNameNotDefined(attr_placeholder)
+ elif isinstance(child, ExpressionAttribute):
+ attr_name = child.get_attribute_name()
+ self.raise_exception_if_keyword(attr_name)
+ if attr_name is not None:
+ # Resolv attribute_name
+ try:
+ target = target[attr_name]
+ except (KeyError, TypeError):
+ if child == update_expression_path_nodes[-1]:
+ return NoneExistingPath(creatable=True)
+ return NoneExistingPath()
+ else:
+ if isinstance(child, ExpressionPathDescender):
+ continue
+ elif isinstance(child, ExpressionSelector):
+ index = child.get_index()
+ if target.is_list():
+ try:
+ target = target[index]
+ except IndexError:
+ # When a list goes out of bounds when assigning that is no problem when at the assignment
+ # side. It will just append to the list.
+ if child == update_expression_path_nodes[-1]:
+ return NoneExistingPath(creatable=True)
+ return NoneExistingPath()
+ else:
+ raise InvalidUpdateExpressionInvalidDocumentPath
+ else:
+ raise NotImplementedError(
+ "Path resolution for {t}".format(t=type(child))
+ )
+ if not isinstance(target, DynamoType):
+ print(target)
+ return DDBTypedValue(target)
+
+ def resolve_expression_path_nodes_to_dynamo_type(
+ self, item, update_expression_path_nodes
+ ):
+ node = self.resolve_expression_path_nodes(item, update_expression_path_nodes)
+ if isinstance(node, NoneExistingPath):
+ raise ProvidedKeyDoesNotExist()
+ assert isinstance(node, DDBTypedValue)
+ return node.get_value()
+
+
+class ExpressionAttributeResolvingProcessor(DepthFirstTraverser):
+ def _processing_map(self):
+ return {
+ UpdateExpressionSetAction: self.disable_resolving,
+ UpdateExpressionPath: self.process_expression_path_node,
+ }
+
+ def __init__(self, expression_attribute_names, item):
+ self.expression_attribute_names = expression_attribute_names
+ self.item = item
+ self.resolving = False
+
+ def pre_processing_of_child(self, parent_node, child_id):
+ """
+ We have to enable resolving if we are processing a child of UpdateExpressionSetAction that is not first.
+ Because first argument is path to be set, 2nd argument would be the value.
+ """
+ if isinstance(
+ parent_node,
+ (
+ UpdateExpressionSetAction,
+ UpdateExpressionRemoveAction,
+ UpdateExpressionDeleteAction,
+ UpdateExpressionAddAction,
+ ),
+ ):
+ if child_id == 0:
+ self.resolving = False
+ else:
+ self.resolving = True
+
+ def disable_resolving(self, node=None):
+ self.resolving = False
+ return node
+
+ def process_expression_path_node(self, node):
+ """Resolve ExpressionAttribute if not part of a path and resolving is enabled."""
+ if self.resolving:
+ return self.resolve_expression_path(node)
+ else:
+ # Still resolve but return original note to make sure path is correct Just make sure nodes are creatable.
+ result_node = self.resolve_expression_path(node)
+ if (
+ isinstance(result_node, NoneExistingPath)
+ and not result_node.is_creatable()
+ ):
+ raise InvalidUpdateExpressionInvalidDocumentPath()
+
+ return node
+
+ def resolve_expression_path(self, node):
+ return ExpressionPathResolver(
+ self.expression_attribute_names
+ ).resolve_expression_path(self.item, node)
+
+
+class UpdateExpressionFunctionEvaluator(DepthFirstTraverser):
+ """
+ At time of writing there are only 2 functions for DDB UpdateExpressions. They both are specific to the SET
+ expression as per the official AWS docs:
+ https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/
+ Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.SET
+ """
+
+ def _processing_map(self):
+ return {UpdateExpressionFunction: self.process_function}
+
+ def process_function(self, node):
+ assert isinstance(node, UpdateExpressionFunction)
+ function_name = node.get_function_name()
+ first_arg = node.get_nth_argument(1)
+ second_arg = node.get_nth_argument(2)
+
+ if function_name == "if_not_exists":
+ if isinstance(first_arg, NoneExistingPath):
+ result = second_arg
+ else:
+ result = first_arg
+ assert isinstance(result, (DDBTypedValue, NoneExistingPath))
+ return result
+ elif function_name == "list_append":
+ first_arg = deepcopy(
+ self.get_list_from_ddb_typed_value(first_arg, function_name)
+ )
+ second_arg = self.get_list_from_ddb_typed_value(second_arg, function_name)
+ for list_element in second_arg.value:
+ first_arg.value.append(list_element)
+ return DDBTypedValue(first_arg)
+ else:
+ raise NotImplementedError(
+ "Unsupported function for moto {name}".format(name=function_name)
+ )
+
+ @classmethod
+ def get_list_from_ddb_typed_value(cls, node, function_name):
+ assert isinstance(node, DDBTypedValue)
+ dynamo_value = node.get_value()
+ assert isinstance(dynamo_value, DynamoType)
+ if not dynamo_value.is_list():
+ raise IncorrectOperandType(function_name, dynamo_value.type)
+ return dynamo_value
+
+
+class NoneExistingPathChecker(DepthFirstTraverser):
+ """
+ Pass through the AST and make sure there are no none-existing paths.
+ """
+
+ def _processing_map(self):
+ return {NoneExistingPath: self.raise_none_existing_path}
+
+ def raise_none_existing_path(self, node):
+ raise AttributeDoesNotExist
+
+
+class ExecuteOperations(DepthFirstTraverser):
+ def _processing_map(self):
+ return {UpdateExpressionValue: self.process_update_expression_value}
+
+ def process_update_expression_value(self, node):
+ """
+ If an UpdateExpressionValue only has a single child the node will be replaced with the childe.
+ Otherwise it has 3 children and the middle one is an ExpressionValueOperator which details how to combine them
+ Args:
+ node(Node):
+
+ Returns:
+ Node: The resulting node of the operation if present or the child.
+ """
+ assert isinstance(node, UpdateExpressionValue)
+ if len(node.children) == 1:
+ return node.children[0]
+ elif len(node.children) == 3:
+ operator_node = node.children[1]
+ assert isinstance(operator_node, ExpressionValueOperator)
+ operator = operator_node.get_operator()
+ left_operand = self.get_dynamo_value_from_ddb_typed_value(node.children[0])
+ right_operand = self.get_dynamo_value_from_ddb_typed_value(node.children[2])
+ if operator == "+":
+ return self.get_sum(left_operand, right_operand)
+ elif operator == "-":
+ return self.get_subtraction(left_operand, right_operand)
+ else:
+ raise NotImplementedError(
+ "Moto does not support operator {operator}".format(
+ operator=operator
+ )
+ )
+ else:
+ raise NotImplementedError(
+ "UpdateExpressionValue only has implementations for 1 or 3 children."
+ )
+
+ @classmethod
+ def get_dynamo_value_from_ddb_typed_value(cls, node):
+ assert isinstance(node, DDBTypedValue)
+ dynamo_value = node.get_value()
+ assert isinstance(dynamo_value, DynamoType)
+ return dynamo_value
+
+ @classmethod
+ def get_sum(cls, left_operand, right_operand):
+ """
+ Args:
+ left_operand(DynamoType):
+ right_operand(DynamoType):
+
+ Returns:
+ DDBTypedValue:
+ """
+ try:
+ return DDBTypedValue(left_operand + right_operand)
+ except TypeError:
+ raise IncorrectOperandType("+", left_operand.type)
+
+ @classmethod
+ def get_subtraction(cls, left_operand, right_operand):
+ """
+ Args:
+ left_operand(DynamoType):
+ right_operand(DynamoType):
+
+ Returns:
+ DDBTypedValue:
+ """
+ try:
+ return DDBTypedValue(left_operand - right_operand)
+ except TypeError:
+ raise IncorrectOperandType("-", left_operand.type)
+
+
+class EmptyStringKeyValueValidator(DepthFirstTraverser):
+ def __init__(self, key_attributes):
+ self.key_attributes = key_attributes
+
+ def _processing_map(self):
+ return {UpdateExpressionSetAction: self.check_for_empty_string_key_value}
+
+ def check_for_empty_string_key_value(self, node):
+ """A node representing a SET action. Check that keys are not being assigned empty strings"""
+ assert isinstance(node, UpdateExpressionSetAction)
+ assert len(node.children) == 2
+ key = node.children[0].children[0].children[0]
+ val_node = node.children[1].children[0]
+ if (
+ not val_node.value
+ and val_node.type in ["S", "B"]
+ and key in self.key_attributes
+ ):
+ raise EmptyKeyAttributeException(key_in_index=True)
+ return node
+
+
+class UpdateHashRangeKeyValidator(DepthFirstTraverser):
+ def __init__(self, table_key_attributes):
+ self.table_key_attributes = table_key_attributes
+
+ def _processing_map(self):
+ return {UpdateExpressionPath: self.check_for_hash_or_range_key}
+
+ def check_for_hash_or_range_key(self, node):
+ """Check that hash and range keys are not updated"""
+ key_to_update = node.children[0].children[0]
+ if key_to_update in self.table_key_attributes:
+ raise UpdateHashRangeKeyException(key_to_update)
+ return node
+
+
+class Validator(object):
+ """
+ A validator is used to validate expressions which are passed in as an AST.
+ """
+
+ def __init__(
+ self,
+ expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ item,
+ table,
+ ):
+ """
+ Besides validation the Validator should also replace referenced parts of an item which is cheapest upon
+ validation.
+
+ Args:
+ expression(Node): The root node of the AST representing the expression to be validated
+ expression_attribute_names(ExpressionAttributeNames):
+ expression_attribute_values(ExpressionAttributeValues):
+ item(Item): The item which will be updated (pointed to by Key of update_item)
+ """
+ self.expression_attribute_names = expression_attribute_names
+ self.expression_attribute_values = expression_attribute_values
+ self.item = item
+ self.table = table
+ self.processors = self.get_ast_processors()
+ self.node_to_validate = deepcopy(expression)
+
+ @abstractmethod
+ def get_ast_processors(self):
+ """Get the different processors that go through the AST tree and processes the nodes."""
+
+ def validate(self):
+ n = self.node_to_validate
+ for processor in self.processors:
+ n = processor.traverse(n)
+ return n
+
+
+class UpdateExpressionValidator(Validator):
+ def get_ast_processors(self):
+ """Get the different processors that go through the AST tree and processes the nodes."""
+ processors = [
+ UpdateHashRangeKeyValidator(self.table.table_key_attrs),
+ ExpressionAttributeValueProcessor(self.expression_attribute_values),
+ ExpressionAttributeResolvingProcessor(
+ self.expression_attribute_names, self.item
+ ),
+ UpdateExpressionFunctionEvaluator(),
+ NoneExistingPathChecker(),
+ ExecuteOperations(),
+ EmptyStringKeyValueValidator(self.table.attribute_keys),
+ ]
+ return processors
diff --git a/contrib/python/moto/py3/moto/dynamodb/responses.py b/contrib/python/moto/py3/moto/dynamodb/responses.py
new file mode 100644
index 0000000000..825901b4f5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/responses.py
@@ -0,0 +1,1070 @@
+import copy
+import json
+import re
+
+import itertools
+from functools import wraps
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import camelcase_to_underscores, amz_crc32, amzn_request_id
+from .exceptions import (
+ MockValidationException,
+ ResourceNotFoundException,
+ ConditionalCheckFailed,
+)
+from moto.dynamodb.models import dynamodb_backends, dynamo_json_dump
+
+
+TRANSACTION_MAX_ITEMS = 25
+
+
+def include_consumed_capacity(val=1.0):
+ def _inner(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ (handler,) = args
+ expected_capacity = handler.body.get("ReturnConsumedCapacity", "NONE")
+ if expected_capacity not in ["NONE", "TOTAL", "INDEXES"]:
+ type_ = "ValidationException"
+ message = "1 validation error detected: Value '{}' at 'returnConsumedCapacity' failed to satisfy constraint: Member must satisfy enum value set: [INDEXES, TOTAL, NONE]".format(
+ expected_capacity
+ )
+ return (
+ 400,
+ handler.response_headers,
+ dynamo_json_dump({"__type": type_, "message": message}),
+ )
+ table_name = handler.body.get("TableName", "")
+ index_name = handler.body.get("IndexName", None)
+
+ response = f(*args, **kwargs)
+
+ if isinstance(response, str):
+ body = json.loads(response)
+
+ if expected_capacity == "TOTAL":
+ body["ConsumedCapacity"] = {
+ "TableName": table_name,
+ "CapacityUnits": val,
+ }
+ elif expected_capacity == "INDEXES":
+ body["ConsumedCapacity"] = {
+ "TableName": table_name,
+ "CapacityUnits": val,
+ "Table": {"CapacityUnits": val},
+ }
+ if index_name:
+ body["ConsumedCapacity"]["LocalSecondaryIndexes"] = {
+ index_name: {"CapacityUnits": val}
+ }
+
+ return dynamo_json_dump(body)
+
+ return response
+
+ return _wrapper
+
+ return _inner
+
+
+def put_has_empty_keys(field_updates, table):
+ if table:
+ key_names = table.attribute_keys
+
+ # string/binary fields with empty string as value
+ empty_str_fields = [
+ key
+ for (key, val) in field_updates.items()
+ if next(iter(val.keys())) in ["S", "B"] and next(iter(val.values())) == ""
+ ]
+ return any([keyname in empty_str_fields for keyname in key_names])
+ return False
+
+
+def put_has_empty_attrs(field_updates, table):
+ # Example invalid attribute: [{'M': {'SS': {'NS': []}}}]
+ def _validate_attr(attr: dict):
+ if "NS" in attr and attr["NS"] == []:
+ return True
+ else:
+ return any(
+ [_validate_attr(val) for val in attr.values() if isinstance(val, dict)]
+ )
+
+ if table:
+ key_names = table.attribute_keys
+ attrs_to_check = [
+ val for attr, val in field_updates.items() if attr not in key_names
+ ]
+ return any([_validate_attr(attr) for attr in attrs_to_check])
+ return False
+
+
+class DynamoHandler(BaseResponse):
+ def get_endpoint_name(self, headers):
+ """Parses request headers and extracts part od the X-Amz-Target
+ that corresponds to a method of DynamoHandler
+
+ ie: X-Amz-Target: DynamoDB_20111205.ListTables -> ListTables
+ """
+ # Headers are case-insensitive. Probably a better way to do this.
+ match = headers.get("x-amz-target") or headers.get("X-Amz-Target")
+ if match:
+ return match.split(".")[1]
+
+ @property
+ def dynamodb_backend(self):
+ """
+ :return: DynamoDB2 Backend
+ :rtype: moto.dynamodb2.models.DynamoDBBackend
+ """
+ return dynamodb_backends[self.region]
+
+ @amz_crc32
+ @amzn_request_id
+ def call_action(self):
+ self.body = json.loads(self.body or "{}")
+ endpoint = self.get_endpoint_name(self.headers)
+ if endpoint:
+ endpoint = camelcase_to_underscores(endpoint)
+ response = getattr(self, endpoint)()
+ if isinstance(response, str):
+ return 200, self.response_headers, response
+
+ else:
+ status_code, new_headers, response_content = response
+ self.response_headers.update(new_headers)
+ return status_code, self.response_headers, response_content
+ else:
+ return 404, self.response_headers, ""
+
+ def list_tables(self):
+ body = self.body
+ limit = body.get("Limit", 100)
+ exclusive_start_table_name = body.get("ExclusiveStartTableName")
+ tables, last_eval = self.dynamodb_backend.list_tables(
+ limit, exclusive_start_table_name
+ )
+
+ response = {"TableNames": tables}
+ if last_eval:
+ response["LastEvaluatedTableName"] = last_eval
+
+ return dynamo_json_dump(response)
+
+ def create_table(self):
+ body = self.body
+ # get the table name
+ table_name = body["TableName"]
+ # check billing mode and get the throughput
+ if "BillingMode" in body.keys() and body["BillingMode"] == "PAY_PER_REQUEST":
+ if "ProvisionedThroughput" in body.keys():
+ raise MockValidationException(
+ "ProvisionedThroughput cannot be specified when BillingMode is PAY_PER_REQUEST"
+ )
+ throughput = None
+ billing_mode = "PAY_PER_REQUEST"
+ else: # Provisioned (default billing mode)
+ throughput = body.get("ProvisionedThroughput")
+ if throughput is None:
+ raise MockValidationException(
+ "One or more parameter values were invalid: ReadCapacityUnits and WriteCapacityUnits must both be specified when BillingMode is PROVISIONED"
+ )
+ billing_mode = "PROVISIONED"
+ # getting ServerSideEncryption details
+ sse_spec = body.get("SSESpecification")
+ # getting the schema
+ key_schema = body["KeySchema"]
+ # getting attribute definition
+ attr = body["AttributeDefinitions"]
+ # getting the indexes
+ global_indexes = body.get("GlobalSecondaryIndexes")
+ if global_indexes == []:
+ raise MockValidationException(
+ "One or more parameter values were invalid: List of GlobalSecondaryIndexes is empty"
+ )
+ global_indexes = global_indexes or []
+ local_secondary_indexes = body.get("LocalSecondaryIndexes")
+ if local_secondary_indexes == []:
+ raise MockValidationException(
+ "One or more parameter values were invalid: List of LocalSecondaryIndexes is empty"
+ )
+ local_secondary_indexes = local_secondary_indexes or []
+ # Verify AttributeDefinitions list all
+ expected_attrs = []
+ expected_attrs.extend([key["AttributeName"] for key in key_schema])
+ expected_attrs.extend(
+ schema["AttributeName"]
+ for schema in itertools.chain(
+ *list(idx["KeySchema"] for idx in local_secondary_indexes)
+ )
+ )
+ expected_attrs.extend(
+ schema["AttributeName"]
+ for schema in itertools.chain(
+ *list(idx["KeySchema"] for idx in global_indexes)
+ )
+ )
+ expected_attrs = list(set(expected_attrs))
+ expected_attrs.sort()
+ actual_attrs = [item["AttributeName"] for item in attr]
+ actual_attrs.sort()
+ if actual_attrs != expected_attrs:
+ return self._throw_attr_error(
+ actual_attrs, expected_attrs, global_indexes or local_secondary_indexes
+ )
+ # get the stream specification
+ streams = body.get("StreamSpecification")
+ # Get any tags
+ tags = body.get("Tags", [])
+
+ table = self.dynamodb_backend.create_table(
+ table_name,
+ schema=key_schema,
+ throughput=throughput,
+ attr=attr,
+ global_indexes=global_indexes,
+ indexes=local_secondary_indexes,
+ streams=streams,
+ billing_mode=billing_mode,
+ sse_specification=sse_spec,
+ tags=tags,
+ )
+ return dynamo_json_dump(table.describe())
+
+ def _throw_attr_error(self, actual_attrs, expected_attrs, indexes):
+ def dump_list(list_):
+ return str(list_).replace("'", "")
+
+ err_head = "One or more parameter values were invalid: "
+ if len(actual_attrs) > len(expected_attrs):
+ if indexes:
+ raise MockValidationException(
+ err_head
+ + "Some AttributeDefinitions are not used. AttributeDefinitions: "
+ + dump_list(actual_attrs)
+ + ", keys used: "
+ + dump_list(expected_attrs)
+ )
+ else:
+ raise MockValidationException(
+ err_head
+ + "Number of attributes in KeySchema does not exactly match number of attributes defined in AttributeDefinitions"
+ )
+ elif len(actual_attrs) < len(expected_attrs):
+ if indexes:
+ raise MockValidationException(
+ err_head
+ + "Some index key attributes are not defined in AttributeDefinitions. Keys: "
+ + dump_list(list(set(expected_attrs) - set(actual_attrs)))
+ + ", AttributeDefinitions: "
+ + dump_list(actual_attrs)
+ )
+ else:
+ raise MockValidationException(
+ "Invalid KeySchema: Some index key attribute have no definition"
+ )
+ else:
+ if indexes:
+ raise MockValidationException(
+ err_head
+ + "Some index key attributes are not defined in AttributeDefinitions. Keys: "
+ + dump_list(list(set(expected_attrs) - set(actual_attrs)))
+ + ", AttributeDefinitions: "
+ + dump_list(actual_attrs)
+ )
+ else:
+ raise MockValidationException(
+ err_head
+ + "Some index key attributes are not defined in AttributeDefinitions. Keys: "
+ + dump_list(expected_attrs)
+ + ", AttributeDefinitions: "
+ + dump_list(actual_attrs)
+ )
+
+ def delete_table(self):
+ name = self.body["TableName"]
+ table = self.dynamodb_backend.delete_table(name)
+ return dynamo_json_dump(table.describe())
+
+ def describe_endpoints(self):
+ response = {"Endpoints": self.dynamodb_backend.describe_endpoints()}
+ return dynamo_json_dump(response)
+
+ def tag_resource(self):
+ table_arn = self.body["ResourceArn"]
+ tags = self.body["Tags"]
+ self.dynamodb_backend.tag_resource(table_arn, tags)
+ return ""
+
+ def untag_resource(self):
+ table_arn = self.body["ResourceArn"]
+ tags = self.body["TagKeys"]
+ self.dynamodb_backend.untag_resource(table_arn, tags)
+ return ""
+
+ def list_tags_of_resource(self):
+ table_arn = self.body["ResourceArn"]
+ all_tags = self.dynamodb_backend.list_tags_of_resource(table_arn)
+ all_tag_keys = [tag["Key"] for tag in all_tags]
+ marker = self.body.get("NextToken")
+ if marker:
+ start = all_tag_keys.index(marker) + 1
+ else:
+ start = 0
+ max_items = 10 # there is no default, but using 10 to make testing easier
+ tags_resp = all_tags[start : start + max_items]
+ next_marker = None
+ if len(all_tags) > start + max_items:
+ next_marker = tags_resp[-1]["Key"]
+ if next_marker:
+ return json.dumps({"Tags": tags_resp, "NextToken": next_marker})
+ return json.dumps({"Tags": tags_resp})
+
+ def update_table(self):
+ name = self.body["TableName"]
+ attr_definitions = self.body.get("AttributeDefinitions", None)
+ global_index = self.body.get("GlobalSecondaryIndexUpdates", None)
+ throughput = self.body.get("ProvisionedThroughput", None)
+ billing_mode = self.body.get("BillingMode", None)
+ stream_spec = self.body.get("StreamSpecification", None)
+ table = self.dynamodb_backend.update_table(
+ name=name,
+ attr_definitions=attr_definitions,
+ global_index=global_index,
+ throughput=throughput,
+ billing_mode=billing_mode,
+ stream_spec=stream_spec,
+ )
+ return dynamo_json_dump(table.describe())
+
+ def describe_table(self):
+ name = self.body["TableName"]
+ table = self.dynamodb_backend.describe_table(name)
+ return dynamo_json_dump(table)
+
+ @include_consumed_capacity()
+ def put_item(self):
+ name = self.body["TableName"]
+ item = self.body["Item"]
+ return_values = self.body.get("ReturnValues", "NONE")
+
+ if return_values not in ("ALL_OLD", "NONE"):
+ raise MockValidationException("Return values set to invalid value")
+
+ if put_has_empty_keys(item, self.dynamodb_backend.get_table(name)):
+ raise MockValidationException(
+ "One or more parameter values were invalid: An AttributeValue may not contain an empty string"
+ )
+ if put_has_empty_attrs(item, self.dynamodb_backend.get_table(name)):
+ raise MockValidationException(
+ "One or more parameter values were invalid: An number set may not be empty"
+ )
+
+ overwrite = "Expected" not in self.body
+ if not overwrite:
+ expected = self.body["Expected"]
+ else:
+ expected = None
+
+ if return_values == "ALL_OLD":
+ existing_item = self.dynamodb_backend.get_item(name, item)
+ if existing_item:
+ existing_attributes = existing_item.to_json()["Attributes"]
+ else:
+ existing_attributes = {}
+
+ # Attempt to parse simple ConditionExpressions into an Expected
+ # expression
+ condition_expression = self.body.get("ConditionExpression")
+ expression_attribute_names = self.body.get("ExpressionAttributeNames", {})
+ expression_attribute_values = self.body.get("ExpressionAttributeValues", {})
+
+ if condition_expression:
+ overwrite = False
+
+ result = self.dynamodb_backend.put_item(
+ name,
+ item,
+ expected,
+ condition_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ overwrite,
+ )
+
+ item_dict = result.to_json()
+ if return_values == "ALL_OLD":
+ item_dict["Attributes"] = existing_attributes
+ else:
+ item_dict.pop("Attributes", None)
+ return dynamo_json_dump(item_dict)
+
+ def batch_write_item(self):
+ table_batches = self.body["RequestItems"]
+
+ for table_name, table_requests in table_batches.items():
+ for table_request in table_requests:
+ request_type = list(table_request.keys())[0]
+ request = list(table_request.values())[0]
+ if request_type == "PutRequest":
+ item = request["Item"]
+ self.dynamodb_backend.put_item(table_name, item)
+ elif request_type == "DeleteRequest":
+ keys = request["Key"]
+ self.dynamodb_backend.delete_item(table_name, keys)
+
+ response = {
+ "ConsumedCapacity": [
+ {
+ "TableName": table_name,
+ "CapacityUnits": 1.0,
+ "Table": {"CapacityUnits": 1.0},
+ }
+ for table_name, table_requests in table_batches.items()
+ ],
+ "ItemCollectionMetrics": {},
+ "UnprocessedItems": {},
+ }
+
+ return dynamo_json_dump(response)
+
+ @include_consumed_capacity(0.5)
+ def get_item(self):
+ name = self.body["TableName"]
+ self.dynamodb_backend.get_table(name)
+ key = self.body["Key"]
+ projection_expression = self.body.get("ProjectionExpression")
+ expression_attribute_names = self.body.get("ExpressionAttributeNames")
+ if expression_attribute_names == {}:
+ if projection_expression is None:
+ raise MockValidationException(
+ "ExpressionAttributeNames can only be specified when using expressions"
+ )
+ else:
+ raise MockValidationException(
+ "ExpressionAttributeNames must not be empty"
+ )
+
+ expression_attribute_names = expression_attribute_names or {}
+ projection_expression = self._adjust_projection_expression(
+ projection_expression, expression_attribute_names
+ )
+
+ item = self.dynamodb_backend.get_item(name, key, projection_expression)
+ if item:
+ item_dict = item.describe_attrs(attributes=None)
+ return dynamo_json_dump(item_dict)
+ else:
+ # Item not found
+ return dynamo_json_dump({})
+
+ def batch_get_item(self):
+ table_batches = self.body["RequestItems"]
+
+ results = {"ConsumedCapacity": [], "Responses": {}, "UnprocessedKeys": {}}
+
+ # Validation: Can only request up to 100 items at the same time
+ # Scenario 1: We're requesting more than a 100 keys from a single table
+ for table_name, table_request in table_batches.items():
+ if len(table_request["Keys"]) > 100:
+ raise MockValidationException(
+ "1 validation error detected: Value at 'requestItems."
+ + table_name
+ + ".member.keys' failed to satisfy constraint: Member must have length less than or equal to 100"
+ )
+ # Scenario 2: We're requesting more than a 100 keys across all tables
+ nr_of_keys_across_all_tables = sum(
+ [len(req["Keys"]) for _, req in table_batches.items()]
+ )
+ if nr_of_keys_across_all_tables > 100:
+ raise MockValidationException(
+ "Too many items requested for the BatchGetItem call"
+ )
+
+ for table_name, table_request in table_batches.items():
+ keys = table_request["Keys"]
+ if self._contains_duplicates(keys):
+ raise MockValidationException(
+ "Provided list of item keys contains duplicates"
+ )
+ attributes_to_get = table_request.get("AttributesToGet")
+ projection_expression = table_request.get("ProjectionExpression")
+ expression_attribute_names = table_request.get(
+ "ExpressionAttributeNames", {}
+ )
+
+ projection_expression = self._adjust_projection_expression(
+ projection_expression, expression_attribute_names
+ )
+
+ results["Responses"][table_name] = []
+ for key in keys:
+ item = self.dynamodb_backend.get_item(
+ table_name, key, projection_expression
+ )
+ if item:
+ item_describe = item.describe_attrs(attributes_to_get)
+ results["Responses"][table_name].append(item_describe["Item"])
+
+ results["ConsumedCapacity"].append(
+ {"CapacityUnits": len(keys), "TableName": table_name}
+ )
+ return dynamo_json_dump(results)
+
+ def _contains_duplicates(self, keys):
+ unique_keys = []
+ for k in keys:
+ if k in unique_keys:
+ return True
+ else:
+ unique_keys.append(k)
+ return False
+
+ @include_consumed_capacity()
+ def query(self):
+ name = self.body["TableName"]
+ key_condition_expression = self.body.get("KeyConditionExpression")
+ projection_expression = self.body.get("ProjectionExpression")
+ expression_attribute_names = self.body.get("ExpressionAttributeNames", {})
+ filter_expression = self.body.get("FilterExpression")
+ expression_attribute_values = self.body.get("ExpressionAttributeValues", {})
+
+ projection_expression = self._adjust_projection_expression(
+ projection_expression, expression_attribute_names
+ )
+
+ filter_kwargs = {}
+
+ if key_condition_expression:
+ value_alias_map = self.body.get("ExpressionAttributeValues", {})
+
+ index_name = self.body.get("IndexName")
+ schema = self.dynamodb_backend.get_schema(
+ table_name=name, index_name=index_name
+ )
+
+ reverse_attribute_lookup = dict(
+ (v, k) for k, v in self.body.get("ExpressionAttributeNames", {}).items()
+ )
+
+ if " and " in key_condition_expression.lower():
+ expressions = re.split(
+ " AND ", key_condition_expression, maxsplit=1, flags=re.IGNORECASE
+ )
+
+ index_hash_key = [key for key in schema if key["KeyType"] == "HASH"][0]
+ hash_key_var = reverse_attribute_lookup.get(
+ index_hash_key["AttributeName"], index_hash_key["AttributeName"]
+ )
+ hash_key_regex = r"(^|[\s(]){0}\b".format(hash_key_var)
+ i, hash_key_expression = next(
+ (
+ (i, e)
+ for i, e in enumerate(expressions)
+ if re.search(hash_key_regex, e)
+ ),
+ (None, None),
+ )
+ if hash_key_expression is None:
+ raise MockValidationException(
+ "Query condition missed key schema element: {}".format(
+ hash_key_var
+ )
+ )
+ hash_key_expression = hash_key_expression.strip("()")
+ expressions.pop(i)
+
+ # TODO implement more than one range expression and OR operators
+ range_key_expression = expressions[0].strip("()")
+ # Split expression, and account for all kinds of whitespacing around commas and brackets
+ range_key_expression_components = re.split(
+ r"\s*\(\s*|\s*,\s*|\s", range_key_expression
+ )
+ # Skip whitespace
+ range_key_expression_components = [
+ c for c in range_key_expression_components if c
+ ]
+ range_comparison = range_key_expression_components[1]
+
+ if " and " in range_key_expression.lower():
+ range_comparison = "BETWEEN"
+ # [range_key, between, x, and, y]
+ range_values = [
+ value_alias_map[range_key_expression_components[2]],
+ value_alias_map[range_key_expression_components[4]],
+ ]
+ supplied_range_key = range_key_expression_components[0]
+ elif "begins_with" in range_key_expression:
+ range_comparison = "BEGINS_WITH"
+ # [begins_with, range_key, x]
+ range_values = [
+ value_alias_map[range_key_expression_components[-1]]
+ ]
+ supplied_range_key = range_key_expression_components[1]
+ elif "begins_with" in range_key_expression.lower():
+ function_used = range_key_expression[
+ range_key_expression.lower().index("begins_with") : len(
+ "begins_with"
+ )
+ ]
+ raise MockValidationException(
+ "Invalid KeyConditionExpression: Invalid function name; function: {}".format(
+ function_used
+ )
+ )
+ else:
+ # [range_key, =, x]
+ range_values = [value_alias_map[range_key_expression_components[2]]]
+ supplied_range_key = range_key_expression_components[0]
+
+ supplied_range_key = expression_attribute_names.get(
+ supplied_range_key, supplied_range_key
+ )
+ range_keys = [
+ k["AttributeName"] for k in schema if k["KeyType"] == "RANGE"
+ ]
+ if supplied_range_key not in range_keys:
+ raise MockValidationException(
+ "Query condition missed key schema element: {}".format(
+ range_keys[0]
+ )
+ )
+ else:
+ hash_key_expression = key_condition_expression.strip("()")
+ range_comparison = None
+ range_values = []
+
+ if not re.search("[^<>]=", hash_key_expression):
+ raise MockValidationException("Query key condition not supported")
+ hash_key_value_alias = hash_key_expression.split("=")[1].strip()
+ # Temporary fix until we get proper KeyConditionExpression function
+ hash_key = value_alias_map.get(
+ hash_key_value_alias, {"S": hash_key_value_alias}
+ )
+ else:
+ # 'KeyConditions': {u'forum_name': {u'ComparisonOperator': u'EQ', u'AttributeValueList': [{u'S': u'the-key'}]}}
+ key_conditions = self.body.get("KeyConditions")
+ query_filters = self.body.get("QueryFilter")
+
+ if not (key_conditions or query_filters):
+ raise MockValidationException(
+ "Either KeyConditions or QueryFilter should be present"
+ )
+
+ if key_conditions:
+ (
+ hash_key_name,
+ range_key_name,
+ ) = self.dynamodb_backend.get_table_keys_name(
+ name, key_conditions.keys()
+ )
+ for key, value in key_conditions.items():
+ if key not in (hash_key_name, range_key_name):
+ filter_kwargs[key] = value
+ if hash_key_name is None:
+ raise ResourceNotFoundException
+ hash_key = key_conditions[hash_key_name]["AttributeValueList"][0]
+ if len(key_conditions) == 1:
+ range_comparison = None
+ range_values = []
+ else:
+ if range_key_name is None and not filter_kwargs:
+ raise MockValidationException("Validation Exception")
+ else:
+ range_condition = key_conditions.get(range_key_name)
+ if range_condition:
+ range_comparison = range_condition["ComparisonOperator"]
+ range_values = range_condition["AttributeValueList"]
+ else:
+ range_comparison = None
+ range_values = []
+ if query_filters:
+ filter_kwargs.update(query_filters)
+ index_name = self.body.get("IndexName")
+ exclusive_start_key = self.body.get("ExclusiveStartKey")
+ limit = self.body.get("Limit")
+ scan_index_forward = self.body.get("ScanIndexForward")
+ items, scanned_count, last_evaluated_key = self.dynamodb_backend.query(
+ name,
+ hash_key,
+ range_comparison,
+ range_values,
+ limit,
+ exclusive_start_key,
+ scan_index_forward,
+ projection_expression,
+ index_name=index_name,
+ expr_names=expression_attribute_names,
+ expr_values=expression_attribute_values,
+ filter_expression=filter_expression,
+ **filter_kwargs
+ )
+
+ result = {
+ "Count": len(items),
+ "ScannedCount": scanned_count,
+ }
+
+ if self.body.get("Select", "").upper() != "COUNT":
+ result["Items"] = [item.attrs for item in items]
+
+ if last_evaluated_key is not None:
+ result["LastEvaluatedKey"] = last_evaluated_key
+
+ return dynamo_json_dump(result)
+
+ def _adjust_projection_expression(self, projection_expression, expr_attr_names):
+ def _adjust(expression):
+ return (
+ expr_attr_names[expression]
+ if expression in expr_attr_names
+ else expression
+ )
+
+ if projection_expression and expr_attr_names:
+ expressions = [x.strip() for x in projection_expression.split(",")]
+ return ",".join(
+ [
+ ".".join([_adjust(expr) for expr in nested_expr.split(".")])
+ for nested_expr in expressions
+ ]
+ )
+
+ return projection_expression
+
+ @include_consumed_capacity()
+ def scan(self):
+ name = self.body["TableName"]
+
+ filters = {}
+ scan_filters = self.body.get("ScanFilter", {})
+ for attribute_name, scan_filter in scan_filters.items():
+ # Keys are attribute names. Values are tuples of (comparison,
+ # comparison_value)
+ comparison_operator = scan_filter["ComparisonOperator"]
+ comparison_values = scan_filter.get("AttributeValueList", [])
+ filters[attribute_name] = (comparison_operator, comparison_values)
+
+ filter_expression = self.body.get("FilterExpression")
+ expression_attribute_values = self.body.get("ExpressionAttributeValues", {})
+ expression_attribute_names = self.body.get("ExpressionAttributeNames", {})
+ projection_expression = self.body.get("ProjectionExpression", "")
+ exclusive_start_key = self.body.get("ExclusiveStartKey")
+ limit = self.body.get("Limit")
+ index_name = self.body.get("IndexName")
+
+ try:
+ items, scanned_count, last_evaluated_key = self.dynamodb_backend.scan(
+ name,
+ filters,
+ limit,
+ exclusive_start_key,
+ filter_expression,
+ expression_attribute_names,
+ expression_attribute_values,
+ index_name,
+ projection_expression,
+ )
+ except ValueError as err:
+ raise MockValidationException("Bad Filter Expression: {0}".format(err))
+
+ result = {
+ "Count": len(items),
+ "Items": [item.attrs for item in items],
+ "ScannedCount": scanned_count,
+ }
+ if last_evaluated_key is not None:
+ result["LastEvaluatedKey"] = last_evaluated_key
+ return dynamo_json_dump(result)
+
+ def delete_item(self):
+ name = self.body["TableName"]
+ key = self.body["Key"]
+ return_values = self.body.get("ReturnValues", "NONE")
+ if return_values not in ("ALL_OLD", "NONE"):
+ raise MockValidationException("Return values set to invalid value")
+
+ try:
+ self.dynamodb_backend.get_table(name)
+ except ResourceNotFoundException:
+ raise ConditionalCheckFailed(
+ "A condition specified in the operation could not be evaluated."
+ )
+
+ # Attempt to parse simple ConditionExpressions into an Expected
+ # expression
+ condition_expression = self.body.get("ConditionExpression")
+ expression_attribute_names = self.body.get("ExpressionAttributeNames", {})
+ expression_attribute_values = self.body.get("ExpressionAttributeValues", {})
+
+ item = self.dynamodb_backend.delete_item(
+ name,
+ key,
+ expression_attribute_names,
+ expression_attribute_values,
+ condition_expression,
+ )
+
+ if item and return_values == "ALL_OLD":
+ item_dict = item.to_json()
+ else:
+ item_dict = {"Attributes": {}}
+ item_dict["ConsumedCapacityUnits"] = 0.5
+ return dynamo_json_dump(item_dict)
+
+ def update_item(self):
+ name = self.body["TableName"]
+ key = self.body["Key"]
+ return_values = self.body.get("ReturnValues", "NONE")
+ update_expression = self.body.get("UpdateExpression", "").strip()
+ attribute_updates = self.body.get("AttributeUpdates")
+ if update_expression and attribute_updates:
+ raise MockValidationException(
+ "Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {AttributeUpdates} Expression parameters: {UpdateExpression}"
+ )
+ # We need to copy the item in order to avoid it being modified by the update_item operation
+ existing_item = copy.deepcopy(self.dynamodb_backend.get_item(name, key))
+ if existing_item:
+ existing_attributes = existing_item.to_json()["Attributes"]
+ else:
+ existing_attributes = {}
+
+ if return_values not in (
+ "NONE",
+ "ALL_OLD",
+ "ALL_NEW",
+ "UPDATED_OLD",
+ "UPDATED_NEW",
+ ):
+ raise MockValidationException("Return values set to invalid value")
+
+ if "Expected" in self.body:
+ expected = self.body["Expected"]
+ else:
+ expected = None
+
+ # Attempt to parse simple ConditionExpressions into an Expected
+ # expression
+ condition_expression = self.body.get("ConditionExpression")
+ expression_attribute_names = self.body.get("ExpressionAttributeNames", {})
+ expression_attribute_values = self.body.get("ExpressionAttributeValues", {})
+
+ item = self.dynamodb_backend.update_item(
+ name,
+ key,
+ update_expression=update_expression,
+ attribute_updates=attribute_updates,
+ expression_attribute_names=expression_attribute_names,
+ expression_attribute_values=expression_attribute_values,
+ expected=expected,
+ condition_expression=condition_expression,
+ )
+
+ item_dict = item.to_json()
+ item_dict["ConsumedCapacity"] = {"TableName": name, "CapacityUnits": 0.5}
+ unchanged_attributes = {
+ k
+ for k in existing_attributes.keys()
+ if existing_attributes[k] == item_dict["Attributes"].get(k)
+ }
+ changed_attributes = (
+ set(existing_attributes.keys())
+ .union(item_dict["Attributes"].keys())
+ .difference(unchanged_attributes)
+ )
+
+ if return_values == "NONE":
+ item_dict["Attributes"] = {}
+ elif return_values == "ALL_OLD":
+ item_dict["Attributes"] = existing_attributes
+ elif return_values == "UPDATED_OLD":
+ item_dict["Attributes"] = {
+ k: v for k, v in existing_attributes.items() if k in changed_attributes
+ }
+ elif return_values == "UPDATED_NEW":
+ item_dict["Attributes"] = self._build_updated_new_attributes(
+ existing_attributes, item_dict["Attributes"]
+ )
+ return dynamo_json_dump(item_dict)
+
+ def _build_updated_new_attributes(self, original, changed):
+ if type(changed) != type(original):
+ return changed
+ else:
+ if type(changed) is dict:
+ return {
+ key: self._build_updated_new_attributes(
+ original.get(key, None), changed[key]
+ )
+ for key in changed.keys()
+ if key not in original or changed[key] != original[key]
+ }
+ elif type(changed) in (set, list):
+ if len(changed) != len(original):
+ return changed
+ else:
+ return [
+ self._build_updated_new_attributes(
+ original[index], changed[index]
+ )
+ for index in range(len(changed))
+ ]
+ else:
+ return changed
+
+ def describe_limits(self):
+ return json.dumps(
+ {
+ "AccountMaxReadCapacityUnits": 20000,
+ "TableMaxWriteCapacityUnits": 10000,
+ "AccountMaxWriteCapacityUnits": 20000,
+ "TableMaxReadCapacityUnits": 10000,
+ }
+ )
+
+ def update_time_to_live(self):
+ name = self.body["TableName"]
+ ttl_spec = self.body["TimeToLiveSpecification"]
+
+ self.dynamodb_backend.update_time_to_live(name, ttl_spec)
+
+ return json.dumps({"TimeToLiveSpecification": ttl_spec})
+
+ def describe_time_to_live(self):
+ name = self.body["TableName"]
+
+ ttl_spec = self.dynamodb_backend.describe_time_to_live(name)
+
+ return json.dumps({"TimeToLiveDescription": ttl_spec})
+
+ def transact_get_items(self):
+ transact_items = self.body["TransactItems"]
+ responses = list()
+
+ if len(transact_items) > TRANSACTION_MAX_ITEMS:
+ msg = "1 validation error detected: Value '["
+ err_list = list()
+ request_id = 268435456
+ for _ in transact_items:
+ request_id += 1
+ hex_request_id = format(request_id, "x")
+ err_list.append(
+ "com.amazonaws.dynamodb.v20120810.TransactGetItem@%s"
+ % hex_request_id
+ )
+ msg += ", ".join(err_list)
+ msg += (
+ "'] at 'transactItems' failed to satisfy constraint: "
+ "Member must have length less than or equal to %s"
+ % TRANSACTION_MAX_ITEMS
+ )
+
+ raise MockValidationException(msg)
+
+ ret_consumed_capacity = self.body.get("ReturnConsumedCapacity", "NONE")
+ consumed_capacity = dict()
+
+ for transact_item in transact_items:
+
+ table_name = transact_item["Get"]["TableName"]
+ key = transact_item["Get"]["Key"]
+ item = self.dynamodb_backend.get_item(table_name, key)
+
+ if not item:
+ responses.append({})
+ continue
+
+ item_describe = item.describe_attrs(False)
+ responses.append(item_describe)
+
+ table_capacity = consumed_capacity.get(table_name, {})
+ table_capacity["TableName"] = table_name
+ capacity_units = table_capacity.get("CapacityUnits", 0) + 2.0
+ table_capacity["CapacityUnits"] = capacity_units
+ read_capacity_units = table_capacity.get("ReadCapacityUnits", 0) + 2.0
+ table_capacity["ReadCapacityUnits"] = read_capacity_units
+ consumed_capacity[table_name] = table_capacity
+
+ if ret_consumed_capacity == "INDEXES":
+ table_capacity["Table"] = {
+ "CapacityUnits": capacity_units,
+ "ReadCapacityUnits": read_capacity_units,
+ }
+
+ result = dict()
+ result.update({"Responses": responses})
+ if ret_consumed_capacity != "NONE":
+ result.update({"ConsumedCapacity": [v for v in consumed_capacity.values()]})
+
+ return dynamo_json_dump(result)
+
+ def transact_write_items(self):
+ transact_items = self.body["TransactItems"]
+ self.dynamodb_backend.transact_write_items(transact_items)
+ response = {"ConsumedCapacity": [], "ItemCollectionMetrics": {}}
+ return dynamo_json_dump(response)
+
+ def describe_continuous_backups(self):
+ name = self.body["TableName"]
+
+ response = self.dynamodb_backend.describe_continuous_backups(name)
+
+ return json.dumps({"ContinuousBackupsDescription": response})
+
+ def update_continuous_backups(self):
+ name = self.body["TableName"]
+ point_in_time_spec = self.body["PointInTimeRecoverySpecification"]
+
+ response = self.dynamodb_backend.update_continuous_backups(
+ name, point_in_time_spec
+ )
+
+ return json.dumps({"ContinuousBackupsDescription": response})
+
+ def list_backups(self):
+ body = self.body
+ table_name = body.get("TableName")
+ backups = self.dynamodb_backend.list_backups(table_name)
+ response = {"BackupSummaries": [backup.summary for backup in backups]}
+ return dynamo_json_dump(response)
+
+ def create_backup(self):
+ body = self.body
+ table_name = body.get("TableName")
+ backup_name = body.get("BackupName")
+ backup = self.dynamodb_backend.create_backup(table_name, backup_name)
+ response = {"BackupDetails": backup.details}
+ return dynamo_json_dump(response)
+
+ def delete_backup(self):
+ body = self.body
+ backup_arn = body.get("BackupArn")
+ backup = self.dynamodb_backend.delete_backup(backup_arn)
+ response = {"BackupDescription": backup.description}
+ return dynamo_json_dump(response)
+
+ def describe_backup(self):
+ body = self.body
+ backup_arn = body.get("BackupArn")
+ backup = self.dynamodb_backend.describe_backup(backup_arn)
+ response = {"BackupDescription": backup.description}
+ return dynamo_json_dump(response)
+
+ def restore_table_from_backup(self):
+ body = self.body
+ target_table_name = body.get("TargetTableName")
+ backup_arn = body.get("BackupArn")
+ restored_table = self.dynamodb_backend.restore_table_from_backup(
+ target_table_name, backup_arn
+ )
+ return dynamo_json_dump(restored_table.describe())
+
+ def restore_table_to_point_in_time(self):
+ body = self.body
+ target_table_name = body.get("TargetTableName")
+ source_table_name = body.get("SourceTableName")
+ restored_table = self.dynamodb_backend.restore_table_to_point_in_time(
+ target_table_name, source_table_name
+ )
+ return dynamo_json_dump(restored_table.describe())
diff --git a/contrib/python/moto/py3/moto/dynamodb/urls.py b/contrib/python/moto/py3/moto/dynamodb/urls.py
new file mode 100644
index 0000000000..59f70de77a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb/urls.py
@@ -0,0 +1,5 @@
+from .responses import DynamoHandler
+
+url_bases = [r"https?://dynamodb\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/": DynamoHandler.dispatch}
diff --git a/contrib/python/moto/py3/moto/dynamodb_v20111205/__init__.py b/contrib/python/moto/py3/moto/dynamodb_v20111205/__init__.py
new file mode 100644
index 0000000000..cd234cf232
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb_v20111205/__init__.py
@@ -0,0 +1,9 @@
+from .models import dynamodb_backends
+from ..core.models import base_decorator
+
+"""
+An older API version of DynamoDB.
+Please see the corresponding tests (tests/test_dynamodb_v20111205) on how to invoke this API.
+"""
+
+mock_dynamodb = base_decorator(dynamodb_backends)
diff --git a/contrib/python/moto/py3/moto/dynamodb_v20111205/comparisons.py b/contrib/python/moto/py3/moto/dynamodb_v20111205/comparisons.py
new file mode 100644
index 0000000000..f31b9d5c32
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb_v20111205/comparisons.py
@@ -0,0 +1,22 @@
+# TODO add tests for all of these
+COMPARISON_FUNCS = {
+ "EQ": lambda item_value, test_value: item_value == test_value,
+ "NE": lambda item_value, test_value: item_value != test_value,
+ "LE": lambda item_value, test_value: item_value <= test_value,
+ "LT": lambda item_value, test_value: item_value < test_value,
+ "GE": lambda item_value, test_value: item_value >= test_value,
+ "GT": lambda item_value, test_value: item_value > test_value,
+ "NULL": lambda item_value: item_value is None,
+ "NOT_NULL": lambda item_value: item_value is not None,
+ "CONTAINS": lambda item_value, test_value: test_value in item_value,
+ "NOT_CONTAINS": lambda item_value, test_value: test_value not in item_value,
+ "BEGINS_WITH": lambda item_value, test_value: item_value.startswith(test_value),
+ "IN": lambda item_value, *test_values: item_value in test_values,
+ "BETWEEN": lambda item_value, lower_test_value, upper_test_value: lower_test_value
+ <= item_value
+ <= upper_test_value,
+}
+
+
+def get_comparison_func(range_comparison):
+ return COMPARISON_FUNCS.get(range_comparison)
diff --git a/contrib/python/moto/py3/moto/dynamodb_v20111205/models.py b/contrib/python/moto/py3/moto/dynamodb_v20111205/models.py
new file mode 100644
index 0000000000..dc3e3af29a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb_v20111205/models.py
@@ -0,0 +1,400 @@
+from collections import defaultdict
+import datetime
+import json
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import unix_time, BackendDict
+from moto.core import get_account_id
+from .comparisons import get_comparison_func
+
+
+class DynamoJsonEncoder(json.JSONEncoder):
+ def default(self, o):
+ if hasattr(o, "to_json"):
+ return o.to_json()
+
+
+def dynamo_json_dump(dynamo_object):
+ return json.dumps(dynamo_object, cls=DynamoJsonEncoder)
+
+
+class DynamoType(object):
+ """
+ http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModelDataTypes
+ """
+
+ def __init__(self, type_as_dict):
+ self.type = list(type_as_dict.keys())[0]
+ self.value = list(type_as_dict.values())[0]
+
+ def __hash__(self):
+ return hash((self.type, self.value))
+
+ def __eq__(self, other):
+ return self.type == other.type and self.value == other.value
+
+ def __repr__(self):
+ return "DynamoType: {0}".format(self.to_json())
+
+ def add(self, dyn_type):
+ if self.type == "SS":
+ self.value.append(dyn_type.value)
+ if self.type == "N":
+ self.value = str(int(self.value) + int(dyn_type.value))
+
+ def to_json(self):
+ return {self.type: self.value}
+
+ def compare(self, range_comparison, range_objs):
+ """
+ Compares this type against comparison filters
+ """
+ range_values = [obj.value for obj in range_objs]
+ comparison_func = get_comparison_func(range_comparison)
+ return comparison_func(self.value, *range_values)
+
+
+class Item(BaseModel):
+ def __init__(self, hash_key, hash_key_type, range_key, range_key_type, attrs):
+ self.hash_key = hash_key
+ self.hash_key_type = hash_key_type
+ self.range_key = range_key
+ self.range_key_type = range_key_type
+
+ self.attrs = {}
+ for key, value in attrs.items():
+ self.attrs[key] = DynamoType(value)
+
+ def __repr__(self):
+ return "Item: {0}".format(self.to_json())
+
+ def to_json(self):
+ attributes = {}
+ for attribute_key, attribute in self.attrs.items():
+ attributes[attribute_key] = attribute.value
+
+ return {"Attributes": attributes}
+
+ def describe_attrs(self, attributes):
+ if attributes:
+ included = {}
+ for key, value in self.attrs.items():
+ if key in attributes:
+ included[key] = value
+ else:
+ included = self.attrs
+ return {"Item": included}
+
+
+class Table(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ hash_key_attr,
+ hash_key_type,
+ range_key_attr=None,
+ range_key_type=None,
+ read_capacity=None,
+ write_capacity=None,
+ ):
+ self.name = name
+ self.hash_key_attr = hash_key_attr
+ self.hash_key_type = hash_key_type
+ self.range_key_attr = range_key_attr
+ self.range_key_type = range_key_type
+ self.read_capacity = read_capacity
+ self.write_capacity = write_capacity
+ self.created_at = datetime.datetime.utcnow()
+ self.items = defaultdict(dict)
+
+ @property
+ def has_range_key(self):
+ return self.range_key_attr is not None
+
+ @property
+ def describe(self):
+ results = {
+ "Table": {
+ "CreationDateTime": unix_time(self.created_at),
+ "KeySchema": {
+ "HashKeyElement": {
+ "AttributeName": self.hash_key_attr,
+ "AttributeType": self.hash_key_type,
+ }
+ },
+ "ProvisionedThroughput": {
+ "ReadCapacityUnits": self.read_capacity,
+ "WriteCapacityUnits": self.write_capacity,
+ },
+ "TableName": self.name,
+ "TableStatus": "ACTIVE",
+ "ItemCount": len(self),
+ "TableSizeBytes": 0,
+ }
+ }
+ if self.has_range_key:
+ results["Table"]["KeySchema"]["RangeKeyElement"] = {
+ "AttributeName": self.range_key_attr,
+ "AttributeType": self.range_key_type,
+ }
+ return results
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "TableName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html
+ return "AWS::DynamoDB::Table"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ key_attr = [
+ i["AttributeName"]
+ for i in properties["KeySchema"]
+ if i["KeyType"] == "HASH"
+ ][0]
+ key_type = [
+ i["AttributeType"]
+ for i in properties["AttributeDefinitions"]
+ if i["AttributeName"] == key_attr
+ ][0]
+ spec = {
+ "name": properties["TableName"],
+ "hash_key_attr": key_attr,
+ "hash_key_type": key_type,
+ }
+ # TODO: optional properties still missing:
+ # range_key_attr, range_key_type, read_capacity, write_capacity
+ return Table(**spec)
+
+ def __len__(self):
+ return sum(
+ [(len(value) if self.has_range_key else 1) for value in self.items.values()]
+ )
+
+ def __nonzero__(self):
+ return True
+
+ def __bool__(self):
+ return self.__nonzero__()
+
+ def put_item(self, item_attrs):
+ hash_value = DynamoType(item_attrs.get(self.hash_key_attr))
+ if self.has_range_key:
+ range_value = DynamoType(item_attrs.get(self.range_key_attr))
+ else:
+ range_value = None
+
+ item = Item(
+ hash_value, self.hash_key_type, range_value, self.range_key_type, item_attrs
+ )
+
+ if range_value:
+ self.items[hash_value][range_value] = item
+ else:
+ self.items[hash_value] = item
+ return item
+
+ def get_item(self, hash_key, range_key):
+ if self.has_range_key and not range_key:
+ raise ValueError(
+ "Table has a range key, but no range key was passed into get_item"
+ )
+ try:
+ if range_key:
+ return self.items[hash_key][range_key]
+ else:
+ return self.items[hash_key]
+ except KeyError:
+ return None
+
+ def query(self, hash_key, range_comparison, range_objs):
+ results = []
+ last_page = True # Once pagination is implemented, change this
+
+ if self.range_key_attr:
+ possible_results = self.items[hash_key].values()
+ else:
+ possible_results = list(self.all_items())
+
+ if range_comparison:
+ for result in possible_results:
+ if result.range_key.compare(range_comparison, range_objs):
+ results.append(result)
+ else:
+ # If we're not filtering on range key, return all values
+ results = possible_results
+ return results, last_page
+
+ def all_items(self):
+ for hash_set in self.items.values():
+ if self.range_key_attr:
+ for item in hash_set.values():
+ yield item
+ else:
+ yield hash_set
+
+ def scan(self, filters):
+ results = []
+ scanned_count = 0
+ last_page = True # Once pagination is implemented, change this
+
+ for result in self.all_items():
+ scanned_count += 1
+ passes_all_conditions = True
+ for (
+ attribute_name,
+ (comparison_operator, comparison_objs),
+ ) in filters.items():
+ attribute = result.attrs.get(attribute_name)
+
+ if attribute:
+ # Attribute found
+ if not attribute.compare(comparison_operator, comparison_objs):
+ passes_all_conditions = False
+ break
+ elif comparison_operator == "NULL":
+ # Comparison is NULL and we don't have the attribute
+ continue
+ else:
+ # No attribute found and comparison is no NULL. This item
+ # fails
+ passes_all_conditions = False
+ break
+
+ if passes_all_conditions:
+ results.append(result)
+
+ return results, scanned_count, last_page
+
+ def delete_item(self, hash_key, range_key):
+ try:
+ if range_key:
+ return self.items[hash_key].pop(range_key)
+ else:
+ return self.items.pop(hash_key)
+ except KeyError:
+ return None
+
+ def update_item(self, hash_key, range_key, attr_updates):
+ item = self.get_item(hash_key, range_key)
+ if not item:
+ return None
+
+ for attr, update in attr_updates.items():
+ if update["Action"] == "PUT":
+ item.attrs[attr] = DynamoType(update["Value"])
+ if update["Action"] == "DELETE":
+ item.attrs.pop(attr)
+ if update["Action"] == "ADD":
+ item.attrs[attr].add(DynamoType(update["Value"]))
+ return item
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["StreamArn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "StreamArn":
+ region = "us-east-1"
+ time = "2000-01-01T00:00:00.000"
+ return "arn:aws:dynamodb:{0}:{1}:table/{2}/stream/{3}".format(
+ region, get_account_id(), self.name, time
+ )
+ raise UnformattedGetAttTemplateException()
+
+
+class DynamoDBBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.tables = OrderedDict()
+
+ def create_table(self, name, **params):
+ table = Table(name, **params)
+ self.tables[name] = table
+ return table
+
+ def delete_table(self, name):
+ return self.tables.pop(name, None)
+
+ def update_table_throughput(self, name, new_read_units, new_write_units):
+ table = self.tables[name]
+ table.read_capacity = new_read_units
+ table.write_capacity = new_write_units
+ return table
+
+ def put_item(self, table_name, item_attrs):
+ table = self.tables.get(table_name)
+ if not table:
+ return None
+
+ return table.put_item(item_attrs)
+
+ def get_item(self, table_name, hash_key_dict, range_key_dict):
+ table = self.tables.get(table_name)
+ if not table:
+ return None
+
+ hash_key = DynamoType(hash_key_dict)
+ range_key = DynamoType(range_key_dict) if range_key_dict else None
+
+ return table.get_item(hash_key, range_key)
+
+ def query(self, table_name, hash_key_dict, range_comparison, range_value_dicts):
+ table = self.tables.get(table_name)
+ if not table:
+ return None, None
+
+ hash_key = DynamoType(hash_key_dict)
+ range_values = [DynamoType(range_value) for range_value in range_value_dicts]
+
+ return table.query(hash_key, range_comparison, range_values)
+
+ def scan(self, table_name, filters):
+ table = self.tables.get(table_name)
+ if not table:
+ return None, None, None
+
+ scan_filters = {}
+ for key, (comparison_operator, comparison_values) in filters.items():
+ dynamo_types = [DynamoType(value) for value in comparison_values]
+ scan_filters[key] = (comparison_operator, dynamo_types)
+
+ return table.scan(scan_filters)
+
+ def delete_item(self, table_name, hash_key_dict, range_key_dict):
+ table = self.tables.get(table_name)
+ if not table:
+ return None
+
+ hash_key = DynamoType(hash_key_dict)
+ range_key = DynamoType(range_key_dict) if range_key_dict else None
+
+ return table.delete_item(hash_key, range_key)
+
+ def update_item(self, table_name, hash_key_dict, range_key_dict, attr_updates):
+ table = self.tables.get(table_name)
+ if not table:
+ return None
+
+ hash_key = DynamoType(hash_key_dict)
+ range_key = DynamoType(range_key_dict) if range_key_dict else None
+
+ return table.update_item(hash_key, range_key, attr_updates)
+
+
+dynamodb_backends = BackendDict(
+ DynamoDBBackend,
+ "dynamodb_v20111205",
+ use_boto3_regions=False,
+ additional_regions=["global"],
+)
+dynamodb_backend = dynamodb_backends["global"]
diff --git a/contrib/python/moto/py3/moto/dynamodb_v20111205/responses.py b/contrib/python/moto/py3/moto/dynamodb_v20111205/responses.py
new file mode 100644
index 0000000000..4584ae29a8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb_v20111205/responses.py
@@ -0,0 +1,294 @@
+import json
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import camelcase_to_underscores
+from .models import dynamodb_backend, dynamo_json_dump
+
+
+class DynamoHandler(BaseResponse):
+ def get_endpoint_name(self, headers):
+ """Parses request headers and extracts part od the X-Amz-Target
+ that corresponds to a method of DynamoHandler
+
+ ie: X-Amz-Target: DynamoDB_20111205.ListTables -> ListTables
+ """
+ # Headers are case-insensitive. Probably a better way to do this.
+ match = headers.get("x-amz-target") or headers.get("X-Amz-Target")
+ if match:
+ return match.split(".")[1]
+
+ def error(self, type_, status=400):
+ return status, self.response_headers, dynamo_json_dump({"__type": type_})
+
+ def call_action(self):
+ self.body = json.loads(self.body or "{}")
+ endpoint = self.get_endpoint_name(self.headers)
+ if endpoint:
+ endpoint = camelcase_to_underscores(endpoint)
+ response = getattr(self, endpoint)()
+ if isinstance(response, str):
+ return 200, self.response_headers, response
+
+ else:
+ status_code, new_headers, response_content = response
+ self.response_headers.update(new_headers)
+ return status_code, self.response_headers, response_content
+ else:
+ return 404, self.response_headers, ""
+
+ def list_tables(self):
+ body = self.body
+ limit = body.get("Limit")
+ if body.get("ExclusiveStartTableName"):
+ last = body.get("ExclusiveStartTableName")
+ start = list(dynamodb_backend.tables.keys()).index(last) + 1
+ else:
+ start = 0
+ all_tables = list(dynamodb_backend.tables.keys())
+ if limit:
+ tables = all_tables[start : start + limit]
+ else:
+ tables = all_tables[start:]
+ response = {"TableNames": tables}
+ if limit and len(all_tables) > start + limit:
+ response["LastEvaluatedTableName"] = tables[-1]
+ return dynamo_json_dump(response)
+
+ def create_table(self):
+ body = self.body
+ name = body["TableName"]
+
+ key_schema = body["KeySchema"]
+ hash_key = key_schema["HashKeyElement"]
+ hash_key_attr = hash_key["AttributeName"]
+ hash_key_type = hash_key["AttributeType"]
+
+ range_key = key_schema.get("RangeKeyElement", {})
+ range_key_attr = range_key.get("AttributeName")
+ range_key_type = range_key.get("AttributeType")
+
+ throughput = body["ProvisionedThroughput"]
+ read_units = throughput["ReadCapacityUnits"]
+ write_units = throughput["WriteCapacityUnits"]
+
+ table = dynamodb_backend.create_table(
+ name,
+ hash_key_attr=hash_key_attr,
+ hash_key_type=hash_key_type,
+ range_key_attr=range_key_attr,
+ range_key_type=range_key_type,
+ read_capacity=int(read_units),
+ write_capacity=int(write_units),
+ )
+ return dynamo_json_dump(table.describe)
+
+ def delete_table(self):
+ name = self.body["TableName"]
+ table = dynamodb_backend.delete_table(name)
+ if table:
+ return dynamo_json_dump(table.describe)
+ else:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+
+ def update_table(self):
+ name = self.body["TableName"]
+ throughput = self.body["ProvisionedThroughput"]
+ new_read_units = throughput["ReadCapacityUnits"]
+ new_write_units = throughput["WriteCapacityUnits"]
+ table = dynamodb_backend.update_table_throughput(
+ name, new_read_units, new_write_units
+ )
+ return dynamo_json_dump(table.describe)
+
+ def describe_table(self):
+ name = self.body["TableName"]
+ try:
+ table = dynamodb_backend.tables[name]
+ except KeyError:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+ return dynamo_json_dump(table.describe)
+
+ def put_item(self):
+ name = self.body["TableName"]
+ item = self.body["Item"]
+ result = dynamodb_backend.put_item(name, item)
+ if result:
+ item_dict = result.to_json()
+ item_dict["ConsumedCapacityUnits"] = 1
+ return dynamo_json_dump(item_dict)
+ else:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+
+ def batch_write_item(self):
+ table_batches = self.body["RequestItems"]
+
+ for table_name, table_requests in table_batches.items():
+ for table_request in table_requests:
+ request_type = list(table_request)[0]
+ request = list(table_request.values())[0]
+
+ if request_type == "PutRequest":
+ item = request["Item"]
+ dynamodb_backend.put_item(table_name, item)
+ elif request_type == "DeleteRequest":
+ key = request["Key"]
+ hash_key = key["HashKeyElement"]
+ range_key = key.get("RangeKeyElement")
+ item = dynamodb_backend.delete_item(table_name, hash_key, range_key)
+
+ response = {
+ "Responses": {
+ "Thread": {"ConsumedCapacityUnits": 1.0},
+ "Reply": {"ConsumedCapacityUnits": 1.0},
+ },
+ "UnprocessedItems": {},
+ }
+
+ return dynamo_json_dump(response)
+
+ def get_item(self):
+ name = self.body["TableName"]
+ key = self.body["Key"]
+ hash_key = key["HashKeyElement"]
+ range_key = key.get("RangeKeyElement")
+ attrs_to_get = self.body.get("AttributesToGet")
+ try:
+ item = dynamodb_backend.get_item(name, hash_key, range_key)
+ except ValueError:
+ er = "com.amazon.coral.validate#ValidationException"
+ return self.error(er, status=400)
+ if item:
+ item_dict = item.describe_attrs(attrs_to_get)
+ item_dict["ConsumedCapacityUnits"] = 0.5
+ return dynamo_json_dump(item_dict)
+ else:
+ # Item not found
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er, status=404)
+
+ def batch_get_item(self):
+ table_batches = self.body["RequestItems"]
+
+ results = {"Responses": {"UnprocessedKeys": {}}}
+
+ for table_name, table_request in table_batches.items():
+ items = []
+ keys = table_request["Keys"]
+ attributes_to_get = table_request.get("AttributesToGet")
+ for key in keys:
+ hash_key = key["HashKeyElement"]
+ range_key = key.get("RangeKeyElement")
+ item = dynamodb_backend.get_item(table_name, hash_key, range_key)
+ if item:
+ item_describe = item.describe_attrs(attributes_to_get)
+ items.append(item_describe)
+ results["Responses"][table_name] = {
+ "Items": items,
+ "ConsumedCapacityUnits": 1,
+ }
+ return dynamo_json_dump(results)
+
+ def query(self):
+ name = self.body["TableName"]
+ hash_key = self.body["HashKeyValue"]
+ range_condition = self.body.get("RangeKeyCondition")
+ if range_condition:
+ range_comparison = range_condition["ComparisonOperator"]
+ range_values = range_condition["AttributeValueList"]
+ else:
+ range_comparison = None
+ range_values = []
+
+ items, _ = dynamodb_backend.query(
+ name, hash_key, range_comparison, range_values
+ )
+
+ if items is None:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+
+ result = {
+ "Count": len(items),
+ "Items": [item.attrs for item in items],
+ "ConsumedCapacityUnits": 1,
+ }
+
+ # Implement this when we do pagination
+ # if not last_page:
+ # result["LastEvaluatedKey"] = {
+ # "HashKeyElement": items[-1].hash_key,
+ # "RangeKeyElement": items[-1].range_key,
+ # }
+ return dynamo_json_dump(result)
+
+ def scan(self):
+ name = self.body["TableName"]
+
+ filters = {}
+ scan_filters = self.body.get("ScanFilter", {})
+ for attribute_name, scan_filter in scan_filters.items():
+ # Keys are attribute names. Values are tuples of (comparison,
+ # comparison_value)
+ comparison_operator = scan_filter["ComparisonOperator"]
+ comparison_values = scan_filter.get("AttributeValueList", [])
+ filters[attribute_name] = (comparison_operator, comparison_values)
+
+ items, scanned_count, _ = dynamodb_backend.scan(name, filters)
+
+ if items is None:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+
+ result = {
+ "Count": len(items),
+ "Items": [item.attrs for item in items if item],
+ "ConsumedCapacityUnits": 1,
+ "ScannedCount": scanned_count,
+ }
+
+ # Implement this when we do pagination
+ # if not last_page:
+ # result["LastEvaluatedKey"] = {
+ # "HashKeyElement": items[-1].hash_key,
+ # "RangeKeyElement": items[-1].range_key,
+ # }
+ return dynamo_json_dump(result)
+
+ def delete_item(self):
+ name = self.body["TableName"]
+ key = self.body["Key"]
+ hash_key = key["HashKeyElement"]
+ range_key = key.get("RangeKeyElement")
+ return_values = self.body.get("ReturnValues", "")
+ item = dynamodb_backend.delete_item(name, hash_key, range_key)
+ if item:
+ if return_values == "ALL_OLD":
+ item_dict = item.to_json()
+ else:
+ item_dict = {"Attributes": []}
+ item_dict["ConsumedCapacityUnits"] = 0.5
+ return dynamo_json_dump(item_dict)
+ else:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
+
+ def update_item(self):
+ name = self.body["TableName"]
+ key = self.body["Key"]
+ hash_key = key["HashKeyElement"]
+ range_key = key.get("RangeKeyElement")
+ updates = self.body["AttributeUpdates"]
+
+ item = dynamodb_backend.update_item(name, hash_key, range_key, updates)
+
+ if item:
+ item_dict = item.to_json()
+ item_dict["ConsumedCapacityUnits"] = 0.5
+
+ return dynamo_json_dump(item_dict)
+ else:
+ er = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
+ return self.error(er)
diff --git a/contrib/python/moto/py3/moto/dynamodb_v20111205/urls.py b/contrib/python/moto/py3/moto/dynamodb_v20111205/urls.py
new file mode 100644
index 0000000000..59f70de77a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodb_v20111205/urls.py
@@ -0,0 +1,5 @@
+from .responses import DynamoHandler
+
+url_bases = [r"https?://dynamodb\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/": DynamoHandler.dispatch}
diff --git a/contrib/python/moto/py3/moto/dynamodbstreams/__init__.py b/contrib/python/moto/py3/moto/dynamodbstreams/__init__.py
new file mode 100644
index 0000000000..307df29cd1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodbstreams/__init__.py
@@ -0,0 +1,5 @@
+from .models import dynamodbstreams_backends
+from ..core.models import base_decorator
+
+dynamodbstreams_backend = dynamodbstreams_backends["us-east-1"]
+mock_dynamodbstreams = base_decorator(dynamodbstreams_backends)
diff --git a/contrib/python/moto/py3/moto/dynamodbstreams/models.py b/contrib/python/moto/py3/moto/dynamodbstreams/models.py
new file mode 100644
index 0000000000..0e82cd5af6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodbstreams/models.py
@@ -0,0 +1,135 @@
+import os
+import json
+import base64
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.dynamodb.models import dynamodb_backends, DynamoJsonEncoder
+
+
+class ShardIterator(BaseModel):
+ def __init__(
+ self, streams_backend, stream_shard, shard_iterator_type, sequence_number=None
+ ):
+ self.id = base64.b64encode(os.urandom(472)).decode("utf-8")
+ self.streams_backend = streams_backend
+ self.stream_shard = stream_shard
+ self.shard_iterator_type = shard_iterator_type
+ if shard_iterator_type == "TRIM_HORIZON":
+ self.sequence_number = stream_shard.starting_sequence_number
+ elif shard_iterator_type == "LATEST":
+ self.sequence_number = stream_shard.starting_sequence_number + len(
+ stream_shard.items
+ )
+ elif shard_iterator_type == "AT_SEQUENCE_NUMBER":
+ self.sequence_number = sequence_number
+ elif shard_iterator_type == "AFTER_SEQUENCE_NUMBER":
+ self.sequence_number = sequence_number + 1
+
+ @property
+ def arn(self):
+ return "{}/stream/{}|1|{}".format(
+ self.stream_shard.table.table_arn,
+ self.stream_shard.table.latest_stream_label,
+ self.id,
+ )
+
+ def to_json(self):
+ return {"ShardIterator": self.arn}
+
+ def get(self, limit=1000):
+ items = self.stream_shard.get(self.sequence_number, limit)
+ try:
+ last_sequence_number = max(
+ int(i["dynamodb"]["SequenceNumber"]) for i in items
+ )
+ new_shard_iterator = ShardIterator(
+ self.streams_backend,
+ self.stream_shard,
+ "AFTER_SEQUENCE_NUMBER",
+ last_sequence_number,
+ )
+ except ValueError:
+ new_shard_iterator = ShardIterator(
+ self.streams_backend,
+ self.stream_shard,
+ "AT_SEQUENCE_NUMBER",
+ self.sequence_number,
+ )
+
+ self.streams_backend.shard_iterators[
+ new_shard_iterator.arn
+ ] = new_shard_iterator
+ return {"NextShardIterator": new_shard_iterator.arn, "Records": items}
+
+
+class DynamoDBStreamsBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.shard_iterators = {}
+
+ @property
+ def dynamodb(self):
+ return dynamodb_backends[self.region_name]
+
+ def _get_table_from_arn(self, arn):
+ table_name = arn.split(":", 6)[5].split("/")[1]
+ return self.dynamodb.get_table(table_name)
+
+ def describe_stream(self, arn):
+ table = self._get_table_from_arn(arn)
+ resp = {
+ "StreamDescription": {
+ "StreamArn": arn,
+ "StreamLabel": table.latest_stream_label,
+ "StreamStatus": (
+ "ENABLED" if table.latest_stream_label else "DISABLED"
+ ),
+ "StreamViewType": table.stream_specification["StreamViewType"],
+ "CreationRequestDateTime": table.stream_shard.created_on.isoformat(),
+ "TableName": table.name,
+ "KeySchema": table.schema,
+ "Shards": (
+ [table.stream_shard.to_json()] if table.stream_shard else []
+ ),
+ }
+ }
+
+ return json.dumps(resp)
+
+ def list_streams(self, table_name=None):
+ streams = []
+ for table in self.dynamodb.tables.values():
+ if table_name is not None and table.name != table_name:
+ continue
+ if table.latest_stream_label:
+ d = table.describe(base_key="Table")
+ streams.append(
+ {
+ "StreamArn": d["Table"]["LatestStreamArn"],
+ "TableName": d["Table"]["TableName"],
+ "StreamLabel": d["Table"]["LatestStreamLabel"],
+ }
+ )
+
+ return json.dumps({"Streams": streams})
+
+ def get_shard_iterator(
+ self, arn, shard_id, shard_iterator_type, sequence_number=None
+ ):
+ table = self._get_table_from_arn(arn)
+ assert table.stream_shard.id == shard_id
+
+ shard_iterator = ShardIterator(
+ self, table.stream_shard, shard_iterator_type, sequence_number
+ )
+ self.shard_iterators[shard_iterator.arn] = shard_iterator
+
+ return json.dumps(shard_iterator.to_json())
+
+ def get_records(self, iterator_arn, limit):
+ shard_iterator = self.shard_iterators[iterator_arn]
+ return json.dumps(shard_iterator.get(limit), cls=DynamoJsonEncoder)
+
+
+dynamodbstreams_backends = BackendDict(DynamoDBStreamsBackend, "dynamodbstreams")
diff --git a/contrib/python/moto/py3/moto/dynamodbstreams/responses.py b/contrib/python/moto/py3/moto/dynamodbstreams/responses.py
new file mode 100644
index 0000000000..b0707ff448
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodbstreams/responses.py
@@ -0,0 +1,37 @@
+from moto.core.responses import BaseResponse
+
+from .models import dynamodbstreams_backends
+
+
+class DynamoDBStreamsHandler(BaseResponse):
+ @property
+ def backend(self):
+ return dynamodbstreams_backends[self.region]
+
+ def describe_stream(self):
+ arn = self._get_param("StreamArn")
+ return self.backend.describe_stream(arn)
+
+ def list_streams(self):
+ table_name = self._get_param("TableName")
+ return self.backend.list_streams(table_name)
+
+ def get_shard_iterator(self):
+ arn = self._get_param("StreamArn")
+ shard_id = self._get_param("ShardId")
+ shard_iterator_type = self._get_param("ShardIteratorType")
+ sequence_number = self._get_param("SequenceNumber")
+ # according to documentation sequence_number param should be string
+ if isinstance(sequence_number, str):
+ sequence_number = int(sequence_number)
+
+ return self.backend.get_shard_iterator(
+ arn, shard_id, shard_iterator_type, sequence_number
+ )
+
+ def get_records(self):
+ arn = self._get_param("ShardIterator")
+ limit = self._get_param("Limit")
+ if limit is None:
+ limit = 1000
+ return self.backend.get_records(arn, limit)
diff --git a/contrib/python/moto/py3/moto/dynamodbstreams/urls.py b/contrib/python/moto/py3/moto/dynamodbstreams/urls.py
new file mode 100644
index 0000000000..70cbcc1891
--- /dev/null
+++ b/contrib/python/moto/py3/moto/dynamodbstreams/urls.py
@@ -0,0 +1,5 @@
+from .responses import DynamoDBStreamsHandler
+
+url_bases = [r"https?://streams\.dynamodb\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": DynamoDBStreamsHandler.dispatch}
diff --git a/contrib/python/moto/py3/moto/ebs/__init__.py b/contrib/python/moto/py3/moto/ebs/__init__.py
new file mode 100644
index 0000000000..8254b63e74
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ebs/__init__.py
@@ -0,0 +1,5 @@
+"""ebs module initialization; sets value for base decorator."""
+from .models import ebs_backends
+from ..core.models import base_decorator
+
+mock_ebs = base_decorator(ebs_backends)
diff --git a/contrib/python/moto/py3/moto/ebs/models.py b/contrib/python/moto/py3/moto/ebs/models.py
new file mode 100644
index 0000000000..69a5c32a8c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ebs/models.py
@@ -0,0 +1,124 @@
+"""EBSBackend class with methods for supported APIs."""
+
+from moto.core import ACCOUNT_ID, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from moto.ec2 import ec2_backends
+from moto.ec2.models.elastic_block_store import Snapshot
+from uuid import uuid4
+
+
+class Block(BaseModel):
+ def __init__(self, block_data, checksum, checksum_algorithm, data_length):
+ self.block_data = block_data
+ self.checksum = checksum
+ self.checksum_algorithm = checksum_algorithm
+ self.data_length = data_length
+ self.block_token = str(uuid4())
+
+
+class EBSSnapshot(BaseModel):
+ def __init__(self, snapshot: Snapshot):
+ self.snapshot_id = snapshot.id
+ self.status = "pending"
+ self.start_time = unix_time()
+ self.volume_size = snapshot.volume.size
+ self.block_size = 512
+ self.tags = [
+ {"Key": t["key"], "Value": t["value"]} for t in snapshot.get_tags()
+ ]
+ self.description = snapshot.description
+
+ self.blocks = dict()
+
+ def put_block(
+ self, block_idx, block_data, checksum, checksum_algorithm, data_length
+ ):
+ block = Block(block_data, checksum, checksum_algorithm, data_length)
+ self.blocks[block_idx] = block
+
+ def to_json(self):
+ return {
+ "SnapshotId": self.snapshot_id,
+ "OwnerId": ACCOUNT_ID,
+ "Status": self.status,
+ "StartTime": self.start_time,
+ "VolumeSize": self.volume_size,
+ "BlockSize": self.block_size,
+ "Tags": self.tags,
+ "Description": self.description,
+ }
+
+
+class EBSBackend(BaseBackend):
+ """Implementation of EBS APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.snapshots = dict()
+
+ @property
+ def ec2_backend(self):
+ return ec2_backends[self.region_name]
+
+ def start_snapshot(self, volume_size, tags, description):
+ zone_name = f"{self.region_name}a"
+ vol = self.ec2_backend.create_volume(size=volume_size, zone_name=zone_name)
+ snapshot = self.ec2_backend.create_snapshot(
+ volume_id=vol.id, description=description
+ )
+ if tags:
+ tags = {tag["Key"]: tag["Value"] for tag in tags}
+ snapshot.add_tags(tags)
+ ebs_snapshot = EBSSnapshot(snapshot=snapshot)
+ self.snapshots[ebs_snapshot.snapshot_id] = ebs_snapshot
+ return ebs_snapshot
+
+ def complete_snapshot(self, snapshot_id):
+ self.snapshots[snapshot_id].status = "completed"
+ return {"Status": "completed"}
+
+ def put_snapshot_block(
+ self,
+ snapshot_id,
+ block_index,
+ block_data,
+ checksum,
+ checksum_algorithm,
+ data_length,
+ ):
+ snapshot = self.snapshots[snapshot_id]
+ snapshot.put_block(
+ block_index, block_data, checksum, checksum_algorithm, data_length
+ )
+ return checksum, checksum_algorithm
+
+ def get_snapshot_block(self, snapshot_id, block_index):
+ """
+ The BlockToken-parameter is not yet implemented
+ """
+ snapshot = self.snapshots[snapshot_id]
+ return snapshot.blocks[block_index]
+
+ def list_changed_blocks(self, first_snapshot_id, second_snapshot_id):
+ """
+ The following parameters are not yet implemented: NextToken, MaxResults, StartingBlockIndex
+ """
+ snapshot1 = self.snapshots[first_snapshot_id]
+ snapshot2 = self.snapshots[second_snapshot_id]
+ changed_blocks = dict() # {idx: (token1, token2), ..}
+ for idx in snapshot1.blocks:
+ block1 = snapshot1.blocks[idx]
+ if idx in snapshot2.blocks:
+ block2 = snapshot2.blocks[idx]
+ if block1.block_data != block2.block_data:
+ changed_blocks[idx] = (block1.block_token, block2.block_token)
+ else:
+ changed_blocks[idx] = (block1.block_token, None)
+
+ return changed_blocks, snapshot1
+
+ def list_snapshot_blocks(self, snapshot_id):
+ return self.snapshots[snapshot_id]
+
+
+ebs_backends = BackendDict(EBSBackend, "ebs")
diff --git a/contrib/python/moto/py3/moto/ebs/responses.py b/contrib/python/moto/py3/moto/ebs/responses.py
new file mode 100644
index 0000000000..5b92ff2f55
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ebs/responses.py
@@ -0,0 +1,146 @@
+"""Handles incoming ebs requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import ebs_backends
+
+
+class EBSResponse(BaseResponse):
+ """Handler for EBS requests and responses."""
+
+ @property
+ def ebs_backend(self):
+ """Return backend instance specific for this region."""
+ return ebs_backends[self.region]
+
+ def snapshots(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.start_snapshot()
+
+ def snapshot_block(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.put_snapshot_block(full_url, headers)
+ if request.method == "GET":
+ return self.get_snapshot_block()
+
+ def snapshot_blocks(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.list_snapshot_blocks()
+
+ def start_snapshot(self):
+ """
+ The following parameters are not yet implemented: ParentSnapshotId, ClientToken, Encrypted, KmsKeyArn, Timeout
+ """
+ params = json.loads(self.body)
+ volume_size = params.get("VolumeSize")
+ tags = params.get("Tags")
+ description = params.get("Description")
+ snapshot = self.ebs_backend.start_snapshot(
+ volume_size=volume_size,
+ tags=tags,
+ description=description,
+ )
+ return 200, {}, json.dumps(snapshot.to_json())
+
+ def complete_snapshot(self, request, full_url, headers):
+ """
+ The following parameters are not yet supported: ChangedBlocksCount, Checksum, ChecksumAlgorithm, ChecksumAggregationMethod
+ """
+ self.setup_class(request, full_url, headers)
+ snapshot_id = full_url.split("/")[-1]
+ status = self.ebs_backend.complete_snapshot(snapshot_id=snapshot_id)
+ return 200, {}, json.dumps(status)
+
+ def put_snapshot_block(self, full_url, headers):
+ """
+ The following parameters are currently not taken into account: DataLength, Progress.
+ The Checksum and ChecksumAlgorithm are taken at face-value, but no validation takes place.
+ """
+ snapshot_id = full_url.split("/")[-3]
+ block_index = full_url.split("/")[-1]
+ block_data = self.body
+ headers = {k.lower(): v for k, v in headers.items()}
+ checksum = headers.get("x-amz-checksum")
+ checksum_algorithm = headers.get("x-amz-checksum-algorithm")
+ data_length = headers.get("x-amz-data-length")
+ checksum, checksum_algorithm = self.ebs_backend.put_snapshot_block(
+ snapshot_id=snapshot_id,
+ block_index=block_index,
+ block_data=block_data,
+ checksum=checksum,
+ checksum_algorithm=checksum_algorithm,
+ data_length=data_length,
+ )
+ return (
+ 200,
+ {
+ "x-amz-Checksum": checksum,
+ "x-amz-Checksum-Algorithm": checksum_algorithm,
+ },
+ "{}",
+ )
+
+ def get_snapshot_block(self):
+ snapshot_id = self.path.split("/")[-3]
+ block_index = self.path.split("/")[-1]
+ block = self.ebs_backend.get_snapshot_block(
+ snapshot_id=snapshot_id,
+ block_index=block_index,
+ )
+ headers = {
+ "x-amz-Checksum": block.checksum,
+ "x-amz-Checksum-Algorithm": block.checksum_algorithm,
+ "x-amz-Data-Length": block.data_length,
+ }
+ return 200, headers, block.block_data
+
+ def snapshot_changed_blocks(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ first_snapshot_id = self._get_params().get("firstSnapshotId")
+ second_snapshot_id = self.path.split("/")[-2]
+ changed_blocks, snapshot = self.ebs_backend.list_changed_blocks(
+ first_snapshot_id=first_snapshot_id,
+ second_snapshot_id=second_snapshot_id,
+ )
+ blocks = [
+ {"BlockIndex": idx, "FirstBlockToken": x, "SecondBlockToken": y}
+ for idx, (x, y) in changed_blocks.items()
+ ]
+ return (
+ 200,
+ {},
+ json.dumps(
+ dict(
+ ChangedBlocks=blocks,
+ VolumeSize=snapshot.volume_size,
+ BlockSize=snapshot.block_size,
+ )
+ ),
+ )
+
+ def list_snapshot_blocks(self):
+ """
+ The following parameters are not yet implemented: NextToken, MaxResults, StartingBlockIndex
+ """
+ snapshot_id = self.path.split("/")[-2]
+ snapshot = self.ebs_backend.list_snapshot_blocks(
+ snapshot_id=snapshot_id,
+ )
+ blocks = [
+ {"BlockIndex": idx, "BlockToken": b.block_token}
+ for idx, b in snapshot.blocks.items()
+ ]
+ return (
+ 200,
+ {},
+ json.dumps(
+ dict(
+ Blocks=blocks,
+ VolumeSize=snapshot.volume_size,
+ BlockSize=snapshot.block_size,
+ )
+ ),
+ )
diff --git a/contrib/python/moto/py3/moto/ebs/urls.py b/contrib/python/moto/py3/moto/ebs/urls.py
new file mode 100644
index 0000000000..d2b59e511a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ebs/urls.py
@@ -0,0 +1,16 @@
+"""ebs base URL and path."""
+from .responses import EBSResponse
+
+url_bases = [r"https?://ebs\.(.+)\.amazonaws\.com"]
+
+
+response = EBSResponse()
+
+
+url_paths = {
+ "{0}/snapshots$": response.snapshots,
+ "{0}/snapshots/completion/(?P<snapshot_id>[^/]+)$": response.complete_snapshot,
+ "{0}/snapshots/(?P<snapshot_id>[^/]+)/changedblocks$": response.snapshot_changed_blocks,
+ "{0}/snapshots/(?P<snapshot_id>[^/]+)/blocks$": response.snapshot_blocks,
+ "{0}/snapshots/(?P<snapshot_id>[^/]+)/blocks/(?P<block_idx>[^/]+)$": response.snapshot_block,
+}
diff --git a/contrib/python/moto/py3/moto/ec2/__init__.py b/contrib/python/moto/py3/moto/ec2/__init__.py
new file mode 100644
index 0000000000..1025a0d609
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/__init__.py
@@ -0,0 +1,5 @@
+from .models import ec2_backends
+from ..core.models import base_decorator
+
+ec2_backend = ec2_backends["us-east-1"]
+mock_ec2 = base_decorator(ec2_backends)
diff --git a/contrib/python/moto/py3/moto/ec2/exceptions.py b/contrib/python/moto/py3/moto/ec2/exceptions.py
new file mode 100644
index 0000000000..62f866c0fb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/exceptions.py
@@ -0,0 +1,773 @@
+from moto.core.exceptions import RESTError
+
+
+# EC2 has a custom root-tag - <Response> vs <ErrorResponse>
+# `terraform destroy` will complain if the roottag is incorrect
+# See https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html#api-error-response
+EC2_ERROR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<Response>
+ <Errors>
+ <Error>
+ <Code>{{error_type}}</Code>
+ <Message>{{message}}</Message>
+ </Error>
+ </Errors>
+ <{{request_id_tag}}>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</{{request_id_tag}}>
+</Response>
+"""
+
+
+class EC2ClientError(RESTError):
+ code = 400
+ # EC2 uses <RequestID> as tag name in the XML response
+ request_id_tag_name = "RequestID"
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "custom_response")
+ self.templates["custom_response"] = EC2_ERROR_RESPONSE
+ super().__init__(*args, **kwargs)
+
+
+class DependencyViolationError(EC2ClientError):
+ def __init__(self, message):
+ super().__init__("DependencyViolation", message)
+
+
+class MissingParameterError(EC2ClientError):
+ def __init__(self, parameter):
+ super().__init__(
+ "MissingParameter",
+ "The request must contain the parameter {0}".format(parameter),
+ )
+
+
+class InvalidDHCPOptionsIdError(EC2ClientError):
+ def __init__(self, dhcp_options_id):
+ super().__init__(
+ "InvalidDhcpOptionID.NotFound",
+ "DhcpOptionID {0} does not exist.".format(dhcp_options_id),
+ )
+
+
+class InvalidRequest(EC2ClientError):
+ def __init__(self):
+ super().__init__("InvalidRequest", "The request received was invalid")
+
+
+class InvalidParameterCombination(EC2ClientError):
+ def __init__(self, msg):
+ super().__init__("InvalidParameterCombination", msg)
+
+
+class MalformedDHCPOptionsIdError(EC2ClientError):
+ def __init__(self, dhcp_options_id):
+ super().__init__(
+ "InvalidDhcpOptionsId.Malformed",
+ 'Invalid id: "{0}" (expecting "dopt-...")'.format(dhcp_options_id),
+ )
+
+
+class InvalidKeyPairNameError(EC2ClientError):
+ def __init__(self, key):
+ super().__init__(
+ "InvalidKeyPair.NotFound", "The keypair '{0}' does not exist.".format(key)
+ )
+
+
+class InvalidKeyPairDuplicateError(EC2ClientError):
+ def __init__(self, key):
+ super().__init__(
+ "InvalidKeyPair.Duplicate", "The keypair '{0}' already exists.".format(key)
+ )
+
+
+class InvalidKeyPairFormatError(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidKeyPair.Format", "Key is not in valid OpenSSH public key format"
+ )
+
+
+class InvalidVPCIdError(EC2ClientError):
+ def __init__(self, vpc_id):
+
+ super().__init__(
+ "InvalidVpcID.NotFound", "VpcID {0} does not exist.".format(vpc_id)
+ )
+
+
+class InvalidSubnetIdError(EC2ClientError):
+ def __init__(self, subnet_id):
+ super().__init__(
+ "InvalidSubnetID.NotFound",
+ "The subnet ID '{}' does not exist".format(subnet_id),
+ )
+
+
+class InvalidFlowLogIdError(EC2ClientError):
+ def __init__(self, count, flow_log_ids):
+ super().__init__(
+ "InvalidFlowLogId.NotFound",
+ "These flow log ids in the input list are not found: [TotalCount: {0}] {1}".format(
+ count, flow_log_ids
+ ),
+ )
+
+
+class FlowLogAlreadyExists(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "FlowLogAlreadyExists",
+ "Error. There is an existing Flow Log with the same configuration and log destination.",
+ )
+
+
+class InvalidNetworkAclIdError(EC2ClientError):
+ def __init__(self, network_acl_id):
+ super().__init__(
+ "InvalidNetworkAclID.NotFound",
+ "The network acl ID '{0}' does not exist".format(network_acl_id),
+ )
+
+
+class InvalidVpnGatewayIdError(EC2ClientError):
+ def __init__(self, vpn_gw):
+ super().__init__(
+ "InvalidVpnGatewayID.NotFound",
+ "The virtual private gateway ID '{0}' does not exist".format(vpn_gw),
+ )
+
+
+class InvalidVpnGatewayAttachmentError(EC2ClientError):
+ def __init__(self, vpn_gw, vpc_id):
+ super().__init__(
+ "InvalidVpnGatewayAttachment.NotFound",
+ "The attachment with vpn gateway ID '{}' and vpc ID '{}' does not exist".format(
+ vpn_gw, vpc_id
+ ),
+ )
+
+
+class InvalidVpnConnectionIdError(EC2ClientError):
+ def __init__(self, network_acl_id):
+ super().__init__(
+ "InvalidVpnConnectionID.NotFound",
+ "The vpnConnection ID '{0}' does not exist".format(network_acl_id),
+ )
+
+
+class InvalidCustomerGatewayIdError(EC2ClientError):
+ def __init__(self, customer_gateway_id):
+ super().__init__(
+ "InvalidCustomerGatewayID.NotFound",
+ "The customer gateway ID '{0}' does not exist".format(customer_gateway_id),
+ )
+
+
+class InvalidNetworkInterfaceIdError(EC2ClientError):
+ def __init__(self, eni_id):
+ super().__init__(
+ "InvalidNetworkInterfaceID.NotFound",
+ "The network interface ID '{0}' does not exist".format(eni_id),
+ )
+
+
+class InvalidNetworkAttachmentIdError(EC2ClientError):
+ def __init__(self, attachment_id):
+ super().__init__(
+ "InvalidAttachmentID.NotFound",
+ "The network interface attachment ID '{0}' does not exist".format(
+ attachment_id
+ ),
+ )
+
+
+class InvalidSecurityGroupDuplicateError(EC2ClientError):
+ def __init__(self, name):
+ super().__init__(
+ "InvalidGroup.Duplicate",
+ "The security group '{0}' already exists".format(name),
+ )
+
+
+class InvalidSecurityGroupNotFoundError(EC2ClientError):
+ def __init__(self, name):
+ super().__init__(
+ "InvalidGroup.NotFound",
+ "The security group '{0}' does not exist".format(name),
+ )
+
+
+class InvalidPermissionNotFoundError(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidPermission.NotFound",
+ "The specified rule does not exist in this security group",
+ )
+
+
+class InvalidPermissionDuplicateError(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidPermission.Duplicate", "The specified rule already exists"
+ )
+
+
+class InvalidRouteTableIdError(EC2ClientError):
+ def __init__(self, route_table_id):
+ super().__init__(
+ "InvalidRouteTableID.NotFound",
+ "The routeTable ID '{0}' does not exist".format(route_table_id),
+ )
+
+
+class InvalidRouteError(EC2ClientError):
+ def __init__(self, route_table_id, cidr):
+ super().__init__(
+ "InvalidRoute.NotFound",
+ "no route with destination-cidr-block {0} in route table {1}".format(
+ cidr, route_table_id
+ ),
+ )
+
+
+class InvalidInstanceIdError(EC2ClientError):
+ def __init__(self, instance_id):
+ if isinstance(instance_id, str):
+ instance_id = [instance_id]
+ if len(instance_id) > 1:
+ msg = f"The instance IDs '{', '.join(instance_id)}' do not exist"
+ else:
+ msg = f"The instance ID '{instance_id[0]}' does not exist"
+ super().__init__("InvalidInstanceID.NotFound", msg)
+
+
+class InvalidInstanceTypeError(EC2ClientError):
+ def __init__(self, instance_type):
+ super().__init__(
+ "InvalidInstanceType.NotFound",
+ "The instance type '{0}' does not exist".format(instance_type),
+ )
+
+
+class InvalidAMIIdError(EC2ClientError):
+ def __init__(self, ami_id):
+ super().__init__(
+ "InvalidAMIID.NotFound",
+ "The image id '[{0}]' does not exist".format(ami_id),
+ )
+
+
+class UnvailableAMIIdError(EC2ClientError):
+ def __init__(self, ami_id):
+ super().__init__(
+ "InvalidAMIID.Unavailable",
+ "The image id '[{0}]' is no longer available".format(ami_id),
+ )
+
+
+class InvalidAMIAttributeItemValueError(EC2ClientError):
+ def __init__(self, attribute, value):
+ super().__init__(
+ "InvalidAMIAttributeItemValue",
+ 'Invalid attribute item value "{0}" for {1} item type.'.format(
+ value, attribute
+ ),
+ )
+
+
+class MalformedAMIIdError(EC2ClientError):
+ def __init__(self, ami_id):
+ super().__init__(
+ "InvalidAMIID.Malformed",
+ 'Invalid id: "{0}" (expecting "ami-...")'.format(ami_id),
+ )
+
+
+class InvalidSnapshotIdError(EC2ClientError):
+ def __init__(self):
+ # Note: AWS returns empty message for this, as of 2014.08.22.
+ super().__init__("InvalidSnapshot.NotFound", "")
+
+
+class InvalidSnapshotInUse(EC2ClientError):
+ def __init__(self, snapshot_id, ami_id):
+ super().__init__(
+ "InvalidSnapshot.InUse",
+ f"The snapshot {snapshot_id} is currently in use by {ami_id}",
+ )
+
+
+class InvalidVolumeIdError(EC2ClientError):
+ def __init__(self, volume_id):
+ super().__init__(
+ "InvalidVolume.NotFound",
+ "The volume '{0}' does not exist.".format(volume_id),
+ )
+
+
+class InvalidVolumeAttachmentError(EC2ClientError):
+ def __init__(self, volume_id, instance_id):
+ super().__init__(
+ "InvalidAttachment.NotFound",
+ "Volume {0} can not be detached from {1} because it is not attached".format(
+ volume_id, instance_id
+ ),
+ )
+
+
+class InvalidVolumeDetachmentError(EC2ClientError):
+ def __init__(self, volume_id, instance_id, device):
+ super().__init__(
+ "InvalidAttachment.NotFound",
+ "The volume {0} is not attached to instance {1} as device {2}".format(
+ volume_id, instance_id, device
+ ),
+ )
+
+
+class VolumeInUseError(EC2ClientError):
+ def __init__(self, volume_id, instance_id):
+ super().__init__(
+ "VolumeInUse",
+ "Volume {0} is currently attached to {1}".format(volume_id, instance_id),
+ )
+
+
+class InvalidDomainError(EC2ClientError):
+ def __init__(self, domain):
+ super().__init__(
+ "InvalidParameterValue", "Invalid value '{0}' for domain.".format(domain)
+ )
+
+
+class InvalidAddressError(EC2ClientError):
+ def __init__(self, ip):
+ super().__init__(
+ "InvalidAddress.NotFound", "Address '{0}' not found.".format(ip)
+ )
+
+
+class LogDestinationNotFoundError(EC2ClientError):
+ def __init__(self, bucket_name):
+ super().__init__(
+ "LogDestinationNotFoundException",
+ "LogDestination: '{0}' does not exist.".format(bucket_name),
+ )
+
+
+class InvalidAllocationIdError(EC2ClientError):
+ def __init__(self, allocation_id):
+ super().__init__(
+ "InvalidAllocationID.NotFound",
+ "Allocation ID '{0}' not found.".format(allocation_id),
+ )
+
+
+class InvalidAssociationIdError(EC2ClientError):
+ def __init__(self, association_id):
+ super().__init__(
+ "InvalidAssociationID.NotFound",
+ "Association ID '{0}' not found.".format(association_id),
+ )
+
+
+class InvalidVpcCidrBlockAssociationIdError(EC2ClientError):
+ def __init__(self, association_id):
+ super().__init__(
+ "InvalidVpcCidrBlockAssociationIdError.NotFound",
+ "The vpc CIDR block association ID '{0}' does not exist".format(
+ association_id
+ ),
+ )
+
+
+class InvalidVPCPeeringConnectionIdError(EC2ClientError):
+ def __init__(self, vpc_peering_connection_id):
+ super().__init__(
+ "InvalidVpcPeeringConnectionId.NotFound",
+ "VpcPeeringConnectionID {0} does not exist.".format(
+ vpc_peering_connection_id
+ ),
+ )
+
+
+class InvalidVPCPeeringConnectionStateTransitionError(EC2ClientError):
+ def __init__(self, vpc_peering_connection_id):
+ super().__init__(
+ "InvalidStateTransition",
+ "VpcPeeringConnectionID {0} is not in the correct state for the request.".format(
+ vpc_peering_connection_id
+ ),
+ )
+
+
+class InvalidServiceName(EC2ClientError):
+ def __init__(self, service_name):
+ super().__init__(
+ "InvalidServiceName",
+ f"The Vpc Endpoint Service '{service_name}' does not exist",
+ )
+
+
+class InvalidFilter(EC2ClientError):
+ def __init__(self, filter_name):
+ super().__init__("InvalidFilter", f"The filter '{filter_name}' is invalid")
+
+
+class InvalidNextToken(EC2ClientError):
+ def __init__(self, next_token):
+ super().__init__("InvalidNextToken", f"The token '{next_token}' is invalid")
+
+
+class InvalidDependantParameterError(EC2ClientError):
+ def __init__(self, dependant_parameter, parameter, parameter_value):
+ super().__init__(
+ "InvalidParameter",
+ "{0} can't be empty if {1} is {2}.".format(
+ dependant_parameter, parameter, parameter_value
+ ),
+ )
+
+
+class InvalidDependantParameterTypeError(EC2ClientError):
+ def __init__(self, dependant_parameter, parameter_value, parameter):
+ super().__init__(
+ "InvalidParameter",
+ "{0} type must be {1} if {2} is provided.".format(
+ dependant_parameter, parameter_value, parameter
+ ),
+ )
+
+
+class InvalidAggregationIntervalParameterError(EC2ClientError):
+ def __init__(self, parameter):
+ super().__init__("InvalidParameter", "Invalid {0}".format(parameter))
+
+
+class InvalidParameterValueError(EC2ClientError):
+ def __init__(self, parameter_value):
+ super().__init__(
+ "InvalidParameterValue",
+ "Value {0} is invalid for parameter.".format(parameter_value),
+ )
+
+
+class InvalidParameterValueErrorTagNull(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidParameterValue",
+ "Tag value cannot be null. Use empty string instead.",
+ )
+
+
+class InvalidParameterValueErrorUnknownAttribute(EC2ClientError):
+ def __init__(self, parameter_value):
+ super().__init__(
+ "InvalidParameterValue",
+ "Value ({0}) for parameter attribute is invalid. Unknown attribute.".format(
+ parameter_value
+ ),
+ )
+
+
+class InvalidGatewayIDError(EC2ClientError):
+ def __init__(self, gateway_id):
+ super().__init__(
+ "InvalidGatewayID.NotFound",
+ "The eigw ID '{0}' does not exist".format(gateway_id),
+ )
+
+
+class InvalidInternetGatewayIdError(EC2ClientError):
+ def __init__(self, internet_gateway_id):
+ super().__init__(
+ "InvalidInternetGatewayID.NotFound",
+ "InternetGatewayID {0} does not exist.".format(internet_gateway_id),
+ )
+
+
+class GatewayNotAttachedError(EC2ClientError):
+ def __init__(self, internet_gateway_id, vpc_id):
+ super().__init__(
+ "Gateway.NotAttached",
+ "InternetGatewayID {0} is not attached to a VPC {1}.".format(
+ internet_gateway_id, vpc_id
+ ),
+ )
+
+
+class ResourceAlreadyAssociatedError(EC2ClientError):
+ def __init__(self, resource_id):
+ super().__init__(
+ "Resource.AlreadyAssociated",
+ "Resource {0} is already associated.".format(resource_id),
+ )
+
+
+class TagLimitExceeded(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "TagLimitExceeded",
+ "The maximum number of Tags for a resource has been reached.",
+ )
+
+
+class InvalidID(EC2ClientError):
+ def __init__(self, resource_id):
+ super().__init__("InvalidID", "The ID '{0}' is not valid".format(resource_id))
+
+
+class InvalidCIDRSubnetError(EC2ClientError):
+ def __init__(self, cidr):
+ super().__init__(
+ "InvalidParameterValue",
+ "invalid CIDR subnet specification: {0}".format(cidr),
+ )
+
+
+class RulesPerSecurityGroupLimitExceededError(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "RulesPerSecurityGroupLimitExceeded",
+ "The maximum number of rules per security group " "has been reached.",
+ )
+
+
+class MotoNotImplementedError(NotImplementedError):
+ def __init__(self, blurb):
+ super().__init__(
+ "{0} has not been implemented in Moto yet."
+ " Feel free to open an issue at"
+ " https://github.com/spulec/moto/issues".format(blurb)
+ )
+
+
+class FilterNotImplementedError(MotoNotImplementedError):
+ def __init__(self, filter_name, method_name):
+ super().__init__("The filter '{0}' for {1}".format(filter_name, method_name))
+
+
+class CidrLimitExceeded(EC2ClientError):
+ def __init__(self, vpc_id, max_cidr_limit):
+ super().__init__(
+ "CidrLimitExceeded",
+ "This network '{0}' has met its maximum number of allowed CIDRs: {1}".format(
+ vpc_id, max_cidr_limit
+ ),
+ )
+
+
+class UnsupportedTenancy(EC2ClientError):
+ def __init__(self, tenancy):
+ super().__init__(
+ "UnsupportedTenancy",
+ "The tenancy value {0} is not supported.".format(tenancy),
+ )
+
+
+class OperationNotPermitted(EC2ClientError):
+ def __init__(self, association_id):
+ super().__init__(
+ "OperationNotPermitted",
+ "The vpc CIDR block with association ID {} may not be disassociated. "
+ "It is the primary IPv4 CIDR block of the VPC".format(association_id),
+ )
+
+
+class InvalidAvailabilityZoneError(EC2ClientError):
+ def __init__(self, availability_zone_value, valid_availability_zones):
+ super().__init__(
+ "InvalidParameterValue",
+ "Value ({0}) for parameter availabilityZone is invalid. "
+ "Subnets can currently only be created in the following availability zones: {1}.".format(
+ availability_zone_value, valid_availability_zones
+ ),
+ )
+
+
+class AvailabilityZoneNotFromRegionError(EC2ClientError):
+ def __init__(self, availability_zone_value):
+ super().__init__(
+ "InvalidParameterValue",
+ "Invalid Availability Zone ({0})".format(availability_zone_value),
+ )
+
+
+class NetworkAclEntryAlreadyExistsError(EC2ClientError):
+ def __init__(self, rule_number):
+ super().__init__(
+ "NetworkAclEntryAlreadyExists",
+ "The network acl entry identified by {} already exists.".format(
+ rule_number
+ ),
+ )
+
+
+class InvalidSubnetRangeError(EC2ClientError):
+ def __init__(self, cidr_block):
+ super().__init__(
+ "InvalidSubnet.Range", "The CIDR '{}' is invalid.".format(cidr_block)
+ )
+
+
+class InvalidCIDRBlockParameterError(EC2ClientError):
+ def __init__(self, cidr_block):
+ super().__init__(
+ "InvalidParameterValue",
+ "Value ({}) for parameter cidrBlock is invalid. This is not a valid CIDR block.".format(
+ cidr_block
+ ),
+ )
+
+
+class InvalidDestinationCIDRBlockParameterError(EC2ClientError):
+ def __init__(self, cidr_block):
+ super().__init__(
+ "InvalidParameterValue",
+ "Value ({}) for parameter destinationCidrBlock is invalid. This is not a valid CIDR block.".format(
+ cidr_block
+ ),
+ )
+
+
+class InvalidSubnetConflictError(EC2ClientError):
+ def __init__(self, cidr_block):
+ super().__init__(
+ "InvalidSubnet.Conflict",
+ "The CIDR '{}' conflicts with another subnet".format(cidr_block),
+ )
+
+
+class InvalidVPCRangeError(EC2ClientError):
+ def __init__(self, cidr_block):
+ super().__init__(
+ "InvalidVpc.Range", "The CIDR '{}' is invalid.".format(cidr_block)
+ )
+
+
+# accept exception
+class OperationNotPermitted2(EC2ClientError):
+ def __init__(self, client_region, pcx_id, acceptor_region):
+ super().__init__(
+ "OperationNotPermitted",
+ "Incorrect region ({0}) specified for this request."
+ "VPC peering connection {1} must be accepted in region {2}".format(
+ client_region, pcx_id, acceptor_region
+ ),
+ )
+
+
+# reject exception
+class OperationNotPermitted3(EC2ClientError):
+ def __init__(self, client_region, pcx_id, acceptor_region):
+ super().__init__(
+ "OperationNotPermitted",
+ "Incorrect region ({0}) specified for this request."
+ "VPC peering connection {1} must be accepted or rejected in region {2}".format(
+ client_region, pcx_id, acceptor_region
+ ),
+ )
+
+
+class OperationNotPermitted4(EC2ClientError):
+ def __init__(self, instance_id):
+ super().__init__(
+ "OperationNotPermitted",
+ "The instance '{0}' may not be terminated. Modify its 'disableApiTermination' "
+ "instance attribute and try again.".format(instance_id),
+ )
+
+
+class InvalidLaunchTemplateNameError(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidLaunchTemplateName.AlreadyExistsException",
+ "Launch template name already in use.",
+ )
+
+
+class InvalidParameterDependency(EC2ClientError):
+ def __init__(self, param, param_needed):
+ super().__init__(
+ "InvalidParameterDependency",
+ "The parameter [{0}] requires the parameter {1} to be set.".format(
+ param, param_needed
+ ),
+ )
+
+
+class IncorrectStateIamProfileAssociationError(EC2ClientError):
+ def __init__(self, instance_id):
+ super().__init__(
+ "IncorrectState",
+ "There is an existing association for instance {0}".format(instance_id),
+ )
+
+
+class InvalidAssociationIDIamProfileAssociationError(EC2ClientError):
+ def __init__(self, association_id):
+ super().__init__(
+ "InvalidAssociationID.NotFound",
+ "An invalid association-id of '{0}' was given".format(association_id),
+ )
+
+
+class InvalidVpcEndPointIdError(EC2ClientError):
+ def __init__(self, vpc_end_point_id):
+ super().__init__(
+ "InvalidVpcEndpointId.NotFound",
+ "The VpcEndPoint ID '{0}' does not exist".format(vpc_end_point_id),
+ )
+
+
+class InvalidTaggableResourceType(EC2ClientError):
+ def __init__(self, resource_type):
+ super().__init__(
+ "InvalidParameterValue",
+ "'{}' is not a valid taggable resource type for this operation.".format(
+ resource_type
+ ),
+ )
+
+
+class GenericInvalidParameterValueError(EC2ClientError):
+ def __init__(self, attribute, value):
+ super().__init__(
+ "InvalidParameterValue",
+ "invalid value for parameter {0}: {1}".format(attribute, value),
+ )
+
+
+class InvalidSubnetCidrBlockAssociationID(EC2ClientError):
+ def __init__(self, association_id):
+ super().__init__(
+ "InvalidSubnetCidrBlockAssociationID.NotFound",
+ "The subnet CIDR block with association ID '{0}' does not exist".format(
+ association_id
+ ),
+ )
+
+
+class InvalidCarrierGatewayID(EC2ClientError):
+ def __init__(self, carrier_gateway_id):
+ super().__init__(
+ "InvalidCarrierGatewayID.NotFound",
+ "The CarrierGateway ID '{0}' does not exist".format(carrier_gateway_id),
+ )
+
+
+class NoLoadBalancersProvided(EC2ClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidParameter",
+ "exactly one of network_load_balancer_arn or gateway_load_balancer_arn is a required member",
+ )
+
+
+class UnknownVpcEndpointService(EC2ClientError):
+ def __init__(self, service_id):
+ super().__init__(
+ "InvalidVpcEndpointServiceId.NotFound",
+ f"The VpcEndpointService Id '{service_id}' does not exist",
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/models/__init__.py b/contrib/python/moto/py3/moto/ec2/models/__init__.py
new file mode 100644
index 0000000000..cbbc5af660
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/__init__.py
@@ -0,0 +1,247 @@
+from moto.core import get_account_id
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+from ..exceptions import (
+ EC2ClientError,
+ InvalidID,
+ MissingParameterError,
+ MotoNotImplementedError,
+)
+from .amis import AmiBackend
+from .carrier_gateways import CarrierGatewayBackend
+from .customer_gateways import CustomerGatewayBackend
+from .dhcp_options import DHCPOptionsSetBackend
+from .elastic_block_store import EBSBackend
+from .elastic_ip_addresses import ElasticAddressBackend
+from .elastic_network_interfaces import NetworkInterfaceBackend
+from .flow_logs import FlowLogsBackend
+from .key_pairs import KeyPairBackend
+from .launch_templates import LaunchTemplateBackend
+from .managed_prefixes import ManagedPrefixListBackend
+from .iam_instance_profile import IamInstanceProfileAssociationBackend
+from .internet_gateways import (
+ InternetGatewayBackend,
+ EgressOnlyInternetGatewayBackend,
+)
+from .instances import InstanceBackend
+from .instance_types import InstanceTypeBackend, InstanceTypeOfferingBackend
+from .nat_gateways import NatGatewayBackend
+from .network_acls import NetworkAclBackend
+from .availability_zones_and_regions import RegionsAndZonesBackend
+from .route_tables import RouteBackend, RouteTableBackend
+from .security_groups import SecurityGroupBackend
+from .spot_requests import (
+ SpotRequestBackend,
+ SpotPriceBackend,
+ SpotFleetBackend,
+)
+from .subnets import SubnetBackend, SubnetRouteTableAssociationBackend
+from .tags import TagBackend
+from .transit_gateway import TransitGatewayBackend
+from .transit_gateway_route_tables import (
+ TransitGatewayRelationsBackend,
+ TransitGatewayRouteTableBackend,
+)
+from .transit_gateway_attachments import TransitGatewayAttachmentBackend
+from .vpn_gateway import VpnGatewayBackend
+from .vpn_connections import VPNConnectionBackend
+from .vpcs import VPCBackend
+from .vpc_peering_connections import VPCPeeringConnectionBackend
+from .vpc_service_configuration import VPCServiceConfigurationBackend
+from ..utils import (
+ EC2_RESOURCE_TO_PREFIX,
+ is_valid_resource_id,
+ get_prefix,
+)
+
+OWNER_ID = get_account_id()
+
+
+def validate_resource_ids(resource_ids):
+ if not resource_ids:
+ raise MissingParameterError(parameter="resourceIdSet")
+ for resource_id in resource_ids:
+ if not is_valid_resource_id(resource_id):
+ raise InvalidID(resource_id=resource_id)
+ return True
+
+
+class SettingsBackend:
+ def __init__(self):
+ self.ebs_encryption_by_default = False
+
+ def disable_ebs_encryption_by_default(self):
+ ec2_backend = ec2_backends[self.region_name]
+ ec2_backend.ebs_encryption_by_default = False
+
+ def enable_ebs_encryption_by_default(self):
+ ec2_backend = ec2_backends[self.region_name]
+ ec2_backend.ebs_encryption_by_default = True
+
+ def get_ebs_encryption_by_default(self):
+ ec2_backend = ec2_backends[self.region_name]
+ return ec2_backend.ebs_encryption_by_default
+
+
+class EC2Backend(
+ BaseBackend,
+ InstanceBackend,
+ InstanceTypeBackend,
+ InstanceTypeOfferingBackend,
+ TagBackend,
+ EBSBackend,
+ RegionsAndZonesBackend,
+ AmiBackend,
+ SecurityGroupBackend,
+ VPCBackend,
+ ManagedPrefixListBackend,
+ SubnetBackend,
+ SubnetRouteTableAssociationBackend,
+ FlowLogsBackend,
+ NetworkInterfaceBackend,
+ VPNConnectionBackend,
+ VPCServiceConfigurationBackend,
+ VPCPeeringConnectionBackend,
+ RouteTableBackend,
+ RouteBackend,
+ InternetGatewayBackend,
+ EgressOnlyInternetGatewayBackend,
+ SpotFleetBackend,
+ SpotRequestBackend,
+ SpotPriceBackend,
+ ElasticAddressBackend,
+ KeyPairBackend,
+ SettingsBackend,
+ DHCPOptionsSetBackend,
+ NetworkAclBackend,
+ VpnGatewayBackend,
+ CustomerGatewayBackend,
+ NatGatewayBackend,
+ TransitGatewayBackend,
+ TransitGatewayRouteTableBackend,
+ TransitGatewayAttachmentBackend,
+ TransitGatewayRelationsBackend,
+ LaunchTemplateBackend,
+ IamInstanceProfileAssociationBackend,
+ CarrierGatewayBackend,
+):
+ """
+ Implementation of the AWS EC2 endpoint.
+
+ moto includes a limited set of AMIs in `moto/ec2/resources/amis.json`. If you require specific
+ AMIs to be available during your tests, you can provide your own AMI definitions by setting the
+ environment variable `MOTO_AMIS_PATH` to point to a JSON file containing definitions of the
+ required AMIs.
+
+ To create such a file, refer to `scripts/get_amis.py`
+
+ .. note:: You must set `MOTO_AMIS_PATH` before importing moto.
+
+ """
+
+ def __init__(self, region_name, account_id):
+ BaseBackend.__init__(self, region_name, account_id)
+ for backend in EC2Backend.__mro__:
+ if backend not in [EC2Backend, BaseBackend, object]:
+ backend.__init__(self)
+
+ # Default VPC exists by default, which is the current behavior
+ # of EC2-VPC. See for detail:
+ #
+ # docs.aws.amazon.com/AmazonVPC/latest/UserGuide/default-vpc.html
+ #
+ if not self.vpcs:
+ vpc = self.create_vpc("172.31.0.0/16")
+ else:
+ # For now this is included for potential
+ # backward-compatibility issues
+ vpc = self.vpcs.values()[0]
+
+ self.default_vpc = vpc
+
+ # Create default subnet for each availability zone
+ ip, _ = vpc.cidr_block.split("/")
+ ip = ip.split(".")
+ ip[2] = 0
+
+ for zone in self.describe_availability_zones():
+ az_name = zone.name
+ cidr_block = ".".join(str(i) for i in ip) + "/20"
+ self.create_subnet(vpc.id, cidr_block, availability_zone=az_name)
+ ip[2] += 16
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ec2"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ec2messages"
+ )
+
+ # Use this to generate a proper error template response when in a response
+ # handler.
+ def raise_error(self, code, message):
+ raise EC2ClientError(code, message)
+
+ def raise_not_implemented_error(self, blurb):
+ raise MotoNotImplementedError(blurb)
+
+ def do_resources_exist(self, resource_ids):
+ for resource_id in resource_ids:
+ resource_prefix = get_prefix(resource_id)
+ if resource_prefix == EC2_RESOURCE_TO_PREFIX["customer-gateway"]:
+ self.get_customer_gateway(customer_gateway_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["dhcp-options"]:
+ self.describe_dhcp_options(dhcp_options_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["image"]:
+ self.describe_images(ami_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["instance"]:
+ self.get_instance_by_id(instance_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["internet-gateway"]:
+ self.describe_internet_gateways(internet_gateway_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["launch-template"]:
+ self.get_launch_template(resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["network-acl"]:
+ self.get_all_network_acls()
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["network-interface"]:
+ self.describe_network_interfaces(
+ filters={"network-interface-id": resource_id}
+ )
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["reserved-instance"]:
+ self.raise_not_implemented_error("DescribeReservedInstances")
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["route-table"]:
+ self.get_route_table(route_table_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["security-group"]:
+ self.describe_security_groups(group_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["snapshot"]:
+ self.get_snapshot(snapshot_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["spot-instance-request"]:
+ self.describe_spot_instance_requests(
+ filters={"spot-instance-request-id": resource_id}
+ )
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["subnet"]:
+ self.get_subnet(subnet_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["volume"]:
+ self.get_volume(volume_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["vpc"]:
+ self.get_vpc(vpc_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["vpc-endpoint-service"]:
+ self.get_vpc_endpoint_service(resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["vpc-peering-connection"]:
+ self.get_vpc_peering_connection(vpc_pcx_id=resource_id)
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["vpn-connection"]:
+ self.describe_vpn_connections(vpn_connection_ids=[resource_id])
+ elif resource_prefix == EC2_RESOURCE_TO_PREFIX["vpn-gateway"]:
+ self.get_vpn_gateway(vpn_gateway_id=resource_id)
+ elif (
+ resource_prefix
+ == EC2_RESOURCE_TO_PREFIX["iam-instance-profile-association"]
+ ):
+ self.describe_iam_instance_profile_associations(
+ association_ids=[resource_id]
+ )
+ return True
+
+
+ec2_backends = BackendDict(EC2Backend, "ec2")
diff --git a/contrib/python/moto/py3/moto/ec2/models/amis.py b/contrib/python/moto/py3/moto/ec2/models/amis.py
new file mode 100644
index 0000000000..cc726e8149
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/amis.py
@@ -0,0 +1,331 @@
+import json
+import re
+from os import environ
+from moto.core import get_account_id
+from moto.utilities.utils import load_resource
+from ..exceptions import (
+ InvalidAMIIdError,
+ InvalidAMIAttributeItemValueError,
+ MalformedAMIIdError,
+ InvalidTaggableResourceType,
+ UnvailableAMIIdError,
+)
+from .core import TaggedEC2Resource
+from ..utils import (
+ random_ami_id,
+ generic_filter,
+ utc_date_and_time,
+)
+
+
+if "MOTO_AMIS_PATH" in environ:
+ with open(environ.get("MOTO_AMIS_PATH"), "r", encoding="utf-8") as f:
+ AMIS = json.load(f)
+else:
+ AMIS = load_resource("moto.ec2", "resources/amis.json")
+
+
+class Ami(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ ami_id,
+ instance=None,
+ source_ami=None,
+ name=None,
+ description=None,
+ owner_id=get_account_id(),
+ owner_alias=None,
+ public=False,
+ virtualization_type=None,
+ architecture=None,
+ state="available",
+ creation_date=None,
+ platform=None,
+ image_type="machine",
+ image_location=None,
+ hypervisor=None,
+ root_device_type="standard",
+ root_device_name="/dev/sda1",
+ sriov="simple",
+ region_name="us-east-1a",
+ snapshot_description=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = ami_id
+ self.state = state
+ self.name = name
+ self.image_type = image_type
+ self.image_location = image_location
+ self.owner_id = owner_id
+ self.owner_alias = owner_alias
+ self.description = description
+ self.virtualization_type = virtualization_type
+ self.architecture = architecture
+ self.kernel_id = None
+ self.platform = platform
+ self.hypervisor = hypervisor
+ self.root_device_name = root_device_name
+ self.root_device_type = root_device_type
+ self.sriov = sriov
+ self.creation_date = (
+ utc_date_and_time() if creation_date is None else creation_date
+ )
+
+ if instance:
+ self.instance = instance
+ self.instance_id = instance.id
+ self.virtualization_type = instance.virtualization_type
+ self.architecture = instance.architecture
+ self.kernel_id = instance.kernel
+ self.platform = instance.platform
+
+ elif source_ami:
+ """
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/CopyingAMIs.html
+ "We don't copy launch permissions, user-defined tags, or Amazon S3 bucket permissions from the source AMI to the new AMI."
+ ~ 2014.09.29
+ """
+ self.virtualization_type = source_ami.virtualization_type
+ self.architecture = source_ami.architecture
+ self.kernel_id = source_ami.kernel_id
+ self.platform = source_ami.platform
+ if not name:
+ self.name = source_ami.name
+ if not description:
+ self.description = source_ami.description
+
+ self.launch_permission_groups = set()
+ self.launch_permission_users = set()
+
+ if public:
+ self.launch_permission_groups.add("all")
+
+ # AWS auto-creates these, we should reflect the same.
+ volume = self.ec2_backend.create_volume(size=15, zone_name=region_name)
+ snapshot_description = (
+ snapshot_description or "Auto-created snapshot for AMI %s" % self.id
+ )
+ self.ebs_snapshot = self.ec2_backend.create_snapshot(
+ volume.id, snapshot_description, owner_id, from_ami=ami_id
+ )
+ self.ec2_backend.delete_volume(volume.id)
+
+ @property
+ def is_public(self):
+ return "all" in self.launch_permission_groups
+
+ @property
+ def is_public_string(self):
+ return str(self.is_public).lower()
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "virtualization-type":
+ return self.virtualization_type
+ elif filter_name == "kernel-id":
+ return self.kernel_id
+ elif filter_name in ["architecture", "platform"]:
+ return getattr(self, filter_name)
+ elif filter_name == "image-id":
+ return self.id
+ elif filter_name == "is-public":
+ return self.is_public_string
+ elif filter_name == "state":
+ return self.state
+ elif filter_name == "name":
+ return self.name
+ elif filter_name == "owner-id":
+ return self.owner_id
+ elif filter_name == "owner-alias":
+ return self.owner_alias
+ else:
+ return super().get_filter_value(filter_name, "DescribeImages")
+
+
+class AmiBackend:
+ AMI_REGEX = re.compile("ami-[a-z0-9]+")
+
+ def __init__(self):
+ self.amis = {}
+ self.deleted_amis = list()
+ self._load_amis()
+
+ def _load_amis(self):
+ for ami in AMIS:
+ ami_id = ami["ami_id"]
+ # we are assuming the default loaded amis are owned by amazon
+ # owner_alias is required for terraform owner filters
+ ami["owner_alias"] = "amazon"
+ self.amis[ami_id] = Ami(self, **ami)
+
+ def create_image(
+ self,
+ instance_id,
+ name=None,
+ description=None,
+ tag_specifications=None,
+ ):
+ # TODO: check that instance exists and pull info from it.
+ ami_id = random_ami_id()
+ instance = self.get_instance(instance_id)
+ tags = []
+ for tag_specification in tag_specifications:
+ resource_type = tag_specification["ResourceType"]
+ if resource_type == "image":
+ tags += tag_specification["Tag"]
+ elif resource_type == "snapshot":
+ raise NotImplementedError()
+ else:
+ raise InvalidTaggableResourceType(resource_type)
+
+ ami = Ami(
+ self,
+ ami_id,
+ instance=instance,
+ source_ami=None,
+ name=name,
+ description=description,
+ owner_id=get_account_id(),
+ snapshot_description=f"Created by CreateImage({instance_id}) for {ami_id}",
+ )
+ for tag in tags:
+ ami.add_tag(tag["Key"], tag["Value"])
+ self.amis[ami_id] = ami
+ return ami
+
+ def copy_image(self, source_image_id, source_region, name=None, description=None):
+ from ..models import ec2_backends
+
+ source_ami = ec2_backends[source_region].describe_images(
+ ami_ids=[source_image_id]
+ )[0]
+ ami_id = random_ami_id()
+ ami = Ami(
+ self,
+ ami_id,
+ instance=None,
+ source_ami=source_ami,
+ name=name,
+ description=description,
+ )
+ self.amis[ami_id] = ami
+ return ami
+
+ def describe_images(self, ami_ids=(), filters=None, exec_users=None, owners=None):
+ images = self.amis.copy().values()
+
+ if len(ami_ids):
+ # boto3 seems to default to just searching based on ami ids if that parameter is passed
+ # and if no images are found, it raises an errors
+ # Note that we can search for images that have been previously deleted, without raising any errors
+ malformed_ami_ids = [
+ ami_id for ami_id in ami_ids if not ami_id.startswith("ami-")
+ ]
+ if malformed_ami_ids:
+ raise MalformedAMIIdError(malformed_ami_ids)
+
+ images = [ami for ami in images if ami.id in ami_ids]
+ deleted_images = [
+ ami_id for ami_id in ami_ids if ami_id in self.deleted_amis
+ ]
+ if len(images) + len(deleted_images) == 0:
+ raise InvalidAMIIdError(ami_ids)
+ else:
+ # Limit images by launch permissions
+ if exec_users:
+ tmp_images = []
+ for ami in images:
+ for user_id in exec_users:
+ if user_id in ami.launch_permission_users:
+ tmp_images.append(ami)
+ images = tmp_images
+
+ # Limit by owner ids
+ if owners:
+ # support filtering by Owners=['self']
+ if "self" in owners:
+ owners = list(
+ map(lambda o: get_account_id() if o == "self" else o, owners)
+ )
+ images = [
+ ami
+ for ami in images
+ if ami.owner_id in owners or ami.owner_alias in owners
+ ]
+
+ # Generic filters
+ if filters:
+ return generic_filter(filters, images)
+
+ return images
+
+ def deregister_image(self, ami_id):
+ if ami_id in self.amis:
+ self.amis.pop(ami_id)
+ self.deleted_amis.append(ami_id)
+ return True
+ elif ami_id in self.deleted_amis:
+ raise UnvailableAMIIdError(ami_id)
+ raise InvalidAMIIdError(ami_id)
+
+ def get_launch_permission_groups(self, ami_id):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ return ami.launch_permission_groups
+
+ def get_launch_permission_users(self, ami_id):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ return ami.launch_permission_users
+
+ def validate_permission_targets(self, user_ids=None, group=None):
+ # If anything is invalid, nothing is added. (No partial success.)
+ if user_ids:
+ """
+ AWS docs:
+ "The AWS account ID is a 12-digit number, such as 123456789012, that you use to construct Amazon Resource Names (ARNs)."
+ http://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html
+ """
+ for user_id in user_ids:
+ if len(user_id) != 12 or not user_id.isdigit():
+ raise InvalidAMIAttributeItemValueError("userId", user_id)
+
+ if group and group != "all":
+ raise InvalidAMIAttributeItemValueError("UserGroup", group)
+
+ def add_launch_permission(self, ami_id, user_ids=None, group=None):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ self.validate_permission_targets(user_ids=user_ids, group=group)
+
+ if user_ids:
+ for user_id in user_ids:
+ ami.launch_permission_users.add(user_id)
+
+ if group:
+ ami.launch_permission_groups.add(group)
+
+ return True
+
+ def register_image(self, name=None, description=None):
+ ami_id = random_ami_id()
+ ami = Ami(
+ self,
+ ami_id,
+ instance=None,
+ source_ami=None,
+ name=name,
+ description=description,
+ )
+ self.amis[ami_id] = ami
+ return ami
+
+ def remove_launch_permission(self, ami_id, user_ids=None, group=None):
+ ami = self.describe_images(ami_ids=[ami_id])[0]
+ self.validate_permission_targets(user_ids=user_ids, group=group)
+
+ if user_ids:
+ for user_id in user_ids:
+ ami.launch_permission_users.discard(user_id)
+
+ if group:
+ ami.launch_permission_groups.discard(group)
+
+ return True
diff --git a/contrib/python/moto/py3/moto/ec2/models/availability_zones_and_regions.py b/contrib/python/moto/py3/moto/ec2/models/availability_zones_and_regions.py
new file mode 100644
index 0000000000..342d87c2cc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/availability_zones_and_regions.py
@@ -0,0 +1,314 @@
+from boto3 import Session
+
+
+class Region(object):
+ def __init__(self, name, endpoint, opt_in_status):
+ self.name = name
+ self.endpoint = endpoint
+ self.opt_in_status = opt_in_status
+
+
+class Zone(object):
+ def __init__(self, name, region_name, zone_id):
+ self.name = name
+ self.region_name = region_name
+ self.zone_id = zone_id
+
+
+class RegionsAndZonesBackend:
+ regions_opt_in_not_required = [
+ "af-south-1",
+ "ap-northeast-1",
+ "ap-northeast-2",
+ "ap-northeast-3",
+ "ap-south-1",
+ "ap-southeast-1",
+ "ap-southeast-2",
+ "ap-southeast-3",
+ "ca-central-1",
+ "eu-central-1",
+ "eu-north-1",
+ "eu-south-1",
+ "eu-west-1",
+ "eu-west-2",
+ "eu-west-3",
+ "sa-east-1",
+ "us-east-1",
+ "us-east-2",
+ "us-west-1",
+ "us-west-2",
+ ]
+
+ regions = []
+ for region in Session().get_available_regions("ec2"):
+ if region in regions_opt_in_not_required:
+ regions.append(
+ Region(
+ region, "ec2.{}.amazonaws.com".format(region), "opt-in-not-required"
+ )
+ )
+ else:
+ regions.append(
+ Region(region, "ec2.{}.amazonaws.com".format(region), "not-opted-in")
+ )
+ for region in Session().get_available_regions("ec2", partition_name="aws-us-gov"):
+ regions.append(
+ Region(region, "ec2.{}.amazonaws.com".format(region), "opt-in-not-required")
+ )
+ for region in Session().get_available_regions("ec2", partition_name="aws-cn"):
+ regions.append(
+ Region(
+ region, "ec2.{}.amazonaws.com.cn".format(region), "opt-in-not-required"
+ )
+ )
+
+ zones = {
+ "af-south-1": [
+ Zone(region_name="af-south-1", name="af-south-1a", zone_id="afs1-az1"),
+ Zone(region_name="af-south-1", name="af-south-1b", zone_id="afs1-az2"),
+ Zone(region_name="af-south-1", name="af-south-1c", zone_id="afs1-az3"),
+ ],
+ "ap-south-1": [
+ Zone(region_name="ap-south-1", name="ap-south-1a", zone_id="aps1-az1"),
+ Zone(region_name="ap-south-1", name="ap-south-1b", zone_id="aps1-az3"),
+ ],
+ "eu-west-3": [
+ Zone(region_name="eu-west-3", name="eu-west-3a", zone_id="euw3-az1"),
+ Zone(region_name="eu-west-3", name="eu-west-3b", zone_id="euw3-az2"),
+ Zone(region_name="eu-west-3", name="eu-west-3c", zone_id="euw3-az3"),
+ ],
+ "eu-north-1": [
+ Zone(region_name="eu-north-1", name="eu-north-1a", zone_id="eun1-az1"),
+ Zone(region_name="eu-north-1", name="eu-north-1b", zone_id="eun1-az2"),
+ Zone(region_name="eu-north-1", name="eu-north-1c", zone_id="eun1-az3"),
+ ],
+ "eu-west-2": [
+ Zone(region_name="eu-west-2", name="eu-west-2a", zone_id="euw2-az2"),
+ Zone(region_name="eu-west-2", name="eu-west-2b", zone_id="euw2-az3"),
+ Zone(region_name="eu-west-2", name="eu-west-2c", zone_id="euw2-az1"),
+ ],
+ "eu-west-1": [
+ Zone(region_name="eu-west-1", name="eu-west-1a", zone_id="euw1-az3"),
+ Zone(region_name="eu-west-1", name="eu-west-1b", zone_id="euw1-az1"),
+ Zone(region_name="eu-west-1", name="eu-west-1c", zone_id="euw1-az2"),
+ ],
+ "ap-northeast-3": [
+ Zone(
+ region_name="ap-northeast-3",
+ name="ap-northeast-3a",
+ zone_id="apne3-az1",
+ ),
+ Zone(
+ region_name="ap-northeast-3",
+ name="ap-northeast-3b",
+ zone_id="apne3-az2",
+ ),
+ Zone(
+ region_name="ap-northeast-3",
+ name="ap-northeast-3c",
+ zone_id="apne3-az3",
+ ),
+ ],
+ "ap-northeast-2": [
+ Zone(
+ region_name="ap-northeast-2",
+ name="ap-northeast-2a",
+ zone_id="apne2-az1",
+ ),
+ Zone(
+ region_name="ap-northeast-2",
+ name="ap-northeast-2b",
+ zone_id="apne2-az2",
+ ),
+ Zone(
+ region_name="ap-northeast-2",
+ name="ap-northeast-2c",
+ zone_id="apne2-az3",
+ ),
+ Zone(
+ region_name="ap-northeast-2",
+ name="ap-northeast-2d",
+ zone_id="apne2-az4",
+ ),
+ ],
+ "ap-northeast-1": [
+ Zone(
+ region_name="ap-northeast-1",
+ name="ap-northeast-1a",
+ zone_id="apne1-az4",
+ ),
+ Zone(
+ region_name="ap-northeast-1",
+ name="ap-northeast-1c",
+ zone_id="apne1-az1",
+ ),
+ Zone(
+ region_name="ap-northeast-1",
+ name="ap-northeast-1d",
+ zone_id="apne1-az2",
+ ),
+ ],
+ "ap-east-1": [
+ Zone(region_name="ap-east-1", name="ap-east-1a", zone_id="ape1-az1"),
+ Zone(region_name="ap-east-1", name="ap-east-1b", zone_id="ape1-az2"),
+ Zone(region_name="ap-east-1", name="ap-east-1c", zone_id="ape1-az3"),
+ ],
+ "sa-east-1": [
+ Zone(region_name="sa-east-1", name="sa-east-1a", zone_id="sae1-az1"),
+ Zone(region_name="sa-east-1", name="sa-east-1c", zone_id="sae1-az3"),
+ ],
+ "ca-central-1": [
+ Zone(region_name="ca-central-1", name="ca-central-1a", zone_id="cac1-az1"),
+ Zone(region_name="ca-central-1", name="ca-central-1b", zone_id="cac1-az2"),
+ ],
+ "ap-southeast-1": [
+ Zone(
+ region_name="ap-southeast-1",
+ name="ap-southeast-1a",
+ zone_id="apse1-az1",
+ ),
+ Zone(
+ region_name="ap-southeast-1",
+ name="ap-southeast-1b",
+ zone_id="apse1-az2",
+ ),
+ Zone(
+ region_name="ap-southeast-1",
+ name="ap-southeast-1c",
+ zone_id="apse1-az3",
+ ),
+ ],
+ "ap-southeast-2": [
+ Zone(
+ region_name="ap-southeast-2",
+ name="ap-southeast-2a",
+ zone_id="apse2-az1",
+ ),
+ Zone(
+ region_name="ap-southeast-2",
+ name="ap-southeast-2b",
+ zone_id="apse2-az3",
+ ),
+ Zone(
+ region_name="ap-southeast-2",
+ name="ap-southeast-2c",
+ zone_id="apse2-az2",
+ ),
+ ],
+ "ap-southeast-3": [
+ Zone(
+ region_name="ap-southeast-3",
+ name="ap-southeast-3a",
+ zone_id="apse3-az1",
+ ),
+ Zone(
+ region_name="ap-southeast-3",
+ name="ap-southeast-3b",
+ zone_id="apse3-az2",
+ ),
+ Zone(
+ region_name="ap-southeast-3",
+ name="ap-southeast-3c",
+ zone_id="apse3-az3",
+ ),
+ ],
+ "eu-central-1": [
+ Zone(region_name="eu-central-1", name="eu-central-1a", zone_id="euc1-az2"),
+ Zone(region_name="eu-central-1", name="eu-central-1b", zone_id="euc1-az3"),
+ Zone(region_name="eu-central-1", name="eu-central-1c", zone_id="euc1-az1"),
+ ],
+ "eu-south-1": [
+ Zone(region_name="eu-south-1", name="eu-south-1a", zone_id="eus1-az1"),
+ Zone(region_name="eu-south-1", name="eu-south-1b", zone_id="eus1-az2"),
+ Zone(region_name="eu-south-1", name="eu-south-1c", zone_id="eus1-az3"),
+ ],
+ "us-east-1": [
+ Zone(region_name="us-east-1", name="us-east-1a", zone_id="use1-az6"),
+ Zone(region_name="us-east-1", name="us-east-1b", zone_id="use1-az1"),
+ Zone(region_name="us-east-1", name="us-east-1c", zone_id="use1-az2"),
+ Zone(region_name="us-east-1", name="us-east-1d", zone_id="use1-az4"),
+ Zone(region_name="us-east-1", name="us-east-1e", zone_id="use1-az3"),
+ Zone(region_name="us-east-1", name="us-east-1f", zone_id="use1-az5"),
+ ],
+ "us-east-2": [
+ Zone(region_name="us-east-2", name="us-east-2a", zone_id="use2-az1"),
+ Zone(region_name="us-east-2", name="us-east-2b", zone_id="use2-az2"),
+ Zone(region_name="us-east-2", name="us-east-2c", zone_id="use2-az3"),
+ ],
+ "us-west-1": [
+ Zone(region_name="us-west-1", name="us-west-1a", zone_id="usw1-az3"),
+ Zone(region_name="us-west-1", name="us-west-1b", zone_id="usw1-az1"),
+ ],
+ "us-west-2": [
+ Zone(region_name="us-west-2", name="us-west-2a", zone_id="usw2-az2"),
+ Zone(region_name="us-west-2", name="us-west-2b", zone_id="usw2-az1"),
+ Zone(region_name="us-west-2", name="us-west-2c", zone_id="usw2-az3"),
+ ],
+ "me-south-1": [
+ Zone(region_name="me-south-1", name="me-south-1a", zone_id="mes1-az1"),
+ Zone(region_name="me-south-1", name="me-south-1b", zone_id="mes1-az2"),
+ Zone(region_name="me-south-1", name="me-south-1c", zone_id="mes1-az3"),
+ ],
+ "cn-north-1": [
+ Zone(region_name="cn-north-1", name="cn-north-1a", zone_id="cnn1-az1"),
+ Zone(region_name="cn-north-1", name="cn-north-1b", zone_id="cnn1-az2"),
+ ],
+ "cn-northwest-1": [
+ Zone(
+ region_name="cn-northwest-1",
+ name="cn-northwest-1a",
+ zone_id="cnnw1-az1",
+ ),
+ Zone(
+ region_name="cn-northwest-1",
+ name="cn-northwest-1b",
+ zone_id="cnnw1-az2",
+ ),
+ Zone(
+ region_name="cn-northwest-1",
+ name="cn-northwest-1c",
+ zone_id="cnnw1-az3",
+ ),
+ ],
+ "us-gov-west-1": [
+ Zone(
+ region_name="us-gov-west-1", name="us-gov-west-1a", zone_id="usgw1-az1"
+ ),
+ Zone(
+ region_name="us-gov-west-1", name="us-gov-west-1b", zone_id="usgw1-az2"
+ ),
+ Zone(
+ region_name="us-gov-west-1", name="us-gov-west-1c", zone_id="usgw1-az3"
+ ),
+ ],
+ "us-gov-east-1": [
+ Zone(
+ region_name="us-gov-east-1", name="us-gov-east-1a", zone_id="usge1-az1"
+ ),
+ Zone(
+ region_name="us-gov-east-1", name="us-gov-east-1b", zone_id="usge1-az2"
+ ),
+ Zone(
+ region_name="us-gov-east-1", name="us-gov-east-1c", zone_id="usge1-az3"
+ ),
+ ],
+ }
+
+ def describe_regions(self, region_names=None):
+ if not region_names:
+ return self.regions
+ ret = []
+ for name in region_names:
+ for region in self.regions:
+ if region.name == name:
+ ret.append(region)
+ return ret
+
+ def describe_availability_zones(self):
+ # We might not have any zones for the current region, if it was introduced recently
+ return self.zones.get(self.region_name, [])
+
+ def get_zone_by_name(self, name):
+ for zone in self.describe_availability_zones():
+ if zone.name == name:
+ return zone
diff --git a/contrib/python/moto/py3/moto/ec2/models/carrier_gateways.py b/contrib/python/moto/py3/moto/ec2/models/carrier_gateways.py
new file mode 100644
index 0000000000..eecb1a10c5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/carrier_gateways.py
@@ -0,0 +1,65 @@
+from moto.core import get_account_id
+from moto.utilities.utils import filter_resources
+
+from .core import TaggedEC2Resource
+from ..exceptions import InvalidCarrierGatewayID, InvalidVPCIdError
+from ..utils import random_carrier_gateway_id
+
+
+class CarrierGateway(TaggedEC2Resource):
+ def __init__(self, ec2_backend, vpc_id, tags=None):
+ self.id = random_carrier_gateway_id()
+ self.ec2_backend = ec2_backend
+ self.vpc_id = vpc_id
+ self.state = "available"
+ self.add_tags(tags or {})
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+
+class CarrierGatewayBackend:
+ def __init__(self):
+ self.carrier_gateways = {}
+
+ def create_carrier_gateway(self, vpc_id, tags=None):
+ vpc = self.get_vpc(vpc_id)
+ if not vpc:
+ raise InvalidVPCIdError(vpc_id)
+ carrier_gateway = CarrierGateway(self, vpc_id, tags)
+ self.carrier_gateways[carrier_gateway.id] = carrier_gateway
+ return carrier_gateway
+
+ def delete_carrier_gateway(self, gateway_id):
+ if not self.carrier_gateways.get(gateway_id):
+ raise InvalidCarrierGatewayID(gateway_id)
+ carrier_gateway = self.carrier_gateways.pop(gateway_id)
+ carrier_gateway.state = "deleted"
+ return carrier_gateway
+
+ def describe_carrier_gateways(self, ids=None, filters=None):
+ carrier_gateways = list(self.carrier_gateways.values())
+
+ if ids:
+ carrier_gateways = [
+ carrier_gateway
+ for carrier_gateway in carrier_gateways
+ if carrier_gateway.id in ids
+ ]
+
+ attr_pairs = (
+ ("carrier-gateway-id", "id"),
+ ("state", "state"),
+ ("vpc-id", "vpc_id"),
+ ("owner-id", "owner_id"),
+ )
+
+ result = carrier_gateways
+ if filters:
+ result = filter_resources(carrier_gateways, filters, attr_pairs)
+ return result
diff --git a/contrib/python/moto/py3/moto/ec2/models/core.py b/contrib/python/moto/py3/moto/ec2/models/core.py
new file mode 100644
index 0000000000..6712b84b3f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/core.py
@@ -0,0 +1,39 @@
+from moto.core import BaseModel
+
+from ..exceptions import FilterNotImplementedError
+
+
+class TaggedEC2Resource(BaseModel):
+ def get_tags(self):
+ tags = []
+ if self.id:
+ tags = self.ec2_backend.describe_tags(filters={"resource-id": [self.id]})
+ return tags
+
+ def add_tag(self, key, value):
+ self.ec2_backend.create_tags([self.id], {key: value})
+
+ def add_tags(self, tag_map):
+ for key, value in tag_map.items():
+ self.ec2_backend.create_tags([self.id], {key: value})
+
+ def get_filter_value(self, filter_name, method_name=None):
+ tags = self.get_tags()
+
+ if filter_name.startswith("tag:"):
+ tagname = filter_name.replace("tag:", "", 1)
+ for tag in tags:
+ if tag["key"] == tagname:
+ return tag["value"]
+
+ return None
+ elif filter_name == "tag-key":
+ return [tag["key"] for tag in tags]
+ elif filter_name == "tag-value":
+ return [tag["value"] for tag in tags]
+
+ value = getattr(self, filter_name.lower().replace("-", "_"), None)
+ if value is not None:
+ return value
+
+ raise FilterNotImplementedError(filter_name, method_name)
diff --git a/contrib/python/moto/py3/moto/ec2/models/customer_gateways.py b/contrib/python/moto/py3/moto/ec2/models/customer_gateways.py
new file mode 100644
index 0000000000..3ab4e52629
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/customer_gateways.py
@@ -0,0 +1,92 @@
+from .core import TaggedEC2Resource
+from ..exceptions import InvalidCustomerGatewayIdError
+from ..utils import random_customer_gateway_id
+
+
+class CustomerGateway(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ gateway_id,
+ gateway_type,
+ ip_address,
+ bgp_asn,
+ state="available",
+ tags=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = gateway_id
+ self.type = gateway_type
+ self.ip_address = ip_address
+ self.bgp_asn = bgp_asn
+ self.attachments = {}
+ self.state = state
+ self.add_tags(tags or {})
+ super().__init__()
+
+ def get_filter_value(self, filter_name):
+ return super().get_filter_value(filter_name, "DescribeCustomerGateways")
+
+
+class CustomerGatewayBackend:
+ def __init__(self):
+ self.customer_gateways = {}
+
+ def create_customer_gateway(
+ self, gateway_type="ipsec.1", ip_address=None, bgp_asn=None, tags=None
+ ):
+ customer_gateway_id = random_customer_gateway_id()
+ customer_gateway = CustomerGateway(
+ self, customer_gateway_id, gateway_type, ip_address, bgp_asn, tags=tags
+ )
+ self.customer_gateways[customer_gateway_id] = customer_gateway
+ return customer_gateway
+
+ def get_all_customer_gateways(self, filters=None, customer_gateway_ids=None):
+ customer_gateways = self.customer_gateways.copy().values()
+ if customer_gateway_ids:
+ customer_gateways = [
+ cg for cg in customer_gateways if cg.id in customer_gateway_ids
+ ]
+
+ if filters is not None:
+ if filters.get("customer-gateway-id") is not None:
+ customer_gateways = [
+ customer_gateway
+ for customer_gateway in customer_gateways
+ if customer_gateway.id in filters["customer-gateway-id"]
+ ]
+ if filters.get("type") is not None:
+ customer_gateways = [
+ customer_gateway
+ for customer_gateway in customer_gateways
+ if customer_gateway.type in filters["type"]
+ ]
+ if filters.get("bgp-asn") is not None:
+ customer_gateways = [
+ customer_gateway
+ for customer_gateway in customer_gateways
+ if customer_gateway.bgp_asn in filters["bgp-asn"]
+ ]
+ if filters.get("ip-address") is not None:
+ customer_gateways = [
+ customer_gateway
+ for customer_gateway in customer_gateways
+ if customer_gateway.ip_address in filters["ip-address"]
+ ]
+ return customer_gateways
+
+ def get_customer_gateway(self, customer_gateway_id):
+ customer_gateway = self.customer_gateways.get(customer_gateway_id, None)
+ if not customer_gateway:
+ raise InvalidCustomerGatewayIdError(customer_gateway_id)
+ return customer_gateway
+
+ def delete_customer_gateway(self, customer_gateway_id):
+ customer_gateway = self.get_customer_gateway(customer_gateway_id)
+ customer_gateway.state = "deleted"
+ # deleted = self.customer_gateways.pop(customer_gateway_id, None)
+ deleted = True
+ if not deleted:
+ raise InvalidCustomerGatewayIdError(customer_gateway_id)
+ return deleted
diff --git a/contrib/python/moto/py3/moto/ec2/models/dhcp_options.py b/contrib/python/moto/py3/moto/ec2/models/dhcp_options.py
new file mode 100644
index 0000000000..923e09d29e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/dhcp_options.py
@@ -0,0 +1,132 @@
+import itertools
+from ..exceptions import (
+ DependencyViolationError,
+ InvalidDHCPOptionsIdError,
+ InvalidParameterValueError,
+ MalformedDHCPOptionsIdError,
+)
+from .core import TaggedEC2Resource
+from ..utils import random_dhcp_option_id, generic_filter
+
+
+class DHCPOptionsSet(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ domain_name_servers=None,
+ domain_name=None,
+ ntp_servers=None,
+ netbios_name_servers=None,
+ netbios_node_type=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self._options = {
+ "domain-name-servers": domain_name_servers,
+ "domain-name": domain_name,
+ "ntp-servers": ntp_servers,
+ "netbios-name-servers": netbios_name_servers,
+ "netbios-node-type": netbios_node_type,
+ }
+ self.id = random_dhcp_option_id()
+ self.vpc = None
+
+ def get_filter_value(self, filter_name):
+ """
+ API Version 2015-10-01 defines the following filters for DescribeDhcpOptions:
+
+ * dhcp-options-id
+ * key
+ * value
+ * tag:key=value
+ * tag-key
+ * tag-value
+
+ Taken from: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeDhcpOptions.html
+ """
+ if filter_name == "dhcp-options-id":
+ return self.id
+ elif filter_name == "key":
+ return list(self._options.keys())
+ elif filter_name == "value":
+ values = [item for item in list(self._options.values()) if item]
+ return itertools.chain(*values)
+ else:
+ return super().get_filter_value(filter_name, "DescribeDhcpOptions")
+
+ @property
+ def options(self):
+ return self._options
+
+
+class DHCPOptionsSetBackend:
+ def __init__(self):
+ self.dhcp_options_sets = {}
+
+ def associate_dhcp_options(self, dhcp_options, vpc):
+ dhcp_options.vpc = vpc
+ vpc.dhcp_options = dhcp_options
+
+ def create_dhcp_options(
+ self,
+ domain_name_servers=None,
+ domain_name=None,
+ ntp_servers=None,
+ netbios_name_servers=None,
+ netbios_node_type=None,
+ ):
+
+ NETBIOS_NODE_TYPES = [1, 2, 4, 8]
+
+ for field_value in domain_name_servers, ntp_servers, netbios_name_servers:
+ if field_value and len(field_value) > 4:
+ raise InvalidParameterValueError(",".join(field_value))
+
+ if netbios_node_type and int(netbios_node_type[0]) not in NETBIOS_NODE_TYPES:
+ raise InvalidParameterValueError(netbios_node_type)
+
+ options = DHCPOptionsSet(
+ self,
+ domain_name_servers,
+ domain_name,
+ ntp_servers,
+ netbios_name_servers,
+ netbios_node_type,
+ )
+ self.dhcp_options_sets[options.id] = options
+ return options
+
+ def delete_dhcp_options_set(self, options_id):
+ if not (options_id and options_id.startswith("dopt-")):
+ raise MalformedDHCPOptionsIdError(options_id)
+
+ if options_id in self.dhcp_options_sets:
+ if self.dhcp_options_sets[options_id].vpc:
+ raise DependencyViolationError("Cannot delete assigned DHCP options.")
+ self.dhcp_options_sets.pop(options_id)
+ else:
+ raise InvalidDHCPOptionsIdError(options_id)
+ return True
+
+ def describe_dhcp_options(self, dhcp_options_ids=None, filters=None):
+ dhcp_options_sets = self.dhcp_options_sets.copy().values()
+
+ if dhcp_options_ids:
+ dhcp_options_sets = [
+ dhcp_options_set
+ for dhcp_options_set in dhcp_options_sets
+ if dhcp_options_set.id in dhcp_options_ids
+ ]
+ if len(dhcp_options_sets) != len(dhcp_options_ids):
+ invalid_id = list(
+ set(dhcp_options_ids).difference(
+ set(
+ [
+ dhcp_options_set.id
+ for dhcp_options_set in dhcp_options_sets
+ ]
+ )
+ )
+ )[0]
+ raise InvalidDHCPOptionsIdError(invalid_id)
+
+ return generic_filter(filters, dhcp_options_sets)
diff --git a/contrib/python/moto/py3/moto/ec2/models/elastic_block_store.py b/contrib/python/moto/py3/moto/ec2/models/elastic_block_store.py
new file mode 100644
index 0000000000..48498ef239
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/elastic_block_store.py
@@ -0,0 +1,420 @@
+from moto.core import get_account_id, CloudFormationModel
+from moto.kms import kms_backends
+from moto.packages.boto.ec2.blockdevicemapping import BlockDeviceType
+from ..exceptions import (
+ InvalidAMIAttributeItemValueError,
+ InvalidSnapshotIdError,
+ InvalidSnapshotInUse,
+ InvalidVolumeIdError,
+ VolumeInUseError,
+ InvalidVolumeAttachmentError,
+ InvalidVolumeDetachmentError,
+ InvalidParameterDependency,
+)
+from .core import TaggedEC2Resource
+from ..utils import (
+ random_snapshot_id,
+ random_volume_id,
+ generic_filter,
+ utc_date_and_time,
+)
+
+
+class VolumeAttachment(CloudFormationModel):
+ def __init__(self, volume, instance, device, status):
+ self.volume = volume
+ self.attach_time = utc_date_and_time()
+ self.instance = instance
+ self.device = device
+ self.status = status
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html
+ return "AWS::EC2::VolumeAttachment"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ instance_id = properties["InstanceId"]
+ volume_id = properties["VolumeId"]
+
+ ec2_backend = ec2_backends[region_name]
+ attachment = ec2_backend.attach_volume(
+ volume_id=volume_id,
+ instance_id=instance_id,
+ device_path=properties["Device"],
+ )
+ return attachment
+
+
+class Volume(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ volume_id,
+ size,
+ zone,
+ snapshot_id=None,
+ encrypted=False,
+ kms_key_id=None,
+ volume_type=None,
+ ):
+ self.id = volume_id
+ self.volume_type = volume_type or "gp2"
+ self.size = size
+ self.zone = zone
+ self.create_time = utc_date_and_time()
+ self.attachment = None
+ self.snapshot_id = snapshot_id
+ self.ec2_backend = ec2_backend
+ self.encrypted = encrypted
+ self.kms_key_id = kms_key_id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html
+ return "AWS::EC2::Volume"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ volume = ec2_backend.create_volume(
+ size=properties.get("Size"), zone_name=properties.get("AvailabilityZone")
+ )
+ return volume
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def status(self):
+ if self.attachment:
+ return "in-use"
+ else:
+ return "available"
+
+ def get_filter_value(self, filter_name):
+ if filter_name.startswith("attachment") and not self.attachment:
+ return None
+ elif filter_name == "attachment.attach-time":
+ return self.attachment.attach_time
+ elif filter_name == "attachment.device":
+ return self.attachment.device
+ elif filter_name == "attachment.instance-id":
+ return self.attachment.instance.id
+ elif filter_name == "attachment.status":
+ return self.attachment.status
+ elif filter_name == "create-time":
+ return self.create_time
+ elif filter_name == "size":
+ return self.size
+ elif filter_name == "snapshot-id":
+ return self.snapshot_id
+ elif filter_name == "status":
+ return self.status
+ elif filter_name == "volume-id":
+ return self.id
+ elif filter_name == "encrypted":
+ return str(self.encrypted).lower()
+ elif filter_name == "availability-zone":
+ return self.zone.name if self.zone else None
+ else:
+ return super().get_filter_value(filter_name, "DescribeVolumes")
+
+
+class Snapshot(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ snapshot_id,
+ volume,
+ description,
+ encrypted=False,
+ owner_id=get_account_id(),
+ from_ami=None,
+ ):
+ self.id = snapshot_id
+ self.volume = volume
+ self.description = description
+ self.start_time = utc_date_and_time()
+ self.create_volume_permission_groups = set()
+ self.create_volume_permission_userids = set()
+ self.ec2_backend = ec2_backend
+ self.status = "completed"
+ self.encrypted = encrypted
+ self.owner_id = owner_id
+ self.from_ami = from_ami
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "description":
+ return self.description
+ elif filter_name == "snapshot-id":
+ return self.id
+ elif filter_name == "start-time":
+ return self.start_time
+ elif filter_name == "volume-id":
+ return self.volume.id
+ elif filter_name == "volume-size":
+ return self.volume.size
+ elif filter_name == "encrypted":
+ return str(self.encrypted).lower()
+ elif filter_name == "status":
+ return self.status
+ elif filter_name == "owner-id":
+ return self.owner_id
+ else:
+ return super().get_filter_value(filter_name, "DescribeSnapshots")
+
+
+class EBSBackend:
+ def __init__(self):
+ self.volumes = {}
+ self.attachments = {}
+ self.snapshots = {}
+
+ def create_volume(
+ self,
+ size,
+ zone_name,
+ snapshot_id=None,
+ encrypted=False,
+ kms_key_id=None,
+ volume_type=None,
+ ):
+ if kms_key_id and not encrypted:
+ raise InvalidParameterDependency("KmsKeyId", "Encrypted")
+ if encrypted and not kms_key_id:
+ kms_key_id = self._get_default_encryption_key()
+ volume_id = random_volume_id()
+ zone = self.get_zone_by_name(zone_name)
+ if snapshot_id:
+ snapshot = self.get_snapshot(snapshot_id)
+ if size is None:
+ size = snapshot.volume.size
+ if snapshot.encrypted:
+ encrypted = snapshot.encrypted
+ volume = Volume(
+ self,
+ volume_id=volume_id,
+ size=size,
+ zone=zone,
+ snapshot_id=snapshot_id,
+ encrypted=encrypted,
+ kms_key_id=kms_key_id,
+ volume_type=volume_type,
+ )
+ self.volumes[volume_id] = volume
+ return volume
+
+ def describe_volumes(self, volume_ids=None, filters=None):
+ matches = self.volumes.copy().values()
+ if volume_ids:
+ matches = [vol for vol in matches if vol.id in volume_ids]
+ if len(volume_ids) > len(matches):
+ unknown_ids = set(volume_ids) - set(matches)
+ raise InvalidVolumeIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def get_volume(self, volume_id):
+ volume = self.volumes.get(volume_id, None)
+ if not volume:
+ raise InvalidVolumeIdError(volume_id)
+ return volume
+
+ def delete_volume(self, volume_id):
+ if volume_id in self.volumes:
+ volume = self.volumes[volume_id]
+ if volume.attachment:
+ raise VolumeInUseError(volume_id, volume.attachment.instance.id)
+ return self.volumes.pop(volume_id)
+ raise InvalidVolumeIdError(volume_id)
+
+ def attach_volume(
+ self, volume_id, instance_id, device_path, delete_on_termination=False
+ ):
+ volume = self.get_volume(volume_id)
+ instance = self.get_instance(instance_id)
+
+ if not volume or not instance:
+ return False
+
+ volume.attachment = VolumeAttachment(volume, instance, device_path, "attached")
+ # Modify instance to capture mount of block device.
+ bdt = BlockDeviceType(
+ volume_id=volume_id,
+ status=volume.status,
+ size=volume.size,
+ attach_time=utc_date_and_time(),
+ delete_on_termination=delete_on_termination,
+ )
+ instance.block_device_mapping[device_path] = bdt
+ return volume.attachment
+
+ def detach_volume(self, volume_id, instance_id, device_path):
+ volume = self.get_volume(volume_id)
+ instance = self.get_instance(instance_id)
+
+ old_attachment = volume.attachment
+ if not old_attachment:
+ raise InvalidVolumeAttachmentError(volume_id, instance_id)
+ device_path = device_path or old_attachment.device
+
+ try:
+ del instance.block_device_mapping[device_path]
+ except KeyError:
+ raise InvalidVolumeDetachmentError(volume_id, instance_id, device_path)
+
+ old_attachment.status = "detached"
+
+ volume.attachment = None
+ return old_attachment
+
+ def create_snapshot(self, volume_id, description, owner_id=None, from_ami=None):
+ snapshot_id = random_snapshot_id()
+ volume = self.get_volume(volume_id)
+ params = [self, snapshot_id, volume, description, volume.encrypted]
+ if owner_id:
+ params.append(owner_id)
+ if from_ami:
+ params.append(from_ami)
+ snapshot = Snapshot(*params)
+ self.snapshots[snapshot_id] = snapshot
+ return snapshot
+
+ def create_snapshots(self, instance_spec, description, tags):
+ """
+ The CopyTagsFromSource-parameter is not yet implemented.
+ """
+ instance = self.get_instance(instance_spec["InstanceId"])
+ block_device_mappings = instance.block_device_mapping
+
+ if str(instance_spec.get("ExcludeBootVolume", False)).lower() == "true":
+ volumes = [
+ m.volume_id
+ for k, m in block_device_mappings.items()
+ if k != instance.root_device_name
+ ]
+ else:
+ volumes = [m.volume_id for m in block_device_mappings.values()]
+
+ snapshots = [
+ self.create_snapshot(v_id, description=description) for v_id in volumes
+ ]
+ for snapshot in snapshots:
+ snapshot.add_tags(tags)
+ return snapshots
+
+ def describe_snapshots(self, snapshot_ids=None, filters=None):
+ matches = self.snapshots.copy().values()
+ if snapshot_ids:
+ matches = [snap for snap in matches if snap.id in snapshot_ids]
+ if len(snapshot_ids) > len(matches):
+ raise InvalidSnapshotIdError()
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def copy_snapshot(self, source_snapshot_id, source_region, description=None):
+ from ..models import ec2_backends
+
+ source_snapshot = ec2_backends[source_region].describe_snapshots(
+ snapshot_ids=[source_snapshot_id]
+ )[0]
+ snapshot_id = random_snapshot_id()
+ snapshot = Snapshot(
+ self,
+ snapshot_id,
+ volume=source_snapshot.volume,
+ description=description,
+ encrypted=source_snapshot.encrypted,
+ )
+ self.snapshots[snapshot_id] = snapshot
+ return snapshot
+
+ def get_snapshot(self, snapshot_id):
+ snapshot = self.snapshots.get(snapshot_id, None)
+ if not snapshot:
+ raise InvalidSnapshotIdError()
+ return snapshot
+
+ def delete_snapshot(self, snapshot_id):
+ if snapshot_id in self.snapshots:
+ snapshot = self.snapshots[snapshot_id]
+ if snapshot.from_ami and snapshot.from_ami in self.amis:
+ raise InvalidSnapshotInUse(snapshot_id, snapshot.from_ami)
+ return self.snapshots.pop(snapshot_id)
+ raise InvalidSnapshotIdError()
+
+ def get_create_volume_permission_groups(self, snapshot_id):
+ snapshot = self.get_snapshot(snapshot_id)
+ return snapshot.create_volume_permission_groups
+
+ def get_create_volume_permission_userids(self, snapshot_id):
+ snapshot = self.get_snapshot(snapshot_id)
+ return snapshot.create_volume_permission_userids
+
+ def add_create_volume_permission(self, snapshot_id, user_ids=None, groups=None):
+ snapshot = self.get_snapshot(snapshot_id)
+ if user_ids:
+ snapshot.create_volume_permission_userids.update(user_ids)
+
+ if groups and groups != ["all"]:
+ raise InvalidAMIAttributeItemValueError("UserGroup", groups)
+ else:
+ snapshot.create_volume_permission_groups.update(groups)
+
+ return True
+
+ def remove_create_volume_permission(self, snapshot_id, user_ids=None, groups=None):
+ snapshot = self.get_snapshot(snapshot_id)
+ if user_ids:
+ snapshot.create_volume_permission_userids.difference_update(user_ids)
+
+ if groups and groups != ["all"]:
+ raise InvalidAMIAttributeItemValueError("UserGroup", groups)
+ else:
+ snapshot.create_volume_permission_groups.difference_update(groups)
+
+ return True
+
+ def _get_default_encryption_key(self):
+ # https://aws.amazon.com/kms/features/#AWS_Service_Integration
+ # An AWS managed CMK is created automatically when you first create
+ # an encrypted resource using an AWS service integrated with KMS.
+ kms = kms_backends[self.region_name]
+ ebs_alias = "alias/aws/ebs"
+ if not kms.alias_exists(ebs_alias):
+ key = kms.create_key(
+ policy="",
+ key_usage="ENCRYPT_DECRYPT",
+ customer_master_key_spec="SYMMETRIC_DEFAULT",
+ description="Default master key that protects my EBS volumes when no other key is defined",
+ tags=None,
+ region=self.region_name,
+ )
+ kms.add_alias(key.id, ebs_alias)
+ ebs_key = kms.describe_key(ebs_alias)
+ return ebs_key.arn
diff --git a/contrib/python/moto/py3/moto/ec2/models/elastic_ip_addresses.py b/contrib/python/moto/py3/moto/ec2/models/elastic_ip_addresses.py
new file mode 100644
index 0000000000..71c7b851d2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/elastic_ip_addresses.py
@@ -0,0 +1,242 @@
+from moto.core import CloudFormationModel
+from .core import TaggedEC2Resource
+from ..exceptions import (
+ FilterNotImplementedError,
+ InvalidDomainError,
+ InvalidAddressError,
+ InvalidAllocationIdError,
+ ResourceAlreadyAssociatedError,
+ InvalidAssociationIdError,
+)
+from ..utils import (
+ random_ip,
+ random_eip_allocation_id,
+ random_eip_association_id,
+ generic_filter,
+)
+
+
+class ElasticAddress(TaggedEC2Resource, CloudFormationModel):
+ def __init__(self, ec2_backend, domain, address=None, tags=None):
+ self.ec2_backend = ec2_backend
+ if address:
+ self.public_ip = address
+ else:
+ self.public_ip = random_ip()
+ self.allocation_id = random_eip_allocation_id() if domain == "vpc" else None
+ self.id = self.allocation_id
+ self.domain = domain
+ self.instance = None
+ self.eni = None
+ self.association_id = None
+ self.add_tags(tags or {})
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html
+ return "AWS::EC2::EIP"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+
+ properties = cloudformation_json.get("Properties")
+ instance_id = None
+ if properties:
+ domain = properties.get("Domain")
+ # TODO: support tags from cloudformation template
+ eip = ec2_backend.allocate_address(domain=domain if domain else "standard")
+ instance_id = properties.get("InstanceId")
+ else:
+ eip = ec2_backend.allocate_address(domain="standard")
+
+ if instance_id:
+ instance = ec2_backend.get_instance_by_id(instance_id)
+ ec2_backend.associate_address(instance, address=eip.public_ip)
+
+ return eip
+
+ @property
+ def physical_resource_id(self):
+ return self.public_ip
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["AllocationId"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "AllocationId":
+ return self.allocation_id
+ raise UnformattedGetAttTemplateException()
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "allocation-id":
+ return self.allocation_id
+ elif filter_name == "association-id":
+ return self.association_id
+ elif filter_name == "domain":
+ return self.domain
+ elif filter_name == "instance-id":
+ if self.instance:
+ return self.instance.id
+ return None
+ elif filter_name == "network-interface-id":
+ if self.eni:
+ return self.eni.id
+ return None
+ elif filter_name == "private-ip-address":
+ if self.eni:
+ return self.eni.private_ip_address
+ return None
+ elif filter_name == "public-ip":
+ return self.public_ip
+ elif filter_name == "network-interface-owner-id":
+ # TODO: implement network-interface-owner-id
+ raise FilterNotImplementedError(filter_name, "DescribeAddresses")
+ else:
+ return super().get_filter_value(filter_name, "DescribeAddresses")
+
+
+class ElasticAddressBackend:
+ def __init__(self):
+ self.addresses = []
+
+ def allocate_address(self, domain, address=None, tags=None):
+ if domain not in ["standard", "vpc"]:
+ raise InvalidDomainError(domain)
+ if address:
+ address = ElasticAddress(self, domain=domain, address=address, tags=tags)
+ else:
+ address = ElasticAddress(self, domain=domain, tags=tags)
+ self.addresses.append(address)
+ return address
+
+ def address_by_ip(self, ips, fail_if_not_found=True):
+ eips = [
+ address for address in self.addresses.copy() if address.public_ip in ips
+ ]
+
+ # TODO: Trim error message down to specific invalid address.
+ if (not eips or len(ips) > len(eips)) and fail_if_not_found:
+ raise InvalidAddressError(ips)
+
+ return eips
+
+ def address_by_allocation(self, allocation_ids):
+ eips = [
+ address
+ for address in self.addresses
+ if address.allocation_id in allocation_ids
+ ]
+
+ # TODO: Trim error message down to specific invalid id.
+ if not eips or len(allocation_ids) > len(eips):
+ raise InvalidAllocationIdError(allocation_ids)
+
+ return eips
+
+ def address_by_association(self, association_ids):
+ eips = [
+ address
+ for address in self.addresses
+ if address.association_id in association_ids
+ ]
+
+ # TODO: Trim error message down to specific invalid id.
+ if not eips or len(association_ids) > len(eips):
+ raise InvalidAssociationIdError(association_ids)
+
+ return eips
+
+ def associate_address(
+ self,
+ instance=None,
+ eni=None,
+ address=None,
+ allocation_id=None,
+ reassociate=False,
+ ):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif allocation_id:
+ eips = self.address_by_allocation([allocation_id])
+ eip = eips[0]
+
+ new_instance_association = bool(
+ instance and (not eip.instance or eip.instance.id == instance.id)
+ )
+ new_eni_association = bool(eni and (not eip.eni or eni.id == eip.eni.id))
+
+ if new_instance_association or new_eni_association or reassociate:
+ eip.instance = instance
+ eip.eni = eni
+ if not eip.eni and instance:
+ # default to primary network interface
+ eip.eni = instance.nics[0]
+ if eip.eni:
+ eip.eni.public_ip = eip.public_ip
+ if eip.domain == "vpc":
+ eip.association_id = random_eip_association_id()
+
+ return eip
+
+ raise ResourceAlreadyAssociatedError(eip.public_ip)
+
+ def describe_addresses(self, allocation_ids=None, public_ips=None, filters=None):
+ matches = self.addresses.copy()
+ if allocation_ids:
+ matches = [addr for addr in matches if addr.allocation_id in allocation_ids]
+ if len(allocation_ids) > len(matches):
+ unknown_ids = set(allocation_ids) - set(matches)
+ raise InvalidAllocationIdError(unknown_ids)
+ if public_ips:
+ matches = [addr for addr in matches if addr.public_ip in public_ips]
+ if len(public_ips) > len(matches):
+ unknown_ips = set(public_ips) - set(matches)
+ raise InvalidAddressError(unknown_ips)
+ if filters:
+ matches = generic_filter(filters, matches)
+
+ return matches
+
+ def disassociate_address(self, address=None, association_id=None):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif association_id:
+ eips = self.address_by_association([association_id])
+ eip = eips[0]
+
+ if eip.eni:
+ eip.eni.public_ip = None
+ if eip.eni.instance and eip.eni.instance._state.name == "running":
+ eip.eni.check_auto_public_ip()
+ eip.eni = None
+
+ eip.instance = None
+ eip.association_id = None
+ return True
+
+ def release_address(self, address=None, allocation_id=None):
+ eips = []
+ if address:
+ eips = self.address_by_ip([address])
+ elif allocation_id:
+ eips = self.address_by_allocation([allocation_id])
+ eip = eips[0]
+
+ self.disassociate_address(address=eip.public_ip)
+ eip.allocation_id = None
+ self.addresses.remove(eip)
+ return True
diff --git a/contrib/python/moto/py3/moto/ec2/models/elastic_network_interfaces.py b/contrib/python/moto/py3/moto/ec2/models/elastic_network_interfaces.py
new file mode 100644
index 0000000000..6cd96fdfed
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/elastic_network_interfaces.py
@@ -0,0 +1,395 @@
+from moto.core import get_account_id, CloudFormationModel
+from ..exceptions import InvalidNetworkAttachmentIdError, InvalidNetworkInterfaceIdError
+from .core import TaggedEC2Resource
+from .security_groups import SecurityGroup
+from ..utils import (
+ random_eni_id,
+ generate_dns_from_ip,
+ random_mac_address,
+ random_private_ip,
+ random_public_ip,
+ generic_filter,
+)
+
+
+class NetworkInterface(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ subnet,
+ private_ip_address,
+ private_ip_addresses=None,
+ device_index=0,
+ public_ip_auto_assign=False,
+ group_ids=None,
+ description=None,
+ tags=None,
+ **kwargs,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = random_eni_id()
+ self.device_index = device_index
+ if isinstance(private_ip_address, list) and private_ip_address:
+ private_ip_address = private_ip_address[0]
+ self.private_ip_address = private_ip_address or None
+ self.private_ip_addresses = private_ip_addresses or []
+ self.ipv6_addresses = kwargs.get("ipv6_addresses") or []
+
+ self.subnet = subnet
+ if isinstance(subnet, str):
+ self.subnet = self.ec2_backend.get_subnet(subnet)
+ self.instance = None
+ self.attachment_id = None
+ self.attach_time = None
+ self.delete_on_termination = False
+ self.description = description
+ self.source_dest_check = True
+
+ self.public_ip = None
+ self.public_ip_auto_assign = public_ip_auto_assign
+ self.start()
+ self.add_tags(tags or {})
+ self.status = "available"
+ self.mac_address = random_mac_address()
+ self.interface_type = "interface"
+ # Local set to the ENI. When attached to an instance, @property group_set
+ # returns groups for both self and the attached instance.
+ self._group_set = []
+
+ if self.subnet.ipv6_cidr_block_associations:
+ association = list(self.subnet.ipv6_cidr_block_associations.values())[0]
+ subnet_ipv6_cidr_block = association.get("ipv6CidrBlock")
+ if kwargs.get("ipv6_address_count"):
+ while len(self.ipv6_addresses) < kwargs.get("ipv6_address_count"):
+ ip = random_private_ip(subnet_ipv6_cidr_block, ipv6=True)
+ if ip not in self.ipv6_addresses:
+ self.ipv6_addresses.append(ip)
+
+ if self.private_ip_addresses:
+ primary_selected = True if private_ip_address else False
+ for item in self.private_ip_addresses.copy():
+ if isinstance(item, str):
+ self.private_ip_addresses.remove(item)
+ self.private_ip_addresses.append(
+ {
+ "Primary": True if not primary_selected else False,
+ "PrivateIpAddress": item,
+ }
+ )
+ primary_selected = True
+
+ if not self.private_ip_address:
+ if self.private_ip_addresses:
+ for ip in self.private_ip_addresses:
+ if isinstance(ip, dict) and ip.get("Primary"):
+ self.private_ip_address = ip.get("PrivateIpAddress")
+ break
+ if not self.private_ip_addresses:
+ self.private_ip_address = random_private_ip(self.subnet.cidr_block)
+
+ if not self.private_ip_addresses:
+ self.private_ip_addresses.append(
+ {"Primary": True, "PrivateIpAddress": self.private_ip_address}
+ )
+
+ secondary_ips = kwargs.get("secondary_ips_count", None)
+ if secondary_ips:
+ ips = [
+ random_private_ip(self.subnet.cidr_block)
+ for index in range(0, int(secondary_ips))
+ ]
+ if ips:
+ self.private_ip_addresses.extend(
+ [{"Primary": False, "PrivateIpAddress": ip} for ip in ips]
+ )
+
+ if self.subnet:
+ vpc = self.ec2_backend.get_vpc(self.subnet.vpc_id)
+ if vpc and vpc.enable_dns_hostnames:
+ self.private_dns_name = generate_dns_from_ip(self.private_ip_address)
+ for address in self.private_ip_addresses:
+ if address.get("Primary", None):
+ address["PrivateDnsName"] = self.private_dns_name
+
+ group = None
+ if group_ids:
+ for group_id in group_ids:
+ group = self.ec2_backend.get_security_group_from_id(group_id)
+ if not group:
+ # Create with specific group ID.
+ group = SecurityGroup(
+ self.ec2_backend,
+ group_id,
+ group_id,
+ group_id,
+ vpc_id=subnet.vpc_id,
+ )
+ self.ec2_backend.groups[subnet.vpc_id][group_id] = group
+ if group:
+ self._group_set.append(group)
+ if not group_ids:
+ group = self.ec2_backend.get_default_security_group(vpc.id)
+ if group:
+ self._group_set.append(group)
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @property
+ def association(self):
+ association = {}
+ if self.public_ip:
+ eips = self.ec2_backend.address_by_ip(
+ [self.public_ip], fail_if_not_found=False
+ )
+ eip = eips[0] if len(eips) > 0 else None
+ if eip:
+ association["allocationId"] = eip.allocation_id or None
+ association["associationId"] = eip.association_id or None
+ return association
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html
+ return "AWS::EC2::NetworkInterface"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ security_group_ids = properties.get("SecurityGroups", [])
+
+ ec2_backend = ec2_backends[region_name]
+ subnet_id = properties.get("SubnetId")
+ if subnet_id:
+ subnet = ec2_backend.get_subnet(subnet_id)
+ else:
+ subnet = None
+
+ private_ip_address = properties.get("PrivateIpAddress", None)
+ description = properties.get("Description", None)
+
+ network_interface = ec2_backend.create_network_interface(
+ subnet,
+ private_ip_address,
+ group_ids=security_group_ids,
+ description=description,
+ )
+ return network_interface
+
+ def stop(self):
+ if self.public_ip_auto_assign:
+ self.public_ip = None
+
+ def start(self):
+ self.check_auto_public_ip()
+
+ def check_auto_public_ip(self):
+ if (
+ self.public_ip_auto_assign
+ and str(self.public_ip_auto_assign).lower() == "true"
+ ):
+ self.public_ip = random_public_ip()
+
+ @property
+ def group_set(self):
+ if self.instance and self.instance.security_groups:
+ return set(self._group_set) | set(self.instance.security_groups)
+ else:
+ return self._group_set
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["PrimaryPrivateIpAddress", "SecondaryPrivateIpAddresses"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "PrimaryPrivateIpAddress":
+ return self.private_ip_address
+ elif attribute_name == "SecondaryPrivateIpAddresses":
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "SecondaryPrivateIpAddresses" ]"'
+ )
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "network-interface-id":
+ return self.id
+ elif filter_name in ("addresses.private-ip-address", "private-ip-address"):
+ return self.private_ip_address
+ elif filter_name == "subnet-id":
+ return self.subnet.id
+ elif filter_name == "vpc-id":
+ return self.subnet.vpc_id
+ elif filter_name == "group-id":
+ return [group.id for group in self._group_set]
+ elif filter_name == "availability-zone":
+ return self.subnet.availability_zone
+ elif filter_name == "description":
+ return self.description
+ elif filter_name == "attachment.instance-id":
+ return self.instance.id if self.instance else None
+ elif filter_name == "attachment.instance-owner-id":
+ return self.owner_id
+ else:
+ return super().get_filter_value(filter_name, "DescribeNetworkInterfaces")
+
+
+class NetworkInterfaceBackend:
+ def __init__(self):
+ self.enis = {}
+
+ def create_network_interface(
+ self,
+ subnet,
+ private_ip_address,
+ private_ip_addresses=None,
+ group_ids=None,
+ description=None,
+ tags=None,
+ **kwargs,
+ ):
+ eni = NetworkInterface(
+ self,
+ subnet,
+ private_ip_address,
+ private_ip_addresses,
+ group_ids=group_ids,
+ description=description,
+ tags=tags,
+ **kwargs,
+ )
+ self.enis[eni.id] = eni
+ return eni
+
+ def get_network_interface(self, eni_id):
+ for eni in self.enis.values():
+ if eni_id == eni.id:
+ return eni
+ raise InvalidNetworkInterfaceIdError(eni_id)
+
+ def delete_network_interface(self, eni_id):
+ deleted = self.enis.pop(eni_id, None)
+ if not deleted:
+ raise InvalidNetworkInterfaceIdError(eni_id)
+ return deleted
+
+ def describe_network_interfaces(self, filters=None):
+ # Note: This is only used in EC2Backend#do_resources_exist
+ # Client-calls use #get_all_network_interfaces()
+ # We should probably merge these at some point..
+ enis = self.enis.values()
+
+ if filters:
+ for (_filter, _filter_value) in filters.items():
+ if _filter == "network-interface-id":
+ _filter = "id"
+ enis = [
+ eni for eni in enis if getattr(eni, _filter) in _filter_value
+ ]
+ else:
+ self.raise_not_implemented_error(
+ "The filter '{0}' for DescribeNetworkInterfaces".format(_filter)
+ )
+ return enis
+
+ def attach_network_interface(self, eni_id, instance_id, device_index):
+ eni = self.get_network_interface(eni_id)
+ instance = self.get_instance(instance_id)
+ return instance.attach_eni(eni, device_index)
+
+ def detach_network_interface(self, attachment_id):
+ found_eni = None
+
+ for eni in self.enis.values():
+ if eni.attachment_id == attachment_id:
+ found_eni = eni
+ break
+ else:
+ raise InvalidNetworkAttachmentIdError(attachment_id)
+
+ found_eni.instance.detach_eni(found_eni)
+
+ def modify_network_interface_attribute(
+ self, eni_id, group_ids, source_dest_check=None, description=None
+ ):
+ eni = self.get_network_interface(eni_id)
+ groups = [self.get_security_group_from_id(group_id) for group_id in group_ids]
+ if groups:
+ eni._group_set = groups
+ if source_dest_check in [True, False]:
+ eni.source_dest_check = source_dest_check
+
+ if description:
+ eni.description = description
+
+ def get_all_network_interfaces(self, eni_ids=None, filters=None):
+ enis = self.enis.copy().values()
+
+ if eni_ids:
+ enis = [eni for eni in enis if eni.id in eni_ids]
+ if len(enis) != len(eni_ids):
+ invalid_id = list(
+ set(eni_ids).difference(set([eni.id for eni in enis]))
+ )[0]
+ raise InvalidNetworkInterfaceIdError(invalid_id)
+
+ return generic_filter(filters, enis)
+
+ def unassign_private_ip_addresses(self, eni_id=None, private_ip_address=None):
+ eni = self.get_network_interface(eni_id)
+ if private_ip_address:
+ for item in eni.private_ip_addresses.copy():
+ if item.get("PrivateIpAddress") in private_ip_address:
+ eni.private_ip_addresses.remove(item)
+ return eni
+
+ def assign_private_ip_addresses(self, eni_id=None, secondary_ips_count=None):
+ eni = self.get_network_interface(eni_id)
+ eni_assigned_ips = [
+ item.get("PrivateIpAddress") for item in eni.private_ip_addresses
+ ]
+ while secondary_ips_count:
+ ip = random_private_ip(eni.subnet.cidr_block)
+ if ip not in eni_assigned_ips:
+ eni.private_ip_addresses.append(
+ {"Primary": False, "PrivateIpAddress": ip}
+ )
+ secondary_ips_count -= 1
+ return eni
+
+ def assign_ipv6_addresses(self, eni_id=None, ipv6_addresses=None, ipv6_count=None):
+ eni = self.get_network_interface(eni_id)
+ if ipv6_addresses:
+ eni.ipv6_addresses.extend(ipv6_addresses)
+
+ while ipv6_count:
+ association = list(eni.subnet.ipv6_cidr_block_associations.values())[0]
+ subnet_ipv6_cidr_block = association.get("ipv6CidrBlock")
+ ip = random_private_ip(subnet_ipv6_cidr_block, ipv6=True)
+ if ip not in eni.ipv6_addresses:
+ eni.ipv6_addresses.append(ip)
+ ipv6_count -= 1
+ return eni
+
+ def unassign_ipv6_addresses(self, eni_id=None, ips=None):
+ eni = self.get_network_interface(eni_id)
+ if ips:
+ for ip in eni.ipv6_addresses.copy():
+ if ip in ips:
+ eni.ipv6_addresses.remove(ip)
+ return eni, ips
diff --git a/contrib/python/moto/py3/moto/ec2/models/flow_logs.py b/contrib/python/moto/py3/moto/ec2/models/flow_logs.py
new file mode 100644
index 0000000000..3a2044a71c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/flow_logs.py
@@ -0,0 +1,299 @@
+import itertools
+from collections import defaultdict
+from moto.core import CloudFormationModel
+from ..exceptions import (
+ FlowLogAlreadyExists,
+ InvalidAggregationIntervalParameterError,
+ InvalidDependantParameterError,
+ InvalidDependantParameterTypeError,
+ InvalidFlowLogIdError,
+)
+from .core import TaggedEC2Resource
+from ..utils import (
+ random_flow_log_id,
+ generic_filter,
+ utc_date_and_time,
+)
+
+
+class FlowLogs(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ flow_log_id,
+ resource_id,
+ traffic_type,
+ log_destination,
+ log_group_name,
+ deliver_logs_permission_arn,
+ max_aggregation_interval,
+ log_destination_type,
+ log_format,
+ deliver_logs_status="SUCCESS",
+ deliver_logs_error_message=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = flow_log_id
+ self.resource_id = resource_id
+ self.traffic_type = traffic_type
+ self.log_destination = log_destination
+ self.log_group_name = log_group_name
+ self.deliver_logs_permission_arn = deliver_logs_permission_arn
+ self.deliver_logs_status = deliver_logs_status
+ self.deliver_logs_error_message = deliver_logs_error_message
+ self.max_aggregation_interval = max_aggregation_interval
+ self.log_destination_type = log_destination_type
+ self.log_format = log_format
+
+ self.created_at = utc_date_and_time()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html
+ return "AWS::EC2::FlowLog"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ resource_type = properties.get("ResourceType")
+ resource_id = [properties.get("ResourceId")]
+ traffic_type = properties.get("TrafficType")
+ deliver_logs_permission_arn = properties.get("DeliverLogsPermissionArn")
+ log_destination_type = properties.get("LogDestinationType")
+ log_destination = properties.get("LogDestination")
+ log_group_name = properties.get("LogGroupName")
+ log_format = properties.get("LogFormat")
+ max_aggregation_interval = properties.get("MaxAggregationInterval")
+
+ ec2_backend = ec2_backends[region_name]
+ flow_log, _ = ec2_backend.create_flow_logs(
+ resource_type,
+ resource_id,
+ traffic_type,
+ deliver_logs_permission_arn,
+ log_destination_type,
+ log_destination,
+ log_group_name,
+ log_format,
+ max_aggregation_interval,
+ )
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ flow_log[0].add_tag(tag_key, tag_value)
+
+ return flow_log[0]
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ """
+ API Version 2016-11-15 defines the following filters for DescribeFlowLogs:
+
+ * deliver-log-status
+ * log-destination-type
+ * flow-log-id
+ * log-group-name
+ * resource-id
+ * traffic-type
+ * tag:key=value
+ * tag-key
+
+ Taken from: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFlowLogs.html
+ """
+ if filter_name == "resource-id":
+ return self.resource_id
+ elif filter_name == "traffic-type":
+ return self.traffic_type
+ elif filter_name == "log-destination-type":
+ return self.log_destination_type
+ elif filter_name == "flow-log-id":
+ return self.id
+ elif filter_name == "log-group-name":
+ return self.log_group_name
+ elif filter_name == "deliver-log-status":
+ return "SUCCESS"
+ else:
+ return super().get_filter_value(filter_name, "DescribeFlowLogs")
+
+
+class FlowLogsBackend:
+ def __init__(self):
+ self.flow_logs = defaultdict(dict)
+
+ def _validate_request(
+ self,
+ log_group_name,
+ log_destination,
+ log_destination_type,
+ max_aggregation_interval,
+ deliver_logs_permission_arn,
+ ):
+ if log_group_name is None and log_destination is None:
+ raise InvalidDependantParameterError(
+ "LogDestination", "LogGroupName", "not provided"
+ )
+
+ if log_destination_type == "s3":
+ if log_group_name is not None:
+ raise InvalidDependantParameterTypeError(
+ "LogDestination", "cloud-watch-logs", "LogGroupName"
+ )
+ elif log_destination_type == "cloud-watch-logs":
+ if deliver_logs_permission_arn is None:
+ raise InvalidDependantParameterError(
+ "DeliverLogsPermissionArn", "LogDestinationType", "cloud-watch-logs"
+ )
+
+ if max_aggregation_interval not in ["60", "600"]:
+ raise InvalidAggregationIntervalParameterError(
+ "Flow Log Max Aggregation Interval"
+ )
+
+ def create_flow_logs(
+ self,
+ resource_type,
+ resource_ids,
+ traffic_type,
+ deliver_logs_permission_arn,
+ log_destination_type,
+ log_destination,
+ log_group_name,
+ log_format,
+ max_aggregation_interval,
+ ):
+ # Guess it's best to put it here due to possible
+ # lack of them in the CloudFormation template
+ max_aggregation_interval = (
+ "600" if max_aggregation_interval is None else max_aggregation_interval
+ )
+ log_destination_type = (
+ "cloud-watch-logs" if log_destination_type is None else log_destination_type
+ )
+ log_format = (
+ "${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}"
+ if log_format is None
+ else log_format
+ )
+
+ # Validate the requests paremeters
+ self._validate_request(
+ log_group_name,
+ log_destination,
+ log_destination_type,
+ max_aggregation_interval,
+ deliver_logs_permission_arn,
+ )
+
+ flow_logs_set = []
+ unsuccessful = []
+
+ for resource_id in resource_ids:
+ deliver_logs_status = "SUCCESS"
+ deliver_logs_error_message = None
+ flow_log_id = random_flow_log_id()
+ if resource_type == "VPC":
+ # Validate VPCs exist
+ self.get_vpc(resource_id)
+ elif resource_type == "Subnet":
+ # Validate Subnets exist
+ self.get_subnet(resource_id)
+ elif resource_type == "NetworkInterface":
+ # Validate NetworkInterfaces exist
+ self.get_network_interface(resource_id)
+
+ if log_destination_type == "s3":
+ from moto.s3.models import s3_backend
+ from moto.s3.exceptions import MissingBucket
+
+ arn = log_destination.split(":", 5)[5]
+ try:
+ s3_backend.get_bucket(arn)
+ except MissingBucket:
+ # Instead of creating FlowLog report
+ # the unsuccessful status for the
+ # given resource_id
+ unsuccessful.append(
+ (
+ resource_id,
+ "400",
+ "LogDestination: {0} does not exist.".format(arn),
+ )
+ )
+ continue
+ elif log_destination_type == "cloud-watch-logs":
+ from moto.logs.models import logs_backends
+ from moto.logs.exceptions import ResourceNotFoundException
+
+ # API allows to create a FlowLog with a
+ # non-existing LogGroup. It however later
+ # on reports the FAILED delivery status.
+ try:
+ # Need something easy to check the group exists.
+ # The list_tags_log_group seems to do the trick.
+ logs_backends[self.region_name].list_tags_log_group(log_group_name)
+ except ResourceNotFoundException:
+ deliver_logs_status = "FAILED"
+ deliver_logs_error_message = "Access error"
+
+ all_flow_logs = self.describe_flow_logs()
+ if any(
+ fl.resource_id == resource_id
+ and (
+ fl.log_group_name == log_group_name
+ or fl.log_destination == log_destination
+ )
+ for fl in all_flow_logs
+ ):
+ raise FlowLogAlreadyExists()
+ flow_logs = FlowLogs(
+ self,
+ flow_log_id,
+ resource_id,
+ traffic_type,
+ log_destination,
+ log_group_name,
+ deliver_logs_permission_arn,
+ max_aggregation_interval,
+ log_destination_type,
+ log_format,
+ deliver_logs_status,
+ deliver_logs_error_message,
+ )
+ self.flow_logs[flow_log_id] = flow_logs
+ flow_logs_set.append(flow_logs)
+
+ return flow_logs_set, unsuccessful
+
+ def describe_flow_logs(self, flow_log_ids=None, filters=None):
+ matches = itertools.chain([i for i in self.flow_logs.values()])
+ if flow_log_ids:
+ matches = [flow_log for flow_log in matches if flow_log.id in flow_log_ids]
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def delete_flow_logs(self, flow_log_ids):
+ non_existing = []
+ for flow_log in flow_log_ids:
+ if flow_log in self.flow_logs:
+ self.flow_logs.pop(flow_log, None)
+ else:
+ non_existing.append(flow_log)
+
+ if non_existing:
+ raise InvalidFlowLogIdError(
+ len(flow_log_ids), " ".join(x for x in flow_log_ids)
+ )
+ return True
diff --git a/contrib/python/moto/py3/moto/ec2/models/iam_instance_profile.py b/contrib/python/moto/py3/moto/ec2/models/iam_instance_profile.py
new file mode 100644
index 0000000000..33ead5c400
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/iam_instance_profile.py
@@ -0,0 +1,124 @@
+from moto.core import get_account_id
+from moto.core import CloudFormationModel
+from ..exceptions import (
+ IncorrectStateIamProfileAssociationError,
+ InvalidAssociationIDIamProfileAssociationError,
+)
+from ..utils import (
+ random_iam_instance_profile_association_id,
+ filter_iam_instance_profile_associations,
+ filter_iam_instance_profiles,
+)
+
+OWNER_ID = get_account_id()
+
+
+class IamInstanceProfileAssociation(CloudFormationModel):
+ def __init__(self, ec2_backend, association_id, instance, iam_instance_profile):
+ self.ec2_backend = ec2_backend
+ self.id = association_id
+ self.instance = instance
+ self.iam_instance_profile = iam_instance_profile
+ self.state = "associated"
+
+
+class IamInstanceProfileAssociationBackend:
+ def __init__(self):
+ self.iam_instance_profile_associations = {}
+
+ def associate_iam_instance_profile(
+ self, instance_id, iam_instance_profile_name=None, iam_instance_profile_arn=None
+ ):
+ iam_association_id = random_iam_instance_profile_association_id()
+
+ instance_profile = filter_iam_instance_profiles(
+ iam_instance_profile_arn, iam_instance_profile_name
+ )
+
+ if instance_id in self.iam_instance_profile_associations.keys():
+ raise IncorrectStateIamProfileAssociationError(instance_id)
+
+ iam_instance_profile_associations = IamInstanceProfileAssociation(
+ self,
+ iam_association_id,
+ self.get_instance(instance_id) if instance_id else None,
+ instance_profile,
+ )
+ # Regarding to AWS there can be only one association with ec2.
+ self.iam_instance_profile_associations[
+ instance_id
+ ] = iam_instance_profile_associations
+ return iam_instance_profile_associations
+
+ def describe_iam_instance_profile_associations(
+ self, association_ids, filters=None, max_results=100, next_token=None
+ ):
+ associations_list = []
+ if association_ids:
+ for association in self.iam_instance_profile_associations.values():
+ if association.id in association_ids:
+ associations_list.append(association)
+ else:
+ # That's mean that no association id were given. Showing all.
+ associations_list.extend(self.iam_instance_profile_associations.values())
+
+ associations_list = filter_iam_instance_profile_associations(
+ associations_list, filters
+ )
+
+ starting_point = int(next_token or 0)
+ ending_point = starting_point + int(max_results or 100)
+ associations_page = associations_list[starting_point:ending_point]
+ new_next_token = (
+ str(ending_point) if ending_point < len(associations_list) else None
+ )
+
+ return associations_page, new_next_token
+
+ def disassociate_iam_instance_profile(self, association_id):
+ iam_instance_profile_associations = None
+ for association_key in self.iam_instance_profile_associations.keys():
+ if (
+ self.iam_instance_profile_associations[association_key].id
+ == association_id
+ ):
+ iam_instance_profile_associations = (
+ self.iam_instance_profile_associations[association_key]
+ )
+ del self.iam_instance_profile_associations[association_key]
+ # Deleting once and avoiding `RuntimeError: dictionary changed size during iteration`
+ break
+
+ if not iam_instance_profile_associations:
+ raise InvalidAssociationIDIamProfileAssociationError(association_id)
+
+ return iam_instance_profile_associations
+
+ def replace_iam_instance_profile_association(
+ self,
+ association_id,
+ iam_instance_profile_name=None,
+ iam_instance_profile_arn=None,
+ ):
+ instance_profile = filter_iam_instance_profiles(
+ iam_instance_profile_arn, iam_instance_profile_name
+ )
+
+ iam_instance_profile_association = None
+ for association_key in self.iam_instance_profile_associations.keys():
+ if (
+ self.iam_instance_profile_associations[association_key].id
+ == association_id
+ ):
+ self.iam_instance_profile_associations[
+ association_key
+ ].iam_instance_profile = instance_profile
+ iam_instance_profile_association = (
+ self.iam_instance_profile_associations[association_key]
+ )
+ break
+
+ if not iam_instance_profile_association:
+ raise InvalidAssociationIDIamProfileAssociationError(association_id)
+
+ return iam_instance_profile_association
diff --git a/contrib/python/moto/py3/moto/ec2/models/instance_types.py b/contrib/python/moto/py3/moto/ec2/models/instance_types.py
new file mode 100644
index 0000000000..a5e0957607
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/instance_types.py
@@ -0,0 +1,71 @@
+import pathlib
+
+from os import listdir
+
+from moto.utilities.utils import load_resource
+from ..exceptions import InvalidInstanceTypeError
+
+import library.python.resource as _ya_res
+import os
+import json
+
+INSTANCE_TYPES = load_resource("moto.ec2", "resources/instance_types.json")
+INSTANCE_FAMILIES = list(set([i.split(".")[0] for i in INSTANCE_TYPES.keys()]))
+
+root = pathlib.Path(__file__).parent.parent
+offerings_path = "resources/instance_type_offerings"
+INSTANCE_TYPE_OFFERINGS = {}
+for entry in _ya_res.resfs_files(prefix=str(root / offerings_path)):
+ rel_path = os.path.relpath(entry, root / offerings_path)
+ path_parts = os.path.normpath(rel_path).split(os.path.sep)
+ if len(path_parts) != 2:
+ continue
+ location_type, _region = path_parts
+ if location_type not in INSTANCE_TYPE_OFFERINGS:
+ INSTANCE_TYPE_OFFERINGS[location_type] = {}
+ res = json.loads(_ya_res.find(f"resfs/file/{entry}"))
+ for instance in res:
+ instance["LocationType"] = location_type
+ INSTANCE_TYPE_OFFERINGS[location_type][_region.replace(".json", "")] = res
+
+
+class InstanceTypeBackend:
+ def describe_instance_types(self, instance_types=None):
+ matches = INSTANCE_TYPES.values()
+ if instance_types:
+ matches = [t for t in matches if t.get("InstanceType") in instance_types]
+ if len(instance_types) > len(matches):
+ unknown_ids = set(instance_types) - set(
+ t.get("InstanceType") for t in matches
+ )
+ raise InvalidInstanceTypeError(unknown_ids)
+ return matches
+
+
+class InstanceTypeOfferingBackend:
+ def describe_instance_type_offerings(self, location_type=None, filters=None):
+ location_type = location_type or "region"
+ matches = INSTANCE_TYPE_OFFERINGS[location_type]
+ matches = matches.get(self.region_name, [])
+ matches = [
+ o for o in matches if self.matches_filters(o, filters or {}, location_type)
+ ]
+ return matches
+
+ def matches_filters(self, offering, filters, location_type):
+ def matches_filter(key, values):
+ if key == "location":
+ if location_type in ("availability-zone", "availability-zone-id"):
+ return offering.get("Location") in values
+ elif location_type == "region":
+ return any(
+ v for v in values if offering.get("Location").startswith(v)
+ )
+ else:
+ return False
+ elif key == "instance-type":
+ return offering.get("InstanceType") in values
+ else:
+ return False
+
+ return all([matches_filter(key, values) for key, values in filters.items()])
diff --git a/contrib/python/moto/py3/moto/ec2/models/instances.py b/contrib/python/moto/py3/moto/ec2/models/instances.py
new file mode 100644
index 0000000000..5cd65990dc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/instances.py
@@ -0,0 +1,847 @@
+import copy
+import warnings
+from collections import OrderedDict
+from datetime import datetime
+from moto import settings
+
+from moto.core import get_account_id
+from moto.core import CloudFormationModel
+from moto.core.utils import camelcase_to_underscores
+from moto.ec2.models.instance_types import (
+ INSTANCE_TYPE_OFFERINGS,
+ InstanceTypeOfferingBackend,
+)
+from moto.packages.boto.ec2.blockdevicemapping import BlockDeviceMapping
+from moto.packages.boto.ec2.instance import Instance as BotoInstance
+from moto.packages.boto.ec2.instance import Reservation
+
+from ..exceptions import (
+ AvailabilityZoneNotFromRegionError,
+ EC2ClientError,
+ InvalidInstanceIdError,
+ InvalidInstanceTypeError,
+ InvalidParameterValueErrorUnknownAttribute,
+ OperationNotPermitted4,
+)
+from ..utils import (
+ convert_tag_spec,
+ filter_reservations,
+ random_eni_attach_id,
+ random_instance_id,
+ random_private_ip,
+ random_reservation_id,
+ utc_date_and_time,
+)
+from .core import TaggedEC2Resource
+
+
+class InstanceState(object):
+ def __init__(self, name="pending", code=0):
+ self.name = name
+ self.code = code
+
+
+class StateReason(object):
+ def __init__(self, message="", code=""):
+ self.message = message
+ self.code = code
+
+
+class Instance(TaggedEC2Resource, BotoInstance, CloudFormationModel):
+ VALID_ATTRIBUTES = {
+ "instanceType",
+ "kernel",
+ "ramdisk",
+ "userData",
+ "disableApiTermination",
+ "instanceInitiatedShutdownBehavior",
+ "rootDeviceName",
+ "blockDeviceMapping",
+ "productCodes",
+ "sourceDestCheck",
+ "groupSet",
+ "ebsOptimized",
+ "sriovNetSupport",
+ }
+
+ def __init__(self, ec2_backend, image_id, user_data, security_groups, **kwargs):
+ super().__init__()
+ self.ec2_backend = ec2_backend
+ self.id = random_instance_id()
+ self.owner_id = get_account_id()
+ self.lifecycle = kwargs.get("lifecycle")
+
+ nics = kwargs.get("nics", {})
+
+ launch_template_arg = kwargs.get("launch_template", {})
+ if launch_template_arg and not image_id:
+ # the image id from the template should be used
+ template_version = ec2_backend._get_template_from_args(launch_template_arg)
+ self.image_id = template_version.image_id
+ else:
+ self.image_id = image_id
+ # Check if we have tags to process
+ if launch_template_arg:
+ template_version = ec2_backend._get_template_from_args(launch_template_arg)
+ tag_spec_set = template_version.data.get("TagSpecification", {})
+ tags = convert_tag_spec(tag_spec_set)
+ instance_tags = tags.get("instance", {})
+ self.add_tags(instance_tags)
+
+ self._state = InstanceState("running", 16)
+ self._reason = ""
+ self._state_reason = StateReason()
+ self.user_data = user_data
+ self.security_groups = security_groups
+ self.instance_type = kwargs.get("instance_type", "m1.small")
+ self.region_name = kwargs.get("region_name", "us-east-1")
+ placement = kwargs.get("placement", None)
+ self.subnet_id = kwargs.get("subnet_id")
+ if not self.subnet_id:
+ self.subnet_id = next(
+ (n["SubnetId"] for n in nics if "SubnetId" in n), None
+ )
+ in_ec2_classic = not bool(self.subnet_id)
+ self.key_name = kwargs.get("key_name")
+ self.ebs_optimized = kwargs.get("ebs_optimized", False)
+ self.source_dest_check = "true"
+ self.launch_time = utc_date_and_time()
+ self.ami_launch_index = kwargs.get("ami_launch_index", 0)
+ self.disable_api_termination = kwargs.get("disable_api_termination", False)
+ self.instance_initiated_shutdown_behavior = (
+ kwargs.get("instance_initiated_shutdown_behavior") or "stop"
+ )
+ self.sriov_net_support = "simple"
+ self._spot_fleet_id = kwargs.get("spot_fleet_id", None)
+ self.associate_public_ip = kwargs.get("associate_public_ip", False)
+ if in_ec2_classic:
+ # If we are in EC2-Classic, autoassign a public IP
+ self.associate_public_ip = True
+
+ amis = self.ec2_backend.describe_images(filters={"image-id": self.image_id})
+ ami = amis[0] if amis else None
+ if ami is None:
+ warnings.warn(
+ "Could not find AMI with image-id:{0}, "
+ "in the near future this will "
+ "cause an error.\n"
+ "Use ec2_backend.describe_images() to "
+ "find suitable image for your test".format(self.image_id),
+ PendingDeprecationWarning,
+ )
+
+ self.platform = ami.platform if ami else None
+ self.virtualization_type = ami.virtualization_type if ami else "paravirtual"
+ self.architecture = ami.architecture if ami else "x86_64"
+ self.root_device_name = ami.root_device_name if ami else None
+
+ # handle weird bug around user_data -- something grabs the repr(), so
+ # it must be clean
+ if isinstance(self.user_data, list) and len(self.user_data) > 0:
+ if isinstance(self.user_data[0], bytes):
+ # string will have a "b" prefix -- need to get rid of it
+ self.user_data[0] = self.user_data[0].decode("utf-8")
+
+ if self.subnet_id:
+ subnet = ec2_backend.get_subnet(self.subnet_id)
+ self._placement.zone = subnet.availability_zone
+
+ if self.associate_public_ip is None:
+ # Mapping public ip hasnt been explicitly enabled or disabled
+ self.associate_public_ip = subnet.map_public_ip_on_launch == "true"
+ elif placement:
+ self._placement.zone = placement
+ else:
+ self._placement.zone = ec2_backend.region_name + "a"
+
+ self.block_device_mapping = BlockDeviceMapping()
+
+ self._private_ips = set()
+ self.prep_nics(
+ nics,
+ private_ip=kwargs.get("private_ip"),
+ associate_public_ip=self.associate_public_ip,
+ security_groups=self.security_groups,
+ )
+
+ @property
+ def vpc_id(self):
+ if self.subnet_id:
+ subnet = self.ec2_backend.get_subnet(self.subnet_id)
+ return subnet.vpc_id
+ if self.nics and 0 in self.nics:
+ return self.nics[0].subnet.vpc_id
+ return None
+
+ def __del__(self):
+ try:
+ subnet = self.ec2_backend.get_subnet(self.subnet_id)
+ for ip in self._private_ips:
+ subnet.del_subnet_ip(ip)
+ except Exception:
+ # Its not "super" critical we clean this up, as reset will do this
+ # worst case we'll get IP address exaustion... rarely
+ pass
+
+ def add_block_device(
+ self,
+ size,
+ device_path,
+ snapshot_id=None,
+ encrypted=False,
+ delete_on_termination=False,
+ kms_key_id=None,
+ volume_type=None,
+ ):
+ volume = self.ec2_backend.create_volume(
+ size=size,
+ zone_name=self._placement.zone,
+ snapshot_id=snapshot_id,
+ encrypted=encrypted,
+ kms_key_id=kms_key_id,
+ volume_type=volume_type,
+ )
+ self.ec2_backend.attach_volume(
+ volume.id, self.id, device_path, delete_on_termination
+ )
+
+ def setup_defaults(self):
+ # Default have an instance with root volume should you not wish to
+ # override with attach volume cmd.
+ volume = self.ec2_backend.create_volume(size=8, zone_name=self._placement.zone)
+ self.ec2_backend.attach_volume(volume.id, self.id, "/dev/sda1", True)
+
+ def teardown_defaults(self):
+ for device_path in list(self.block_device_mapping.keys()):
+ volume = self.block_device_mapping[device_path]
+ volume_id = volume.volume_id
+ self.ec2_backend.detach_volume(volume_id, self.id, device_path)
+ if volume.delete_on_termination:
+ self.ec2_backend.delete_volume(volume_id)
+
+ @property
+ def get_block_device_mapping(self):
+ return self.block_device_mapping.items()
+
+ @property
+ def private_ip(self):
+ return self.nics[0].private_ip_address
+
+ @property
+ def private_dns(self):
+ formatted_ip = self.private_ip.replace(".", "-")
+ if self.region_name == "us-east-1":
+ return "ip-{0}.ec2.internal".format(formatted_ip)
+ else:
+ return "ip-{0}.{1}.compute.internal".format(formatted_ip, self.region_name)
+
+ @property
+ def public_ip(self):
+ return self.nics[0].public_ip
+
+ @property
+ def public_dns(self):
+ if self.public_ip:
+ formatted_ip = self.public_ip.replace(".", "-")
+ if self.region_name == "us-east-1":
+ return "ec2-{0}.compute-1.amazonaws.com".format(formatted_ip)
+ else:
+ return "ec2-{0}.{1}.compute.amazonaws.com".format(
+ formatted_ip, self.region_name
+ )
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html
+ return "AWS::EC2::Instance"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ security_group_ids = properties.get("SecurityGroups", [])
+ group_names = [
+ ec2_backend.get_security_group_from_id(group_id).name
+ for group_id in security_group_ids
+ ]
+
+ reservation = ec2_backend.add_instances(
+ image_id=properties["ImageId"],
+ user_data=properties.get("UserData"),
+ count=1,
+ security_group_names=group_names,
+ instance_type=properties.get("InstanceType", "m1.small"),
+ is_instance_type_default=not properties.get("InstanceType"),
+ subnet_id=properties.get("SubnetId"),
+ key_name=properties.get("KeyName"),
+ private_ip=properties.get("PrivateIpAddress"),
+ block_device_mappings=properties.get("BlockDeviceMappings", {}),
+ )
+ instance = reservation.instances[0]
+ for tag in properties.get("Tags", []):
+ instance.add_tag(tag["Key"], tag["Value"])
+
+ # Associating iam instance profile.
+ # TODO: Don't forget to implement replace_iam_instance_profile_association once update_from_cloudformation_json
+ # for ec2 instance will be implemented.
+ if properties.get("IamInstanceProfile"):
+ ec2_backend.associate_iam_instance_profile(
+ instance_id=instance.id,
+ iam_instance_profile_name=properties.get("IamInstanceProfile"),
+ )
+
+ return instance
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+ all_instances = ec2_backend.all_instances()
+
+ # the resource_name for instances is the stack name, logical id, and random suffix separated
+ # by hyphens. So to lookup the instances using the 'aws:cloudformation:logical-id' tag, we need to
+ # extract the logical-id from the resource_name
+ logical_id = resource_name.split("-")[1]
+
+ for instance in all_instances:
+ instance_tags = instance.get_tags()
+ for tag in instance_tags:
+ if (
+ tag["key"] == "aws:cloudformation:logical-id"
+ and tag["value"] == logical_id
+ ):
+ instance.delete(region_name)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def start(self):
+ for nic in self.nics.values():
+ nic.start()
+
+ self._state.name = "running"
+ self._state.code = 16
+
+ self._reason = ""
+ self._state_reason = StateReason()
+
+ def stop(self):
+ for nic in self.nics.values():
+ nic.stop()
+
+ self._state.name = "stopped"
+ self._state.code = 80
+
+ self._reason = "User initiated ({0})".format(
+ datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC")
+ )
+ self._state_reason = StateReason(
+ "Client.UserInitiatedShutdown: User initiated shutdown",
+ "Client.UserInitiatedShutdown",
+ )
+
+ def is_running(self):
+ return self._state.name == "running"
+
+ def delete(self, region): # pylint: disable=unused-argument
+ self.terminate()
+
+ def terminate(self):
+ for nic in self.nics.values():
+ nic.stop()
+
+ self.teardown_defaults()
+
+ if self._spot_fleet_id:
+ spot_fleet = self.ec2_backend.get_spot_fleet_request(self._spot_fleet_id)
+ for spec in spot_fleet.launch_specs:
+ if (
+ spec.instance_type == self.instance_type
+ and spec.subnet_id == self.subnet_id
+ ):
+ break
+ spot_fleet.fulfilled_capacity -= spec.weighted_capacity
+ spot_fleet.spot_requests = [
+ req for req in spot_fleet.spot_requests if req.instance != self
+ ]
+
+ self._state.name = "terminated"
+ self._state.code = 48
+
+ self._reason = "User initiated ({0})".format(
+ datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC")
+ )
+ self._state_reason = StateReason(
+ "Client.UserInitiatedShutdown: User initiated shutdown",
+ "Client.UserInitiatedShutdown",
+ )
+
+ # Disassociate iam instance profile if associated, otherwise iam_instance_profile_associations will
+ # be pointing to None.
+ if self.ec2_backend.iam_instance_profile_associations.get(self.id):
+ self.ec2_backend.disassociate_iam_instance_profile(
+ association_id=self.ec2_backend.iam_instance_profile_associations[
+ self.id
+ ].id
+ )
+
+ def reboot(self):
+ self._state.name = "running"
+ self._state.code = 16
+
+ self._reason = ""
+ self._state_reason = StateReason()
+
+ @property
+ def dynamic_group_list(self):
+ return self.security_groups
+
+ def prep_nics(
+ self, nic_spec, private_ip=None, associate_public_ip=None, security_groups=None
+ ):
+ self.nics = {}
+
+ if self.subnet_id:
+ subnet = self.ec2_backend.get_subnet(self.subnet_id)
+ if not private_ip:
+ private_ip = subnet.get_available_subnet_ip(instance=self)
+ else:
+ subnet.request_ip(private_ip, instance=self)
+
+ self._private_ips.add(private_ip)
+ elif private_ip is None:
+ # Preserve old behaviour if in EC2-Classic mode
+ private_ip = random_private_ip()
+
+ # Primary NIC defaults
+ primary_nic = {
+ "SubnetId": self.subnet_id,
+ "PrivateIpAddress": private_ip,
+ "AssociatePublicIpAddress": associate_public_ip,
+ }
+ primary_nic = dict((k, v) for k, v in primary_nic.items() if v)
+
+ # If empty NIC spec but primary NIC values provided, create NIC from
+ # them.
+ if primary_nic and not nic_spec:
+ nic_spec = [primary_nic]
+ nic_spec[0]["DeviceIndex"] = 0
+
+ # Flesh out data structures and associations
+ for nic in nic_spec:
+ device_index = int(nic.get("DeviceIndex"))
+
+ nic_id = nic.get("NetworkInterfaceId")
+ if nic_id:
+ # If existing NIC found, use it.
+ use_nic = self.ec2_backend.get_network_interface(nic_id)
+ use_nic.device_index = device_index
+ use_nic.public_ip_auto_assign = False
+
+ else:
+ # If primary NIC values provided, use them for the primary NIC.
+ if device_index == 0 and primary_nic:
+ nic.update(primary_nic)
+
+ if "SubnetId" in nic:
+ subnet = self.ec2_backend.get_subnet(nic["SubnetId"])
+ else:
+ # Get default Subnet
+ zone = self._placement.zone
+ subnet = self.ec2_backend.get_default_subnet(availability_zone=zone)
+
+ group_ids = nic.get("SecurityGroupId") or []
+ if security_groups:
+ group_ids.extend([group.id for group in security_groups])
+
+ use_nic = self.ec2_backend.create_network_interface(
+ subnet,
+ nic.get("PrivateIpAddress"),
+ device_index=device_index,
+ public_ip_auto_assign=nic.get("AssociatePublicIpAddress", False),
+ group_ids=group_ids,
+ )
+
+ self.attach_eni(use_nic, device_index)
+
+ def attach_eni(self, eni, device_index):
+ device_index = int(device_index)
+ self.nics[device_index] = eni
+
+ # This is used upon associate/disassociate public IP.
+ eni.instance = self
+ eni.attachment_id = random_eni_attach_id()
+ eni.attach_time = utc_date_and_time()
+ eni.status = "in-use"
+ eni.device_index = device_index
+
+ return eni.attachment_id
+
+ def detach_eni(self, eni):
+ self.nics.pop(eni.device_index, None)
+ eni.instance = None
+ eni.attachment_id = None
+ eni.attach_time = None
+ eni.status = "available"
+ eni.device_index = None
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in [
+ "AvailabilityZone",
+ "PrivateDnsName",
+ "PublicDnsName",
+ "PrivateIp",
+ "PublicIp",
+ ]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "AvailabilityZone":
+ return self.placement
+ elif attribute_name == "PrivateDnsName":
+ return self.private_dns
+ elif attribute_name == "PublicDnsName":
+ return self.public_dns
+ elif attribute_name == "PrivateIp":
+ return self.private_ip
+ elif attribute_name == "PublicIp":
+ return self.public_ip
+ raise UnformattedGetAttTemplateException()
+
+ def applies(self, filters):
+ if filters:
+ applicable = False
+ for f in filters:
+ acceptable_values = f["values"]
+ if f["name"] == "instance-state-name":
+ if self._state.name in acceptable_values:
+ applicable = True
+ if f["name"] == "instance-state-code":
+ if str(self._state.code) in acceptable_values:
+ applicable = True
+ return applicable
+ # If there are no filters, all instances are valid
+ return True
+
+
+class InstanceBackend:
+ def __init__(self):
+ self.reservations = OrderedDict()
+
+ def get_instance(self, instance_id):
+ for instance in self.all_instances():
+ if instance.id == instance_id:
+ return instance
+ raise InvalidInstanceIdError(instance_id)
+
+ def add_instances(self, image_id, count, user_data, security_group_names, **kwargs):
+ location_type = "availability-zone" if kwargs.get("placement") else "region"
+ default_region = "us-east-1"
+ if settings.ENABLE_KEYPAIR_VALIDATION:
+ self.describe_key_pairs(key_names=[kwargs.get("key_name")])
+ if settings.ENABLE_AMI_VALIDATION:
+ self.describe_images(ami_ids=[image_id] if image_id else [])
+ valid_instance_types = INSTANCE_TYPE_OFFERINGS[location_type]
+ if "region_name" in kwargs and kwargs.get("placement"):
+ valid_availability_zones = {
+ instance["Location"]
+ for instance in valid_instance_types[kwargs["region_name"]]
+ }
+ if kwargs["placement"] not in valid_availability_zones:
+ raise AvailabilityZoneNotFromRegionError(kwargs["placement"])
+ match_filters = InstanceTypeOfferingBackend().matches_filters
+ if not kwargs["is_instance_type_default"] and not any(
+ {
+ match_filters(
+ valid_instance,
+ {"instance-type": kwargs["instance_type"]},
+ location_type,
+ )
+ for valid_instance in valid_instance_types.get(
+ kwargs["region_name"]
+ if "region_name" in kwargs
+ else default_region,
+ {},
+ )
+ },
+ ):
+ if settings.EC2_ENABLE_INSTANCE_TYPE_VALIDATION:
+ raise InvalidInstanceTypeError(kwargs["instance_type"])
+ new_reservation = Reservation()
+ new_reservation.id = random_reservation_id()
+
+ security_groups = [
+ self.get_security_group_by_name_or_id(name) for name in security_group_names
+ ]
+
+ for sg_id in kwargs.pop("security_group_ids", []):
+ if isinstance(sg_id, str):
+ security_groups.append(self.get_security_group_from_id(sg_id))
+ else:
+ security_groups.append(sg_id)
+
+ self.reservations[new_reservation.id] = new_reservation
+
+ tags = kwargs.pop("tags", {})
+ instance_tags = tags.get("instance", {})
+ volume_tags = tags.get("volume", {})
+
+ for index in range(count):
+ kwargs["ami_launch_index"] = index
+ new_instance = Instance(
+ self, image_id, user_data, security_groups, **kwargs
+ )
+ new_reservation.instances.append(new_instance)
+ new_instance.add_tags(instance_tags)
+ block_device_mappings = None
+ if "block_device_mappings" not in kwargs:
+ new_instance.setup_defaults()
+ if "block_device_mappings" in kwargs:
+ block_device_mappings = kwargs["block_device_mappings"]
+ elif kwargs.get("launch_template"):
+ template = self._get_template_from_args(kwargs["launch_template"])
+ block_device_mappings = template.data.get("BlockDeviceMapping")
+ elif kwargs.get("launch_config"):
+ block_device_mappings = kwargs[
+ "launch_config"
+ ].block_device_mapping_dict
+ if block_device_mappings:
+ for block_device in block_device_mappings:
+ device_name = block_device["DeviceName"]
+ volume_size = block_device["Ebs"].get("VolumeSize")
+ volume_type = block_device["Ebs"].get("VolumeType")
+ snapshot_id = block_device["Ebs"].get("SnapshotId")
+ encrypted = block_device["Ebs"].get("Encrypted", False)
+ if isinstance(encrypted, str):
+ encrypted = encrypted.lower() == "true"
+ delete_on_termination = block_device["Ebs"].get(
+ "DeleteOnTermination", False
+ )
+ kms_key_id = block_device["Ebs"].get("KmsKeyId")
+
+ if block_device.get("NoDevice") != "":
+ new_instance.add_block_device(
+ volume_size,
+ device_name,
+ snapshot_id,
+ encrypted,
+ delete_on_termination,
+ kms_key_id,
+ volume_type=volume_type,
+ )
+ if kwargs.get("instance_market_options"):
+ new_instance.lifecycle = "spot"
+ # Tag all created volumes.
+ for _, device in new_instance.get_block_device_mapping:
+ volumes = self.describe_volumes(volume_ids=[device.volume_id])
+ for volume in volumes:
+ volume.add_tags(volume_tags)
+
+ return new_reservation
+
+ def run_instances(self):
+ """
+ The Placement-parameter is validated to verify the availability-zone exists for the current region.
+
+ The InstanceType-parameter can be validated, to see if it is a known instance-type.
+ Enable this validation by setting the environment variable `MOTO_EC2_ENABLE_INSTANCE_TYPE_VALIDATION=true`
+
+ The ImageId-parameter can be validated, to see if it is a known AMI.
+ Enable this validation by setting the environment variable `MOTO_ENABLE_AMI_VALIDATION=true`
+
+ The KeyPair-parameter can be validated, to see if it is a known key-pair.
+ Enable this validation by setting the environment variable `MOTO_ENABLE_KEYPAIR_VALIDATION=true`
+ """
+ # Logic resides in add_instances
+ # Fake method here to make implementation coverage script aware that this method is implemented
+ pass
+
+ def start_instances(self, instance_ids):
+ started_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.start()
+ started_instances.append(instance)
+
+ return started_instances
+
+ def stop_instances(self, instance_ids):
+ stopped_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.stop()
+ stopped_instances.append(instance)
+
+ return stopped_instances
+
+ def terminate_instances(self, instance_ids):
+ terminated_instances = []
+ if not instance_ids:
+ raise EC2ClientError(
+ "InvalidParameterCombination", "No instances specified"
+ )
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ if instance.disable_api_termination == "true":
+ raise OperationNotPermitted4(instance.id)
+ instance.terminate()
+ terminated_instances.append(instance)
+
+ return terminated_instances
+
+ def reboot_instances(self, instance_ids):
+ rebooted_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ instance.reboot()
+ rebooted_instances.append(instance)
+
+ return rebooted_instances
+
+ def modify_instance_attribute(self, instance_id, key, value):
+ instance = self.get_instance(instance_id)
+ setattr(instance, key, value)
+ return instance
+
+ def modify_instance_security_groups(self, instance_id, new_group_id_list):
+ instance = self.get_instance(instance_id)
+ new_group_list = []
+ for new_group_id in new_group_id_list:
+ new_group_list.append(self.get_security_group_from_id(new_group_id))
+ setattr(instance, "security_groups", new_group_list)
+ return instance
+
+ def describe_instance_attribute(self, instance_id, attribute):
+ if attribute not in Instance.VALID_ATTRIBUTES:
+ raise InvalidParameterValueErrorUnknownAttribute(attribute)
+
+ if attribute == "groupSet":
+ key = "security_groups"
+ else:
+ key = camelcase_to_underscores(attribute)
+ instance = self.get_instance(instance_id)
+ value = getattr(instance, key)
+ return instance, value
+
+ def describe_instance_credit_specifications(self, instance_ids):
+ queried_instances = []
+ for instance in self.get_multi_instances_by_id(instance_ids):
+ queried_instances.append(instance)
+ return queried_instances
+
+ def all_instances(self, filters=None):
+ instances = []
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.applies(filters):
+ instances.append(instance)
+ return instances
+
+ def all_running_instances(self, filters=None):
+ instances = []
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.state_code == 16 and instance.applies(filters):
+ instances.append(instance)
+ return instances
+
+ def get_multi_instances_by_id(self, instance_ids, filters=None):
+ """
+ :param instance_ids: A string list with instance ids
+ :return: A list with instance objects
+ """
+ result = []
+
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.id in instance_ids:
+ if instance.applies(filters):
+ result.append(instance)
+
+ if instance_ids and len(instance_ids) > len(result):
+ result_ids = [i.id for i in result]
+ missing_instance_ids = [i for i in instance_ids if i not in result_ids]
+ raise InvalidInstanceIdError(missing_instance_ids)
+
+ return result
+
+ def get_instance_by_id(self, instance_id):
+ for reservation in self.all_reservations():
+ for instance in reservation.instances:
+ if instance.id == instance_id:
+ return instance
+
+ def get_reservations_by_instance_ids(self, instance_ids, filters=None):
+ """Go through all of the reservations and filter to only return those
+ associated with the given instance_ids.
+ """
+ reservations = []
+ for reservation in self.all_reservations():
+ reservation_instance_ids = [
+ instance.id for instance in reservation.instances
+ ]
+ matching_reservation = any(
+ instance_id in reservation_instance_ids for instance_id in instance_ids
+ )
+ if matching_reservation:
+ reservation.instances = [
+ instance
+ for instance in reservation.instances
+ if instance.id in instance_ids
+ ]
+ reservations.append(reservation)
+ found_instance_ids = [
+ instance.id
+ for reservation in reservations
+ for instance in reservation.instances
+ ]
+ if len(found_instance_ids) != len(instance_ids):
+ invalid_id = list(set(instance_ids).difference(set(found_instance_ids)))[0]
+ raise InvalidInstanceIdError(invalid_id)
+ if filters is not None:
+ reservations = filter_reservations(reservations, filters)
+ return reservations
+
+ def describe_instances(self, filters=None):
+ return self.all_reservations(filters)
+
+ def describe_instance_status(self, instance_ids, include_all_instances, filters):
+ if instance_ids:
+ return self.get_multi_instances_by_id(instance_ids, filters)
+ elif include_all_instances:
+ return self.all_instances(filters)
+ else:
+ return self.all_running_instances(filters)
+
+ def all_reservations(self, filters=None):
+ reservations = [
+ copy.copy(reservation) for reservation in self.reservations.copy().values()
+ ]
+ if filters is not None:
+ reservations = filter_reservations(reservations, filters)
+ return reservations
+
+ def _get_template_from_args(self, launch_template_arg):
+ template = (
+ self.describe_launch_templates(
+ template_ids=[launch_template_arg["LaunchTemplateId"]]
+ )[0]
+ if "LaunchTemplateId" in launch_template_arg
+ else self.describe_launch_templates(
+ template_names=[launch_template_arg["LaunchTemplateName"]]
+ )[0]
+ )
+ version = launch_template_arg.get("Version", template.latest_version_number)
+ template_version = template.get_version(int(version))
+ return template_version
diff --git a/contrib/python/moto/py3/moto/ec2/models/internet_gateways.py b/contrib/python/moto/py3/moto/ec2/models/internet_gateways.py
new file mode 100644
index 0000000000..ebabf93744
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/internet_gateways.py
@@ -0,0 +1,166 @@
+from moto.core import get_account_id, CloudFormationModel
+from .core import TaggedEC2Resource
+
+from ..exceptions import (
+ InvalidVPCIdError,
+ GatewayNotAttachedError,
+ DependencyViolationError,
+ InvalidInternetGatewayIdError,
+ InvalidGatewayIDError,
+ ResourceAlreadyAssociatedError,
+)
+from .vpn_gateway import VPCGatewayAttachment
+from ..utils import (
+ filter_internet_gateways,
+ random_egress_only_internet_gateway_id,
+ random_internet_gateway_id,
+)
+
+
+class EgressOnlyInternetGateway(TaggedEC2Resource):
+ def __init__(self, ec2_backend, vpc_id, tags=None):
+ self.id = random_egress_only_internet_gateway_id()
+ self.ec2_backend = ec2_backend
+ self.vpc_id = vpc_id
+ self.state = "attached"
+ self.add_tags(tags or {})
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+
+class EgressOnlyInternetGatewayBackend:
+ def __init__(self):
+ self.egress_only_internet_gateway_backend = {}
+
+ def create_egress_only_internet_gateway(self, vpc_id, tags=None):
+ vpc = self.get_vpc(vpc_id)
+ if not vpc:
+ raise InvalidVPCIdError(vpc_id)
+ egress_only_igw = EgressOnlyInternetGateway(self, vpc_id, tags)
+ self.egress_only_internet_gateway_backend[egress_only_igw.id] = egress_only_igw
+ return egress_only_igw
+
+ def describe_egress_only_internet_gateways(self, ids=None):
+ """
+ The Filters-argument is not yet supported
+ """
+ egress_only_igws = list(self.egress_only_internet_gateway_backend.values())
+
+ if ids:
+ egress_only_igws = [
+ egress_only_igw
+ for egress_only_igw in egress_only_igws
+ if egress_only_igw.id in ids
+ ]
+ return egress_only_igws
+
+ def delete_egress_only_internet_gateway(self, gateway_id):
+ egress_only_igw = self.egress_only_internet_gateway_backend.get(gateway_id)
+ if not egress_only_igw:
+ raise InvalidGatewayIDError(gateway_id)
+ if egress_only_igw:
+ self.egress_only_internet_gateway_backend.pop(gateway_id)
+
+ def get_egress_only_igw(self, gateway_id):
+ egress_only_igw = self.egress_only_internet_gateway_backend.get(
+ gateway_id, None
+ )
+ if not egress_only_igw:
+ raise InvalidGatewayIDError(gateway_id)
+ return egress_only_igw
+
+
+class InternetGateway(TaggedEC2Resource, CloudFormationModel):
+ def __init__(self, ec2_backend):
+ self.ec2_backend = ec2_backend
+ self.id = random_internet_gateway_id()
+ self.vpc = None
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html
+ return "AWS::EC2::InternetGateway"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+ return ec2_backend.create_internet_gateway()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def attachment_state(self):
+ if self.vpc:
+ return "available"
+ else:
+ return "detached"
+
+
+class InternetGatewayBackend:
+ def __init__(self):
+ self.internet_gateways = {}
+
+ def create_internet_gateway(self, tags=None):
+ igw = InternetGateway(self)
+ for tag in tags or []:
+ igw.add_tag(tag.get("Key"), tag.get("Value"))
+ self.internet_gateways[igw.id] = igw
+ return igw
+
+ def describe_internet_gateways(self, internet_gateway_ids=None, filters=None):
+ igws = []
+ if internet_gateway_ids is None:
+ igws = self.internet_gateways.values()
+ else:
+ for igw_id in internet_gateway_ids:
+ if igw_id in self.internet_gateways:
+ igws.append(self.internet_gateways[igw_id])
+ else:
+ raise InvalidInternetGatewayIdError(igw_id)
+ if filters is not None:
+ igws = filter_internet_gateways(igws, filters)
+ return igws
+
+ def delete_internet_gateway(self, internet_gateway_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if igw.vpc:
+ raise DependencyViolationError(
+ "{0} is being utilized by {1}".format(internet_gateway_id, igw.vpc.id)
+ )
+ self.internet_gateways.pop(internet_gateway_id)
+ return True
+
+ def detach_internet_gateway(self, internet_gateway_id, vpc_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if not igw.vpc or igw.vpc.id != vpc_id:
+ raise GatewayNotAttachedError(internet_gateway_id, vpc_id)
+ igw.vpc = None
+ return True
+
+ def attach_internet_gateway(self, internet_gateway_id, vpc_id):
+ igw = self.get_internet_gateway(internet_gateway_id)
+ if igw.vpc:
+ raise ResourceAlreadyAssociatedError(internet_gateway_id)
+ vpc = self.get_vpc(vpc_id)
+ igw.vpc = vpc
+ return VPCGatewayAttachment(gateway_id=internet_gateway_id, vpc_id=vpc_id)
+
+ def get_internet_gateway(self, internet_gateway_id):
+ igw_ids = [internet_gateway_id]
+ return self.describe_internet_gateways(internet_gateway_ids=igw_ids)[0]
diff --git a/contrib/python/moto/py3/moto/ec2/models/key_pairs.py b/contrib/python/moto/py3/moto/ec2/models/key_pairs.py
new file mode 100644
index 0000000000..be895d0490
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/key_pairs.py
@@ -0,0 +1,80 @@
+from moto.core import BaseModel
+from ..exceptions import (
+ FilterNotImplementedError,
+ InvalidKeyPairNameError,
+ InvalidKeyPairDuplicateError,
+ InvalidKeyPairFormatError,
+)
+from ..utils import (
+ random_key_pair,
+ rsa_public_key_fingerprint,
+ rsa_public_key_parse,
+ generic_filter,
+)
+
+
+class KeyPair(BaseModel):
+ def __init__(self, name, fingerprint, material):
+ self.name = name
+ self.fingerprint = fingerprint
+ self.material = material
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "key-name":
+ return self.name
+ elif filter_name == "fingerprint":
+ return self.fingerprint
+ else:
+ raise FilterNotImplementedError(filter_name, "DescribeKeyPairs")
+
+
+class KeyPairBackend:
+ def __init__(self):
+ self.keypairs = {}
+
+ def create_key_pair(self, name):
+ if name in self.keypairs:
+ raise InvalidKeyPairDuplicateError(name)
+ keypair = KeyPair(name, **random_key_pair())
+ self.keypairs[name] = keypair
+ return keypair
+
+ def delete_key_pair(self, name):
+ if name in self.keypairs:
+ self.keypairs.pop(name)
+ return True
+
+ def describe_key_pairs(self, key_names=None, filters=None):
+ results = []
+ if any(key_names):
+ results = [
+ keypair
+ for keypair in self.keypairs.values()
+ if keypair.name in key_names
+ ]
+ if len(key_names) > len(results):
+ unknown_keys = set(key_names) - set(results)
+ raise InvalidKeyPairNameError(unknown_keys)
+ else:
+ results = self.keypairs.values()
+
+ if filters:
+ return generic_filter(filters, results)
+ else:
+ return results
+
+ def import_key_pair(self, key_name, public_key_material):
+ if key_name in self.keypairs:
+ raise InvalidKeyPairDuplicateError(key_name)
+
+ try:
+ rsa_public_key = rsa_public_key_parse(public_key_material)
+ except ValueError:
+ raise InvalidKeyPairFormatError()
+
+ fingerprint = rsa_public_key_fingerprint(rsa_public_key)
+ keypair = KeyPair(
+ key_name, material=public_key_material, fingerprint=fingerprint
+ )
+ self.keypairs[key_name] = keypair
+ return keypair
diff --git a/contrib/python/moto/py3/moto/ec2/models/launch_templates.py b/contrib/python/moto/py3/moto/ec2/models/launch_templates.py
new file mode 100644
index 0000000000..be36be475d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/launch_templates.py
@@ -0,0 +1,119 @@
+from collections import OrderedDict
+from .core import TaggedEC2Resource
+from ..utils import generic_filter, random_launch_template_id, utc_date_and_time
+from ..exceptions import InvalidLaunchTemplateNameError
+
+
+class LaunchTemplateVersion(object):
+ def __init__(self, template, number, data, description):
+ self.template = template
+ self.number = number
+ self.data = data
+ self.description = description
+ self.create_time = utc_date_and_time()
+
+ @property
+ def image_id(self):
+ return self.data.get("ImageId", "")
+
+ @property
+ def instance_type(self):
+ return self.data.get("InstanceType", "")
+
+ @property
+ def security_groups(self):
+ return self.data.get("SecurityGroups", [])
+
+ @property
+ def user_data(self):
+ return self.data.get("UserData", "")
+
+
+class LaunchTemplate(TaggedEC2Resource):
+ def __init__(self, backend, name, template_data, version_description):
+ self.ec2_backend = backend
+ self.name = name
+ self.id = random_launch_template_id()
+ self.create_time = utc_date_and_time()
+
+ self.versions = []
+ self.create_version(template_data, version_description)
+ self.default_version_number = 1
+
+ def create_version(self, data, description):
+ num = len(self.versions) + 1
+ version = LaunchTemplateVersion(self, num, data, description)
+ self.versions.append(version)
+ return version
+
+ def is_default(self, version):
+ return self.default_version == version.number
+
+ def get_version(self, num):
+ if str(num).lower() == "$latest":
+ return self.versions[-1]
+ if str(num).lower() == "$default":
+ return self.default_version()
+ return self.versions[int(num) - 1]
+
+ def default_version(self):
+ return self.versions[self.default_version_number - 1]
+
+ def latest_version(self):
+ return self.versions[-1]
+
+ @property
+ def latest_version_number(self):
+ return self.latest_version().number
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "launch-template-name":
+ return self.name
+ else:
+ return super().get_filter_value(filter_name, "DescribeLaunchTemplates")
+
+
+class LaunchTemplateBackend:
+ def __init__(self):
+ self.launch_template_name_to_ids = {}
+ self.launch_templates = OrderedDict()
+ self.launch_template_insert_order = []
+
+ def create_launch_template(self, name, description, template_data):
+ if name in self.launch_template_name_to_ids:
+ raise InvalidLaunchTemplateNameError()
+ template = LaunchTemplate(self, name, template_data, description)
+ self.launch_templates[template.id] = template
+ self.launch_template_name_to_ids[template.name] = template.id
+ self.launch_template_insert_order.append(template.id)
+ return template
+
+ def get_launch_template(self, template_id):
+ return self.launch_templates[template_id]
+
+ def get_launch_template_by_name(self, name):
+ return self.get_launch_template(self.launch_template_name_to_ids[name])
+
+ def delete_launch_template(self, name, tid):
+ if name:
+ tid = self.launch_template_name_to_ids[name]
+ return self.launch_templates.pop(tid)
+
+ def describe_launch_templates(
+ self, template_names=None, template_ids=None, filters=None
+ ):
+ if template_names and not template_ids:
+ template_ids = []
+ for name in template_names:
+ template_ids.append(self.launch_template_name_to_ids[name])
+
+ if template_ids:
+ templates = [
+ self.launch_templates[tid]
+ for tid in template_ids
+ if tid in self.launch_templates
+ ]
+ else:
+ templates = list(self.launch_templates.values())
+
+ return generic_filter(filters, templates)
diff --git a/contrib/python/moto/py3/moto/ec2/models/managed_prefixes.py b/contrib/python/moto/py3/moto/ec2/models/managed_prefixes.py
new file mode 100644
index 0000000000..7084cc4ef1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/managed_prefixes.py
@@ -0,0 +1,170 @@
+from moto.core import get_account_id
+from moto.utilities.utils import filter_resources
+from .core import TaggedEC2Resource
+from ..utils import random_managed_prefix_list_id, describe_tag_filter
+
+
+class ManagedPrefixList(TaggedEC2Resource):
+ def __init__(
+ self,
+ backend,
+ address_family=None,
+ entry=None,
+ max_entries=None,
+ prefix_list_name=None,
+ region=None,
+ tags=None,
+ owner_id=None,
+ ):
+ self.ec2_backend = backend
+ self.address_family = address_family
+ self.max_entries = max_entries
+ self.id = random_managed_prefix_list_id()
+ self.prefix_list_name = prefix_list_name
+ self.state = "create-complete"
+ self.state_message = "create complete"
+ self.add_tags(tags or {})
+ self.version = 1
+ self.entries = {self.version: entry} if entry else {}
+ self.resource_owner_id = owner_id if owner_id else None
+ self.prefix_list_arn = self.arn(region, self.owner_id)
+ self.delete_counter = 1
+
+ def arn(self, region, owner_id):
+ return "arn:aws:ec2:{region}:{owner_id}:prefix-list/{resource_id}".format(
+ region=region, resource_id=self.id, owner_id=owner_id
+ )
+
+ @property
+ def owner_id(self):
+ return (
+ get_account_id() if not self.resource_owner_id else self.resource_owner_id
+ )
+
+
+class ManagedPrefixListBackend:
+ def __init__(self):
+ self.managed_prefix_lists = {}
+ self.create_default_pls()
+
+ def create_managed_prefix_list(
+ self,
+ address_family=None,
+ entry=None,
+ max_entries=None,
+ prefix_list_name=None,
+ tags=None,
+ owner_id=None,
+ ):
+ managed_prefix_list = ManagedPrefixList(
+ self,
+ address_family=address_family,
+ entry=entry,
+ max_entries=max_entries,
+ prefix_list_name=prefix_list_name,
+ region=self.region_name,
+ tags=tags,
+ owner_id=owner_id,
+ )
+ self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
+ return managed_prefix_list
+
+ def describe_managed_prefix_lists(self, prefix_list_ids=None, filters=None):
+ managed_prefix_lists = list(self.managed_prefix_lists.copy().values())
+ attr_pairs = (
+ ("owner-id", "owner_id"),
+ ("prefix-list-id", "id"),
+ ("prefix-list-name", "prefix_list_name"),
+ )
+
+ if prefix_list_ids:
+ managed_prefix_lists = [
+ managed_prefix_list
+ for managed_prefix_list in managed_prefix_lists
+ if managed_prefix_list.id in prefix_list_ids
+ ]
+
+ result = managed_prefix_lists
+ if filters:
+ result = filter_resources(result, filters, attr_pairs)
+ result = describe_tag_filter(filters, result)
+
+ for item in result.copy():
+ if not item.delete_counter:
+ self.managed_prefix_lists.pop(item.id, None)
+ result.remove(item)
+ if item.state == "delete-complete":
+ item.delete_counter -= 1
+ return result
+
+ def get_managed_prefix_list_entries(self, prefix_list_id=None):
+ managed_prefix_list = self.managed_prefix_lists.get(prefix_list_id)
+ return managed_prefix_list
+
+ def delete_managed_prefix_list(self, prefix_list_id):
+ managed_prefix_list = self.managed_prefix_lists.get(prefix_list_id)
+ managed_prefix_list.state = "delete-complete"
+ return managed_prefix_list
+
+ def modify_managed_prefix_list(
+ self,
+ add_entry=None,
+ prefix_list_id=None,
+ current_version=None,
+ prefix_list_name=None,
+ remove_entry=None,
+ ):
+ managed_pl = self.managed_prefix_lists.get(prefix_list_id)
+ managed_pl.prefix_list_name = prefix_list_name
+ if remove_entry or add_entry:
+ latest_version = managed_pl.entries.get(managed_pl.version)
+ entries = (
+ managed_pl.entries.get(current_version, latest_version).copy()
+ if managed_pl.entries
+ else []
+ )
+ for item in entries.copy():
+ if item.get("Cidr", "") in remove_entry:
+ entries.remove(item)
+
+ for item in add_entry:
+ if item not in entries.copy():
+ entries.append(item)
+ managed_pl.version += 1
+ managed_pl.entries[managed_pl.version] = entries
+ managed_pl.state = "modify-complete"
+ return managed_pl
+
+ def create_default_pls(self):
+ entry = [
+ {"Cidr": "52.216.0.0/15", "Description": "default"},
+ {"Cidr": "3.5.0.0/19", "Description": "default"},
+ {"Cidr": "54.231.0.0/16", "Description": "default"},
+ ]
+
+ managed_prefix_list = self.create_managed_prefix_list(
+ address_family="IPv4",
+ entry=entry,
+ prefix_list_name="com.amazonaws.{}.s3".format(self.region_name),
+ owner_id="aws",
+ )
+ managed_prefix_list.version = None
+ managed_prefix_list.max_entries = None
+ self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
+
+ entry = [
+ {"Cidr": "3.218.182.0/24", "Description": "default"},
+ {"Cidr": "3.218.180.0/23", "Description": "default"},
+ {"Cidr": "52.94.0.0/22", "Description": "default"},
+ {"Cidr": "52.119.224.0/20", "Description": "default"},
+ ]
+
+ managed_prefix_list = self.create_managed_prefix_list(
+ address_family="IPv4",
+ entry=entry,
+ prefix_list_name="com.amazonaws.{}.dynamodb".format(self.region_name),
+ owner_id="aws",
+ )
+ managed_prefix_list.version = None
+ managed_prefix_list.max_entries = None
+ self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
diff --git a/contrib/python/moto/py3/moto/ec2/models/nat_gateways.py b/contrib/python/moto/py3/moto/ec2/models/nat_gateways.py
new file mode 100644
index 0000000000..ecfe3abbff
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/nat_gateways.py
@@ -0,0 +1,144 @@
+from datetime import datetime
+
+from moto.core import CloudFormationModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds
+from .core import TaggedEC2Resource
+from ..utils import random_nat_gateway_id, random_private_ip
+
+
+class NatGateway(CloudFormationModel, TaggedEC2Resource):
+ def __init__(
+ self,
+ backend,
+ subnet_id,
+ allocation_id,
+ tags=None,
+ connectivity_type="public",
+ address_set=None,
+ ):
+ # public properties
+ self.id = random_nat_gateway_id()
+ self.subnet_id = subnet_id
+ self.address_set = address_set or []
+ self.state = "available"
+ self.private_ip = random_private_ip()
+ self.connectivity_type = connectivity_type
+
+ # protected properties
+ self._created_at = datetime.utcnow()
+ self.ec2_backend = backend
+ # NOTE: this is the core of NAT Gateways creation
+ self._eni = self.ec2_backend.create_network_interface(
+ backend.get_subnet(self.subnet_id), self.private_ip
+ )
+
+ # associate allocation with ENI
+ if allocation_id and connectivity_type != "private":
+ self.ec2_backend.associate_address(
+ eni=self._eni, allocation_id=allocation_id
+ )
+ self.add_tags(tags or {})
+ self.vpc_id = self.ec2_backend.get_subnet(subnet_id).vpc_id
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def create_time(self):
+ return iso_8601_datetime_with_milliseconds(self._created_at)
+
+ @property
+ def network_interface_id(self):
+ return self._eni.id
+
+ @property
+ def public_ip(self):
+ if self.allocation_id:
+ eips = self._backend.address_by_allocation([self.allocation_id])
+ return eips[0].public_ip if self.allocation_id else None
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html
+ return "AWS::EC2::NatGateway"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+ nat_gateway = ec2_backend.create_nat_gateway(
+ cloudformation_json["Properties"]["SubnetId"],
+ cloudformation_json["Properties"]["AllocationId"],
+ )
+ return nat_gateway
+
+
+class NatGatewayBackend:
+ def __init__(self):
+ self.nat_gateways = {}
+
+ def describe_nat_gateways(self, filters, nat_gateway_ids):
+ nat_gateways = list(self.nat_gateways.values())
+
+ if nat_gateway_ids:
+ nat_gateways = [item for item in nat_gateways if item.id in nat_gateway_ids]
+
+ if filters is not None:
+ if filters.get("nat-gateway-id") is not None:
+ nat_gateways = [
+ nat_gateway
+ for nat_gateway in nat_gateways
+ if nat_gateway.id in filters["nat-gateway-id"]
+ ]
+ if filters.get("vpc-id") is not None:
+ nat_gateways = [
+ nat_gateway
+ for nat_gateway in nat_gateways
+ if nat_gateway.vpc_id in filters["vpc-id"]
+ ]
+ if filters.get("subnet-id") is not None:
+ nat_gateways = [
+ nat_gateway
+ for nat_gateway in nat_gateways
+ if nat_gateway.subnet_id in filters["subnet-id"]
+ ]
+ if filters.get("state") is not None:
+ nat_gateways = [
+ nat_gateway
+ for nat_gateway in nat_gateways
+ if nat_gateway.state in filters["state"]
+ ]
+
+ return nat_gateways
+
+ def create_nat_gateway(
+ self, subnet_id, allocation_id, tags=None, connectivity_type="public"
+ ):
+ nat_gateway = NatGateway(
+ self, subnet_id, allocation_id, tags, connectivity_type
+ )
+ address_set = {}
+ if allocation_id:
+ eips = self.address_by_allocation([allocation_id])
+ eip = eips[0] if len(eips) > 0 else None
+ if eip:
+ address_set["allocationId"] = allocation_id
+ address_set["publicIp"] = eip.public_ip or None
+ address_set["networkInterfaceId"] = nat_gateway._eni.id
+ address_set["privateIp"] = nat_gateway._eni.private_ip_address
+ nat_gateway.address_set.append(address_set)
+ self.nat_gateways[nat_gateway.id] = nat_gateway
+ return nat_gateway
+
+ def delete_nat_gateway(self, nat_gateway_id):
+ nat_gw = self.nat_gateways.get(nat_gateway_id)
+ nat_gw.state = "deleted"
+ return nat_gw
diff --git a/contrib/python/moto/py3/moto/ec2/models/network_acls.py b/contrib/python/moto/py3/moto/ec2/models/network_acls.py
new file mode 100644
index 0000000000..f060be55d2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/network_acls.py
@@ -0,0 +1,273 @@
+from moto.core import get_account_id
+from ..exceptions import (
+ InvalidNetworkAclIdError,
+ InvalidRouteTableIdError,
+ NetworkAclEntryAlreadyExistsError,
+)
+from .core import TaggedEC2Resource
+from ..utils import (
+ generic_filter,
+ random_network_acl_id,
+ random_network_acl_subnet_association_id,
+)
+
+
+OWNER_ID = get_account_id()
+
+
+class NetworkAclBackend:
+ def __init__(self):
+ self.network_acls = {}
+
+ def get_network_acl(self, network_acl_id):
+ network_acl = self.network_acls.get(network_acl_id, None)
+ if not network_acl:
+ raise InvalidNetworkAclIdError(network_acl_id)
+ return network_acl
+
+ def create_network_acl(self, vpc_id, tags=None, default=False):
+ network_acl_id = random_network_acl_id()
+ self.get_vpc(vpc_id)
+ network_acl = NetworkAcl(self, network_acl_id, vpc_id, default)
+ for tag in tags or []:
+ network_acl.add_tag(tag.get("Key"), tag.get("Value"))
+ self.network_acls[network_acl_id] = network_acl
+ if default:
+ self.add_default_entries(network_acl_id)
+ return network_acl
+
+ def add_default_entries(self, network_acl_id):
+ default_acl_entries = [
+ {"rule_number": "100", "rule_action": "allow", "egress": "true"},
+ {"rule_number": "32767", "rule_action": "deny", "egress": "true"},
+ {"rule_number": "100", "rule_action": "allow", "egress": "false"},
+ {"rule_number": "32767", "rule_action": "deny", "egress": "false"},
+ ]
+ for entry in default_acl_entries:
+ self.create_network_acl_entry(
+ network_acl_id=network_acl_id,
+ rule_number=entry["rule_number"],
+ protocol="-1",
+ rule_action=entry["rule_action"],
+ egress=entry["egress"],
+ cidr_block="0.0.0.0/0",
+ icmp_code=None,
+ icmp_type=None,
+ port_range_from=None,
+ port_range_to=None,
+ )
+
+ def get_all_network_acls(self, network_acl_ids=None, filters=None):
+ self.describe_network_acls(network_acl_ids, filters)
+
+ def delete_network_acl(self, network_acl_id):
+ deleted = self.network_acls.pop(network_acl_id, None)
+ if not deleted:
+ raise InvalidNetworkAclIdError(network_acl_id)
+ return deleted
+
+ def create_network_acl_entry(
+ self,
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ ):
+
+ network_acl = self.get_network_acl(network_acl_id)
+ if any(
+ entry.egress == egress and entry.rule_number == rule_number
+ for entry in network_acl.network_acl_entries
+ ):
+ raise NetworkAclEntryAlreadyExistsError(rule_number)
+ network_acl_entry = NetworkAclEntry(
+ self,
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ )
+
+ network_acl.network_acl_entries.append(network_acl_entry)
+ return network_acl_entry
+
+ def delete_network_acl_entry(self, network_acl_id, rule_number, egress):
+ network_acl = self.get_network_acl(network_acl_id)
+ entry = next(
+ entry
+ for entry in network_acl.network_acl_entries
+ if entry.egress == egress and entry.rule_number == rule_number
+ )
+ if entry is not None:
+ network_acl.network_acl_entries.remove(entry)
+ return entry
+
+ def replace_network_acl_entry(
+ self,
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ ):
+
+ self.delete_network_acl_entry(network_acl_id, rule_number, egress)
+ network_acl_entry = self.create_network_acl_entry(
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ )
+ return network_acl_entry
+
+ def replace_network_acl_association(self, association_id, network_acl_id):
+
+ # lookup existing association for subnet and delete it
+ default_acl = next(
+ value
+ for key, value in self.network_acls.items()
+ if association_id in value.associations.keys()
+ )
+
+ subnet_id = None
+ for key in default_acl.associations:
+ if key == association_id:
+ subnet_id = default_acl.associations[key].subnet_id
+ del default_acl.associations[key]
+ break
+
+ new_assoc_id = random_network_acl_subnet_association_id()
+ association = NetworkAclAssociation(
+ self, new_assoc_id, subnet_id, network_acl_id
+ )
+ new_acl = self.get_network_acl(network_acl_id)
+ new_acl.associations[new_assoc_id] = association
+ return association
+
+ def associate_default_network_acl_with_subnet(self, subnet_id, vpc_id):
+ association_id = random_network_acl_subnet_association_id()
+ acl = next(
+ acl
+ for acl in self.network_acls.values()
+ if acl.default and acl.vpc_id == vpc_id
+ )
+ acl.associations[association_id] = NetworkAclAssociation(
+ self, association_id, subnet_id, acl.id
+ )
+
+ def describe_network_acls(self, network_acl_ids=None, filters=None):
+ network_acls = self.network_acls.copy().values()
+
+ if network_acl_ids:
+ network_acls = [
+ network_acl
+ for network_acl in network_acls
+ if network_acl.id in network_acl_ids
+ ]
+ if len(network_acls) != len(network_acl_ids):
+ invalid_id = list(
+ set(network_acl_ids).difference(
+ set([network_acl.id for network_acl in network_acls])
+ )
+ )[0]
+ raise InvalidRouteTableIdError(invalid_id)
+
+ return generic_filter(filters, network_acls)
+
+
+class NetworkAclAssociation(object):
+ def __init__(self, ec2_backend, new_association_id, subnet_id, network_acl_id):
+ self.ec2_backend = ec2_backend
+ self.id = new_association_id
+ self.new_association_id = new_association_id
+ self.subnet_id = subnet_id
+ self.network_acl_id = network_acl_id
+ super().__init__()
+
+
+class NetworkAcl(TaggedEC2Resource):
+ def __init__(
+ self, ec2_backend, network_acl_id, vpc_id, default=False, owner_id=OWNER_ID
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = network_acl_id
+ self.vpc_id = vpc_id
+ self.owner_id = owner_id
+ self.network_acl_entries = []
+ self.associations = {}
+ self.default = "true" if default is True else "false"
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "default":
+ return self.default
+ elif filter_name == "vpc-id":
+ return self.vpc_id
+ elif filter_name == "association.network-acl-id":
+ return self.id
+ elif filter_name == "association.subnet-id":
+ return [assoc.subnet_id for assoc in self.associations.values()]
+ elif filter_name == "entry.cidr":
+ return [entry.cidr_block for entry in self.network_acl_entries]
+ elif filter_name == "entry.protocol":
+ return [entry.protocol for entry in self.network_acl_entries]
+ elif filter_name == "entry.rule-number":
+ return [entry.rule_number for entry in self.network_acl_entries]
+ elif filter_name == "entry.rule-action":
+ return [entry.rule_action for entry in self.network_acl_entries]
+ elif filter_name == "entry.egress":
+ return [entry.egress for entry in self.network_acl_entries]
+ elif filter_name == "owner-id":
+ return self.owner_id
+ else:
+ return super().get_filter_value(filter_name, "DescribeNetworkAcls")
+
+
+class NetworkAclEntry(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ ):
+ self.ec2_backend = ec2_backend
+ self.network_acl_id = network_acl_id
+ self.rule_number = rule_number
+ self.protocol = protocol
+ self.rule_action = rule_action
+ self.egress = egress
+ self.cidr_block = cidr_block
+ self.icmp_code = icmp_code
+ self.icmp_type = icmp_type
+ self.port_range_from = port_range_from
+ self.port_range_to = port_range_to
diff --git a/contrib/python/moto/py3/moto/ec2/models/route_tables.py b/contrib/python/moto/py3/moto/ec2/models/route_tables.py
new file mode 100644
index 0000000000..376eed1ede
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/route_tables.py
@@ -0,0 +1,442 @@
+import ipaddress
+from moto.core import get_account_id, CloudFormationModel
+from .core import TaggedEC2Resource
+from ..exceptions import (
+ DependencyViolationError,
+ InvalidRouteError,
+ InvalidRouteTableIdError,
+ InvalidAssociationIdError,
+ InvalidDestinationCIDRBlockParameterError,
+)
+from ..utils import (
+ EC2_RESOURCE_TO_PREFIX,
+ generate_route_id,
+ generic_filter,
+ random_subnet_association_id,
+ random_route_table_id,
+ split_route_id,
+)
+
+
+class RouteTable(TaggedEC2Resource, CloudFormationModel):
+ def __init__(self, ec2_backend, route_table_id, vpc_id, main=False):
+ self.ec2_backend = ec2_backend
+ self.id = route_table_id
+ self.vpc_id = vpc_id
+ self.main = main
+ self.main_association = random_subnet_association_id()
+ self.associations = {}
+ self.routes = {}
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html
+ return "AWS::EC2::RouteTable"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ vpc_id = properties["VpcId"]
+ ec2_backend = ec2_backends[region_name]
+ route_table = ec2_backend.create_route_table(vpc_id=vpc_id)
+ return route_table
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "association.main":
+ # Note: Boto only supports 'true'.
+ # https://github.com/boto/boto/issues/1742
+ if self.main:
+ return "true"
+ else:
+ return "false"
+ elif filter_name == "route-table-id":
+ return self.id
+ elif filter_name == "vpc-id":
+ return self.vpc_id
+ elif filter_name == "association.route-table-id":
+ return self.id
+ elif filter_name == "association.route-table-association-id":
+ return self.associations.keys()
+ elif filter_name == "association.subnet-id":
+ return self.associations.values()
+ elif filter_name == "route.gateway-id":
+ return [
+ route.gateway.id
+ for route in self.routes.values()
+ if route.gateway is not None
+ ]
+ else:
+ return super().get_filter_value(filter_name, "DescribeRouteTables")
+
+
+class RouteTableBackend:
+ def __init__(self):
+ self.route_tables = {}
+
+ def create_route_table(self, vpc_id, tags=None, main=False):
+ route_table_id = random_route_table_id()
+ vpc = self.get_vpc(vpc_id) # Validate VPC exists
+ route_table = RouteTable(self, route_table_id, vpc_id, main=main)
+ for tag in tags or []:
+ route_table.add_tag(tag.get("Key"), tag.get("Value"))
+ self.route_tables[route_table_id] = route_table
+
+ # creating default routes for ipv4 cirds
+ ipv4_cidrs = vpc.get_cidr_block_association_set(ipv6=False)
+ for ipv4_cidr in ipv4_cidrs:
+ self.create_route(route_table_id, ipv4_cidr.get("cidr_block"), local=True)
+
+ # creating default routes for ipv6 cidrs
+ ipv6_cidrs = vpc.get_cidr_block_association_set(ipv6=True)
+ for ipv6_cidr in ipv6_cidrs:
+ self.create_route(
+ route_table_id,
+ destination_cidr_block=None,
+ local=True,
+ destination_ipv6_cidr_block=ipv6_cidr.get("cidr_block"),
+ )
+
+ return route_table
+
+ def get_route_table(self, route_table_id):
+ route_table = self.route_tables.get(route_table_id, None)
+ if not route_table:
+ raise InvalidRouteTableIdError(route_table_id)
+ return route_table
+
+ def describe_route_tables(self, route_table_ids=None, filters=None):
+ route_tables = self.route_tables.copy().values()
+
+ if route_table_ids:
+ route_tables = [
+ route_table
+ for route_table in route_tables
+ if route_table.id in route_table_ids
+ ]
+ if len(route_tables) != len(route_table_ids):
+ invalid_id = list(
+ set(route_table_ids).difference(
+ set([route_table.id for route_table in route_tables])
+ )
+ )[0]
+ raise InvalidRouteTableIdError(invalid_id)
+
+ return generic_filter(filters, route_tables)
+
+ def delete_route_table(self, route_table_id):
+ route_table = self.get_route_table(route_table_id)
+ if route_table.associations:
+ raise DependencyViolationError(
+ "The routeTable '{0}' has dependencies and cannot be deleted.".format(
+ route_table_id
+ )
+ )
+ self.route_tables.pop(route_table_id)
+ return True
+
+ def associate_route_table(self, route_table_id, gateway_id=None, subnet_id=None):
+ # Idempotent if association already exists.
+ route_tables_by_subnet = self.describe_route_tables(
+ filters={"association.subnet-id": [subnet_id]}
+ )
+ if route_tables_by_subnet:
+ for association_id, check_subnet_id in route_tables_by_subnet[
+ 0
+ ].associations.items():
+ if subnet_id == check_subnet_id:
+ return association_id
+
+ # Association does not yet exist, so create it.
+ route_table = self.get_route_table(route_table_id)
+ if gateway_id is None:
+ self.get_subnet(subnet_id) # Validate subnet exists
+ association_id = random_subnet_association_id()
+ route_table.associations[association_id] = subnet_id
+ return association_id
+ if subnet_id is None:
+ association_id = random_subnet_association_id()
+ route_table.associations[association_id] = gateway_id
+ return association_id
+
+ def disassociate_route_table(self, association_id):
+ for route_table in self.route_tables.values():
+ if association_id in route_table.associations:
+ return route_table.associations.pop(association_id, None)
+ raise InvalidAssociationIdError(association_id)
+
+ def replace_route_table_association(self, association_id, route_table_id):
+ # Idempotent if association already exists.
+ new_route_table = self.get_route_table(route_table_id)
+ if association_id in new_route_table.associations:
+ return association_id
+
+ # Find route table which currently has the association, error if none.
+ route_tables_by_association_id = self.describe_route_tables(
+ filters={"association.route-table-association-id": [association_id]}
+ )
+ if not route_tables_by_association_id:
+ raise InvalidAssociationIdError(association_id)
+
+ # Remove existing association, create new one.
+ previous_route_table = route_tables_by_association_id[0]
+ subnet_id = previous_route_table.associations.pop(association_id, None)
+ return self.associate_route_table(route_table_id, subnet_id)
+
+
+# TODO: refractor to isloate class methods from backend logic
+class Route(CloudFormationModel):
+ def __init__(
+ self,
+ route_table,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list=None,
+ local=False,
+ gateway=None,
+ instance=None,
+ nat_gateway=None,
+ egress_only_igw=None,
+ transit_gateway=None,
+ interface=None,
+ vpc_pcx=None,
+ carrier_gateway=None,
+ ):
+ self.id = generate_route_id(
+ route_table.id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list.id if destination_prefix_list else None,
+ )
+ self.route_table = route_table
+ self.destination_cidr_block = destination_cidr_block
+ self.destination_ipv6_cidr_block = destination_ipv6_cidr_block
+ self.destination_prefix_list = destination_prefix_list
+ self.local = local
+ self.gateway = gateway
+ self.instance = instance
+ self.nat_gateway = nat_gateway
+ self.egress_only_igw = egress_only_igw
+ self.transit_gateway = transit_gateway
+ self.interface = interface
+ self.vpc_pcx = vpc_pcx
+ self.carrier_gateway = carrier_gateway
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html
+ return "AWS::EC2::Route"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ gateway_id = properties.get("GatewayId")
+ instance_id = properties.get("InstanceId")
+ interface_id = properties.get("NetworkInterfaceId")
+ nat_gateway_id = properties.get("NatGatewayId")
+ egress_only_igw_id = properties.get("EgressOnlyInternetGatewayId")
+ transit_gateway_id = properties.get("TransitGatewayId")
+ pcx_id = properties.get("VpcPeeringConnectionId")
+
+ route_table_id = properties["RouteTableId"]
+ ec2_backend = ec2_backends[region_name]
+ route_table = ec2_backend.create_route(
+ route_table_id=route_table_id,
+ destination_cidr_block=properties.get("DestinationCidrBlock"),
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ nat_gateway_id=nat_gateway_id,
+ egress_only_igw_id=egress_only_igw_id,
+ transit_gateway_id=transit_gateway_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id,
+ )
+ return route_table
+
+
+class RouteBackend:
+ def create_route(
+ self,
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block=None,
+ destination_prefix_list_id=None,
+ local=False,
+ gateway_id=None,
+ instance_id=None,
+ nat_gateway_id=None,
+ egress_only_igw_id=None,
+ transit_gateway_id=None,
+ interface_id=None,
+ vpc_peering_connection_id=None,
+ carrier_gateway_id=None,
+ ):
+ gateway = None
+ nat_gateway = None
+ transit_gateway = None
+ egress_only_igw = None
+ interface = None
+ destination_prefix_list = None
+ carrier_gateway = None
+
+ route_table = self.get_route_table(route_table_id)
+
+ if interface_id:
+ # for validating interface Id whether it is valid or not.
+ interface = self.get_network_interface(interface_id)
+
+ else:
+ if gateway_id:
+ if EC2_RESOURCE_TO_PREFIX["vpn-gateway"] in gateway_id:
+ gateway = self.get_vpn_gateway(gateway_id)
+ elif EC2_RESOURCE_TO_PREFIX["internet-gateway"] in gateway_id:
+ gateway = self.get_internet_gateway(gateway_id)
+ elif EC2_RESOURCE_TO_PREFIX["vpc-endpoint"] in gateway_id:
+ gateway = self.get_vpc_end_point(gateway_id)
+
+ try:
+ if destination_cidr_block:
+ ipaddress.IPv4Network(str(destination_cidr_block), strict=False)
+ except ValueError:
+ raise InvalidDestinationCIDRBlockParameterError(destination_cidr_block)
+
+ if nat_gateway_id is not None:
+ nat_gateway = self.nat_gateways.get(nat_gateway_id)
+ if egress_only_igw_id is not None:
+ egress_only_igw = self.get_egress_only_igw(egress_only_igw_id)
+ if transit_gateway_id is not None:
+ transit_gateway = self.transit_gateways.get(transit_gateway_id)
+ if destination_prefix_list_id is not None:
+ destination_prefix_list = self.managed_prefix_lists.get(
+ destination_prefix_list_id
+ )
+ if carrier_gateway_id is not None:
+ carrier_gateway = self.carrier_gateways.get(carrier_gateway_id)
+
+ route = Route(
+ route_table,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list,
+ local=local,
+ gateway=gateway,
+ instance=self.get_instance(instance_id) if instance_id else None,
+ nat_gateway=nat_gateway,
+ egress_only_igw=egress_only_igw,
+ transit_gateway=transit_gateway,
+ interface=interface,
+ carrier_gateway=carrier_gateway,
+ vpc_pcx=self.get_vpc_peering_connection(vpc_peering_connection_id)
+ if vpc_peering_connection_id
+ else None,
+ )
+ route_table.routes[route.id] = route
+ return route
+
+ def replace_route(
+ self,
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block=None,
+ destination_prefix_list_id=None,
+ nat_gateway_id=None,
+ egress_only_igw_id=None,
+ transit_gateway_id=None,
+ gateway_id=None,
+ instance_id=None,
+ interface_id=None,
+ vpc_peering_connection_id=None,
+ ):
+ route_table = self.get_route_table(route_table_id)
+ route_id = generate_route_id(
+ route_table.id, destination_cidr_block, destination_ipv6_cidr_block
+ )
+ route = route_table.routes[route_id]
+
+ if interface_id:
+ self.raise_not_implemented_error("ReplaceRoute to NetworkInterfaceId")
+
+ route.gateway = None
+ route.nat_gateway = None
+ route.egress_only_igw = None
+ route.transit_gateway = None
+ if gateway_id:
+ if EC2_RESOURCE_TO_PREFIX["vpn-gateway"] in gateway_id:
+ route.gateway = self.get_vpn_gateway(gateway_id)
+ elif EC2_RESOURCE_TO_PREFIX["internet-gateway"] in gateway_id:
+ route.gateway = self.get_internet_gateway(gateway_id)
+
+ if nat_gateway_id is not None:
+ route.nat_gateway = self.nat_gateways.get(nat_gateway_id)
+ if egress_only_igw_id is not None:
+ route.egress_only_igw = self.get_egress_only_igw(egress_only_igw_id)
+ if transit_gateway_id is not None:
+ route.transit_gateway = self.transit_gateways.get(transit_gateway_id)
+ if destination_prefix_list_id is not None:
+ route.prefix_list = self.managed_prefix_lists.get(
+ destination_prefix_list_id
+ )
+
+ route.instance = self.get_instance(instance_id) if instance_id else None
+ route.interface = None
+ route.vpc_pcx = (
+ self.get_vpc_peering_connection(vpc_peering_connection_id)
+ if vpc_peering_connection_id
+ else None
+ )
+
+ route_table.routes[route.id] = route
+ return route
+
+ def get_route(self, route_id):
+ route_table_id, _ = split_route_id(route_id)
+ route_table = self.get_route_table(route_table_id)
+ return route_table.get(route_id)
+
+ def delete_route(
+ self,
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block=None,
+ destination_prefix_list_id=None,
+ ):
+ cidr = destination_cidr_block
+ route_table = self.get_route_table(route_table_id)
+ if destination_ipv6_cidr_block:
+ cidr = destination_ipv6_cidr_block
+ if destination_prefix_list_id:
+ cidr = destination_prefix_list_id
+ route_id = generate_route_id(route_table_id, cidr)
+ deleted = route_table.routes.pop(route_id, None)
+ if not deleted:
+ raise InvalidRouteError(route_table_id, cidr)
+ return deleted
diff --git a/contrib/python/moto/py3/moto/ec2/models/security_groups.py b/contrib/python/moto/py3/moto/ec2/models/security_groups.py
new file mode 100644
index 0000000000..0e4e224755
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/security_groups.py
@@ -0,0 +1,1121 @@
+import copy
+import itertools
+import json
+from collections import defaultdict
+
+from moto.core import get_account_id, CloudFormationModel
+from moto.core.utils import aws_api_matches
+from ..exceptions import (
+ DependencyViolationError,
+ InvalidCIDRSubnetError,
+ InvalidPermissionNotFoundError,
+ InvalidPermissionDuplicateError,
+ InvalidSecurityGroupDuplicateError,
+ InvalidSecurityGroupNotFoundError,
+ MissingParameterError,
+ MotoNotImplementedError,
+ RulesPerSecurityGroupLimitExceededError,
+)
+from .core import TaggedEC2Resource
+from ..utils import (
+ random_security_group_id,
+ random_security_group_rule_id,
+ is_valid_cidr,
+ is_valid_ipv6_cidr,
+ is_tag_filter,
+ tag_filter_matches,
+)
+
+
+class SecurityRule(object):
+ def __init__(
+ self,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups,
+ prefix_list_ids=None,
+ ):
+ self.id = random_security_group_rule_id()
+ self.ip_protocol = str(ip_protocol)
+ self.ip_ranges = ip_ranges or []
+ self.source_groups = source_groups or []
+ self.prefix_list_ids = prefix_list_ids or []
+ self.from_port = self.to_port = None
+
+ if self.ip_protocol != "-1":
+ self.from_port = int(from_port)
+ self.to_port = int(to_port)
+
+ ip_protocol_keywords = {
+ "tcp": "tcp",
+ "6": "tcp",
+ "udp": "udp",
+ "17": "udp",
+ "all": "-1",
+ "-1": "-1",
+ "tCp": "tcp",
+ "6": "tcp",
+ "UDp": "udp",
+ "17": "udp",
+ "ALL": "-1",
+ "icMp": "icmp",
+ "1": "icmp",
+ "icmp": "icmp",
+ }
+ proto = ip_protocol_keywords.get(self.ip_protocol.lower())
+ self.ip_protocol = proto if proto else self.ip_protocol
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ def __eq__(self, other):
+ if self.ip_protocol != other.ip_protocol:
+ return False
+ ip_ranges = list(
+ [item for item in self.ip_ranges if item not in other.ip_ranges]
+ + [item for item in other.ip_ranges if item not in self.ip_ranges]
+ )
+ if ip_ranges:
+ return False
+ source_groups = list(
+ [item for item in self.source_groups if item not in other.source_groups]
+ + [item for item in other.source_groups if item not in self.source_groups]
+ )
+ if source_groups:
+ return False
+ prefix_list_ids = list(
+ [item for item in self.prefix_list_ids if item not in other.prefix_list_ids]
+ + [
+ item
+ for item in other.prefix_list_ids
+ if item not in self.prefix_list_ids
+ ]
+ )
+ if prefix_list_ids:
+ return False
+ if self.ip_protocol != "-1":
+ if self.from_port != other.from_port:
+ return False
+ if self.to_port != other.to_port:
+ return False
+
+ return True
+
+
+class SecurityGroup(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ group_id,
+ name,
+ description,
+ vpc_id=None,
+ tags=None,
+ is_default=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = group_id
+ self.group_id = self.id
+ self.name = name
+ self.group_name = self.name
+ self.description = description
+ self.ingress_rules = []
+ self.egress_rules = []
+ self.enis = {}
+ self.vpc_id = vpc_id
+ self.owner_id = get_account_id()
+ self.add_tags(tags or {})
+ self.is_default = is_default or False
+
+ # Append default IPv6 egress rule for VPCs with IPv6 support
+ if vpc_id:
+ vpc = self.ec2_backend.vpcs.get(vpc_id)
+ if vpc:
+ self.egress_rules.append(
+ SecurityRule("-1", None, None, [{"CidrIp": "0.0.0.0/0"}], [])
+ )
+ if vpc and len(vpc.get_cidr_block_association_set(ipv6=True)) > 0:
+ self.egress_rules.append(
+ SecurityRule("-1", None, None, [{"CidrIpv6": "::/0"}], [])
+ )
+
+ # each filter as a simple function in a mapping
+
+ self.filters = {
+ "description": self.filter_description,
+ "egress.ip-permission.cidr": self.filter_egress__ip_permission__cidr,
+ "egress.ip-permission.from-port": self.filter_egress__ip_permission__from_port,
+ "egress.ip-permission.group-id": self.filter_egress__ip_permission__group_id,
+ "egress.ip-permission.group-name": self.filter_egress__ip_permission__group_name,
+ "egress.ip-permission.ipv6-cidr": self.filter_egress__ip_permission__ipv6_cidr,
+ "egress.ip-permission.prefix-list-id": self.filter_egress__ip_permission__prefix_list_id,
+ "egress.ip-permission.protocol": self.filter_egress__ip_permission__protocol,
+ "egress.ip-permission.to-port": self.filter_egress__ip_permission__to_port,
+ "egress.ip-permission.user-id": self.filter_egress__ip_permission__user_id,
+ "group-id": self.filter_group_id,
+ "group-name": self.filter_group_name,
+ "ip-permission.cidr": self.filter_ip_permission__cidr,
+ "ip-permission.from-port": self.filter_ip_permission__from_port,
+ "ip-permission.group-id": self.filter_ip_permission__group_id,
+ "ip-permission.group-name": self.filter_ip_permission__group_name,
+ "ip-permission.ipv6-cidr": self.filter_ip_permission__ipv6_cidr,
+ "ip-permission.prefix-list-id": self.filter_ip_permission__prefix_list_id,
+ "ip-permission.protocol": self.filter_ip_permission__protocol,
+ "ip-permission.to-port": self.filter_ip_permission__to_port,
+ "ip-permission.user-id": self.filter_ip_permission__user_id,
+ "owner-id": self.filter_owner_id,
+ "vpc-id": self.filter_vpc_id,
+ }
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "GroupName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-securitygroup.html
+ return "AWS::EC2::SecurityGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ vpc_id = properties.get("VpcId")
+ security_group = ec2_backend.create_security_group(
+ name=resource_name,
+ description=properties.get("GroupDescription"),
+ vpc_id=vpc_id,
+ )
+
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ security_group.add_tag(tag_key, tag_value)
+
+ for ingress_rule in properties.get("SecurityGroupIngress", []):
+ source_group_id = ingress_rule.get("SourceSecurityGroupId")
+ source_group_name = ingress_rule.get("SourceSecurityGroupName")
+ source_group = {}
+ if source_group_id:
+ source_group["GroupId"] = source_group_id
+ if source_group_name:
+ source_group["GroupName"] = source_group_name
+
+ ec2_backend.authorize_security_group_ingress(
+ group_name_or_id=security_group.id,
+ ip_protocol=ingress_rule["IpProtocol"],
+ from_port=ingress_rule["FromPort"],
+ to_port=ingress_rule["ToPort"],
+ ip_ranges=ingress_rule.get("CidrIp"),
+ source_groups=[source_group] if source_group else [],
+ vpc_id=vpc_id,
+ )
+
+ return security_group
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls._delete_security_group_given_vpc_id(
+ original_resource.name, original_resource.vpc_id, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ vpc_id = properties.get("VpcId")
+ cls._delete_security_group_given_vpc_id(resource_name, vpc_id, region_name)
+
+ @classmethod
+ def _delete_security_group_given_vpc_id(cls, resource_name, vpc_id, region_name):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+ security_group = ec2_backend.get_security_group_by_name_or_id(
+ resource_name, vpc_id
+ )
+ if security_group:
+ security_group.delete(region_name)
+
+ def delete(self, region_name): # pylint: disable=unused-argument
+ """Not exposed as part of the ELB API - used for CloudFormation."""
+ self.ec2_backend.delete_security_group(group_id=self.id)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def filter_description(self, values):
+ for value in values:
+ if aws_api_matches(value, self.description):
+ return True
+ return False
+
+ def filter_egress__ip_permission__cidr(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ for cidr in rule.ip_ranges:
+ if aws_api_matches(value, cidr.get("CidrIp", "NONE")):
+ return True
+ return False
+
+ def filter_egress__ip_permission__from_port(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ if rule.ip_protocol != -1 and aws_api_matches(
+ value, str(rule.from_port)
+ ):
+ return True
+ return False
+
+ def filter_egress__ip_permission__group_id(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ for sg in rule.source_groups:
+ if aws_api_matches(value, sg.get("GroupId", None)):
+ return True
+ return False
+
+ def filter_egress__ip_permission__group_name(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ for group in rule.source_groups:
+ if aws_api_matches(value, group.get("GroupName", None)):
+ return True
+ return False
+
+ def filter_egress__ip_permission__ipv6_cidr(self, values):
+ raise MotoNotImplementedError("egress.ip-permission.ipv6-cidr filter")
+
+ def filter_egress__ip_permission__prefix_list_id(self, values):
+ raise MotoNotImplementedError("egress.ip-permission.prefix-list-id filter")
+
+ def filter_egress__ip_permission__protocol(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ if aws_api_matches(value, rule.ip_protocol):
+ return True
+ return False
+
+ def filter_egress__ip_permission__to_port(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ if aws_api_matches(value, rule.to_port):
+ return True
+ return False
+
+ def filter_egress__ip_permission__user_id(self, values):
+ for value in values:
+ for rule in self.egress_rules:
+ if aws_api_matches(value, rule.owner_id):
+ return True
+ return False
+
+ def filter_group_id(self, values):
+ for value in values:
+ if aws_api_matches(value, self.id):
+ return True
+ return False
+
+ def filter_group_name(self, values):
+ for value in values:
+ if aws_api_matches(value, self.group_name):
+ return True
+ return False
+
+ def filter_ip_permission__cidr(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ for cidr in rule.ip_ranges:
+ if aws_api_matches(value, cidr.get("CidrIp", "NONE")):
+ return True
+ return False
+
+ def filter_ip_permission__from_port(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ if aws_api_matches(value, rule.from_port):
+ return True
+ return False
+
+ def filter_ip_permission__group_id(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ for group in rule.source_groups:
+ if aws_api_matches(value, group.get("GroupId", None)):
+ return True
+ return False
+
+ def filter_ip_permission__group_name(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ for group in rule.source_groups:
+ if aws_api_matches(value, group.get("GroupName", None)):
+ return True
+ return False
+
+ def filter_ip_permission__ipv6_cidr(self, values):
+ raise MotoNotImplementedError("ip-permission.ipv6 filter")
+
+ def filter_ip_permission__prefix_list_id(self, values):
+ raise MotoNotImplementedError("ip-permission.prefix-list-id filter")
+
+ def filter_ip_permission__protocol(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ if aws_api_matches(value, rule.protocol):
+ return True
+ return False
+
+ def filter_ip_permission__to_port(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ if aws_api_matches(value, rule.to_port):
+ return True
+ return False
+
+ def filter_ip_permission__user_id(self, values):
+ for value in values:
+ for rule in self.ingress_rules:
+ if aws_api_matches(value, rule.owner_id):
+ return True
+ return False
+
+ def filter_owner_id(self, values):
+ for value in values:
+ if aws_api_matches(value, self.owner_id):
+ return True
+ return False
+
+ def filter_vpc_id(self, values):
+ for value in values:
+ if aws_api_matches(value, self.vpc_id):
+ return True
+ return False
+
+ def matches_filter(self, key, filter_value):
+ if is_tag_filter(key):
+ tag_value = self.get_filter_value(key)
+ if isinstance(filter_value, list):
+ return tag_filter_matches(self, key, filter_value)
+ return tag_value in filter_value
+ else:
+ return self.filters[key](filter_value)
+
+ def matches_filters(self, filters):
+ for key, value in filters.items():
+ if not self.matches_filter(key, value):
+ return False
+ return True
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["GroupId"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "GroupId":
+ return self.id
+ raise UnformattedGetAttTemplateException()
+
+ def add_ingress_rule(self, rule):
+ if rule in self.ingress_rules:
+ raise InvalidPermissionDuplicateError()
+ self.ingress_rules.append(rule)
+
+ def add_egress_rule(self, rule):
+ if rule in self.egress_rules:
+ raise InvalidPermissionDuplicateError()
+ self.egress_rules.append(rule)
+
+ def get_number_of_ingress_rules(self):
+ return sum(
+ len(rule.ip_ranges) + len(rule.source_groups) for rule in self.ingress_rules
+ )
+
+ def get_number_of_egress_rules(self):
+ return sum(
+ len(rule.ip_ranges) + len(rule.source_groups) for rule in self.egress_rules
+ )
+
+
+class SecurityGroupBackend:
+ def __init__(self):
+ # the key in the dict group is the vpc_id or None (non-vpc)
+ self.groups = defaultdict(dict)
+ # This will help us in RuleLimitExceed errors.
+ self.sg_old_ingress_ruls = {}
+ self.sg_old_egress_ruls = {}
+
+ def create_security_group(
+ self, name, description, vpc_id=None, tags=None, force=False, is_default=None
+ ):
+ vpc_id = vpc_id or self.default_vpc.id
+ if not description:
+ raise MissingParameterError("GroupDescription")
+
+ group_id = random_security_group_id()
+ if not force:
+ existing_group = self.get_security_group_by_name_or_id(name, vpc_id)
+ if existing_group:
+ raise InvalidSecurityGroupDuplicateError(name)
+ group = SecurityGroup(
+ self,
+ group_id,
+ name,
+ description,
+ vpc_id=vpc_id,
+ tags=tags,
+ is_default=is_default,
+ )
+
+ self.groups[vpc_id][group_id] = group
+ return group
+
+ def describe_security_groups(self, group_ids=None, groupnames=None, filters=None):
+ all_groups = self.groups.copy()
+ matches = itertools.chain(*[x.copy().values() for x in all_groups.values()])
+ if group_ids:
+ matches = [grp for grp in matches if grp.id in group_ids]
+ if len(group_ids) > len(matches):
+ unknown_ids = set(group_ids) - set(matches)
+ raise InvalidSecurityGroupNotFoundError(unknown_ids)
+ if groupnames:
+ matches = [grp for grp in matches if grp.name in groupnames]
+ if len(groupnames) > len(matches):
+ unknown_names = set(groupnames) - set(matches)
+ raise InvalidSecurityGroupNotFoundError(unknown_names)
+ if filters:
+ matches = [grp for grp in matches if grp.matches_filters(filters)]
+
+ return matches
+
+ def _delete_security_group(self, vpc_id, group_id):
+ vpc_id = vpc_id or self.default_vpc.id
+ if self.groups[vpc_id][group_id].enis:
+ raise DependencyViolationError(
+ "{0} is being utilized by {1}".format(group_id, "ENIs")
+ )
+ return self.groups[vpc_id].pop(group_id)
+
+ def delete_security_group(self, name=None, group_id=None):
+ if group_id:
+ # loop over all the SGs, find the right one
+ for vpc_id, groups in self.groups.items():
+ if group_id in groups:
+ return self._delete_security_group(vpc_id, group_id)
+ raise InvalidSecurityGroupNotFoundError(group_id)
+ elif name:
+ # Group Name. Has to be in standard EC2, VPC needs to be
+ # identified by group_id
+ group = self.get_security_group_by_name_or_id(name)
+ if group:
+ return self._delete_security_group(None, group.id)
+ raise InvalidSecurityGroupNotFoundError(name)
+
+ def get_security_group_from_id(self, group_id):
+ # 2 levels of chaining necessary since it's a complex structure
+ all_groups = itertools.chain.from_iterable(
+ [x.copy().values() for x in self.groups.copy().values()]
+ )
+ for group in all_groups:
+ if group.id == group_id:
+ return group
+
+ def get_security_group_from_name(self, name, vpc_id=None):
+ if vpc_id:
+ for group in self.groups[vpc_id].values():
+ if group.name == name:
+ return group
+ else:
+ for vpc_id in self.groups:
+ for group in self.groups[vpc_id].values():
+ if group.name == name:
+ return group
+
+ def get_security_group_by_name_or_id(self, group_name_or_id, vpc_id=None):
+
+ # try searching by id, fallbacks to name search
+ group = self.get_security_group_from_id(group_name_or_id)
+ if group is None:
+ group = self.get_security_group_from_name(group_name_or_id, vpc_id)
+ return group
+
+ def get_default_security_group(self, vpc_id=None):
+ for group in self.groups[vpc_id or self.default_vpc.id].values():
+ if group.is_default:
+ return group
+
+ def authorize_security_group_ingress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if group is None:
+ raise InvalidSecurityGroupNotFoundError(group_name_or_id)
+ if ip_ranges:
+ if isinstance(ip_ranges, str):
+ ip_ranges = [{"CidrIp": str(ip_ranges)}]
+ elif not isinstance(ip_ranges, list):
+ ip_ranges = [json.loads(ip_ranges)]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if (
+ type(cidr) is dict
+ and not any(
+ [
+ is_valid_cidr(cidr.get("CidrIp", "")),
+ is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
+ ]
+ )
+ ) or (
+ type(cidr) is str
+ and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
+ ):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+
+ self._verify_group_will_respect_rule_count_limit(
+ group, group.get_number_of_ingress_rules(), ip_ranges, source_groups
+ )
+
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+
+ if security_rule in group.ingress_rules:
+ raise InvalidPermissionDuplicateError()
+ # To match drift property of the security rules.
+ # If no rule found then add security_rule as a new rule
+ for rule in group.ingress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ rule.ip_ranges.extend(
+ [
+ item
+ for item in security_rule.ip_ranges
+ if item not in rule.ip_ranges
+ ]
+ )
+ rule.source_groups.extend(
+ [
+ item
+ for item in security_rule.source_groups
+ if item not in rule.source_groups
+ ]
+ )
+ rule.prefix_list_ids.extend(
+ [
+ item
+ for item in security_rule.prefix_list_ids
+ if item not in rule.prefix_list_ids
+ ]
+ )
+ security_rule = rule
+ break
+ else:
+ group.add_ingress_rule(security_rule)
+ return security_rule, group
+
+ def revoke_security_group_ingress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+
+ # To match drift property of the security rules.
+ for rule in group.ingress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ security_rule = copy.deepcopy(rule)
+ security_rule.ip_ranges.extend(
+ [item for item in ip_ranges if item not in rule.ip_ranges]
+ )
+ security_rule.source_groups.extend(
+ [item for item in _source_groups if item not in rule.source_groups]
+ )
+ security_rule.prefix_list_ids.extend(
+ [
+ item
+ for item in prefix_list_ids
+ if item not in rule.prefix_list_ids
+ ]
+ )
+ break
+
+ if security_rule in group.ingress_rules:
+ rule = group.ingress_rules[group.ingress_rules.index(security_rule)]
+ self._remove_items_from_rule(
+ ip_ranges, _source_groups, prefix_list_ids, rule
+ )
+
+ if (
+ not rule.prefix_list_ids
+ and not rule.source_groups
+ and not rule.ip_ranges
+ ):
+ group.ingress_rules.remove(rule)
+ self.sg_old_ingress_ruls[group.id] = group.ingress_rules.copy()
+ return security_rule
+ raise InvalidPermissionNotFoundError()
+
+ def authorize_security_group_egress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if group is None:
+ raise InvalidSecurityGroupNotFoundError(group_name_or_id)
+ if ip_ranges and not isinstance(ip_ranges, list):
+
+ if isinstance(ip_ranges, str) and "CidrIp" not in ip_ranges:
+ ip_ranges = [{"CidrIp": ip_ranges}]
+ else:
+ ip_ranges = [json.loads(ip_ranges)]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if (
+ type(cidr) is dict
+ and not any(
+ [
+ is_valid_cidr(cidr.get("CidrIp", "")),
+ is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
+ ]
+ )
+ ) or (
+ type(cidr) is str
+ and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
+ ):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+ self._verify_group_will_respect_rule_count_limit(
+ group,
+ group.get_number_of_egress_rules(),
+ ip_ranges,
+ source_groups,
+ egress=True,
+ )
+
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+
+ if security_rule in group.egress_rules:
+ raise InvalidPermissionDuplicateError()
+ # To match drift property of the security rules.
+ # If no rule found then add security_rule as a new rule
+ for rule in group.egress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ rule.ip_ranges.extend(
+ [
+ item
+ for item in security_rule.ip_ranges
+ if item not in rule.ip_ranges
+ ]
+ )
+ rule.source_groups.extend(
+ [
+ item
+ for item in security_rule.source_groups
+ if item not in rule.source_groups
+ ]
+ )
+ rule.prefix_list_ids.extend(
+ [
+ item
+ for item in security_rule.prefix_list_ids
+ if item not in rule.prefix_list_ids
+ ]
+ )
+ security_rule = rule
+ break
+ else:
+ group.add_egress_rule(security_rule)
+
+ return security_rule, group
+
+ def revoke_security_group_egress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ # I don't believe this is required after changing the default egress rule
+ # to be {'CidrIp': '0.0.0.0/0'} instead of just '0.0.0.0/0'
+ # Not sure why this would return only the IP if it was 0.0.0.0/0 instead of
+ # the ip_range?
+ # for ip in ip_ranges:
+ # ip_ranges = [ip.get("CidrIp") if ip.get("CidrIp") == "0.0.0.0/0" else ip]
+
+ if group.vpc_id:
+ vpc = self.vpcs.get(group.vpc_id)
+ if vpc and not len(vpc.get_cidr_block_association_set(ipv6=True)) > 0:
+ for item in ip_ranges.copy():
+ if "CidrIpv6" in item:
+ ip_ranges.remove(item)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+
+ # To match drift property of the security rules.
+ # If no rule found then add security_rule as a new rule
+ for rule in group.egress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ security_rule = copy.deepcopy(rule)
+ security_rule.ip_ranges.extend(
+ [item for item in ip_ranges if item not in rule.ip_ranges]
+ )
+ security_rule.source_groups.extend(
+ [item for item in _source_groups if item not in rule.source_groups]
+ )
+ security_rule.prefix_list_ids.extend(
+ [
+ item
+ for item in prefix_list_ids
+ if item not in rule.prefix_list_ids
+ ]
+ )
+ break
+
+ if security_rule in group.egress_rules:
+ rule = group.egress_rules[group.egress_rules.index(security_rule)]
+ self._remove_items_from_rule(
+ ip_ranges, _source_groups, prefix_list_ids, rule
+ )
+ if (
+ not rule.prefix_list_ids
+ and not rule.source_groups
+ and not rule.ip_ranges
+ ):
+ group.egress_rules.remove(rule)
+ self.sg_old_egress_ruls[group.id] = group.egress_rules.copy()
+ return security_rule
+ raise InvalidPermissionNotFoundError()
+
+ def update_security_group_rule_descriptions_ingress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if group is None:
+ raise InvalidSecurityGroupNotFoundError(group_name_or_id)
+ if ip_ranges and not isinstance(ip_ranges, list):
+
+ if isinstance(ip_ranges, str) and "CidrIp" not in ip_ranges:
+ ip_ranges = [{"CidrIp": ip_ranges}]
+ else:
+ ip_ranges = [json.loads(ip_ranges)]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if (
+ type(cidr) is dict
+ and not any(
+ [
+ is_valid_cidr(cidr.get("CidrIp", "")),
+ is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
+ ]
+ )
+ ) or (
+ type(cidr) is str
+ and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
+ ):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+ for rule in group.ingress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ self._sg_update_description(security_rule, rule)
+ return group
+
+ def update_security_group_rule_descriptions_egress(
+ self,
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups=None,
+ prefix_list_ids=None,
+ vpc_id=None,
+ ):
+
+ group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
+ if group is None:
+ raise InvalidSecurityGroupNotFoundError(group_name_or_id)
+ if ip_ranges and not isinstance(ip_ranges, list):
+
+ if isinstance(ip_ranges, str) and "CidrIp" not in ip_ranges:
+ ip_ranges = [{"CidrIp": ip_ranges}]
+ else:
+ ip_ranges = [json.loads(ip_ranges)]
+ if ip_ranges:
+ for cidr in ip_ranges:
+ if (
+ type(cidr) is dict
+ and not any(
+ [
+ is_valid_cidr(cidr.get("CidrIp", "")),
+ is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
+ ]
+ )
+ ) or (
+ type(cidr) is str
+ and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
+ ):
+ raise InvalidCIDRSubnetError(cidr=cidr)
+ _source_groups = self._add_source_group(source_groups, vpc_id)
+
+ security_rule = SecurityRule(
+ ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
+ )
+ for rule in group.egress_rules:
+ if (
+ security_rule.from_port == rule.from_port
+ and security_rule.to_port == rule.to_port
+ and security_rule.ip_protocol == rule.ip_protocol
+ ):
+ self._sg_update_description(security_rule, rule)
+ return group
+
+ def _sg_update_description(self, security_rule, rule):
+ for item in security_rule.ip_ranges:
+ for cidr_item in rule.ip_ranges:
+ if cidr_item.get("CidrIp") == item.get("CidrIp"):
+ cidr_item["Description"] = item.get("Description")
+ if cidr_item.get("CidrIp6") == item.get("CidrIp6"):
+ cidr_item["Description"] = item.get("Description")
+
+ for item in security_rule.source_groups:
+ for source_group in rule.source_groups:
+ if source_group.get("GroupId") == item.get(
+ "GroupId"
+ ) or source_group.get("GroupName") == item.get("GroupName"):
+ source_group["Description"] = item.get("Description")
+
+ for item in security_rule.source_groups:
+ for source_group in rule.source_groups:
+ if source_group.get("GroupId") == item.get(
+ "GroupId"
+ ) or source_group.get("GroupName") == item.get("GroupName"):
+ source_group["Description"] = item.get("Description")
+
+ def _remove_items_from_rule(self, ip_ranges, _source_groups, prefix_list_ids, rule):
+ for item in ip_ranges:
+ if item not in rule.ip_ranges:
+ raise InvalidPermissionNotFoundError()
+ else:
+ rule.ip_ranges.remove(item)
+
+ for item in _source_groups:
+ if item not in rule.source_groups:
+ raise InvalidPermissionNotFoundError()
+ else:
+ rule.source_groups.remove(item)
+
+ for item in prefix_list_ids:
+ if item not in rule.prefix_list_ids:
+ raise InvalidPermissionNotFoundError()
+ else:
+ rule.prefix_list_ids.remove(item)
+ pass
+
+ def _add_source_group(self, source_groups, vpc_id):
+ _source_groups = []
+ for item in source_groups or []:
+ if "OwnerId" not in item:
+ item["OwnerId"] = get_account_id()
+ # for VPCs
+ if "GroupId" in item:
+ if not self.get_security_group_by_name_or_id(
+ item.get("GroupId"), vpc_id
+ ):
+ raise InvalidSecurityGroupNotFoundError(item.get("GroupId"))
+ if "GroupName" in item:
+ source_group = self.get_security_group_by_name_or_id(
+ item.get("GroupName"), vpc_id
+ )
+ if not source_group:
+ raise InvalidSecurityGroupNotFoundError(item.get("GroupName"))
+ else:
+ item["GroupId"] = source_group.id
+ item.pop("GroupName")
+
+ _source_groups.append(item)
+ return _source_groups
+
+ def _verify_group_will_respect_rule_count_limit(
+ self, group, current_rule_nb, ip_ranges, source_groups=None, egress=False
+ ):
+ max_nb_rules = 60 if group.vpc_id else 100
+ future_group_nb_rules = current_rule_nb
+ if ip_ranges:
+ future_group_nb_rules += len(ip_ranges)
+ if source_groups:
+ future_group_nb_rules += len(source_groups)
+ if future_group_nb_rules > max_nb_rules:
+ if group and not egress:
+ group.ingress_rules = self.sg_old_ingress_ruls[group.id]
+ if group and egress:
+ group.egress_rules = self.sg_old_egress_ruls[group.id]
+ raise RulesPerSecurityGroupLimitExceededError
+
+
+class SecurityGroupIngress(CloudFormationModel):
+ def __init__(self, security_group, properties):
+ self.security_group = security_group
+ self.properties = properties
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-securitygroupingress.html
+ return "AWS::EC2::SecurityGroupIngress"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ group_name = properties.get("GroupName")
+ group_id = properties.get("GroupId")
+ ip_protocol = properties.get("IpProtocol")
+ cidr_ip = properties.get("CidrIp")
+ cidr_desc = properties.get("Description")
+ cidr_ipv6 = properties.get("CidrIpv6")
+ from_port = properties.get("FromPort")
+ source_security_group_id = properties.get("SourceSecurityGroupId")
+ source_security_group_name = properties.get("SourceSecurityGroupName")
+ # source_security_owner_id =
+ # properties.get("SourceSecurityGroupOwnerId") # IGNORED AT THE MOMENT
+ to_port = properties.get("ToPort")
+
+ assert group_id or group_name
+ assert (
+ source_security_group_name
+ or cidr_ip
+ or cidr_ipv6
+ or source_security_group_id
+ )
+ assert ip_protocol
+
+ source_group = {}
+ if source_security_group_id:
+ source_group["GroupId"] = source_security_group_id
+ if source_security_group_name:
+ source_group["GroupName"] = source_security_group_name
+ if cidr_ip:
+ ip_ranges = [{"CidrIp": cidr_ip, "Description": cidr_desc}]
+ else:
+ ip_ranges = []
+
+ if group_id:
+ security_group = ec2_backend.describe_security_groups(group_ids=[group_id])[
+ 0
+ ]
+ else:
+ security_group = ec2_backend.describe_security_groups(
+ groupnames=[group_name]
+ )[0]
+
+ ec2_backend.authorize_security_group_ingress(
+ group_name_or_id=security_group.id,
+ ip_protocol=ip_protocol,
+ from_port=from_port,
+ to_port=to_port,
+ ip_ranges=ip_ranges,
+ source_groups=[source_group] if source_group else [],
+ )
+
+ return cls(security_group, properties)
diff --git a/contrib/python/moto/py3/moto/ec2/models/spot_requests.py b/contrib/python/moto/py3/moto/ec2/models/spot_requests.py
new file mode 100644
index 0000000000..3210677a3f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/spot_requests.py
@@ -0,0 +1,507 @@
+from collections import defaultdict
+
+from moto.core.common_models import CloudFormationModel
+from moto.packages.boto.ec2.launchspecification import LaunchSpecification
+from moto.packages.boto.ec2.spotinstancerequest import (
+ SpotInstanceRequest as BotoSpotRequest,
+)
+from .core import TaggedEC2Resource
+from .instance_types import INSTANCE_TYPE_OFFERINGS
+from ..utils import (
+ random_spot_fleet_request_id,
+ random_spot_request_id,
+ generic_filter,
+ convert_tag_spec,
+)
+
+
+class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ spot_request_id,
+ price,
+ image_id,
+ spot_instance_type,
+ valid_from,
+ valid_until,
+ launch_group,
+ availability_zone_group,
+ key_name,
+ security_groups,
+ user_data,
+ instance_type,
+ placement,
+ kernel_id,
+ ramdisk_id,
+ monitoring_enabled,
+ subnet_id,
+ tags,
+ spot_fleet_id,
+ instance_interruption_behaviour,
+ **kwargs,
+ ):
+ super().__init__(**kwargs)
+ ls = LaunchSpecification()
+ self.ec2_backend = ec2_backend
+ self.launch_specification = ls
+ self.id = spot_request_id
+ self.state = "open"
+ self.status = "pending-evaluation"
+ self.status_message = "Your Spot request has been submitted for review, and is pending evaluation."
+ if price:
+ price = float(price)
+ price = "{0:.6f}".format(price) # round up/down to 6 decimals
+ self.price = price
+ self.type = spot_instance_type
+ self.valid_from = valid_from
+ self.valid_until = valid_until
+ self.launch_group = launch_group
+ self.availability_zone_group = availability_zone_group
+ self.instance_interruption_behaviour = (
+ instance_interruption_behaviour or "terminate"
+ )
+ self.user_data = user_data # NOT
+ ls.kernel = kernel_id
+ ls.ramdisk = ramdisk_id
+ ls.image_id = image_id
+ ls.key_name = key_name
+ ls.instance_type = instance_type
+ ls.placement = placement
+ ls.monitored = monitoring_enabled
+ ls.subnet_id = subnet_id
+ self.spot_fleet_id = spot_fleet_id
+ tag_map = tags.get("spot-instances-request", {})
+ self.add_tags(tag_map)
+ self.all_tags = tags
+
+ if security_groups:
+ for group_name in security_groups:
+ group = self.ec2_backend.get_security_group_by_name_or_id(group_name)
+ if group:
+ ls.groups.append(group)
+ else:
+ # If not security groups, add the default
+ default_group = self.ec2_backend.get_security_group_by_name_or_id("default")
+ ls.groups.append(default_group)
+
+ self.instance = self.launch_instance()
+ self.state = "active"
+ self.status = "fulfilled"
+ self.status_message = ""
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "state":
+ return self.state
+ elif filter_name == "spot-instance-request-id":
+ return self.id
+ else:
+ return super().get_filter_value(filter_name, "DescribeSpotInstanceRequests")
+
+ def launch_instance(self):
+ reservation = self.ec2_backend.add_instances(
+ image_id=self.launch_specification.image_id,
+ count=1,
+ user_data=self.user_data,
+ instance_type=self.launch_specification.instance_type,
+ is_instance_type_default=not self.launch_specification.instance_type,
+ subnet_id=self.launch_specification.subnet_id,
+ key_name=self.launch_specification.key_name,
+ security_group_names=[],
+ security_group_ids=self.launch_specification.groups,
+ spot_fleet_id=self.spot_fleet_id,
+ tags=self.all_tags,
+ lifecycle="spot",
+ )
+ instance = reservation.instances[0]
+ return instance
+
+
+class SpotRequestBackend:
+ def __init__(self):
+ self.spot_instance_requests = {}
+
+ def request_spot_instances(
+ self,
+ price,
+ image_id,
+ count,
+ spot_instance_type,
+ valid_from,
+ valid_until,
+ launch_group,
+ availability_zone_group,
+ key_name,
+ security_groups,
+ user_data,
+ instance_type,
+ placement,
+ kernel_id,
+ ramdisk_id,
+ monitoring_enabled,
+ subnet_id,
+ tags=None,
+ spot_fleet_id=None,
+ instance_interruption_behaviour=None,
+ ):
+ requests = []
+ tags = tags or {}
+ for _ in range(count):
+ spot_request_id = random_spot_request_id()
+ request = SpotInstanceRequest(
+ self,
+ spot_request_id,
+ price,
+ image_id,
+ spot_instance_type,
+ valid_from,
+ valid_until,
+ launch_group,
+ availability_zone_group,
+ key_name,
+ security_groups,
+ user_data,
+ instance_type,
+ placement,
+ kernel_id,
+ ramdisk_id,
+ monitoring_enabled,
+ subnet_id,
+ tags,
+ spot_fleet_id,
+ instance_interruption_behaviour,
+ )
+ self.spot_instance_requests[spot_request_id] = request
+ requests.append(request)
+ return requests
+
+ def describe_spot_instance_requests(self, filters=None, spot_instance_ids=None):
+ requests = self.spot_instance_requests.copy().values()
+
+ if spot_instance_ids:
+ requests = [i for i in requests if i.id in spot_instance_ids]
+
+ return generic_filter(filters, requests)
+
+ def cancel_spot_instance_requests(self, request_ids):
+ requests = []
+ for request_id in request_ids:
+ requests.append(self.spot_instance_requests.pop(request_id))
+ return requests
+
+
+class SpotFleetLaunchSpec(object):
+ def __init__(
+ self,
+ ebs_optimized,
+ group_set,
+ iam_instance_profile,
+ image_id,
+ instance_type,
+ key_name,
+ monitoring,
+ spot_price,
+ subnet_id,
+ tag_specifications,
+ user_data,
+ weighted_capacity,
+ ):
+ self.ebs_optimized = ebs_optimized
+ self.group_set = group_set
+ self.iam_instance_profile = iam_instance_profile
+ self.image_id = image_id
+ self.instance_type = instance_type
+ self.key_name = key_name
+ self.monitoring = monitoring
+ self.spot_price = spot_price
+ self.subnet_id = subnet_id
+ self.tag_specifications = tag_specifications
+ self.user_data = user_data
+ self.weighted_capacity = float(weighted_capacity)
+
+
+class SpotFleetRequest(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ spot_fleet_request_id,
+ spot_price,
+ target_capacity,
+ iam_fleet_role,
+ allocation_strategy,
+ launch_specs,
+ launch_template_config,
+ instance_interruption_behaviour,
+ ):
+
+ self.ec2_backend = ec2_backend
+ self.id = spot_fleet_request_id
+ self.spot_price = spot_price
+ self.target_capacity = int(target_capacity)
+ self.iam_fleet_role = iam_fleet_role
+ self.allocation_strategy = allocation_strategy
+ self.instance_interruption_behaviour = (
+ instance_interruption_behaviour or "terminate"
+ )
+ self.state = "active"
+ self.fulfilled_capacity = 0.0
+
+ self.launch_specs = []
+
+ launch_specs_from_config = []
+ for config in launch_template_config or []:
+ spec = config["LaunchTemplateSpecification"]
+ if "LaunchTemplateId" in spec:
+ launch_template = self.ec2_backend.get_launch_template(
+ template_id=spec["LaunchTemplateId"]
+ )
+ elif "LaunchTemplateName" in spec:
+ launch_template = self.ec2_backend.get_launch_template_by_name(
+ name=spec["LaunchTemplateName"]
+ )
+ else:
+ continue
+ launch_template_data = launch_template.latest_version().data
+ new_launch_template = launch_template_data.copy()
+ if config.get("Overrides"):
+ overrides = list(config["Overrides"].values())[0]
+ new_launch_template.update(overrides)
+ launch_specs_from_config.append(new_launch_template)
+
+ for spec in (launch_specs or []) + launch_specs_from_config:
+ tag_spec_set = spec.get("TagSpecificationSet", [])
+ tags = convert_tag_spec(tag_spec_set)
+ self.launch_specs.append(
+ SpotFleetLaunchSpec(
+ ebs_optimized=spec.get("EbsOptimized"),
+ group_set=spec.get("GroupSet", []),
+ iam_instance_profile=spec.get("IamInstanceProfile"),
+ image_id=spec["ImageId"],
+ instance_type=spec["InstanceType"],
+ key_name=spec.get("KeyName"),
+ monitoring=spec.get("Monitoring"),
+ spot_price=spec.get("SpotPrice", self.spot_price),
+ subnet_id=spec.get("SubnetId"),
+ tag_specifications=tags,
+ user_data=spec.get("UserData"),
+ weighted_capacity=spec.get("WeightedCapacity", 1),
+ )
+ )
+
+ self.spot_requests = []
+ self.create_spot_requests(self.target_capacity)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html
+ return "AWS::EC2::SpotFleet"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]["SpotFleetRequestConfigData"]
+ ec2_backend = ec2_backends[region_name]
+
+ spot_price = properties.get("SpotPrice")
+ target_capacity = properties["TargetCapacity"]
+ iam_fleet_role = properties["IamFleetRole"]
+ allocation_strategy = properties["AllocationStrategy"]
+ launch_specs = properties["LaunchSpecifications"]
+
+ spot_fleet_request = ec2_backend.request_spot_fleet(
+ spot_price,
+ target_capacity,
+ iam_fleet_role,
+ allocation_strategy,
+ launch_specs,
+ )
+
+ return spot_fleet_request
+
+ def get_launch_spec_counts(self, weight_to_add):
+ weight_map = defaultdict(int)
+
+ weight_so_far = 0
+ if self.allocation_strategy == "diversified":
+ launch_spec_index = 0
+ while True:
+ launch_spec = self.launch_specs[
+ launch_spec_index % len(self.launch_specs)
+ ]
+ weight_map[launch_spec] += 1
+ weight_so_far += launch_spec.weighted_capacity
+ if weight_so_far >= weight_to_add:
+ break
+ launch_spec_index += 1
+ else: # lowestPrice
+ cheapest_spec = sorted(
+ # FIXME: change `+inf` to the on demand price scaled to weighted capacity when it's not present
+ self.launch_specs,
+ key=lambda spec: float(spec.spot_price or "+inf"),
+ )[0]
+ weight_so_far = weight_to_add + (
+ weight_to_add % cheapest_spec.weighted_capacity
+ )
+ weight_map[cheapest_spec] = int(
+ weight_so_far // cheapest_spec.weighted_capacity
+ )
+
+ return weight_map, weight_so_far
+
+ def create_spot_requests(self, weight_to_add):
+ weight_map, added_weight = self.get_launch_spec_counts(weight_to_add)
+ for launch_spec, count in weight_map.items():
+ requests = self.ec2_backend.request_spot_instances(
+ price=launch_spec.spot_price,
+ image_id=launch_spec.image_id,
+ count=count,
+ spot_instance_type="persistent",
+ valid_from=None,
+ valid_until=None,
+ launch_group=None,
+ availability_zone_group=None,
+ key_name=launch_spec.key_name,
+ security_groups=launch_spec.group_set,
+ user_data=launch_spec.user_data,
+ instance_type=launch_spec.instance_type,
+ placement=None,
+ kernel_id=None,
+ ramdisk_id=None,
+ monitoring_enabled=launch_spec.monitoring,
+ subnet_id=launch_spec.subnet_id,
+ spot_fleet_id=self.id,
+ tags=launch_spec.tag_specifications,
+ )
+ self.spot_requests.extend(requests)
+ self.fulfilled_capacity += added_weight
+ return self.spot_requests
+
+ def terminate_instances(self):
+ instance_ids = []
+ new_fulfilled_capacity = self.fulfilled_capacity
+ for req in self.spot_requests:
+ instance = req.instance
+ for spec in self.launch_specs:
+ if (
+ spec.instance_type == instance.instance_type
+ and spec.subnet_id == instance.subnet_id
+ ):
+ break
+
+ if new_fulfilled_capacity - spec.weighted_capacity < self.target_capacity:
+ continue
+ new_fulfilled_capacity -= spec.weighted_capacity
+ instance_ids.append(instance.id)
+
+ self.spot_requests = [
+ req for req in self.spot_requests if req.instance.id not in instance_ids
+ ]
+ self.ec2_backend.terminate_instances(instance_ids)
+
+
+class SpotFleetBackend:
+ def __init__(self):
+ self.spot_fleet_requests = {}
+
+ def request_spot_fleet(
+ self,
+ spot_price,
+ target_capacity,
+ iam_fleet_role,
+ allocation_strategy,
+ launch_specs,
+ launch_template_config=None,
+ instance_interruption_behaviour=None,
+ ):
+
+ spot_fleet_request_id = random_spot_fleet_request_id()
+ request = SpotFleetRequest(
+ self,
+ spot_fleet_request_id,
+ spot_price,
+ target_capacity,
+ iam_fleet_role,
+ allocation_strategy,
+ launch_specs,
+ launch_template_config,
+ instance_interruption_behaviour,
+ )
+ self.spot_fleet_requests[spot_fleet_request_id] = request
+ return request
+
+ def get_spot_fleet_request(self, spot_fleet_request_id):
+ return self.spot_fleet_requests[spot_fleet_request_id]
+
+ def describe_spot_fleet_instances(self, spot_fleet_request_id):
+ spot_fleet = self.get_spot_fleet_request(spot_fleet_request_id)
+ return spot_fleet.spot_requests
+
+ def describe_spot_fleet_requests(self, spot_fleet_request_ids):
+ requests = self.spot_fleet_requests.values()
+
+ if spot_fleet_request_ids:
+ requests = [
+ request for request in requests if request.id in spot_fleet_request_ids
+ ]
+
+ return requests
+
+ def cancel_spot_fleet_requests(self, spot_fleet_request_ids, terminate_instances):
+ spot_requests = []
+ for spot_fleet_request_id in spot_fleet_request_ids:
+ spot_fleet = self.spot_fleet_requests[spot_fleet_request_id]
+ if terminate_instances:
+ spot_fleet.target_capacity = 0
+ spot_fleet.terminate_instances()
+ spot_requests.append(spot_fleet)
+ del self.spot_fleet_requests[spot_fleet_request_id]
+ return spot_requests
+
+ def modify_spot_fleet_request(
+ self, spot_fleet_request_id, target_capacity, terminate_instances
+ ):
+ if target_capacity < 0:
+ raise ValueError("Cannot reduce spot fleet capacity below 0")
+ spot_fleet_request = self.spot_fleet_requests[spot_fleet_request_id]
+ delta = target_capacity - spot_fleet_request.fulfilled_capacity
+ spot_fleet_request.target_capacity = target_capacity
+ if delta > 0:
+ spot_fleet_request.create_spot_requests(delta)
+ elif delta < 0 and terminate_instances == "Default":
+ spot_fleet_request.terminate_instances()
+ return True
+
+
+class SpotPriceBackend:
+ def describe_spot_price_history(self, instance_types=None, filters=None):
+ matches = INSTANCE_TYPE_OFFERINGS["availability-zone"]
+ matches = matches.get(self.region_name, [])
+
+ def matches_filters(offering, filters):
+ def matches_filter(key, values):
+ if key == "availability-zone":
+ return offering.get("Location") in values
+ elif key == "instance-type":
+ return offering.get("InstanceType") in values
+ else:
+ return False
+
+ return all([matches_filter(key, values) for key, values in filters.items()])
+
+ matches = [o for o in matches if matches_filters(o, filters)]
+
+ if instance_types:
+ matches = [t for t in matches if t.get("InstanceType") in instance_types]
+
+ return matches
diff --git a/contrib/python/moto/py3/moto/ec2/models/subnets.py b/contrib/python/moto/py3/moto/ec2/models/subnets.py
new file mode 100644
index 0000000000..db976a8cba
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/subnets.py
@@ -0,0 +1,443 @@
+import ipaddress
+import itertools
+from collections import defaultdict
+
+from moto.core import get_account_id
+from moto.core import CloudFormationModel
+from ..exceptions import (
+ GenericInvalidParameterValueError,
+ InvalidAvailabilityZoneError,
+ InvalidCIDRBlockParameterError,
+ InvalidParameterValueError,
+ InvalidSubnetConflictError,
+ InvalidSubnetIdError,
+ InvalidSubnetRangeError,
+ InvalidSubnetCidrBlockAssociationID,
+)
+from .core import TaggedEC2Resource
+from .availability_zones_and_regions import RegionsAndZonesBackend
+from ..utils import (
+ random_subnet_id,
+ generic_filter,
+ random_subnet_ipv6_cidr_block_association_id,
+)
+
+
+class Subnet(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ subnet_id,
+ vpc_id,
+ cidr_block,
+ ipv6_cidr_block,
+ availability_zone,
+ default_for_az,
+ map_public_ip_on_launch,
+ assign_ipv6_address_on_creation=False,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = subnet_id
+ self.vpc_id = vpc_id
+ self.cidr_block = cidr_block
+ self.cidr = ipaddress.IPv4Network(str(self.cidr_block), strict=False)
+ self._available_ip_addresses = self.cidr.num_addresses - 5
+ self._availability_zone = availability_zone
+ self.default_for_az = default_for_az
+ self.map_public_ip_on_launch = map_public_ip_on_launch
+ self.assign_ipv6_address_on_creation = assign_ipv6_address_on_creation
+ self.ipv6_cidr_block_associations = {}
+ if ipv6_cidr_block:
+ self.attach_ipv6_cidr_block_associations(ipv6_cidr_block)
+
+ # Theory is we assign ip's as we go (as 16,777,214 usable IPs in a /8)
+ self._subnet_ip_generator = self.cidr.hosts()
+ self.reserved_ips = [
+ next(self._subnet_ip_generator) for _ in range(0, 3)
+ ] # Reserved by AWS
+ self._unused_ips = set() # if instance is destroyed hold IP here for reuse
+ self._subnet_ips = {} # has IP: instance
+ self.state = "available"
+
+ # Placeholder for response templates until Ipv6 support implemented.
+ self.ipv6_native = False
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html
+ return "AWS::EC2::Subnet"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ vpc_id = properties["VpcId"]
+ cidr_block = properties["CidrBlock"]
+ availability_zone = properties.get("AvailabilityZone")
+ ec2_backend = ec2_backends[region_name]
+ subnet = ec2_backend.create_subnet(
+ vpc_id=vpc_id, cidr_block=cidr_block, availability_zone=availability_zone
+ )
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ subnet.add_tag(tag_key, tag_value)
+
+ return subnet
+
+ @property
+ def available_ip_addresses(self):
+ enis = [
+ eni
+ for eni in self.ec2_backend.get_all_network_interfaces()
+ if eni.subnet.id == self.id
+ ]
+ addresses_taken = []
+ for eni in enis:
+ if eni.private_ip_addresses:
+ addresses_taken.extend(eni.private_ip_addresses)
+ return str(self._available_ip_addresses - len(addresses_taken))
+
+ @property
+ def availability_zone(self):
+ return self._availability_zone.name
+
+ @property
+ def availability_zone_id(self):
+ return self._availability_zone.zone_id
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ """
+ API Version 2014-10-01 defines the following filters for DescribeSubnets:
+
+ * availabilityZone
+ * available-ip-address-count
+ * cidrBlock
+ * defaultForAz
+ * state
+ * subnet-id
+ * tag:key=value
+ * tag-key
+ * tag-value
+ * vpc-id
+
+ Taken from: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html
+ """
+ if filter_name in ("cidr", "cidrBlock", "cidr-block"):
+ return self.cidr_block
+ elif filter_name in ("vpc-id", "vpcId"):
+ return self.vpc_id
+ elif filter_name == "subnet-id":
+ return self.id
+ elif filter_name in ("availabilityZone", "availability-zone"):
+ return self.availability_zone
+ elif filter_name in ("defaultForAz", "default-for-az"):
+ return self.default_for_az
+ elif filter_name == "state":
+ return self.state
+ else:
+ return super().get_filter_value(filter_name, "DescribeSubnets")
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["AvailabilityZone"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "AvailabilityZone":
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "AvailabilityZone" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ def get_available_subnet_ip(self, instance):
+ try:
+ new_ip = self._unused_ips.pop()
+ except KeyError:
+ new_ip = next(self._subnet_ip_generator)
+
+ # Skips any IP's if they've been manually specified
+ while str(new_ip) in self._subnet_ips:
+ new_ip = next(self._subnet_ip_generator)
+
+ if new_ip == self.cidr.broadcast_address:
+ raise StopIteration() # Broadcast address cant be used obviously
+ # TODO StopIteration will be raised if no ip's available, not sure how aws handles this.
+
+ new_ip = str(new_ip)
+ self._subnet_ips[new_ip] = instance
+
+ return new_ip
+
+ def request_ip(self, ip, instance):
+ if ipaddress.ip_address(ip) not in self.cidr:
+ raise Exception(
+ "IP does not fall in the subnet CIDR of {0}".format(self.cidr)
+ )
+
+ if ip in self._subnet_ips:
+ raise Exception("IP already in use")
+ try:
+ self._unused_ips.remove(ip)
+ except KeyError:
+ pass
+
+ self._subnet_ips[ip] = instance
+ return ip
+
+ def del_subnet_ip(self, ip):
+ try:
+ del self._subnet_ips[ip]
+ self._unused_ips.add(ip)
+ except KeyError:
+ pass # Unknown IP
+
+ def attach_ipv6_cidr_block_associations(self, ipv6_cidr_block):
+ association = {
+ "associationId": random_subnet_ipv6_cidr_block_association_id(),
+ "ipv6CidrBlock": ipv6_cidr_block,
+ "ipv6CidrBlockState": "associated",
+ }
+ self.ipv6_cidr_block_associations[
+ association.get("associationId")
+ ] = association
+ return association
+
+ def detach_subnet_cidr_block(self, association_id):
+ association = self.ipv6_cidr_block_associations.get(association_id)
+ association["ipv6CidrBlockState"] = "disassociated"
+ return association
+
+
+class SubnetBackend:
+ def __init__(self):
+ # maps availability zone to dict of (subnet_id, subnet)
+ self.subnets = defaultdict(dict)
+
+ def get_subnet(self, subnet_id):
+ for subnets in self.subnets.values():
+ if subnet_id in subnets:
+ return subnets[subnet_id]
+ raise InvalidSubnetIdError(subnet_id)
+
+ def get_default_subnet(self, availability_zone):
+ return [
+ subnet
+ for subnet in self.get_all_subnets(
+ filters={"availabilityZone": availability_zone}
+ )
+ if subnet.default_for_az
+ ][0]
+
+ def create_subnet(
+ self,
+ vpc_id,
+ cidr_block,
+ ipv6_cidr_block=None,
+ availability_zone=None,
+ availability_zone_id=None,
+ tags=None,
+ ):
+ subnet_id = random_subnet_id()
+ vpc = self.get_vpc(
+ vpc_id
+ ) # Validate VPC exists and the supplied CIDR block is a subnet of the VPC's
+ vpc_cidr_blocks = [
+ ipaddress.IPv4Network(
+ str(cidr_block_association["cidr_block"]), strict=False
+ )
+ for cidr_block_association in vpc.get_cidr_block_association_set()
+ ]
+ try:
+ subnet_cidr_block = ipaddress.IPv4Network(str(cidr_block), strict=False)
+ except ValueError:
+ raise InvalidCIDRBlockParameterError(cidr_block)
+
+ subnet_in_vpc_cidr_range = False
+ for vpc_cidr_block in vpc_cidr_blocks:
+ if (
+ vpc_cidr_block.network_address <= subnet_cidr_block.network_address
+ and vpc_cidr_block.broadcast_address
+ >= subnet_cidr_block.broadcast_address
+ ):
+ subnet_in_vpc_cidr_range = True
+ break
+
+ if not subnet_in_vpc_cidr_range:
+ raise InvalidSubnetRangeError(cidr_block)
+
+ # The subnet size must use a /64 prefix length.
+ if ipv6_cidr_block and "::/64" not in ipv6_cidr_block:
+ raise GenericInvalidParameterValueError("ipv6-cidr-block", ipv6_cidr_block)
+
+ for subnet in self.get_all_subnets(filters={"vpc-id": vpc_id}):
+ if subnet.cidr.overlaps(subnet_cidr_block):
+ raise InvalidSubnetConflictError(cidr_block)
+
+ # if this is the first subnet for an availability zone,
+ # consider it the default
+ default_for_az = str(availability_zone not in self.subnets).lower()
+ map_public_ip_on_launch = default_for_az
+
+ if availability_zone is None and not availability_zone_id:
+ availability_zone = "us-east-1a"
+ try:
+ if availability_zone:
+ availability_zone_data = next(
+ zone
+ for zones in RegionsAndZonesBackend.zones.values()
+ for zone in zones
+ if zone.name == availability_zone
+ )
+ elif availability_zone_id:
+ availability_zone_data = next(
+ zone
+ for zones in RegionsAndZonesBackend.zones.values()
+ for zone in zones
+ if zone.zone_id == availability_zone_id
+ )
+
+ except StopIteration:
+ raise InvalidAvailabilityZoneError(
+ availability_zone,
+ ", ".join(
+ [
+ zone.name
+ for zones in RegionsAndZonesBackend.zones.values()
+ for zone in zones
+ ]
+ ),
+ )
+ subnet = Subnet(
+ self,
+ subnet_id,
+ vpc_id,
+ cidr_block,
+ ipv6_cidr_block,
+ availability_zone_data,
+ default_for_az,
+ map_public_ip_on_launch,
+ assign_ipv6_address_on_creation=False,
+ )
+
+ for tag in tags or []:
+ tag_key = tag.get("Key")
+ tag_value = tag.get("Value")
+ subnet.add_tag(tag_key, tag_value)
+
+ # AWS associates a new subnet with the default Network ACL
+ self.associate_default_network_acl_with_subnet(subnet_id, vpc_id)
+ self.subnets[availability_zone][subnet_id] = subnet
+ return subnet
+
+ def get_all_subnets(self, subnet_ids=None, filters=None):
+ # Extract a list of all subnets
+ matches = itertools.chain(
+ *[x.copy().values() for x in self.subnets.copy().values()]
+ )
+ if subnet_ids:
+ matches = [sn for sn in matches if sn.id in subnet_ids]
+ if len(subnet_ids) > len(matches):
+ unknown_ids = set(subnet_ids) - set(matches)
+ raise InvalidSubnetIdError(list(unknown_ids)[0])
+ if filters:
+ matches = generic_filter(filters, matches)
+
+ return matches
+
+ def delete_subnet(self, subnet_id):
+ for subnets in self.subnets.values():
+ if subnet_id in subnets:
+ return subnets.pop(subnet_id, None)
+ raise InvalidSubnetIdError(subnet_id)
+
+ def modify_subnet_attribute(self, subnet_id, attr_name, attr_value):
+ subnet = self.get_subnet(subnet_id)
+ if attr_name in ("map_public_ip_on_launch", "assign_ipv6_address_on_creation"):
+ setattr(subnet, attr_name, attr_value)
+ else:
+ raise InvalidParameterValueError(attr_name)
+
+ def get_subnet_from_ipv6_association(self, association_id):
+ subnet = None
+ for s in self.get_all_subnets():
+ if association_id in s.ipv6_cidr_block_associations:
+ subnet = s
+ return subnet
+
+ def associate_subnet_cidr_block(self, subnet_id, ipv6_cidr_block):
+ subnet = self.get_subnet(subnet_id)
+ if not subnet:
+ raise InvalidSubnetIdError(subnet_id)
+ association = subnet.attach_ipv6_cidr_block_associations(ipv6_cidr_block)
+ return association
+
+ def disassociate_subnet_cidr_block(self, association_id):
+ subnet = self.get_subnet_from_ipv6_association(association_id)
+ if not subnet:
+ raise InvalidSubnetCidrBlockAssociationID(association_id)
+ association = subnet.detach_subnet_cidr_block(association_id)
+ return subnet.id, association
+
+
+class SubnetRouteTableAssociation(CloudFormationModel):
+ def __init__(self, route_table_id, subnet_id):
+ self.route_table_id = route_table_id
+ self.subnet_id = subnet_id
+
+ @property
+ def physical_resource_id(self):
+ return self.route_table_id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html
+ return "AWS::EC2::SubnetRouteTableAssociation"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ route_table_id = properties["RouteTableId"]
+ subnet_id = properties["SubnetId"]
+
+ ec2_backend = ec2_backends[region_name]
+ subnet_association = ec2_backend.create_subnet_association(
+ route_table_id=route_table_id, subnet_id=subnet_id
+ )
+ return subnet_association
+
+
+class SubnetRouteTableAssociationBackend:
+ def __init__(self):
+ self.subnet_associations = {}
+
+ def create_subnet_association(self, route_table_id, subnet_id):
+ subnet_association = SubnetRouteTableAssociation(route_table_id, subnet_id)
+ self.subnet_associations[
+ "{0}:{1}".format(route_table_id, subnet_id)
+ ] = subnet_association
+ return subnet_association
diff --git a/contrib/python/moto/py3/moto/ec2/models/tags.py b/contrib/python/moto/py3/moto/ec2/models/tags.py
new file mode 100644
index 0000000000..b56778a4fa
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/tags.py
@@ -0,0 +1,126 @@
+import re
+from collections import defaultdict
+
+from ..exceptions import (
+ InvalidParameterValueErrorTagNull,
+ TagLimitExceeded,
+)
+from ..utils import (
+ EC2_PREFIX_TO_RESOURCE,
+ get_prefix,
+ simple_aws_filter_to_re,
+)
+
+
+class TagBackend:
+ VALID_TAG_FILTERS = ["key", "resource-id", "resource-type", "value"]
+
+ def __init__(self):
+ self.tags = defaultdict(dict)
+
+ def create_tags(self, resource_ids, tags):
+ if None in set([tags[tag] for tag in tags]):
+ raise InvalidParameterValueErrorTagNull()
+ for resource_id in resource_ids:
+ if resource_id in self.tags:
+ if (
+ len(self.tags[resource_id])
+ + len([tag for tag in tags if not tag.startswith("aws:")])
+ > 50
+ ):
+ raise TagLimitExceeded()
+ elif len([tag for tag in tags if not tag.startswith("aws:")]) > 50:
+ raise TagLimitExceeded()
+ for resource_id in resource_ids:
+ for tag in tags:
+ self.tags[resource_id][tag] = tags[tag]
+ return True
+
+ def delete_tags(self, resource_ids, tags):
+ for resource_id in resource_ids:
+ for tag in tags:
+ if tag in self.tags[resource_id]:
+ if tags[tag] is None:
+ self.tags[resource_id].pop(tag)
+ elif tags[tag] == self.tags[resource_id][tag]:
+ self.tags[resource_id].pop(tag)
+ return True
+
+ def describe_tags(self, filters=None):
+ results = []
+ key_filters = []
+ resource_id_filters = []
+ resource_type_filters = []
+ value_filters = []
+ if filters is not None:
+ for tag_filter in filters:
+ if tag_filter in self.VALID_TAG_FILTERS:
+ if tag_filter == "key":
+ for value in filters[tag_filter]:
+ key_filters.append(
+ re.compile(simple_aws_filter_to_re(value))
+ )
+ if tag_filter == "resource-id":
+ for value in filters[tag_filter]:
+ resource_id_filters.append(
+ re.compile(simple_aws_filter_to_re(value))
+ )
+ if tag_filter == "resource-type":
+ for value in filters[tag_filter]:
+ resource_type_filters.append(value)
+ if tag_filter == "value":
+ for value in filters[tag_filter]:
+ value_filters.append(
+ re.compile(simple_aws_filter_to_re(value))
+ )
+ for resource_id, tags in self.tags.copy().items():
+ for key, value in tags.items():
+ add_result = False
+ if filters is None:
+ add_result = True
+ else:
+ key_pass = False
+ id_pass = False
+ type_pass = False
+ value_pass = False
+ if key_filters:
+ for pattern in key_filters:
+ if pattern.match(key) is not None:
+ key_pass = True
+ else:
+ key_pass = True
+ if resource_id_filters:
+ for pattern in resource_id_filters:
+ if pattern.match(resource_id) is not None:
+ id_pass = True
+ else:
+ id_pass = True
+ if resource_type_filters:
+ for resource_type in resource_type_filters:
+ if (
+ EC2_PREFIX_TO_RESOURCE[get_prefix(resource_id)]
+ == resource_type
+ ):
+ type_pass = True
+ else:
+ type_pass = True
+ if value_filters:
+ for pattern in value_filters:
+ if pattern.match(value) is not None:
+ value_pass = True
+ else:
+ value_pass = True
+ if key_pass and id_pass and type_pass and value_pass:
+ add_result = True
+ # If we're not filtering, or we are filtering and this
+ if add_result:
+ result = {
+ "resource_id": resource_id,
+ "key": key,
+ "value": value,
+ "resource_type": EC2_PREFIX_TO_RESOURCE.get(
+ get_prefix(resource_id), ""
+ ),
+ }
+ results.append(result)
+ return results
diff --git a/contrib/python/moto/py3/moto/ec2/models/transit_gateway.py b/contrib/python/moto/py3/moto/ec2/models/transit_gateway.py
new file mode 100644
index 0000000000..a82e3591b6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/transit_gateway.py
@@ -0,0 +1,119 @@
+from datetime import datetime
+from moto.core import get_account_id, CloudFormationModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds
+from moto.utilities.utils import filter_resources, merge_multiple_dicts
+from .core import TaggedEC2Resource
+from ..utils import random_transit_gateway_id
+
+
+class TransitGateway(TaggedEC2Resource, CloudFormationModel):
+ DEFAULT_OPTIONS = {
+ "AmazonSideAsn": "64512",
+ "AssociationDefaultRouteTableId": "tgw-rtb-0d571391e50cf8514",
+ "AutoAcceptSharedAttachments": "disable",
+ "DefaultRouteTableAssociation": "enable",
+ "DefaultRouteTablePropagation": "enable",
+ "DnsSupport": "enable",
+ "MulticastSupport": "disable",
+ "PropagationDefaultRouteTableId": "tgw-rtb-0d571391e50cf8514",
+ "TransitGatewayCidrBlocks": None,
+ "VpnEcmpSupport": "enable",
+ }
+
+ def __init__(self, backend, description=None, options=None):
+ self.ec2_backend = backend
+ self.id = random_transit_gateway_id()
+ self.description = description
+ self.state = "available"
+ self.options = merge_multiple_dicts(self.DEFAULT_OPTIONS, options or {})
+ self._created_at = datetime.utcnow()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def create_time(self):
+ return iso_8601_datetime_with_milliseconds(self._created_at)
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html
+ return "AWS::EC2::TransitGateway"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ ec2_backend = ec2_backends[region_name]
+ properties = cloudformation_json["Properties"]
+ description = properties["Description"]
+ options = dict(properties)
+ del options["Description"]
+ transit_gateway = ec2_backend.create_transit_gateway(
+ description=description, options=options
+ )
+
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ transit_gateway.add_tag(tag_key, tag_value)
+
+ return transit_gateway
+
+
+class TransitGatewayBackend:
+ def __init__(self):
+ self.transit_gateways = {}
+
+ def create_transit_gateway(self, description=None, options=None, tags=None):
+ transit_gateway = TransitGateway(self, description, options)
+ for tag in tags or []:
+ tag_key = tag.get("Key")
+ tag_value = tag.get("Value")
+ transit_gateway.add_tag(tag_key, tag_value)
+
+ self.transit_gateways[transit_gateway.id] = transit_gateway
+ return transit_gateway
+
+ def describe_transit_gateways(self, filters, transit_gateway_ids):
+ transit_gateways = list(self.transit_gateways.copy().values())
+
+ if transit_gateway_ids:
+ transit_gateways = [
+ item for item in transit_gateways if item.id in transit_gateway_ids
+ ]
+
+ attr_pairs = (
+ ("transit-gateway-id", "id"),
+ ("state", "state"),
+ ("owner-id", "owner_id"),
+ )
+
+ result = transit_gateways
+ if filters:
+ result = filter_resources(transit_gateways, filters, attr_pairs)
+ return result
+
+ def delete_transit_gateway(self, transit_gateway_id):
+ return self.transit_gateways.pop(transit_gateway_id)
+
+ def modify_transit_gateway(
+ self, transit_gateway_id, description=None, options=None
+ ):
+ transit_gateway = self.transit_gateways.get(transit_gateway_id)
+ if description:
+ transit_gateway.description = description
+ if options:
+ transit_gateway.options.update(options)
+ return transit_gateway
diff --git a/contrib/python/moto/py3/moto/ec2/models/transit_gateway_attachments.py b/contrib/python/moto/py3/moto/ec2/models/transit_gateway_attachments.py
new file mode 100644
index 0000000000..db0f90445b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/transit_gateway_attachments.py
@@ -0,0 +1,320 @@
+from datetime import datetime
+from moto.core import get_account_id
+from moto.core.utils import iso_8601_datetime_with_milliseconds
+from moto.utilities.utils import merge_multiple_dicts, filter_resources
+from .core import TaggedEC2Resource
+from .vpc_peering_connections import PeeringConnectionStatus
+from ..utils import random_transit_gateway_attachment_id, describe_tag_filter
+
+
+class TransitGatewayAttachment(TaggedEC2Resource):
+ def __init__(
+ self, backend, resource_id, resource_type, transit_gateway_id, tags=None
+ ):
+ self.ec2_backend = backend
+ self.association = {}
+ self.propagation = {}
+ self.resource_id = resource_id
+ self.resource_type = resource_type
+
+ self.id = random_transit_gateway_attachment_id()
+ self.transit_gateway_id = transit_gateway_id
+
+ self.state = "available"
+ self.add_tags(tags or {})
+
+ self._created_at = datetime.utcnow()
+ self.owner_id = self.resource_owner_id
+
+ @property
+ def create_time(self):
+ return iso_8601_datetime_with_milliseconds(self._created_at)
+
+ @property
+ def resource_owner_id(self):
+ return get_account_id()
+
+ @property
+ def transit_gateway_owner_id(self):
+ return get_account_id()
+
+
+class TransitGatewayVpcAttachment(TransitGatewayAttachment):
+ DEFAULT_OPTIONS = {
+ "ApplianceModeSupport": "disable",
+ "DnsSupport": "enable",
+ "Ipv6Support": "disable",
+ }
+
+ def __init__(
+ self, backend, transit_gateway_id, vpc_id, subnet_ids, tags=None, options=None
+ ):
+ super().__init__(
+ backend=backend,
+ transit_gateway_id=transit_gateway_id,
+ resource_id=vpc_id,
+ resource_type="vpc",
+ tags=tags,
+ )
+
+ self.vpc_id = vpc_id
+ self.subnet_ids = subnet_ids
+ self.options = merge_multiple_dicts(self.DEFAULT_OPTIONS, options or {})
+
+
+class TransitGatewayPeeringAttachment(TransitGatewayAttachment):
+ def __init__(
+ self,
+ backend,
+ transit_gateway_id=None,
+ peer_transit_gateway_id=None,
+ peer_region=None,
+ peer_account_id=None,
+ tags=None,
+ region_name=None,
+ ):
+ super().__init__(
+ backend=backend,
+ transit_gateway_id=transit_gateway_id,
+ resource_id=peer_transit_gateway_id,
+ resource_type="peering",
+ tags=tags,
+ )
+
+ self.accepter_tgw_info = {
+ "ownerId": peer_account_id,
+ "region": peer_region,
+ "transitGatewayId": peer_transit_gateway_id,
+ }
+ self.requester_tgw_info = {
+ "ownerId": self.owner_id,
+ "region": region_name,
+ "transitGatewayId": transit_gateway_id,
+ }
+ self.status = PeeringConnectionStatus()
+
+ @property
+ def resource_owner_id(self):
+ return get_account_id()
+
+
+class TransitGatewayAttachmentBackend:
+ def __init__(self):
+ self.transit_gateway_attachments = {}
+
+ def create_transit_gateway_vpn_attachment(
+ self, vpn_id, transit_gateway_id, tags=None
+ ):
+ transit_gateway_vpn_attachment = TransitGatewayAttachment(
+ self,
+ resource_id=vpn_id,
+ resource_type="vpn",
+ transit_gateway_id=transit_gateway_id,
+ tags=tags,
+ )
+ self.transit_gateway_attachments[
+ transit_gateway_vpn_attachment.id
+ ] = transit_gateway_vpn_attachment
+ return transit_gateway_vpn_attachment
+
+ def create_transit_gateway_vpc_attachment(
+ self, transit_gateway_id, vpc_id, subnet_ids, tags=None, options=None
+ ):
+ transit_gateway_vpc_attachment = TransitGatewayVpcAttachment(
+ self,
+ transit_gateway_id=transit_gateway_id,
+ tags=tags,
+ vpc_id=vpc_id,
+ subnet_ids=subnet_ids,
+ options=options,
+ )
+ self.transit_gateway_attachments[
+ transit_gateway_vpc_attachment.id
+ ] = transit_gateway_vpc_attachment
+ return transit_gateway_vpc_attachment
+
+ def describe_transit_gateway_attachments(
+ self, transit_gateways_attachment_ids=None, filters=None
+ ):
+ transit_gateway_attachments = list(self.transit_gateway_attachments.values())
+
+ attr_pairs = (
+ ("resource-id", "resource_id"),
+ ("resource-type", "resource_type"),
+ ("transit-gateway-id", "transit_gateway_id"),
+ )
+
+ if (
+ not transit_gateways_attachment_ids == []
+ and transit_gateways_attachment_ids is not None
+ ):
+ transit_gateway_attachments = [
+ transit_gateways_attachment
+ for transit_gateways_attachment in transit_gateway_attachments
+ if transit_gateways_attachment.id in transit_gateways_attachment_ids
+ ]
+
+ result = transit_gateway_attachments
+ if filters:
+ result = filter_resources(transit_gateway_attachments, filters, attr_pairs)
+ return result
+
+ def describe_transit_gateway_vpc_attachments(
+ self, transit_gateways_attachment_ids=None, filters=None
+ ):
+ transit_gateway_attachments = list(self.transit_gateway_attachments.values())
+
+ attr_pairs = (
+ ("state", "state"),
+ ("transit-gateway-attachment-id", "id"),
+ ("transit-gateway-id", "transit_gateway_id"),
+ ("vpc-id", "resource_id"),
+ )
+
+ if (
+ not transit_gateways_attachment_ids == []
+ and transit_gateways_attachment_ids is not None
+ ):
+ transit_gateway_attachments = [
+ transit_gateways_attachment
+ for transit_gateways_attachment in transit_gateway_attachments
+ if transit_gateways_attachment.id in transit_gateways_attachment_ids
+ ]
+
+ result = transit_gateway_attachments
+ if filters:
+ result = filter_resources(transit_gateway_attachments, filters, attr_pairs)
+ return result
+
+ def delete_transit_gateway_vpc_attachment(self, transit_gateway_attachment_id=None):
+ transit_gateway_attachment = self.transit_gateway_attachments.pop(
+ transit_gateway_attachment_id
+ )
+ transit_gateway_attachment.state = "deleted"
+ return transit_gateway_attachment
+
+ def modify_transit_gateway_vpc_attachment(
+ self,
+ add_subnet_ids=None,
+ options=None,
+ remove_subnet_ids=None,
+ transit_gateway_attachment_id=None,
+ ):
+
+ tgw_attachment = self.transit_gateway_attachments[transit_gateway_attachment_id]
+ if remove_subnet_ids:
+ tgw_attachment.subnet_ids = [
+ id for id in tgw_attachment.subnet_ids if id not in remove_subnet_ids
+ ]
+
+ if options:
+ tgw_attachment.options.update(options)
+
+ if add_subnet_ids:
+ for subnet_id in add_subnet_ids:
+ tgw_attachment.subnet_ids.append(subnet_id)
+
+ return tgw_attachment
+
+ def set_attachment_association(
+ self, transit_gateway_attachment_id=None, transit_gateway_route_table_id=None
+ ):
+ self.transit_gateway_attachments[transit_gateway_attachment_id].association = {
+ "state": "associated",
+ "transitGatewayRouteTableId": transit_gateway_route_table_id,
+ }
+
+ def unset_attachment_association(self, tgw_attach_id):
+ self.transit_gateway_attachments.get(tgw_attach_id).association = {}
+
+ def set_attachment_propagation(
+ self, transit_gateway_attachment_id=None, transit_gateway_route_table_id=None
+ ):
+ self.transit_gateway_attachments[transit_gateway_attachment_id].propagation = {
+ "state": "enabled",
+ "transitGatewayRouteTableId": transit_gateway_route_table_id,
+ }
+
+ def unset_attachment_propagation(self, tgw_attach_id):
+ self.transit_gateway_attachments.get(tgw_attach_id).propagation = {}
+
+ def disable_attachment_propagation(self, transit_gateway_attachment_id=None):
+ self.transit_gateway_attachments[transit_gateway_attachment_id].propagation[
+ "state"
+ ] = "disabled"
+
+ def create_transit_gateway_peering_attachment(
+ self,
+ transit_gateway_id,
+ peer_transit_gateway_id,
+ peer_region,
+ peer_account_id,
+ tags,
+ ):
+ transit_gateway_peering_attachment = TransitGatewayPeeringAttachment(
+ self,
+ transit_gateway_id=transit_gateway_id,
+ peer_transit_gateway_id=peer_transit_gateway_id,
+ peer_region=peer_region,
+ peer_account_id=peer_account_id,
+ tags=tags,
+ region_name=self.region_name,
+ )
+ transit_gateway_peering_attachment.status.accept()
+ transit_gateway_peering_attachment.state = "available"
+ self.transit_gateway_attachments[
+ transit_gateway_peering_attachment.id
+ ] = transit_gateway_peering_attachment
+ return transit_gateway_peering_attachment
+
+ def describe_transit_gateway_peering_attachments(
+ self, transit_gateways_attachment_ids=None, filters=None
+ ):
+ transit_gateway_attachments = list(self.transit_gateway_attachments.values())
+
+ attr_pairs = (
+ ("state", "state"),
+ ("transit-gateway-attachment-id", "id"),
+ ("local-owner-id", "requester_tgw_info", "ownerId"),
+ ("remote-owner-id", "accepter_tgw_info", "ownerId"),
+ )
+
+ if transit_gateways_attachment_ids:
+ transit_gateway_attachments = [
+ transit_gateways_attachment
+ for transit_gateways_attachment in transit_gateway_attachments
+ if transit_gateways_attachment.id in transit_gateways_attachment_ids
+ ]
+
+ if filters:
+ transit_gateway_attachments = filter_resources(
+ transit_gateway_attachments, filters, attr_pairs
+ )
+ transit_gateway_attachments = describe_tag_filter(
+ filters, transit_gateway_attachments
+ )
+ return transit_gateway_attachments
+
+ def accept_transit_gateway_peering_attachment(self, transit_gateway_attachment_id):
+ transit_gateway_attachment = self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ]
+ transit_gateway_attachment.state = "available"
+ transit_gateway_attachment.status.accept()
+ return transit_gateway_attachment
+
+ def reject_transit_gateway_peering_attachment(self, transit_gateway_attachment_id):
+ transit_gateway_attachment = self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ]
+ transit_gateway_attachment.state = "rejected"
+ transit_gateway_attachment.status.reject()
+ return transit_gateway_attachment
+
+ def delete_transit_gateway_peering_attachment(self, transit_gateway_attachment_id):
+ transit_gateway_attachment = self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ]
+ transit_gateway_attachment.state = "deleted"
+ transit_gateway_attachment.status.deleted()
+ return transit_gateway_attachment
diff --git a/contrib/python/moto/py3/moto/ec2/models/transit_gateway_route_tables.py b/contrib/python/moto/py3/moto/ec2/models/transit_gateway_route_tables.py
new file mode 100644
index 0000000000..14a9a6c02d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/transit_gateway_route_tables.py
@@ -0,0 +1,360 @@
+from datetime import datetime
+from moto.core.utils import iso_8601_datetime_with_milliseconds
+from moto.utilities.utils import filter_resources
+from .core import TaggedEC2Resource
+from ..utils import random_transit_gateway_route_table_id
+
+
+class TransitGatewayRouteTable(TaggedEC2Resource):
+ def __init__(
+ self,
+ backend,
+ transit_gateway_id,
+ tags=None,
+ default_association_route_table=False,
+ default_propagation_route_table=False,
+ ):
+ self.ec2_backend = backend
+ self.id = random_transit_gateway_route_table_id()
+ self.transit_gateway_id = transit_gateway_id
+
+ self._created_at = datetime.utcnow()
+
+ self.default_association_route_table = default_association_route_table
+ self.default_propagation_route_table = default_propagation_route_table
+ self.state = "available"
+ self.routes = {}
+ self.add_tags(tags or {})
+ self.route_table_association = {}
+ self.route_table_propagation = {}
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def create_time(self):
+ return iso_8601_datetime_with_milliseconds(self._created_at)
+
+
+class TransitGatewayRouteTableBackend:
+ def __init__(self):
+ self.transit_gateways_route_tables = {}
+
+ def create_transit_gateway_route_table(
+ self,
+ transit_gateway_id,
+ tags=None,
+ default_association_route_table=False,
+ default_propagation_route_table=False,
+ ):
+ transit_gateways_route_table = TransitGatewayRouteTable(
+ self,
+ transit_gateway_id=transit_gateway_id,
+ tags=tags,
+ default_association_route_table=default_association_route_table,
+ default_propagation_route_table=default_propagation_route_table,
+ )
+ self.transit_gateways_route_tables[
+ transit_gateways_route_table.id
+ ] = transit_gateways_route_table
+ return transit_gateways_route_table
+
+ def get_all_transit_gateway_route_tables(
+ self, transit_gateway_route_table_ids=None, filters=None
+ ):
+ transit_gateway_route_tables = list(self.transit_gateways_route_tables.values())
+
+ attr_pairs = (
+ ("default-association-route-table", "default_association_route_table"),
+ ("default-propagation-route-table", "default_propagation_route_table"),
+ ("state", "state"),
+ ("transit-gateway-id", "transit_gateway_id"),
+ ("transit-gateway-route-table-id", "id"),
+ )
+
+ if transit_gateway_route_table_ids:
+ transit_gateway_route_tables = [
+ transit_gateway_route_table
+ for transit_gateway_route_table in transit_gateway_route_tables
+ if transit_gateway_route_table.id in transit_gateway_route_table_ids
+ ]
+
+ result = transit_gateway_route_tables
+ if filters:
+ result = filter_resources(transit_gateway_route_tables, filters, attr_pairs)
+ return result
+
+ def delete_transit_gateway_route_table(self, transit_gateway_route_table_id):
+ transit_gateways_route_table = self.transit_gateways_route_tables[
+ transit_gateway_route_table_id
+ ]
+ transit_gateways_route_table.state = "deleted"
+ return transit_gateways_route_table
+
+ def create_transit_gateway_route(
+ self,
+ transit_gateway_route_table_id,
+ destination_cidr_block,
+ transit_gateway_attachment_id=None,
+ blackhole=False,
+ ):
+ transit_gateways_route_table = self.transit_gateways_route_tables.get(
+ transit_gateway_route_table_id
+ )
+ transit_gateway_attachment = self.transit_gateway_attachments.get(
+ transit_gateway_attachment_id
+ )
+ transit_gateways_route_table.routes[destination_cidr_block] = {
+ "destinationCidrBlock": destination_cidr_block,
+ "prefixListId": "",
+ "state": "blackhole" if blackhole else "active",
+ "type": "static",
+ }
+
+ if transit_gateway_attachment:
+ transit_gateway_attachment_dict = {
+ "transitGatewayAttachments": {
+ "resourceId": transit_gateway_attachment.resource_id,
+ "resourceType": transit_gateway_attachment.resource_type,
+ "transitGatewayAttachmentId": transit_gateway_attachment_id,
+ }
+ }
+ transit_gateways_route_table.routes[destination_cidr_block].update(
+ transit_gateway_attachment_dict
+ )
+ return transit_gateways_route_table.routes[destination_cidr_block]
+
+ def delete_transit_gateway_route(
+ self, transit_gateway_route_table_id, destination_cidr_block
+ ):
+ transit_gateways_route_table = self.transit_gateways_route_tables[
+ transit_gateway_route_table_id
+ ]
+ transit_gateways_route_table.routes[destination_cidr_block]["state"] = "deleted"
+ return transit_gateways_route_table
+
+ def search_transit_gateway_routes(
+ self, transit_gateway_route_table_id, filters, max_results=None
+ ):
+ """
+ The following filters are currently supported: type, state, route-search.exact-match
+ """
+ transit_gateway_route_table = self.transit_gateways_route_tables.get(
+ transit_gateway_route_table_id
+ )
+ if not transit_gateway_route_table:
+ return []
+
+ attr_pairs = (
+ ("type", "type"),
+ ("state", "state"),
+ ("route-search.exact-match", "destinationCidrBlock"),
+ )
+
+ routes = transit_gateway_route_table.routes.copy()
+ for key in transit_gateway_route_table.routes:
+ for attrs in attr_pairs:
+ values = filters.get(attrs[0]) or None
+ if values:
+ if routes.get(key).get(attrs[1]) not in values:
+ routes.pop(key)
+ break
+ if max_results:
+ routes = routes[: int(max_results)]
+ return routes
+
+ def set_route_table_association(
+ self, transit_gateway_attachment_id, transit_gateway_route_table_id
+ ):
+ self.transit_gateways_route_tables[
+ transit_gateway_route_table_id
+ ].route_table_association = {
+ "resourceId": self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_id,
+ "resourceType": self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_type,
+ "state": "associated",
+ "transitGatewayAttachmentId": transit_gateway_attachment_id,
+ }
+
+ def unset_route_table_association(self, tgw_rt_id):
+ tgw_rt = self.transit_gateways_route_tables[tgw_rt_id]
+ tgw_rt.route_table_association = {}
+
+ def set_route_table_propagation(
+ self, transit_gateway_attachment_id, transit_gateway_route_table_id
+ ):
+ self.transit_gateways_route_tables[
+ transit_gateway_route_table_id
+ ].route_table_propagation = {
+ "resourceId": self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_id,
+ "resourceType": self.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_type,
+ "state": "enabled",
+ "transitGatewayAttachmentId": transit_gateway_attachment_id,
+ }
+
+ def unset_route_table_propagation(self, tgw_rt_id):
+ tgw_rt = self.transit_gateways_route_tables[tgw_rt_id]
+ tgw_rt.route_table_propagation = {}
+
+ def disable_route_table_propagation(self, transit_gateway_route_table_id):
+ self.transit_gateways_route_tables[
+ transit_gateway_route_table_id
+ ].route_table_propagation = {}
+
+ def get_all_transit_gateway_route_table_associations(
+ self, transit_gateway_route_table_id=None, filters=None
+ ):
+ transit_gateway_route_tables = list(self.transit_gateways_route_tables.values())
+
+ if transit_gateway_route_tables:
+ transit_gateway_route_tables = [
+ transit_gateway_route_table
+ for transit_gateway_route_table in transit_gateway_route_tables
+ if transit_gateway_route_table.id in transit_gateway_route_table_id
+ ]
+
+ attr_pairs = (
+ ("resource-id", "route_table_association", "resourceId"),
+ ("resource-type", "route_table_association", "resourceType"),
+ (
+ "transit-gateway-attachment-id",
+ "route_table_association",
+ "transitGatewayAttachmentId",
+ ),
+ )
+
+ result = transit_gateway_route_tables
+ if filters:
+ result = filter_resources(transit_gateway_route_tables, filters, attr_pairs)
+ return result
+
+ def get_all_transit_gateway_route_table_propagations(
+ self, transit_gateway_route_table_id=None, filters=None
+ ):
+ transit_gateway_route_tables = list(self.transit_gateways_route_tables.values())
+
+ if transit_gateway_route_tables:
+ transit_gateway_route_tables = [
+ transit_gateway_route_table
+ for transit_gateway_route_table in transit_gateway_route_tables
+ if transit_gateway_route_table.id in transit_gateway_route_table_id
+ ]
+
+ attr_pairs = (
+ ("resource-id", "route_table_propagation", "resourceId"),
+ ("resource-type", "route_table_propagation", "resourceType"),
+ (
+ "transit-gateway-attachment-id",
+ "route_table_propagation",
+ "transitGatewayAttachmentId",
+ ),
+ )
+
+ result = transit_gateway_route_tables
+ if filters:
+ result = filter_resources(transit_gateway_route_tables, filters, attr_pairs)
+ return result
+
+
+class TransitGatewayRelations(object):
+ # this class is for TransitGatewayAssociation and TransitGatewayPropagation
+ def __init__(
+ self,
+ backend,
+ transit_gateway_attachment_id=None,
+ transit_gateway_route_table_id=None,
+ state=None,
+ ):
+ self.ec2_backend = backend
+ self.transit_gateway_attachment_id = transit_gateway_attachment_id
+ self.transit_gateway_route_table_id = transit_gateway_route_table_id
+ self.resource_id = backend.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_id
+ self.resource_type = backend.transit_gateway_attachments[
+ transit_gateway_attachment_id
+ ].resource_type
+ self.state = state
+
+
+class TransitGatewayRelationsBackend:
+ def __init__(self):
+ self.transit_gateway_associations = {}
+ self.transit_gateway_propagations = {}
+
+ def associate_transit_gateway_route_table(
+ self, transit_gateway_attachment_id=None, transit_gateway_route_table_id=None
+ ):
+ transit_gateway_association = TransitGatewayRelations(
+ self,
+ transit_gateway_attachment_id,
+ transit_gateway_route_table_id,
+ state="associated",
+ )
+ self.set_route_table_association(
+ transit_gateway_attachment_id, transit_gateway_route_table_id
+ )
+ self.set_attachment_association(
+ transit_gateway_attachment_id, transit_gateway_route_table_id
+ )
+ self.transit_gateway_associations[
+ transit_gateway_attachment_id
+ ] = transit_gateway_association
+
+ return transit_gateway_association
+
+ def enable_transit_gateway_route_table_propagation(
+ self, transit_gateway_attachment_id=None, transit_gateway_route_table_id=None
+ ):
+ transit_gateway_propagation = TransitGatewayRelations(
+ self,
+ transit_gateway_attachment_id,
+ transit_gateway_route_table_id,
+ state="enabled",
+ )
+ self.set_route_table_propagation(
+ transit_gateway_attachment_id, transit_gateway_route_table_id
+ )
+ self.set_attachment_propagation(
+ transit_gateway_attachment_id, transit_gateway_route_table_id
+ )
+ self.transit_gateway_propagations[
+ transit_gateway_attachment_id
+ ] = transit_gateway_propagation
+
+ return transit_gateway_propagation
+
+ def disable_transit_gateway_route_table_propagation(
+ self, transit_gateway_attachment_id=None, transit_gateway_route_table_id=None
+ ):
+ self.disable_route_table_propagation(
+ transit_gateway_route_table_id=transit_gateway_route_table_id
+ )
+ self.disable_attachment_propagation(
+ transit_gateway_attachment_id=transit_gateway_attachment_id
+ )
+ self.transit_gateway_propagations[
+ transit_gateway_attachment_id
+ ].state = "disabled"
+ transit_gateway_propagation = self.transit_gateway_propagations.pop(
+ transit_gateway_attachment_id
+ )
+
+ return transit_gateway_propagation
+
+ def disassociate_transit_gateway_route_table(self, tgw_attach_id, tgw_rt_id):
+ tgw_association = self.transit_gateway_associations.pop(tgw_attach_id)
+ tgw_association.state = "disassociated"
+
+ self.unset_route_table_association(tgw_rt_id)
+ self.unset_attachment_association(tgw_attach_id)
+
+ return tgw_association
diff --git a/contrib/python/moto/py3/moto/ec2/models/vpc_peering_connections.py b/contrib/python/moto/py3/moto/ec2/models/vpc_peering_connections.py
new file mode 100644
index 0000000000..c37d5196f3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/vpc_peering_connections.py
@@ -0,0 +1,164 @@
+import weakref
+from collections import defaultdict
+from moto.core import CloudFormationModel
+from ..exceptions import (
+ InvalidVPCPeeringConnectionIdError,
+ InvalidVPCPeeringConnectionStateTransitionError,
+ OperationNotPermitted2,
+ OperationNotPermitted3,
+)
+from .core import TaggedEC2Resource
+from ..utils import random_vpc_peering_connection_id
+
+
+class PeeringConnectionStatus(object):
+ def __init__(self, code="initiating-request", message=""):
+ self.code = code
+ self.message = message
+
+ def deleted(self):
+ self.code = "deleted"
+ self.message = "Deleted by {deleter ID}"
+
+ def initiating(self):
+ self.code = "initiating-request"
+ self.message = "Initiating Request to {accepter ID}"
+
+ def pending(self):
+ self.code = "pending-acceptance"
+ self.message = "Pending Acceptance by {accepter ID}"
+
+ def accept(self):
+ self.code = "active"
+ self.message = "Active"
+
+ def reject(self):
+ self.code = "rejected"
+ self.message = "Inactive"
+
+
+class VPCPeeringConnection(TaggedEC2Resource, CloudFormationModel):
+ DEFAULT_OPTIONS = {
+ "AllowEgressFromLocalClassicLinkToRemoteVpc": "false",
+ "AllowEgressFromLocalVpcToRemoteClassicLink": "false",
+ "AllowDnsResolutionFromRemoteVpc": "false",
+ }
+
+ def __init__(self, backend, vpc_pcx_id, vpc, peer_vpc, tags=None):
+ self.id = vpc_pcx_id
+ self.ec2_backend = backend
+ self.vpc = vpc
+ self.peer_vpc = peer_vpc
+ self.requester_options = self.DEFAULT_OPTIONS.copy()
+ self.accepter_options = self.DEFAULT_OPTIONS.copy()
+ self.add_tags(tags or {})
+ self._status = PeeringConnectionStatus()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html
+ return "AWS::EC2::VPCPeeringConnection"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ vpc = ec2_backend.get_vpc(properties["VpcId"])
+ peer_vpc = ec2_backend.get_vpc(properties["PeerVpcId"])
+
+ vpc_pcx = ec2_backend.create_vpc_peering_connection(vpc, peer_vpc)
+
+ return vpc_pcx
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+
+class VPCPeeringConnectionBackend:
+ # for cross region vpc reference
+ vpc_pcx_refs = defaultdict(set)
+
+ def __init__(self):
+ self.vpc_pcxs = {}
+ self.vpc_pcx_refs[self.__class__].add(weakref.ref(self))
+
+ @classmethod
+ def get_vpc_pcx_refs(cls):
+ for inst_ref in cls.vpc_pcx_refs[cls]:
+ inst = inst_ref()
+ if inst is not None:
+ yield inst
+
+ def create_vpc_peering_connection(self, vpc, peer_vpc, tags=None):
+ vpc_pcx_id = random_vpc_peering_connection_id()
+ vpc_pcx = VPCPeeringConnection(self, vpc_pcx_id, vpc, peer_vpc, tags)
+ vpc_pcx._status.pending()
+ self.vpc_pcxs[vpc_pcx_id] = vpc_pcx
+ # insert cross region peering info
+ if vpc.ec2_backend.region_name != peer_vpc.ec2_backend.region_name:
+ for vpc_pcx_cx in peer_vpc.ec2_backend.get_vpc_pcx_refs():
+ if vpc_pcx_cx.region_name == peer_vpc.ec2_backend.region_name:
+ vpc_pcx_cx.vpc_pcxs[vpc_pcx_id] = vpc_pcx
+ return vpc_pcx
+
+ def describe_vpc_peering_connections(self, vpc_peering_ids=None):
+ all_pcxs = self.vpc_pcxs.copy().values()
+ if vpc_peering_ids:
+ return [pcx for pcx in all_pcxs if pcx.id in vpc_peering_ids]
+ return all_pcxs
+
+ def get_vpc_peering_connection(self, vpc_pcx_id):
+ if vpc_pcx_id not in self.vpc_pcxs:
+ raise InvalidVPCPeeringConnectionIdError(vpc_pcx_id)
+ return self.vpc_pcxs.get(vpc_pcx_id)
+
+ def delete_vpc_peering_connection(self, vpc_pcx_id):
+ deleted = self.get_vpc_peering_connection(vpc_pcx_id)
+ deleted._status.deleted()
+ return deleted
+
+ def accept_vpc_peering_connection(self, vpc_pcx_id):
+ vpc_pcx = self.get_vpc_peering_connection(vpc_pcx_id)
+ # if cross region need accepter from another region
+ pcx_req_region = vpc_pcx.vpc.ec2_backend.region_name
+ pcx_acp_region = vpc_pcx.peer_vpc.ec2_backend.region_name
+ if pcx_req_region != pcx_acp_region and self.region_name == pcx_req_region:
+ raise OperationNotPermitted2(self.region_name, vpc_pcx.id, pcx_acp_region)
+ if vpc_pcx._status.code != "pending-acceptance":
+ raise InvalidVPCPeeringConnectionStateTransitionError(vpc_pcx.id)
+ vpc_pcx._status.accept()
+ return vpc_pcx
+
+ def reject_vpc_peering_connection(self, vpc_pcx_id):
+ vpc_pcx = self.get_vpc_peering_connection(vpc_pcx_id)
+ # if cross region need accepter from another region
+ pcx_req_region = vpc_pcx.vpc.ec2_backend.region_name
+ pcx_acp_region = vpc_pcx.peer_vpc.ec2_backend.region_name
+ if pcx_req_region != pcx_acp_region and self.region_name == pcx_req_region:
+ raise OperationNotPermitted3(self.region_name, vpc_pcx.id, pcx_acp_region)
+ if vpc_pcx._status.code != "pending-acceptance":
+ raise InvalidVPCPeeringConnectionStateTransitionError(vpc_pcx.id)
+ vpc_pcx._status.reject()
+ return vpc_pcx
+
+ def modify_vpc_peering_connection_options(
+ self, vpc_pcx_id, accepter_options=None, requester_options=None
+ ):
+ vpc_pcx = self.get_vpc_peering_connection(vpc_pcx_id)
+ if not vpc_pcx:
+ raise InvalidVPCPeeringConnectionIdError(vpc_pcx_id)
+ # TODO: check if actual vpc has this options enabled
+ if accepter_options:
+ vpc_pcx.accepter_options.update(accepter_options)
+ if requester_options:
+ vpc_pcx.requester_options.update(requester_options)
diff --git a/contrib/python/moto/py3/moto/ec2/models/vpc_service_configuration.py b/contrib/python/moto/py3/moto/ec2/models/vpc_service_configuration.py
new file mode 100644
index 0000000000..6f3f5e6499
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/vpc_service_configuration.py
@@ -0,0 +1,131 @@
+from moto.core import CloudFormationModel
+from moto.core.utils import get_random_hex
+from .core import TaggedEC2Resource
+from ..exceptions import UnknownVpcEndpointService
+
+
+class VPCServiceConfiguration(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self, load_balancers, region, acceptance_required, private_dns_name, ec2_backend
+ ):
+ self.id = f"vpce-svc-{get_random_hex(length=8)}"
+ self.service_name = f"com.amazonaws.vpce.{region}.{self.id}"
+ self.service_state = "Available"
+
+ self.availability_zones = []
+ for lb in load_balancers:
+ for subnet in lb.subnets:
+ self.availability_zones.append(subnet.availability_zone)
+
+ self.gateway_load_balancer_arns = []
+ self.network_load_balancer_arns = []
+ for lb in load_balancers:
+ if lb.loadbalancer_type == "network":
+ self.service_type = "Interface"
+ self.network_load_balancer_arns.append(lb.arn)
+ else:
+ self.service_type = "Gateway"
+ self.gateway_load_balancer_arns.append(lb.arn)
+
+ self.acceptance_required = acceptance_required
+ self.manages_vpc_endpoints = False
+ self.private_dns_name = private_dns_name
+ self.endpoint_dns_name = f"{self.id}.{region}.vpce.amazonaws.com"
+
+ self.principals = []
+ self.ec2_backend = ec2_backend
+
+
+class VPCServiceConfigurationBackend:
+ def __init__(self):
+ self.configurations = {}
+
+ @property
+ def elbv2_backend(self):
+ from moto.elbv2.models import elbv2_backends
+
+ return elbv2_backends[self.region_name]
+
+ def get_vpc_endpoint_service(self, resource_id):
+ return self.configurations.get(resource_id)
+
+ def create_vpc_endpoint_service_configuration(
+ self, lb_arns, acceptance_required, private_dns_name, tags
+ ):
+ lbs = self.elbv2_backend.describe_load_balancers(arns=lb_arns, names=None)
+ config = VPCServiceConfiguration(
+ load_balancers=lbs,
+ region=self.region_name,
+ acceptance_required=acceptance_required,
+ private_dns_name=private_dns_name,
+ ec2_backend=self,
+ )
+ for tag in tags or []:
+ tag_key = tag.get("Key")
+ tag_value = tag.get("Value")
+ config.add_tag(tag_key, tag_value)
+
+ self.configurations[config.id] = config
+ return config
+
+ def describe_vpc_endpoint_service_configurations(self, service_ids):
+ """
+ The Filters, MaxResults, NextToken parameters are not yet implemented
+ """
+ if service_ids:
+ found_configs = []
+ for service_id in service_ids:
+ if service_id in self.configurations:
+ found_configs.append(self.configurations[service_id])
+ else:
+ raise UnknownVpcEndpointService(service_id)
+ return found_configs
+ return self.configurations.copy().values()
+
+ def delete_vpc_endpoint_service_configurations(self, service_ids):
+ missing = [s for s in service_ids if s not in self.configurations]
+ for s in service_ids:
+ self.configurations.pop(s, None)
+ return missing
+
+ def describe_vpc_endpoint_service_permissions(self, service_id):
+ """
+ The Filters, MaxResults, NextToken parameters are not yet implemented
+ """
+ config = self.describe_vpc_endpoint_service_configurations([service_id])[0]
+ return config.principals
+
+ def modify_vpc_endpoint_service_permissions(
+ self, service_id, add_principals, remove_principals
+ ):
+ config = self.describe_vpc_endpoint_service_configurations([service_id])[0]
+ config.principals += add_principals
+ config.principals = [p for p in config.principals if p not in remove_principals]
+ config.principals = list(set(config.principals))
+
+ def modify_vpc_endpoint_service_configuration(
+ self,
+ service_id,
+ acceptance_required,
+ private_dns_name,
+ add_network_lbs,
+ remove_network_lbs,
+ add_gateway_lbs,
+ remove_gateway_lbs,
+ ):
+ """
+ The following parameters are not yet implemented: RemovePrivateDnsName
+ """
+ config = self.describe_vpc_endpoint_service_configurations([service_id])[0]
+ if private_dns_name is not None:
+ config.private_dns_name = private_dns_name
+ if acceptance_required is not None:
+ config.acceptance_required = str(acceptance_required).lower() == "true"
+ for lb in add_network_lbs:
+ config.network_load_balancer_arns.append(lb)
+ for lb in remove_network_lbs:
+ config.network_load_balancer_arns.remove(lb)
+ for lb in add_gateway_lbs:
+ config.gateway_load_balancer_arns.append(lb)
+ for lb in remove_gateway_lbs:
+ config.gateway_load_balancer_arns.remove(lb)
diff --git a/contrib/python/moto/py3/moto/ec2/models/vpcs.py b/contrib/python/moto/py3/moto/ec2/models/vpcs.py
new file mode 100644
index 0000000000..ba6d4a51fc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/vpcs.py
@@ -0,0 +1,782 @@
+import ipaddress
+import json
+import weakref
+from collections import defaultdict
+from operator import itemgetter
+
+from moto.core import get_account_id
+from moto.core import CloudFormationModel
+from .core import TaggedEC2Resource
+from ..exceptions import (
+ CidrLimitExceeded,
+ UnsupportedTenancy,
+ DependencyViolationError,
+ InvalidCIDRBlockParameterError,
+ InvalidServiceName,
+ InvalidFilter,
+ InvalidNextToken,
+ InvalidParameterValueError,
+ InvalidVpcCidrBlockAssociationIdError,
+ InvalidVPCIdError,
+ InvalidVPCRangeError,
+ OperationNotPermitted,
+ InvalidVpcEndPointIdError,
+)
+from .availability_zones_and_regions import RegionsAndZonesBackend
+from ..utils import (
+ random_ipv6_cidr,
+ random_vpc_ep_id,
+ random_private_ip,
+ create_dns_entries,
+ random_vpc_id,
+ random_vpc_cidr_association_id,
+ generic_filter,
+ utc_date_and_time,
+)
+
+MAX_NUMBER_OF_ENDPOINT_SERVICES_RESULTS = 1000
+DEFAULT_VPC_ENDPOINT_SERVICES = []
+
+
+class VPCEndPoint(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ endpoint_id,
+ vpc_id,
+ service_name,
+ endpoint_type=None,
+ policy_document=False,
+ route_table_ids=None,
+ subnet_ids=None,
+ network_interface_ids=None,
+ dns_entries=None,
+ client_token=None,
+ security_group_ids=None,
+ tags=None,
+ private_dns_enabled=None,
+ destination_prefix_list_id=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = endpoint_id
+ self.vpc_id = vpc_id
+ self.service_name = service_name
+ self.endpoint_type = endpoint_type
+ self.state = "available"
+ self.policy_document = policy_document
+ self.route_table_ids = route_table_ids
+ self.network_interface_ids = network_interface_ids or []
+ self.subnet_ids = subnet_ids
+ self.client_token = client_token
+ self.security_group_ids = security_group_ids
+ self.private_dns_enabled = private_dns_enabled
+ self.dns_entries = dns_entries
+ self.add_tags(tags or {})
+ self.destination_prefix_list_id = destination_prefix_list_id
+
+ self.created_at = utc_date_and_time()
+
+ def get_filter_value(self, filter_name):
+ if filter_name in ("vpc-endpoint-type", "vpc_endpoint_type"):
+ return self.endpoint_type
+ else:
+ return super().get_filter_value(filter_name, "DescribeVpcs")
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::EC2::VPCEndpoint"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ service_name = properties.get("ServiceName")
+ subnet_ids = properties.get("SubnetIds")
+ vpc_endpoint_type = properties.get("VpcEndpointType")
+ vpc_id = properties.get("VpcId")
+ policy_document = properties.get("PolicyDocument")
+ private_dns_enabled = properties.get("PrivateDnsEnabled")
+ route_table_ids = properties.get("RouteTableIds")
+ security_group_ids = properties.get("SecurityGroupIds")
+
+ ec2_backend = ec2_backends[region_name]
+ vpc_endpoint = ec2_backend.create_vpc_endpoint(
+ vpc_id=vpc_id,
+ service_name=service_name,
+ endpoint_type=vpc_endpoint_type,
+ subnet_ids=subnet_ids,
+ policy_document=policy_document,
+ private_dns_enabled=private_dns_enabled,
+ route_table_ids=route_table_ids,
+ security_group_ids=security_group_ids,
+ )
+ return vpc_endpoint
+
+
+class VPC(TaggedEC2Resource, CloudFormationModel):
+ def __init__(
+ self,
+ ec2_backend,
+ vpc_id,
+ cidr_block,
+ is_default,
+ instance_tenancy="default",
+ amazon_provided_ipv6_cidr_block=False,
+ ):
+
+ self.ec2_backend = ec2_backend
+ self.id = vpc_id
+ self.cidr_block = cidr_block
+ self.cidr_block_association_set = {}
+ self.dhcp_options = None
+ self.state = "available"
+ self.instance_tenancy = instance_tenancy
+ self.is_default = "true" if is_default else "false"
+ self.enable_dns_support = "true"
+ self.classic_link_enabled = "false"
+ self.classic_link_dns_supported = "false"
+ # This attribute is set to 'true' only for default VPCs
+ # or VPCs created using the wizard of the VPC console
+ self.enable_dns_hostnames = "true" if is_default else "false"
+
+ self.associate_vpc_cidr_block(cidr_block)
+ if amazon_provided_ipv6_cidr_block:
+ self.associate_vpc_cidr_block(
+ cidr_block,
+ amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_block,
+ )
+
+ @property
+ def owner_id(self):
+ return get_account_id()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html
+ return "AWS::EC2::VPC"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ vpc = ec2_backend.create_vpc(
+ cidr_block=properties["CidrBlock"],
+ instance_tenancy=properties.get("InstanceTenancy", "default"),
+ )
+ for tag in properties.get("Tags", []):
+ tag_key = tag["Key"]
+ tag_value = tag["Value"]
+ vpc.add_tag(tag_key, tag_value)
+
+ return vpc
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name in ("vpc-id", "vpcId"):
+ return self.id
+ elif filter_name in ("cidr", "cidr-block", "cidrBlock"):
+ return self.cidr_block
+ elif filter_name in (
+ "cidr-block-association.cidr-block",
+ "ipv6-cidr-block-association.ipv6-cidr-block",
+ ):
+ return [
+ c["cidr_block"]
+ for c in self.get_cidr_block_association_set(ipv6="ipv6" in filter_name)
+ ]
+ elif filter_name in (
+ "cidr-block-association.association-id",
+ "ipv6-cidr-block-association.association-id",
+ ):
+ return self.cidr_block_association_set.keys()
+ elif filter_name in (
+ "cidr-block-association.state",
+ "ipv6-cidr-block-association.state",
+ ):
+ return [
+ c["cidr_block_state"]["state"]
+ for c in self.get_cidr_block_association_set(ipv6="ipv6" in filter_name)
+ ]
+ elif filter_name in ("instance_tenancy", "InstanceTenancy"):
+ return self.instance_tenancy
+ elif filter_name in ("is-default", "isDefault"):
+ return self.is_default
+ elif filter_name == "state":
+ return self.state
+ elif filter_name in ("dhcp-options-id", "dhcpOptionsId"):
+ if not self.dhcp_options:
+ return None
+ return self.dhcp_options.id
+ else:
+ return super().get_filter_value(filter_name, "DescribeVpcs")
+
+ def modify_vpc_tenancy(self, tenancy):
+ if tenancy != "default":
+ raise UnsupportedTenancy(tenancy)
+ self.instance_tenancy = tenancy
+ return True
+
+ def associate_vpc_cidr_block(
+ self, cidr_block, amazon_provided_ipv6_cidr_block=False
+ ):
+ max_associations = 5 if not amazon_provided_ipv6_cidr_block else 1
+
+ for cidr in self.cidr_block_association_set.copy():
+ if (
+ self.cidr_block_association_set.get(cidr)
+ .get("cidr_block_state")
+ .get("state")
+ == "disassociated"
+ ):
+ self.cidr_block_association_set.pop(cidr)
+ if (
+ len(self.get_cidr_block_association_set(amazon_provided_ipv6_cidr_block))
+ >= max_associations
+ ):
+ raise CidrLimitExceeded(self.id, max_associations)
+
+ association_id = random_vpc_cidr_association_id()
+
+ association_set = {
+ "association_id": association_id,
+ "cidr_block_state": {"state": "associated", "StatusMessage": ""},
+ }
+
+ association_set["cidr_block"] = (
+ random_ipv6_cidr() if amazon_provided_ipv6_cidr_block else cidr_block
+ )
+ self.cidr_block_association_set[association_id] = association_set
+ return association_set
+
+ def enable_vpc_classic_link(self):
+ # Check if current cidr block doesn't fall within the 10.0.0.0/8 block, excluding 10.0.0.0/16 and 10.1.0.0/16.
+ # Doesn't check any route tables, maybe something for in the future?
+ # See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html#classiclink-limitations
+ network_address = ipaddress.ip_network(self.cidr_block).network_address
+ if (
+ network_address not in ipaddress.ip_network("10.0.0.0/8")
+ or network_address in ipaddress.ip_network("10.0.0.0/16")
+ or network_address in ipaddress.ip_network("10.1.0.0/16")
+ ):
+ self.classic_link_enabled = "true"
+
+ return self.classic_link_enabled
+
+ def disable_vpc_classic_link(self):
+ self.classic_link_enabled = "false"
+ return self.classic_link_enabled
+
+ def enable_vpc_classic_link_dns_support(self):
+ self.classic_link_dns_supported = "true"
+ return self.classic_link_dns_supported
+
+ def disable_vpc_classic_link_dns_support(self):
+ self.classic_link_dns_supported = "false"
+ return self.classic_link_dns_supported
+
+ def disassociate_vpc_cidr_block(self, association_id):
+ if self.cidr_block == self.cidr_block_association_set.get(
+ association_id, {}
+ ).get("cidr_block"):
+ raise OperationNotPermitted(association_id)
+
+ entry = response = self.cidr_block_association_set.get(association_id, {})
+ if entry:
+ response = json.loads(json.dumps(entry))
+ response["vpc_id"] = self.id
+ response["cidr_block_state"]["state"] = "disassociating"
+ entry["cidr_block_state"]["state"] = "disassociated"
+ return response
+
+ def get_cidr_block_association_set(self, ipv6=False):
+ return [
+ c
+ for c in self.cidr_block_association_set.values()
+ if ("::/" if ipv6 else ".") in c.get("cidr_block")
+ ]
+
+
+class VPCBackend:
+ vpc_refs = defaultdict(set)
+
+ def __init__(self):
+ self.vpcs = {}
+ self.vpc_end_points = {}
+ self.vpc_refs[self.__class__].add(weakref.ref(self))
+
+ def create_vpc(
+ self,
+ cidr_block,
+ instance_tenancy="default",
+ amazon_provided_ipv6_cidr_block=False,
+ tags=None,
+ ):
+ vpc_id = random_vpc_id()
+ try:
+ vpc_cidr_block = ipaddress.IPv4Network(str(cidr_block), strict=False)
+ except ValueError:
+ raise InvalidCIDRBlockParameterError(cidr_block)
+ if vpc_cidr_block.prefixlen < 16 or vpc_cidr_block.prefixlen > 28:
+ raise InvalidVPCRangeError(cidr_block)
+ vpc = VPC(
+ self,
+ vpc_id,
+ cidr_block,
+ len(self.vpcs) == 0,
+ instance_tenancy,
+ amazon_provided_ipv6_cidr_block,
+ )
+
+ for tag in tags or []:
+ tag_key = tag.get("Key")
+ tag_value = tag.get("Value")
+ vpc.add_tag(tag_key, tag_value)
+
+ self.vpcs[vpc_id] = vpc
+
+ # AWS creates a default main route table and security group.
+ self.create_route_table(vpc_id, main=True)
+
+ # AWS creates a default Network ACL
+ self.create_network_acl(vpc_id, default=True)
+
+ default = self.get_security_group_from_name("default", vpc_id=vpc_id)
+ if not default:
+ self.create_security_group(
+ "default", "default VPC security group", vpc_id=vpc_id, is_default=True
+ )
+
+ return vpc
+
+ def get_vpc(self, vpc_id):
+ if vpc_id not in self.vpcs:
+ raise InvalidVPCIdError(vpc_id)
+ return self.vpcs.get(vpc_id)
+
+ def describe_vpcs(self, vpc_ids=None, filters=None):
+ matches = self.vpcs.copy().values()
+ if vpc_ids:
+ matches = [vpc for vpc in matches if vpc.id in vpc_ids]
+ if len(vpc_ids) > len(matches):
+ unknown_ids = set(vpc_ids) - set(matches)
+ raise InvalidVPCIdError(unknown_ids)
+ if filters:
+ matches = generic_filter(filters, matches)
+ return matches
+
+ def delete_vpc(self, vpc_id):
+ # Do not delete if any VPN Gateway is attached
+ vpn_gateways = self.describe_vpn_gateways(filters={"attachment.vpc-id": vpc_id})
+ vpn_gateways = [
+ item
+ for item in vpn_gateways
+ if item.attachments.get(vpc_id).state == "attached"
+ ]
+ if vpn_gateways:
+ raise DependencyViolationError(
+ "The vpc {0} has dependencies and cannot be deleted.".format(vpc_id)
+ )
+
+ # Delete route table if only main route table remains.
+ route_tables = self.describe_route_tables(filters={"vpc-id": vpc_id})
+ if len(route_tables) > 1:
+ raise DependencyViolationError(
+ "The vpc {0} has dependencies and cannot be deleted.".format(vpc_id)
+ )
+ for route_table in route_tables:
+ self.delete_route_table(route_table.id)
+
+ # Delete default security group if exists.
+ default = self.get_security_group_by_name_or_id("default", vpc_id=vpc_id)
+ if default:
+ self.delete_security_group(group_id=default.id)
+
+ # Now delete VPC.
+ vpc = self.vpcs.pop(vpc_id, None)
+ if not vpc:
+ raise InvalidVPCIdError(vpc_id)
+
+ if vpc.dhcp_options:
+ vpc.dhcp_options.vpc = None
+ self.delete_dhcp_options_set(vpc.dhcp_options.id)
+ vpc.dhcp_options = None
+ return vpc
+
+ def describe_vpc_attribute(self, vpc_id, attr_name):
+ vpc = self.get_vpc(vpc_id)
+ if attr_name in ("enable_dns_support", "enable_dns_hostnames"):
+ return getattr(vpc, attr_name)
+ else:
+ raise InvalidParameterValueError(attr_name)
+
+ def modify_vpc_tenancy(self, vpc_id, tenancy):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.modify_vpc_tenancy(tenancy)
+
+ def enable_vpc_classic_link(self, vpc_id):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.enable_vpc_classic_link()
+
+ def disable_vpc_classic_link(self, vpc_id):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.disable_vpc_classic_link()
+
+ def enable_vpc_classic_link_dns_support(self, vpc_id):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.enable_vpc_classic_link_dns_support()
+
+ def disable_vpc_classic_link_dns_support(self, vpc_id):
+ vpc = self.get_vpc(vpc_id)
+ return vpc.disable_vpc_classic_link_dns_support()
+
+ def modify_vpc_attribute(self, vpc_id, attr_name, attr_value):
+ vpc = self.get_vpc(vpc_id)
+ if attr_name in ("enable_dns_support", "enable_dns_hostnames"):
+ setattr(vpc, attr_name, attr_value)
+ else:
+ raise InvalidParameterValueError(attr_name)
+
+ def disassociate_vpc_cidr_block(self, association_id):
+ for vpc in self.vpcs.copy().values():
+ response = vpc.disassociate_vpc_cidr_block(association_id)
+ for route_table in self.route_tables.copy().values():
+ if route_table.vpc_id == response.get("vpc_id"):
+ if "::/" in response.get("cidr_block"):
+ self.delete_route(
+ route_table.id, None, response.get("cidr_block")
+ )
+ else:
+ self.delete_route(route_table.id, response.get("cidr_block"))
+ if response:
+ return response
+ raise InvalidVpcCidrBlockAssociationIdError(association_id)
+
+ def associate_vpc_cidr_block(
+ self, vpc_id, cidr_block, amazon_provided_ipv6_cidr_block
+ ):
+ vpc = self.get_vpc(vpc_id)
+ association_set = vpc.associate_vpc_cidr_block(
+ cidr_block, amazon_provided_ipv6_cidr_block
+ )
+ for route_table in self.route_tables.copy().values():
+ if route_table.vpc_id == vpc_id:
+ if amazon_provided_ipv6_cidr_block:
+ self.create_route(
+ route_table.id,
+ None,
+ destination_ipv6_cidr_block=association_set["cidr_block"],
+ local=True,
+ )
+ else:
+ self.create_route(
+ route_table.id, association_set["cidr_block"], local=True
+ )
+ return association_set
+
+ def create_vpc_endpoint(
+ self,
+ vpc_id,
+ service_name,
+ endpoint_type=None,
+ policy_document=False,
+ route_table_ids=None,
+ subnet_ids=None,
+ network_interface_ids=None,
+ dns_entries=None,
+ client_token=None,
+ security_group_ids=None,
+ tags=None,
+ private_dns_enabled=None,
+ ):
+
+ vpc_endpoint_id = random_vpc_ep_id()
+
+ # validates if vpc is present or not.
+ self.get_vpc(vpc_id)
+ destination_prefix_list_id = None
+
+ if endpoint_type and endpoint_type.lower() == "interface":
+
+ network_interface_ids = []
+ for subnet_id in subnet_ids or []:
+ self.get_subnet(subnet_id)
+ eni = self.create_network_interface(subnet_id, random_private_ip())
+ network_interface_ids.append(eni.id)
+
+ dns_entries = create_dns_entries(service_name, vpc_endpoint_id)
+
+ else:
+ # considering gateway if type is not mentioned.
+ for prefix_list in self.managed_prefix_lists.values():
+ if prefix_list.prefix_list_name == service_name:
+ destination_prefix_list_id = prefix_list.id
+
+ if dns_entries:
+ dns_entries = [dns_entries]
+
+ vpc_end_point = VPCEndPoint(
+ self,
+ vpc_endpoint_id,
+ vpc_id,
+ service_name,
+ endpoint_type,
+ policy_document,
+ route_table_ids,
+ subnet_ids,
+ network_interface_ids,
+ dns_entries,
+ client_token,
+ security_group_ids,
+ tags,
+ private_dns_enabled,
+ destination_prefix_list_id,
+ )
+
+ self.vpc_end_points[vpc_endpoint_id] = vpc_end_point
+
+ if destination_prefix_list_id:
+ for route_table_id in route_table_ids:
+ self.create_route(
+ route_table_id,
+ None,
+ gateway_id=vpc_endpoint_id,
+ destination_prefix_list_id=destination_prefix_list_id,
+ )
+
+ return vpc_end_point
+
+ def delete_vpc_endpoints(self, vpce_ids=None):
+ for vpce_id in vpce_ids or []:
+ vpc_endpoint = self.vpc_end_points.get(vpce_id, None)
+ if vpc_endpoint:
+ if vpc_endpoint.endpoint_type.lower() == "interface":
+ for eni_id in vpc_endpoint.network_interface_ids:
+ self.enis.pop(eni_id, None)
+ else:
+ for route_table_id in vpc_endpoint.route_table_ids:
+ self.delete_route(
+ route_table_id, vpc_endpoint.destination_prefix_list_id
+ )
+ vpc_endpoint.state = "deleted"
+ return True
+
+ def describe_vpc_endpoints(self, vpc_end_point_ids, filters=None):
+ vpc_end_points = self.vpc_end_points.values()
+
+ if vpc_end_point_ids:
+ vpc_end_points = [
+ vpc_end_point
+ for vpc_end_point in vpc_end_points
+ if vpc_end_point.id in vpc_end_point_ids
+ ]
+ if len(vpc_end_points) != len(vpc_end_point_ids):
+ invalid_id = list(
+ set(vpc_end_point_ids).difference(
+ set([vpc_end_point.id for vpc_end_point in vpc_end_points])
+ )
+ )[0]
+ raise InvalidVpcEndPointIdError(invalid_id)
+
+ return generic_filter(filters, vpc_end_points)
+
+ @staticmethod
+ def _collect_default_endpoint_services(region):
+ """Return list of default services using list of backends."""
+ if DEFAULT_VPC_ENDPOINT_SERVICES:
+ return DEFAULT_VPC_ENDPOINT_SERVICES
+
+ zones = [
+ zone.name
+ for zones in RegionsAndZonesBackend.zones.values()
+ for zone in zones
+ if zone.name.startswith(region)
+ ]
+
+ from moto import backends # pylint: disable=import-outside-toplevel
+
+ for _backends in backends.unique_backends():
+ if region in _backends:
+ service = _backends[region].default_vpc_endpoint_service(region, zones)
+ if service:
+ DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
+
+ if "global" in _backends:
+ service = _backends["global"].default_vpc_endpoint_service(
+ region, zones
+ )
+ if service:
+ DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
+ return DEFAULT_VPC_ENDPOINT_SERVICES
+
+ @staticmethod
+ def _matches_service_by_tags(service, filter_item):
+ """Return True if service tags are not filtered by their tags.
+
+ Note that the API specifies a key of "Values" for a filter, but
+ the botocore library returns "Value" instead.
+ """
+ # For convenience, collect the tags for this service.
+ service_tag_keys = {x["Key"] for x in service["Tags"]}
+ if not service_tag_keys:
+ return False
+
+ matched = True # assume the best
+ if filter_item["Name"] == "tag-key":
+ # Filters=[{"Name":"tag-key", "Values":["Name"]}],
+ # Any tag with this name, regardless of the tag value.
+ if not service_tag_keys & set(filter_item["Value"]):
+ matched = False
+
+ elif filter_item["Name"].startswith("tag:"):
+ # Filters=[{"Name":"tag:Name", "Values":["my-load-balancer"]}],
+ tag_name = filter_item["Name"].split(":")[1]
+ if not service_tag_keys & {tag_name}:
+ matched = False
+ else:
+ for tag in service["Tags"]:
+ if tag["Key"] == tag_name and tag["Value"] in filter_item["Value"]:
+ break
+ else:
+ matched = False
+ return matched
+
+ @staticmethod
+ def _filter_endpoint_services(service_names_filters, filters, services):
+ """Return filtered list of VPC endpoint services."""
+ if not service_names_filters and not filters:
+ return services
+
+ # Verify the filters are valid.
+ for filter_item in filters:
+ if filter_item["Name"] not in [
+ "service-name",
+ "service-type",
+ "tag-key",
+ ] and not filter_item["Name"].startswith("tag:"):
+ raise InvalidFilter(filter_item["Name"])
+
+ # Apply both the service_names filter and the filters themselves.
+ filtered_services = []
+ for service in services:
+ if (
+ service_names_filters
+ and service["ServiceName"] not in service_names_filters
+ ):
+ continue
+
+ # Note that the API specifies a key of "Values" for a filter, but
+ # the botocore library returns "Value" instead.
+ matched = True
+ for filter_item in filters:
+ if filter_item["Name"] == "service-name":
+ if service["ServiceName"] not in filter_item["Value"]:
+ matched = False
+
+ elif filter_item["Name"] == "service-type":
+ service_types = {x["ServiceType"] for x in service["ServiceType"]}
+ if not service_types & set(filter_item["Value"]):
+ matched = False
+
+ elif filter_item["Name"] == "tag-key" or filter_item["Name"].startswith(
+ "tag:"
+ ):
+ if not VPCBackend._matches_service_by_tags(service, filter_item):
+ matched = False
+
+ # Exit early -- don't bother checking the remaining filters
+ # as a non-match was found.
+ if not matched:
+ break
+
+ # Does the service have a matching service name or does it match
+ # a filter?
+ if matched:
+ filtered_services.append(service)
+
+ return filtered_services
+
+ def describe_vpc_endpoint_services(
+ self, dry_run, service_names, filters, max_results, next_token, region
+ ): # pylint: disable=unused-argument,too-many-arguments
+ """Return info on services to which you can create a VPC endpoint.
+
+ Currently only the default endpoing services are returned. When
+ create_vpc_endpoint_service_configuration() is implemented, a
+ list of those private endpoints would be kept and when this API
+ is invoked, those private endpoints would be added to the list of
+ default endpoint services.
+
+ The DryRun parameter is ignored.
+ """
+ default_services = self._collect_default_endpoint_services(region)
+ for service_name in service_names:
+ if service_name not in [x["ServiceName"] for x in default_services]:
+ raise InvalidServiceName(service_name)
+
+ # Apply filters specified in the service_names and filters arguments.
+ filtered_services = sorted(
+ self._filter_endpoint_services(service_names, filters, default_services),
+ key=itemgetter("ServiceName"),
+ )
+
+ # Determine the start index into list of services based on the
+ # next_token argument.
+ start = 0
+ vpce_ids = [x["ServiceId"] for x in filtered_services]
+ if next_token:
+ if next_token not in vpce_ids:
+ raise InvalidNextToken(next_token)
+ start = vpce_ids.index(next_token)
+
+ # Determine the stop index into the list of services based on the
+ # max_results argument.
+ if not max_results or max_results > MAX_NUMBER_OF_ENDPOINT_SERVICES_RESULTS:
+ max_results = MAX_NUMBER_OF_ENDPOINT_SERVICES_RESULTS
+
+ # If necessary, set the value of the next_token.
+ next_token = ""
+ if len(filtered_services) > (start + max_results):
+ service = filtered_services[start + max_results]
+ next_token = service["ServiceId"]
+
+ return {
+ "servicesDetails": filtered_services[start : start + max_results],
+ "serviceNames": [
+ x["ServiceName"] for x in filtered_services[start : start + max_results]
+ ],
+ "nextToken": next_token,
+ }
+
+ def get_vpc_end_point(self, vpc_end_point_id):
+ vpc_end_point = self.vpc_end_points.get(vpc_end_point_id)
+ if not vpc_end_point:
+ raise InvalidVpcEndPointIdError(vpc_end_point_id)
+ return vpc_end_point
diff --git a/contrib/python/moto/py3/moto/ec2/models/vpn_connections.py b/contrib/python/moto/py3/moto/ec2/models/vpn_connections.py
new file mode 100644
index 0000000000..18f8d7b856
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/vpn_connections.py
@@ -0,0 +1,96 @@
+from .core import TaggedEC2Resource
+from ..exceptions import InvalidVpnConnectionIdError
+from ..utils import generic_filter, random_vpn_connection_id
+
+
+class VPNConnection(TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ vpn_connection_id,
+ vpn_conn_type,
+ customer_gateway_id,
+ vpn_gateway_id=None,
+ transit_gateway_id=None,
+ tags=None,
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = vpn_connection_id
+ self.state = "available"
+ self.customer_gateway_configuration = {}
+ self.type = vpn_conn_type
+ self.customer_gateway_id = customer_gateway_id
+ self.vpn_gateway_id = vpn_gateway_id
+ self.transit_gateway_id = transit_gateway_id
+ self.tunnels = None
+ self.options = None
+ self.static_routes = None
+ self.add_tags(tags or {})
+
+ def get_filter_value(self, filter_name):
+ return super().get_filter_value(filter_name, "DescribeVpnConnections")
+
+
+class VPNConnectionBackend:
+ def __init__(self):
+ self.vpn_connections = {}
+
+ def create_vpn_connection(
+ self,
+ vpn_conn_type,
+ customer_gateway_id,
+ vpn_gateway_id=None,
+ transit_gateway_id=None,
+ static_routes_only=None,
+ tags=None,
+ ):
+ vpn_connection_id = random_vpn_connection_id()
+ if static_routes_only:
+ pass
+ vpn_connection = VPNConnection(
+ self,
+ vpn_connection_id=vpn_connection_id,
+ vpn_conn_type=vpn_conn_type,
+ customer_gateway_id=customer_gateway_id,
+ vpn_gateway_id=vpn_gateway_id,
+ transit_gateway_id=transit_gateway_id,
+ tags=tags,
+ )
+ self.vpn_connections[vpn_connection.id] = vpn_connection
+ return vpn_connection
+
+ def delete_vpn_connection(self, vpn_connection_id):
+
+ if vpn_connection_id in self.vpn_connections:
+ self.vpn_connections[vpn_connection_id].state = "deleted"
+ else:
+ raise InvalidVpnConnectionIdError(vpn_connection_id)
+ return self.vpn_connections[vpn_connection_id]
+
+ def describe_vpn_connections(self, vpn_connection_ids=None):
+ vpn_connections = []
+ for vpn_connection_id in vpn_connection_ids or []:
+ if vpn_connection_id in self.vpn_connections:
+ vpn_connections.append(self.vpn_connections[vpn_connection_id])
+ else:
+ raise InvalidVpnConnectionIdError(vpn_connection_id)
+ return vpn_connections or self.vpn_connections.values()
+
+ def get_all_vpn_connections(self, vpn_connection_ids=None, filters=None):
+ vpn_connections = self.vpn_connections.values()
+
+ if vpn_connection_ids:
+ vpn_connections = [
+ vpn_connection
+ for vpn_connection in vpn_connections
+ if vpn_connection.id in vpn_connection_ids
+ ]
+ if len(vpn_connections) != len(vpn_connection_ids):
+ invalid_id = list(
+ set(vpn_connection_ids).difference(
+ set([vpn_connection.id for vpn_connection in vpn_connections])
+ )
+ )[0]
+ raise InvalidVpnConnectionIdError(invalid_id)
+
+ return generic_filter(filters, vpn_connections)
diff --git a/contrib/python/moto/py3/moto/ec2/models/vpn_gateway.py b/contrib/python/moto/py3/moto/ec2/models/vpn_gateway.py
new file mode 100644
index 0000000000..00eef817b9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/models/vpn_gateway.py
@@ -0,0 +1,161 @@
+from moto.core import CloudFormationModel
+from .core import TaggedEC2Resource
+from ..exceptions import InvalidVpnGatewayIdError, InvalidVpnGatewayAttachmentError
+from ..utils import generic_filter, random_vpn_gateway_id
+
+
+class VPCGatewayAttachment(CloudFormationModel):
+ # Represents both VPNGatewayAttachment and VPCGatewayAttachment
+ def __init__(self, vpc_id, gateway_id=None, state=None):
+ self.vpc_id = vpc_id
+ self.gateway_id = gateway_id
+ self.state = state
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcgatewayattachment.html
+ return "AWS::EC2::VPCGatewayAttachment"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+
+ ec2_backend = ec2_backends[region_name]
+ vpn_gateway_id = properties.get("VpnGatewayId", None)
+ internet_gateway_id = properties.get("InternetGatewayId", None)
+ if vpn_gateway_id:
+ attachment = ec2_backend.attach_vpn_gateway(
+ vpc_id=properties["VpcId"], vpn_gateway_id=vpn_gateway_id
+ )
+ elif internet_gateway_id:
+ attachment = ec2_backend.attach_internet_gateway(
+ internet_gateway_id=internet_gateway_id, vpc_id=properties["VpcId"]
+ )
+ return attachment
+
+ @property
+ def physical_resource_id(self):
+ return self.vpc_id
+
+
+class VpnGateway(CloudFormationModel, TaggedEC2Resource):
+ def __init__(
+ self,
+ ec2_backend,
+ gateway_id,
+ gateway_type,
+ amazon_side_asn,
+ availability_zone,
+ tags=None,
+ state="available",
+ ):
+ self.ec2_backend = ec2_backend
+ self.id = gateway_id
+ self.type = gateway_type
+ self.amazon_side_asn = amazon_side_asn
+ self.availability_zone = availability_zone
+ self.state = state
+ self.add_tags(tags or {})
+ self.attachments = {}
+ super().__init__()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcgatewayattachment.html
+ return "AWS::EC2::VPNGateway"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ from ..models import ec2_backends
+
+ properties = cloudformation_json["Properties"]
+ _type = properties["Type"]
+ asn = properties.get("AmazonSideAsn", None)
+ ec2_backend = ec2_backends[region_name]
+
+ return ec2_backend.create_vpn_gateway(gateway_type=_type, amazon_side_asn=asn)
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ def get_filter_value(self, filter_name):
+ if filter_name == "attachment.vpc-id":
+ return self.attachments.keys()
+ elif filter_name == "attachment.state":
+ return [attachment.state for attachment in self.attachments.values()]
+ elif filter_name == "vpn-gateway-id":
+ return self.id
+ elif filter_name == "type":
+ return self.type
+ return super().get_filter_value(filter_name, "DescribeVpnGateways")
+
+
+class VpnGatewayBackend:
+ def __init__(self):
+ self.vpn_gateways = {}
+
+ def create_vpn_gateway(
+ self,
+ gateway_type="ipsec.1",
+ amazon_side_asn=None,
+ availability_zone=None,
+ tags=None,
+ ):
+ vpn_gateway_id = random_vpn_gateway_id()
+ vpn_gateway = VpnGateway(
+ self, vpn_gateway_id, gateway_type, amazon_side_asn, availability_zone, tags
+ )
+ self.vpn_gateways[vpn_gateway_id] = vpn_gateway
+ return vpn_gateway
+
+ def describe_vpn_gateways(self, filters=None, vpn_gw_ids=None):
+ vpn_gateways = list(self.vpn_gateways.values() or [])
+ if vpn_gw_ids:
+ vpn_gateways = [item for item in vpn_gateways if item.id in vpn_gw_ids]
+ return generic_filter(filters, vpn_gateways)
+
+ def get_vpn_gateway(self, vpn_gateway_id):
+ vpn_gateway = self.vpn_gateways.get(vpn_gateway_id, None)
+ if not vpn_gateway:
+ raise InvalidVpnGatewayIdError(vpn_gateway_id)
+ return vpn_gateway
+
+ def attach_vpn_gateway(self, vpn_gateway_id, vpc_id):
+ vpn_gateway = self.get_vpn_gateway(vpn_gateway_id)
+ self.get_vpc(vpc_id)
+ attachment = VPCGatewayAttachment(vpc_id, state="attached")
+ for key in vpn_gateway.attachments.copy():
+ if key.startswith("vpc-"):
+ vpn_gateway.attachments.pop(key)
+ vpn_gateway.attachments[vpc_id] = attachment
+ return attachment
+
+ def delete_vpn_gateway(self, vpn_gateway_id):
+ deleted = self.vpn_gateways.get(vpn_gateway_id, None)
+ if not deleted:
+ raise InvalidVpnGatewayIdError(vpn_gateway_id)
+ deleted.state = "deleted"
+ return deleted
+
+ def detach_vpn_gateway(self, vpn_gateway_id, vpc_id):
+ vpn_gateway = self.get_vpn_gateway(vpn_gateway_id)
+ detached = vpn_gateway.attachments.get(vpc_id, None)
+ if not detached:
+ raise InvalidVpnGatewayAttachmentError(vpn_gateway.id, vpc_id)
+ detached.state = "detached"
+ return detached
diff --git a/contrib/python/moto/py3/moto/ec2/regions.py b/contrib/python/moto/py3/moto/ec2/regions.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/regions.py
diff --git a/contrib/python/moto/py3/moto/ec2/resources/amis.json b/contrib/python/moto/py3/moto/ec2/resources/amis.json
new file mode 100644
index 0000000000..1fad1865a4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/amis.json
@@ -0,0 +1,682 @@
+[
+ {
+ "ami_id": "ami-03cf127a",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Nano Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Nano-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-12c6146b",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2008 R2 SP1 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2008-R2_SP1-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1812c061",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Standard 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1e749f67",
+ "state": "available",
+ "public": true,
+ "owner_id": "099720109477",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Canonical, Ubuntu, 14.04 LTS, amd64 trusty image build on 2017-07-27",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20170727",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1ecc1e67",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-1f12c066",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Express 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-24f3215d",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Web 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-35e92e4c",
+ "state": "available",
+ "public": true,
+ "owner_id": "013907871322",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "SUSE Linux Enterprise Server 12 SP3 (HVM, 64-bit, SSD-Backed)",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "suse-sles-12-sp3-v20170907-hvm-ssd-x86_64",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-3bf32142",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Express 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-3df32144",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Enterprise 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-56ec3e2f",
+ "state": "available",
+ "public": true,
+ "image_location": "amazon/getting-started",
+ "owner_id": "801119661308",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Express 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-61db0918",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2003 R2 SP2 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2003-R2_SP2-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-6ef02217",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Web 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-760aaa0f",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Amazon Linux AMI 2017.09.1.20171103 x86_64 HVM GP2",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "amzn-ami-hvm-2017.09.1.20171103-x86_64-gp2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-77ed3f0e",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Full Locale English with SQL Enterprise 2016 SP1 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-785db401",
+ "state": "available",
+ "public": true,
+ "owner_id": "099720109477",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Canonical, Ubuntu, 16.04 LTS, amd64 xenial image build on 2017-07-21",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20170721",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-8104a4f8",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Amazon Linux AMI 2017.09.1.20171103 x86_64 PV EBS",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "amzn-ami-pv-2017.09.1.20171103-x86_64-ebs",
+ "virtualization_type": "paravirtual",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-84ee3cfd",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Web 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-86ee3cff",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Standard 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-999844e0",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Deep Learning on Amazon Linux with MXNet, Tensorflow, Caffe, Theano, Torch, CNTK and Keras",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Deep Learning AMI Amazon Linux - 3.3_Oct2017",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-9b32e8e2",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "CUDA9 Classic Ubuntu DLAMI 1508914531",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Ubuntu CUDA9 DLAMI with MXNet/TF/Caffe2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-a9cc1ed0",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Standard 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-afee3cd6",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Web 2016 SP1 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2016_SP1_Web-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-b7e93bce",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 with Desktop Experience Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-bb9a6bc2",
+ "state": "available",
+ "public": true,
+ "owner_id": "309956199498",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Provided by Red Hat, Inc.",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "RHEL-7.4_HVM_GA-20170808-x86_64-2-Hourly2-GP2",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-bceb39c5",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 with Containers Locale English AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-Containers-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-c2ff2dbb",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 RTM 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-RTM-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-c6f321bf",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Express 2014 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2014_SP2_Express-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-d1cb19a8",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2008 SP2 Datacenter 64-bit Locale English Base AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2008-SP2-English-64Bit-Base-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-dca37ea5",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Deep Learning on Ubuntu Linux with MXNet, Tensorflow, Caffe, Theano, Torch, CNTK and Keras",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "Deep Learning AMI Ubuntu Linux - 2.4_Oct2017",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f0e83a89",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2016 Locale English with SQL Enterprise 2017 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2016-English-Full-SQL_2017_Enterprise-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f4cf1d8d",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2012 R2 RTM 64-bit Locale English with SQL Standard 2016 AMI provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2012-R2_RTM-English-64Bit-SQL_2016_SP1_Standard-2017.10.13",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-f8e54081",
+ "state": "available",
+ "public": true,
+ "owner_id": "898082745236",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "CUDA9 Classic Amazon Linux DLAMI 1508914924",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "CUDA9ClassicAmazonLinuxDLAMIwithMXNetTensorflowandCaffe2 ",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-fa7cdd89",
+ "state": "available",
+ "public": true,
+ "owner_id": "013907871322",
+ "image_location": "amazon/getting-started",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda",
+ "description": "SUSE Linux Enterprise Server 11 Service Pack 4 ((PV, 64-bit, SSD-Backed)",
+ "image_type": "machine",
+ "platform": null,
+ "architecture": "x86_64",
+ "name": "suse-sles-11-sp4-v20151207-pv-ssd-x86_64",
+ "virtualization_type": "paravirtual",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-ekswin",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/amazon-eks",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "Microsoft Windows Server 2019 Core optimized for EKS and provided by Amazon",
+ "image_type": "machine",
+ "platform": "windows",
+ "architecture": "x86_64",
+ "name": "Windows_Server-2019-English-Core-EKS_Optimized",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-ekslinux",
+ "state": "available",
+ "public": true,
+ "owner_id": "801119661308",
+ "image_location": "amazon/amazon-eks",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/sda1",
+ "description": "EKS Kubernetes Worker AMI with AmazonLinux2 image",
+ "image_type": "machine",
+ "platform": "Linux/UNIX",
+ "architecture": "x86_64",
+ "name": "amazon-eks-node-linux",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-00a36856283d67c39",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/amzn-ami-vpc-nat-2018.03.0.20210721.0-x86_64-ebs",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Amazon Linux AMI 2018.03.0.20210721.0 x86_64 VPC HVM ebs",
+ "image_type": "machine",
+ "platform": "Linux/UNIX",
+ "architecture": "x86_64",
+ "name": "amzn-ami-vpc-nat-2018.03.0.20210721.0-x86_64-ebs",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "ami_id": "ami-000c540e28953ace2",
+ "state": "available",
+ "public": true,
+ "owner_id": "137112412989",
+ "image_location": "amazon/amzn-ami-minimal-hvm-2018.03.0.20181129-x86_64-ebs",
+ "sriov": "simple",
+ "root_device_type": "ebs",
+ "root_device_name": "/dev/xvda",
+ "description": "Amazon Linux AMI 2018.03.0.20181129 x86_64 Minimal HVM ebs",
+ "image_type": "machine",
+ "platform": "Linux/UNIX",
+ "architecture": "x86_64",
+ "name": "amzn-ami-minimal-hvm-2018.03.0.20181129-x86_64-ebs",
+ "virtualization_type": "hvm",
+ "hypervisor": "xen"
+ },
+ {
+ "architecture": "x86_64",
+ "ami_id": "ami-04681a1dbd79675a5",
+ "image_location": "amazon/amzn2-ami-hvm-2.0.20180810-x86_64-gp2",
+ "image_type": "machine",
+ "public": true,
+ "owner_id": "137112412989",
+ "platform": "Linux/UNIX",
+ "state": "available",
+ "description": "Amazon Linux 2 AMI 2.0.20180810 x86_64 HVM gp2",
+ "hypervisor": "xen",
+ "name": "amzn2-ami-hvm-2.0.20180810-x86_64-gp2",
+ "root_device_name": "/dev/xvda",
+ "root_device_type": "ebs",
+ "sriov": "simple",
+ "virtualization_type": "hvm"
+ },
+ {
+ "architecture": "x86_64",
+ "ami_id": "ami-04681a1dbd79675b6",
+ "image_location": "amazon/amzn2-ami-minimal-pv-2.0.20180810-x86_64-gp2",
+ "image_type": "machine",
+ "public": true,
+ "owner_id": "137112412989",
+ "platform": "Linux/UNIX",
+ "state": "available",
+ "description": "Example InstanceStore AMI used by AutoScaling tests",
+ "hypervisor": "xen",
+ "name": "amzn-ami-minimal-pv-2.0.20180810-x86_64-gp2",
+ "root_device_name": "/dev/xvda",
+ "root_device_type": "instance-store",
+ "sriov": "simple",
+ "virtualization_type": "hvm"
+ }
+]
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
new file mode 100644
index 0000000000..c93e4b5f3b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
@@ -0,0 +1,1370 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "afs1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "afs1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "afs1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "afs1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-east-1.json
new file mode 100644
index 0000000000..9cadf69c69
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-east-1.json
@@ -0,0 +1,1754 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ape1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ape1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ape1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ape1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
new file mode 100644
index 0000000000..1611da0fbb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
@@ -0,0 +1,4418 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apne1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apne1-az2"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apne1-az4"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apne1-az4"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
new file mode 100644
index 0000000000..3d50a02c2e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
@@ -0,0 +1,3586 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apne2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apne2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apne2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne2-az4"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne2-az4"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-3.json
new file mode 100644
index 0000000000..72d32ea29f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-3.json
@@ -0,0 +1,1066 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne3-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne3-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apne3-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apne3-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
new file mode 100644
index 0000000000..3742749077
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
@@ -0,0 +1,3630 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "aps1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "aps1-az2"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "aps1-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "aps1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
new file mode 100644
index 0000000000..9db1ee84f7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
@@ -0,0 +1,4526 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse1-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
new file mode 100644
index 0000000000..ef92f48179
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
@@ -0,0 +1,4006 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse2-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse2-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "apse2-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "apse2-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
new file mode 100644
index 0000000000..464949d563
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
@@ -0,0 +1,2870 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "cac1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "cac1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "cac1-az4"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "cac1-az4"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
new file mode 100644
index 0000000000..3189dbc933
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
@@ -0,0 +1,4262 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euc1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euc1-az2"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euc1-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euc1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
new file mode 100644
index 0000000000..0a05b3218e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
@@ -0,0 +1,1798 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eun1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eun1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eun1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eun1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
new file mode 100644
index 0000000000..287552420d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
@@ -0,0 +1,2018 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eus1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eus1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eus1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eus1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
new file mode 100644
index 0000000000..1e271970fa
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
@@ -0,0 +1,5670 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw1-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw1-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
new file mode 100644
index 0000000000..72bf270a16
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
@@ -0,0 +1,3438 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw2-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "euw2-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "euw2-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
new file mode 100644
index 0000000000..734bbee846
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
@@ -0,0 +1,2846 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw3-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw3-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "euw3-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "euw3-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-south-1.json
new file mode 100644
index 0000000000..05fbb047fa
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-south-1.json
@@ -0,0 +1,1506 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "mes1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "mes1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "mes1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "mes1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
new file mode 100644
index 0000000000..0825a19bab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
@@ -0,0 +1,3006 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "sae1-az1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sae1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "sae1-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "sae1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
new file mode 100644
index 0000000000..6b7337b9d5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
@@ -0,0 +1,9362 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use1-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use1-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az3"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use1-az4"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use1-az5"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use1-az6"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use1-az6"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
new file mode 100644
index 0000000000..ce877e8ed8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
@@ -0,0 +1,4802 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use2-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "hpc6a.48xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "use2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "use2-az3"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "use2-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
new file mode 100644
index 0000000000..9005d4ff5c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
@@ -0,0 +1,2530 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "usw1-az1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "usw1-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "usw1-az3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
new file mode 100644
index 0000000000..897fee4089
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
@@ -0,0 +1,6894 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "usw2-az1"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "usw2-az2"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "usw2-az3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "usw2-az4"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "usw2-az4"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
new file mode 100644
index 0000000000..6b83e453b9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
@@ -0,0 +1,1370 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "af-south-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "af-south-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "af-south-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "af-south-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-east-1.json
new file mode 100644
index 0000000000..a4465d6a0a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-east-1.json
@@ -0,0 +1,1754 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-east-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-east-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-east-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-east-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
new file mode 100644
index 0000000000..2b4ef7d016
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
@@ -0,0 +1,4418 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-1a"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-1c"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-1d"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-1d"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
new file mode 100644
index 0000000000..7bf58384ae
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
@@ -0,0 +1,3586 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-northeast-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-2d"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-2d"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-3.json
new file mode 100644
index 0000000000..d917239f64
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-3.json
@@ -0,0 +1,1066 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-3a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-3b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-3c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-3c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
new file mode 100644
index 0000000000..d89c1a25a0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
@@ -0,0 +1,3630 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-south-1a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-south-1b"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-south-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-south-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
new file mode 100644
index 0000000000..a4503bed0b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
@@ -0,0 +1,4526 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-1a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
new file mode 100644
index 0000000000..9a90e144ef
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
@@ -0,0 +1,4006 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-2a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-2b"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-2c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-2c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-3.json
new file mode 100644
index 0000000000..99c0d0acc8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-3.json
@@ -0,0 +1 @@
+[{"InstanceType": "r5dn.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "d3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "inf1.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.3xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "a1.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.9xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5a.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "inf1.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "a1.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d3.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m2.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "inf1.6xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5a.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5d.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6g.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.18xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c4.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.nano", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "x1e.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3a.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "u-6tb1.56xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "p3.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.nano", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i2.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.6xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g2.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.micro", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c4.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5d.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.small", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "x1.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m3.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.6xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.9xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "p2.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "d3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g2.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.10xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "a1.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t1.micro", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t1.micro", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "x1e.32xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r4.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "x1e.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5a.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.nano", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.micro", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.micro", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5n.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m2.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.10xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1e.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.9xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g5g.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5d.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m3.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.3xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m2.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i2.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "x1e.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.small", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5a.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5n.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.3xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.small", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5a.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t4g.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "x1e.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t4g.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "p3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.3xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.small", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c3.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.9xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m4.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.9xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.nano", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5d.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m2.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.nano", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5a.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i2.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d2.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "u-9tb1.112xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i2.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r4.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "p3.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6g.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t4g.small", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6g.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.3xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "a1.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g3.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.small", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.6xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5a.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.small", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c4.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5a.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.micro", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d3.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d2.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1e.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5a.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.nano", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "a1.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5n.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.micro", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g5g.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5a.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g3.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5a.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m3.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.micro", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.6xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3en.3xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "p2.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3en.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3a.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "p3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "inf1.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "a1.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "u-6tb1.112xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "inf1.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "a1.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.9xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c4.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c1.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m4.10xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c1.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c3.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.32xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "u-6tb1.56xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5a.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3en.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1e.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c1.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6g.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "d3.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "inf1.6xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "p2.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "u-12tb1.112xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g5g.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r3.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g5g.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "inf1.6xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "p3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d3.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "x1.32xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t4g.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5n.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.18xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6g.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.nano", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "p3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d2.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5a.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i2.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.small", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g5g.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g5g.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.32xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1e.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.18xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "p2.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d3.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "inf1.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.18xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t2.small", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "inf1.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c3.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5a.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.9xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "a1.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m4.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t2.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.small", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r3.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t2.micro", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r4.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3en.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1.32xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.3xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r3.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.18xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5a.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d2.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.nano", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.small", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "inf1.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "d3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.small", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m4.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m3.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "u-12tb1.112xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5a.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "inf1.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "a1.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d2.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g5g.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6g.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.9xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "i3.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "x1e.32xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "u-9tb1.112xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5a.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "x1e.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c1.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m2.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c4.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d3.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "mac1.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "p2.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "a1.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c4.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c4.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.nano", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m4.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.6xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.small", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m6i.32xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i2.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "z1d.3xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5a.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5d.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r6g.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.medium", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5n.9xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6g.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t4g.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1e.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5d.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "a1.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "d2.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6g.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g2.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m3.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g5g.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5d.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i2.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5a.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t2.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "x1.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5n.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "inf1.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5b.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6g.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5zn.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5b.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5d.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5n.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5b.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c4.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3.micro", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5d.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5d.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5d.8xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r3.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m5.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.nano", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r3.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c3.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.nano", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g5g.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "d3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c5d.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r4.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g2.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "mac1.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "x1.32xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "p2.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r3.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i2.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "u-6tb1.112xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5ad.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g3.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "z1d.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.small", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r6gd.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5ad.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t4g.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5a.16xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6gd.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m2.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6g.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c3.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5a.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5n.18xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5ad.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5d.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t4g.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "z1d.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.nano", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g5g.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g3.16xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t2.micro", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "a1.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5dn.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c4.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5n.16xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.8xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "i3en.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5.8xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r4.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m1.medium", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.4xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.4xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.micro", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "c6gd.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m6i.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.large", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.4xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3a.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.2xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.2xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "m5a.12xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.medium", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.micro", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "t3a.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c6g.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.18xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5n.metal", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c5.18xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.6xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "r5n.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.24xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m1.large", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.24xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m1.large", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "c6g.metal", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g4dn.2xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "m5a.12xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "c5.18xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "m6i.12xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.6xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "r5n.metal", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "g5g.xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "r5dn.24xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "i3en.6xlarge", "Location": "ap-southeast-3a", "LocationType": "availability-zone"}, {"InstanceType": "t3a.xlarge", "Location": "ap-southeast-3c", "LocationType": "availability-zone"}, {"InstanceType": "g5g.xlarge", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}, {"InstanceType": "t3a.micro", "Location": "ap-southeast-3b", "LocationType": "availability-zone"}] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
new file mode 100644
index 0000000000..357290cf27
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
@@ -0,0 +1,2870 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ca-central-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ca-central-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ca-central-1d"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ca-central-1d"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
new file mode 100644
index 0000000000..0f017ecbab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
@@ -0,0 +1,4262 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-central-1a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-central-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-central-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-central-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
new file mode 100644
index 0000000000..d59fc16c3f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
@@ -0,0 +1,1798 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-north-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-north-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-north-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-north-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
new file mode 100644
index 0000000000..20db95abf9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
@@ -0,0 +1,2018 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-south-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-south-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-south-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-south-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
new file mode 100644
index 0000000000..25e426a1dd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
@@ -0,0 +1,5670 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-1a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-1b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
new file mode 100644
index 0000000000..bc44aa5b82
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
@@ -0,0 +1,3438 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-2a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-2c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-2c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
new file mode 100644
index 0000000000..0ba6713663
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
@@ -0,0 +1,2846 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-3a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-3b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-3c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-3c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/me-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/me-south-1.json
new file mode 100644
index 0000000000..a8dc93e1b3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/me-south-1.json
@@ -0,0 +1,1506 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "me-south-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "me-south-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "me-south-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "me-south-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
new file mode 100644
index 0000000000..4826245222
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
@@ -0,0 +1,3006 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "sa-east-1a"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sa-east-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "sa-east-1c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "sa-east-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
new file mode 100644
index 0000000000..df94c204fc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
@@ -0,0 +1,9362 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1b"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1c"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1d"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1e"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1f"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1f"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
new file mode 100644
index 0000000000..93fdb09b9f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
@@ -0,0 +1,4802 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-2a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "hpc6a.48xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-2c"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-2c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
new file mode 100644
index 0000000000..cc7faa7fd0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
@@ -0,0 +1,2530 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-1b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-1c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-1c"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
new file mode 100644
index 0000000000..1767de49a8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
@@ -0,0 +1,6894 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-2a"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-2b"
+ },
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-2c"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-west-2d"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-west-2d"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/af-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/af-south-1.json
new file mode 100644
index 0000000000..d3c8165456
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/af-south-1.json
@@ -0,0 +1,478 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "af-south-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "af-south-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-east-1.json
new file mode 100644
index 0000000000..9d2c276edf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-east-1.json
@@ -0,0 +1,594 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-east-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-east-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
new file mode 100644
index 0000000000..601983b90a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
@@ -0,0 +1,1678 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
new file mode 100644
index 0000000000..92e6d8cc04
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
@@ -0,0 +1,1210 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-northeast-2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-northeast-2"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-3.json
new file mode 100644
index 0000000000..1bc3a84761
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-northeast-3.json
@@ -0,0 +1,474 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-northeast-3"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-northeast-3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
new file mode 100644
index 0000000000..5cb66bb58b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
@@ -0,0 +1,1290 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-south-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-south-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
new file mode 100644
index 0000000000..7764dd50fe
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
@@ -0,0 +1,1622 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
new file mode 100644
index 0000000000..2d30d60739
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
@@ -0,0 +1,1418 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "ap-southeast-2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "ap-southeast-2"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-3.json
new file mode 100644
index 0000000000..037020836d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ap-southeast-3.json
@@ -0,0 +1 @@
+[{"InstanceType": "i3en.6xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m3.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d2.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.small", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.32xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g3.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p3.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "u-9tb1.112xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.3xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r3.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d2.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.small", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m2.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "inf1.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c4.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.6xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.18xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.10xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.32xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m2.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m1.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.3xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c3.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c4.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p2.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c4.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.nano", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.nano", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c3.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "u-6tb1.112xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i2.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.small", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m2.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.micro", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "u-6tb1.56xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.micro", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.nano", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c4.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r3.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.nano", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.9xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "mac1.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p2.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t2.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "inf1.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d3.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5n.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g2.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m1.small", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c1.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "inf1.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m1.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5a.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "inf1.6xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.micro", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.small", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5ad.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i2.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.9xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6g.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5n.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i2.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g2.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d2.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1.32xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5.18xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m3.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.18xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5ad.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5dn.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c1.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6gd.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m4.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t4g.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.9xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5d.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6i.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t1.micro", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "z1d.6xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "p2.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c5d.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5a.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6gd.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5d.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r4.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g4dn.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m1.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "a1.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5b.metal", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i2.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "u-12tb1.112xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r6g.medium", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c4.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g5g.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.large", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "t3a.micro", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c6g.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c3.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "x1e.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3en.2xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5a.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5ad.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5zn.3xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "c3.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "d2.8xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "i3.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m6gd.12xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "r5dn.24xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m5n.16xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "g3.4xlarge", "Location": "ap-southeast-3", "LocationType": "region"}, {"InstanceType": "m3.xlarge", "Location": "ap-southeast-3", "LocationType": "region"}] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ca-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ca-central-1.json
new file mode 100644
index 0000000000..5e562618ba
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/ca-central-1.json
@@ -0,0 +1,1118 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "ca-central-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "ca-central-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
new file mode 100644
index 0000000000..4487a52351
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
@@ -0,0 +1,1518 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-central-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-central-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
new file mode 100644
index 0000000000..10af0c8afd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
@@ -0,0 +1,610 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-north-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-north-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
new file mode 100644
index 0000000000..a718de1f90
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
@@ -0,0 +1,690 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-south-1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-south-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
new file mode 100644
index 0000000000..ddd86bf5bf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
@@ -0,0 +1,1950 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
new file mode 100644
index 0000000000..af0d1d4ef7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
@@ -0,0 +1,1190 @@
+[
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "eu-west-2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "eu-west-2"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
new file mode 100644
index 0000000000..ac2b352813
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
@@ -0,0 +1,966 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "eu-west-3"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "eu-west-3"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/me-south-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/me-south-1.json
new file mode 100644
index 0000000000..843e3ad3cc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/me-south-1.json
@@ -0,0 +1,518 @@
+[
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "me-south-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "me-south-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
new file mode 100644
index 0000000000..2ff21bae98
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
@@ -0,0 +1,1142 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "sa-east-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "sa-east-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
new file mode 100644
index 0000000000..4e5de569ec
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
@@ -0,0 +1,1982 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2idn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2idn.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2idn.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
new file mode 100644
index 0000000000..b2502b00c4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
@@ -0,0 +1,1658 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "hpc6a.48xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-east-2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-east-2"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-1.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-1.json
new file mode 100644
index 0000000000..fa3438d685
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-1.json
@@ -0,0 +1,1266 @@
+[
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-1"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-1"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-2.json b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
new file mode 100644
index 0000000000..61bd5a6a93
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
@@ -0,0 +1,1970 @@
+[
+ {
+ "InstanceType": "a1.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "a1.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "a1.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "a1.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "a1.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "a1.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c1.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c1.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c3.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c3.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c4.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c4.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c4.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c4.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c4.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.18xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.9xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5ad.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.18xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.9xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5d.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.18xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.9xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c5n.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.48xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6g.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gd.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6gn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "c6i.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "cc2.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d2.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d2.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d2.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d2.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "d3en.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "dl1.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "f1.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "f1.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "f1.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g2.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g2.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g3.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g3.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g3s.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4ad.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4ad.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4ad.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4ad.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4ad.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g4dn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.48xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "g5g.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "h1.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "h1.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "h1.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "h1.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i2.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i2.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i2.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i2.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.3xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "i3en.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "im4gn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "inf1.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "inf1.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "inf1.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "inf1.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "is4gen.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m1.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m1.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m1.small",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m1.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m2.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m2.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m2.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m3.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m3.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.10xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m4.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5ad.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5d.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5dn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5n.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.3xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m5zn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.48xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6g.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6gd.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "m6i.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "mac1.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p2.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p2.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p2.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p3.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p3dn.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "p4d.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r3.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r3.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r3.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r4.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5ad.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5b.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5d.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5dn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r5n.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6g.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6gd.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "r6i.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t1.micro",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.micro",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.nano",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.small",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t2.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.micro",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.nano",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.small",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.micro",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.nano",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.small",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t3a.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.micro",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.nano",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.small",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "t4g.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "u-12tb1.112xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "u-3tb1.56xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "u-6tb1.112xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "u-6tb1.56xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "u-9tb1.112xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "vt1.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "vt1.3xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "vt1.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x1e.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.medium",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2gd.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.16xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.24xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.32xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iedn.xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.4xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.8xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "x2iezn.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.12xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.2xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.3xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.6xlarge",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.large",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.metal",
+ "Location": "us-west-2"
+ },
+ {
+ "InstanceType": "z1d.xlarge",
+ "Location": "us-west-2"
+ }
+] \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/resources/instance_types.json b/contrib/python/moto/py3/moto/ec2/resources/instance_types.json
new file mode 100644
index 0000000000..9db7d744e3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/resources/instance_types.json
@@ -0,0 +1,46518 @@
+{
+ "a1.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1750,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 218.75,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8
+ }
+ },
+ "a1.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16
+ }
+ },
+ "a1.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 525,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 65.625,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2
+ }
+ },
+ "a1.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 300,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 37.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "a1.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16
+ }
+ },
+ "a1.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "a1.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4
+ }
+ },
+ "c1.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 350,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 350
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c1.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 1740
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2
+ }
+ },
+ "c1.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 420,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1680
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c1.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 7168
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8
+ }
+ },
+ "c3.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 80,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 160
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.8
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c3.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 160,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 320
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c3.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 30720
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.8
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c3.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 320,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 640
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 61440
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.8
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c3.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 16,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 32
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c3.large",
+ "MemoryInfo": {
+ "SizeInMiB": 3840
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.8
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c3.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 40,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 80
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 7680
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.8
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c4.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c4.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.9
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c4.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c4.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 30720
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.9
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c4.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4000,
+ "BaselineIops": 32000,
+ "BaselineThroughputInMBps": 500.0,
+ "MaximumBandwidthInMbps": 4000,
+ "MaximumIops": 32000,
+ "MaximumThroughputInMBps": 500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c4.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 61440
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.9
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 18,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 36,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c4.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c4.large",
+ "MemoryInfo": {
+ "SizeInMiB": 3840
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.9
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c4.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 750,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 93.75,
+ "MaximumBandwidthInMbps": 750,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 93.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c4.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 7680
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.9
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.18xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.18xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 147456
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 36,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 72,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.9xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.9xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 73728
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 18,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 36,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "c5.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6300,
+ "BaselineIops": 26700,
+ "BaselineThroughputInMBps": 787.5,
+ "MaximumBandwidthInMbps": 6300,
+ "MaximumIops": 26700,
+ "MaximumThroughputInMBps": 787.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 36,
+ 40,
+ 44,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 3200,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 6600,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3170,
+ "BaselineIops": 13300,
+ "BaselineThroughputInMBps": 396.25,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 200,
+ "BaselineIops": 800,
+ "BaselineThroughputInMBps": 25.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5a.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 400,
+ "BaselineIops": 1600,
+ "BaselineThroughputInMBps": 50.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5a.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6300,
+ "BaselineIops": 26700,
+ "BaselineThroughputInMBps": 787.5,
+ "MaximumBandwidthInMbps": 6300,
+ "MaximumIops": 26700,
+ "MaximumThroughputInMBps": 787.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1200,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 36,
+ 40,
+ 44,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 3200,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 6600,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3170,
+ "BaselineIops": 13300,
+ "BaselineThroughputInMBps": 396.25,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8,
+ 12,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 200,
+ "BaselineIops": 800,
+ "BaselineThroughputInMBps": 25.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5ad.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 400,
+ "BaselineIops": 1600,
+ "BaselineThroughputInMBps": 50.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13300,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5ad.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.18xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.18xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 147456
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 36,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 72,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 200,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 400,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.9xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.9xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 73728
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 18,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 36,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 50,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 50
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5d.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "c5d.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 100,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 100
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c5d.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.18xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.18xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 36,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 72,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 21504
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 43008
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.9xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.9xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 18,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 36,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.large",
+ "MemoryInfo": {
+ "SizeInMiB": 5376
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c5n.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 36,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 72
+ }
+ },
+ "c5n.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c5n.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 10752
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6g.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6g.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "c6g.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "c6g.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6g.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1425,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2850
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 474,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 474
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 950,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 950
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 118,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 118
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gd.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 59,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 59
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "c6gd.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "c6gd.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 237,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 237
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "c6gd.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 28500,
+ "BaselineIops": 120000,
+ "BaselineThroughputInMBps": 3562.5,
+ "MaximumBandwidthInMbps": 28500,
+ "MaximumIops": 120000,
+ "MaximumThroughputInMBps": 3562.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 38000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 4750.0,
+ "MaximumBandwidthInMbps": 38000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 4750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1235,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 154.375,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 760,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 95.0,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 16 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 16 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6gn.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 296.88,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6gn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "c6i.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 15000,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1875.0,
+ "MaximumBandwidthInMbps": 15000,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "18.75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "18.75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 30000,
+ "BaselineIops": 120000,
+ "BaselineThroughputInMBps": 3750.0,
+ "MaximumBandwidthInMbps": 30000,
+ "MaximumIops": 120000,
+ "MaximumThroughputInMBps": 3750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "37.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "37.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48,
+ 50,
+ 52,
+ 54,
+ 56,
+ 58,
+ 60,
+ 62,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.large",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "c6i.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128
+ }
+ },
+ "c6i.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "c6i.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "cc2.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 840,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 3360
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "cc2.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 61952
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32
+ }
+ },
+ "d2.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 6,
+ "SizeInGB": 2048,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 12288
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d2.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d2.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 12,
+ "SizeInGB": 2048,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 24576
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d2.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d2.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4000,
+ "BaselineIops": 32000,
+ "BaselineThroughputInMBps": 500.0,
+ "MaximumBandwidthInMbps": 4000,
+ "MaximumIops": 32000,
+ "MaximumThroughputInMBps": 500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 24,
+ "SizeInGB": 2048,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 49152
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d2.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 18,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 36,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d2.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 750,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 93.75,
+ "MaximumBandwidthInMbps": 750,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 93.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 3,
+ "SizeInGB": 2048,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 6144
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d2.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1700,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 212.5,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 6,
+ "SizeInGB": 1980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 11880
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 5,
+ "Ipv6AddressesPerInterface": 5,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 15 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 15 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2800,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 350.0,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 12,
+ "SizeInGB": 1980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 23760
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 15 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 15 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 5000,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 625.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 24,
+ "SizeInGB": 1980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 47520
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 20,
+ "Ipv6AddressesPerInterface": 20,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 3,
+ "SizeInGB": 1980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 5940
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 3,
+ "Ipv6AddressesPerInterface": 3,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 15 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 15 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 24,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 335520
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1700,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 212.5,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 55920
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 5,
+ "Ipv6AddressesPerInterface": 5,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2800,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 350.0,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 111840
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4000,
+ "BaselineIops": 25000,
+ "BaselineThroughputInMBps": 500.0,
+ "MaximumBandwidthInMbps": 4000,
+ "MaximumIops": 25000,
+ "MaximumThroughputInMBps": 500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 12,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 167760
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "40 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "40 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 5000,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 625.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 16,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 223680
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 20,
+ "Ipv6AddressesPerInterface": 20,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "d3en.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 2800,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 350.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 13980,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 27960
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "d3en.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 3,
+ "Ipv6AddressesPerInterface": 3,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "dl1.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "Habana",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "Name": "Gaudi HL-205"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 262144
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 1000,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 4000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "dl1.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 4
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 4,
+ "MaximumNetworkInterfaces": 60,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 1,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 2,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 3,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "4x 100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "f1.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 75000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 75000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FpgaInfo": {
+ "Fpgas": [
+ {
+ "Count": 8,
+ "Manufacturer": "Xilinx",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "Name": "Virtex UltraScale (VU9P)"
+ }
+ ],
+ "TotalFpgaMemoryInMiB": 524288
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 940,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3760
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "f1.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 999424
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "f1.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1700,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 212.5,
+ "MaximumBandwidthInMbps": 1700,
+ "MaximumIops": 12000,
+ "MaximumThroughputInMBps": 212.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FpgaInfo": {
+ "Fpgas": [
+ {
+ "Count": 1,
+ "Manufacturer": "Xilinx",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "Name": "Virtex UltraScale (VU9P)"
+ }
+ ],
+ "TotalFpgaMemoryInMiB": 65536
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 470,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 470
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "f1.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "f1.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 44000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 44000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FpgaInfo": {
+ "Fpgas": [
+ {
+ "Count": 2,
+ "Manufacturer": "Xilinx",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "Name": "Virtex UltraScale (VU9P)"
+ }
+ ],
+ "TotalFpgaMemoryInMiB": 131072
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 940,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 940
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "f1.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g2.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "Name": "K520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 4096
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 60,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 60
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g2.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g2.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "Name": "K520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 120,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 240
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g2.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 61440
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g3.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "M60"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 32768
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g3.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g3.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "M60"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 8192
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g3.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g3.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 2,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "M60"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g3s.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 850,
+ "MaximumIops": 5000,
+ "MaximumThroughputInMBps": 106.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "M60"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 8192
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g3s.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4ad.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6300,
+ "BaselineIops": 26667,
+ "BaselineThroughputInMBps": 787.5,
+ "MaximumBandwidthInMbps": 6300,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 787.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "AMD",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "Radeon Pro V520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 32768
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1200,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4ad.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 8,
+ 16,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4ad.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 3400,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "AMD",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "Radeon Pro V520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 8192
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4ad.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4ad.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 6700,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "AMD",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "Radeon Pro V520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 8192
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4ad.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4ad.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3170,
+ "BaselineIops": 13333,
+ "BaselineThroughputInMBps": 396.25,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 2,
+ "Manufacturer": "AMD",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "Radeon Pro V520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1200,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4ad.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "15 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "15 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 8,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4ad.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 400,
+ "BaselineIops": 1700,
+ "BaselineThroughputInMBps": 50.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "AMD",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "Name": "Radeon Pro V520"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 8192
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4ad.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 65536
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 225,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 225
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 225,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 225
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g4dn.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 131072
+ },
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "g4dn.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 950,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 118.75,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 125,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 125
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g4dn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "g5.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 16000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 2000.0,
+ "MaximumBandwidthInMbps": 16000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 2000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 98304
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 3800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "40 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "40 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48
+ }
+ },
+ "g5.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 16000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 2000.0,
+ "MaximumBandwidthInMbps": 16000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 2000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 24576
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64
+ }
+ },
+ "g5.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 98304
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 3800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "g5.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 3500,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 24576
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 450,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 450
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8
+ }
+ },
+ "g5.48xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 196608
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 3800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 7600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.48xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 96,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 192
+ }
+ },
+ "g5.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 24576
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16
+ }
+ },
+ "g5.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 16000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 2000.0,
+ "MaximumBandwidthInMbps": 16000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 2000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 24576
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32
+ }
+ },
+ "g5.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 700,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 87.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "Name": "A10G"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 24576
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 250,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 250
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "g5.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4
+ }
+ },
+ "g5g.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 2,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 32768
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "g5g.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "g5g.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "g5g.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "g5g.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 2,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 32768
+ },
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "g5g.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "T4g"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "g5g.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "h1.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 2000,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 16000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "h1.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "h1.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1750,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 218.75,
+ "MaximumBandwidthInMbps": 1750,
+ "MaximumIops": 12000,
+ "MaximumThroughputInMBps": 218.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 2000,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 2000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "h1.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "h1.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 2000,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 4000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "h1.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "h1.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 2000,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 8000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "h1.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "hpc6a.48xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 87,
+ "BaselineIops": 500,
+ "BaselineThroughputInMBps": 10.875,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11000,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "hpc6a.48xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 96,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 96
+ }
+ },
+ "i2.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i2.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i2.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 3200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i2.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i2.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 6400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i2.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i2.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 800,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i2.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 15200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1700,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 212.5,
+ "MaximumBandwidthInMbps": 1700,
+ "MaximumIops": 12000,
+ "MaximumThroughputInMBps": 212.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 32500,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 32500,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 7600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 425,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 53.125,
+ "MaximumBandwidthInMbps": 425,
+ "MaximumIops": 3000,
+ "MaximumThroughputInMBps": 53.125
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 475,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 475
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.large",
+ "MemoryInfo": {
+ "SizeInMiB": 15616
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 15200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 36,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 72
+ }
+ },
+ "i3.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 850,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 106.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "supported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 950,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 950
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 30000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 60000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2307,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 288.3875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 2500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 5000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.3xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3800,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 475.0,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 7500
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.3xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 6,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 12,
+ "ValidCores": [
+ 2,
+ 4,
+ 6
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 15000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 576,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 72.1,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1250,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1250
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "i3en.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 60000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "i3en.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1153,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 144.2,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 2500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2500
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "i3en.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "im4gn.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 30000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "im4gn.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 3750,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3750
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "im4gn.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 7500
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "im4gn.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 15000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "im4gn.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 937,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 937
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "im4gn.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1875,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1875
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "im4gn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "inf1.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InferenceAcceleratorInfo": {
+ "Accelerators": [
+ {
+ "Count": 16,
+ "Manufacturer": "AWS",
+ "Name": "Inferentia"
+ }
+ ]
+ },
+ "InstanceStorageSupported": false,
+ "InstanceType": "inf1.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 11,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 11,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "inf1.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1190,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InferenceAcceleratorInfo": {
+ "Accelerators": [
+ {
+ "Count": 1,
+ "Manufacturer": "AWS",
+ "Name": "Inferentia"
+ }
+ ]
+ },
+ "InstanceStorageSupported": false,
+ "InstanceType": "inf1.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "inf1.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InferenceAcceleratorInfo": {
+ "Accelerators": [
+ {
+ "Count": 4,
+ "Manufacturer": "AWS",
+ "Name": "Inferentia"
+ }
+ ]
+ },
+ "InstanceStorageSupported": false,
+ "InstanceType": "inf1.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 49152
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "inf1.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1190,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 148.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InferenceAcceleratorInfo": {
+ "Accelerators": [
+ {
+ "Count": 1,
+ "Manufacturer": "AWS",
+ "Name": "Inferentia"
+ }
+ ]
+ },
+ "InstanceStorageSupported": false,
+ "InstanceType": "inf1.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "is4gen.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 7500
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 49152
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "is4gen.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 15000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "is4gen.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 7500,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 30000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "is4gen.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 5000,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1875,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1875
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.large",
+ "MemoryInfo": {
+ "SizeInMiB": 12288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "is4gen.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 625,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 78.125,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 937,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 937
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 6144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "is4gen.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 3750,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3750
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "is4gen.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m1.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 420,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 840
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m1.large",
+ "MemoryInfo": {
+ "SizeInMiB": 7680
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2
+ }
+ },
+ "m1.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 410,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 410
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m1.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 3788
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "m1.small": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 160,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 160
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m1.small",
+ "MemoryInfo": {
+ "SizeInMiB": 1740
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low"
+ }
+ ],
+ "NetworkPerformance": "Low"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "m1.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 420,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1680
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m1.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4
+ }
+ },
+ "m2.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 850,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 850
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m2.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 35020
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m2.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 840,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1680
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m2.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 70041
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m2.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 420,
+ "Type": "hdd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 420
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m2.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 17510
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m3.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 80,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 160
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 30720
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m3.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 32,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 32
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m3.large",
+ "MemoryInfo": {
+ "SizeInMiB": 7680
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m3.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 4,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 4
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m3.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 3840
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "m3.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 40,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 80
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m4.10xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4000,
+ "BaselineIops": 32000,
+ "BaselineThroughputInMBps": 500.0,
+ "MaximumBandwidthInMbps": 4000,
+ "MaximumIops": 32000,
+ "MaximumThroughputInMBps": 500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.10xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 163840
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 20,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 40,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m4.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m4.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m4.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m4.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 450,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 56.25,
+ "MaximumBandwidthInMbps": 450,
+ "MaximumIops": 3600,
+ "MaximumThroughputInMBps": 56.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m4.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 750,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 93.75,
+ "MaximumBandwidthInMbps": 750,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 93.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m4.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 18750,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "m5.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6780,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 847.5,
+ "MaximumBandwidthInMbps": 6780,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 847.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 6,
+ 12,
+ 18,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13750,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1718.75,
+ "MaximumBandwidthInMbps": 13750,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1718.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 12,
+ 18,
+ 24,
+ 36,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 8333,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2880,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 360.0,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5a.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1085,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 135.625,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5a.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6780,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 847.5,
+ "MaximumBandwidthInMbps": 6780,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 847.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 6,
+ 12,
+ 18,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13750,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1718.75,
+ "MaximumBandwidthInMbps": 13750,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1718.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 12,
+ 18,
+ 24,
+ 36,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 8333,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2880,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 360.0,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5ad.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1085,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 135.625,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5ad.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 18750,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5d.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "m5d.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5d.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5dn.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "m5dn.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m5dn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5n.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "m5n.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5n.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3170,
+ "BaselineIops": 13333,
+ "BaselineThroughputInMBps": 396.25,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.3xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.3xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 49152
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 6,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 12,
+ "ValidCores": [
+ 2,
+ 4,
+ 6
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 3333,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m5zn.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48
+ }
+ },
+ "m5zn.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1564,
+ "BaselineIops": 6667,
+ "BaselineThroughputInMBps": 195.5,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m5zn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "18.75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "18.75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 16,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13300,
+ "BaselineIops": 53333,
+ "BaselineThroughputInMBps": 1662.5,
+ "MaximumBandwidthInMbps": 13300,
+ "MaximumIops": 53333,
+ "MaximumThroughputInMBps": 1662.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "37.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "37.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 32,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2122,
+ "BaselineIops": 8333,
+ "BaselineThroughputInMBps": 265.25,
+ "MaximumBandwidthInMbps": 6666,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 833.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 26666,
+ "BaselineIops": 100000,
+ "BaselineThroughputInMBps": 3333.333333,
+ "MaximumBandwidthInMbps": 26666,
+ "MaximumIops": 100000,
+ "MaximumThroughputInMBps": 3333.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.48xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.48xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 96,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 192,
+ "ValidCores": [
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 64,
+ 96
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4245,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 530.625,
+ "MaximumBandwidthInMbps": 6666,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 833.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6666,
+ "BaselineIops": 26667,
+ "BaselineThroughputInMBps": 833.333333,
+ "MaximumBandwidthInMbps": 6666,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 833.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 531,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 66.375,
+ "MaximumBandwidthInMbps": 6666,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 833.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6a.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1061,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 132.625,
+ "MaximumBandwidthInMbps": 6666,
+ "MaximumIops": 26667,
+ "MaximumThroughputInMBps": 833.333333
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6a.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.6
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6g.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6g.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "m6g.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "m6g.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6g.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1425,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2850
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 474,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 474
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 950,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 950
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 118,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 118
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6gd.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 59,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 59
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "m6gd.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "m6gd.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 237,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 237
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "m6gd.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "m6i.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 15000,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1875.0,
+ "MaximumBandwidthInMbps": 15000,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "18.75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "18.75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 30000,
+ "BaselineIops": 120000,
+ "BaselineThroughputInMBps": 3750.0,
+ "MaximumBandwidthInMbps": 30000,
+ "MaximumIops": 120000,
+ "MaximumThroughputInMBps": 3750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "37.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "37.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48,
+ 50,
+ 52,
+ 54,
+ 56,
+ 58,
+ 60,
+ 62,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "m6i.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128
+ }
+ },
+ "m6i.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "m6i.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "mac1.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "mac1.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64_mac"
+ ],
+ "SustainedClockSpeedInGhz": 3.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 6,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 12
+ }
+ },
+ "p2.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 65000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 65000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 16,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 12288
+ },
+ "Name": "K80"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 196608
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p2.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 749568
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p2.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 32500,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 5000,
+ "MaximumIops": 32500,
+ "MaximumThroughputInMBps": 625.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 12288
+ },
+ "Name": "K80"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 98304
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p2.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p2.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 750,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 93.75,
+ "MaximumBandwidthInMbps": 750,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 93.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 12288
+ },
+ "Name": "K80"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 12288
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p2.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p3.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "V100"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 131072
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p3.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p3.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1750,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 218.75,
+ "MaximumBandwidthInMbps": 1750,
+ "MaximumIops": 10000,
+ "MaximumThroughputInMBps": 218.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 1,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "V100"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 16384
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p3.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 4,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "Name": "V100"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 65536
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "p3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.7
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p3dn.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "Name": "V100"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 262144
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "p3dn.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "p4d.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "GpuInfo": {
+ "Gpus": [
+ {
+ "Count": 8,
+ "Manufacturer": "NVIDIA",
+ "MemoryInfo": {
+ "SizeInMiB": 40960
+ },
+ "Name": "A100"
+ }
+ ],
+ "TotalGpuMemoryInMiB": 327680
+ },
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 8,
+ "SizeInGB": 1000,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 8000
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "p4d.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 1179648
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 4
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 4,
+ "MaximumNetworkInterfaces": 60,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 1,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 2,
+ "NetworkPerformance": "100 Gigabit"
+ },
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 3,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "4x 100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r3.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 8000,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 8000,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 160,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 160
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r3.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2000,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 250.0,
+ "MaximumBandwidthInMbps": 2000,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 250.0
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 320,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 320
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r3.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "High"
+ }
+ ],
+ "NetworkPerformance": "High"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r3.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 320,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 640
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r3.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r3.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 32,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 32
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r3.large",
+ "MemoryInfo": {
+ "SizeInMiB": 15360
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r3.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 4000,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "supported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 80,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 80
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 75000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 75000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1700,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 212.5,
+ "MaximumBandwidthInMbps": 1700,
+ "MaximumIops": 12000,
+ "MaximumThroughputInMBps": 212.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 62464
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 18750,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 37500,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 37500,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 425,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 53.125,
+ "MaximumBandwidthInMbps": 425,
+ "MaximumIops": 3000,
+ "MaximumThroughputInMBps": 53.125
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.large",
+ "MemoryInfo": {
+ "SizeInMiB": 15616
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r4.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 850,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 106.25,
+ "MaximumBandwidthInMbps": 850,
+ "MaximumIops": 6000,
+ "MaximumThroughputInMBps": 106.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r4.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 31232
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 18750,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "r5.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6780,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 847.5,
+ "MaximumBandwidthInMbps": 6780,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 847.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 6,
+ 12,
+ 18,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13570,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1696.25,
+ "MaximumBandwidthInMbps": 13570,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1696.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 12,
+ 18,
+ 24,
+ 36,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 8333,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2880,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 360.0,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5a.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1085,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 135.625,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5a.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6780,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 847.5,
+ "MaximumBandwidthInMbps": 6780,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 847.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 6,
+ 12,
+ 18,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13570,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1696.25,
+ "MaximumBandwidthInMbps": 13570,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1696.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 12,
+ 18,
+ 24,
+ 36,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 8333,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2880,
+ "BaselineIops": 16000,
+ "BaselineThroughputInMBps": 360.0,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5ad.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1085,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 135.625,
+ "MaximumBandwidthInMbps": 2880,
+ "MaximumIops": 16000,
+ "MaximumThroughputInMBps": 360.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5ad.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 30000,
+ "BaselineIops": 130000,
+ "BaselineThroughputInMBps": 3750.0,
+ "MaximumBandwidthInMbps": 30000,
+ "MaximumIops": 130000,
+ "MaximumThroughputInMBps": 3750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 173333,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 173333,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 60000,
+ "BaselineIops": 260000,
+ "BaselineThroughputInMBps": 7500.0,
+ "MaximumBandwidthInMbps": 60000,
+ "MaximumIops": 260000,
+ "MaximumThroughputInMBps": 7500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 21667,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 43333,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 43333,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 43333,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 86667,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 86667,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 5417,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 43333,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5b.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 60000,
+ "BaselineIops": 260000,
+ "BaselineThroughputInMBps": 7500.0,
+ "MaximumBandwidthInMbps": 60000,
+ "MaximumIops": 260000,
+ "MaximumThroughputInMBps": 7500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "r5b.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 10833,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 43333,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5b.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 18750,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5d.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "r5d.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 18750,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5d.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2400
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 600,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1200
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5dn.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 4,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3600
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "r5dn.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r5dn.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 13600,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1700.0,
+ "MaximumBandwidthInMbps": 13600,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1700.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2300,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 287.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 15000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 6800,
+ "BaselineIops": 30000,
+ "BaselineThroughputInMBps": 850.0,
+ "MaximumBandwidthInMbps": 6800,
+ "MaximumIops": 30000,
+ "MaximumThroughputInMBps": 850.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3000,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r5n.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96
+ }
+ },
+ "r5n.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1150,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 143.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 15000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r5n.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6g.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6g.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "r6g.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "r6g.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6g.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 50000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 50000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1425,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2850
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 474,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 474
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 950,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 950
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 118,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 118
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6gd.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 59,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 59
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "r6gd.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "r6gd.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 237,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 237
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "r6gd.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "r6i.12xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 15000,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1875.0,
+ "MaximumBandwidthInMbps": 15000,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "18.75 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "18.75 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 20000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2500.0,
+ "MaximumBandwidthInMbps": 20000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2500.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.24xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 30000,
+ "BaselineIops": 120000,
+ "BaselineThroughputInMBps": 3750.0,
+ "MaximumBandwidthInMbps": 30000,
+ "MaximumIops": 120000,
+ "MaximumThroughputInMBps": 3750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "37.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "37.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2500,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 312.5,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 1048576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32,
+ 34,
+ 36,
+ 38,
+ 40,
+ 42,
+ 44,
+ 46,
+ 48,
+ 50,
+ 52,
+ 54,
+ 56,
+ 58,
+ 60,
+ 62,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 5000,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 625.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 10000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1250.0,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 650,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 81.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "r6i.metal": {
+ "AutoRecoverySupported": true,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 40000,
+ "BaselineIops": 160000,
+ "BaselineThroughputInMBps": 5000.0,
+ "MaximumBandwidthInMbps": 40000,
+ "MaximumIops": 160000,
+ "MaximumThroughputInMBps": 5000.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 1048576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "50 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "50 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128
+ }
+ },
+ "r6i.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1250,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 156.25,
+ "MaximumBandwidthInMbps": 10000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1250.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "r6i.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 12.5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 3.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t1.micro": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": false,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": true,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t1.micro",
+ "MemoryInfo": {
+ "SizeInMiB": 627
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 0,
+ "Ipv6Supported": false,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Very Low"
+ }
+ ],
+ "NetworkPerformance": "Very Low"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ]
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm",
+ "paravirtual"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "t2.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8
+ }
+ },
+ "t2.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 12,
+ "Ipv6AddressesPerInterface": 12,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low to Moderate"
+ }
+ ],
+ "NetworkPerformance": "Low to Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2
+ }
+ },
+ "t2.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 6,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low to Moderate"
+ }
+ ],
+ "NetworkPerformance": "Low to Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2
+ }
+ },
+ "t2.micro": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": true,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.micro",
+ "MemoryInfo": {
+ "SizeInMiB": 1024
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low to Moderate"
+ }
+ ],
+ "NetworkPerformance": "Low to Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "t2.nano": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.nano",
+ "MemoryInfo": {
+ "SizeInMiB": 512
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low to Moderate"
+ }
+ ],
+ "NetworkPerformance": "Low to Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.4
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "t2.small": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.small",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Low to Moderate"
+ }
+ ],
+ "NetworkPerformance": "Low to Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "i386",
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "t2.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedSupport": "unsupported",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "xen",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t2.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "unsupported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Moderate"
+ }
+ ],
+ "NetworkPerformance": "Moderate"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4
+ }
+ },
+ "t3.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 12,
+ "Ipv6AddressesPerInterface": 12,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 347,
+ "BaselineIops": 2000,
+ "BaselineThroughputInMBps": 43.375,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 6,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.micro": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 87,
+ "BaselineIops": 500,
+ "BaselineThroughputInMBps": 10.875,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.micro",
+ "MemoryInfo": {
+ "SizeInMiB": 1024
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.nano": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 43,
+ "BaselineIops": 250,
+ "BaselineThroughputInMBps": 5.375,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.nano",
+ "MemoryInfo": {
+ "SizeInMiB": 512
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.small": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 174,
+ "BaselineIops": 1000,
+ "BaselineThroughputInMBps": 21.75,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.small",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.large": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 12,
+ "Ipv6AddressesPerInterface": 12,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.medium": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 350,
+ "BaselineIops": 2000,
+ "BaselineThroughputInMBps": 43.75,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 6,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.micro": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 90,
+ "BaselineIops": 500,
+ "BaselineThroughputInMBps": 11.25,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.micro",
+ "MemoryInfo": {
+ "SizeInMiB": 1024
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.nano": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 45,
+ "BaselineIops": 250,
+ "BaselineThroughputInMBps": 5.625,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.nano",
+ "MemoryInfo": {
+ "SizeInMiB": 512
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.small": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 175,
+ "BaselineIops": 1000,
+ "BaselineThroughputInMBps": 21.875,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.small",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t3a.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": true,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t3a.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.2
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "t4g.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.large",
+ "MemoryInfo": {
+ "SizeInMiB": 8192
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 12,
+ "Ipv6AddressesPerInterface": 12,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 347,
+ "BaselineIops": 2000,
+ "BaselineThroughputInMBps": 43.375,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 4096
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 6,
+ "Ipv6AddressesPerInterface": 6,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.micro": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 87,
+ "BaselineIops": 500,
+ "BaselineThroughputInMBps": 10.875,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.micro",
+ "MemoryInfo": {
+ "SizeInMiB": 1024
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.nano": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 43,
+ "BaselineIops": 250,
+ "BaselineThroughputInMBps": 5.375,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.nano",
+ "MemoryInfo": {
+ "SizeInMiB": 512
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 2,
+ "Ipv6AddressesPerInterface": 2,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.small": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 174,
+ "BaselineIops": 1000,
+ "BaselineThroughputInMBps": 21.75,
+ "MaximumBandwidthInMbps": 2085,
+ "MaximumIops": 11800,
+ "MaximumThroughputInMBps": 260.625
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.small",
+ "MemoryInfo": {
+ "SizeInMiB": 2048
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "t4g.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": true,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 695,
+ "BaselineIops": 4000,
+ "BaselineThroughputInMBps": 86.875,
+ "MaximumBandwidthInMbps": 2780,
+ "MaximumIops": 15700,
+ "MaximumThroughputInMBps": 347.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "t4g.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 5 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 5 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "u-12tb1.112xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "u-12tb1.112xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 12582912
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 224,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 448,
+ "ValidCores": [
+ 8,
+ 16,
+ 24,
+ 32,
+ 40,
+ 48,
+ 56,
+ 64,
+ 72,
+ 80,
+ 88,
+ 96,
+ 104,
+ 112,
+ 120,
+ 128,
+ 136,
+ 144,
+ 152,
+ 160,
+ 168,
+ 176,
+ 184,
+ 192,
+ 200,
+ 208,
+ 216,
+ 224
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "u-6tb1.112xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "u-6tb1.112xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 6291456
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 224,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 448,
+ "ValidCores": [
+ 8,
+ 16,
+ 24,
+ 32,
+ 40,
+ 48,
+ 56,
+ 64,
+ 72,
+ 80,
+ 88,
+ 96,
+ 104,
+ 112,
+ 120,
+ 128,
+ 136,
+ 144,
+ 152,
+ 160,
+ 168,
+ 176,
+ 184,
+ 192,
+ 200,
+ 208,
+ 216,
+ 224
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "u-6tb1.56xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "u-6tb1.56xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 6291456
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 224,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 224,
+ "ValidCores": [
+ 8,
+ 16,
+ 24,
+ 32,
+ 40,
+ 48,
+ 56,
+ 64,
+ 72,
+ 80,
+ 88,
+ 96,
+ 104,
+ 112,
+ 120,
+ 128,
+ 136,
+ 144,
+ 152,
+ 160,
+ 168,
+ 176,
+ 184,
+ 192,
+ 200,
+ 208,
+ 216,
+ 224
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "u-9tb1.112xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "u-9tb1.112xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 9437184
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "100 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "100 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.1
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 224,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 448,
+ "ValidCores": [
+ 8,
+ 16,
+ 24,
+ 32,
+ 40,
+ 48,
+ 56,
+ 64,
+ 72,
+ 80,
+ 88,
+ 96,
+ 104,
+ 112,
+ 120,
+ 128,
+ 136,
+ 144,
+ 152,
+ 160,
+ 168,
+ 176,
+ 184,
+ 192,
+ 200,
+ 208,
+ 216,
+ 224
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "vt1.24xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "vt1.24xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaInfo": {
+ "MaximumEfaInterfaces": 1
+ },
+ "EfaSupported": true,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 96,
+ "ValidCores": [
+ 6,
+ 12,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "vt1.3xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "vt1.3xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 24576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "3.12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "3.12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 6,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 12,
+ "ValidCores": [
+ 6
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "vt1.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": false,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageSupported": false,
+ "InstanceType": "vt1.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 49152
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": true,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "6.25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "6.25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 6,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1920,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1920
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 999424
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1920,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 3840
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 1998848
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs",
+ "instance-store"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 36,
+ 40,
+ 44,
+ 48,
+ 52,
+ 56,
+ 60,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.16xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 7000,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 875.0,
+ "MaximumBandwidthInMbps": 7000,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 875.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1920,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 1920
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 1998848
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24,
+ 26,
+ 28,
+ 30,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.2xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1000,
+ "BaselineIops": 7400,
+ "BaselineThroughputInMBps": 125.0,
+ "MaximumBandwidthInMbps": 1000,
+ "MaximumIops": 7400,
+ "MaximumThroughputInMBps": 125.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 240,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 240
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 249856
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.32xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 1750.0,
+ "MaximumBandwidthInMbps": 14000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 1750.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1920,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 3840
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.32xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 3997696
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 128,
+ "ValidCores": [
+ 4,
+ 8,
+ 12,
+ 16,
+ 20,
+ 24,
+ 28,
+ 32,
+ 36,
+ 40,
+ 44,
+ 48,
+ 52,
+ 56,
+ 60,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.4xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1750,
+ "BaselineIops": 10000,
+ "BaselineThroughputInMBps": 218.75,
+ "MaximumBandwidthInMbps": 1750,
+ "MaximumIops": 10000,
+ "MaximumThroughputInMBps": 218.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 480,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 480
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 499712
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.8xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3500,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 437.5,
+ "MaximumBandwidthInMbps": 3500,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 437.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 960,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 960
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 999424
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x1e.xlarge": {
+ "AutoRecoverySupported": true,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 500,
+ "BaselineIops": 3700,
+ "BaselineThroughputInMBps": 62.5,
+ "MaximumBandwidthInMbps": 500,
+ "MaximumIops": 3700,
+ "MaximumThroughputInMBps": 62.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "unsupported"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "xen",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 120,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "unsupported",
+ "NvmeSupport": "unsupported",
+ "TotalSizeInGB": 120
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x1e.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 124928
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "supported",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 2.3
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "x2gd.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 14250,
+ "BaselineIops": 60000,
+ "BaselineThroughputInMBps": 1781.25,
+ "MaximumBandwidthInMbps": 14250,
+ "MaximumIops": 60000,
+ "MaximumThroughputInMBps": 1781.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1425,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 2850
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 786432
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "20 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "20 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 48,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.16xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.16xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 1048576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 2375,
+ "BaselineIops": 12000,
+ "BaselineThroughputInMBps": 296.875,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 475,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 475
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 131072
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 8,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.4xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 950,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 950
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.4xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 262144
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 16,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 16,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.8xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.8xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 524288
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "12 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "12 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 32,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 32,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 630,
+ "BaselineIops": 3600,
+ "BaselineThroughputInMBps": 78.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 118,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 118
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.large",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "x2gd.medium": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 315,
+ "BaselineIops": 2500,
+ "BaselineThroughputInMBps": 39.375,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 59,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 59
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.medium",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 4,
+ "Ipv6AddressesPerInterface": 4,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 2,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 1
+ }
+ },
+ "x2gd.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 1900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 3800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 1048576
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 64,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 64
+ }
+ },
+ "x2gd.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1188,
+ "BaselineIops": 6000,
+ "BaselineThroughputInMBps": 148.5,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 237,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 237
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "x2gd.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "arm64"
+ ],
+ "SustainedClockSpeedInGhz": 2.5
+ },
+ "SupportedBootModes": [
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 1,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1
+ ]
+ }
+ },
+ "z1d.12xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.12xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48,
+ "ValidCores": [
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14,
+ 16,
+ 18,
+ 20,
+ 22,
+ 24
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "z1d.2xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 3170,
+ "BaselineIops": 13333,
+ "BaselineThroughputInMBps": 396.25,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 300,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 300
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.2xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 65536
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 4,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 8,
+ "ValidCores": [
+ 2,
+ 4
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "z1d.3xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 4750,
+ "BaselineIops": 20000,
+ "BaselineThroughputInMBps": 593.75,
+ "MaximumBandwidthInMbps": 4750,
+ "MaximumIops": 20000,
+ "MaximumThroughputInMBps": 593.75
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 450,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 450
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.3xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 98304
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 6,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 12,
+ "ValidCores": [
+ 2,
+ 4,
+ 6
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "z1d.6xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 9500,
+ "BaselineIops": 40000,
+ "BaselineThroughputInMBps": 1187.5,
+ "MaximumBandwidthInMbps": 9500,
+ "MaximumIops": 40000,
+ "MaximumThroughputInMBps": 1187.5
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 900
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.6xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 196608
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 30,
+ "Ipv6AddressesPerInterface": 30,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 8,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 12,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 24,
+ "ValidCores": [
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "z1d.large": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 800,
+ "BaselineIops": 3333,
+ "BaselineThroughputInMBps": 100.0,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 75,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 75
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.large",
+ "MemoryInfo": {
+ "SizeInMiB": 16384
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 10,
+ "Ipv6AddressesPerInterface": 10,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 3,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 1,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 2,
+ "ValidCores": [
+ 1
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ },
+ "z1d.metal": {
+ "AutoRecoverySupported": false,
+ "BareMetal": true,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 19000,
+ "BaselineIops": 80000,
+ "BaselineThroughputInMBps": 2375.0,
+ "MaximumBandwidthInMbps": 19000,
+ "MaximumIops": 80000,
+ "MaximumThroughputInMBps": 2375.0
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 2,
+ "SizeInGB": 900,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 1800
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.metal",
+ "MemoryInfo": {
+ "SizeInMiB": 393216
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 50,
+ "Ipv6AddressesPerInterface": 50,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 15,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "25 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "25 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 24,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 48
+ }
+ },
+ "z1d.xlarge": {
+ "AutoRecoverySupported": false,
+ "BareMetal": false,
+ "BurstablePerformanceSupported": false,
+ "CurrentGeneration": true,
+ "DedicatedHostsSupported": true,
+ "EbsInfo": {
+ "EbsOptimizedInfo": {
+ "BaselineBandwidthInMbps": 1580,
+ "BaselineIops": 6667,
+ "BaselineThroughputInMBps": 197.5,
+ "MaximumBandwidthInMbps": 3170,
+ "MaximumIops": 13333,
+ "MaximumThroughputInMBps": 396.25
+ },
+ "EbsOptimizedSupport": "default",
+ "EncryptionSupport": "supported",
+ "NvmeSupport": "required"
+ },
+ "FreeTierEligible": false,
+ "HibernationSupported": false,
+ "Hypervisor": "nitro",
+ "InstanceStorageInfo": {
+ "Disks": [
+ {
+ "Count": 1,
+ "SizeInGB": 150,
+ "Type": "ssd"
+ }
+ ],
+ "EncryptionSupport": "required",
+ "NvmeSupport": "required",
+ "TotalSizeInGB": 150
+ },
+ "InstanceStorageSupported": true,
+ "InstanceType": "z1d.xlarge",
+ "MemoryInfo": {
+ "SizeInMiB": 32768
+ },
+ "NetworkInfo": {
+ "DefaultNetworkCardIndex": 0,
+ "EfaSupported": false,
+ "EnaSupport": "required",
+ "EncryptionInTransitSupported": false,
+ "Ipv4AddressesPerInterface": 15,
+ "Ipv6AddressesPerInterface": 15,
+ "Ipv6Supported": true,
+ "MaximumNetworkCards": 1,
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCards": [
+ {
+ "MaximumNetworkInterfaces": 4,
+ "NetworkCardIndex": 0,
+ "NetworkPerformance": "Up to 10 Gigabit"
+ }
+ ],
+ "NetworkPerformance": "Up to 10 Gigabit"
+ },
+ "PlacementGroupInfo": {
+ "SupportedStrategies": [
+ "cluster",
+ "partition",
+ "spread"
+ ]
+ },
+ "ProcessorInfo": {
+ "SupportedArchitectures": [
+ "x86_64"
+ ],
+ "SustainedClockSpeedInGhz": 4.0
+ },
+ "SupportedBootModes": [
+ "legacy-bios",
+ "uefi"
+ ],
+ "SupportedRootDeviceTypes": [
+ "ebs"
+ ],
+ "SupportedUsageClasses": [
+ "on-demand",
+ "spot"
+ ],
+ "SupportedVirtualizationTypes": [
+ "hvm"
+ ],
+ "VCpuInfo": {
+ "DefaultCores": 2,
+ "DefaultThreadsPerCore": 2,
+ "DefaultVCpus": 4,
+ "ValidCores": [
+ 1,
+ 2
+ ],
+ "ValidThreadsPerCore": [
+ 1,
+ 2
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ec2/responses/__init__.py b/contrib/python/moto/py3/moto/ec2/responses/__init__.py
new file mode 100644
index 0000000000..24be4b8f8d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/__init__.py
@@ -0,0 +1,97 @@
+from .account_attributes import AccountAttributes
+from .amazon_dev_pay import AmazonDevPay
+from .amis import AmisResponse
+from .availability_zones_and_regions import AvailabilityZonesAndRegions
+from .customer_gateways import CustomerGateways
+from .dhcp_options import DHCPOptions
+from .elastic_block_store import ElasticBlockStore
+from .elastic_ip_addresses import ElasticIPAddresses
+from .elastic_network_interfaces import ElasticNetworkInterfaces
+from .general import General
+from .instances import InstanceResponse
+from .internet_gateways import InternetGateways
+from .egress_only_internet_gateways import EgressOnlyInternetGateway
+from .ip_addresses import IPAddresses
+from .key_pairs import KeyPairs
+from .launch_templates import LaunchTemplates
+from .monitoring import Monitoring
+from .network_acls import NetworkACLs
+from .placement_groups import PlacementGroups
+from .reserved_instances import ReservedInstances
+from .route_tables import RouteTables
+from .security_groups import SecurityGroups
+from .settings import Settings
+from .spot_fleets import SpotFleets
+from .spot_instances import SpotInstances
+from .subnets import Subnets
+from .flow_logs import FlowLogs
+from .tags import TagResponse
+from .virtual_private_gateways import VirtualPrivateGateways
+from .vm_export import VMExport
+from .vm_import import VMImport
+from .vpcs import VPCs
+from .vpc_service_configuration import VPCEndpointServiceConfiguration
+from .vpc_peering_connections import VPCPeeringConnections
+from .vpn_connections import VPNConnections
+from .windows import Windows
+from .nat_gateways import NatGateways
+from .transit_gateways import TransitGateways
+from .transit_gateway_route_tables import TransitGatewayRouteTable
+from .transit_gateway_attachments import TransitGatewayAttachment
+from .iam_instance_profiles import IamInstanceProfiles
+from .carrier_gateways import CarrierGateway
+
+
+class EC2Response(
+ AccountAttributes,
+ AmazonDevPay,
+ AmisResponse,
+ AvailabilityZonesAndRegions,
+ CustomerGateways,
+ DHCPOptions,
+ ElasticBlockStore,
+ ElasticIPAddresses,
+ ElasticNetworkInterfaces,
+ General,
+ InstanceResponse,
+ InternetGateways,
+ EgressOnlyInternetGateway,
+ IPAddresses,
+ KeyPairs,
+ LaunchTemplates,
+ Monitoring,
+ NetworkACLs,
+ PlacementGroups,
+ ReservedInstances,
+ RouteTables,
+ SecurityGroups,
+ Settings,
+ SpotFleets,
+ SpotInstances,
+ Subnets,
+ FlowLogs,
+ TagResponse,
+ VirtualPrivateGateways,
+ VMExport,
+ VMImport,
+ VPCs,
+ VPCEndpointServiceConfiguration,
+ VPCPeeringConnections,
+ VPNConnections,
+ Windows,
+ NatGateways,
+ TransitGateways,
+ TransitGatewayRouteTable,
+ TransitGatewayAttachment,
+ IamInstanceProfiles,
+ CarrierGateway,
+):
+ @property
+ def ec2_backend(self):
+ from moto.ec2.models import ec2_backends
+
+ return ec2_backends[self.region]
+
+ @property
+ def should_autoescape(self):
+ return True
diff --git a/contrib/python/moto/py3/moto/ec2/responses/_base_response.py b/contrib/python/moto/py3/moto/ec2/responses/_base_response.py
new file mode 100644
index 0000000000..2b25c2b3f5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/_base_response.py
@@ -0,0 +1,16 @@
+from moto.core.responses import BaseResponse
+from ..utils import convert_tag_spec
+
+
+class EC2BaseResponse(BaseResponse):
+ def _filters_from_querystring(self):
+ # [{"Name": x1, "Value": y1}, ..]
+ _filters = self._get_multi_param("Filter.")
+ # return {x1: y1, ...}
+ return {f["Name"]: f["Value"] for f in _filters}
+
+ def _parse_tag_specification(self):
+ # [{"ResourceType": _type, "Tag": [{"Key": k, "Value": v}, ..]}]
+ tag_spec_set = self._get_multi_param("TagSpecification")
+ # {_type: {k: v, ..}}
+ return convert_tag_spec(tag_spec_set)
diff --git a/contrib/python/moto/py3/moto/ec2/responses/account_attributes.py b/contrib/python/moto/py3/moto/ec2/responses/account_attributes.py
new file mode 100644
index 0000000000..5ecc8ab5f9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/account_attributes.py
@@ -0,0 +1,67 @@
+from moto.core.responses import BaseResponse
+
+
+class AccountAttributes(BaseResponse):
+ def describe_account_attributes(self):
+ template = self.response_template(DESCRIBE_ACCOUNT_ATTRIBUTES_RESULT)
+ return template.render()
+
+
+DESCRIBE_ACCOUNT_ATTRIBUTES_RESULT = """
+<DescribeAccountAttributesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <accountAttributeSet>
+ <item>
+ <attributeName>vpc-max-security-groups-per-interface</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>max-instances</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>20</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>supported-platforms</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>EC2</attributeValue>
+ </item>
+ <item>
+ <attributeValue>VPC</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>default-vpc</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>none</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>max-elastic-ips</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ <item>
+ <attributeName>vpc-max-elastic-ips</attributeName>
+ <attributeValueSet>
+ <item>
+ <attributeValue>5</attributeValue>
+ </item>
+ </attributeValueSet>
+ </item>
+ </accountAttributeSet>
+</DescribeAccountAttributesResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/amazon_dev_pay.py b/contrib/python/moto/py3/moto/ec2/responses/amazon_dev_pay.py
new file mode 100644
index 0000000000..c5a188a356
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/amazon_dev_pay.py
@@ -0,0 +1,8 @@
+from moto.core.responses import BaseResponse
+
+
+class AmazonDevPay(BaseResponse):
+ def confirm_product_instance(self):
+ raise NotImplementedError(
+ "AmazonDevPay.confirm_product_instance is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/amis.py b/contrib/python/moto/py3/moto/ec2/responses/amis.py
new file mode 100644
index 0000000000..1bcefa3873
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/amis.py
@@ -0,0 +1,200 @@
+from ._base_response import EC2BaseResponse
+
+
+class AmisResponse(EC2BaseResponse):
+ def create_image(self):
+ name = self.querystring.get("Name")[0]
+ description = self._get_param("Description", if_none="")
+ instance_id = self._get_param("InstanceId")
+ tag_specifications = self._get_multi_param("TagSpecification")
+ if self.is_not_dryrun("CreateImage"):
+ image = self.ec2_backend.create_image(
+ instance_id,
+ name,
+ description,
+ tag_specifications=tag_specifications,
+ )
+ template = self.response_template(CREATE_IMAGE_RESPONSE)
+ return template.render(image=image)
+
+ def copy_image(self):
+ source_image_id = self._get_param("SourceImageId")
+ source_region = self._get_param("SourceRegion")
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ if self.is_not_dryrun("CopyImage"):
+ image = self.ec2_backend.copy_image(
+ source_image_id, source_region, name, description
+ )
+ template = self.response_template(COPY_IMAGE_RESPONSE)
+ return template.render(image=image)
+
+ def deregister_image(self):
+ ami_id = self._get_param("ImageId")
+ if self.is_not_dryrun("DeregisterImage"):
+ success = self.ec2_backend.deregister_image(ami_id)
+ template = self.response_template(DEREGISTER_IMAGE_RESPONSE)
+ return template.render(success=str(success).lower())
+
+ def describe_images(self):
+ self.error_on_dryrun()
+ ami_ids = self._get_multi_param("ImageId")
+ filters = self._filters_from_querystring()
+ owners = self._get_multi_param("Owner")
+ exec_users = self._get_multi_param("ExecutableBy")
+ images = self.ec2_backend.describe_images(
+ ami_ids=ami_ids, filters=filters, exec_users=exec_users, owners=owners
+ )
+ template = self.response_template(DESCRIBE_IMAGES_RESPONSE)
+ return template.render(images=images)
+
+ def describe_image_attribute(self):
+ ami_id = self._get_param("ImageId")
+ groups = self.ec2_backend.get_launch_permission_groups(ami_id)
+ users = self.ec2_backend.get_launch_permission_users(ami_id)
+ template = self.response_template(DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE)
+ return template.render(ami_id=ami_id, groups=groups, users=users)
+
+ def modify_image_attribute(self):
+ ami_id = self._get_param("ImageId")
+ operation_type = self._get_param("OperationType")
+ group = self._get_param("UserGroup.1")
+ user_ids = self._get_multi_param("UserId")
+ if self.is_not_dryrun("ModifyImageAttribute"):
+ if operation_type == "add":
+ self.ec2_backend.add_launch_permission(
+ ami_id, user_ids=user_ids, group=group
+ )
+ elif operation_type == "remove":
+ self.ec2_backend.remove_launch_permission(
+ ami_id, user_ids=user_ids, group=group
+ )
+ return MODIFY_IMAGE_ATTRIBUTE_RESPONSE
+
+ def register_image(self):
+ name = self.querystring.get("Name")[0]
+ description = self._get_param("Description", if_none="")
+ if self.is_not_dryrun("RegisterImage"):
+ image = self.ec2_backend.register_image(name, description)
+ template = self.response_template(REGISTER_IMAGE_RESPONSE)
+ return template.render(image=image)
+
+ def reset_image_attribute(self):
+ if self.is_not_dryrun("ResetImageAttribute"):
+ raise NotImplementedError(
+ "AMIs.reset_image_attribute is not yet implemented"
+ )
+
+
+CREATE_IMAGE_RESPONSE = """<CreateImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+</CreateImageResponse>"""
+
+COPY_IMAGE_RESPONSE = """<CopyImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>60bc441d-fa2c-494d-b155-5d6a3EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+</CopyImageResponse>"""
+
+# TODO almost all of these params should actually be templated based on
+# the ec2 image
+DESCRIBE_IMAGES_RESPONSE = """<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imagesSet>
+ {% for image in images %}
+ <item>
+ <imageId>{{ image.id }}</imageId>
+ <imageLocation>{{ image.image_location }}</imageLocation>
+ <imageState>{{ image.state }}</imageState>
+ <imageOwnerId>{{ image.owner_id }}</imageOwnerId>
+ <isPublic>{{ image.is_public_string }}</isPublic>
+ <architecture>{{ image.architecture }}</architecture>
+ <imageType>{{ image.image_type }}</imageType>
+ <kernelId>{{ image.kernel_id }}</kernelId>
+ <ramdiskId>ari-1a2b3c4d</ramdiskId>
+ <imageOwnerAlias>amazon</imageOwnerAlias>
+ <creationDate>{{ image.creation_date }}</creationDate>
+ <name>{{ image.name }}</name>
+ {% if image.platform %}
+ <platform>{{ image.platform }}</platform>
+ {% endif %}
+ <description>{{ image.description }}</description>
+ <rootDeviceType>{{ image.root_device_type }}</rootDeviceType>
+ <rootDeviceName>{{ image.root_device_name }}</rootDeviceName>
+ <blockDeviceMapping>
+ <item>
+ <deviceName>{{ image.root_device_name }}</deviceName>
+ <ebs>
+ <snapshotId>{{ image.ebs_snapshot.id }}</snapshotId>
+ <volumeSize>15</volumeSize>
+ <deleteOnTermination>false</deleteOnTermination>
+ <volumeType>standard</volumeType>
+ </ebs>
+ </item>
+ </blockDeviceMapping>
+ <virtualizationType>{{ image.virtualization_type }}</virtualizationType>
+ <tagSet>
+ {% for tag in image.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <hypervisor>xen</hypervisor>
+ </item>
+ {% endfor %}
+ </imagesSet>
+</DescribeImagesResponse>"""
+
+DESCRIBE_IMAGE_RESPONSE = """<DescribeImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+ <{{ key }}>
+ <value>{{ value }}</value>
+ </{{key }}>
+</DescribeImageAttributeResponse>"""
+
+DEREGISTER_IMAGE_RESPONSE = """<DeregisterImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>{{ success }}</return>
+</DeregisterImageResponse>"""
+
+DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE = """
+<DescribeImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ ami_id }}</imageId>
+ {% if not groups and not users %}
+ <launchPermission/>
+ {% else %}
+ <launchPermission>
+ {% if groups %}
+ {% for group in groups %}
+ <item>
+ <group>{{ group }}</group>
+ </item>
+ {% endfor %}
+ {% endif %}
+ {% if users %}
+ {% for user in users %}
+ <item>
+ <userId>{{ user }}</userId>
+ </item>
+ {% endfor %}
+ {% endif %}
+ </launchPermission>
+ {% endif %}
+</DescribeImageAttributeResponse>"""
+
+MODIFY_IMAGE_ATTRIBUTE_RESPONSE = """
+<ModifyImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <return>true</return>
+</ModifyImageAttributeResponse>
+"""
+
+REGISTER_IMAGE_RESPONSE = """<RegisterImageResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <imageId>{{ image.id }}</imageId>
+</RegisterImageResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/availability_zones_and_regions.py b/contrib/python/moto/py3/moto/ec2/responses/availability_zones_and_regions.py
new file mode 100644
index 0000000000..3345dea626
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/availability_zones_and_regions.py
@@ -0,0 +1,45 @@
+from moto.core.responses import BaseResponse
+
+
+class AvailabilityZonesAndRegions(BaseResponse):
+ def describe_availability_zones(self):
+ self.error_on_dryrun()
+ zones = self.ec2_backend.describe_availability_zones()
+ template = self.response_template(DESCRIBE_ZONES_RESPONSE)
+ return template.render(zones=zones)
+
+ def describe_regions(self):
+ self.error_on_dryrun()
+ region_names = self._get_multi_param("RegionName")
+ regions = self.ec2_backend.describe_regions(region_names)
+ template = self.response_template(DESCRIBE_REGIONS_RESPONSE)
+ return template.render(regions=regions)
+
+
+DESCRIBE_REGIONS_RESPONSE = """<DescribeRegionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <regionInfo>
+ {% for region in regions %}
+ <item>
+ <regionName>{{ region.name }}</regionName>
+ <regionEndpoint>{{ region.endpoint }}</regionEndpoint>
+ <optInStatus>{{ region.opt_in_status }}</optInStatus>
+ </item>
+ {% endfor %}
+ </regionInfo>
+</DescribeRegionsResponse>"""
+
+DESCRIBE_ZONES_RESPONSE = """<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <availabilityZoneInfo>
+ {% for zone in zones %}
+ <item>
+ <zoneName>{{ zone.name }}</zoneName>
+ <zoneState>available</zoneState>
+ <regionName>{{ zone.region_name }}</regionName>
+ <zoneId>{{ zone.zone_id }}</zoneId>
+ <messageSet/>
+ </item>
+ {% endfor %}
+ </availabilityZoneInfo>
+</DescribeAvailabilityZonesResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/carrier_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/carrier_gateways.py
new file mode 100644
index 0000000000..4464cb9e73
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/carrier_gateways.py
@@ -0,0 +1,94 @@
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class CarrierGateway(EC2BaseResponse):
+ def create_carrier_gateway(self):
+ vpc_id = self._get_param("VpcId")
+ tags = self._get_multi_param("TagSpecification")
+ tags = add_tag_specification(tags)
+
+ carrier_gateway = self.ec2_backend.create_carrier_gateway(
+ vpc_id=vpc_id, tags=tags
+ )
+ template = self.response_template(CREATE_CARRIER_GATEWAY_RESPONSE)
+ return template.render(carrier_gateway=carrier_gateway)
+
+ def delete_carrier_gateway(self):
+ carrier_gateway_id = self._get_param("CarrierGatewayId")
+
+ carrier_gateway = self.ec2_backend.delete_carrier_gateway(carrier_gateway_id)
+ template = self.response_template(DELETE_CARRIER_GATEWAY_RESPONSE)
+ return template.render(carrier_gateway=carrier_gateway)
+
+ def describe_carrier_gateways(self):
+ carrier_gateway_ids = self._get_multi_param("CarrierGatewayId")
+ filters = self._filters_from_querystring()
+
+ carrier_gateways = self.ec2_backend.describe_carrier_gateways(
+ carrier_gateway_ids, filters
+ )
+ template = self.response_template(DESCRIBE_CARRIER_GATEWAYS_RESPONSE)
+ return template.render(carrier_gateways=carrier_gateways)
+
+
+CREATE_CARRIER_GATEWAY_RESPONSE = """<CreateCarrierGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c617595f-6c29-4a00-a941-example</requestId>
+ <carrierGateway>
+ <state>{{ carrier_gateway.state }}</state>
+ <vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
+ <carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
+ <ownerId>{{ carrier_gateway.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in carrier_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </carrierGateway>
+</CreateCarrierGatewayResponse>
+"""
+
+DELETE_CARRIER_GATEWAY_RESPONSE = """<DeleteCarrierGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c617595f-6c29-4a00-a941-example</requestId>
+ <carrierGateway>
+ <state>{{ carrier_gateway.state }}</state>
+ <vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
+ <carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
+ <ownerId>{{ carrier_gateway.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in carrier_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </carrierGateway>
+</DeleteCarrierGatewayResponse>
+"""
+
+DESCRIBE_CARRIER_GATEWAYS_RESPONSE = """<DescribeCarrierGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
+ <carrierGatewaySet>
+ {% for carrier_gateway in carrier_gateways %}
+ <item>
+ <state>{{ carrier_gateway.state }}</state>
+ <vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
+ <carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
+ <ownerId>{{ carrier_gateway.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in carrier_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </carrierGatewaySet>
+</DescribeCarrierGatewaysResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/customer_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/customer_gateways.py
new file mode 100644
index 0000000000..c9c8bf11be
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/customer_gateways.py
@@ -0,0 +1,85 @@
+from ._base_response import EC2BaseResponse
+
+
+class CustomerGateways(EC2BaseResponse):
+ def create_customer_gateway(self):
+ # raise NotImplementedError('CustomerGateways(AmazonVPC).create_customer_gateway is not yet implemented')
+ gateway_type = self._get_param("Type")
+ ip_address = self._get_param("IpAddress")
+ bgp_asn = self._get_param("BgpAsn")
+ tags = self._get_multi_param("TagSpecification")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+ customer_gateway = self.ec2_backend.create_customer_gateway(
+ gateway_type, ip_address=ip_address, bgp_asn=bgp_asn, tags=tags
+ )
+ template = self.response_template(CREATE_CUSTOMER_GATEWAY_RESPONSE)
+ return template.render(customer_gateway=customer_gateway)
+
+ def delete_customer_gateway(self):
+ customer_gateway_id = self._get_param("CustomerGatewayId")
+ delete_status = self.ec2_backend.delete_customer_gateway(customer_gateway_id)
+ template = self.response_template(DELETE_CUSTOMER_GATEWAY_RESPONSE)
+ return template.render(delete_status=delete_status)
+
+ def describe_customer_gateways(self):
+ self.error_on_dryrun()
+ filters = self._filters_from_querystring()
+ customer_gateway_ids = self._get_multi_param("CustomerGatewayId")
+ customer_gateways = self.ec2_backend.get_all_customer_gateways(
+ filters, customer_gateway_ids
+ )
+ template = self.response_template(DESCRIBE_CUSTOMER_GATEWAYS_RESPONSE)
+ return template.render(customer_gateways=customer_gateways)
+
+
+CREATE_CUSTOMER_GATEWAY_RESPONSE = """
+<CreateCustomerGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <customerGateway>
+ <customerGatewayId>{{ customer_gateway.id }}</customerGatewayId>
+ <state>{{ customer_gateway.state }}</state>
+ <type>{{ customer_gateway.type }}</type>
+ <ipAddress>{{ customer_gateway.ip_address }}</ipAddress>
+ <bgpAsn>{{ customer_gateway.bgp_asn }}</bgpAsn>
+ <tagSet>
+ {% for tag in customer_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </customerGateway>
+</CreateCustomerGatewayResponse>"""
+
+DELETE_CUSTOMER_GATEWAY_RESPONSE = """
+<DeleteCustomerGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>{{ delete_status }}</return>
+</DeleteCustomerGatewayResponse>"""
+
+DESCRIBE_CUSTOMER_GATEWAYS_RESPONSE = """
+<DescribeCustomerGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2014-10- 01/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <customerGatewaySet>
+ {% for customer_gateway in customer_gateways %}
+ <item>
+ <customerGatewayId>{{ customer_gateway.id }}</customerGatewayId>
+ <state>{{ customer_gateway.state }}</state>
+ <type>{{ customer_gateway.type }}</type>
+ <ipAddress>{{ customer_gateway.ip_address }}</ipAddress>
+ <bgpAsn>{{ customer_gateway.bgp_asn }}</bgpAsn>
+ <tagSet>
+ {% for tag in customer_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </customerGatewaySet>
+</DescribeCustomerGatewaysResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/dhcp_options.py b/contrib/python/moto/py3/moto/ec2/responses/dhcp_options.py
new file mode 100644
index 0000000000..5d4b90c7eb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/dhcp_options.py
@@ -0,0 +1,142 @@
+from ._base_response import EC2BaseResponse
+
+
+class DHCPOptions(EC2BaseResponse):
+ def associate_dhcp_options(self):
+ dhcp_opt_id = self._get_param("DhcpOptionsId")
+ vpc_id = self._get_param("VpcId")
+
+ dhcp_opt = self.ec2_backend.describe_dhcp_options([dhcp_opt_id])[0]
+ vpc = self.ec2_backend.get_vpc(vpc_id)
+
+ self.ec2_backend.associate_dhcp_options(dhcp_opt, vpc)
+
+ template = self.response_template(ASSOCIATE_DHCP_OPTIONS_RESPONSE)
+ return template.render()
+
+ def create_dhcp_options(self):
+ dhcp_config = self._get_multi_param("DhcpConfiguration")
+ dhcp_config = {f["Key"]: f["Value"] for f in dhcp_config}
+
+ # TODO validate we only got the options we know about
+
+ domain_name_servers = dhcp_config.get("domain-name-servers", None)
+ domain_name = dhcp_config.get("domain-name", None)
+ ntp_servers = dhcp_config.get("ntp-servers", None)
+ netbios_name_servers = dhcp_config.get("netbios-name-servers", None)
+ netbios_node_type = dhcp_config.get("netbios-node-type", None)
+
+ dhcp_options_set = self.ec2_backend.create_dhcp_options(
+ domain_name_servers=domain_name_servers,
+ domain_name=domain_name,
+ ntp_servers=ntp_servers,
+ netbios_name_servers=netbios_name_servers,
+ netbios_node_type=netbios_node_type,
+ )
+
+ template = self.response_template(CREATE_DHCP_OPTIONS_RESPONSE)
+ return template.render(dhcp_options_set=dhcp_options_set)
+
+ def delete_dhcp_options(self):
+ dhcp_opt_id = self._get_param("DhcpOptionsId")
+ delete_status = self.ec2_backend.delete_dhcp_options_set(dhcp_opt_id)
+ template = self.response_template(DELETE_DHCP_OPTIONS_RESPONSE)
+ return template.render(delete_status=delete_status)
+
+ def describe_dhcp_options(self):
+ dhcp_opt_ids = self._get_multi_param("DhcpOptionsId")
+ filters = self._filters_from_querystring()
+ dhcp_opts = self.ec2_backend.describe_dhcp_options(dhcp_opt_ids, filters)
+ template = self.response_template(DESCRIBE_DHCP_OPTIONS_RESPONSE)
+ return template.render(dhcp_options=dhcp_opts)
+
+
+CREATE_DHCP_OPTIONS_RESPONSE = """
+<CreateDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <dhcpOptions>
+ <dhcpOptionsId>{{ dhcp_options_set.id }}</dhcpOptionsId>
+ <dhcpConfigurationSet>
+ {% for key, values in dhcp_options_set.options.items() %}
+ {{ values }}
+ {% if values %}
+ <item>
+ <key>{{key}}</key>
+ <valueSet>
+ {% for value in values %}
+ <item>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </valueSet>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </dhcpConfigurationSet>
+ <tagSet>
+ {% for tag in dhcp_options_set.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </dhcpOptions>
+</CreateDhcpOptionsResponse>
+"""
+
+DELETE_DHCP_OPTIONS_RESPONSE = """
+<DeleteDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>{{delete_status}}</return>
+</DeleteDhcpOptionsResponse>
+"""
+
+DESCRIBE_DHCP_OPTIONS_RESPONSE = """
+<DescribeDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <dhcpOptionsSet>
+ {% for dhcp_options_set in dhcp_options %}
+ <item>
+ <dhcpOptionsId>{{ dhcp_options_set.id }}</dhcpOptionsId>
+ <dhcpConfigurationSet>
+ {% for key, values in dhcp_options_set.options.items() %}
+ {{ values }}
+ {% if values %}
+ <item>
+ <key>{{ key }}</key>
+ <valueSet>
+ {% for value in values %}
+ <item>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </valueSet>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </dhcpConfigurationSet>
+ <tagSet>
+ {% for tag in dhcp_options_set.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </dhcpOptionsSet>
+</DescribeDhcpOptionsResponse>
+"""
+
+ASSOCIATE_DHCP_OPTIONS_RESPONSE = """
+<AssociateDhcpOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+<requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+<return>true</return>
+</AssociateDhcpOptionsResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/egress_only_internet_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/egress_only_internet_gateways.py
new file mode 100644
index 0000000000..aec0dc1fec
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/egress_only_internet_gateways.py
@@ -0,0 +1,84 @@
+from moto.core.responses import BaseResponse
+from moto.ec2.utils import add_tag_specification
+
+
+class EgressOnlyInternetGateway(BaseResponse):
+ def create_egress_only_internet_gateway(self):
+ vpc_id = self._get_param("VpcId")
+ tags = self._get_multi_param("TagSpecification")
+ tags = add_tag_specification(tags)
+
+ egress_only_igw = self.ec2_backend.create_egress_only_internet_gateway(
+ vpc_id=vpc_id, tags=tags
+ )
+ template = self.response_template(CREATE_EGRESS_ONLY_IGW_RESPONSE)
+ return template.render(egress_only_igw=egress_only_igw)
+
+ def describe_egress_only_internet_gateways(self):
+ egress_only_igw_ids = self._get_multi_param("EgressOnlyInternetGatewayId")
+ egress_only_igws = self.ec2_backend.describe_egress_only_internet_gateways(
+ egress_only_igw_ids
+ )
+ template = self.response_template(DESCRIBE_EGRESS_ONLY_IGW_RESPONSE)
+ return template.render(egress_only_igws=egress_only_igws)
+
+ def delete_egress_only_internet_gateway(self):
+ egress_only_igw_id = self._get_param("EgressOnlyInternetGatewayId")
+ self.ec2_backend.delete_egress_only_internet_gateway(
+ gateway_id=egress_only_igw_id
+ )
+ template = self.response_template(DELETE_EGRESS_ONLY_IGW_RESPONSE)
+ return template.render()
+
+
+CREATE_EGRESS_ONLY_IGW_RESPONSE = """<CreateEgressOnlyInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c617595f-6c29-4a00-a941-example</requestId>
+ <egressOnlyInternetGateway>
+ <attachmentSet>
+ <item>
+ <state>{{ egress_only_igw.state }}</state>
+ <vpcId>{{ egress_only_igw.vpc_id }}</vpcId>
+ </item>
+ </attachmentSet>
+ <egressOnlyInternetGatewayId>{{ egress_only_igw.id }}</egressOnlyInternetGatewayId>
+ <tagSet>
+ {% for tag in egress_only_igw.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </egressOnlyInternetGateway>
+</CreateEgressOnlyInternetGatewayResponse>
+"""
+
+DESCRIBE_EGRESS_ONLY_IGW_RESPONSE = """<DescribeEgressOnlyInternetGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>ec441b4c-357f-4483-b4a7-example</requestId>
+ <egressOnlyInternetGatewaySet>
+ {% for egress_only_igw in egress_only_igws %}
+ <item>
+ <attachmentSet>
+ <item>
+ <state>{{ egress_only_igw.state }}</state>
+ <vpcId>{{ egress_only_igw.vpc_id }}</vpcId>
+ </item>
+ </attachmentSet>
+ <egressOnlyInternetGatewayId>{{ egress_only_igw.id }}</egressOnlyInternetGatewayId>
+ <tagSet>
+ {% for tag in egress_only_igw.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </egressOnlyInternetGatewaySet>
+</DescribeEgressOnlyInternetGatewaysResponse>"""
+
+DELETE_EGRESS_ONLY_IGW_RESPONSE = """<DeleteEgressOnlyInternetGateway xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <returnCode>true</returnCode>
+</DeleteEgressOnlyInternetGateway>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/elastic_block_store.py b/contrib/python/moto/py3/moto/ec2/responses/elastic_block_store.py
new file mode 100644
index 0000000000..5a88a2a85e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/elastic_block_store.py
@@ -0,0 +1,404 @@
+from ._base_response import EC2BaseResponse
+
+
+class ElasticBlockStore(EC2BaseResponse):
+ def attach_volume(self):
+ volume_id = self._get_param("VolumeId")
+ instance_id = self._get_param("InstanceId")
+ device_path = self._get_param("Device")
+ if self.is_not_dryrun("AttachVolume"):
+ attachment = self.ec2_backend.attach_volume(
+ volume_id, instance_id, device_path
+ )
+ template = self.response_template(ATTACHED_VOLUME_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def copy_snapshot(self):
+ source_snapshot_id = self._get_param("SourceSnapshotId")
+ source_region = self._get_param("SourceRegion")
+ description = self._get_param("Description")
+ tags = self._parse_tag_specification()
+ snapshot_tags = tags.get("snapshot", {})
+ if self.is_not_dryrun("CopySnapshot"):
+ snapshot = self.ec2_backend.copy_snapshot(
+ source_snapshot_id, source_region, description
+ )
+ snapshot.add_tags(snapshot_tags)
+ template = self.response_template(COPY_SNAPSHOT_RESPONSE)
+ return template.render(snapshot=snapshot)
+
+ def create_snapshot(self):
+ volume_id = self._get_param("VolumeId")
+ description = self._get_param("Description")
+ tags = self._parse_tag_specification()
+ snapshot_tags = tags.get("snapshot", {})
+ if self.is_not_dryrun("CreateSnapshot"):
+ snapshot = self.ec2_backend.create_snapshot(volume_id, description)
+ snapshot.add_tags(snapshot_tags)
+ template = self.response_template(CREATE_SNAPSHOT_RESPONSE)
+ return template.render(snapshot=snapshot)
+
+ def create_snapshots(self):
+ params = self._get_params()
+ instance_spec = params.get("InstanceSpecification")
+ description = params.get("Description", "")
+ tags = self._parse_tag_specification()
+ snapshot_tags = tags.get("snapshot", {})
+
+ if self.is_not_dryrun("CreateSnapshots"):
+ snapshots = self.ec2_backend.create_snapshots(
+ instance_spec, description, snapshot_tags
+ )
+ template = self.response_template(CREATE_SNAPSHOTS_RESPONSE)
+ return template.render(snapshots=snapshots)
+
+ def create_volume(self):
+ size = self._get_param("Size")
+ zone = self._get_param("AvailabilityZone")
+ snapshot_id = self._get_param("SnapshotId")
+ volume_type = self._get_param("VolumeType")
+ tags = self._parse_tag_specification()
+ volume_tags = tags.get("volume", {})
+ encrypted = self._get_bool_param("Encrypted", if_none=False)
+ kms_key_id = self._get_param("KmsKeyId")
+ if self.is_not_dryrun("CreateVolume"):
+ volume = self.ec2_backend.create_volume(
+ size=size,
+ zone_name=zone,
+ snapshot_id=snapshot_id,
+ encrypted=encrypted,
+ kms_key_id=kms_key_id,
+ volume_type=volume_type,
+ )
+ volume.add_tags(volume_tags)
+ template = self.response_template(CREATE_VOLUME_RESPONSE)
+ return template.render(volume=volume)
+
+ def delete_snapshot(self):
+ snapshot_id = self._get_param("SnapshotId")
+ if self.is_not_dryrun("DeleteSnapshot"):
+ self.ec2_backend.delete_snapshot(snapshot_id)
+ return DELETE_SNAPSHOT_RESPONSE
+
+ def delete_volume(self):
+ volume_id = self._get_param("VolumeId")
+ if self.is_not_dryrun("DeleteVolume"):
+ self.ec2_backend.delete_volume(volume_id)
+ return DELETE_VOLUME_RESPONSE
+
+ def describe_snapshots(self):
+ filters = self._filters_from_querystring()
+ snapshot_ids = self._get_multi_param("SnapshotId")
+ snapshots = self.ec2_backend.describe_snapshots(
+ snapshot_ids=snapshot_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_SNAPSHOTS_RESPONSE)
+ return template.render(snapshots=snapshots)
+
+ def describe_volumes(self):
+ filters = self._filters_from_querystring()
+ volume_ids = self._get_multi_param("VolumeId")
+ volumes = self.ec2_backend.describe_volumes(
+ volume_ids=volume_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_VOLUMES_RESPONSE)
+ return template.render(volumes=volumes)
+
+ def describe_volume_attribute(self):
+ raise NotImplementedError(
+ "ElasticBlockStore.describe_volume_attribute is not yet implemented"
+ )
+
+ def describe_volume_status(self):
+ raise NotImplementedError(
+ "ElasticBlockStore.describe_volume_status is not yet implemented"
+ )
+
+ def detach_volume(self):
+ volume_id = self._get_param("VolumeId")
+ instance_id = self._get_param("InstanceId")
+ device_path = self._get_param("Device")
+ if self.is_not_dryrun("DetachVolume"):
+ attachment = self.ec2_backend.detach_volume(
+ volume_id, instance_id, device_path
+ )
+ template = self.response_template(DETATCH_VOLUME_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def enable_volume_io(self):
+ if self.is_not_dryrun("EnableVolumeIO"):
+ raise NotImplementedError(
+ "ElasticBlockStore.enable_volume_io is not yet implemented"
+ )
+
+ def import_volume(self):
+ if self.is_not_dryrun("ImportVolume"):
+ raise NotImplementedError(
+ "ElasticBlockStore.import_volume is not yet implemented"
+ )
+
+ def describe_snapshot_attribute(self):
+ snapshot_id = self._get_param("SnapshotId")
+ groups = self.ec2_backend.get_create_volume_permission_groups(snapshot_id)
+ user_ids = self.ec2_backend.get_create_volume_permission_userids(snapshot_id)
+ template = self.response_template(DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE)
+ return template.render(snapshot_id=snapshot_id, groups=groups, userIds=user_ids)
+
+ def modify_snapshot_attribute(self):
+ snapshot_id = self._get_param("SnapshotId")
+ operation_type = self._get_param("OperationType")
+ groups = self._get_multi_param("UserGroup")
+ user_ids = self._get_multi_param("UserId")
+ if self.is_not_dryrun("ModifySnapshotAttribute"):
+ if operation_type == "add":
+ self.ec2_backend.add_create_volume_permission(
+ snapshot_id, user_ids=user_ids, groups=groups
+ )
+ elif operation_type == "remove":
+ self.ec2_backend.remove_create_volume_permission(
+ snapshot_id, user_ids=user_ids, groups=groups
+ )
+ return MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE
+
+ def modify_volume_attribute(self):
+ if self.is_not_dryrun("ModifyVolumeAttribute"):
+ raise NotImplementedError(
+ "ElasticBlockStore.modify_volume_attribute is not yet implemented"
+ )
+
+ def reset_snapshot_attribute(self):
+ if self.is_not_dryrun("ResetSnapshotAttribute"):
+ raise NotImplementedError(
+ "ElasticBlockStore.reset_snapshot_attribute is not yet implemented"
+ )
+
+
+CREATE_VOLUME_RESPONSE = """<CreateVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ volume.id }}</volumeId>
+ <size>{{ volume.size }}</size>
+ {% if volume.snapshot_id %}
+ <snapshotId>{{ volume.snapshot_id }}</snapshotId>
+ {% else %}
+ <snapshotId/>
+ {% endif %}
+ <encrypted>{{ 'true' if volume.encrypted else 'false' }}</encrypted>
+ {% if volume.encrypted %}
+ <kmsKeyId>{{ volume.kms_key_id }}</kmsKeyId>
+ {% endif %}
+ <availabilityZone>{{ volume.zone.name }}</availabilityZone>
+ <status>creating</status>
+ <createTime>{{ volume.create_time}}</createTime>
+ {% if volume.get_tags() %}
+ <tagSet>
+ {% for tag in volume.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <volumeType>{{ volume.volume_type }}</volumeType>
+</CreateVolumeResponse>"""
+
+DESCRIBE_VOLUMES_RESPONSE = """<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeSet>
+ {% for volume in volumes %}
+ <item>
+ <volumeId>{{ volume.id }}</volumeId>
+ <size>{{ volume.size }}</size>
+ {% if volume.snapshot_id %}
+ <snapshotId>{{ volume.snapshot_id }}</snapshotId>
+ {% else %}
+ <snapshotId/>
+ {% endif %}
+ <encrypted>{{ 'true' if volume.encrypted else 'false' }}</encrypted>
+ {% if volume.encrypted %}
+ <kmsKeyId>{{ volume.kms_key_id }}</kmsKeyId>
+ {% endif %}
+ <availabilityZone>{{ volume.zone.name }}</availabilityZone>
+ <status>{{ volume.status }}</status>
+ <createTime>{{ volume.create_time}}</createTime>
+ <attachmentSet>
+ {% if volume.attachment %}
+ <item>
+ <volumeId>{{ volume.id }}</volumeId>
+ <instanceId>{{ volume.attachment.instance.id }}</instanceId>
+ <device>{{ volume.attachment.device }}</device>
+ <status>attached</status>
+ <attachTime>{{volume.attachment.attach_time}}</attachTime>
+ <deleteOnTermination>false</deleteOnTermination>
+ </item>
+ {% endif %}
+ </attachmentSet>
+ {% if volume.get_tags() %}
+ <tagSet>
+ {% for tag in volume.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <volumeType>{{ volume.volume_type }}</volumeType>
+ </item>
+ {% endfor %}
+ </volumeSet>
+</DescribeVolumesResponse>"""
+
+DELETE_VOLUME_RESPONSE = """<DeleteVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteVolumeResponse>"""
+
+ATTACHED_VOLUME_RESPONSE = """<AttachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ attachment.volume.id }}</volumeId>
+ <instanceId>{{ attachment.instance.id }}</instanceId>
+ <device>{{ attachment.device }}</device>
+ <status>attaching</status>
+ <attachTime>{{attachment.attach_time}}</attachTime>
+</AttachVolumeResponse>"""
+
+DETATCH_VOLUME_RESPONSE = """<DetachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <volumeId>{{ attachment.volume.id }}</volumeId>
+ <instanceId>{{ attachment.instance.id }}</instanceId>
+ <device>{{ attachment.device }}</device>
+ <status>detaching</status>
+ <attachTime>2013-10-04T17:38:53.000Z</attachTime>
+</DetachVolumeResponse>"""
+
+CREATE_SNAPSHOT_RESPONSE = """<CreateSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <volumeId>{{ snapshot.volume.id }}</volumeId>
+ <status>pending</status>
+ <startTime>{{ snapshot.start_time}}</startTime>
+ <progress>60%</progress>
+ <ownerId>{{ snapshot.owner_id }}</ownerId>
+ <volumeSize>{{ snapshot.volume.size }}</volumeSize>
+ <description>{{ snapshot.description }}</description>
+ <encrypted>{{ 'true' if snapshot.encrypted else 'false' }}</encrypted>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</CreateSnapshotResponse>"""
+
+CREATE_SNAPSHOTS_RESPONSE = """<CreateSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotSet>
+ {% for snapshot in snapshots %}
+ <item>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <volumeId>{{ snapshot.volume.id }}</volumeId>
+ <status>pending</status>
+ <startTime>{{ snapshot.start_time}}</startTime>
+ <progress>60%</progress>
+ <ownerId>{{ snapshot.owner_id }}</ownerId>
+ <volumeSize>{{ snapshot.volume.size }}</volumeSize>
+ <description>{{ snapshot.description }}</description>
+ <encrypted>{{ 'true' if snapshot.encrypted else 'false' }}</encrypted>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </snapshotSet>
+</CreateSnapshotsResponse>"""
+
+COPY_SNAPSHOT_RESPONSE = """<CopySnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</CopySnapshotResponse>"""
+
+DESCRIBE_SNAPSHOTS_RESPONSE = """<DescribeSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <snapshotSet>
+ {% for snapshot in snapshots %}
+ <item>
+ <snapshotId>{{ snapshot.id }}</snapshotId>
+ <volumeId>{{ snapshot.volume.id }}</volumeId>
+ <status>{{ snapshot.status }}</status>
+ <startTime>{{ snapshot.start_time}}</startTime>
+ <progress>100%</progress>
+ <ownerId>{{ snapshot.owner_id }}</ownerId>
+ <volumeSize>{{ snapshot.volume.size }}</volumeSize>
+ <description>{{ snapshot.description }}</description>
+ <encrypted>{{ 'true' if snapshot.encrypted else 'false' }}</encrypted>
+ <tagSet>
+ {% for tag in snapshot.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </snapshotSet>
+</DescribeSnapshotsResponse>"""
+
+DELETE_SNAPSHOT_RESPONSE = """<DeleteSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteSnapshotResponse>"""
+
+DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE = """
+<DescribeSnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>a9540c9f-161a-45d8-9cc1-1182b89ad69f</requestId>
+ <snapshotId>snap-a0332ee0</snapshotId>
+ <createVolumePermission>
+ {% for group in groups %}
+ <item>
+ <group>{{ group }}</group>
+ </item>
+ {% endfor %}
+ {% for userId in userIds %}
+ <item>
+ <userId>{{ userId }}</userId>
+ </item>
+ {% endfor %}
+ </createVolumePermission>
+</DescribeSnapshotAttributeResponse>
+"""
+
+MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE = """
+<ModifySnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>666d2944-9276-4d6a-be12-1f4ada972fd8</requestId>
+ <return>true</return>
+</ModifySnapshotAttributeResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/elastic_ip_addresses.py b/contrib/python/moto/py3/moto/ec2/responses/elastic_ip_addresses.py
new file mode 100644
index 0000000000..f70a7a5a3c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/elastic_ip_addresses.py
@@ -0,0 +1,178 @@
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class ElasticIPAddresses(EC2BaseResponse):
+ def allocate_address(self):
+ domain = self._get_param("Domain", if_none="standard")
+ reallocate_address = self._get_param("Address", if_none=None)
+ tags = self._get_multi_param("TagSpecification")
+ tags = add_tag_specification(tags)
+
+ if self.is_not_dryrun("AllocateAddress"):
+ if reallocate_address:
+ address = self.ec2_backend.allocate_address(
+ domain, address=reallocate_address, tags=tags
+ )
+ else:
+ address = self.ec2_backend.allocate_address(domain, tags=tags)
+ template = self.response_template(ALLOCATE_ADDRESS_RESPONSE)
+ return template.render(address=address)
+
+ def associate_address(self):
+ instance = eni = None
+
+ if "InstanceId" in self.querystring:
+ instance = self.ec2_backend.get_instance(self._get_param("InstanceId"))
+ elif "NetworkInterfaceId" in self.querystring:
+ eni = self.ec2_backend.get_network_interface(
+ self._get_param("NetworkInterfaceId")
+ )
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter",
+ "Invalid request, expect InstanceId/NetworkId parameter.",
+ )
+
+ reassociate = False
+ if "AllowReassociation" in self.querystring:
+ reassociate = self._get_param("AllowReassociation") == "true"
+
+ if self.is_not_dryrun("AssociateAddress"):
+ if instance or eni:
+ if "PublicIp" in self.querystring:
+ eip = self.ec2_backend.associate_address(
+ instance=instance,
+ eni=eni,
+ address=self._get_param("PublicIp"),
+ reassociate=reassociate,
+ )
+ elif "AllocationId" in self.querystring:
+ eip = self.ec2_backend.associate_address(
+ instance=instance,
+ eni=eni,
+ allocation_id=self._get_param("AllocationId"),
+ reassociate=reassociate,
+ )
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter",
+ "Invalid request, expect PublicIp/AllocationId parameter.",
+ )
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter",
+ "Invalid request, expect either instance or ENI.",
+ )
+
+ template = self.response_template(ASSOCIATE_ADDRESS_RESPONSE)
+ return template.render(address=eip)
+
+ def describe_addresses(self):
+ self.error_on_dryrun()
+ allocation_ids = self._get_multi_param("AllocationId")
+ public_ips = self._get_multi_param("PublicIp")
+ filters = self._filters_from_querystring()
+ addresses = self.ec2_backend.describe_addresses(
+ allocation_ids, public_ips, filters
+ )
+ template = self.response_template(DESCRIBE_ADDRESS_RESPONSE)
+ return template.render(addresses=addresses)
+
+ def disassociate_address(self):
+ if self.is_not_dryrun("DisAssociateAddress"):
+ if "PublicIp" in self.querystring:
+ self.ec2_backend.disassociate_address(
+ address=self._get_param("PublicIp")
+ )
+ elif "AssociationId" in self.querystring:
+ self.ec2_backend.disassociate_address(
+ association_id=self._get_param("AssociationId")
+ )
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter",
+ "Invalid request, expect PublicIp/AssociationId parameter.",
+ )
+
+ return self.response_template(DISASSOCIATE_ADDRESS_RESPONSE).render()
+
+ def release_address(self):
+ if self.is_not_dryrun("ReleaseAddress"):
+ if "PublicIp" in self.querystring:
+ self.ec2_backend.release_address(address=self._get_param("PublicIp"))
+ elif "AllocationId" in self.querystring:
+ self.ec2_backend.release_address(
+ allocation_id=self._get_param("AllocationId")
+ )
+ else:
+ self.ec2_backend.raise_error(
+ "MissingParameter",
+ "Invalid request, expect PublicIp/AllocationId parameter.",
+ )
+
+ return self.response_template(RELEASE_ADDRESS_RESPONSE).render()
+
+
+ALLOCATE_ADDRESS_RESPONSE = """<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <publicIp>{{ address.public_ip }}</publicIp>
+ <domain>{{ address.domain }}</domain>
+ {% if address.allocation_id %}
+ <allocationId>{{ address.allocation_id }}</allocationId>
+ {% endif %}
+</AllocateAddressResponse>"""
+
+ASSOCIATE_ADDRESS_RESPONSE = """<AssociateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+ {% if address.association_id %}
+ <associationId>{{ address.association_id }}</associationId>
+ {% endif %}
+</AssociateAddressResponse>"""
+
+DESCRIBE_ADDRESS_RESPONSE = """<DescribeAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <addressesSet>
+ {% for address in addresses %}
+ <item>
+ <publicIp>{{ address.public_ip }}</publicIp>
+ <domain>{{ address.domain }}</domain>
+ {% if address.instance %}
+ <instanceId>{{ address.instance.id }}</instanceId>
+ {% else %}
+ <instanceId/>
+ {% endif %}
+ {% if address.eni %}
+ <networkInterfaceId>{{ address.eni.id }}</networkInterfaceId>
+ {% else %}
+ <networkInterfaceId/>
+ {% endif %}
+ {% if address.allocation_id %}
+ <allocationId>{{ address.allocation_id }}</allocationId>
+ {% endif %}
+ {% if address.association_id %}
+ <associationId>{{ address.association_id }}</associationId>
+ {% endif %}
+ <tagSet>
+ {% for tag in address.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </addressesSet>
+</DescribeAddressesResponse>"""
+
+DISASSOCIATE_ADDRESS_RESPONSE = """<DisassociateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DisassociateAddressResponse>"""
+
+RELEASE_ADDRESS_RESPONSE = """<ReleaseAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReleaseAddressResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/elastic_network_interfaces.py b/contrib/python/moto/py3/moto/ec2/responses/elastic_network_interfaces.py
new file mode 100644
index 0000000000..6a4f8cd4e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/elastic_network_interfaces.py
@@ -0,0 +1,412 @@
+from moto.ec2.exceptions import InvalidParameterValueErrorUnknownAttribute
+from moto.ec2.utils import get_attribute_value, add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class ElasticNetworkInterfaces(EC2BaseResponse):
+ def create_network_interface(self):
+ subnet_id = self._get_param("SubnetId")
+ private_ip_address = self._get_param("PrivateIpAddress")
+ private_ip_addresses = self._get_multi_param("PrivateIpAddresses")
+ ipv6_addresses = self._get_multi_param("Ipv6Addresses")
+ ipv6_address_count = self._get_int_param("Ipv6AddressCount", 0)
+ secondary_ips_count = self._get_param("SecondaryPrivateIpAddressCount")
+ groups = self._get_multi_param("SecurityGroupId")
+ subnet = self.ec2_backend.get_subnet(subnet_id)
+ description = self._get_param("Description")
+ tags = self._get_multi_param("TagSpecification")
+ tags = add_tag_specification(tags)
+
+ if self.is_not_dryrun("CreateNetworkInterface"):
+ eni = self.ec2_backend.create_network_interface(
+ subnet,
+ private_ip_address,
+ private_ip_addresses,
+ groups,
+ description,
+ tags,
+ secondary_ips_count=secondary_ips_count,
+ ipv6_addresses=ipv6_addresses,
+ ipv6_address_count=ipv6_address_count,
+ )
+ template = self.response_template(CREATE_NETWORK_INTERFACE_RESPONSE)
+ return template.render(eni=eni)
+
+ def delete_network_interface(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ if self.is_not_dryrun("DeleteNetworkInterface"):
+ self.ec2_backend.delete_network_interface(eni_id)
+ template = self.response_template(DELETE_NETWORK_INTERFACE_RESPONSE)
+ return template.render()
+
+ def describe_network_interface_attribute(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ attribute = self._get_param("Attribute")
+ if self.is_not_dryrun("DescribeNetworkInterfaceAttribute"):
+ eni = self.ec2_backend.get_all_network_interfaces([eni_id])[0]
+
+ if attribute == "description":
+ template = self.response_template(
+ DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_DESCRIPTION
+ )
+ elif attribute == "groupSet":
+ template = self.response_template(
+ DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_GROUPSET
+ )
+ elif attribute == "sourceDestCheck":
+ template = self.response_template(
+ DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_SOURCEDESTCHECK
+ )
+ elif attribute == "attachment":
+ template = self.response_template(
+ DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_ATTACHMENT
+ )
+ else:
+ raise InvalidParameterValueErrorUnknownAttribute(attribute)
+ return template.render(eni=eni)
+
+ def describe_network_interfaces(self):
+ eni_ids = self._get_multi_param("NetworkInterfaceId")
+ filters = self._filters_from_querystring()
+ if self.is_not_dryrun("DescribeNetworkInterfaces"):
+ enis = self.ec2_backend.get_all_network_interfaces(eni_ids, filters)
+ template = self.response_template(DESCRIBE_NETWORK_INTERFACES_RESPONSE)
+ return template.render(enis=enis)
+
+ def attach_network_interface(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ instance_id = self._get_param("InstanceId")
+ device_index = self._get_param("DeviceIndex")
+ if self.is_not_dryrun("AttachNetworkInterface"):
+ attachment_id = self.ec2_backend.attach_network_interface(
+ eni_id, instance_id, device_index
+ )
+ template = self.response_template(ATTACH_NETWORK_INTERFACE_RESPONSE)
+ return template.render(attachment_id=attachment_id)
+
+ def detach_network_interface(self):
+ attachment_id = self._get_param("AttachmentId")
+ if self.is_not_dryrun("DetachNetworkInterface"):
+ self.ec2_backend.detach_network_interface(attachment_id)
+ template = self.response_template(DETACH_NETWORK_INTERFACE_RESPONSE)
+ return template.render()
+
+ def modify_network_interface_attribute(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ group_ids = self._get_multi_param("SecurityGroupId")
+ source_dest_check = get_attribute_value("SourceDestCheck", self.querystring)
+ description = get_attribute_value("Description", self.querystring)
+ if self.is_not_dryrun("ModifyNetworkInterface"):
+ self.ec2_backend.modify_network_interface_attribute(
+ eni_id, group_ids, source_dest_check, description
+ )
+ return MODIFY_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE
+
+ def reset_network_interface_attribute(self):
+ if self.is_not_dryrun("ResetNetworkInterface"):
+ raise NotImplementedError(
+ "ElasticNetworkInterfaces(AmazonVPC).reset_network_interface_attribute is not yet implemented"
+ )
+
+ def assign_private_ip_addresses(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ secondary_ips_count = self._get_int_param("SecondaryPrivateIpAddressCount", 0)
+ eni = self.ec2_backend.assign_private_ip_addresses(eni_id, secondary_ips_count)
+ template = self.response_template(ASSIGN_PRIVATE_IP_ADDRESSES)
+ return template.render(eni=eni)
+
+ def unassign_private_ip_addresses(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ private_ip_address = self._get_multi_param("PrivateIpAddress")
+ eni = self.ec2_backend.unassign_private_ip_addresses(eni_id, private_ip_address)
+ template = self.response_template(UNASSIGN_PRIVATE_IP_ADDRESSES)
+ return template.render(eni=eni)
+
+ def assign_ipv6_addresses(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ ipv6_count = self._get_int_param("Ipv6AddressCount", 0)
+ ipv6_addresses = self._get_multi_param("Ipv6Addresses")
+ eni = self.ec2_backend.assign_ipv6_addresses(eni_id, ipv6_addresses, ipv6_count)
+ template = self.response_template(ASSIGN_IPV6_ADDRESSES)
+ return template.render(eni=eni)
+
+ def unassign_ipv6_addresses(self):
+ eni_id = self._get_param("NetworkInterfaceId")
+ ips = self._get_multi_param("Ipv6Addresses")
+ eni, unassigned_ips = self.ec2_backend.unassign_ipv6_addresses(eni_id, ips)
+ template = self.response_template(UNASSIGN_IPV6_ADDRESSES)
+ return template.render(eni=eni, unassigned_ips=unassigned_ips)
+
+
+ASSIGN_PRIVATE_IP_ADDRESSES = """<AssignPrivateIpAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>3fb591ba-558c-48f8-ae6b-c2f9d6d06425</requestId>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <assignedPrivateIpAddressesSet>
+ {% for address in eni.private_ip_addresses %}
+ <item>
+ <privateIpAddress>{{ address.PrivateIpAddress }}</privateIpAddress>
+ </item>
+ {% endfor %}
+ </assignedPrivateIpAddressesSet>
+ <return>true</return>
+</AssignPrivateIpAddressesResponse>"""
+
+
+UNASSIGN_PRIVATE_IP_ADDRESSES = """<UnAssignPrivateIpAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>3fb591ba-558c-48f8-ae6b-c2f9d6d06425</requestId>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <assignedPrivateIpAddressesSet>
+ {% for address in eni.private_ip_addresses %}
+ <item>
+ <privateIpAddress>{{ address.PrivateIpAddress }}</privateIpAddress>
+ </item>
+ {% endfor %}
+ </assignedPrivateIpAddressesSet>
+ <return>true</return>
+</UnAssignPrivateIpAddressesResponse>"""
+
+
+ASSIGN_IPV6_ADDRESSES = """<AssignIpv6AddressesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c36d17eb-a0ba-4d38-8727-example</requestId>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <assignedIpv6Addresses>
+ {% for address in eni.ipv6_addresses %}
+ <item>{{address}}</item>
+ {% endfor %}
+ </assignedIpv6Addresses>
+</AssignIpv6AddressesResponse>
+"""
+
+UNASSIGN_IPV6_ADDRESSES = """<UnassignIpv6AddressesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>94d446d7-fc8e-4918-94f9-example</requestId>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <unassignedIpv6Addresses>
+ {% for address in unassigned_ips %}
+ <item>{{address}}</item>
+ {% endfor %}
+ </unassignedIpv6Addresses>
+</UnassignIpv6AddressesResponse>"""
+
+
+CREATE_NETWORK_INTERFACE_RESPONSE = """
+<CreateNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>2c6021ec-d705-445a-9780-420d0c7ab793</requestId>
+ <networkInterface>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <subnetId>{{ eni.subnet.id }}</subnetId>
+ <vpcId>{{ eni.subnet.vpc_id }}</vpcId>
+ <availabilityZone>{{ eni.subnet.availability_zone }}</availabilityZone>
+ {% if eni.description %}
+ <description>{{ eni.description }}</description>
+ {% endif %}
+ <ownerId>{{ eni.owner_id }}</ownerId>
+ <requesterId>AIDARCSPW2WNREUEN7XFM</requesterId>
+ <requesterManaged>False</requesterManaged>
+ <status>{{ eni.status }}</status>
+ <macAddress>{{ eni.mac_address }}</macAddress>
+ {% if eni.private_ip_address %}
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ {% endif %}
+ {% if eni.private_dns_name %}
+ <privateDnsName>{{ eni.private_dns_name }}</privateDnsName>
+ {% endif %}
+ <sourceDestCheck>{{ "true" if eni.source_dest_check == True else "false" }}</sourceDestCheck>
+ <groupSet>
+ {% for group in eni.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if eni.association %}
+ <association>
+ <publicIp>{{ eni.public_ip }}</publicIp>
+ <ipOwnerId>{{ eni.owner_id }}</ipOwnerId>
+ <allocationId>{{ eni.association.allocationId }}</allocationId>
+ <associationId>{{ eni.association.associationId }}</associationId>
+ <natEnabled>true</natEnabled>
+ </association>
+ {% endif %}
+ <tagSet>
+ {% for tag in eni.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <privateIpAddressesSet>
+ {% for address in eni.private_ip_addresses %}
+ <item>
+ <privateIpAddress>{{ address.PrivateIpAddress }}</privateIpAddress>
+ {% if address.privateDnsName %}
+ <privateDnsName>{{ address.PrivateDnsName }}</privateDnsName>
+ {% endif %}
+ <primary>{{ "true" if address.Primary == True else "false" }}</primary>
+ </item>
+ {% endfor %}
+ </privateIpAddressesSet>
+ <ipv6AddressesSet>
+ {% for address in eni.ipv6_addresses %}
+ <item>
+ <ipv6Address>{{address}}</ipv6Address>
+ </item>
+ {% endfor %}
+ </ipv6AddressesSet>
+ <interfaceType>{{ eni.interface_type }}</interfaceType>
+ </networkInterface>
+</CreateNetworkInterfaceResponse>
+"""
+
+DESCRIBE_NETWORK_INTERFACES_RESPONSE = """<DescribeNetworkInterfacesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>ddb0aaf1-8b65-4f0a-94fa-654b18b8a204</requestId>
+ <networkInterfaceSet>
+ {% for eni in enis %}
+ <item>
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <subnetId>{{ eni.subnet.id }}</subnetId>
+ <vpcId>{{ eni.subnet.vpc_id }}</vpcId>
+ <availabilityZone>{{ eni.subnet.availability_zone }}</availabilityZone>
+ {% if eni.description %}
+ <description>{{ eni.description }}</description>
+ {% endif %}
+ <ownerId>{{ eni.owner_id }}</ownerId>
+ <requesterId>AIDARCSPW2WNREUEN7XFM</requesterId>
+ <requesterManaged>False</requesterManaged>
+ <status>{{ eni.status }}</status>
+ <macAddress>{{ eni.mac_address }}</macAddress>
+ {% if eni.private_ip_address %}
+ <privateIpAddress>{{ eni.private_ip_address }}</privateIpAddress>
+ {% endif %}
+ {% if eni.private_dns_name %}
+ <privateDnsName>{{ eni.private_dns_name }}</privateDnsName>
+ {% endif %}
+ <sourceDestCheck>{{ "true" if eni.source_dest_check == True else "false" }}</sourceDestCheck>
+ <groupSet>
+ {% for group in eni.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if eni.association %}
+ <association>
+ <publicIp>{{ eni.public_ip }}</publicIp>
+ <ipOwnerId>{{ eni.owner_id }}</ipOwnerId>
+ <allocationId>{{ eni.association.allocationId }}</allocationId>
+ <associationId>{{ eni.association.associationId }}</associationId>
+ <natEnabled>true</natEnabled>
+ </association>
+ {% endif %}
+ {% if eni.attachment_id %}
+ <attachment>
+ <attachTime>{{ eni.attach_time }}</attachTime>
+ <attachmentId>{{ eni.attachment_id }}</attachmentId>
+ <deleteOnTermination>{{ eni.delete_on_termination }}</deleteOnTermination>
+ <deviceIndex>{{ eni.device_index }}</deviceIndex>
+ <networkCardIndex>0</networkCardIndex>
+ <instanceId>{{ eni.instance.id }}</instanceId>
+ <instanceOwnerId>{{ eni.instance.owner_id }}</instanceOwnerId>
+ <status>attached</status>
+ </attachment>
+ {% endif %}
+ <tagSet>
+ {% for tag in eni.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <privateIpAddressesSet>
+ {% for address in eni.private_ip_addresses %}
+ <item>
+ <privateIpAddress>{{ address.PrivateIpAddress }}</privateIpAddress>
+ {% if address.privateDnsName %}
+ <privateDnsName>{{ address.PrivateDnsName }}</privateDnsName>
+ {% endif %}
+ <primary>{{ "true" if address.Primary == True else "false" }}</primary>
+ </item>
+ {% endfor %}
+ </privateIpAddressesSet>
+ <ipv6AddressesSet>
+ {% for address in eni.ipv6_addresses %}
+ <item>
+ <ipv6Address>{{address}}</ipv6Address>
+ </item>
+ {% endfor %}
+ </ipv6AddressesSet>
+ <interfaceType>{{ eni.interface_type }}</interfaceType>
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+</DescribeNetworkInterfacesResponse>"""
+
+ATTACH_NETWORK_INTERFACE_RESPONSE = """<AttachNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <attachmentId>{{ attachment_id }}</attachmentId>
+</AttachNetworkInterfaceResponse>"""
+
+DETACH_NETWORK_INTERFACE_RESPONSE = """<DetachNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DetachNetworkInterfaceResponse>"""
+
+MODIFY_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE = """<ModifyNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ModifyNetworkInterfaceAttributeResponse>"""
+
+DELETE_NETWORK_INTERFACE_RESPONSE = """
+<DeleteNetworkInterfaceResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>34b5b3b4-d0c5-49b9-b5e2-a468ef6adcd8</requestId>
+ <return>true</return>
+</DeleteNetworkInterfaceResponse>"""
+
+DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_DESCRIPTION = """
+<DescribeNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <description>
+ <value>{{ eni.description }}</value>
+ </description>
+</DescribeNetworkInterfaceAttributeResponse>"""
+
+DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_GROUPSET = """
+<DescribeNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <groupSet>
+ {% for group in eni.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+</DescribeNetworkInterfaceAttributeResponse>"""
+
+DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_SOURCEDESTCHECK = """
+<DescribeNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ <sourceDestCheck>
+ <value>{{ "true" if eni.source_dest_check == True else "false" }}</value>
+ </sourceDestCheck>
+</DescribeNetworkInterfaceAttributeResponse>"""
+
+DESCRIBE_NETWORK_INTERFACE_ATTRIBUTE_RESPONSE_ATTACHMENT = """
+<DescribeNetworkInterfaceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <networkInterfaceId>{{ eni.id }}</networkInterfaceId>
+ {% if eni.attachment_id %}
+ <attachment>
+ <attachTime>{{ eni.attach_time }}</attachTime>
+ <attachmentId>{{ eni.attachment_id }}</attachmentId>
+ <deleteOnTermination>{{ eni.delete_on_termination }}</deleteOnTermination>
+ <deviceIndex>{{ eni.device_index }}</deviceIndex>
+ <networkCardIndex>0</networkCardIndex>
+ <instanceId>{{ eni.instance.id }}</instanceId>
+ <instanceOwnerId>{{ eni.instance.owner_id }}</instanceOwnerId>
+ <status>attached</status>
+ </attachment>
+ {% endif %}
+</DescribeNetworkInterfaceAttributeResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/flow_logs.py b/contrib/python/moto/py3/moto/ec2/responses/flow_logs.py
new file mode 100644
index 0000000000..58445ac769
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/flow_logs.py
@@ -0,0 +1,120 @@
+from moto.ec2.models import validate_resource_ids
+from ._base_response import EC2BaseResponse
+
+
+class FlowLogs(EC2BaseResponse):
+ def create_flow_logs(self):
+ resource_type = self._get_param("ResourceType")
+ resource_ids = self._get_multi_param("ResourceId")
+ traffic_type = self._get_param("TrafficType")
+ deliver_logs_permission_arn = self._get_param("DeliverLogsPermissionArn")
+ log_destination_type = self._get_param("LogDestinationType")
+ log_destination = self._get_param("LogDestination")
+ log_group_name = self._get_param("LogGroupName")
+ log_format = self._get_param("LogFormat")
+ max_aggregation_interval = self._get_param("MaxAggregationInterval")
+ validate_resource_ids(resource_ids)
+
+ tags = self._parse_tag_specification()
+ tags = tags.get("vpc-flow-log", {})
+ if self.is_not_dryrun("CreateFlowLogs"):
+ flow_logs, errors = self.ec2_backend.create_flow_logs(
+ resource_type=resource_type,
+ resource_ids=resource_ids,
+ traffic_type=traffic_type,
+ deliver_logs_permission_arn=deliver_logs_permission_arn,
+ log_destination_type=log_destination_type,
+ log_destination=log_destination,
+ log_group_name=log_group_name,
+ log_format=log_format,
+ max_aggregation_interval=max_aggregation_interval,
+ )
+ for fl in flow_logs:
+ fl.add_tags(tags)
+ template = self.response_template(CREATE_FLOW_LOGS_RESPONSE)
+ return template.render(flow_logs=flow_logs, errors=errors)
+
+ def describe_flow_logs(self):
+ flow_log_ids = self._get_multi_param("FlowLogId")
+ filters = self._filters_from_querystring()
+ flow_logs = self.ec2_backend.describe_flow_logs(flow_log_ids, filters)
+ if self.is_not_dryrun("DescribeFlowLogs"):
+ template = self.response_template(DESCRIBE_FLOW_LOGS_RESPONSE)
+ return template.render(flow_logs=flow_logs)
+
+ def delete_flow_logs(self):
+ flow_log_ids = self._get_multi_param("FlowLogId")
+ self.ec2_backend.delete_flow_logs(flow_log_ids)
+ if self.is_not_dryrun("DeleteFlowLogs"):
+ template = self.response_template(DELETE_FLOW_LOGS_RESPONSE)
+ return template.render()
+
+
+CREATE_FLOW_LOGS_RESPONSE = """
+<CreateFlowLogsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>2d96dae3-504b-4fc4-bf50-266EXAMPLE</requestId>
+ <unsuccessful>
+ {% for error in errors %}
+ <item>
+ <error>
+ <code>{{ error.1 }}</code>
+ <message>{{ error.2 }}</message>
+ </error>
+ <resourceId>{{ error.0 }}</resourceId>
+ </item>
+ {% endfor %}
+ </unsuccessful>
+ <flowLogIdSet>
+ {% for flow_log in flow_logs %}
+ <item>{{ flow_log.id }}</item>
+ {% endfor %}
+ </flowLogIdSet>
+</CreateFlowLogsResponse>"""
+
+DELETE_FLOW_LOGS_RESPONSE = """
+<DeleteFlowLogsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c5c4f51f-f4e9-42bc-8700-EXAMPLE</requestId>
+ <unsuccessful/>
+</DeleteFlowLogsResponse>"""
+
+DESCRIBE_FLOW_LOGS_RESPONSE = """
+<DescribeFlowLogsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>3cb46f23-099e-4bf0-891c-EXAMPLE</requestId>
+ <flowLogSet>
+ {% for flow_log in flow_logs %}
+ <item>
+ {% if flow_log.log_destination is not none %}
+ <logDestination>{{ flow_log.log_destination }}</logDestination>
+ {% endif %}
+ <resourceId>{{ flow_log.resource_id }}</resourceId>
+ <logDestinationType>{{ flow_log.log_destination_type }}</logDestinationType>
+ <creationTime>{{ flow_log.created_at }}</creationTime>
+ <trafficType>{{ flow_log.traffic_type }}</trafficType>
+ <deliverLogsStatus>{{ flow_log.deliver_logs_status }}</deliverLogsStatus>
+ {% if flow_log.deliver_logs_error_message is not none %}
+ <deliverLogsErrorMessage>{{ flow_log.deliver_logs_error_message }}</deliverLogsErrorMessage>
+ {% endif %}
+ <logFormat>{{ flow_log.log_format }}</logFormat>
+ <flowLogStatus>ACTIVE</flowLogStatus>
+ <flowLogId>{{ flow_log.id }}</flowLogId>
+ <maxAggregationInterval>{{ flow_log.max_aggregation_interval }}</maxAggregationInterval>
+ {% if flow_log.deliver_logs_permission_arn is not none %}
+ <deliverLogsPermissionArn>{{ flow_log.deliver_logs_permission_arn }}</deliverLogsPermissionArn>
+ {% endif %}
+ {% if flow_log.log_group_name is not none %}
+ <logGroupName>{{ flow_log.log_group_name }}</logGroupName>
+ {% endif %}
+ {% if flow_log.get_tags() %}
+ <tagSet>
+ {% for tag in flow_log.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </flowLogSet>
+</DescribeFlowLogsResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/general.py b/contrib/python/moto/py3/moto/ec2/responses/general.py
new file mode 100644
index 0000000000..d452a09890
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/general.py
@@ -0,0 +1,30 @@
+from moto.core.responses import BaseResponse
+
+
+class General(BaseResponse):
+ def get_console_output(self):
+ instance_id = self._get_param("InstanceId")
+ if not instance_id:
+ # For compatibility with boto.
+ # See: https://github.com/spulec/moto/pull/1152#issuecomment-332487599
+ instance_id = self._get_multi_param("InstanceId")[0]
+
+ instance = self.ec2_backend.get_instance(instance_id)
+ template = self.response_template(GET_CONSOLE_OUTPUT_RESULT)
+ return template.render(instance=instance)
+
+
+GET_CONSOLE_OUTPUT_RESULT = """
+<GetConsoleOutputResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <timestamp>2010-10-14T01:12:41.000Z</timestamp>
+ <output>TGludXggdmVyc2lvbiAyLjYuMTYteGVuVSAoYnVpbGRlckBwYXRjaGJhdC5hbWF6b25zYSkgKGdj
+YyB2ZXJzaW9uIDQuMC4xIDIwMDUwNzI3IChSZWQgSGF0IDQuMC4xLTUpKSAjMSBTTVAgVGh1IE9j
+dCAyNiAwODo0MToyNiBTQVNUIDIwMDYKQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgpY
+ZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDZhNDAwMDAwICh1c2FibGUpCjk4ME1CIEhJ
+R0hNRU0gYXZhaWxhYmxlLgo3MjdNQiBMT1dNRU0gYXZhaWxhYmxlLgpOWCAoRXhlY3V0ZSBEaXNh
+YmxlKSBwcm90ZWN0aW9uOiBhY3RpdmUKSVJRIGxvY2t1cCBkZXRlY3Rpb24gZGlzYWJsZWQKQnVp
+bHQgMSB6b25lbGlzdHMKS2VybmVsIGNvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTEgcm8gNApF
+bmFibGluZyBmYXN0IEZQVSBzYXZlIGFuZCByZXN0b3JlLi4uIGRvbmUuCg==</output>
+</GetConsoleOutputResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/iam_instance_profiles.py b/contrib/python/moto/py3/moto/ec2/responses/iam_instance_profiles.py
new file mode 100644
index 0000000000..0d4f2f50c8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/iam_instance_profiles.py
@@ -0,0 +1,88 @@
+from moto.core.responses import BaseResponse
+
+
+class IamInstanceProfiles(BaseResponse):
+ def associate_iam_instance_profile(self):
+ instance_id = self._get_param("InstanceId")
+ iam_instance_profile_name = self._get_param("IamInstanceProfile.Name")
+ iam_instance_profile_arn = self._get_param("IamInstanceProfile.Arn")
+ iam_association = self.ec2_backend.associate_iam_instance_profile(
+ instance_id, iam_instance_profile_name, iam_instance_profile_arn
+ )
+ template = self.response_template(IAM_INSTANCE_PROFILE_RESPONSE)
+ return template.render(iam_association=iam_association, state="associating")
+
+ def describe_iam_instance_profile_associations(self):
+ association_ids = self._get_multi_param("AssociationId")
+ filters = self._get_object_map("Filter")
+ max_items = self._get_param("MaxItems")
+ next_token = self._get_param("NextToken")
+ (
+ iam_associations,
+ next_token,
+ ) = self.ec2_backend.describe_iam_instance_profile_associations(
+ association_ids, filters, max_items, next_token
+ )
+ template = self.response_template(DESCRIBE_IAM_INSTANCE_PROFILE_RESPONSE)
+ return template.render(iam_associations=iam_associations, next_token=next_token)
+
+ def disassociate_iam_instance_profile(self):
+ association_id = self._get_param("AssociationId")
+ iam_association = self.ec2_backend.disassociate_iam_instance_profile(
+ association_id
+ )
+ template = self.response_template(IAM_INSTANCE_PROFILE_RESPONSE)
+ return template.render(iam_association=iam_association, state="disassociating")
+
+ def replace_iam_instance_profile_association(self):
+ association_id = self._get_param("AssociationId")
+ iam_instance_profile_name = self._get_param("IamInstanceProfile.Name")
+ iam_instance_profile_arn = self._get_param("IamInstanceProfile.Arn")
+ iam_association = self.ec2_backend.replace_iam_instance_profile_association(
+ association_id, iam_instance_profile_name, iam_instance_profile_arn
+ )
+ template = self.response_template(IAM_INSTANCE_PROFILE_RESPONSE)
+ return template.render(iam_association=iam_association, state="associating")
+
+
+# https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html
+IAM_INSTANCE_PROFILE_RESPONSE = """
+<AssociateIamInstanceProfileResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>e10deeaf-7cda-48e7-950b-example</requestId>
+ <iamInstanceProfileAssociation>
+ <associationId>{{ iam_association.id }}</associationId>
+ {% if iam_association.iam_instance_profile %}
+ <iamInstanceProfile>
+ <arn>{{ iam_association.iam_instance_profile.arn }}</arn>
+ <id>{{ iam_association.iam_instance_profile.id }}</id>
+ </iamInstanceProfile>
+ {% endif %}
+ <instanceId>{{ iam_association.instance.id }}</instanceId>
+ <state>{{ state }}</state>
+ </iamInstanceProfileAssociation>
+</AssociateIamInstanceProfileResponse>
+"""
+
+
+# https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html
+# Note: this API description page contains an error! Provided `iamInstanceProfileAssociations` doesn't work, you
+# should use `iamInstanceProfileAssociationSet` instead.
+DESCRIBE_IAM_INSTANCE_PROFILE_RESPONSE = """
+<DescribeIamInstanceProfileAssociationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>84c2d2a6-12dc-491f-a9ee-example</requestId>
+ {% if next_token %}<nextToken>{{ next_token }}</nextToken>{% endif %}
+ <iamInstanceProfileAssociationSet>
+ {% for iam_association in iam_associations %}
+ <item>
+ <associationId>{{ iam_association.id }}</associationId>
+ <iamInstanceProfile>
+ <arn>{{ iam_association.iam_instance_profile.arn }}</arn>
+ <id>{{ iam_association.iam_instance_profile.id }}</id>
+ </iamInstanceProfile>
+ <instanceId>{{ iam_association.instance.id }}</instanceId>
+ <state>{{ iam_association.state }}</state>
+ </item>
+ {% endfor %}
+ </iamInstanceProfileAssociationSet>
+</DescribeIamInstanceProfileAssociationsResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/instances.py b/contrib/python/moto/py3/moto/ec2/responses/instances.py
new file mode 100644
index 0000000000..7f3a3d2cb5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/instances.py
@@ -0,0 +1,930 @@
+from moto.core.utils import camelcase_to_underscores
+from moto.ec2.exceptions import (
+ MissingParameterError,
+ InvalidParameterCombination,
+ InvalidRequest,
+)
+from moto.core import get_account_id
+
+from copy import deepcopy
+
+from ._base_response import EC2BaseResponse
+
+
+class InstanceResponse(EC2BaseResponse):
+ def describe_instances(self):
+ self.error_on_dryrun()
+ filter_dict = self._filters_from_querystring()
+ instance_ids = self._get_multi_param("InstanceId")
+ token = self._get_param("NextToken")
+ if instance_ids:
+ reservations = self.ec2_backend.get_reservations_by_instance_ids(
+ instance_ids, filters=filter_dict
+ )
+ else:
+ reservations = self.ec2_backend.describe_instances(filters=filter_dict)
+
+ reservation_ids = [reservation.id for reservation in reservations]
+ if token:
+ start = reservation_ids.index(token) + 1
+ else:
+ start = 0
+ max_results = int(self._get_param("MaxResults", 100))
+ reservations_resp = reservations[start : start + max_results]
+ next_token = None
+ if max_results and len(reservations) > (start + max_results):
+ next_token = reservations_resp[-1].id
+ template = self.response_template(EC2_DESCRIBE_INSTANCES)
+ return (
+ template.render(reservations=reservations_resp, next_token=next_token)
+ .replace("True", "true")
+ .replace("False", "false")
+ )
+
+ def run_instances(self):
+ min_count = int(self._get_param("MinCount", if_none="1"))
+ image_id = self._get_param("ImageId")
+ owner_id = self._get_param("OwnerId")
+ user_data = self._get_param("UserData")
+ security_group_names = self._get_multi_param("SecurityGroup")
+ kwargs = {
+ "instance_type": self._get_param("InstanceType", if_none="m1.small"),
+ "is_instance_type_default": not self._get_param("InstanceType"),
+ "placement": self._get_param("Placement.AvailabilityZone"),
+ "region_name": self.region,
+ "subnet_id": self._get_param("SubnetId"),
+ "owner_id": owner_id,
+ "key_name": self._get_param("KeyName"),
+ "security_group_ids": self._get_multi_param("SecurityGroupId"),
+ "nics": self._get_multi_param("NetworkInterface."),
+ "private_ip": self._get_param("PrivateIpAddress"),
+ "associate_public_ip": self._get_param("AssociatePublicIpAddress"),
+ "tags": self._parse_tag_specification(),
+ "ebs_optimized": self._get_param("EbsOptimized") or False,
+ "instance_market_options": self._get_param(
+ "InstanceMarketOptions.MarketType"
+ )
+ or {},
+ "instance_initiated_shutdown_behavior": self._get_param(
+ "InstanceInitiatedShutdownBehavior"
+ ),
+ "launch_template": self._get_multi_param_dict("LaunchTemplate"),
+ }
+ if len(kwargs["nics"]) and kwargs["subnet_id"]:
+ raise InvalidParameterCombination(
+ msg="Network interfaces and an instance-level subnet ID may not be specified on the same request"
+ )
+
+ mappings = self._parse_block_device_mapping()
+ if mappings:
+ kwargs["block_device_mappings"] = mappings
+
+ if self.is_not_dryrun("RunInstance"):
+ new_reservation = self.ec2_backend.add_instances(
+ image_id, min_count, user_data, security_group_names, **kwargs
+ )
+
+ template = self.response_template(EC2_RUN_INSTANCES)
+ return template.render(reservation=new_reservation)
+
+ def terminate_instances(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ if self.is_not_dryrun("TerminateInstance"):
+ instances = self.ec2_backend.terminate_instances(instance_ids)
+ from moto.autoscaling import autoscaling_backends
+ from moto.elbv2 import elbv2_backends
+
+ autoscaling_backends[self.region].notify_terminate_instances(instance_ids)
+ elbv2_backends[self.region].notify_terminate_instances(instance_ids)
+ template = self.response_template(EC2_TERMINATE_INSTANCES)
+ return template.render(instances=instances)
+
+ def reboot_instances(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ if self.is_not_dryrun("RebootInstance"):
+ instances = self.ec2_backend.reboot_instances(instance_ids)
+ template = self.response_template(EC2_REBOOT_INSTANCES)
+ return template.render(instances=instances)
+
+ def stop_instances(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ if self.is_not_dryrun("StopInstance"):
+ instances = self.ec2_backend.stop_instances(instance_ids)
+ template = self.response_template(EC2_STOP_INSTANCES)
+ return template.render(instances=instances)
+
+ def start_instances(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ if self.is_not_dryrun("StartInstance"):
+ instances = self.ec2_backend.start_instances(instance_ids)
+ template = self.response_template(EC2_START_INSTANCES)
+ return template.render(instances=instances)
+
+ def _get_list_of_dict_params(self, param_prefix, _dct):
+ """
+ Simplified version of _get_dict_param
+ Allows you to pass in a custom dict instead of using self.querystring by default
+ """
+ params = []
+ for key, value in _dct.items():
+ if key.startswith(param_prefix):
+ params.append(value)
+ return params
+
+ def describe_instance_status(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ include_all_instances = self._get_param("IncludeAllInstances") == "true"
+ filters = self._get_list_prefix("Filter")
+ filters = [
+ {"name": f["name"], "values": self._get_list_of_dict_params("value.", f)}
+ for f in filters
+ ]
+
+ instances = self.ec2_backend.describe_instance_status(
+ instance_ids, include_all_instances, filters
+ )
+
+ template = self.response_template(EC2_INSTANCE_STATUS)
+ return template.render(instances=instances)
+
+ def describe_instance_types(self):
+ instance_type_filters = self._get_multi_param("InstanceType")
+ instance_types = self.ec2_backend.describe_instance_types(instance_type_filters)
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_TYPES)
+ return template.render(instance_types=instance_types)
+
+ def describe_instance_type_offerings(self):
+ location_type_filters = self._get_param("LocationType")
+ filter_dict = self._filters_from_querystring()
+ offerings = self.ec2_backend.describe_instance_type_offerings(
+ location_type_filters, filter_dict
+ )
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_TYPE_OFFERINGS)
+ return template.render(instance_type_offerings=offerings)
+
+ def describe_instance_attribute(self):
+ # TODO this and modify below should raise IncorrectInstanceState if
+ # instance not in stopped state
+ attribute = self._get_param("Attribute")
+ instance_id = self._get_param("InstanceId")
+ instance, value = self.ec2_backend.describe_instance_attribute(
+ instance_id, attribute
+ )
+
+ if attribute == "groupSet":
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_GROUPSET_ATTRIBUTE)
+ else:
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_ATTRIBUTE)
+
+ return template.render(instance=instance, attribute=attribute, value=value)
+
+ def describe_instance_credit_specifications(self):
+ instance_ids = self._get_multi_param("InstanceId")
+ instance = self.ec2_backend.describe_instance_credit_specifications(
+ instance_ids
+ )
+ template = self.response_template(EC2_DESCRIBE_INSTANCE_CREDIT_SPECIFICATIONS)
+ return template.render(instances=instance)
+
+ def modify_instance_attribute(self):
+ handlers = [
+ self._attribute_value_handler,
+ self._dot_value_instance_attribute_handler,
+ self._block_device_mapping_handler,
+ self._security_grp_instance_attribute_handler,
+ ]
+
+ for handler in handlers:
+ success = handler()
+ if success:
+ return success
+
+ msg = (
+ "This specific call to ModifyInstanceAttribute has not been"
+ " implemented in Moto yet. Feel free to open an issue at"
+ " https://github.com/spulec/moto/issues"
+ )
+ raise NotImplementedError(msg)
+
+ def _block_device_mapping_handler(self):
+ """
+ Handles requests which are generated by code similar to:
+
+ instance.modify_attribute(
+ BlockDeviceMappings=[{
+ 'DeviceName': '/dev/sda1',
+ 'Ebs': {'DeleteOnTermination': True}
+ }]
+ )
+
+ The querystring contains information similar to:
+
+ BlockDeviceMapping.1.Ebs.DeleteOnTermination : ['true']
+ BlockDeviceMapping.1.DeviceName : ['/dev/sda1']
+
+ For now we only support the "BlockDeviceMapping.1.Ebs.DeleteOnTermination"
+ configuration, but it should be trivial to add anything else.
+ """
+ mapping_counter = 1
+ mapping_device_name_fmt = "BlockDeviceMapping.%s.DeviceName"
+ mapping_del_on_term_fmt = "BlockDeviceMapping.%s.Ebs.DeleteOnTermination"
+ while True:
+ mapping_device_name = mapping_device_name_fmt % mapping_counter
+ if mapping_device_name not in self.querystring.keys():
+ break
+
+ mapping_del_on_term = mapping_del_on_term_fmt % mapping_counter
+ del_on_term_value_str = self.querystring[mapping_del_on_term][0]
+ del_on_term_value = True if "true" == del_on_term_value_str else False
+ device_name_value = self.querystring[mapping_device_name][0]
+
+ instance_id = self._get_param("InstanceId")
+ instance = self.ec2_backend.get_instance(instance_id)
+
+ if self.is_not_dryrun("ModifyInstanceAttribute"):
+ block_device_type = instance.block_device_mapping[device_name_value]
+ block_device_type.delete_on_termination = del_on_term_value
+
+ # +1 for the next device
+ mapping_counter += 1
+
+ if mapping_counter > 1:
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _dot_value_instance_attribute_handler(self):
+ attribute_key = None
+ for key, value in self.querystring.items():
+ if ".Value" in key:
+ attribute_key = key
+ break
+
+ if not attribute_key:
+ return
+
+ if self.is_not_dryrun("Modify" + attribute_key.split(".")[0]):
+ value = self.querystring.get(attribute_key)[0]
+ normalized_attribute = camelcase_to_underscores(attribute_key.split(".")[0])
+ instance_id = self._get_param("InstanceId")
+ self.ec2_backend.modify_instance_attribute(
+ instance_id, normalized_attribute, value
+ )
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _attribute_value_handler(self):
+ attribute_key = self._get_param("Attribute")
+
+ if attribute_key is None:
+ return
+
+ if self.is_not_dryrun("ModifyInstanceAttribute"):
+ value = self._get_param("Value")
+ normalized_attribute = camelcase_to_underscores(attribute_key)
+ instance_id = self._get_param("InstanceId")
+ self.ec2_backend.modify_instance_attribute(
+ instance_id, normalized_attribute, value
+ )
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _security_grp_instance_attribute_handler(self):
+ new_security_grp_list = []
+ for key in self.querystring:
+ if "GroupId." in key:
+ new_security_grp_list.append(self.querystring.get(key)[0])
+
+ instance_id = self._get_param("InstanceId")
+ if self.is_not_dryrun("ModifyInstanceSecurityGroups"):
+ self.ec2_backend.modify_instance_security_groups(
+ instance_id, new_security_grp_list
+ )
+ return EC2_MODIFY_INSTANCE_ATTRIBUTE
+
+ def _parse_block_device_mapping(self):
+ device_mappings = self._get_list_prefix("BlockDeviceMapping")
+ mappings = []
+ for device_mapping in device_mappings:
+ self._validate_block_device_mapping(device_mapping)
+ device_template = deepcopy(BLOCK_DEVICE_MAPPING_TEMPLATE)
+ device_template["VirtualName"] = device_mapping.get("virtual_name")
+ device_template["DeviceName"] = device_mapping.get("device_name")
+ device_template["Ebs"]["SnapshotId"] = device_mapping.get(
+ "ebs._snapshot_id"
+ )
+ device_template["Ebs"]["VolumeSize"] = device_mapping.get(
+ "ebs._volume_size"
+ )
+ device_template["Ebs"]["DeleteOnTermination"] = self._convert_to_bool(
+ device_mapping.get("ebs._delete_on_termination", False)
+ )
+ device_template["Ebs"]["VolumeType"] = device_mapping.get(
+ "ebs._volume_type"
+ )
+ device_template["Ebs"]["Iops"] = device_mapping.get("ebs._iops")
+ device_template["Ebs"]["Encrypted"] = self._convert_to_bool(
+ device_mapping.get("ebs._encrypted", False)
+ )
+ device_template["Ebs"]["KmsKeyId"] = device_mapping.get("ebs._kms_key_id")
+ device_template["NoDevice"] = device_mapping.get("no_device")
+ mappings.append(device_template)
+
+ return mappings
+
+ @staticmethod
+ def _validate_block_device_mapping(device_mapping):
+
+ from botocore import __version__ as botocore_version
+
+ if "no_device" in device_mapping:
+ assert isinstance(
+ device_mapping["no_device"], str
+ ), "botocore {} isn't limiting NoDevice to str type anymore, it is type:{}".format(
+ botocore_version, type(device_mapping["no_device"])
+ )
+ if device_mapping["no_device"] == "":
+ # the only legit value it can have is empty string
+ # and none of the other checks here matter if NoDevice
+ # is being used
+ return
+ else:
+ raise InvalidRequest()
+
+ if not any(mapping for mapping in device_mapping if mapping.startswith("ebs.")):
+ raise MissingParameterError("ebs")
+ if (
+ "ebs._volume_size" not in device_mapping
+ and "ebs._snapshot_id" not in device_mapping
+ ):
+ raise MissingParameterError("size or snapshotId")
+
+ @staticmethod
+ def _convert_to_bool(bool_str):
+ if isinstance(bool_str, bool):
+ return bool_str
+
+ if isinstance(bool_str, str):
+ return str(bool_str).lower() == "true"
+
+ return False
+
+
+BLOCK_DEVICE_MAPPING_TEMPLATE = {
+ "VirtualName": None,
+ "DeviceName": None,
+ "NoDevice": None,
+ "Ebs": {
+ "SnapshotId": None,
+ "VolumeSize": None,
+ "DeleteOnTermination": None,
+ "VolumeType": None,
+ "Iops": None,
+ "Encrypted": None,
+ },
+}
+
+EC2_RUN_INSTANCES = (
+ """<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <reservationId>{{ reservation.id }}</reservationId>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <groupSet>
+ <item>
+ <groupId>sg-245f6a01</groupId>
+ <groupName>default</groupName>
+ </item>
+ </groupSet>
+ <instancesSet>
+ {% for instance in reservation.instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <imageId>{{ instance.image_id }}</imageId>
+ <instanceState>
+ <code>0</code>
+ <name>pending</name>
+ </instanceState>
+ <privateDnsName>{{ instance.private_dns }}</privateDnsName>
+ <publicDnsName>{{ instance.public_dns }}</publicDnsName>
+ <dnsName>{{ instance.public_dns }}</dnsName>
+ <reason/>
+ <keyName>{{ instance.key_name }}</keyName>
+ <ebsOptimized>{{ instance.ebs_optimized }}</ebsOptimized>
+ <amiLaunchIndex>{{ instance.ami_launch_index }}</amiLaunchIndex>
+ <instanceType>{{ instance.instance_type }}</instanceType>
+ <launchTime>{{ instance.launch_time }}</launchTime>
+ {% if instance.lifecycle %}
+ <instanceLifecycle>{{ instance.lifecycle }}</instanceLifecycle>
+ {% endif %}
+ <placement>
+ <availabilityZone>{{ instance.placement}}</availabilityZone>
+ <groupName/>
+ <tenancy>default</tenancy>
+ </placement>
+ <monitoring>
+ <state>enabled</state>
+ </monitoring>
+ {% if instance.subnet_id %}
+ <subnetId>{{ instance.subnet_id }}</subnetId>
+ {% elif instance.nics[0].subnet.id %}
+ <subnetId>{{ instance.nics[0].subnet.id }}</subnetId>
+ {% endif %}
+ {% if instance.vpc_id %}
+ <vpcId>{{ instance.vpc_id }}</vpcId>
+ {% elif instance.nics[0].subnet.vpc_id %}
+ <vpcId>{{ instance.nics[0].subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <privateIpAddress>{{ instance.private_ip }}</privateIpAddress>
+ {% if instance.nics[0].public_ip %}
+ <ipAddress>{{ instance.nics[0].public_ip }}</ipAddress>
+ {% endif %}
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in instance.dynamic_group_list %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if instance.platform %}
+ <platform>{{ instance.platform }}</platform>
+ {% endif %}
+ <virtualizationType>{{ instance.virtualization_type }}</virtualizationType>
+ <architecture>{{ instance.architecture }}</architecture>
+ <kernelId>{{ instance.kernel }}</kernelId>
+ <clientToken/>
+ <hypervisor>xen</hypervisor>
+ <ebsOptimized>false</ebsOptimized>
+ <tagSet>
+ {% for tag in instance.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <networkInterfaceSet>
+ {% for nic in instance.nics.values() %}
+ <item>
+ <networkInterfaceId>{{ nic.id }}</networkInterfaceId>
+ {% if nic.subnet %}
+ <subnetId>{{ nic.subnet.id }}</subnetId>
+ <vpcId>{{ nic.subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <description>Primary network interface</description>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <status>in-use</status>
+ <macAddress>1b:2b:3c:4d:5e:6f</macAddress>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in nic.group_set %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <attachment>
+ <attachmentId>{{ nic.attachment_id }}</attachmentId>
+ <deviceIndex>{{ nic.device_index }}</deviceIndex>
+ <status>attached</status>
+ <attachTime>2015-01-01T00:00:00Z</attachTime>
+ <deleteOnTermination>true</deleteOnTermination>
+ </attachment>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>"""
+ + get_account_id()
+ + """</ipOwnerId>
+ </association>
+ {% endif %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <primary>true</primary>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>"""
+ + get_account_id()
+ + """</ipOwnerId>
+ </association>
+ {% endif %}
+ </item>
+ </privateIpAddressesSet>
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+ </item>
+ {% endfor %}
+ </instancesSet>
+ </RunInstancesResponse>"""
+)
+
+EC2_DESCRIBE_INSTANCES = (
+ """<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>fdcdcab1-ae5c-489e-9c33-4637c5dda355</requestId>
+ <reservationSet>
+ {% for reservation in reservations %}
+ <item>
+ <reservationId>{{ reservation.id }}</reservationId>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <groupSet>
+ {% for group in reservation.dynamic_group_list %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <instancesSet>
+ {% for instance in reservation.instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <imageId>{{ instance.image_id }}</imageId>
+ <instanceState>
+ <code>{{ instance._state.code }}</code>
+ <name>{{ instance._state.name }}</name>
+ </instanceState>
+ <privateDnsName>{{ instance.private_dns }}</privateDnsName>
+ <publicDnsName>{{ instance.public_dns }}</publicDnsName>
+ <dnsName>{{ instance.public_dns }}</dnsName>
+ <reason>{{ instance._reason }}</reason>
+ <keyName>{{ instance.key_name }}</keyName>
+ <ebsOptimized>{{ instance.ebs_optimized }}</ebsOptimized>
+ <amiLaunchIndex>{{ instance.ami_launch_index }}</amiLaunchIndex>
+ <productCodes/>
+ <instanceType>{{ instance.instance_type }}</instanceType>
+ <launchTime>{{ instance.launch_time }}</launchTime>
+ {% if instance.lifecycle %}
+ <instanceLifecycle>{{ instance.lifecycle }}</instanceLifecycle>
+ {% endif %}
+ <placement>
+ <availabilityZone>{{ instance.placement }}</availabilityZone>
+ <groupName/>
+ <tenancy>default</tenancy>
+ </placement>
+ {% if instance.platform %}
+ <platform>{{ instance.platform }}</platform>
+ {% endif %}
+ <monitoring>
+ <state>disabled</state>
+ </monitoring>
+ {% if instance.subnet_id %}
+ <subnetId>{{ instance.subnet_id }}</subnetId>
+ {% elif instance.nics[0].subnet.id %}
+ <subnetId>{{ instance.nics[0].subnet.id }}</subnetId>
+ {% endif %}
+ {% if instance.vpc_id %}
+ <vpcId>{{ instance.vpc_id }}</vpcId>
+ {% elif instance.nics[0].subnet.vpc_id %}
+ <vpcId>{{ instance.nics[0].subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <privateIpAddress>{{ instance.private_ip }}</privateIpAddress>
+ {% if instance.nics[0].public_ip %}
+ <ipAddress>{{ instance.nics[0].public_ip }}</ipAddress>
+ {% endif %}
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in instance.dynamic_group_list %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <stateReason>
+ <code>{{ instance._state_reason.code }}</code>
+ <message>{{ instance._state_reason.message }}</message>
+ </stateReason>
+ <architecture>{{ instance.architecture }}</architecture>
+ <kernelId>{{ instance.kernel }}</kernelId>
+ <rootDeviceType>ebs</rootDeviceType>
+ <rootDeviceName>/dev/sda1</rootDeviceName>
+ <blockDeviceMapping>
+ {% for device_name,deviceobject in instance.get_block_device_mapping %}
+ <item>
+ <deviceName>{{ device_name }}</deviceName>
+ <ebs>
+ <volumeId>{{ deviceobject.volume_id }}</volumeId>
+ <status>{{ deviceobject.status }}</status>
+ <attachTime>{{ deviceobject.attach_time }}</attachTime>
+ <deleteOnTermination>{{ deviceobject.delete_on_termination }}</deleteOnTermination>
+ <size>{{deviceobject.size}}</size>
+ </ebs>
+ </item>
+ {% endfor %}
+ </blockDeviceMapping>
+ <virtualizationType>{{ instance.virtualization_type }}</virtualizationType>
+ <clientToken>ABCDE"""
+ + get_account_id()
+ + """3</clientToken>
+ {% if instance.get_tags() %}
+ <tagSet>
+ {% for tag in instance.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ <hypervisor>xen</hypervisor>
+ <networkInterfaceSet>
+ {% for nic in instance.nics.values() %}
+ <item>
+ <networkInterfaceId>{{ nic.id }}</networkInterfaceId>
+ {% if nic.subnet %}
+ <subnetId>{{ nic.subnet.id }}</subnetId>
+ <vpcId>{{ nic.subnet.vpc_id }}</vpcId>
+ {% endif %}
+ <description>Primary network interface</description>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <status>in-use</status>
+ <macAddress>1b:2b:3c:4d:5e:6f</macAddress>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <sourceDestCheck>{{ instance.source_dest_check }}</sourceDestCheck>
+ <groupSet>
+ {% for group in nic.group_set %}
+ <item>
+ {% if group.id %}
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ {% else %}
+ <groupId>{{ group }}</groupId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groupSet>
+ <attachment>
+ <attachmentId>{{ nic.attachment_id }}</attachmentId>
+ <deviceIndex>{{ nic.device_index }}</deviceIndex>
+ <status>attached</status>
+ <attachTime>2015-01-01T00:00:00Z</attachTime>
+ <deleteOnTermination>true</deleteOnTermination>
+ </attachment>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>"""
+ + get_account_id()
+ + """</ipOwnerId>
+ </association>
+ {% endif %}
+ <privateIpAddressesSet>
+ <item>
+ <privateIpAddress>{{ nic.private_ip_address }}</privateIpAddress>
+ <primary>true</primary>
+ {% if nic.public_ip %}
+ <association>
+ <publicIp>{{ nic.public_ip }}</publicIp>
+ <ipOwnerId>"""
+ + get_account_id()
+ + """</ipOwnerId>
+ </association>
+ {% endif %}
+ </item>
+ </privateIpAddressesSet>
+ </item>
+ {% endfor %}
+ </networkInterfaceSet>
+ </item>
+ {% endfor %}
+ </instancesSet>
+ </item>
+ {% endfor %}
+ </reservationSet>
+ {% if next_token %}
+ <nextToken>{{ next_token }}</nextToken>
+ {% endif %}
+</DescribeInstancesResponse>"""
+)
+
+EC2_TERMINATE_INSTANCES = """
+<TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>32</code>
+ <name>shutting-down</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</TerminateInstancesResponse>"""
+
+EC2_STOP_INSTANCES = """
+<StopInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>64</code>
+ <name>stopping</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</StopInstancesResponse>"""
+
+EC2_START_INSTANCES = """
+<StartInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instancesSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <previousState>
+ <code>16</code>
+ <name>running</name>
+ </previousState>
+ <currentState>
+ <code>0</code>
+ <name>pending</name>
+ </currentState>
+ </item>
+ {% endfor %}
+ </instancesSet>
+</StartInstancesResponse>"""
+
+EC2_REBOOT_INSTANCES = """<RebootInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RebootInstancesResponse>"""
+
+EC2_DESCRIBE_INSTANCE_ATTRIBUTE = """<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <{{ attribute }}>
+ {% if value is not none %}
+ <value>{{ value }}</value>
+ {% endif %}
+ </{{ attribute }}>
+</DescribeInstanceAttributeResponse>"""
+
+EC2_DESCRIBE_INSTANCE_CREDIT_SPECIFICATIONS = """<DescribeInstanceCreditSpecificationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>1b234b5c-d6ef-7gh8-90i1-j2345678901</requestId>
+ <instanceCreditSpecificationSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <cpuCredits>standard</cpuCredits>
+ </item>
+ {% endfor %}
+ </instanceCreditSpecificationSet>
+</DescribeInstanceCreditSpecificationsResponse>"""
+
+EC2_DESCRIBE_INSTANCE_GROUPSET_ATTRIBUTE = """<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceId>{{ instance.id }}</instanceId>
+ <{{ attribute }}>
+ {% for sg in value %}
+ <item>
+ <groupId>{{ sg.id }}</groupId>
+ </item>
+ {% endfor %}
+ </{{ attribute }}>
+</DescribeInstanceAttributeResponse>"""
+
+EC2_MODIFY_INSTANCE_ATTRIBUTE = """<ModifyInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ModifyInstanceAttributeResponse>"""
+
+EC2_INSTANCE_STATUS = """<?xml version="1.0" encoding="UTF-8"?>
+<DescribeInstanceStatusResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <instanceStatusSet>
+ {% for instance in instances %}
+ <item>
+ <instanceId>{{ instance.id }}</instanceId>
+ <availabilityZone>{{ instance.placement }}</availabilityZone>
+ <instanceState>
+ <code>{{ instance.state_code }}</code>
+ <name>{{ instance.state }}</name>
+ </instanceState>
+ {% if instance.state_code == 16 %}
+ <systemStatus>
+ <status>ok</status>
+ <details>
+ <item>
+ <name>reachability</name>
+ <status>passed</status>
+ </item>
+ </details>
+ </systemStatus>
+ <instanceStatus>
+ <status>ok</status>
+ <details>
+ <item>
+ <name>reachability</name>
+ <status>passed</status>
+ </item>
+ </details>
+ </instanceStatus>
+ {% else %}
+ <systemStatus>
+ <status>not-applicable</status>
+ </systemStatus>
+ <instanceStatus>
+ <status>not-applicable</status>
+ </instanceStatus>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </instanceStatusSet>
+</DescribeInstanceStatusResponse>"""
+
+EC2_DESCRIBE_INSTANCE_TYPES = """<?xml version="1.0" encoding="UTF-8"?>
+<DescribeInstanceTypesResponse xmlns="http://api.outscale.com/wsdl/fcuext/2014-04-15/">
+ <requestId>f8b86168-d034-4e65-b48d-3b84c78e64af</requestId>
+ <instanceTypeSet>
+ {% for instance_type in instance_types %}
+ <item>
+ <instanceType>{{ instance_type.InstanceType }}</instanceType>
+ <vCpuInfo>
+ <defaultVCpus>{{ instance_type.get('VCpuInfo', {}).get('DefaultVCpus', 0)|int }}</defaultVCpus>
+ <defaultCores>{{ instance_type.get('VCpuInfo', {}).get('DefaultCores', 0)|int }}</defaultCores>
+ <defaultThreadsPerCore>{{ instance_type.get('VCpuInfo').get('DefaultThreadsPerCore', 0)|int }}</defaultThreadsPerCore>
+ </vCpuInfo>
+ <memoryInfo>
+ <sizeInMiB>{{ instance_type.get('MemoryInfo', {}).get('SizeInMiB', 0)|int }}</sizeInMiB>
+ </memoryInfo>
+ <instanceStorageInfo>
+ <totalSizeInGB>{{ instance_type.get('InstanceStorageInfo', {}).get('TotalSizeInGB', 0)|int }}</totalSizeInGB>
+ </instanceStorageInfo>
+ <processorInfo>
+ <supportedArchitectures>
+ {% for arch in instance_type.get('ProcessorInfo', {}).get('SupportedArchitectures', []) %}
+ <item>
+ {{ arch }}
+ </item>
+ {% endfor %}
+ </supportedArchitectures>
+ </processorInfo>
+ {% if instance_type.get('GpuInfo', {})|length > 0 %}
+ <gpuInfo>
+ <gpus>
+ {% for gpu in instance_type.get('GpuInfo').get('Gpus') %}
+ <item>
+ <count>{{ gpu['Count']|int }}</count>
+ <manufacturer>{{ gpu['Manufacturer'] }}</manufacturer>
+ <memoryInfo>
+ <sizeInMiB>{{ gpu['MemoryInfo']['SizeInMiB']|int }}</sizeInMiB>
+ </memoryInfo>
+ <name>{{ gpu['Name'] }}</name>
+ </item>
+ {% endfor %}
+ </gpus>
+ <totalGpuMemoryInMiB>{{ instance_type['GpuInfo']['TotalGpuMemoryInMiB']|int }}</totalGpuMemoryInMiB>
+ </gpuInfo>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </instanceTypeSet>
+</DescribeInstanceTypesResponse>"""
+
+
+EC2_DESCRIBE_INSTANCE_TYPE_OFFERINGS = """<?xml version="1.0" encoding="UTF-8"?>
+<DescribeInstanceTypeOfferingsResponse xmlns="http://api.outscale.com/wsdl/fcuext/2014-04-15/">
+ <requestId>f8b86168-d034-4e65-b48d-3b84c78e64af</requestId>
+ <instanceTypeOfferingSet>
+ {% for offering in instance_type_offerings %}
+ <item>
+ <instanceType>{{ offering.InstanceType }}</instanceType>
+ <location>{{ offering.Location }}</location>
+ <locationType>{{ offering.LocationType }}</locationType>
+ </item>
+ {% endfor %}
+ </instanceTypeOfferingSet>
+</DescribeInstanceTypeOfferingsResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/internet_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/internet_gateways.py
new file mode 100644
index 0000000000..aa773ec4f1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/internet_gateways.py
@@ -0,0 +1,116 @@
+from ._base_response import EC2BaseResponse
+
+
+class InternetGateways(EC2BaseResponse):
+ def attach_internet_gateway(self):
+ igw_id = self._get_param("InternetGatewayId")
+ vpc_id = self._get_param("VpcId")
+ if self.is_not_dryrun("AttachInternetGateway"):
+ self.ec2_backend.attach_internet_gateway(igw_id, vpc_id)
+ template = self.response_template(ATTACH_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+ def create_internet_gateway(self):
+ if self.is_not_dryrun("CreateInternetGateway"):
+ tags = self._get_multi_param(
+ "TagSpecification", skip_result_conversion=True
+ )
+ if tags:
+ tags = tags[0].get("Tag") or []
+ igw = self.ec2_backend.create_internet_gateway(tags=tags)
+ template = self.response_template(CREATE_INTERNET_GATEWAY_RESPONSE)
+ return template.render(internet_gateway=igw)
+
+ def delete_internet_gateway(self):
+ igw_id = self._get_param("InternetGatewayId")
+ if self.is_not_dryrun("DeleteInternetGateway"):
+ self.ec2_backend.delete_internet_gateway(igw_id)
+ template = self.response_template(DELETE_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+ def describe_internet_gateways(self):
+ filter_dict = self._filters_from_querystring()
+ if "InternetGatewayId.1" in self.querystring:
+ igw_ids = self._get_multi_param("InternetGatewayId")
+ igws = self.ec2_backend.describe_internet_gateways(
+ igw_ids, filters=filter_dict
+ )
+ else:
+ igws = self.ec2_backend.describe_internet_gateways(filters=filter_dict)
+
+ template = self.response_template(DESCRIBE_INTERNET_GATEWAYS_RESPONSE)
+ return template.render(internet_gateways=igws)
+
+ def detach_internet_gateway(self):
+ # TODO validate no instances with EIPs in VPC before detaching
+ # raise else DependencyViolationError()
+ igw_id = self._get_param("InternetGatewayId")
+ vpc_id = self._get_param("VpcId")
+ if self.is_not_dryrun("DetachInternetGateway"):
+ self.ec2_backend.detach_internet_gateway(igw_id, vpc_id)
+ template = self.response_template(DETACH_INTERNET_GATEWAY_RESPONSE)
+ return template.render()
+
+
+ATTACH_INTERNET_GATEWAY_RESPONSE = """<AttachInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</AttachInternetGatewayResponse>"""
+
+CREATE_INTERNET_GATEWAY_RESPONSE = """<CreateInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <internetGateway>
+ <internetGatewayId>{{ internet_gateway.id }}</internetGatewayId>
+ <attachmentSet/>
+ <ownerId>{{ internet_gateway.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in internet_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </internetGateway>
+</CreateInternetGatewayResponse>"""
+
+DELETE_INTERNET_GATEWAY_RESPONSE = """<DeleteInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteInternetGatewayResponse>"""
+
+DESCRIBE_INTERNET_GATEWAYS_RESPONSE = """<DescribeInternetGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-
+15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <internetGatewaySet>
+ {% for igw in internet_gateways %}
+ <item>
+ <internetGatewayId>{{ igw.id }}</internetGatewayId>
+ <ownerId>{{ igw.owner_id or none }}</ownerId>
+ {% if igw.vpc %}
+ <attachmentSet>
+ <item>
+ <vpcId>{{ igw.vpc.id }}</vpcId>
+ <state>available</state>
+ </item>
+ </attachmentSet>
+ {% else %}
+ <attachmentSet/>
+ {% endif %}
+ <tagSet>
+ {% for tag in igw.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </internetGatewaySet>
+</DescribeInternetGatewaysResponse>"""
+
+DETACH_INTERNET_GATEWAY_RESPONSE = """<DetachInternetGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DetachInternetGatewayResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/ip_addresses.py b/contrib/python/moto/py3/moto/ec2/responses/ip_addresses.py
new file mode 100644
index 0000000000..258b332d79
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/ip_addresses.py
@@ -0,0 +1,15 @@
+from moto.core.responses import BaseResponse
+
+
+class IPAddresses(BaseResponse):
+ def assign_private_ip_addresses(self):
+ if self.is_not_dryrun("AssignPrivateIPAddress"):
+ raise NotImplementedError(
+ "IPAddresses.assign_private_ip_addresses is not yet implemented"
+ )
+
+ def unassign_private_ip_addresses(self):
+ if self.is_not_dryrun("UnAssignPrivateIPAddress"):
+ raise NotImplementedError(
+ "IPAddresses.unassign_private_ip_addresses is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/key_pairs.py b/contrib/python/moto/py3/moto/ec2/responses/key_pairs.py
new file mode 100644
index 0000000000..5cacbce0e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/key_pairs.py
@@ -0,0 +1,66 @@
+from ._base_response import EC2BaseResponse
+
+
+class KeyPairs(EC2BaseResponse):
+ def create_key_pair(self):
+ name = self._get_param("KeyName")
+ if self.is_not_dryrun("CreateKeyPair"):
+ keypair = self.ec2_backend.create_key_pair(name)
+ template = self.response_template(CREATE_KEY_PAIR_RESPONSE)
+ return template.render(keypair=keypair)
+
+ def delete_key_pair(self):
+ name = self._get_param("KeyName")
+ if self.is_not_dryrun("DeleteKeyPair"):
+ success = str(self.ec2_backend.delete_key_pair(name)).lower()
+ return self.response_template(DELETE_KEY_PAIR_RESPONSE).render(
+ success=success
+ )
+
+ def describe_key_pairs(self):
+ names = self._get_multi_param("KeyName")
+ filters = self._filters_from_querystring()
+ keypairs = self.ec2_backend.describe_key_pairs(names, filters)
+ template = self.response_template(DESCRIBE_KEY_PAIRS_RESPONSE)
+ return template.render(keypairs=keypairs)
+
+ def import_key_pair(self):
+ name = self._get_param("KeyName")
+ material = self._get_param("PublicKeyMaterial")
+ if self.is_not_dryrun("ImportKeyPair"):
+ keypair = self.ec2_backend.import_key_pair(name, material)
+ template = self.response_template(IMPORT_KEYPAIR_RESPONSE)
+ return template.render(keypair=keypair)
+
+
+DESCRIBE_KEY_PAIRS_RESPONSE = """<DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <keySet>
+ {% for keypair in keypairs %}
+ <item>
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ </item>
+ {% endfor %}
+ </keySet>
+ </DescribeKeyPairsResponse>"""
+
+
+CREATE_KEY_PAIR_RESPONSE = """<CreateKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ <keyMaterial>{{ keypair.material }}</keyMaterial>
+</CreateKeyPairResponse>"""
+
+
+DELETE_KEY_PAIR_RESPONSE = """<DeleteKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>{{ success }}</return>
+</DeleteKeyPairResponse>"""
+
+IMPORT_KEYPAIR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <ImportKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>471f9fdd-8fe2-4a84-86b0-bd3d3e350979</requestId>
+ <keyName>{{ keypair.name }}</keyName>
+ <keyFingerprint>{{ keypair.fingerprint }}</keyFingerprint>
+ </ImportKeyPairResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/launch_templates.py b/contrib/python/moto/py3/moto/ec2/responses/launch_templates.py
new file mode 100644
index 0000000000..0029c0d621
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/launch_templates.py
@@ -0,0 +1,307 @@
+import uuid
+from moto.ec2.models import OWNER_ID
+from moto.ec2.exceptions import FilterNotImplementedError
+from ._base_response import EC2BaseResponse
+
+from xml.etree import ElementTree
+from xml.dom import minidom
+
+
+def xml_root(name):
+ root = ElementTree.Element(
+ name, {"xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/"}
+ )
+ request_id = str(uuid.uuid4()) + "example"
+ ElementTree.SubElement(root, "requestId").text = request_id
+
+ return root
+
+
+def xml_serialize(tree, key, value):
+ name = key[0].lower() + key[1:]
+ if isinstance(value, list):
+ if name[-1] == "s":
+ name = name[:-1]
+
+ name = name + "Set"
+
+ node = ElementTree.SubElement(tree, name)
+
+ if isinstance(value, (str, int, float, str)):
+ node.text = str(value)
+ elif isinstance(value, dict):
+ for dictkey, dictvalue in value.items():
+ xml_serialize(node, dictkey, dictvalue)
+ elif isinstance(value, list):
+ for item in value:
+ xml_serialize(node, "item", item)
+ elif value is None:
+ pass
+ else:
+ raise NotImplementedError(
+ 'Don\'t know how to serialize "{}" to xml'.format(value.__class__)
+ )
+
+
+def pretty_xml(tree):
+ rough = ElementTree.tostring(tree, "utf-8")
+ parsed = minidom.parseString(rough)
+ return parsed.toprettyxml(indent=" ")
+
+
+def parse_object(raw_data):
+ out_data = {}
+ for key, value in raw_data.items():
+ key_fix_splits = key.split("_")
+ key_len = len(key_fix_splits)
+
+ new_key = ""
+ for i in range(0, key_len):
+ new_key += key_fix_splits[i][0].upper() + key_fix_splits[i][1:]
+
+ data = out_data
+ splits = new_key.split(".")
+ for split in splits[:-1]:
+ if split not in data:
+ data[split] = {}
+ data = data[split]
+
+ data[splits[-1]] = value
+
+ out_data = parse_lists(out_data)
+ return out_data
+
+
+def parse_lists(data):
+ for key, value in data.items():
+ if isinstance(value, dict):
+ keys = data[key].keys()
+ is_list = all(map(lambda k: k.isnumeric(), keys))
+
+ if is_list:
+ new_value = []
+ keys = sorted(list(keys))
+ for k in keys:
+ lvalue = value[k]
+ if isinstance(lvalue, dict):
+ lvalue = parse_lists(lvalue)
+ new_value.append(lvalue)
+ data[key] = new_value
+ return data
+
+
+class LaunchTemplates(EC2BaseResponse):
+ def create_launch_template(self):
+ name = self._get_param("LaunchTemplateName")
+ version_description = self._get_param("VersionDescription")
+ tag_spec = self._parse_tag_specification()
+
+ raw_template_data = self._get_dict_param("LaunchTemplateData.")
+ parsed_template_data = parse_object(raw_template_data)
+
+ if self.is_not_dryrun("CreateLaunchTemplate"):
+ if tag_spec:
+ if "TagSpecifications" not in parsed_template_data:
+ parsed_template_data["TagSpecifications"] = []
+ converted_tag_spec = []
+ for resource_type, tags in tag_spec.items():
+ converted_tag_spec.append(
+ {
+ "ResourceType": resource_type,
+ "Tags": [
+ {"Key": key, "Value": value}
+ for key, value in tags.items()
+ ],
+ }
+ )
+
+ parsed_template_data["TagSpecifications"].extend(converted_tag_spec)
+
+ template = self.ec2_backend.create_launch_template(
+ name, version_description, parsed_template_data
+ )
+ version = template.default_version()
+
+ tree = xml_root("CreateLaunchTemplateResponse")
+ xml_serialize(
+ tree,
+ "launchTemplate",
+ {
+ "createTime": version.create_time,
+ "createdBy": "arn:aws:iam::{OWNER_ID}:root".format(
+ OWNER_ID=OWNER_ID
+ ),
+ "defaultVersionNumber": template.default_version_number,
+ "latestVersionNumber": version.number,
+ "launchTemplateId": template.id,
+ "launchTemplateName": template.name,
+ },
+ )
+
+ return pretty_xml(tree)
+
+ def create_launch_template_version(self):
+ name = self._get_param("LaunchTemplateName")
+ tmpl_id = self._get_param("LaunchTemplateId")
+ if name:
+ template = self.ec2_backend.get_launch_template_by_name(name)
+ if tmpl_id:
+ template = self.ec2_backend.get_launch_template(tmpl_id)
+
+ version_description = self._get_param("VersionDescription")
+
+ raw_template_data = self._get_dict_param("LaunchTemplateData.")
+ template_data = parse_object(raw_template_data)
+
+ if self.is_not_dryrun("CreateLaunchTemplate"):
+ version = template.create_version(template_data, version_description)
+
+ tree = xml_root("CreateLaunchTemplateVersionResponse")
+ xml_serialize(
+ tree,
+ "launchTemplateVersion",
+ {
+ "createTime": version.create_time,
+ "createdBy": "arn:aws:iam::{OWNER_ID}:root".format(
+ OWNER_ID=OWNER_ID
+ ),
+ "defaultVersion": template.is_default(version),
+ "launchTemplateData": version.data,
+ "launchTemplateId": template.id,
+ "launchTemplateName": template.name,
+ "versionDescription": version.description,
+ "versionNumber": version.number,
+ },
+ )
+ return pretty_xml(tree)
+
+ def delete_launch_template(self):
+ name = self._get_param("LaunchTemplateName")
+ tid = self._get_param("LaunchTemplateId")
+
+ if self.is_not_dryrun("DeleteLaunchTemplate"):
+ template = self.ec2_backend.delete_launch_template(name, tid)
+
+ tree = xml_root("DeleteLaunchTemplatesResponse")
+ xml_serialize(
+ tree,
+ "launchTemplate",
+ {
+ "defaultVersionNumber": template.default_version_number,
+ "launchTemplateId": template.id,
+ "launchTemplateName": template.name,
+ },
+ )
+
+ return pretty_xml(tree)
+
+ # def delete_launch_template_versions(self):
+ # pass
+
+ def describe_launch_template_versions(self):
+ name = self._get_param("LaunchTemplateName")
+ template_id = self._get_param("LaunchTemplateId")
+ if name:
+ template = self.ec2_backend.get_launch_template_by_name(name)
+ if template_id:
+ template = self.ec2_backend.get_launch_template(template_id)
+
+ max_results = self._get_int_param("MaxResults", 15)
+ versions = self._get_multi_param("LaunchTemplateVersion")
+ min_version = self._get_int_param("MinVersion")
+ max_version = self._get_int_param("MaxVersion")
+
+ filters = self._filters_from_querystring()
+ if filters:
+ raise FilterNotImplementedError(
+ "all filters", "DescribeLaunchTemplateVersions"
+ )
+
+ if self.is_not_dryrun("DescribeLaunchTemplateVersions"):
+ tree = ElementTree.Element(
+ "DescribeLaunchTemplateVersionsResponse",
+ {"xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/"},
+ )
+ request_id = ElementTree.SubElement(tree, "requestId")
+ request_id.text = "65cadec1-b364-4354-8ca8-4176dexample"
+
+ versions_node = ElementTree.SubElement(tree, "launchTemplateVersionSet")
+
+ ret_versions = []
+ if versions:
+ for v in versions:
+ ret_versions.append(template.get_version(int(v)))
+ elif min_version:
+ if max_version:
+ vMax = max_version
+ else:
+ vMax = min_version + max_results
+
+ vMin = min_version - 1
+ ret_versions = template.versions[vMin:vMax]
+ elif max_version:
+ vMax = max_version
+ ret_versions = template.versions[:vMax]
+ else:
+ ret_versions = template.versions
+
+ ret_versions = ret_versions[:max_results]
+
+ for version in ret_versions:
+ xml_serialize(
+ versions_node,
+ "item",
+ {
+ "createTime": version.create_time,
+ "createdBy": "arn:aws:iam::{OWNER_ID}:root".format(
+ OWNER_ID=OWNER_ID
+ ),
+ "defaultVersion": True,
+ "launchTemplateData": version.data,
+ "launchTemplateId": template.id,
+ "launchTemplateName": template.name,
+ "versionDescription": version.description,
+ "versionNumber": version.number,
+ },
+ )
+
+ return pretty_xml(tree)
+
+ def describe_launch_templates(self):
+ max_results = self._get_int_param("MaxResults", 15)
+ template_names = self._get_multi_param("LaunchTemplateName")
+ template_ids = self._get_multi_param("LaunchTemplateId")
+ filters = self._filters_from_querystring()
+
+ if self.is_not_dryrun("DescribeLaunchTemplates"):
+ tree = ElementTree.Element("DescribeLaunchTemplatesResponse")
+ templates_node = ElementTree.SubElement(tree, "launchTemplates")
+
+ templates = self.ec2_backend.describe_launch_templates(
+ template_names=template_names,
+ template_ids=template_ids,
+ filters=filters,
+ )
+
+ templates = templates[:max_results]
+
+ for template in templates:
+ xml_serialize(
+ templates_node,
+ "item",
+ {
+ "createTime": template.create_time,
+ "createdBy": "arn:aws:iam::{OWNER_ID}:root".format(
+ OWNER_ID=OWNER_ID
+ ),
+ "defaultVersionNumber": template.default_version_number,
+ "latestVersionNumber": template.latest_version_number,
+ "launchTemplateId": template.id,
+ "launchTemplateName": template.name,
+ },
+ )
+
+ return pretty_xml(tree)
+
+ # def modify_launch_template(self):
+ # pass
diff --git a/contrib/python/moto/py3/moto/ec2/responses/monitoring.py b/contrib/python/moto/py3/moto/ec2/responses/monitoring.py
new file mode 100644
index 0000000000..ce8fc76305
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/monitoring.py
@@ -0,0 +1,15 @@
+from moto.core.responses import BaseResponse
+
+
+class Monitoring(BaseResponse):
+ def monitor_instances(self):
+ if self.is_not_dryrun("MonitorInstances"):
+ raise NotImplementedError(
+ "Monitoring.monitor_instances is not yet implemented"
+ )
+
+ def unmonitor_instances(self):
+ if self.is_not_dryrun("UnMonitorInstances"):
+ raise NotImplementedError(
+ "Monitoring.unmonitor_instances is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/nat_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/nat_gateways.py
new file mode 100644
index 0000000000..01c01ad564
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/nat_gateways.py
@@ -0,0 +1,122 @@
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class NatGateways(EC2BaseResponse):
+ def create_nat_gateway(self):
+ subnet_id = self._get_param("SubnetId")
+ allocation_id = self._get_param("AllocationId")
+ connectivity_type = self._get_param("ConnectivityType")
+ tags = self._get_multi_param("TagSpecification")
+ tags = add_tag_specification(tags)
+
+ nat_gateway = self.ec2_backend.create_nat_gateway(
+ subnet_id=subnet_id,
+ allocation_id=allocation_id,
+ tags=tags,
+ connectivity_type=connectivity_type,
+ )
+ template = self.response_template(CREATE_NAT_GATEWAY)
+ return template.render(nat_gateway=nat_gateway)
+
+ def delete_nat_gateway(self):
+ nat_gateway_id = self._get_param("NatGatewayId")
+ nat_gateway = self.ec2_backend.delete_nat_gateway(nat_gateway_id)
+ template = self.response_template(DELETE_NAT_GATEWAY_RESPONSE)
+ return template.render(nat_gateway=nat_gateway)
+
+ def describe_nat_gateways(self):
+ filters = self._filters_from_querystring()
+ nat_gateway_ids = self._get_multi_param("NatGatewayId")
+ nat_gateways = self.ec2_backend.describe_nat_gateways(filters, nat_gateway_ids)
+ template = self.response_template(DESCRIBE_NAT_GATEWAYS_RESPONSE)
+ return template.render(nat_gateways=nat_gateways)
+
+
+DESCRIBE_NAT_GATEWAYS_RESPONSE = """<DescribeNatGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>bfed02c6-dae9-47c0-86a2-example</requestId>
+ <natGatewaySet>
+ {% for nat_gateway in nat_gateways %}
+ <item>
+ <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
+ <natGatewayAddressSet>
+ {% for address_set in nat_gateway.address_set %}
+ <item>
+ {% if address_set.allocationId %}
+ <allocationId>{{ address_set.allocationId }}</allocationId>
+ {% endif %}
+ {% if address_set.privateIp %}
+ <privateIp>{{ address_set.privateIp }}</privateIp>
+ {% endif %}
+ {% if address_set.publicIp %}
+ <publicIp>{{ address_set.publicIp }}</publicIp>
+ {% endif %}
+ {% if address_set.networkInterfaceId %}
+ <networkInterfaceId>{{ address_set.networkInterfaceId }}</networkInterfaceId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </natGatewayAddressSet>
+ <createTime>{{ nat_gateway.create_time }}</createTime>
+ <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+ <connectivityType>{{ nat_gateway.connectivity_type }}</connectivityType>
+ <state>{{ nat_gateway.state }}</state>
+ <tagSet>
+ {% for tag in nat_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </natGatewaySet>
+</DescribeNatGatewaysResponse>
+"""
+
+CREATE_NAT_GATEWAY = """<CreateNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>1b74dc5c-bcda-403f-867d-example</requestId>
+ <natGateway>
+ <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
+ <natGatewayAddressSet>
+ {% for address_set in nat_gateway.address_set %}
+ <item>
+ {% if address_set.allocationId %}
+ <allocationId>{{ address_set.allocationId }}</allocationId>
+ {% endif %}
+ {% if address_set.privateIp %}
+ <privateIp>{{ address_set.privateIp }}</privateIp>
+ {% endif %}
+ {% if address_set.publicIp %}
+ <publicIp>{{ address_set.publicIp }}</publicIp>
+ {% endif %}
+ {% if address_set.networkInterfaceId %}
+ <networkInterfaceId>{{ address_set.networkInterfaceId }}</networkInterfaceId>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </natGatewayAddressSet>
+ <createTime>{{ nat_gateway.create_time }}</createTime>
+ <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+ <connectivityType>{{ nat_gateway.connectivity_type }}</connectivityType>
+ <state>{{ nat_gateway.state }}</state>
+ <tagSet>
+ {% for tag in nat_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </natGateway>
+</CreateNatGatewayResponse>
+"""
+
+
+DELETE_NAT_GATEWAY_RESPONSE = """<DeleteNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
+ <requestId>741fc8ab-6ebe-452b-b92b-example</requestId>
+ <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
+</DeleteNatGatewayResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/network_acls.py b/contrib/python/moto/py3/moto/ec2/responses/network_acls.py
new file mode 100644
index 0000000000..ec254599b3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/network_acls.py
@@ -0,0 +1,210 @@
+from ._base_response import EC2BaseResponse
+
+
+class NetworkACLs(EC2BaseResponse):
+ def create_network_acl(self):
+ vpc_id = self._get_param("VpcId")
+ tags = self._get_multi_param("TagSpecification")
+ if tags:
+ tags = tags[0].get("Tag")
+ network_acl = self.ec2_backend.create_network_acl(vpc_id, tags=tags)
+ template = self.response_template(CREATE_NETWORK_ACL_RESPONSE)
+ return template.render(network_acl=network_acl)
+
+ def create_network_acl_entry(self):
+ network_acl_id = self._get_param("NetworkAclId")
+ rule_number = self._get_param("RuleNumber")
+ protocol = self._get_param("Protocol")
+ rule_action = self._get_param("RuleAction")
+ egress = self._get_param("Egress")
+ cidr_block = self._get_param("CidrBlock")
+ icmp_code = self._get_param("Icmp.Code")
+ icmp_type = self._get_param("Icmp.Type")
+ port_range_from = self._get_param("PortRange.From")
+ port_range_to = self._get_param("PortRange.To")
+
+ network_acl_entry = self.ec2_backend.create_network_acl_entry(
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ )
+
+ template = self.response_template(CREATE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render(network_acl_entry=network_acl_entry)
+
+ def delete_network_acl(self):
+ network_acl_id = self._get_param("NetworkAclId")
+ self.ec2_backend.delete_network_acl(network_acl_id)
+ template = self.response_template(DELETE_NETWORK_ACL_ASSOCIATION)
+ return template.render()
+
+ def delete_network_acl_entry(self):
+ network_acl_id = self._get_param("NetworkAclId")
+ rule_number = self._get_param("RuleNumber")
+ egress = self._get_param("Egress")
+ self.ec2_backend.delete_network_acl_entry(network_acl_id, rule_number, egress)
+ template = self.response_template(DELETE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render()
+
+ def replace_network_acl_entry(self):
+ network_acl_id = self._get_param("NetworkAclId")
+ rule_number = self._get_param("RuleNumber")
+ protocol = self._get_param("Protocol")
+ rule_action = self._get_param("RuleAction")
+ egress = self._get_param("Egress")
+ cidr_block = self._get_param("CidrBlock")
+ icmp_code = self._get_param("Icmp.Code")
+ icmp_type = self._get_param("Icmp.Type")
+ port_range_from = self._get_param("PortRange.From")
+ port_range_to = self._get_param("PortRange.To")
+
+ self.ec2_backend.replace_network_acl_entry(
+ network_acl_id,
+ rule_number,
+ protocol,
+ rule_action,
+ egress,
+ cidr_block,
+ icmp_code,
+ icmp_type,
+ port_range_from,
+ port_range_to,
+ )
+
+ template = self.response_template(REPLACE_NETWORK_ACL_ENTRY_RESPONSE)
+ return template.render()
+
+ def describe_network_acls(self):
+ network_acl_ids = self._get_multi_param("NetworkAclId")
+ filters = self._filters_from_querystring()
+ network_acls = self.ec2_backend.describe_network_acls(network_acl_ids, filters)
+ template = self.response_template(DESCRIBE_NETWORK_ACL_RESPONSE)
+ return template.render(network_acls=network_acls)
+
+ def replace_network_acl_association(self):
+ association_id = self._get_param("AssociationId")
+ network_acl_id = self._get_param("NetworkAclId")
+
+ association = self.ec2_backend.replace_network_acl_association(
+ association_id, network_acl_id
+ )
+ template = self.response_template(REPLACE_NETWORK_ACL_ASSOCIATION)
+ return template.render(association=association)
+
+
+CREATE_NETWORK_ACL_RESPONSE = """
+<CreateNetworkAclResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <networkAcl>
+ <networkAclId>{{ network_acl.id }}</networkAclId>
+ <vpcId>{{ network_acl.vpc_id }}</vpcId>
+ <default>false</default>
+ <entrySet/>
+ <associationSet/>
+ <tagSet>
+ {% for tag in network_acl.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </networkAcl>
+</CreateNetworkAclResponse>
+"""
+
+DESCRIBE_NETWORK_ACL_RESPONSE = """
+<DescribeNetworkAclsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <networkAclSet>
+ {% for network_acl in network_acls %}
+ <item>
+ <networkAclId>{{ network_acl.id }}</networkAclId>
+ <vpcId>{{ network_acl.vpc_id }}</vpcId>
+ <ownerId>{{ network_acl.owner_id }}</ownerId>
+ <default>{{ network_acl.default }}</default>
+ <entrySet>
+ {% for entry in network_acl.network_acl_entries %}
+ <item>
+ <ruleNumber>{{ entry.rule_number }}</ruleNumber>
+ <protocol>{{ entry.protocol }}</protocol>
+ <ruleAction>{{ entry.rule_action }}</ruleAction>
+ <egress>{{ entry.egress.lower() }}</egress>
+ <cidrBlock>{{ entry.cidr_block }}</cidrBlock>
+ {% if entry.port_range_from or entry.port_range_to %}
+ <portRange>
+ <from>{{ entry.port_range_from }}</from>
+ <to>{{ entry.port_range_to }}</to>
+ </portRange>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </entrySet>
+ <associationSet>
+ {% for association in network_acl.associations.values() %}
+ <item>
+ <networkAclAssociationId>{{ association.id }}</networkAclAssociationId>
+ <networkAclId>{{ association.network_acl_id }}</networkAclId>
+ <subnetId>{{ association.subnet_id }}</subnetId>
+ </item>
+ {% endfor %}
+ </associationSet>
+ <tagSet>
+ {% for tag in network_acl.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key}}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </networkAclSet>
+</DescribeNetworkAclsResponse>
+"""
+
+CREATE_NETWORK_ACL_ENTRY_RESPONSE = """
+<CreateNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</CreateNetworkAclEntryResponse>
+"""
+
+REPLACE_NETWORK_ACL_ENTRY_RESPONSE = """
+<ReplaceNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReplaceNetworkAclEntryResponse>
+"""
+
+REPLACE_NETWORK_ACL_ASSOCIATION = """
+<ReplaceNetworkAclAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <newAssociationId>{{ association.new_association_id }}</newAssociationId>
+</ReplaceNetworkAclAssociationResponse>
+"""
+
+DELETE_NETWORK_ACL_ASSOCIATION = """
+<DeleteNetworkAclResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteNetworkAclResponse>
+"""
+
+DELETE_NETWORK_ACL_ENTRY_RESPONSE = """
+<DeleteNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteNetworkAclEntryResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/placement_groups.py b/contrib/python/moto/py3/moto/ec2/responses/placement_groups.py
new file mode 100644
index 0000000000..f7e6bb540a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/placement_groups.py
@@ -0,0 +1,20 @@
+from moto.core.responses import BaseResponse
+
+
+class PlacementGroups(BaseResponse):
+ def create_placement_group(self):
+ if self.is_not_dryrun("CreatePlacementGroup"):
+ raise NotImplementedError(
+ "PlacementGroups.create_placement_group is not yet implemented"
+ )
+
+ def delete_placement_group(self):
+ if self.is_not_dryrun("DeletePlacementGroup"):
+ raise NotImplementedError(
+ "PlacementGroups.delete_placement_group is not yet implemented"
+ )
+
+ def describe_placement_groups(self):
+ raise NotImplementedError(
+ "PlacementGroups.describe_placement_groups is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/reserved_instances.py b/contrib/python/moto/py3/moto/ec2/responses/reserved_instances.py
new file mode 100644
index 0000000000..78b4d7f2c2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/reserved_instances.py
@@ -0,0 +1,36 @@
+from moto.core.responses import BaseResponse
+
+
+class ReservedInstances(BaseResponse):
+ def cancel_reserved_instances_listing(self):
+ if self.is_not_dryrun("CancelReservedInstances"):
+ raise NotImplementedError(
+ "ReservedInstances.cancel_reserved_instances_listing is not yet implemented"
+ )
+
+ def create_reserved_instances_listing(self):
+ if self.is_not_dryrun("CreateReservedInstances"):
+ raise NotImplementedError(
+ "ReservedInstances.create_reserved_instances_listing is not yet implemented"
+ )
+
+ def describe_reserved_instances(self):
+ raise NotImplementedError(
+ "ReservedInstances.describe_reserved_instances is not yet implemented"
+ )
+
+ def describe_reserved_instances_listings(self):
+ raise NotImplementedError(
+ "ReservedInstances.describe_reserved_instances_listings is not yet implemented"
+ )
+
+ def describe_reserved_instances_offerings(self):
+ raise NotImplementedError(
+ "ReservedInstances.describe_reserved_instances_offerings is not yet implemented"
+ )
+
+ def purchase_reserved_instances_offering(self):
+ if self.is_not_dryrun("PurchaseReservedInstances"):
+ raise NotImplementedError(
+ "ReservedInstances.purchase_reserved_instances_offering is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/route_tables.py b/contrib/python/moto/py3/moto/ec2/responses/route_tables.py
new file mode 100644
index 0000000000..428dfbab68
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/route_tables.py
@@ -0,0 +1,328 @@
+from ._base_response import EC2BaseResponse
+
+
+class RouteTables(EC2BaseResponse):
+ def associate_route_table(self):
+ route_table_id = self._get_param("RouteTableId")
+ gateway_id = self._get_param("GatewayId")
+ subnet_id = self._get_param("SubnetId")
+ association_id = self.ec2_backend.associate_route_table(
+ route_table_id, gateway_id, subnet_id
+ )
+ template = self.response_template(ASSOCIATE_ROUTE_TABLE_RESPONSE)
+ return template.render(association_id=association_id)
+
+ def create_route(self):
+ route_table_id = self._get_param("RouteTableId")
+ destination_cidr_block = self._get_param("DestinationCidrBlock")
+ destination_ipv6_cidr_block = self._get_param("DestinationIpv6CidrBlock")
+ destination_prefix_list_id = self._get_param("DestinationPrefixListId")
+ gateway_id = self._get_param("GatewayId")
+ instance_id = self._get_param("InstanceId")
+ nat_gateway_id = self._get_param("NatGatewayId")
+ egress_only_igw_id = self._get_param("EgressOnlyInternetGatewayId")
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ interface_id = self._get_param("NetworkInterfaceId")
+ pcx_id = self._get_param("VpcPeeringConnectionId")
+ carrier_gateway_id = self._get_param("CarrierGatewayId")
+
+ self.ec2_backend.create_route(
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list_id,
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ nat_gateway_id=nat_gateway_id,
+ egress_only_igw_id=egress_only_igw_id,
+ transit_gateway_id=transit_gateway_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id,
+ carrier_gateway_id=carrier_gateway_id,
+ )
+
+ template = self.response_template(CREATE_ROUTE_RESPONSE)
+ return template.render()
+
+ def create_route_table(self):
+ vpc_id = self._get_param("VpcId")
+ tags = self._get_multi_param("TagSpecification", skip_result_conversion=True)
+ if tags:
+ tags = tags[0].get("Tag") or []
+ route_table = self.ec2_backend.create_route_table(vpc_id, tags)
+ template = self.response_template(CREATE_ROUTE_TABLE_RESPONSE)
+ return template.render(route_table=route_table)
+
+ def delete_route(self):
+ route_table_id = self._get_param("RouteTableId")
+ destination_cidr_block = self._get_param("DestinationCidrBlock")
+ destination_ipv6_cidr_block = self._get_param("DestinationIpv6CidrBlock")
+ destination_prefix_list_id = self._get_param("DestinationPrefixListId")
+ self.ec2_backend.delete_route(
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list_id,
+ )
+ template = self.response_template(DELETE_ROUTE_RESPONSE)
+ return template.render()
+
+ def delete_route_table(self):
+ route_table_id = self._get_param("RouteTableId")
+ self.ec2_backend.delete_route_table(route_table_id)
+ template = self.response_template(DELETE_ROUTE_TABLE_RESPONSE)
+ return template.render()
+
+ def describe_route_tables(self):
+ route_table_ids = self._get_multi_param("RouteTableId")
+ filters = self._filters_from_querystring()
+ route_tables = self.ec2_backend.describe_route_tables(route_table_ids, filters)
+ template = self.response_template(DESCRIBE_ROUTE_TABLES_RESPONSE)
+ return template.render(route_tables=route_tables)
+
+ def disassociate_route_table(self):
+ association_id = self._get_param("AssociationId")
+ self.ec2_backend.disassociate_route_table(association_id)
+ template = self.response_template(DISASSOCIATE_ROUTE_TABLE_RESPONSE)
+ return template.render()
+
+ def replace_route(self):
+ route_table_id = self._get_param("RouteTableId")
+ destination_cidr_block = self._get_param("DestinationCidrBlock")
+ destination_ipv6_cidr_block = self._get_param("DestinationIpv6CidrBlock")
+ destination_prefix_list_id = self._get_param("DestinationPrefixListId")
+ gateway_id = self._get_param("GatewayId")
+ instance_id = self._get_param("InstanceId")
+ interface_id = self._get_param("NetworkInterfaceId")
+ pcx_id = self._get_param("VpcPeeringConnectionId")
+ nat_gateway_id = self._get_param("NatGatewayId")
+ egress_only_igw_id = self._get_param("EgressOnlyInternetGatewayId")
+ transit_gateway_id = self._get_param("TransitGatewayId")
+
+ self.ec2_backend.replace_route(
+ route_table_id,
+ destination_cidr_block,
+ destination_ipv6_cidr_block,
+ destination_prefix_list_id,
+ nat_gateway_id,
+ egress_only_igw_id,
+ transit_gateway_id,
+ gateway_id=gateway_id,
+ instance_id=instance_id,
+ interface_id=interface_id,
+ vpc_peering_connection_id=pcx_id,
+ )
+
+ template = self.response_template(REPLACE_ROUTE_RESPONSE)
+ return template.render()
+
+ def replace_route_table_association(self):
+ route_table_id = self._get_param("RouteTableId")
+ association_id = self._get_param("AssociationId")
+ new_association_id = self.ec2_backend.replace_route_table_association(
+ association_id, route_table_id
+ )
+ template = self.response_template(REPLACE_ROUTE_TABLE_ASSOCIATION_RESPONSE)
+ return template.render(association_id=new_association_id)
+
+
+CREATE_ROUTE_RESPONSE = """
+<CreateRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</CreateRouteResponse>
+"""
+
+REPLACE_ROUTE_RESPONSE = """
+<ReplaceRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</ReplaceRouteResponse>
+"""
+
+CREATE_ROUTE_TABLE_RESPONSE = """
+<CreateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <routeTable>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <vpcId>{{ route_table.vpc_id }}</vpcId>
+ <ownerId>{{ route_table.owner_id }}</ownerId>
+ <routeSet>
+ {% for route in route_table.routes.values() %}
+ {% if route.local %}
+ <item>
+ {% if route.destination_ipv6_cidr_block %}
+ <destinationIpv6CidrBlock>{{ route.destination_ipv6_cidr_block }}</destinationIpv6CidrBlock>
+ {% endif %}
+ {% if route.destination_cidr_block %}
+ <destinationCidrBlock>{{ route.destination_cidr_block }}</destinationCidrBlock>
+ {% endif %}
+ {% if route.destination_prefix_list_id %}
+ <destinationPrefixListId>{{ route.destination_prefix_list_id }}</destinationPrefixListId>
+ {% endif %}
+ <gatewayId>local</gatewayId>
+ <state>active</state>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </routeSet>
+ <associationSet/>
+ <tagSet>
+ {% for tag in route_table.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </routeTable>
+</CreateRouteTableResponse>
+"""
+
+DESCRIBE_ROUTE_TABLES_RESPONSE = """
+<DescribeRouteTablesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>6f570b0b-9c18-4b07-bdec-73740dcf861a</requestId>
+ <routeTableSet>
+ {% for route_table in route_tables %}
+ <item>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <vpcId>{{ route_table.vpc_id }}</vpcId>
+ <ownerId>{{ route_table.owner_id }}</ownerId>
+ <routeSet>
+ {% for route in route_table.routes.values() %}
+ <item>
+ {% if route.destination_ipv6_cidr_block %}
+ <destinationIpv6CidrBlock>{{ route.destination_ipv6_cidr_block }}</destinationIpv6CidrBlock>
+ {% endif %}
+ {% if route.destination_cidr_block %}
+ <destinationCidrBlock>{{ route.destination_cidr_block }}</destinationCidrBlock>
+ {% endif %}
+ {% if route.destination_prefix_list %}
+ <destinationPrefixListId>{{ route.destination_prefix_list.id }}</destinationPrefixListId>
+ {% endif %}
+ {% if route.local %}
+ <gatewayId>local</gatewayId>
+ <origin>CreateRouteTable</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.gateway %}
+ <gatewayId>{{ route.gateway.id }}</gatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.instance %}
+ <instanceId>{{ route.instance.id }}</instanceId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.vpc_pcx %}
+ <vpcPeeringConnectionId>{{ route.vpc_pcx.id }}</vpcPeeringConnectionId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.carrier_gateway %}
+ <carrierGatewayId>{{ route.carrier_gateway.id }}</carrierGatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.nat_gateway %}
+ <natGatewayId>{{ route.nat_gateway.id }}</natGatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.egress_only_igw %}
+ <egressOnlyInternetGatewayId>{{ route.egress_only_igw.id }}</egressOnlyInternetGatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.transit_gateway %}
+ <transitGatewayId>{{ route.transit_gateway.id }}</transitGatewayId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ {% if route.interface %}
+ <networkInterfaceId>{{ route.interface.id }}</networkInterfaceId>
+ <origin>CreateRoute</origin>
+ <state>active</state>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </routeSet>
+ <associationSet>
+ <item>
+ <routeTableAssociationId>{{ route_table.main_association }}</routeTableAssociationId>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <main>true</main>
+ <associationState>
+ <state>associated</state>
+ </associationState>
+ </item>
+ {% for association_id,subnet_id in route_table.associations.items() %}
+ <item>
+ <routeTableAssociationId>{{ association_id }}</routeTableAssociationId>
+ <routeTableId>{{ route_table.id }}</routeTableId>
+ <main>false</main>
+ {% if subnet_id.startswith("igw") %}
+ <gatewayId>{{ subnet_id }}</gatewayId>
+ {% endif %}
+ {% if subnet_id.startswith("subnet") %}
+ <subnetId>{{ subnet_id }}</subnetId>
+ {% endif %}
+ <associationState>
+ <state>associated</state>
+ </associationState>
+ </item>
+ {% endfor %}
+ </associationSet>
+ <tagSet>
+ {% for tag in route_table.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </routeTableSet>
+</DescribeRouteTablesResponse>
+"""
+
+DELETE_ROUTE_RESPONSE = """
+<DeleteRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteRouteResponse>
+"""
+
+DELETE_ROUTE_TABLE_RESPONSE = """
+<DeleteRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteRouteTableResponse>
+"""
+
+ASSOCIATE_ROUTE_TABLE_RESPONSE = """
+<AssociateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <associationId>{{ association_id }}</associationId>
+</AssociateRouteTableResponse>
+"""
+
+DISASSOCIATE_ROUTE_TABLE_RESPONSE = """
+<DisassociateRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DisassociateRouteTableResponse>
+"""
+
+REPLACE_ROUTE_TABLE_ASSOCIATION_RESPONSE = """
+<ReplaceRouteTableAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <newAssociationId>{{ association_id }}</newAssociationId>
+</ReplaceRouteTableAssociationResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/security_groups.py b/contrib/python/moto/py3/moto/ec2/responses/security_groups.py
new file mode 100644
index 0000000000..c14beadfa8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/security_groups.py
@@ -0,0 +1,570 @@
+from ._base_response import EC2BaseResponse
+
+
+def try_parse_int(value, default=None):
+ try:
+ return int(value)
+ except (TypeError, ValueError):
+ return default
+
+
+def parse_sg_attributes_from_dict(sg_attributes):
+ ip_protocol = sg_attributes.get("IpProtocol", [None])[0]
+ from_port = sg_attributes.get("FromPort", [None])[0]
+ to_port = sg_attributes.get("ToPort", [None])[0]
+
+ ip_ranges = []
+ ip_ranges_tree = sg_attributes.get("IpRanges") or {}
+ for ip_range_idx in sorted(ip_ranges_tree.keys()):
+ ip_range = {"CidrIp": ip_ranges_tree[ip_range_idx]["CidrIp"][0]}
+ if ip_ranges_tree[ip_range_idx].get("Description"):
+ ip_range["Description"] = ip_ranges_tree[ip_range_idx].get("Description")[0]
+
+ ip_ranges.append(ip_range)
+
+ ip_ranges_tree = sg_attributes.get("Ipv6Ranges") or {}
+ for ip_range_idx in sorted(ip_ranges_tree.keys()):
+ ip_range = {"CidrIpv6": ip_ranges_tree[ip_range_idx]["CidrIpv6"][0]}
+ if ip_ranges_tree[ip_range_idx].get("Description"):
+ ip_range["Description"] = ip_ranges_tree[ip_range_idx].get("Description")[0]
+
+ ip_ranges.append(ip_range)
+
+ if "CidrIp" in sg_attributes:
+ cidr_ip = sg_attributes.get("CidrIp")[0]
+ ip_ranges.append({"CidrIp": cidr_ip})
+
+ if "CidrIpv6" in sg_attributes:
+ cidr_ipv6 = sg_attributes.get("CidrIpv6")[0]
+ ip_ranges.append({"CidrIpv6": cidr_ipv6})
+
+ source_groups = []
+ groups_tree = sg_attributes.get("Groups") or {}
+ for group_idx in sorted(groups_tree.keys()):
+ group_dict = groups_tree[group_idx]
+ source_group = {}
+ if "GroupId" in group_dict:
+ source_group["GroupId"] = group_dict["GroupId"][0]
+ if "GroupName" in group_dict:
+ source_group["GroupName"] = group_dict["GroupName"][0]
+ if "Description" in group_dict:
+ source_group["Description"] = group_dict["Description"][0]
+ if "OwnerId" in group_dict:
+ source_group["OwnerId"] = group_dict["OwnerId"][0]
+ source_groups.append(source_group)
+
+ prefix_list_ids = []
+ pl_tree = sg_attributes.get("PrefixListIds") or {}
+ for pl_index in sorted(pl_tree):
+ pl_dict = pl_tree.get(pl_index, {})
+ pl_item = {}
+ if "PrefixListId" in pl_dict:
+ pl_item["PrefixListId"] = pl_dict.get("PrefixListId")[0]
+ if "Description" in pl_dict:
+ pl_item["Description"] = pl_dict.get("Description")[0]
+ if pl_item:
+ prefix_list_ids.append(pl_item)
+ return (ip_protocol, from_port, to_port, ip_ranges, source_groups, prefix_list_ids)
+
+
+class SecurityGroups(EC2BaseResponse):
+ def _process_rules_from_querystring(self):
+ group_name_or_id = self._get_param("GroupName") or self._get_param("GroupId")
+
+ querytree = {}
+ for key, value in self.querystring.items():
+ key_splitted = key.split(".")
+ key_splitted = [try_parse_int(e, e) for e in key_splitted]
+
+ d = querytree
+ for subkey in key_splitted[:-1]:
+ if subkey not in d:
+ d[subkey] = {}
+ d = d[subkey]
+ d[key_splitted[-1]] = value
+
+ if "IpPermissions" not in querytree:
+ # Handle single rule syntax
+ (
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups,
+ prefix_list_ids,
+ ) = parse_sg_attributes_from_dict(querytree)
+
+ yield (
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups,
+ prefix_list_ids,
+ )
+
+ ip_permissions = querytree.get("IpPermissions") or {}
+ for ip_permission_idx in sorted(ip_permissions.keys()):
+ ip_permission = ip_permissions[ip_permission_idx]
+
+ (
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups,
+ prefix_list_ids,
+ ) = parse_sg_attributes_from_dict(ip_permission)
+
+ yield (
+ group_name_or_id,
+ ip_protocol,
+ from_port,
+ to_port,
+ ip_ranges,
+ source_groups,
+ prefix_list_ids,
+ )
+
+ def authorize_security_group_egress(self):
+ if self.is_not_dryrun("GrantSecurityGroupEgress"):
+ for args in self._process_rules_from_querystring():
+ rule, group = self.ec2_backend.authorize_security_group_egress(*args)
+ self.ec2_backend.sg_old_egress_ruls[group.id] = group.egress_rules.copy()
+ template = self.response_template(AUTHORIZE_SECURITY_GROUP_EGRESS_RESPONSE)
+ return template.render(rule=rule, group=group)
+
+ def authorize_security_group_ingress(self):
+ if self.is_not_dryrun("GrantSecurityGroupIngress"):
+ for args in self._process_rules_from_querystring():
+ rule, group = self.ec2_backend.authorize_security_group_ingress(*args)
+ self.ec2_backend.sg_old_ingress_ruls[group.id] = group.ingress_rules.copy()
+ template = self.response_template(AUTHORIZE_SECURITY_GROUP_INGRESS_RESPONSE)
+ return template.render(rule=rule, group=group)
+
+ def create_security_group(self):
+ name = self._get_param("GroupName")
+ description = self._get_param("GroupDescription")
+ vpc_id = self._get_param("VpcId")
+ tags = self._get_multi_param("TagSpecification")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+
+ if self.is_not_dryrun("CreateSecurityGroup"):
+ group = self.ec2_backend.create_security_group(
+ name, description, vpc_id=vpc_id, tags=tags
+ )
+ if group:
+ self.ec2_backend.sg_old_ingress_ruls[
+ group.id
+ ] = group.ingress_rules.copy()
+ self.ec2_backend.sg_old_egress_ruls[
+ group.id
+ ] = group.egress_rules.copy()
+ template = self.response_template(CREATE_SECURITY_GROUP_RESPONSE)
+ return template.render(group=group)
+
+ def delete_security_group(self):
+ # TODO this should raise an error if there are instances in the group.
+ # See
+ # http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteSecurityGroup.html
+
+ name = self._get_param("GroupName")
+ sg_id = self._get_param("GroupId")
+
+ if self.is_not_dryrun("DeleteSecurityGroup"):
+ if name:
+ self.ec2_backend.delete_security_group(name)
+ elif sg_id:
+ self.ec2_backend.delete_security_group(group_id=sg_id)
+
+ return DELETE_GROUP_RESPONSE
+
+ def describe_security_groups(self):
+ groupnames = self._get_multi_param("GroupName")
+ group_ids = self._get_multi_param("GroupId")
+ filters = self._filters_from_querystring()
+
+ groups = self.ec2_backend.describe_security_groups(
+ group_ids=group_ids, groupnames=groupnames, filters=filters
+ )
+
+ template = self.response_template(DESCRIBE_SECURITY_GROUPS_RESPONSE)
+ return template.render(groups=groups)
+
+ def revoke_security_group_egress(self):
+ if self.is_not_dryrun("RevokeSecurityGroupEgress"):
+ for args in self._process_rules_from_querystring():
+ success = self.ec2_backend.revoke_security_group_egress(*args)
+ if not success:
+ return "Could not find a matching egress rule", dict(status=404)
+ return REVOKE_SECURITY_GROUP_EGRESS_RESPONSE
+
+ def revoke_security_group_ingress(self):
+ if self.is_not_dryrun("RevokeSecurityGroupIngress"):
+ for args in self._process_rules_from_querystring():
+ self.ec2_backend.revoke_security_group_ingress(*args)
+ return REVOKE_SECURITY_GROUP_INGRESS_RESPONSE
+
+ def update_security_group_rule_descriptions_ingress(self):
+ for args in self._process_rules_from_querystring():
+ group = self.ec2_backend.update_security_group_rule_descriptions_ingress(
+ *args
+ )
+ self.ec2_backend.sg_old_ingress_ruls[group.id] = group.ingress_rules.copy()
+ return UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_INGRESS
+
+ def update_security_group_rule_descriptions_egress(self):
+ for args in self._process_rules_from_querystring():
+ group = self.ec2_backend.update_security_group_rule_descriptions_egress(
+ *args
+ )
+ self.ec2_backend.sg_old_egress_ruls[group.id] = group.egress_rules.copy()
+ return UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_EGRESS
+
+
+CREATE_SECURITY_GROUP_RESPONSE = """<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+ <groupId>{{ group.id }}</groupId>
+ <tagSet>
+ {% for tag in group.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</CreateSecurityGroupResponse>"""
+
+DELETE_GROUP_RESPONSE = """<DeleteSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</DeleteSecurityGroupResponse>"""
+
+DESCRIBE_SECURITY_GROUPS_RESPONSE = """<DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <securityGroupInfo>
+ {% for group in groups %}
+ <item>
+ <ownerId>{{ group.owner_id }}</ownerId>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ <groupDescription>{{ group.description }}</groupDescription>
+ {% if group.vpc_id %}
+ <vpcId>{{ group.vpc_id }}</vpcId>
+ {% endif %}
+ <ipPermissions>
+ {% for rule in group.ingress_rules %}
+ <item>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <groups>
+ {% for source_group in rule.source_groups %}
+ <item>
+ {% if source_group.OwnerId and source_group.OwnerId != "" %}
+ <userId>{{ source_group.OwnerId }}</userId>
+ {% endif %}
+ {% if source_group.GroupId and source_group.GroupId != "" %}
+ <groupId>{{ source_group.GroupId }}</groupId>
+ {% endif %}
+ {% if source_group.GroupName and source_group.GroupName != "" %}
+ <groupName>{{ source_group.GroupName }}</groupName>
+ {% endif %}
+ {% if source_group.Description and source_group.Description != "" %}
+ <description>{{ source_group.Description }}</description>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groups>
+ <ipRanges>
+ {% for ip_range in rule.ip_ranges %}
+ {% if ip_range['CidrIp'] %}
+ <item>
+ <cidrIp>{{ ip_range['CidrIp'] }}</cidrIp>
+ {% if ip_range['Description'] %}
+ <description>{{ ip_range['Description'] }}</description>
+ {% endif %}
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipRanges>
+ <ipv6Ranges>
+ {% for ip_range in rule.ip_ranges %}
+ {% if ip_range['CidrIpv6'] %}
+ <item>
+ <cidrIpv6>{{ ip_range['CidrIpv6'] }}</cidrIpv6>
+ {% if ip_range['Description'] %}
+ <description>{{ ip_range['Description'] }}</description>
+ {% endif %}
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipv6Ranges>
+ <prefixListIds>
+ {% for prefix_list in rule.prefix_list_ids %}
+ <item>
+ <prefixListId>{{ prefix_list.PrefixListId }}</prefixListId>
+ {% if prefix_list.Description %}
+ <description>{{ prefix_list.Description }}</description>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </prefixListIds>
+ </item>
+ {% endfor %}
+ </ipPermissions>
+ <ipPermissionsEgress>
+ {% for rule in group.egress_rules %}
+ <item>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <groups>
+ {% for source_group in rule.source_groups %}
+ <item>
+ {% if source_group.OwnerId and source_group.OwnerId != "" %}
+ <userId>{{ source_group.OwnerId }}</userId>
+ {% endif %}
+ {% if source_group.GroupId and source_group.GroupId != "" %}
+ <groupId>{{ source_group.GroupId }}</groupId>
+ {% endif %}
+ {% if source_group.GroupName and source_group.GroupName != "" %}
+ <groupName>{{ source_group.GroupName }}</groupName>
+ {% endif %}
+ {% if source_group.Description and source_group.Description != "" %}
+ <description>{{ source_group.Description }}</description>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </groups>
+ <ipRanges>
+ {% for ip_range in rule.ip_ranges %}
+ {% if ip_range['CidrIp'] %}
+ <item>
+ <cidrIp>{{ ip_range['CidrIp'] }}</cidrIp>
+ {% if ip_range['Description'] %}
+ <description>{{ ip_range['Description'] }}</description>
+ {% endif %}
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipRanges>
+ <ipv6Ranges>
+ {% for ip_range in rule.ip_ranges %}
+ {% if ip_range['CidrIpv6'] %}
+ <item>
+ <cidrIpv6>{{ ip_range['CidrIpv6'] }}</cidrIpv6>
+ {% if ip_range['Description'] %}
+ <description>{{ ip_range['Description'] }}</description>
+ {% endif %}
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipv6Ranges>
+ <prefixListIds>
+ {% for prefix_list in rule.prefix_list_ids %}
+ <item>
+ <prefixListId>{{ prefix_list.PrefixListId }}</prefixListId>
+ {% if prefix_list.Description %}
+ <description>{{ prefix_list.Description }}</description>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </prefixListIds>
+ </item>
+ {% endfor %}
+ </ipPermissionsEgress>
+ <tagSet>
+ {% for tag in group.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </securityGroupInfo>
+</DescribeSecurityGroupsResponse>"""
+
+AUTHORIZE_SECURITY_GROUP_INGRESS_RESPONSE = """<AuthorizeSecurityGroupIngressResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>b1f67202-c2c2-4ba4-8464-c8b1d8f5af7a</requestId>
+ <return>true</return>
+ <securityGroupRuleSet>
+ {% for item in rule.ip_ranges %}
+ <item>
+ {% if item.CidrIp %}
+ <cidrIpv4>{{ item.CidrIp }}</cidrIpv4>
+ {% endif %}
+ {% if item.CidrIpv6 %}
+ <cidrIpv6>{{ item.CidrIpv6 }}</cidrIpv6>
+ {% endif %}
+ <description>{{ item.Description or '' }}</description>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>false</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ </item>
+ {% endfor %}
+ {% for item in rule.prefix_list_ids %}
+ <item>
+ <prefixListId>{{ item.PrefixListId }}</prefixListId>
+ <description>{{ item.Description or '' }}</description>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>false</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ </item>
+ {% endfor %}
+ {% for item in rule.source_groups %}
+ <item>
+ {% if item.Description and item.Description != "" %}
+ <description>{{ item.Description }}</description>
+ {% endif %}
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>true</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <referencedGroupInfo>
+ {% if item.OwnerId and item.OwnerId != "" %}
+ <userId>{{ item.OwnerId }}</userId>
+ {% endif %}
+ {% if item.GroupId and item.GroupId != "" %}
+ <groupId>{{ item.GroupId }}</groupId>
+ {% endif %}
+ {% if item.VpcId and item.VpcId != "" %}
+ <vpcId>{{ item.VpcId }}</vpcId>
+ {% endif %}
+ </referencedGroupInfo>
+ </item>
+ {% endfor %}
+ </securityGroupRuleSet>
+</AuthorizeSecurityGroupIngressResponse>"""
+
+REVOKE_SECURITY_GROUP_INGRESS_RESPONSE = """<RevokeSecurityGroupIngressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RevokeSecurityGroupIngressResponse>"""
+
+AUTHORIZE_SECURITY_GROUP_EGRESS_RESPONSE = """<AuthorizeSecurityGroupEgressResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>b1f67202-c2c2-4ba4-8464-c8b1d8f5af7a</requestId>
+ <return>true</return>
+ <securityGroupRuleSet>
+ {% for item in rule.ip_ranges %}
+ <item>
+ {% if item.CidrIp %}
+ <cidrIpv4>{{ item.CidrIp }}</cidrIpv4>
+ {% endif %}
+ {% if item.CidrIpv6 %}
+ <cidrIpv6>{{ item.CidrIpv6 }}</cidrIpv6>
+ {% endif %}
+ <description>{{ item.Description or '' }}</description>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>true</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ </item>
+ {% endfor %}
+ {% for item in rule.prefix_list_ids %}
+ <item>
+ <prefixListId>{{ item.PrefixListId }}</prefixListId>
+ <description>{{ item.Description or '' }}</description>
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>true</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ </item>
+ {% endfor %}
+ {% for item in rule.source_groups %}
+ <item>
+ {% if item.Description and item.Description != "" %}
+ <description>{{ item.Description }}</description>
+ {% endif %}
+ {% if rule.from_port is not none %}
+ <fromPort>{{ rule.from_port }}</fromPort>
+ {% endif %}
+ <groupId>{{ group.id }}</groupId>
+ <groupOwnerId>{{ rule.owner_id }}</groupOwnerId>
+ <ipProtocol>{{ rule.ip_protocol }}</ipProtocol>
+ <isEgress>true</isEgress>
+ <securityGroupRuleId>{{ rule.id }}</securityGroupRuleId>
+ {% if rule.to_port is not none %}
+ <toPort>{{ rule.to_port }}</toPort>
+ {% endif %}
+ <referencedGroupInfo>
+ {% if item.OwnerId and item.OwnerId != "" %}
+ <userId>{{ item.OwnerId }}</userId>
+ {% endif %}
+ {% if item.GroupId and item.GroupId != "" %}
+ <groupId>{{ item.GroupId }}</groupId>
+ {% endif %}
+ {% if item.VpcId and item.VpcId != "" %}
+ <vpcId>{{ item.VpcId }}</vpcId>
+ {% endif %}
+ </referencedGroupInfo>
+ </item>
+ {% endfor %}
+ </securityGroupRuleSet>
+</AuthorizeSecurityGroupEgressResponse>"""
+
+REVOKE_SECURITY_GROUP_EGRESS_RESPONSE = """<RevokeSecurityGroupEgressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</RevokeSecurityGroupEgressResponse>"""
+
+UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_INGRESS = """<UpdateSecurityGroupRuleDescriptionsIngressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</UpdateSecurityGroupRuleDescriptionsIngressResponse>"""
+
+UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_EGRESS = """<UpdateSecurityGroupRuleDescriptionsEgressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <return>true</return>
+</UpdateSecurityGroupRuleDescriptionsEgressResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/settings.py b/contrib/python/moto/py3/moto/ec2/responses/settings.py
new file mode 100644
index 0000000000..8cf2114cdc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/settings.py
@@ -0,0 +1,47 @@
+from moto.core.responses import BaseResponse
+
+
+class Settings(BaseResponse):
+ def disable_ebs_encryption_by_default(self):
+ if self.is_not_dryrun("DisableEbsEncryptionByDefault"):
+ self.ec2_backend.disable_ebs_encryption_by_default()
+ template = self.response_template(
+ DISABLE_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE
+ )
+ return template.render(ebsEncryptionByDefault=False).replace(
+ "False", "false"
+ )
+
+ def enable_ebs_encryption_by_default(self):
+ if self.is_not_dryrun("EnableEbsEncryptionByDefault"):
+ self.ec2_backend.enable_ebs_encryption_by_default()
+ template = self.response_template(
+ ENABLED_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE
+ )
+ return template.render(ebsEncryptionByDefault=True).replace("True", "true")
+
+ def get_ebs_encryption_by_default(self):
+ if self.is_not_dryrun("GetEbsEncryptionByDefault"):
+ result = self.ec2_backend.get_ebs_encryption_by_default()
+ template = self.response_template(GET_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE)
+ return (
+ template.render(ebsEncryptionByDefault=result)
+ .replace("False", "false")
+ .replace("True", "true")
+ )
+
+
+DISABLE_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE = """<DisableEbsEncryptionByDefaultResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>418c3f8f-3a1c-45c8-b59e-3722797a6449Example</requestId>
+ <ebsEncryptionByDefault>{{ ebsEncryptionByDefault }}</ebsEncryptionByDefault>
+</DisableEbsEncryptionByDefaultResponse>"""
+
+ENABLED_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE = """<EnableEbsEncryptionByDefaultResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>418c3f8f-3a1c-45c8-b59e-3722797a6449Example</requestId>
+ <ebsEncryptionByDefault>{{ ebsEncryptionByDefault }}</ebsEncryptionByDefault>
+</EnableEbsEncryptionByDefaultResponse>"""
+
+GET_EBS_ENCRYPTION_BY_DEFAULT_RESPONSE = """<GetEbsEncryptionByDefaultResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>418c3f8f-3a1c-45c8-b59e-3722797a6449Example</requestId>
+ <ebsEncryptionByDefault>{{ ebsEncryptionByDefault }}</ebsEncryptionByDefault>
+</GetEbsEncryptionByDefaultResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/spot_fleets.py b/contrib/python/moto/py3/moto/ec2/responses/spot_fleets.py
new file mode 100644
index 0000000000..c32ad9e19a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/spot_fleets.py
@@ -0,0 +1,174 @@
+from moto.core.responses import BaseResponse
+
+
+class SpotFleets(BaseResponse):
+ def cancel_spot_fleet_requests(self):
+ spot_fleet_request_ids = self._get_multi_param("SpotFleetRequestId.")
+ terminate_instances = self._get_param("TerminateInstances")
+ spot_fleets = self.ec2_backend.cancel_spot_fleet_requests(
+ spot_fleet_request_ids, terminate_instances
+ )
+ template = self.response_template(CANCEL_SPOT_FLEETS_TEMPLATE)
+ return template.render(spot_fleets=spot_fleets)
+
+ def describe_spot_fleet_instances(self):
+ spot_fleet_request_id = self._get_param("SpotFleetRequestId")
+
+ spot_requests = self.ec2_backend.describe_spot_fleet_instances(
+ spot_fleet_request_id
+ )
+ template = self.response_template(DESCRIBE_SPOT_FLEET_INSTANCES_TEMPLATE)
+ return template.render(
+ spot_request_id=spot_fleet_request_id, spot_requests=spot_requests
+ )
+
+ def describe_spot_fleet_requests(self):
+ spot_fleet_request_ids = self._get_multi_param("SpotFleetRequestId.")
+
+ requests = self.ec2_backend.describe_spot_fleet_requests(spot_fleet_request_ids)
+ template = self.response_template(DESCRIBE_SPOT_FLEET_TEMPLATE)
+ return template.render(requests=requests)
+
+ def modify_spot_fleet_request(self):
+ spot_fleet_request_id = self._get_param("SpotFleetRequestId")
+ target_capacity = self._get_int_param("TargetCapacity")
+ terminate_instances = self._get_param(
+ "ExcessCapacityTerminationPolicy", if_none="Default"
+ )
+ successful = self.ec2_backend.modify_spot_fleet_request(
+ spot_fleet_request_id, target_capacity, terminate_instances
+ )
+ template = self.response_template(MODIFY_SPOT_FLEET_REQUEST_TEMPLATE)
+ return template.render(successful=successful)
+
+ def request_spot_fleet(self):
+ spot_config = self._get_multi_param_dict("SpotFleetRequestConfig")
+ spot_price = spot_config.get("SpotPrice")
+ target_capacity = spot_config["TargetCapacity"]
+ iam_fleet_role = spot_config["IamFleetRole"]
+ allocation_strategy = spot_config["AllocationStrategy"]
+ instance_interruption_behaviour = spot_config.get(
+ "InstanceInterruptionBehavior"
+ )
+
+ launch_specs = spot_config.get("LaunchSpecifications")
+ launch_template_config = list(
+ self._get_params()
+ .get("SpotFleetRequestConfig", {})
+ .get("LaunchTemplateConfigs", {})
+ .values()
+ )
+
+ request = self.ec2_backend.request_spot_fleet(
+ spot_price=spot_price,
+ target_capacity=target_capacity,
+ iam_fleet_role=iam_fleet_role,
+ allocation_strategy=allocation_strategy,
+ launch_specs=launch_specs,
+ launch_template_config=launch_template_config,
+ instance_interruption_behaviour=instance_interruption_behaviour,
+ )
+
+ template = self.response_template(REQUEST_SPOT_FLEET_TEMPLATE)
+ return template.render(request=request)
+
+
+REQUEST_SPOT_FLEET_TEMPLATE = """<RequestSpotFleetResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>60262cc5-2bd4-4c8d-98ed-example</requestId>
+ <spotFleetRequestId>{{ request.id }}</spotFleetRequestId>
+</RequestSpotFleetResponse>"""
+
+MODIFY_SPOT_FLEET_REQUEST_TEMPLATE = """<ModifySpotFleetRequestResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>21681fea-9987-aef3-2121-example</requestId>
+ <return>{{ 'true' if successful else 'false' }}</return>
+</ModifySpotFleetRequestResponse>"""
+
+DESCRIBE_SPOT_FLEET_TEMPLATE = """<DescribeSpotFleetRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>4d68a6cc-8f2e-4be1-b425-example</requestId>
+ <spotFleetRequestConfigSet>
+ {% for request in requests %}
+ <item>
+ <spotFleetRequestId>{{ request.id }}</spotFleetRequestId>
+ <spotFleetRequestState>{{ request.state }}</spotFleetRequestState>
+ <spotFleetRequestConfig>
+ {% if request.spot_price %}
+ <spotPrice>{{ request.spot_price }}</spotPrice>
+ {% endif %}
+ <targetCapacity>{{ request.target_capacity }}</targetCapacity>
+ <iamFleetRole>{{ request.iam_fleet_role }}</iamFleetRole>
+ <allocationStrategy>{{ request.allocation_strategy }}</allocationStrategy>
+ <fulfilledCapacity>{{ request.fulfilled_capacity }}</fulfilledCapacity>
+ <launchSpecifications>
+ {% for launch_spec in request.launch_specs %}
+ <item>
+ <subnetId>{{ launch_spec.subnet_id }}</subnetId>
+ <ebsOptimized>{{ launch_spec.ebs_optimized }}</ebsOptimized>
+ <imageId>{{ launch_spec.image_id }}</imageId>
+ <instanceType>{{ launch_spec.instance_type }}</instanceType>
+ <iamInstanceProfile><arn>{{ launch_spec.iam_instance_profile }}</arn></iamInstanceProfile>
+ <keyName>{{ launch_spec.key_name }}</keyName>
+ <monitoring><enabled>{{ launch_spec.monitoring }}</enabled></monitoring>
+ {% if launch_spec.spot_price %}
+ <spotPrice>{{ launch_spec.spot_price }}</spotPrice>
+ {% endif %}
+ <userData>{{ launch_spec.user_data }}</userData>
+ <weightedCapacity>{{ launch_spec.weighted_capacity }}</weightedCapacity>
+ <groupSet>
+ {% for group in launch_spec.group_set %}
+ <item>
+ <groupId>{{ group }}</groupId>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <tagSpecificationSet>
+ {% for resource_type in launch_spec.tag_specifications %}
+ <item>
+ <resourceType>{{ resource_type }}</resourceType>
+ <tag>
+ {% for key, value in launch_spec.tag_specifications[resource_type].items() %}
+ <item>
+ <key>{{ key }}</key>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ </tag>
+ </item>
+ {% endfor %}
+ </tagSpecificationSet>
+ </item>
+ {% endfor %}
+ </launchSpecifications>
+ </spotFleetRequestConfig>
+ </item>
+ {% endfor %}
+ </spotFleetRequestConfigSet>
+</DescribeSpotFleetRequestsResponse>"""
+
+DESCRIBE_SPOT_FLEET_INSTANCES_TEMPLATE = """<DescribeSpotFleetInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>cfb09950-45e2-472d-a6a9-example</requestId>
+ <spotFleetRequestId>{{ spot_request_id }}</spotFleetRequestId>
+ <activeInstanceSet>
+ {% for spot_request in spot_requests %}
+ <item>
+ <instanceId>{{ spot_request.instance.id }}</instanceId>
+ <spotInstanceRequestId>{{ spot_request.id }}</spotInstanceRequestId>
+ <instanceType>{{ spot_request.instance.instance_type }}</instanceType>
+ </item>
+ {% endfor %}
+ </activeInstanceSet>
+</DescribeSpotFleetInstancesResponse>
+"""
+
+CANCEL_SPOT_FLEETS_TEMPLATE = """<CancelSpotFleetRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2016-09-15/">
+ <requestId>e12d2fe5-6503-4b4b-911c-example</requestId>
+ <unsuccessfulFleetRequestSet/>
+ <successfulFleetRequestSet>
+ {% for spot_fleet in spot_fleets %}
+ <item>
+ <spotFleetRequestId>{{ spot_fleet.id }}</spotFleetRequestId>
+ <currentSpotFleetRequestState>cancelled_terminating</currentSpotFleetRequestState>
+ <previousSpotFleetRequestState>active</previousSpotFleetRequestState>
+ </item>
+ {% endfor %}
+ </successfulFleetRequestSet>
+</CancelSpotFleetRequestsResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/spot_instances.py b/contrib/python/moto/py3/moto/ec2/responses/spot_instances.py
new file mode 100644
index 0000000000..05de98eb9d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/spot_instances.py
@@ -0,0 +1,257 @@
+from ._base_response import EC2BaseResponse
+
+
+class SpotInstances(EC2BaseResponse):
+ def cancel_spot_instance_requests(self):
+ request_ids = self._get_multi_param("SpotInstanceRequestId")
+ if self.is_not_dryrun("CancelSpotInstance"):
+ requests = self.ec2_backend.cancel_spot_instance_requests(request_ids)
+ template = self.response_template(CANCEL_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+ def create_spot_datafeed_subscription(self):
+ if self.is_not_dryrun("CreateSpotDatafeedSubscription"):
+ raise NotImplementedError(
+ "SpotInstances.create_spot_datafeed_subscription is not yet implemented"
+ )
+
+ def delete_spot_datafeed_subscription(self):
+ if self.is_not_dryrun("DeleteSpotDatafeedSubscription"):
+ raise NotImplementedError(
+ "SpotInstances.delete_spot_datafeed_subscription is not yet implemented"
+ )
+
+ def describe_spot_datafeed_subscription(self):
+ raise NotImplementedError(
+ "SpotInstances.describe_spot_datafeed_subscription is not yet implemented"
+ )
+
+ def describe_spot_instance_requests(self):
+ spot_instance_ids = self._get_multi_param("SpotInstanceRequestId")
+ filters = self._filters_from_querystring()
+ requests = self.ec2_backend.describe_spot_instance_requests(
+ filters=filters, spot_instance_ids=spot_instance_ids
+ )
+ template = self.response_template(DESCRIBE_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+ def describe_spot_price_history(self):
+ instance_types_filters = self._get_multi_param("InstanceType")
+ filter_dict = self._filters_from_querystring()
+ prices = self.ec2_backend.describe_spot_price_history(
+ instance_types_filters, filter_dict
+ )
+ template = self.response_template(DESCRIBE_SPOT_PRICE_HISTORY_TEMPLATE)
+ return template.render(prices=prices)
+
+ def request_spot_instances(self):
+ price = self._get_param("SpotPrice")
+ image_id = self._get_param("LaunchSpecification.ImageId")
+ count = self._get_int_param("InstanceCount", 1)
+ spot_instance_type = self._get_param("Type", "one-time")
+ valid_from = self._get_param("ValidFrom")
+ valid_until = self._get_param("ValidUntil")
+ launch_group = self._get_param("LaunchGroup")
+ availability_zone_group = self._get_param("AvailabilityZoneGroup")
+ key_name = self._get_param("LaunchSpecification.KeyName")
+ security_groups = self._get_multi_param("LaunchSpecification.SecurityGroup")
+ user_data = self._get_param("LaunchSpecification.UserData")
+ instance_type = self._get_param("LaunchSpecification.InstanceType", "m1.small")
+ placement = self._get_param("LaunchSpecification.Placement.AvailabilityZone")
+ kernel_id = self._get_param("LaunchSpecification.KernelId")
+ ramdisk_id = self._get_param("LaunchSpecification.RamdiskId")
+ monitoring_enabled = self._get_param("LaunchSpecification.Monitoring.Enabled")
+ subnet_id = self._get_param("LaunchSpecification.SubnetId")
+ instance_interruption_behaviour = self._get_param(
+ "InstanceInterruptionBehavior"
+ )
+ tags = self._parse_tag_specification()
+
+ if self.is_not_dryrun("RequestSpotInstance"):
+ requests = self.ec2_backend.request_spot_instances(
+ price=price,
+ image_id=image_id,
+ count=count,
+ spot_instance_type=spot_instance_type,
+ valid_from=valid_from,
+ valid_until=valid_until,
+ launch_group=launch_group,
+ availability_zone_group=availability_zone_group,
+ key_name=key_name,
+ security_groups=security_groups,
+ user_data=user_data,
+ instance_type=instance_type,
+ placement=placement,
+ kernel_id=kernel_id,
+ ramdisk_id=ramdisk_id,
+ monitoring_enabled=monitoring_enabled,
+ subnet_id=subnet_id,
+ instance_interruption_behaviour=instance_interruption_behaviour,
+ tags=tags,
+ )
+
+ template = self.response_template(REQUEST_SPOT_INSTANCES_TEMPLATE)
+ return template.render(requests=requests)
+
+
+REQUEST_SPOT_INSTANCES_TEMPLATE = """<RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <spotPrice>{{ request.price }}</spotPrice>
+ <type>{{ request.type }}</type>
+ <state>{{ request.state }}</state>
+ <status>
+ <code>{{ request.status }}</code>
+ <updateTime>2015-01-01T00:00:00.000Z</updateTime>
+ <message>{{ request.status_message }}</message>
+ </status>
+ <instanceId>{{ request.instance_id }}</instanceId>
+ <availabilityZoneGroup>{{ request.availability_zone_group }}</availabilityZoneGroup>
+ <launchSpecification>
+ <imageId>{{ request.launch_specification.image_id }}</imageId>
+ <keyName>{{ request.launch_specification.key_name }}</keyName>
+ <groupSet>
+ {% for group in request.launch_specification.groups %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ <kernelId>{{ request.launch_specification.kernel }}</kernelId>
+ <ramdiskId>{{ request.launch_specification.ramdisk }}</ramdiskId>
+ <subnetId>{{ request.launch_specification.subnet_id }}</subnetId>
+ <instanceType>{{ request.launch_specification.instance_type }}</instanceType>
+ <blockDeviceMapping/>
+ <monitoring>
+ <enabled>{{ request.launch_specification.monitored }}</enabled>
+ </monitoring>
+ <ebsOptimized>{{ request.launch_specification.ebs_optimized }}</ebsOptimized>
+ <PlacementRequestType>
+ <availabilityZone>{{ request.launch_specification.placement }}</availabilityZone>
+ <groupName></groupName>
+ </PlacementRequestType>
+ </launchSpecification>
+ <launchGroup>{{ request.launch_group }}</launchGroup>
+ <createTime>2015-01-01T00:00:00.000Z</createTime>
+ {% if request.valid_from %}
+ <validFrom>{{ request.valid_from }}</validFrom>
+ {% endif %}
+ {% if request.valid_until %}
+ <validUntil>{{ request.valid_until }}</validUntil>
+ {% endif %}
+ <productDescription>Linux/UNIX</productDescription>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</RequestSpotInstancesResponse>"""
+
+DESCRIBE_SPOT_INSTANCES_TEMPLATE = """<DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <spotPrice>{{ request.price }}</spotPrice>
+ <type>{{ request.type }}</type>
+ <state>{{ request.state }}</state>
+ <status>
+ <code>{{ request.status }}</code>
+ <updateTime>2015-01-01T00:00:00.000Z</updateTime>
+ <message>{{ request.status_message }}</message>
+ </status>
+ <instanceId>{{ request.instance.id }}</instanceId>
+ {% if request.availability_zone_group %}
+ <availabilityZoneGroup>{{ request.availability_zone_group }}</availabilityZoneGroup>
+ {% endif %}
+ <launchSpecification>
+ <imageId>{{ request.launch_specification.image_id }}</imageId>
+ {% if request.launch_specification.key_name %}
+ <keyName>{{ request.launch_specification.key_name }}</keyName>
+ {% endif %}
+ <groupSet>
+ {% for group in request.launch_specification.groups %}
+ <item>
+ <groupId>{{ group.id }}</groupId>
+ <groupName>{{ group.name }}</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% if request.launch_specification.kernel %}
+ <kernelId>{{ request.launch_specification.kernel }}</kernelId>
+ {% endif %}
+ {% if request.launch_specification.ramdisk %}
+ <ramdiskId>{{ request.launch_specification.ramdisk }}</ramdiskId>
+ {% endif %}
+ {% if request.launch_specification.subnet_id %}
+ <subnetId>{{ request.launch_specification.subnet_id }}</subnetId>
+ {% endif %}
+ <instanceType>{{ request.launch_specification.instance_type }}</instanceType>
+ <blockDeviceMapping/>
+ <monitoring>
+ <enabled>{{ request.launch_specification.monitored }}</enabled>
+ </monitoring>
+ <ebsOptimized>{{ request.launch_specification.ebs_optimized }}</ebsOptimized>
+ {% if request.launch_specification.placement %}
+ <PlacementRequestType>
+ <availabilityZone>{{ request.launch_specification.placement }}</availabilityZone>
+ <groupName></groupName>
+ </PlacementRequestType>
+ {% endif %}
+ </launchSpecification>
+ <tagSet>
+ {% for tag in request.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% if request.launch_group %}
+ <launchGroup>{{ request.launch_group }}</launchGroup>
+ {% endif %}
+ <createTime>2015-01-01T00:00:00.000Z</createTime>
+ {% if request.valid_from %}
+ <validFrom>{{ request.valid_from }}</validFrom>
+ {% endif %}
+ {% if request.valid_until %}
+ <validUntil>{{ request.valid_until }}</validUntil>
+ {% endif %}
+ <productDescription>Linux/UNIX</productDescription>
+ <instanceInterruptionBehavior>{{ request.instance_interruption_behaviour }}</instanceInterruptionBehavior>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</DescribeSpotInstanceRequestsResponse>"""
+
+CANCEL_SPOT_INSTANCES_TEMPLATE = """<CancelSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotInstanceRequestSet>
+ {% for request in requests %}
+ <item>
+ <spotInstanceRequestId>{{ request.id }}</spotInstanceRequestId>
+ <state>cancelled</state>
+ </item>
+ {% endfor %}
+ </spotInstanceRequestSet>
+</CancelSpotInstanceRequestsResponse>"""
+
+DESCRIBE_SPOT_PRICE_HISTORY_TEMPLATE = """<DescribeSpotPriceHistoryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <spotPriceHistorySet>
+ {% for price in prices %}
+ <item>
+ <instanceType>{{ price.InstanceType }}</instanceType>
+ <productDescription>Linux/UNIX (Amazon VPC)</productDescription>
+ <spotPrice>0.00001</spotPrice>
+ <availabilityZone>{{ price.Location }}</availabilityZone>
+ <timestamp>2006-01-02T15:04:05.999999999Z</timestamp>
+ </item>
+ {% endfor %}
+ </spotPriceHistorySet>
+ </DescribeSpotPriceHistoryResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/subnets.py b/contrib/python/moto/py3/moto/ec2/responses/subnets.py
new file mode 100644
index 0000000000..a821497680
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/subnets.py
@@ -0,0 +1,210 @@
+import random
+from moto.core.utils import camelcase_to_underscores
+
+from ._base_response import EC2BaseResponse
+
+
+class Subnets(EC2BaseResponse):
+ def create_subnet(self):
+ vpc_id = self._get_param("VpcId")
+ cidr_block = self._get_param("CidrBlock")
+ ipv6_cidr_block = self._get_param("Ipv6CidrBlock")
+ availability_zone = self._get_param("AvailabilityZone")
+ availability_zone_id = self._get_param("AvailabilityZoneId")
+ tags = self._get_multi_param("TagSpecification")
+ if tags:
+ tags = tags[0].get("Tag")
+
+ if not availability_zone and not availability_zone_id:
+ availability_zone = random.choice(
+ self.ec2_backend.describe_availability_zones()
+ ).name
+ subnet = self.ec2_backend.create_subnet(
+ vpc_id,
+ cidr_block,
+ ipv6_cidr_block,
+ availability_zone,
+ availability_zone_id,
+ tags=tags,
+ )
+ template = self.response_template(CREATE_SUBNET_RESPONSE)
+ return template.render(subnet=subnet)
+
+ def delete_subnet(self):
+ subnet_id = self._get_param("SubnetId")
+ subnet = self.ec2_backend.delete_subnet(subnet_id)
+ template = self.response_template(DELETE_SUBNET_RESPONSE)
+ return template.render(subnet=subnet)
+
+ def describe_subnets(self):
+ self.error_on_dryrun()
+ subnet_ids = self._get_multi_param("SubnetId")
+ filters = self._filters_from_querystring()
+ subnets = self.ec2_backend.get_all_subnets(subnet_ids, filters)
+ template = self.response_template(DESCRIBE_SUBNETS_RESPONSE)
+ return template.render(subnets=subnets)
+
+ def modify_subnet_attribute(self):
+ subnet_id = self._get_param("SubnetId")
+
+ for attribute in ("MapPublicIpOnLaunch", "AssignIpv6AddressOnCreation"):
+ if self.querystring.get("%s.Value" % attribute):
+ attr_name = camelcase_to_underscores(attribute)
+ attr_value = self.querystring.get("%s.Value" % attribute)[0]
+ self.ec2_backend.modify_subnet_attribute(
+ subnet_id, attr_name, attr_value
+ )
+ return MODIFY_SUBNET_ATTRIBUTE_RESPONSE
+
+ def associate_subnet_cidr_block(self):
+ ipv6_cidr_block = self._get_param("Ipv6CidrBlock")
+ subnet_id = self._get_param("SubnetId")
+
+ association = self.ec2_backend.associate_subnet_cidr_block(
+ subnet_id, ipv6_cidr_block
+ )
+ template = self.response_template(ASSOCIATE_SUBNET_CIDR_BLOCK_RESPONSE)
+ return template.render(subnet_id=subnet_id, association=association)
+
+ def disassociate_subnet_cidr_block(self):
+ association_id = self._get_param("AssociationId")
+
+ subnet_id, association = self.ec2_backend.disassociate_subnet_cidr_block(
+ association_id
+ )
+ template = self.response_template(DISASSOCIATE_SUBNET_CIDR_BLOCK_RESPONSE)
+ result = template.render(subnet_id=subnet_id, association=association)
+ return result
+
+
+CREATE_SUBNET_RESPONSE = """
+<CreateSubnetResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <subnet>
+ <subnetId>{{ subnet.id }}</subnetId>
+ <state>pending</state>
+ <vpcId>{{ subnet.vpc_id }}</vpcId>
+ <cidrBlock>{{ subnet.cidr_block }}</cidrBlock>
+ <availableIpAddressCount>{{ subnet.available_ip_addresses or '0' }}</availableIpAddressCount>
+ <availabilityZone>{{ subnet._availability_zone.name }}</availabilityZone>
+ <availabilityZoneId>{{ subnet._availability_zone.zone_id }}</availabilityZoneId>
+ <defaultForAz>{{ subnet.default_for_az }}</defaultForAz>
+ <mapPublicIpOnLaunch>{{ subnet.map_public_ip_on_launch }}</mapPublicIpOnLaunch>
+ <ownerId>{{ subnet.owner_id }}</ownerId>
+ <assignIpv6AddressOnCreation>{{ 'false' if not subnet.assign_ipv6_address_on_creation or subnet.assign_ipv6_address_on_creation == 'false' else 'true'}}</assignIpv6AddressOnCreation>
+ <ipv6CidrBlockAssociationSet>
+ {% for ipv6_association in subnet.ipv6_cidr_block_associations.values() %}
+ {% if ipv6_association.ipv6CidrBlockState == "associated" %}
+ <item>
+ <ipv6CidrBlock>{{ ipv6_association.ipv6CidrBlock }}</ipv6CidrBlock>
+ <associationId>{{ ipv6_association.associationId }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{ ipv6_association.ipv6CidrBlockState }}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ <ipv6Native>{{ 'false' if not subnet.ipv6_native else 'true' }}</ipv6Native>
+ <subnetArn>arn:aws:ec2:{{ subnet._availability_zone.name[0:-1] }}:{{ subnet.owner_id }}:subnet/{{ subnet.id }}</subnetArn>
+ <tagSet>
+ {% for tag in subnet.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </subnet>
+</CreateSubnetResponse>"""
+
+DELETE_SUBNET_RESPONSE = """
+<DeleteSubnetResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteSubnetResponse>"""
+
+DESCRIBE_SUBNETS_RESPONSE = """
+<DescribeSubnetsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <subnetSet>
+ {% for subnet in subnets %}
+ <item>
+ <subnetId>{{ subnet.id }}</subnetId>
+ <state>{{ subnet.state }}</state>
+ <vpcId>{{ subnet.vpc_id }}</vpcId>
+ <cidrBlock>{{ subnet.cidr_block }}</cidrBlock>
+ <availableIpAddressCount>{{ subnet.available_ip_addresses or '0' }}</availableIpAddressCount>
+ <availabilityZone>{{ subnet._availability_zone.name }}</availabilityZone>
+ <availabilityZoneId>{{ subnet._availability_zone.zone_id }}</availabilityZoneId>
+ <defaultForAz>{{ subnet.default_for_az }}</defaultForAz>
+ <mapPublicIpOnLaunch>{{ subnet.map_public_ip_on_launch }}</mapPublicIpOnLaunch>
+ <ownerId>{{ subnet.owner_id }}</ownerId>
+ <assignIpv6AddressOnCreation>{{ 'false' if not subnet.assign_ipv6_address_on_creation or subnet.assign_ipv6_address_on_creation == 'false' else 'true'}}</assignIpv6AddressOnCreation>
+ <ipv6CidrBlockAssociationSet>
+ {% for ipv6_association in subnet.ipv6_cidr_block_associations.values() %}
+ {% if ipv6_association.ipv6CidrBlockState == "associated" %}
+ <item>
+ <ipv6CidrBlock>{{ ipv6_association.ipv6CidrBlock }}</ipv6CidrBlock>
+ <associationId>{{ ipv6_association.associationId }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{ ipv6_association.ipv6CidrBlockState }}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ <subnetArn>arn:aws:ec2:{{ subnet._availability_zone.name[0:-1] }}:{{ subnet.owner_id }}:subnet/{{ subnet.id }}</subnetArn>
+ <ipv6Native>{{ 'false' if not subnet.ipv6_native else 'true' }}</ipv6Native>
+ {% if subnet.get_tags() %}
+ <tagSet>
+ {% for tag in subnet.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </subnetSet>
+</DescribeSubnetsResponse>"""
+
+MODIFY_SUBNET_ATTRIBUTE_RESPONSE = """
+<ModifySubnetAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</ModifySubnetAttributeResponse>"""
+
+ASSOCIATE_SUBNET_CIDR_BLOCK_RESPONSE = """
+<AssociateSubnetCidrBlock xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <subnetId>{{ subnet_id }}</subnetId>
+ <ipv6CidrBlockAssociation>
+ <ipv6CidrBlock>{{ association.ipv6CidrBlock }}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{ association.ipv6CidrBlockState }}</state>
+ </ipv6CidrBlockState>
+ <associationId>{{ association.associationId }}</associationId>
+ </ipv6CidrBlockAssociation>
+</AssociateSubnetCidrBlock>
+"""
+
+DISASSOCIATE_SUBNET_CIDR_BLOCK_RESPONSE = """
+<DisassociateSubnetCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
+ <subnetId>{{ subnet_id }}</subnetId>
+ <ipv6CidrBlockAssociation>
+ <ipv6CidrBlock>{{ association.ipv6CidrBlock }}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{ association.ipv6CidrBlockState }}</state>
+ </ipv6CidrBlockState>
+ <associationId>{{ association.associationId }}</associationId>
+ </ipv6CidrBlockAssociation>
+</DisassociateSubnetCidrBlockResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/tags.py b/contrib/python/moto/py3/moto/ec2/responses/tags.py
new file mode 100644
index 0000000000..f36839c688
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/tags.py
@@ -0,0 +1,53 @@
+from moto.ec2.models import validate_resource_ids
+from moto.core.utils import tags_from_query_string
+from ._base_response import EC2BaseResponse
+
+
+class TagResponse(EC2BaseResponse):
+ def create_tags(self):
+ resource_ids = self._get_multi_param("ResourceId")
+ validate_resource_ids(resource_ids)
+ self.ec2_backend.do_resources_exist(resource_ids)
+ tags = tags_from_query_string(self.querystring)
+ if self.is_not_dryrun("CreateTags"):
+ self.ec2_backend.create_tags(resource_ids, tags)
+ return CREATE_RESPONSE
+
+ def delete_tags(self):
+ resource_ids = self._get_multi_param("ResourceId")
+ validate_resource_ids(resource_ids)
+ tags = tags_from_query_string(self.querystring)
+ if self.is_not_dryrun("DeleteTags"):
+ self.ec2_backend.delete_tags(resource_ids, tags)
+ return DELETE_RESPONSE
+
+ def describe_tags(self):
+ filters = self._filters_from_querystring()
+ tags = self.ec2_backend.describe_tags(filters=filters)
+ template = self.response_template(DESCRIBE_RESPONSE)
+ return template.render(tags=tags)
+
+
+CREATE_RESPONSE = """<CreateTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</CreateTagsResponse>"""
+
+DELETE_RESPONSE = """<DeleteTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteTagsResponse>"""
+
+DESCRIBE_RESPONSE = """<DescribeTagsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <tagSet>
+ {% for tag in tags %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+</DescribeTagsResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_attachments.py b/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_attachments.py
new file mode 100644
index 0000000000..03582c6291
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_attachments.py
@@ -0,0 +1,477 @@
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class TransitGatewayAttachment(EC2BaseResponse):
+ def create_transit_gateway_vpc_attachment(self):
+ options = self._get_multi_param_dict("Options")
+ subnet_ids = self._get_multi_param("SubnetIds")
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ vpc_id = self._get_param("VpcId")
+
+ tags = self._get_multi_param("TagSpecifications")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+
+ transit_gateway_attachment = (
+ self.ec2_backend.create_transit_gateway_vpc_attachment(
+ transit_gateway_id=transit_gateway_id,
+ tags=tags,
+ vpc_id=vpc_id,
+ subnet_ids=subnet_ids,
+ options=options,
+ )
+ )
+ template = self.response_template(CREATE_TRANSIT_GATEWAY_VPC_ATTACHMENT)
+ return template.render(transit_gateway_attachment=transit_gateway_attachment)
+
+ def describe_transit_gateway_vpc_attachments(self):
+ transit_gateways_attachment_ids = self._get_multi_param(
+ "TransitGatewayAttachmentIds"
+ )
+ filters = self._filters_from_querystring()
+ transit_gateway_vpc_attachments = (
+ self.ec2_backend.describe_transit_gateway_vpc_attachments(
+ transit_gateways_attachment_ids=transit_gateways_attachment_ids,
+ filters=filters,
+ )
+ )
+ template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_VPC_ATTACHMENTS)
+ return template.render(
+ transit_gateway_vpc_attachments=transit_gateway_vpc_attachments
+ )
+
+ def modify_transit_gateway_vpc_attachment(self):
+ add_subnet_ids = self._get_multi_param("AddSubnetIds")
+ options = self._get_multi_param_dict("Options")
+ remove_subnet_ids = self._get_multi_param("RemoveSubnetIds")
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+
+ transit_gateway_attachment = (
+ self.ec2_backend.modify_transit_gateway_vpc_attachment(
+ add_subnet_ids=add_subnet_ids,
+ options=options,
+ remove_subnet_ids=remove_subnet_ids,
+ transit_gateway_attachment_id=transit_gateway_attachment_id,
+ )
+ )
+ template = self.response_template(MODIFY_TRANSIT_GATEWAY_VPC_ATTACHMENTS)
+ return template.render(transit_gateway_attachment=transit_gateway_attachment)
+
+ def describe_transit_gateway_attachments(self):
+ transit_gateways_attachment_ids = self._get_multi_param(
+ "TransitGatewayAttachmentIds"
+ )
+ filters = self._filters_from_querystring()
+ transit_gateway_attachments = (
+ self.ec2_backend.describe_transit_gateway_attachments(
+ transit_gateways_attachment_ids=transit_gateways_attachment_ids,
+ filters=filters,
+ )
+ )
+ template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_ATTACHMENTS)
+ return template.render(transit_gateway_attachments=transit_gateway_attachments)
+
+ def delete_transit_gateway_vpc_attachment(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_attachment = (
+ self.ec2_backend.delete_transit_gateway_vpc_attachment(
+ transit_gateway_attachment_id=transit_gateway_attachment_id
+ )
+ )
+ template = self.response_template(DELETE_TRANSIT_GATEWAY_VPC_ATTACHMENTS)
+ return template.render(transit_gateway_attachment=transit_gateway_attachment)
+
+ def associate_transit_gateway_route_table(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ transit_gateway_association = (
+ self.ec2_backend.associate_transit_gateway_route_table(
+ transit_gateway_attachment_id=transit_gateway_attachment_id,
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_ASSOCIATION)
+ return template.render(transit_gateway_association=transit_gateway_association)
+
+ def disassociate_transit_gateway_route_table(self):
+ tgw_attach_id = self._get_param("TransitGatewayAttachmentId")
+ tgw_rt_id = self._get_param("TransitGatewayRouteTableId")
+
+ tgw_association = self.ec2_backend.disassociate_transit_gateway_route_table(
+ tgw_attach_id, tgw_rt_id
+ )
+ template = self.response_template(TRANSIT_GATEWAY_DISASSOCIATION)
+ return template.render(tgw_association=tgw_association)
+
+ def enable_transit_gateway_route_table_propagation(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ transit_gateway_propagation = (
+ self.ec2_backend.enable_transit_gateway_route_table_propagation(
+ transit_gateway_attachment_id=transit_gateway_attachment_id,
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PROPAGATION)
+ return template.render(transit_gateway_propagation=transit_gateway_propagation)
+
+ def disable_transit_gateway_route_table_propagation(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ transit_gateway_propagation = (
+ self.ec2_backend.disable_transit_gateway_route_table_propagation(
+ transit_gateway_attachment_id=transit_gateway_attachment_id,
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PROPAGATION)
+ return template.render(transit_gateway_propagation=transit_gateway_propagation)
+
+ def create_transit_gateway_peering_attachment(self):
+ peer_account_id = self._get_param("PeerAccountId")
+ peer_region = self._get_param("PeerRegion")
+ peer_transit_gateway_id = self._get_param("PeerTransitGatewayId")
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ tags = add_tag_specification(self._get_multi_param("TagSpecification"))
+ transit_gateway_peering_attachment = (
+ self.ec2_backend.create_transit_gateway_peering_attachment(
+ transit_gateway_id,
+ peer_transit_gateway_id,
+ peer_region,
+ peer_account_id,
+ tags,
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PEERING_ATTACHMENT)
+ return template.render(
+ method_name="CreateTransitGatewayPeeringAttachment",
+ transit_gateway_peering_attachment=transit_gateway_peering_attachment,
+ )
+
+ def describe_transit_gateway_peering_attachments(self):
+ transit_gateways_attachment_ids = self._get_multi_param(
+ "TransitGatewayAttachmentIds"
+ )
+ filters = self._filters_from_querystring()
+ transit_gateway_peering_attachments = (
+ self.ec2_backend.describe_transit_gateway_peering_attachments(
+ transit_gateways_attachment_ids=transit_gateways_attachment_ids,
+ filters=filters,
+ )
+ )
+ template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_PEERING_ATTACHMENTS)
+ return template.render(
+ transit_gateway_peering_attachments=transit_gateway_peering_attachments
+ )
+
+ def accept_transit_gateway_peering_attachment(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_peering_attachment = (
+ self.ec2_backend.accept_transit_gateway_peering_attachment(
+ transit_gateway_attachment_id=transit_gateway_attachment_id
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PEERING_ATTACHMENT)
+ return template.render(
+ method_name="AcceptTransitGatewayPeeringAttachment",
+ transit_gateway_peering_attachment=transit_gateway_peering_attachment,
+ )
+
+ def delete_transit_gateway_peering_attachment(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_peering_attachment = (
+ self.ec2_backend.delete_transit_gateway_peering_attachment(
+ transit_gateway_attachment_id=transit_gateway_attachment_id
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PEERING_ATTACHMENT)
+ return template.render(
+ method_name="DeleteTransitGatewayPeeringAttachment",
+ transit_gateway_peering_attachment=transit_gateway_peering_attachment,
+ )
+
+ def reject_transit_gateway_peering_attachment(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ transit_gateway_peering_attachment = (
+ self.ec2_backend.reject_transit_gateway_peering_attachment(
+ transit_gateway_attachment_id=transit_gateway_attachment_id
+ )
+ )
+ template = self.response_template(TRANSIT_GATEWAY_PEERING_ATTACHMENT)
+ return template.render(
+ method_name="RejectTransitGatewayPeeringAttachment",
+ transit_gateway_peering_attachment=transit_gateway_peering_attachment,
+ )
+
+
+CREATE_TRANSIT_GATEWAY_VPC_ATTACHMENT = """<CreateTransitGatewayVpcAttachmentResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>9b5766ac-2af6-4b92-9a8a-4d74ae46ae79</requestId>
+ <transitGatewayVpcAttachment>
+ <createTime>{{ transit_gateway_attachment.create_time }}</createTime>
+ <options>
+ <applianceModeSupport>{{ transit_gateway_attachment.options.ApplianceModeSupport }}</applianceModeSupport>
+ <dnsSupport>{{ transit_gateway_attachment.options.DnsSupport }}</dnsSupport>
+ <ipv6Support>{{ transit_gateway_attachment.options.Ipv6Support }}</ipv6Support>
+ </options>
+ <state>{{ transit_gateway_attachment.state }}</state>
+ <subnetIds>
+ {% for subnet_id in transit_gateway_attachment.subnet_ids %}
+ <item>{{ subnet_id }}</item>
+ {% endfor %}
+ </subnetIds>
+ <tagSet>
+ {% for tag in transit_gateway_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_attachment.id }}</transitGatewayAttachmentId>
+ <transitGatewayId>{{ transit_gateway_attachment.transit_gateway_id }}</transitGatewayId>
+ <vpcId>{{ transit_gateway_attachment.vpc_id }}</vpcId>
+ <vpcOwnerId>{{ transit_gateway_attachment.resource_owner_id }}</vpcOwnerId>
+ </transitGatewayVpcAttachment>
+</CreateTransitGatewayVpcAttachmentResponse>"""
+
+
+DESCRIBE_TRANSIT_GATEWAY_ATTACHMENTS = """<DescribeTransitGatewayAttachmentsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>92aa7885-74c0-42d1-a846-e59bd07488a7</requestId>
+ <transitGatewayAttachments>
+ {% for transit_gateway_attachment in transit_gateway_attachments %}
+ <item>
+ <association>
+ <state>associated</state>
+ <transitGatewayRouteTableId>tgw-rtb-0b36edb9b88f0d5e3</transitGatewayRouteTableId>
+ </association>
+ <creationTime>2021-07-18T08:57:21.000Z</creationTime>
+ <resourceId>{{ transit_gateway_attachment.resource_id }}</resourceId>
+ <resourceOwnerId>{{ transit_gateway_attachment.resource_owner_id }}</resourceOwnerId>
+ <resourceType>{{ transit_gateway_attachment.resource_type }}</resourceType>
+ <state>{{ transit_gateway_attachment.state }}</state>
+ <tagSet>
+ {% for tag in transit_gateway_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_attachment.id }}</transitGatewayAttachmentId>
+ <transitGatewayId>{{ transit_gateway_attachment.transit_gateway_id }}</transitGatewayId>
+ <transitGatewayOwnerId>{{ transit_gateway_attachment.resource_owner_id }}</transitGatewayOwnerId>
+ </item>
+ {% endfor %}
+ </transitGatewayAttachments>
+</DescribeTransitGatewayAttachmentsResponse>
+"""
+
+
+DESCRIBE_TRANSIT_GATEWAY_VPC_ATTACHMENTS = """<DescribeTransitGatewayVpcAttachmentsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>bebc9670-0205-4f28-ad89-049c97e46633</requestId>
+ <transitGatewayVpcAttachments>
+ {% for transit_gateway_vpc_attachment in transit_gateway_vpc_attachments %}
+ <item>
+ <creationTime>2021-07-18T08:57:21.000Z</creationTime>
+ {% if transit_gateway_vpc_attachment.options %}
+ <options>
+ <applianceModeSupport>{{ transit_gateway_vpc_attachment.options.ApplianceModeSupport }}</applianceModeSupport>
+ <dnsSupport>{{ transit_gateway_vpc_attachment.options.DnsSupport }}</dnsSupport>
+ <ipv6Support>{{ transit_gateway_vpc_attachment.options.Ipv6Support }}</ipv6Support>
+ </options>
+ {% endif %}
+ <state>{{ transit_gateway_vpc_attachment.state }}</state>
+ <subnetIds>
+ {% for id in transit_gateway_vpc_attachment.subnet_ids %}
+ <item>{{ id }}</item>
+ {% endfor %}
+ </subnetIds>
+ <tagSet>
+ {% for tag in transit_gateway_vpc_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_vpc_attachment.id }}</transitGatewayAttachmentId>
+ <transitGatewayId>{{ transit_gateway_vpc_attachment.transit_gateway_id }}</transitGatewayId>
+ <vpcId>{{ transit_gateway_vpc_attachment.vpc_id }}</vpcId>
+ <vpcOwnerId>{{ transit_gateway_vpc_attachment.resource_owner_id }}</vpcOwnerId>
+ </item>
+ {% endfor %}
+ </transitGatewayVpcAttachments>
+</DescribeTransitGatewayVpcAttachmentsResponse>
+"""
+
+
+MODIFY_TRANSIT_GATEWAY_VPC_ATTACHMENTS = """<ModifyTransitGatewayVpcAttachmentResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>9b5766ac-2af6-4b92-9a8a-4d74ae46ae79</requestId>
+ <transitGatewayVpcAttachment>
+ <createTime>{{ transit_gateway_attachment.create_time }}</createTime>
+ <options>
+ <applianceModeSupport>{{ transit_gateway_attachment.options.ApplianceModeSupport }}</applianceModeSupport>
+ <dnsSupport>{{ transit_gateway_attachment.options.DnsSupport }}</dnsSupport>
+ <ipv6Support>{{ transit_gateway_attachment.options.Ipv6Support }}</ipv6Support>
+ </options>
+ <state>{{ transit_gateway_attachment.state }}</state>
+ <subnetIds>
+ {% for subnet_id in transit_gateway_attachment.subnet_ids %}
+ <item>{{ subnet_id }}</item>
+ {% endfor %}
+ </subnetIds>
+ <tagSet>
+ {% for tag in transit_gateway_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_attachment.id }}</transitGatewayAttachmentId>
+ <transitGatewayId>{{ transit_gateway_attachment.transit_gateway_id }}</transitGatewayId>
+ <vpcId>{{ transit_gateway_attachment.vpc_id }}</vpcId>
+ <vpcOwnerId>{{ transit_gateway_attachment.resource_owner_id }}</vpcOwnerId>
+ </transitGatewayVpcAttachment>
+</ModifyTransitGatewayVpcAttachmentResponse>"""
+
+
+DELETE_TRANSIT_GATEWAY_VPC_ATTACHMENTS = """<DeleteTransitGatewayVpcAttachmentResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>9b5766ac-2af6-4b92-9a8a-4d74ae46ae79</requestId>
+ <transitGatewayVpcAttachment>
+ <createTime>{{ transit_gateway_attachment.create_time }}</createTime>
+ <options>
+ <applianceModeSupport>{{ transit_gateway_attachment.options.ApplianceModeSupport }}</applianceModeSupport>
+ <dnsSupport>{{ transit_gateway_attachment.options.DnsSupport }}</dnsSupport>
+ <ipv6Support>{{ transit_gateway_attachment.options.Ipv6Support }}</ipv6Support>
+ </options>
+ <state>{{ transit_gateway_attachment.state }}</state>
+ <subnetIds>
+ {% for subnet_id in transit_gateway_attachment.subnet_ids %}
+ <item>{{ subnet_id }}</item>
+ {% endfor %}
+ </subnetIds>
+ <tagSet>
+ {% for tag in transit_gateway_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_attachment.id }}</transitGatewayAttachmentId>
+ <transitGatewayId>{{ transit_gateway_attachment.transit_gateway_id }}</transitGatewayId>
+ <vpcId>{{ transit_gateway_attachment.vpc_id }}</vpcId>
+ <vpcOwnerId>{{ transit_gateway_attachment.resource_owner_id }}</vpcOwnerId>
+ </transitGatewayVpcAttachment>
+</DeleteTransitGatewayVpcAttachmentResponse>"""
+
+
+TRANSIT_GATEWAY_ASSOCIATION = """<AssociateTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>86a597cf-93ec-44a3-9559-4641863642a5</requestId>
+ <association>
+ <resourceId>{{ transit_gateway_association.resource_id }}</resourceId>
+ <resourceType>{{ transit_gateway_association.resource_type }}</resourceType>
+ <state>{{ transit_gateway_association.state }}</state>
+ <transitGatewayAttachmentId>{{ transit_gateway_association.transit_gateway_attachment_id }}</transitGatewayAttachmentId>
+ <transitGatewayRouteTableId>{{ transit_gateway_association.transit_gateway_route_table_id }}</transitGatewayRouteTableId>
+ </association>
+</AssociateTransitGatewayRouteTableResponse>
+"""
+
+
+TRANSIT_GATEWAY_DISASSOCIATION = """<DisassociateTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>86a597cf-93ec-44a3-9559-4641863642a5</requestId>
+ <association>
+ <resourceId>{{ tgw_association.resource_id }}</resourceId>
+ <resourceType>{{ tgw_association.resource_type }}</resourceType>
+ <state>{{ tgw_association.state }}</state>
+ <transitGatewayAttachmentId>{{ tgw_association.transit_gateway_attachment_id }}</transitGatewayAttachmentId>
+ <transitGatewayRouteTableId>{{ tgw_association.transit_gateway_route_table_id }}</transitGatewayRouteTableId>
+ </association>
+</DisassociateTransitGatewayRouteTableResponse>
+"""
+
+
+TRANSIT_GATEWAY_PROPAGATION = """<EnableTransitGatewayRouteTablePropagationResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>c78427d4-e498-46ae-bc14-32841b16bff4</requestId>
+ <propagation>
+ <resourceId>{{ transit_gateway_propagation.resource_id }}</resourceId>
+ <resourceType>{{ transit_gateway_propagation.resource_type }}</resourceType>
+ <state>{{ transit_gateway_propagation.state }}</state>
+ <transitGatewayAttachmentId>{{ transit_gateway_propagation.transit_gateway_attachment_id }}</transitGatewayAttachmentId>
+ <transitGatewayRouteTableId>{{ transit_gateway_propagation.transit_gateway_route_table_id }}</transitGatewayRouteTableId>
+ </propagation>
+</EnableTransitGatewayRouteTablePropagationResponse>
+"""
+
+
+TRANSIT_GATEWAY_PEERING_ATTACHMENT = """<{{ method_name }} xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>9b5766ac-2af6-4b92-9a8a-4d74ae46ae79</requestId>
+ <transitGatewayPeeringAttachment>
+ <createTime>{{ transit_gateway_peering_attachment.create_time }}</createTime>
+ <state>{{ transit_gateway_peering_attachment.state }}</state>
+ <accepterTgwInfo>
+ <ownerId>{{ transit_gateway_peering_attachment.accepter_tgw_info.ownerId or '' }}</ownerId>
+ <region>{{ transit_gateway_peering_attachment.accepter_tgw_info.region or '' }}</region>
+ <transitGatewayId>{{ transit_gateway_peering_attachment.accepter_tgw_info.transitGatewayId or '' }}</transitGatewayId>
+ </accepterTgwInfo>
+ <requesterTgwInfo>
+ <ownerId>{{ transit_gateway_peering_attachment.requester_tgw_info.ownerId or '' }}</ownerId>
+ <region>{{ transit_gateway_peering_attachment.requester_tgw_info.region or '' }}</region>
+ <transitGatewayId>{{ transit_gateway_peering_attachment.requester_tgw_info.transitGatewayId or '' }}</transitGatewayId>
+ </requesterTgwInfo>
+ <status>{{ transit_gateway_peering_attachment.status.code }}</status>
+ <tagSet>
+ {% for tag in transit_gateway_peering_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_peering_attachment.id }}</transitGatewayAttachmentId>
+ </transitGatewayPeeringAttachment>
+</{{ method_name }}>"""
+
+
+DESCRIBE_TRANSIT_GATEWAY_PEERING_ATTACHMENTS = """<DescribeTransitGatewayPeeringAttachments xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>bebc9670-0205-4f28-ad89-049c97e46633</requestId>
+ <transitGatewayPeeringAttachments>
+ {% for transit_gateway_peering_attachment in transit_gateway_peering_attachments %}
+ <item>
+ <createTime>{{ transit_gateway_peering_attachment.create_time }}</createTime>
+ <state>{{ transit_gateway_peering_attachment.state }}</state>
+ {% if transit_gateway_peering_attachment.accepter_tgw_info %}
+ <accepterTgwInfo>
+ <ownerId>{{ transit_gateway_peering_attachment.accepter_tgw_info.ownerId or '' }}</ownerId>
+ <region>{{ transit_gateway_peering_attachment.accepter_tgw_info.region or '' }}</region>
+ <transitGatewayId>{{ transit_gateway_peering_attachment.accepter_tgw_info.transitGatewayId or '' }}</transitGatewayId>
+ </accepterTgwInfo>
+ {% endif %}
+ {% if transit_gateway_peering_attachment.requester_tgw_info %}
+ <requesterTgwInfo>
+ <ownerId>{{ transit_gateway_peering_attachment.requester_tgw_info.ownerId or '' }}</ownerId>
+ <region>{{ transit_gateway_peering_attachment.requester_tgw_info.region or '' }}</region>
+ <transitGatewayId>{{ transit_gateway_peering_attachment.requester_tgw_info.transitGatewayId or '' }}</transitGatewayId>
+ </requesterTgwInfo>
+ {% endif %}
+ {% if transit_gateway_peering_attachment.status %}
+ <status>{{ transit_gateway_peering_attachment.status.code }}</status>
+ {% endif %}
+ <tagSet>
+ {% for tag in transit_gateway_peering_attachment.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayAttachmentId>{{ transit_gateway_peering_attachment.id }}</transitGatewayAttachmentId>
+ </item>
+ {% endfor %}
+ </transitGatewayPeeringAttachments>
+</DescribeTransitGatewayPeeringAttachments>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_route_tables.py b/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_route_tables.py
new file mode 100644
index 0000000000..f0dc4f260f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/transit_gateway_route_tables.py
@@ -0,0 +1,263 @@
+from ._base_response import EC2BaseResponse
+from moto.utilities.utils import str2bool
+
+
+class TransitGatewayRouteTable(EC2BaseResponse):
+ def create_transit_gateway_route_table(self):
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ tags = self._get_multi_param("TagSpecifications")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+
+ transit_gateway_route_table = (
+ self.ec2_backend.create_transit_gateway_route_table(
+ transit_gateway_id=transit_gateway_id, tags=tags
+ )
+ )
+ template = self.response_template(CREATE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
+ return template.render(transit_gateway_route_table=transit_gateway_route_table)
+
+ def describe_transit_gateway_route_tables(self):
+ filters = self._filters_from_querystring()
+ transit_gateway_route_table_ids = (
+ self._get_multi_param("TransitGatewayRouteTableIds") or None
+ )
+ transit_gateway_route_tables = (
+ self.ec2_backend.get_all_transit_gateway_route_tables(
+ transit_gateway_route_table_ids, filters
+ )
+ )
+ template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
+ return template.render(
+ transit_gateway_route_tables=transit_gateway_route_tables
+ )
+
+ def delete_transit_gateway_route_table(self):
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ transit_gateway_route_table = (
+ self.ec2_backend.delete_transit_gateway_route_table(
+ transit_gateway_route_table_id
+ )
+ )
+ template = self.response_template(DELETE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
+ return template.render(transit_gateway_route_table=transit_gateway_route_table)
+
+ def create_transit_gateway_route(self):
+ transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
+ destination_cidr_block = self._get_param("DestinationCidrBlock")
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ blackhole = str2bool(self._get_param("Blackhole"))
+ transit_gateways_route_table = self.ec2_backend.create_transit_gateway_route(
+ destination_cidr_block=destination_cidr_block,
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ transit_gateway_attachment_id=transit_gateway_attachment_id,
+ blackhole=blackhole,
+ )
+ template = self.response_template(CREATE_TRANSIT_GATEWAY_ROUTE_RESPONSE)
+ return template.render(
+ transit_gateway_route_table=transit_gateways_route_table,
+ destination_cidr_block=destination_cidr_block,
+ )
+
+ def delete_transit_gateway_route(self):
+ destination_cidr_block = self._get_param("DestinationCidrBlock")
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ transit_gateway_route_table = self.ec2_backend.delete_transit_gateway_route(
+ destination_cidr_block=destination_cidr_block,
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ )
+ template = self.response_template(DELETE_TRANSIT_GATEWAY_ROUTE_RESPONSE)
+ rendered_template = template.render(
+ transit_gateway_route_table=transit_gateway_route_table,
+ destination_cidr_block=destination_cidr_block,
+ )
+ del transit_gateway_route_table.routes[destination_cidr_block]
+ return rendered_template
+
+ def search_transit_gateway_routes(self):
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ filters = self._filters_from_querystring()
+ max_results = self._get_param("MaxResults")
+ transit_gateway_routes = self.ec2_backend.search_transit_gateway_routes(
+ transit_gateway_route_table_id=transit_gateway_route_table_id,
+ filters=filters,
+ max_results=max_results,
+ )
+ template = self.response_template(SEARCH_TRANSIT_GATEWAY_ROUTES_RESPONSE)
+ return template.render(transit_gateway_routes=transit_gateway_routes)
+
+ def get_transit_gateway_route_table_associations(self):
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ filters = self._filters_from_querystring()
+ transit_gateway_route_table_associations = (
+ self.ec2_backend.get_all_transit_gateway_route_table_associations(
+ transit_gateway_route_table_id, filters
+ )
+ )
+ template = self.response_template(
+ GET_TRANSIT_GATEWAY_ROUTE_TABLE_ASSOCIATIONS_RESPONSE
+ )
+ return template.render(
+ transit_gateway_route_table_associations=transit_gateway_route_table_associations
+ )
+
+ def get_transit_gateway_route_table_propagations(self):
+ transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
+ filters = self._filters_from_querystring()
+ transit_gateway_route_table_propagations = (
+ self.ec2_backend.get_all_transit_gateway_route_table_propagations(
+ transit_gateway_route_table_id, filters
+ )
+ )
+ template = self.response_template(
+ GET_TRANSIT_GATEWAY_ROUTE_TABLE_PROPAGATIONS_RESPONSE
+ )
+ return template.render(
+ transit_gateway_route_table_propagations=transit_gateway_route_table_propagations
+ )
+
+
+CREATE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<CreateTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>3a495d25-08d4-466d-822e-477c9b1fc606</requestId>
+ <transitGatewayRouteTable>
+ <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
+ <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
+ <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
+ <state>{{ transit_gateway_route_table.state }}</state>
+ <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
+ <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
+ <tagSet>
+ {% for tag in transit_gateway_route_table.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </transitGatewayRouteTable>
+</CreateTransitGatewayRouteTableResponse>
+"""
+
+DESCRIBE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<DescribeTransitGatewayRouteTablesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>f9dea58a-7bb3-458b-a40d-0b7ae32eefdb</requestId>
+ <transitGatewayRouteTables>
+ {% for transit_gateway_route_table in transit_gateway_route_tables %}
+ <item>
+ <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
+ <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
+ <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
+ <state>{{ transit_gateway_route_table.state }}</state>
+ <tagSet>
+ {% for tag in transit_gateway_route_table.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
+ <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
+ </item>
+ {% endfor %}
+ </transitGatewayRouteTables>
+</DescribeTransitGatewayRouteTablesResponse>
+"""
+
+DELETE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<DeleteTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>a9a07226-c7b1-4305-9934-0bcfc3ef1c5e</requestId>
+ <transitGatewayRouteTable>
+ <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
+ <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
+ <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
+ <state>{{ transit_gateway_route_table.state }}</state>
+ <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
+ <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
+ </transitGatewayRouteTable>
+</DeleteTransitGatewayRouteTableResponse>
+"""
+
+
+CREATE_TRANSIT_GATEWAY_ROUTE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CreateTransitGatewayRouteResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>072b02ce-df3a-4de6-a20b-6653ae4b91a4</requestId>
+ <route>
+ <destinationCidrBlock>{{ transit_gateway_route_table.destinationCidrBlock }}</destinationCidrBlock>
+ <state>{{ transit_gateway_route_table.state }}</state>
+ <type>{{ transit_gateway_route_table.type }}</type>
+ <transitGatewayAttachments>
+ {% if transit_gateway_route_table.state != 'blackhole' and transit_gateway_route_table.transitGatewayAttachments %}
+ <item>
+ <resourceId>{{ transit_gateway_route_table.transitGatewayAttachments.resourceId }}</resourceId>
+ <resourceType>{{ transit_gateway_route_table.transitGatewayAttachments.resourceType }}</resourceType>
+ <transitGatewayAttachmentId>{{ transit_gateway_route_table.transitGatewayAttachments.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
+ </item>
+ {% endif %}
+ </transitGatewayAttachments>
+ </route>
+</CreateTransitGatewayRouteResponse>
+"""
+
+DELETE_TRANSIT_GATEWAY_ROUTE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<DeleteTransitGatewayRouteResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>2109d5bb-f874-4f35-b419-4723792a638f</requestId>
+ <route>
+ <destinationCidrBlock>{{ transit_gateway_route_table.routes[destination_cidr_block].destinationCidrBlock }}</destinationCidrBlock>
+ <state>{{ transit_gateway_route_table.routes[destination_cidr_block].state }}</state>
+ <type>{{ transit_gateway_route_table.routes[destination_cidr_block].type }}</type>
+ </route>
+</DeleteTransitGatewayRouteResponse>
+"""
+
+SEARCH_TRANSIT_GATEWAY_ROUTES_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<SearchTransitGatewayRoutesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>04b46ad2-5a0e-46db-afe4-68679a193b48</requestId>
+ <routeSet>
+ {% for route in transit_gateway_routes %}
+ <item>
+ <destinationCidrBlock>{{ transit_gateway_routes[route].destinationCidrBlock }}</destinationCidrBlock>
+ <state>{{ transit_gateway_routes[route].state }}</state>
+ <type>{{ transit_gateway_routes[route].type }}</type>
+ {% if transit_gateway_routes[route].get('transitGatewayAttachments') %}
+ <transitGatewayAttachments>
+ <item>
+ <resourceId>{{ transit_gateway_routes[route].transitGatewayAttachments.resourceId }}</resourceId>
+ <resourceType>{{ transit_gateway_routes[route].transitGatewayAttachments.resourceType }}</resourceType>
+ <transitGatewayAttachmentId>{{ transit_gateway_routes[route].transitGatewayAttachments.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
+ </item>
+ </transitGatewayAttachments>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </routeSet>
+ <additionalRoutesAvailable>false</additionalRoutesAvailable>
+</SearchTransitGatewayRoutesResponse>
+"""
+
+GET_TRANSIT_GATEWAY_ROUTE_TABLE_ASSOCIATIONS_RESPONSE = """<GetTransitGatewayRouteTableAssociationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>92fdc91d-c374-4217-b2b4-33f2fb0a2be7</requestId>
+ <associations>
+ {% for route_table in transit_gateway_route_table_associations %}
+ <item>
+ <resourceId>{{ route_table.route_table_association.resourceId }}</resourceId>
+ <resourceType>{{ route_table.route_table_association.resourceType }}</resourceType>
+ <state>{{ route_table.route_table_association.state }}</state>
+ <transitGatewayAttachmentId>{{ route_table.route_table_association.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
+ </item>
+ {% endfor %}
+ </associations>
+</GetTransitGatewayRouteTableAssociationsResponse>"""
+
+GET_TRANSIT_GATEWAY_ROUTE_TABLE_PROPAGATIONS_RESPONSE = """<GetTransitGatewayRouteTablePropagationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>541bc42d-9ed9-4aef-a5f7-2ea32fbdec16</requestId>
+ <transitGatewayRouteTablePropagations>
+ {% for route_table in transit_gateway_route_table_propagations %}
+ <item>
+ <resourceId>{{ route_table.route_table_propagation.resourceId }}</resourceId>
+ <resourceType>{{ route_table.route_table_propagation.resourceType }}</resourceType>
+ <state>{{ route_table.route_table_propagation.state }}</state>
+ <transitGatewayAttachmentId>{{ route_table.route_table_propagation.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
+ </item>
+ {% endfor %}
+ </transitGatewayRouteTablePropagations>
+</GetTransitGatewayRouteTablePropagationsResponse>"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/transit_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/transit_gateways.py
new file mode 100644
index 0000000000..4817751c72
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/transit_gateways.py
@@ -0,0 +1,174 @@
+from ._base_response import EC2BaseResponse
+
+
+class TransitGateways(EC2BaseResponse):
+ def create_transit_gateway(self):
+ description = self._get_param("Description") or None
+ options = self._get_multi_param_dict("Options")
+ tags = self._get_multi_param("TagSpecification")
+ if tags:
+ tags = tags[0].get("Tag")
+
+ transit_gateway = self.ec2_backend.create_transit_gateway(
+ description=description, options=options, tags=tags
+ )
+
+ # creating default route table
+ transit_gateway_route_table = (
+ self.ec2_backend.create_transit_gateway_route_table(
+ transit_gateway_id=transit_gateway.id,
+ tags={},
+ default_association_route_table=True,
+ default_propagation_route_table=True,
+ )
+ )
+ transit_gateway.options[
+ "AssociationDefaultRouteTableId"
+ ] = transit_gateway_route_table.id
+ transit_gateway.options[
+ "PropagationDefaultRouteTableId"
+ ] = transit_gateway_route_table.id
+
+ template = self.response_template(CREATE_TRANSIT_GATEWAY_RESPONSE)
+ return template.render(transit_gateway=transit_gateway)
+
+ def delete_transit_gateway(self):
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ transit_gateway = self.ec2_backend.delete_transit_gateway(transit_gateway_id)
+ template = self.response_template(DELETE_TRANSIT_GATEWAY_RESPONSE)
+ return template.render(transit_gateway=transit_gateway)
+
+ def describe_transit_gateways(self):
+ transit_gateway_ids = self._get_multi_param("TransitGatewayIds")
+ filters = self._filters_from_querystring()
+ transit_gateways = self.ec2_backend.describe_transit_gateways(
+ filters, transit_gateway_ids
+ )
+ template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_RESPONSE)
+ return template.render(transit_gateways=transit_gateways)
+
+ def modify_transit_gateway(self):
+ transit_gateway_id = self._get_param("TransitGatewayId")
+ description = self._get_param("Description") or None
+ options = self._get_multi_param_dict("Options")
+ transit_gateway = self.ec2_backend.modify_transit_gateway(
+ transit_gateway_id=transit_gateway_id,
+ description=description,
+ options=options,
+ )
+ template = self.response_template(MODIFY_TRANSIT_GATEWAY_RESPONSE)
+ return template.render(transit_gateway=transit_gateway)
+
+
+CREATE_TRANSIT_GATEWAY_RESPONSE = """<CreateTransitGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
+ <transitGateway>
+ <transitGatewayId>{{ transit_gateway.id }}</transitGatewayId>
+ <ownerId>{{ transit_gateway.owner_id }}</ownerId>
+ <description>{{ transit_gateway.description or '' }}</description>
+ <createTime>{{ transit_gateway.create_time }}</createTime>
+ <state>{{ transit_gateway.state }}</state>
+ {% if transit_gateway.options %}
+ <options>
+ <amazonSideAsn>{{ transit_gateway.options.AmazonSideAsn }}</amazonSideAsn>
+ <autoAcceptSharedAttachments>{{ transit_gateway.options.AutoAcceptSharedAttachments }}</autoAcceptSharedAttachments>
+ <defaultRouteTableAssociation>{{ transit_gateway.options.DefaultRouteTableAssociation }}</defaultRouteTableAssociation>
+ <defaultRouteTablePropagation>{{ transit_gateway.options.DefaultRouteTablePropagation }}</defaultRouteTablePropagation>
+ <dnsSupport>{{ transit_gateway.options.DnsSupport }}</dnsSupport>
+ <propagationDefaultRouteTableId>{{ transit_gateway.options.PropagationDefaultRouteTableId }}</propagationDefaultRouteTableId>
+ <vpnEcmpSupport>{{ transit_gateway.options.VpnEcmpSupport }}</vpnEcmpSupport>
+ <transitGatewayCidrBlocks>{{ transit_gateway.options.TransitGatewayCidrBlocks }}</transitGatewayCidrBlocks>
+ </options>
+ {% endif %}
+ <tagSet>
+ {% for tag in transit_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </transitGateway>
+</CreateTransitGatewayResponse>
+"""
+
+DESCRIBE_TRANSIT_GATEWAY_RESPONSE = """<DescribeTransitGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
+ <transitGatewaySet>
+ {% for transit_gateway in transit_gateways %}
+ <item>
+ <creationTime>{{ transit_gateway.create_time }}</creationTime>
+ <description>{{ transit_gateway.description or '' }}</description>
+ {% if transit_gateway.options %}
+ <options>
+ <amazonSideAsn>{{ transit_gateway.options.AmazonSideAsn }}</amazonSideAsn>
+ <associationDefaultRouteTableId>{{ transit_gateway.options.AssociationDefaultRouteTableId }}</associationDefaultRouteTableId>
+ <autoAcceptSharedAttachments>{{ transit_gateway.options.AutoAcceptSharedAttachments }}</autoAcceptSharedAttachments>
+ <defaultRouteTableAssociation>{{ transit_gateway.options.DefaultRouteTableAssociation }}</defaultRouteTableAssociation>
+ <defaultRouteTablePropagation>{{ transit_gateway.options.DefaultRouteTablePropagation }}</defaultRouteTablePropagation>
+ <dnsSupport>{{ transit_gateway.options.DnsSupport }}</dnsSupport>
+ <propagationDefaultRouteTableId>{{ transit_gateway.options.PropagationDefaultRouteTableId }}</propagationDefaultRouteTableId>
+ <vpnEcmpSupport>{{ transit_gateway.options.VpnEcmpSupport }}</vpnEcmpSupport>
+ <transitGatewayCidrBlocks>{{ transit_gateway.options.TransitGatewayCidrBlocks }}</transitGatewayCidrBlocks>
+ </options>
+ {% endif %}
+ <ownerId>{{ transit_gateway.owner_id }}</ownerId>
+ <state>{{ transit_gateway.state }}</state>
+ <tagSet>
+ {% for tag in transit_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayArn>arn:aws:ec2:us-east-1:{{ transit_gateway.owner_id }}:transit-gateway/{{ transit_gateway.id }}</transitGatewayArn>
+ <transitGatewayId>{{ transit_gateway.id }}</transitGatewayId>
+ </item>
+ {% endfor %}
+ </transitGatewaySet>
+</DescribeTransitGatewaysResponse>
+"""
+
+DELETE_TRANSIT_GATEWAY_RESPONSE = """<DeleteTransitGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
+ <transitGatewayId>{{ transit_gateway.id }}</transitGatewayId>
+</DeleteTransitGatewayResponse>
+"""
+
+
+MODIFY_TRANSIT_GATEWAY_RESPONSE = """<ModifyTransitGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
+ <transitGatewaySet>
+ <item>
+ <creationTime>{{ transit_gateway.create_time }}</creationTime>
+ <description>{{ transit_gateway.description or '' }}</description>
+ {% if transit_gateway.options %}
+ <options>
+ <amazonSideAsn>{{ transit_gateway.options.AmazonSideAsn }}</amazonSideAsn>
+ <associationDefaultRouteTableId>{{ transit_gateway.options.AssociationDefaultRouteTableId }}</associationDefaultRouteTableId>
+ <autoAcceptSharedAttachments>{{ transit_gateway.options.AutoAcceptSharedAttachments }}</autoAcceptSharedAttachments>
+ <defaultRouteTableAssociation>{{ transit_gateway.options.DefaultRouteTableAssociation }}</defaultRouteTableAssociation>
+ <defaultRouteTablePropagation>{{ transit_gateway.options.DefaultRouteTablePropagation }}</defaultRouteTablePropagation>
+ <dnsSupport>{{ transit_gateway.options.DnsSupport }}</dnsSupport>
+ <propagationDefaultRouteTableId>{{ transit_gateway.options.PropagationDefaultRouteTableId }}</propagationDefaultRouteTableId>
+ <vpnEcmpSupport>{{ transit_gateway.options.VpnEcmpSupport }}</vpnEcmpSupport>
+ <transitGatewayCidrBlocks>{{ transit_gateway.options.TransitGatewayCidrBlocks }}</transitGatewayCidrBlocks>
+ </options>
+ {% endif %}
+ <ownerId>{{ transit_gateway.owner_id }}</ownerId>
+ <state>{{ transit_gateway.state }}</state>
+ <tagSet>
+ {% for tag in transit_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <transitGatewayArn>arn:aws:ec2:us-east-1:{{ transit_gateway.owner_id }}:transit-gateway/{{ transit_gateway.id }}</transitGatewayArn>
+ <transitGatewayId>{{ transit_gateway.id }}</transitGatewayId>
+ </item>
+ </transitGatewaySet>
+</ModifyTransitGatewaysResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/virtual_private_gateways.py b/contrib/python/moto/py3/moto/ec2/responses/virtual_private_gateways.py
new file mode 100644
index 0000000000..d3f92f0c27
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/virtual_private_gateways.py
@@ -0,0 +1,129 @@
+from ._base_response import EC2BaseResponse
+
+
+class VirtualPrivateGateways(EC2BaseResponse):
+ def attach_vpn_gateway(self):
+ vpn_gateway_id = self._get_param("VpnGatewayId")
+ vpc_id = self._get_param("VpcId")
+ attachment = self.ec2_backend.attach_vpn_gateway(vpn_gateway_id, vpc_id)
+ template = self.response_template(ATTACH_VPN_GATEWAY_RESPONSE)
+ return template.render(attachment=attachment)
+
+ def create_vpn_gateway(self):
+ gateway_type = self._get_param("Type")
+ amazon_side_asn = self._get_param("AmazonSideAsn")
+ availability_zone = self._get_param("AvailabilityZone")
+ tags = self._get_multi_param("TagSpecification")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+ vpn_gateway = self.ec2_backend.create_vpn_gateway(
+ gateway_type=gateway_type,
+ amazon_side_asn=amazon_side_asn,
+ availability_zone=availability_zone,
+ tags=tags,
+ )
+ template = self.response_template(CREATE_VPN_GATEWAY_RESPONSE)
+ return template.render(vpn_gateway=vpn_gateway)
+
+ def delete_vpn_gateway(self):
+ vpn_gateway_id = self._get_param("VpnGatewayId")
+ vpn_gateway = self.ec2_backend.delete_vpn_gateway(vpn_gateway_id)
+ template = self.response_template(DELETE_VPN_GATEWAY_RESPONSE)
+ return template.render(vpn_gateway=vpn_gateway)
+
+ def describe_vpn_gateways(self):
+ filters = self._filters_from_querystring()
+ vpn_gw_ids = self._get_multi_param("VpnGatewayId")
+ vpn_gateways = self.ec2_backend.describe_vpn_gateways(filters, vpn_gw_ids)
+ template = self.response_template(DESCRIBE_VPN_GATEWAYS_RESPONSE)
+ return template.render(vpn_gateways=vpn_gateways)
+
+ def detach_vpn_gateway(self):
+ vpn_gateway_id = self._get_param("VpnGatewayId")
+ vpc_id = self._get_param("VpcId")
+ attachment = self.ec2_backend.detach_vpn_gateway(vpn_gateway_id, vpc_id)
+ template = self.response_template(DETACH_VPN_GATEWAY_RESPONSE)
+ return template.render(attachment=attachment)
+
+
+CREATE_VPN_GATEWAY_RESPONSE = """
+<CreateVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnGateway>
+ <vpnGatewayId>{{ vpn_gateway.id }}</vpnGatewayId>
+ {% if vpn_gateway.amazon_side_asn %}
+ <amazonSideAsn>{{ vpn_gateway.amazon_side_asn }}</amazonSideAsn>
+ {% endif %}
+ <state>{{ vpn_gateway.state }}</state>
+ <type>{{ vpn_gateway.type }}</type>
+ <availabilityZone>{{ vpn_gateway.availability_zone }}</availabilityZone>
+ <attachments/>
+ <tagSet>
+ {% for tag in vpn_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpnGateway>
+</CreateVpnGatewayResponse>"""
+
+DESCRIBE_VPN_GATEWAYS_RESPONSE = """
+<DescribeVpnGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnGatewaySet>
+ {% for vpn_gateway in vpn_gateways %}
+ <item>
+ <vpnGatewayId>{{ vpn_gateway.id }}</vpnGatewayId>
+ {% if vpn_gateway.amazon_side_asn %}
+ <amazonSideAsn>{{ vpn_gateway.amazon_side_asn }}</amazonSideAsn>
+ {% endif %}
+ <state>{{ vpn_gateway.state }}</state>
+ <type>{{ vpn_gateway.id }}</type>
+ <availabilityZone>{{ vpn_gateway.availability_zone }}</availabilityZone>
+ <attachments>
+ {% for attachment in vpn_gateway.attachments.values() %}
+ <item>
+ <vpcId>{{ attachment.vpc_id }}</vpcId>
+ <state>{{ attachment.state }}</state>
+ </item>
+ {% endfor %}
+ </attachments>
+ <tagSet/>
+ <tagSet>
+ {% for tag in vpn_gateway.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpnGatewaySet>
+</DescribeVpnGatewaysResponse>"""
+
+ATTACH_VPN_GATEWAY_RESPONSE = """
+<AttachVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <attachment>
+ <vpcId>{{ attachment.vpc_id }}</vpcId>
+ <state>{{ attachment.state }}</state>
+ </attachment>
+</AttachVpnGatewayResponse>"""
+
+DELETE_VPN_GATEWAY_RESPONSE = """
+<DeleteVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpnGatewayResponse>
+"""
+
+DETACH_VPN_GATEWAY_RESPONSE = """
+<DetachVpnGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DetachVpnGatewayResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vm_export.py b/contrib/python/moto/py3/moto/ec2/responses/vm_export.py
new file mode 100644
index 0000000000..8a3fa0d76f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vm_export.py
@@ -0,0 +1,16 @@
+from moto.core.responses import BaseResponse
+
+
+class VMExport(BaseResponse):
+ def cancel_export_task(self):
+ raise NotImplementedError("VMExport.cancel_export_task is not yet implemented")
+
+ def create_instance_export_task(self):
+ raise NotImplementedError(
+ "VMExport.create_instance_export_task is not yet implemented"
+ )
+
+ def describe_export_tasks(self):
+ raise NotImplementedError(
+ "VMExport.describe_export_tasks is not yet implemented"
+ )
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vm_import.py b/contrib/python/moto/py3/moto/ec2/responses/vm_import.py
new file mode 100644
index 0000000000..9f43de0922
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vm_import.py
@@ -0,0 +1,19 @@
+from moto.core.responses import BaseResponse
+
+
+class VMImport(BaseResponse):
+ def cancel_conversion_task(self):
+ raise NotImplementedError(
+ "VMImport.cancel_conversion_task is not yet implemented"
+ )
+
+ def describe_conversion_tasks(self):
+ raise NotImplementedError(
+ "VMImport.describe_conversion_tasks is not yet implemented"
+ )
+
+ def import_instance(self):
+ raise NotImplementedError("VMImport.import_instance is not yet implemented")
+
+ def import_volume(self):
+ raise NotImplementedError("VMImport.import_volume is not yet implemented")
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vpc_peering_connections.py b/contrib/python/moto/py3/moto/ec2/responses/vpc_peering_connections.py
new file mode 100644
index 0000000000..773a2b8cae
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vpc_peering_connections.py
@@ -0,0 +1,245 @@
+from moto.core.responses import BaseResponse
+from moto.core import get_account_id
+
+
+class VPCPeeringConnections(BaseResponse):
+ def create_vpc_peering_connection(self):
+ peer_region = self._get_param("PeerRegion")
+ tags = self._get_multi_param("TagSpecification")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+
+ if peer_region == self.region or peer_region is None:
+ peer_vpc = self.ec2_backend.get_vpc(self._get_param("PeerVpcId"))
+ else:
+ from moto.ec2.models import ec2_backends
+
+ peer_vpc = ec2_backends[peer_region].get_vpc(self._get_param("PeerVpcId"))
+ vpc = self.ec2_backend.get_vpc(self._get_param("VpcId"))
+ vpc_pcx = self.ec2_backend.create_vpc_peering_connection(vpc, peer_vpc, tags)
+ template = self.response_template(CREATE_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def delete_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param("VpcPeeringConnectionId")
+ vpc_pcx = self.ec2_backend.delete_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(DELETE_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def describe_vpc_peering_connections(self):
+ ids = self._get_multi_param("VpcPeeringConnectionId")
+ vpc_pcxs = self.ec2_backend.describe_vpc_peering_connections(
+ vpc_peering_ids=ids
+ )
+ template = self.response_template(DESCRIBE_VPC_PEERING_CONNECTIONS_RESPONSE)
+ return template.render(vpc_pcxs=vpc_pcxs)
+
+ def accept_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param("VpcPeeringConnectionId")
+ vpc_pcx = self.ec2_backend.accept_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(ACCEPT_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(vpc_pcx=vpc_pcx)
+
+ def reject_vpc_peering_connection(self):
+ vpc_pcx_id = self._get_param("VpcPeeringConnectionId")
+ self.ec2_backend.reject_vpc_peering_connection(vpc_pcx_id)
+ template = self.response_template(REJECT_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render()
+
+ def modify_vpc_peering_connection_options(self):
+ vpc_pcx_id = self._get_param("VpcPeeringConnectionId")
+ accepter_options = self._get_multi_param_dict(
+ "AccepterPeeringConnectionOptions"
+ )
+ requester_options = self._get_multi_param_dict(
+ "RequesterPeeringConnectionOptions"
+ )
+ self.ec2_backend.modify_vpc_peering_connection_options(
+ vpc_pcx_id, accepter_options, requester_options
+ )
+ template = self.response_template(MODIFY_VPC_PEERING_CONNECTION_RESPONSE)
+ return template.render(
+ accepter_options=accepter_options, requester_options=requester_options
+ )
+
+
+# we are assuming that the owner id for accepter and requester vpc are same
+# as we are checking for the vpc exsistance
+CREATE_VPC_PEERING_CONNECTION_RESPONSE = (
+ """
+<CreateVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnection>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ vpc_pcx.requester_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ vpc_pcx.requester_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ vpc_pcx.requester_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ vpc_pcx.accepter_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ vpc_pcx.accepter_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ vpc_pcx.accepter_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ </accepterVpcInfo>
+ <status>
+ <code>initiating-request</code>
+ <message>Initiating Request to {accepter ID}</message>
+ </status>
+ <expirationTime>2014-02-18T14:37:25.000Z</expirationTime>
+ <tagSet>
+ {% for tag in vpc_pcx.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpcPeeringConnection>
+</CreateVpcPeeringConnectionResponse>
+"""
+)
+
+DESCRIBE_VPC_PEERING_CONNECTIONS_RESPONSE = (
+ """
+<DescribeVpcPeeringConnectionsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+<requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnectionSet>
+ {% for vpc_pcx in vpc_pcxs %}
+ <item>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ <region>{{ vpc_pcx.vpc.ec2_backend.region_name }}</region>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ vpc_pcx.requester_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ vpc_pcx.requester_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ vpc_pcx.requester_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.peer_vpc.cidr_block }}</cidrBlock>
+ <region>{{ vpc_pcx.peer_vpc.ec2_backend.region_name }}</region>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ vpc_pcx.accepter_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ vpc_pcx.accepter_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ vpc_pcx.accepter_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ </accepterVpcInfo>
+ <status>
+ <code>{{ vpc_pcx._status.code }}</code>
+ <message>{{ vpc_pcx._status.message }}</message>
+ </status>
+ <tagSet>
+ {% for tag in vpc_pcx.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpcPeeringConnectionSet>
+</DescribeVpcPeeringConnectionsResponse>
+"""
+)
+
+DELETE_VPC_PEERING_CONNECTION_RESPONSE = """
+<DeleteVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpcPeeringConnectionResponse>
+"""
+
+ACCEPT_VPC_PEERING_CONNECTION_RESPONSE = (
+ """
+<AcceptVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcPeeringConnection>
+ <vpcPeeringConnectionId>{{ vpc_pcx.id }}</vpcPeeringConnectionId>
+ <requesterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.vpc.cidr_block }}</cidrBlock>
+ <region>{{ vpc_pcx.vpc.ec2_backend.region_name }}</region>
+ </requesterVpcInfo>
+ <accepterVpcInfo>
+ <ownerId>"""
+ + get_account_id()
+ + """</ownerId>
+ <vpcId>{{ vpc_pcx.peer_vpc.id }}</vpcId>
+ <cidrBlock>{{ vpc_pcx.peer_vpc.cidr_block }}</cidrBlock>
+ <peeringOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ vpc_pcx.accepter_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ vpc_pcx.accepter_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ vpc_pcx.accepter_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </peeringOptions>
+ <region>{{ vpc_pcx.peer_vpc.ec2_backend.region_name }}</region>
+ </accepterVpcInfo>
+ <status>
+ <code>{{ vpc_pcx._status.code }}</code>
+ <message>{{ vpc_pcx._status.message }}</message>
+ </status>
+ <tagSet>
+ {% for tag in vpc_pcx.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpcPeeringConnection>
+</AcceptVpcPeeringConnectionResponse>
+"""
+)
+
+REJECT_VPC_PEERING_CONNECTION_RESPONSE = """
+<RejectVpcPeeringConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</RejectVpcPeeringConnectionResponse>
+"""
+
+MODIFY_VPC_PEERING_CONNECTION_RESPONSE = """
+<ModifyVpcPeeringConnectionOptionsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>8d977c82-8aba-4cd1-81ca-example</requestId>
+ {% if requester_options %}
+ <requesterPeeringConnectionOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ requester_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ requester_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ requester_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </requesterPeeringConnectionOptions>
+ {% endif %}
+ {% if accepter_options %}
+ <accepterPeeringConnectionOptions>
+ <allowEgressFromLocalClassicLinkToRemoteVpc>{{ accepter_options.AllowEgressFromLocalClassicLinkToRemoteVpc or '' }}</allowEgressFromLocalClassicLinkToRemoteVpc>
+ <allowEgressFromLocalVpcToRemoteClassicLink>{{ accepter_options.AllowEgressFromLocalVpcToRemoteClassicLink or '' }}</allowEgressFromLocalVpcToRemoteClassicLink>
+ <allowDnsResolutionFromRemoteVpc>{{ accepter_options.AllowDnsResolutionFromRemoteVpc or '' }}</allowDnsResolutionFromRemoteVpc>
+ </accepterPeeringConnectionOptions>
+ {% endif %}
+</ModifyVpcPeeringConnectionOptionsResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vpc_service_configuration.py b/contrib/python/moto/py3/moto/ec2/responses/vpc_service_configuration.py
new file mode 100644
index 0000000000..25f19aadfb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vpc_service_configuration.py
@@ -0,0 +1,223 @@
+from moto.core.responses import BaseResponse
+
+from ..exceptions import NoLoadBalancersProvided
+
+
+class VPCEndpointServiceConfiguration(BaseResponse):
+ def create_vpc_endpoint_service_configuration(self):
+ gateway_lbs = self._get_multi_param("GatewayLoadBalancerArn")
+ network_lbs = self._get_multi_param("NetworkLoadBalancerArn")
+ if not gateway_lbs and not network_lbs:
+ raise NoLoadBalancersProvided
+
+ tags = self._get_multi_param("TagSpecification")
+ if tags:
+ tags = tags[0].get("Tag")
+ acceptance_required = (
+ str(self._get_param("AcceptanceRequired", "true")).lower() == "true"
+ )
+ private_dns_name = self._get_param("PrivateDnsName")
+
+ config = self.ec2_backend.create_vpc_endpoint_service_configuration(
+ gateway_lbs or network_lbs,
+ acceptance_required=acceptance_required,
+ private_dns_name=private_dns_name,
+ tags=tags,
+ )
+ template = self.response_template(CREATE_VPC_ENDPOINT_SERVICE_CONFIGURATION)
+ return template.render(config=config)
+
+ def describe_vpc_endpoint_service_configurations(self):
+ service_ids = self._get_multi_param("ServiceId")
+
+ configs = self.ec2_backend.describe_vpc_endpoint_service_configurations(
+ service_ids
+ )
+
+ template = self.response_template(DESCRIBE_VPC_ENDPOINT_SERVICE_CONFIGURATION)
+ return template.render(configs=configs)
+
+ def delete_vpc_endpoint_service_configurations(self):
+ service_ids = self._get_multi_param("ServiceId")
+ missing_configs = self.ec2_backend.delete_vpc_endpoint_service_configurations(
+ service_ids
+ )
+
+ template = self.response_template(DELETE_VPC_ENDPOINT_SERVICE_CONFIGURATION)
+ return template.render(missing=missing_configs)
+
+ def describe_vpc_endpoint_service_permissions(self):
+ service_id = self._get_param("ServiceId")
+
+ principals = self.ec2_backend.describe_vpc_endpoint_service_permissions(
+ service_id
+ )
+
+ template = self.response_template(DESCRIBE_VPC_ENDPOINT_SERVICE_PERMISSIONS)
+ return template.render(principals=principals)
+
+ def modify_vpc_endpoint_service_configuration(self):
+ service_id = self._get_param("ServiceId")
+ private_dns_name = self._get_param("PrivateDnsName")
+ acceptance_required = self._get_param("AcceptanceRequired")
+ add_network_lbs = self._get_multi_param("AddNetworkLoadBalancerArn")
+ remove_network_lbs = self._get_multi_param("RemoveNetworkLoadBalancerArn")
+ add_gateway_lbs = self._get_multi_param("AddGatewayLoadBalancerArn")
+ remove_gateway_lbs = self._get_multi_param("RemoveGatewayLoadBalancerArn")
+
+ self.ec2_backend.modify_vpc_endpoint_service_configuration(
+ service_id,
+ acceptance_required=acceptance_required,
+ private_dns_name=private_dns_name,
+ add_network_lbs=add_network_lbs,
+ remove_network_lbs=remove_network_lbs,
+ add_gateway_lbs=add_gateway_lbs,
+ remove_gateway_lbs=remove_gateway_lbs,
+ )
+
+ return MODIFY_VPC_ENDPOINT_SERVICE_CONFIGURATION
+
+ def modify_vpc_endpoint_service_permissions(self):
+ service_id = self._get_param("ServiceId")
+ add_principals = self._get_multi_param("AddAllowedPrincipals")
+ remove_principals = self._get_multi_param("RemoveAllowedPrincipals")
+
+ self.ec2_backend.modify_vpc_endpoint_service_permissions(
+ service_id, add_principals, remove_principals
+ )
+
+ return MODIFY_VPC_ENDPOINT_SERVICE_PERMISSIONS
+
+
+CREATE_VPC_ENDPOINT_SERVICE_CONFIGURATION = """
+<CreateVpcEndpointServiceConfigurationResult xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <serviceConfiguration>
+ <serviceType>
+ <item><serviceType>{{ config.service_type }}</serviceType></item>
+ </serviceType>
+ <serviceId>{{ config.id }}</serviceId>
+ <serviceName>{{ config.service_name }}</serviceName>
+ <serviceState>{{ config.service_state }}</serviceState>
+ <availabilityZoneSet>
+ {% for zone in config.availability_zones %}<item>{{ zone }}</item>{% endfor %}
+ </availabilityZoneSet>
+ <acceptanceRequired>{{ 'true' if config.acceptance_required else 'false' }}</acceptanceRequired>
+ <managesVpcEndpoints>{{ 'true' if config.manages_vpc_endpoints else 'false' }}</managesVpcEndpoints>
+ {%- if config.network_load_balancer_arns %}
+ <networkLoadBalancerArnSet>
+ {% for lb in config.network_load_balancer_arns %}<item>{{ lb }}</item>{% endfor %}
+ </networkLoadBalancerArnSet>
+ {% endif -%}
+ {%- if config.gateway_load_balancer_arns %}
+ <gatewayLoadBalancerArnSet>
+ {% for lb in config.gateway_load_balancer_arns %}<item>{{ lb }}</item>{% endfor %}
+ </gatewayLoadBalancerArnSet>
+ {% endif -%}
+ <baseEndpointDnsNameSet><item>{{ config.endpoint_dns_name }}</item></baseEndpointDnsNameSet>
+ <privateDnsName>{{ config.private_dns_name }}</privateDnsName>
+ <privateDnsNameConfiguration>
+ {% if config.private_dns_name %}
+ <state>verified</state>
+ <type>TXT</type>
+ <value>val</value>
+ <name>n</name>
+ {% endif %}
+ </privateDnsNameConfiguration>
+ </serviceConfiguration>
+</CreateVpcEndpointServiceConfigurationResult>
+"""
+
+
+DESCRIBE_VPC_ENDPOINT_SERVICE_CONFIGURATION = """
+<DescribeVpcEndpointServiceConfigurationsResult>
+ <serviceConfigurationSet>
+ {% for config in configs %}
+ <item>
+ <serviceType>
+ <item><serviceType>{{ config.service_type }}</serviceType></item>
+ </serviceType>
+ <serviceId>{{ config.id }}</serviceId>
+ <serviceName>{{ config.service_name }}</serviceName>
+ <serviceState>{{ config.service_state }}</serviceState>
+ <availabilityZoneSet>
+ {% for zone in config.availability_zones %}<item>{{ zone }}</item>{% endfor %}
+ </availabilityZoneSet>
+ <acceptanceRequired>{{ 'true' if config.acceptance_required else 'false' }}</acceptanceRequired>
+ <managesVpcEndpoints>{{ 'true' if config.manages_vpc_endpoints else 'false' }}</managesVpcEndpoints>
+ {%- if config.network_load_balancer_arns %}
+ <networkLoadBalancerArnSet>
+ {% for lb in config.network_load_balancer_arns %}<item>{{ lb }}</item>{% endfor %}
+ </networkLoadBalancerArnSet>
+ {% endif -%}
+ {%- if config.gateway_load_balancer_arns %}
+ <gatewayLoadBalancerArnSet>
+ {% for lb in config.gateway_load_balancer_arns %}<item>{{ lb }}</item>{% endfor %}
+ </gatewayLoadBalancerArnSet>
+ {% endif -%}
+ <baseEndpointDnsNameSet><item>{{ config.endpoint_dns_name }}</item></baseEndpointDnsNameSet>
+ <privateDnsName>{{ config.private_dns_name }}</privateDnsName>
+ <privateDnsNameConfiguration>
+ {% if config.private_dns_name %}
+ <state>verified</state>
+ <type>TXT</type>
+ <value>val</value>
+ <name>n</name>
+ {% endif %}
+ </privateDnsNameConfiguration>
+ <tagSet>
+ {% for tag in config.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </serviceConfigurationSet>
+</DescribeVpcEndpointServiceConfigurationsResult>
+"""
+
+
+DELETE_VPC_ENDPOINT_SERVICE_CONFIGURATION = """
+<DeleteVpcEndpointServiceConfigurationsResult>
+ <unsuccessful>
+ {% for m in missing %}
+ <item>
+ <error>
+ <code>InvalidVpcEndpointService.NotFound</code>
+ <message>The VpcEndpointService Id '{{ m }}' does not exist</message>
+ </error>
+ <resourceId>{{ m }}</resourceId>
+ </item>
+ {% endfor %}
+ </unsuccessful>
+</DeleteVpcEndpointServiceConfigurationsResult>
+"""
+
+
+DESCRIBE_VPC_ENDPOINT_SERVICE_PERMISSIONS = """
+<DescribeVpcEndpointServicePermissionsResult>
+ <allowedPrincipals>
+ {% for principal in principals %}
+ <item>
+ <principal>{{ principal }}</principal>
+ </item>
+ {% endfor %}
+ </allowedPrincipals>
+</DescribeVpcEndpointServicePermissionsResult>
+"""
+
+MODIFY_VPC_ENDPOINT_SERVICE_PERMISSIONS = """
+<ModifyVpcEndpointServicePermissionsResult>
+<return>true</return>
+</ModifyVpcEndpointServicePermissionsResult>
+"""
+
+
+MODIFY_VPC_ENDPOINT_SERVICE_CONFIGURATION = """
+<ModifyVpcEndpointServiceConfigurationResult>
+<return>true</return>
+</ModifyVpcEndpointServiceConfigurationResult>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vpcs.py b/contrib/python/moto/py3/moto/ec2/responses/vpcs.py
new file mode 100644
index 0000000000..cb8b9cba74
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vpcs.py
@@ -0,0 +1,871 @@
+from moto.core import get_account_id
+from moto.core.utils import camelcase_to_underscores
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+
+
+class VPCs(EC2BaseResponse):
+ def _get_doc_date(self):
+ return (
+ "2013-10-15"
+ if "Boto/" in self.headers.get("user-agent", "")
+ else "2016-11-15"
+ )
+
+ def create_vpc(self):
+ cidr_block = self._get_param("CidrBlock")
+ tags = self._get_multi_param("TagSpecification")
+ instance_tenancy = self._get_param("InstanceTenancy", if_none="default")
+ amazon_provided_ipv6_cidr_block = self._get_param(
+ "AmazonProvidedIpv6CidrBlock"
+ ) in ["true", "True"]
+ if tags:
+ tags = tags[0].get("Tag")
+
+ vpc = self.ec2_backend.create_vpc(
+ cidr_block,
+ instance_tenancy,
+ amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_block,
+ tags=tags,
+ )
+ doc_date = self._get_doc_date()
+ template = self.response_template(CREATE_VPC_RESPONSE)
+ return template.render(vpc=vpc, doc_date=doc_date)
+
+ def delete_vpc(self):
+ vpc_id = self._get_param("VpcId")
+ vpc = self.ec2_backend.delete_vpc(vpc_id)
+ template = self.response_template(DELETE_VPC_RESPONSE)
+ return template.render(vpc=vpc)
+
+ def describe_vpcs(self):
+ self.error_on_dryrun()
+ vpc_ids = self._get_multi_param("VpcId")
+ filters = self._filters_from_querystring()
+ vpcs = self.ec2_backend.describe_vpcs(vpc_ids=vpc_ids, filters=filters)
+ doc_date = (
+ "2013-10-15"
+ if "Boto/" in self.headers.get("user-agent", "")
+ else "2016-11-15"
+ )
+ template = self.response_template(DESCRIBE_VPCS_RESPONSE)
+ return template.render(vpcs=vpcs, doc_date=doc_date)
+
+ def modify_vpc_tenancy(self):
+ vpc_id = self._get_param("VpcId")
+ tenancy = self._get_param("InstanceTenancy")
+ value = self.ec2_backend.modify_vpc_tenancy(vpc_id, tenancy)
+ template = self.response_template(MODIFY_VPC_TENANCY_RESPONSE)
+ return template.render(value=value)
+
+ def describe_vpc_attribute(self):
+ vpc_id = self._get_param("VpcId")
+ attribute = self._get_param("Attribute")
+ attr_name = camelcase_to_underscores(attribute)
+ value = self.ec2_backend.describe_vpc_attribute(vpc_id, attr_name)
+ template = self.response_template(DESCRIBE_VPC_ATTRIBUTE_RESPONSE)
+ return template.render(vpc_id=vpc_id, attribute=attribute, value=value)
+
+ def describe_vpc_classic_link_dns_support(self):
+ vpc_ids = self._get_multi_param("VpcIds")
+ filters = self._filters_from_querystring()
+ vpcs = self.ec2_backend.describe_vpcs(vpc_ids=vpc_ids, filters=filters)
+ doc_date = self._get_doc_date()
+ template = self.response_template(
+ DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE
+ )
+ return template.render(vpcs=vpcs, doc_date=doc_date)
+
+ def enable_vpc_classic_link_dns_support(self):
+ vpc_id = self._get_param("VpcId")
+ classic_link_dns_supported = (
+ self.ec2_backend.enable_vpc_classic_link_dns_support(vpc_id=vpc_id)
+ )
+ doc_date = self._get_doc_date()
+ template = self.response_template(ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE)
+ return template.render(
+ classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date
+ )
+
+ def disable_vpc_classic_link_dns_support(self):
+ vpc_id = self._get_param("VpcId")
+ classic_link_dns_supported = (
+ self.ec2_backend.disable_vpc_classic_link_dns_support(vpc_id=vpc_id)
+ )
+ doc_date = self._get_doc_date()
+ template = self.response_template(DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE)
+ return template.render(
+ classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date
+ )
+
+ def describe_vpc_classic_link(self):
+ vpc_ids = self._get_multi_param("VpcId")
+ filters = self._filters_from_querystring()
+ vpcs = self.ec2_backend.describe_vpcs(vpc_ids=vpc_ids, filters=filters)
+ doc_date = self._get_doc_date()
+ template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_RESPONSE)
+ return template.render(vpcs=vpcs, doc_date=doc_date)
+
+ def enable_vpc_classic_link(self):
+ vpc_id = self._get_param("VpcId")
+ classic_link_enabled = self.ec2_backend.enable_vpc_classic_link(vpc_id=vpc_id)
+ doc_date = self._get_doc_date()
+ template = self.response_template(ENABLE_VPC_CLASSIC_LINK_RESPONSE)
+ return template.render(
+ classic_link_enabled=classic_link_enabled, doc_date=doc_date
+ )
+
+ def disable_vpc_classic_link(self):
+ vpc_id = self._get_param("VpcId")
+ classic_link_enabled = self.ec2_backend.disable_vpc_classic_link(vpc_id=vpc_id)
+ doc_date = self._get_doc_date()
+ template = self.response_template(DISABLE_VPC_CLASSIC_LINK_RESPONSE)
+ return template.render(
+ classic_link_enabled=classic_link_enabled, doc_date=doc_date
+ )
+
+ def modify_vpc_attribute(self):
+ vpc_id = self._get_param("VpcId")
+
+ for attribute in ("EnableDnsSupport", "EnableDnsHostnames"):
+ if self.querystring.get("%s.Value" % attribute):
+ attr_name = camelcase_to_underscores(attribute)
+ attr_value = self.querystring.get("%s.Value" % attribute)[0]
+ self.ec2_backend.modify_vpc_attribute(vpc_id, attr_name, attr_value)
+ return MODIFY_VPC_ATTRIBUTE_RESPONSE
+ return None
+
+ def associate_vpc_cidr_block(self):
+ vpc_id = self._get_param("VpcId")
+ amazon_provided_ipv6_cidr_blocks = self._get_param(
+ "AmazonProvidedIpv6CidrBlock"
+ )
+ # todo test on AWS if can create an association for IPV4 and IPV6 in the same call?
+ cidr_block = (
+ self._get_param("CidrBlock")
+ if not amazon_provided_ipv6_cidr_blocks
+ else None
+ )
+ value = self.ec2_backend.associate_vpc_cidr_block(
+ vpc_id, cidr_block, amazon_provided_ipv6_cidr_blocks
+ )
+ if not amazon_provided_ipv6_cidr_blocks:
+ render_template = ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ else:
+ render_template = IPV6_ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ template = self.response_template(render_template)
+ return template.render(
+ vpc_id=vpc_id,
+ value=value,
+ cidr_block=value["cidr_block"],
+ association_id=value["association_id"],
+ cidr_block_state="associating",
+ )
+
+ def disassociate_vpc_cidr_block(self):
+ association_id = self._get_param("AssociationId")
+ value = self.ec2_backend.disassociate_vpc_cidr_block(association_id)
+ if "::" in value.get("cidr_block", ""):
+ render_template = IPV6_DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ else:
+ render_template = DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE
+ template = self.response_template(render_template)
+ return template.render(
+ vpc_id=value["vpc_id"],
+ cidr_block=value["cidr_block"],
+ association_id=value["association_id"],
+ cidr_block_state="disassociating",
+ )
+
+ def create_vpc_endpoint(self):
+ vpc_id = self._get_param("VpcId")
+ service_name = self._get_param("ServiceName")
+ route_table_ids = self._get_multi_param("RouteTableId")
+ subnet_ids = self._get_multi_param("SubnetId")
+ endpoint_type = self._get_param("VpcEndpointType")
+ policy_document = self._get_param("PolicyDocument")
+ client_token = self._get_param("ClientToken")
+ tags = self._get_multi_param("TagSpecification")
+ private_dns_enabled = self._get_bool_param("PrivateDnsEnabled", if_none=True)
+ security_group_ids = self._get_multi_param("SecurityGroupId")
+
+ tags = add_tag_specification(tags)
+ vpc_end_point = self.ec2_backend.create_vpc_endpoint(
+ vpc_id=vpc_id,
+ service_name=service_name,
+ endpoint_type=endpoint_type,
+ policy_document=policy_document,
+ route_table_ids=route_table_ids,
+ subnet_ids=subnet_ids,
+ client_token=client_token,
+ security_group_ids=security_group_ids,
+ tags=tags,
+ private_dns_enabled=private_dns_enabled,
+ )
+ template = self.response_template(CREATE_VPC_END_POINT)
+ return template.render(vpc_end_point=vpc_end_point)
+
+ def describe_vpc_endpoint_services(self):
+ vpc_end_point_services = self.ec2_backend.describe_vpc_endpoint_services(
+ dry_run=self._get_bool_param("DryRun"),
+ service_names=self._get_multi_param("ServiceName"),
+ filters=self._get_multi_param("Filter"),
+ max_results=self._get_int_param("MaxResults"),
+ next_token=self._get_param("NextToken"),
+ region=self.region,
+ )
+ template = self.response_template(DESCRIBE_VPC_ENDPOINT_SERVICES_RESPONSE)
+ return template.render(vpc_end_points=vpc_end_point_services)
+
+ def describe_vpc_endpoints(self):
+ vpc_end_points_ids = self._get_multi_param("VpcEndpointId")
+ filters = self._filters_from_querystring()
+ vpc_end_points = self.ec2_backend.describe_vpc_endpoints(
+ vpc_end_point_ids=vpc_end_points_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_VPC_ENDPOINT_RESPONSE)
+ return template.render(
+ vpc_end_points=vpc_end_points, account_id=get_account_id()
+ )
+
+ def delete_vpc_endpoints(self):
+ vpc_end_points_ids = self._get_multi_param("VpcEndpointId")
+ response = self.ec2_backend.delete_vpc_endpoints(vpce_ids=vpc_end_points_ids)
+ template = self.response_template(DELETE_VPC_ENDPOINT_RESPONSE)
+ return template.render(response=response)
+
+ def create_managed_prefix_list(self):
+ address_family = self._get_param("AddressFamily")
+ max_entries = self._get_param("MaxEntries")
+ prefix_list_name = self._get_param("PrefixListName")
+ entry = self._get_multi_param("Entry")
+
+ tags = self._get_multi_param("TagSpecification")
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+
+ managed_prefix_list = self.ec2_backend.create_managed_prefix_list(
+ address_family=address_family,
+ entry=entry,
+ max_entries=max_entries,
+ prefix_list_name=prefix_list_name,
+ tags=tags,
+ )
+ template = self.response_template(CREATE_MANAGED_PREFIX_LIST)
+ return template.render(managed_prefix_list=managed_prefix_list)
+
+ def describe_managed_prefix_lists(self):
+ prefix_list_ids = self._get_multi_param("PrefixListId")
+ filters = self._filters_from_querystring()
+ managed_prefix_lists = self.ec2_backend.describe_managed_prefix_lists(
+ prefix_list_ids=prefix_list_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_MANAGED_PREFIX_LIST)
+ return template.render(managed_prefix_lists=managed_prefix_lists)
+
+ def get_managed_prefix_list_entries(self):
+ prefix_list_id = self._get_param("PrefixListId")
+ target_version = self._get_param("TargetVersion")
+ managed_prefix_list = self.ec2_backend.get_managed_prefix_list_entries(
+ prefix_list_id=prefix_list_id
+ )
+ entries = []
+ if managed_prefix_list:
+ entries = (
+ list(managed_prefix_list.entries.values())[-1]
+ if managed_prefix_list.entries.values()
+ else []
+ )
+ if target_version:
+ target_version = int(target_version)
+ entries = managed_prefix_list.entries.get(target_version)
+ template = self.response_template(GET_MANAGED_PREFIX_LIST_ENTRIES)
+ return template.render(entries=entries)
+
+ def delete_managed_prefix_list(self):
+ prefix_list_id = self._get_param("PrefixListId")
+ managed_prefix_list = self.ec2_backend.delete_managed_prefix_list(
+ prefix_list_id
+ )
+ template = self.response_template(DELETE_MANAGED_PREFIX_LIST)
+ return template.render(managed_prefix_list=managed_prefix_list)
+
+ def describe_prefix_lists(self):
+ prefix_list_ids = self._get_multi_param("PrefixListId")
+ filters = self._filters_from_querystring()
+ managed_pls = self.ec2_backend.describe_managed_prefix_lists(
+ prefix_list_ids=prefix_list_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_PREFIX_LIST)
+ return template.render(managed_pls=managed_pls)
+
+ def modify_managed_prefix_list(self):
+ add_entry = self._get_multi_param("AddEntry")
+ prefix_list_id = self._get_param("PrefixListId")
+ current_version = self._get_param("CurrentVersion")
+ prefix_list_name = self._get_param("PrefixListName")
+ remove_entry = self._get_multi_param("RemoveEntry")
+
+ current_version = int(current_version) if current_version else None
+
+ managed_prefix_list = self.ec2_backend.modify_managed_prefix_list(
+ add_entry=add_entry,
+ prefix_list_id=prefix_list_id,
+ current_version=current_version,
+ prefix_list_name=prefix_list_name,
+ remove_entry=remove_entry,
+ )
+ template = self.response_template(MODIFY_PREFIX_LIST)
+ return template.render(managed_prefix_list=managed_prefix_list)
+
+
+CREATE_VPC_RESPONSE = """
+<CreateVpcResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpc>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <state>pending</state>
+ <cidrBlock>{{ vpc.cidr_block }}</cidrBlock>
+ {% if doc_date == "2016-11-15" %}
+ <cidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set() %}
+ <item>
+ <cidrBlock>{{assoc.cidr_block}}</cidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <cidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </cidrBlockState>
+ </item>
+ {% endfor %}
+ </cidrBlockAssociationSet>
+ <ipv6CidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set(ipv6=True) %}
+ <item>
+ <ipv6CidrBlock>{{assoc.cidr_block}}</ipv6CidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ {% endif %}
+ <dhcpOptionsId>{% if vpc.dhcp_options %}{{ vpc.dhcp_options.id }}{% else %}dopt-1a2b3c4d2{% endif %}</dhcpOptionsId>
+ <instanceTenancy>{{ vpc.instance_tenancy }}</instanceTenancy>
+ <ownerId> {{ vpc.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in vpc.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpc>
+</CreateVpcResponse>"""
+
+DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """
+<DescribeVpcClassicLinkDnsSupportResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <vpcs>
+ {% for vpc in vpcs %}
+ <item>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <classicLinkDnsSupported>{{ vpc.classic_link_dns_supported }}</classicLinkDnsSupported>
+ </item>
+ {% endfor %}
+ </vpcs>
+</DescribeVpcClassicLinkDnsSupportResponse>"""
+
+ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """
+<EnableVpcClassicLinkDnsSupportResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <return>{{ classic_link_dns_supported }}</return>
+</EnableVpcClassicLinkDnsSupportResponse>"""
+
+DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """
+<DisableVpcClassicLinkDnsSupportResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <return>{{ classic_link_dns_supported }}</return>
+</DisableVpcClassicLinkDnsSupportResponse>"""
+
+DESCRIBE_VPC_CLASSIC_LINK_RESPONSE = """
+<DescribeVpcClassicLinkResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <vpcSet>
+ {% for vpc in vpcs %}
+ <item>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <classicLinkEnabled>{{ vpc.classic_link_enabled }}</classicLinkEnabled>
+ </item>
+ {% endfor %}
+ </vpcSet>
+</DescribeVpcClassicLinkResponse>"""
+
+ENABLE_VPC_CLASSIC_LINK_RESPONSE = """
+<EnableVpcClassicLinkResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <return>{{ classic_link_enabled }}</return>
+</EnableVpcClassicLinkResponse>"""
+
+DISABLE_VPC_CLASSIC_LINK_RESPONSE = """
+<DisableVpcClassicLinkResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <return>{{ classic_link_enabled }}</return>
+</DisableVpcClassicLinkResponse>"""
+
+DESCRIBE_VPCS_RESPONSE = """
+<DescribeVpcsResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
+ <requestId>7a62c442-3484-4f42-9342-6942EXAMPLE</requestId>
+ <vpcSet>
+ {% for vpc in vpcs %}
+ <item>
+ <vpcId>{{ vpc.id }}</vpcId>
+ <state>{{ vpc.state }}</state>
+ <cidrBlock>{{ vpc.cidr_block }}</cidrBlock>
+ {% if doc_date == "2016-11-15" %}
+ <cidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set() %}
+ <item>
+ <cidrBlock>{{assoc.cidr_block}}</cidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <cidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </cidrBlockState>
+ </item>
+ {% endfor %}
+ </cidrBlockAssociationSet>
+ <ipv6CidrBlockAssociationSet>
+ {% for assoc in vpc.get_cidr_block_association_set(ipv6=True) %}
+ <item>
+ <ipv6CidrBlock>{{assoc.cidr_block}}</ipv6CidrBlock>
+ <associationId>{{ assoc.association_id }}</associationId>
+ <ipv6CidrBlockState>
+ <state>{{assoc.cidr_block_state.state}}</state>
+ </ipv6CidrBlockState>
+ </item>
+ {% endfor %}
+ </ipv6CidrBlockAssociationSet>
+ {% endif %}
+ <dhcpOptionsId>{% if vpc.dhcp_options %}{{ vpc.dhcp_options.id }}{% else %}dopt-7a8b9c2d{% endif %}</dhcpOptionsId>
+ <instanceTenancy>{{ vpc.instance_tenancy }}</instanceTenancy>
+ <isDefault>{{ vpc.is_default }}</isDefault>
+ <ownerId> {{ vpc.owner_id }}</ownerId>
+ <tagSet>
+ {% for tag in vpc.get_tags() %}
+ <item>
+ <resourceId>{{ tag.resource_id }}</resourceId>
+ <resourceType>{{ tag.resource_type }}</resourceType>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpcSet>
+</DescribeVpcsResponse>"""
+
+DELETE_VPC_RESPONSE = """
+<DeleteVpcResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpcResponse>
+"""
+
+MODIFY_VPC_TENANCY_RESPONSE = """
+<ModifyVpcTenancyResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</ModifyVpcTenancyResponse>
+"""
+
+DESCRIBE_VPC_ATTRIBUTE_RESPONSE = """
+<DescribeVpcAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{ vpc_id }}</vpcId>
+ <{{ attribute }}>
+ <value>{{ value }}</value>
+ </{{ attribute }}>
+</DescribeVpcAttributeResponse>"""
+
+MODIFY_VPC_ATTRIBUTE_RESPONSE = """
+<ModifyVpcAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</ModifyVpcAttributeResponse>"""
+
+ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<AssociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <cidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <cidrBlock>{{cidr_block}}</cidrBlock>
+ <cidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </cidrBlockState>
+ </cidrBlockAssociation>
+</AssociateVpcCidrBlockResponse>"""
+
+DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<DisassociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <cidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <cidrBlock>{{cidr_block}}</cidrBlock>
+ <cidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </cidrBlockState>
+ </cidrBlockAssociation>
+</DisassociateVpcCidrBlockResponse>"""
+
+IPV6_ASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<AssociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>33af6c54-1139-4d50-b4f7-15a8example</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <ipv6CidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <ipv6CidrBlock>{{cidr_block}}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </ipv6CidrBlockState>
+ </ipv6CidrBlockAssociation>
+</AssociateVpcCidrBlockResponse>"""
+
+IPV6_DISASSOCIATE_VPC_CIDR_BLOCK_RESPONSE = """
+<DisassociateVpcCidrBlockResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>33af6c54-1139-4d50-b4f7-15a8example</requestId>
+ <vpcId>{{vpc_id}}</vpcId>
+ <ipv6CidrBlockAssociation>
+ <associationId>{{association_id}}</associationId>
+ <ipv6CidrBlock>{{cidr_block}}</ipv6CidrBlock>
+ <ipv6CidrBlockState>
+ <state>{{cidr_block_state}}</state>
+ </ipv6CidrBlockState>
+ </ipv6CidrBlockAssociation>
+</DisassociateVpcCidrBlockResponse>"""
+
+CREATE_VPC_END_POINT = """ <CreateVpcEndpointResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <vpcEndpoint>
+ <policyDocument>{{ vpc_end_point.policy_document }}</policyDocument>
+ <state>{{ vpc_end_point.state }}</state>
+ <vpcEndpointPolicySupported> false </vpcEndpointPolicySupported>
+ <serviceName>{{ vpc_end_point.service_name }}</serviceName>
+ <vpcId>{{ vpc_end_point.vpc_id }}</vpcId>
+ <vpcEndpointId>{{ vpc_end_point.id }}</vpcEndpointId>
+ <routeTableIdSet>
+ {% for routeid in vpc_end_point.route_table_ids %}
+ <item>{{ routeid }}</item>
+ {% endfor %}
+ </routeTableIdSet>
+ <networkInterfaceIdSet>
+ {% for network_interface_id in vpc_end_point.network_interface_ids %}
+ <item>{{ network_interface_id }}</item>
+ {% endfor %}
+ </networkInterfaceIdSet>
+ <subnetIdSet>
+ {% for subnetId in vpc_end_point.subnet_ids %}
+ <item>{{ subnetId }}</item>
+ {% endfor %}
+ </subnetIdSet>
+ <privateDnsEnabled>{{ 'true' if vpc_end_point.private_dns_enabled else 'false' }}</privateDnsEnabled>
+ <dnsEntrySet>
+ {% if vpc_end_point.dns_entries %}
+ {% for entry in vpc_end_point.dns_entries %}
+ <item>
+ <hostedZoneId>{{ entry["hosted_zone_id"] }}</hostedZoneId>
+ <dnsName>{{ entry["dns_name"] }}</dnsName>
+ </item>
+ {% endfor %}
+ {% endif %}
+ </dnsEntrySet>
+ <tagSet>
+ {% for tag in vpc_end_point.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <creationTimestamp>{{ vpc_end_point.created_at }}</creationTimestamp>
+ </vpcEndpoint>
+</CreateVpcEndpointResponse>"""
+
+DESCRIBE_VPC_ENDPOINT_SERVICES_RESPONSE = """<DescribeVpcEndpointServicesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
+ <serviceNameSet>
+ {% for serviceName in vpc_end_points.serviceNames %}
+ <item>{{ serviceName }}</item>
+ {% endfor %}
+ </serviceNameSet>
+ <serviceDetailSet>
+ {% for service in vpc_end_points.servicesDetails %}
+ <item>
+ <acceptanceRequired>{{ 'true' if service.AcceptanceRequired else 'false' }}</acceptanceRequired>
+ <availabilityZoneSet>
+ {% for zone in service.AvailabilityZones %}
+ <item>{{ zone }}</item>
+ {% endfor %}
+ </availabilityZoneSet>
+ <baseEndpointDnsNameSet>
+ {% for endpoint in service.BaseEndpointDnsNames %}
+ <item>{{ endpoint }}</item>
+ {% endfor %}
+ </baseEndpointDnsNameSet>
+ <managesVpcEndpoints>{{ 'true' if service.ManagesVpcEndpoints else 'false' }}</managesVpcEndpoints>
+ <owner>{{ service.Owner }}</owner>
+ {% if service.PrivateDnsName is defined %}
+ <privateDnsName>{{ service.PrivateDnsName }}</privateDnsName>
+ <privateDnsNameSet>
+ {% for dns_name in service.PrivateDnsNames %}
+ <item>
+ <privateDnsName>{{ dns_name.PrivateDnsName }}</privateDnsName>
+ </item>
+ {% endfor %}
+ </privateDnsNameSet>
+ <privateDnsNameVerificationState>{{ service.PrivateDnsNameVerificationState }}</privateDnsNameVerificationState>
+ {% endif %}
+ <serviceId>{{ service.ServiceId }}</serviceId>
+ <serviceName>{{ service.ServiceName }}</serviceName>
+ <serviceType>
+ {% for service_type in service.ServiceType %}
+ <item>
+ <serviceType>{{ service_type.ServiceType }}</serviceType>
+ </item>
+ {% endfor %}
+ </serviceType>
+ <tagSet>
+ {% for tag in service.Tags %}
+ {% for key, value in tag.items() %}
+ <item>
+ <key>{{ key }}</key>
+ <value>{{ value }}</value>
+ </item>
+ {% endfor %}
+ {% endfor %}
+ </tagSet>
+ <vpcEndpointPolicySupported>{{ 'true' if service.VpcEndpointPolicySupported else 'false' }}</vpcEndpointPolicySupported>
+ </item>
+ {% endfor %}
+ </serviceDetailSet>
+ {% if vpc_end_points.nextToken|length %}
+ <nextToken>{{ vpc_end_points.nextToken }}</nextToken>
+ {% endif %}
+</DescribeVpcEndpointServicesResponse>"""
+
+DESCRIBE_VPC_ENDPOINT_RESPONSE = """<DescribeVpcEndpointsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
+ <vpcEndpointSet>
+ {% for vpc_end_point in vpc_end_points %}
+ <item>
+ {% if vpc_end_point.policy_document %}
+ <policyDocument>{{ vpc_end_point.policy_document }}</policyDocument>
+ {% endif %}
+ <state>{{ vpc_end_point.state }}</state>
+ <privateDnsEnabled>{{ 'true' if vpc_end_point.private_dns_enabled else 'false' }}</privateDnsEnabled>
+ <serviceName>{{ vpc_end_point.service_name }}</serviceName>
+ <vpcId>{{ vpc_end_point.vpc_id }}</vpcId>
+ <vpcEndpointId>{{ vpc_end_point.id }}</vpcEndpointId>
+ <vpcEndpointType>{{ vpc_end_point.endpoint_type }}</vpcEndpointType>
+ {% if vpc_end_point.subnet_ids %}
+ <subnetIdSet>
+ {% for subnet_id in vpc_end_point.subnet_ids %}
+ <item>{{ subnet_id }}</item>
+ {% endfor %}
+ </subnetIdSet>
+ {% endif %}
+ {% if vpc_end_point.route_table_ids %}
+ <routeTableIdSet>
+ {% for route_table_id in vpc_end_point.route_table_ids %}
+ <item>{{ route_table_id }}</item>
+ {% endfor %}
+ </routeTableIdSet>
+ {% endif %}
+ {% if vpc_end_point.network_interface_ids %}
+ <networkInterfaceIdSet>
+ {% for network_interface_id in vpc_end_point.network_interface_ids %}
+ <item>{{ network_interface_id }}</item>
+ {% endfor %}
+ </networkInterfaceIdSet>
+ {% endif %}
+ <dnsEntrySet>
+ {% if vpc_end_point.dns_entries %}
+ {% for entry in vpc_end_point.dns_entries %}
+ <item>
+ <hostedZoneId>{{ entry["hosted_zone_id"] }}</hostedZoneId>
+ <dnsName>{{ entry["dns_name"] }}</dnsName>
+ </item>
+ {% endfor %}
+ {% endif %}
+ </dnsEntrySet>
+ {% if vpc_end_point.security_group_ids %}
+ <groupSet>
+ {% for group_id in vpc_end_point.security_group_ids %}
+ <item>
+ <groupId>{{ group_id }}</groupId>
+ <groupName>TODO</groupName>
+ </item>
+ {% endfor %}
+ </groupSet>
+ {% endif %}
+ <tagSet>
+ {% for tag in vpc_end_point.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <ownerId>{{ account_id }}</ownerId>
+ <creationTimestamp>{{ vpc_end_point.created_at }}</creationTimestamp>
+ </item>
+ {% endfor %}
+ </vpcEndpointSet>
+</DescribeVpcEndpointsResponse>"""
+
+
+DELETE_VPC_ENDPOINT_RESPONSE = """<DeleteVpcEndpointsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
+ <unsuccessful>{{ 'Error' if not response else '' }}</unsuccessful>
+</DeleteVpcEndpointsResponse>"""
+
+
+CREATE_MANAGED_PREFIX_LIST = """<CreateManagedPrefixListResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
+ <prefixList>
+ <addressFamily>{{ managed_prefix_list.address_family }}</addressFamily>
+ <maxEntries>{{ managed_prefix_list.max_entries }}</maxEntries>
+ <ownerId>{{ managed_prefix_list.owner_id }}</ownerId>
+ <prefixListArn>{{ managed_prefix_list.prefix_list_arn }}</prefixListArn>
+ <prefixListId>{{ managed_prefix_list.id }}</prefixListId>
+ <prefixListName>{{ managed_prefix_list.prefix_list_name }}</prefixListName>
+ <state>{{ managed_prefix_list.state }}</state>
+ <tagSet>
+ {% for tag in managed_prefix_list.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <version>{{ managed_prefix_list.version }}</version>
+ </prefixList>
+</CreateManagedPrefixListResponse>"""
+
+
+DESCRIBE_MANAGED_PREFIX_LIST = """<DescribeManagedPrefixListsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>934214d3-4501-4797-b896-13e8fc7ec256</requestId>
+ <prefixListSet>
+ {% for managed_prefix_list in managed_prefix_lists %}
+ <item>
+ <addressFamily>{{ managed_prefix_list.address_family }}</addressFamily>
+ {% if managed_prefix_list.max_entries %}
+ <maxEntries>{{ managed_prefix_list.max_entries }}</maxEntries>
+ {% endif %}
+ <ownerId>{{ managed_prefix_list.owner_id }}</ownerId>
+ <prefixListArn>{{ managed_prefix_list.prefix_list_arn }}</prefixListArn>
+ <prefixListId>{{ managed_prefix_list.id }}</prefixListId>
+ <prefixListName>{{ managed_prefix_list.prefix_list_name }}</prefixListName>
+ <state>{{ managed_prefix_list.state }}</state>
+ <tagSet>
+ {% for tag in managed_prefix_list.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ {% if managed_prefix_list.version %}
+ <version>{{ managed_prefix_list.version }}</version>
+ {% endif %}
+ </item>
+ {% endfor %}
+ </prefixListSet>
+</DescribeManagedPrefixListsResponse>
+"""
+
+
+GET_MANAGED_PREFIX_LIST_ENTRIES = """<GetManagedPrefixListEntriesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>39a3c79f-846f-4382-a592-example</requestId>
+ <entrySet>
+ {% for entry in entries %}
+ <item>
+ <cidr>{{ entry.Cidr or ''}}</cidr>
+ <description>{{ entry.Description or ''}}</description>
+ </item>
+ {% endfor %}
+ </entrySet>
+</GetManagedPrefixListEntriesResponse>
+"""
+
+
+DELETE_MANAGED_PREFIX_LIST = """<DeleteManagedPrefixListResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>39a3c79f-846f-4382-a592-example</requestId>
+ <prefixList>
+ <addressFamily>{{ managed_prefix_list.address_family }}</addressFamily>
+ <maxEntries>{{ managed_prefix_list.max_entries or '' }}</maxEntries>
+ <ownerId>{{ managed_prefix_list.owner_id }}</ownerId>
+ <prefixListArn>{{ managed_prefix_list.prefix_list_arn }}</prefixListArn>
+ <prefixListId>{{ managed_prefix_list.id }}</prefixListId>
+ <prefixListName>{{ managed_prefix_list.prefix_list_name }}</prefixListName>
+ <state>{{ managed_prefix_list.state }}</state>
+ <tagSet>
+ {% for tag in managed_prefix_list.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <version>{{ managed_prefix_list.version or ''}}</version>
+ </prefixList>
+</DeleteManagedPrefixListResponse>
+"""
+
+
+DESCRIBE_PREFIX_LIST = """<DescribePrefixListsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>8a2ec0e2-6918-4270-ae45-58e61971e97d</requestId>
+ <prefixListSet>
+ {% for pl in managed_pls %}
+ {% if pl.prefix_list_name and pl.prefix_list_name.startswith("com.amazonaws.") %}
+ <item>
+ <cidrSet>
+ {% for entry in pl.entries.1 %}
+ <item>{{ entry.Cidr }}</item>
+ {% endfor %}
+ </cidrSet>
+ <prefixListId>{{ pl.id }}</prefixListId>
+ <prefixListName>{{ pl.prefix_list_name }}</prefixListName>
+ </item>
+ {% endif %}
+ {% endfor %}
+ </prefixListSet>
+</DescribePrefixListsResponse>
+"""
+
+MODIFY_PREFIX_LIST = """<ModifyManagedPrefixListResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
+ <requestId>602f3752-c348-4b14-81e2-example</requestId>
+ <prefixList>
+ <addressFamily>{{ managed_prefix_list.address_family }}</addressFamily>
+ <maxEntries>{{ managed_prefix_list.max_entries or '' }}</maxEntries>
+ <ownerId>{{ managed_prefix_list.owner_id }}</ownerId>
+ <prefixListArn>{{ managed_prefix_list.prefix_list_arn }}</prefixListArn>
+ <prefixListId>{{ managed_prefix_list.id }}</prefixListId>
+ <prefixListName>{{ managed_prefix_list.prefix_list_name }}</prefixListName>
+ <state>{{ managed_prefix_list.state }}</state>
+ <tagSet>
+ {% for tag in managed_prefix_list.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ <version>{{ managed_prefix_list.version or ''}}</version>
+ </prefixList>
+</ModifyManagedPrefixListResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/ec2/responses/vpn_connections.py b/contrib/python/moto/py3/moto/ec2/responses/vpn_connections.py
new file mode 100644
index 0000000000..edf268c778
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/vpn_connections.py
@@ -0,0 +1,250 @@
+from moto.ec2.utils import add_tag_specification
+from ._base_response import EC2BaseResponse
+from xml.sax.saxutils import escape
+
+
+class VPNConnections(EC2BaseResponse):
+ def create_vpn_connection(self):
+ vpn_conn_type = self._get_param("Type")
+ cgw_id = self._get_param("CustomerGatewayId")
+ vgw_id = self._get_param("VpnGatewayId")
+ tgw_id = self._get_param("TransitGatewayId")
+ static_routes = self._get_param("StaticRoutesOnly")
+ tags = add_tag_specification(self._get_multi_param("TagSpecification"))
+ vpn_connection = self.ec2_backend.create_vpn_connection(
+ vpn_conn_type,
+ cgw_id,
+ vpn_gateway_id=vgw_id,
+ transit_gateway_id=tgw_id,
+ static_routes_only=static_routes,
+ tags=tags,
+ )
+ if vpn_connection.transit_gateway_id:
+ self.ec2_backend.create_transit_gateway_vpn_attachment(
+ vpn_id=vpn_connection.id, transit_gateway_id=tgw_id
+ )
+ template = self.response_template(CREATE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connection=vpn_connection)
+
+ def delete_vpn_connection(self):
+ vpn_connection_id = self._get_param("VpnConnectionId")
+ vpn_connection = self.ec2_backend.delete_vpn_connection(vpn_connection_id)
+ if vpn_connection.transit_gateway_id:
+ transit_gateway_attachments = (
+ self.ec2_backend.describe_transit_gateway_attachments()
+ )
+ for attachment in transit_gateway_attachments:
+ if attachment.resource_id == vpn_connection.id:
+ attachment.state = "deleted"
+ template = self.response_template(DELETE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connection=vpn_connection)
+
+ def describe_vpn_connections(self):
+ vpn_connection_ids = self._get_multi_param("VpnConnectionId")
+ filters = self._filters_from_querystring()
+ vpn_connections = self.ec2_backend.get_all_vpn_connections(
+ vpn_connection_ids=vpn_connection_ids, filters=filters
+ )
+ template = self.response_template(DESCRIBE_VPN_CONNECTION_RESPONSE)
+ return template.render(vpn_connections=vpn_connections)
+
+
+CUSTOMER_GATEWAY_CONFIGURATION_TEMPLATE = """
+ <vpn_connection id="{{ vpn_connection.id }}">
+ <customer_gateway_id>{{ vpn_connection.customer_gateway_id }}</customer_gateway_id>
+ <vpn_gateway_id> {{ vpn_connection.vpn_gateway_id if vpn_connection.vpn_gateway_id is not none }} </vpn_gateway_id>
+ <vpn_connection_type>{{ vpn_connection.type }}</vpn_connection_type>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ <ipsec_tunnel>
+ <customer_gateway>
+ <tunnel_outside_address>
+ <ip_address>12.1.2.3</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.42</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>65000</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </customer_gateway>
+ <vpn_gateway>
+ <tunnel_outside_address>
+ <ip_address>52.2.144.13</ip_address>
+ </tunnel_outside_address>
+ <tunnel_inside_address>
+ <ip_address>169.254.44.41</ip_address>
+ <network_mask>255.255.255.252</network_mask>
+ <network_cidr>30</network_cidr>
+ </tunnel_inside_address>
+ <bgp>
+ <asn>7224</asn>
+ <hold_time>30</hold_time>
+ </bgp>
+ </vpn_gateway>
+ <ike>
+ <authentication_protocol>sha1</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>28800</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>main</mode>
+ <pre_shared_key>Iw2IAN9XUsQeYUrkMGP3kP59ugFDkfHg</pre_shared_key>
+ </ike>
+ <ipsec>
+ <protocol>esp</protocol>
+ <authentication_protocol>hmac-sha1-96</authentication_protocol>
+ <encryption_protocol>aes-128-cbc</encryption_protocol>
+ <lifetime>3600</lifetime>
+ <perfect_forward_secrecy>group2</perfect_forward_secrecy>
+ <mode>tunnel</mode>
+ <clear_df_bit>true</clear_df_bit>
+ <fragmentation_before_encryption>true</fragmentation_before_encryption>
+ <tcp_mss_adjustment>1387</tcp_mss_adjustment>
+ <dead_peer_detection>
+ <interval>10</interval>
+ <retries>3</retries>
+ </dead_peer_detection>
+ </ipsec>
+ </ipsec_tunnel>
+ </vpn_connection>
+"""
+
+CREATE_VPN_CONNECTION_RESPONSE = (
+ """
+<CreateVpnConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnConnection>
+ <vpnConnectionId>{{ vpn_connection.id }}</vpnConnectionId>
+ <state>{{ vpn_connection.state }}</state>
+ <customerGatewayConfiguration>
+ """
+ + escape(CUSTOMER_GATEWAY_CONFIGURATION_TEMPLATE)
+ + """
+ </customerGatewayConfiguration>
+ <type>ipsec.1</type>
+ <customerGatewayId>{{ vpn_connection.customer_gateway_id }}</customerGatewayId>
+ <vpnGatewayId>{{ vpn_connection.vpn_gateway_id or '' }}</vpnGatewayId>
+ {% if vpn_connection.transit_gateway_id %}
+ <transitGatewayId>{{ vpn_connection.transit_gateway_id }}</transitGatewayId>
+ {% endif %}
+ <tagSet>
+ {% for tag in vpn_connection.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </vpnConnection>
+</CreateVpnConnectionResponse>"""
+)
+
+
+CREATE_VPN_CONNECTION_ROUTE_RESPONSE = """
+<CreateVpnConnectionRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10- 15/">
+ <requestId>4f35a1b2-c2c3-4093-b51f-abb9d7311990</requestId>
+ <return>true</return>
+</CreateVpnConnectionRouteResponse>"""
+
+
+DELETE_VPN_CONNECTION_RESPONSE = """
+<DeleteVpnConnectionResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <return>true</return>
+</DeleteVpnConnectionResponse>"""
+
+
+DELETE_VPN_CONNECTION_ROUTE_RESPONSE = """
+<DeleteVpnConnectionRouteResponse xmlns="http://ec2.amazonaws.com/doc/2013-10- 15/">
+ <requestId>4f35a1b2-c2c3-4093-b51f-abb9d7311990</requestId>
+ <return>true</return>
+</DeleteVpnConnectionRouteResponse>"""
+
+
+DESCRIBE_VPN_CONNECTION_RESPONSE = (
+ """
+<DescribeVpnConnectionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
+ <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>
+ <vpnConnectionSet>
+ {% for vpn_connection in vpn_connections %}
+ <item>
+ <vpnConnectionId>{{ vpn_connection.id }}</vpnConnectionId>
+ <state>{{ vpn_connection.state }}</state>
+ <customerGatewayConfiguration>
+ """
+ + escape(CUSTOMER_GATEWAY_CONFIGURATION_TEMPLATE)
+ + """
+ </customerGatewayConfiguration>
+ <type>ipsec.1</type>
+ <customerGatewayId>{{ vpn_connection.customer_gateway_id }}</customerGatewayId>
+ <vpnGatewayId>{{ vpn_connection.vpn_gateway_id or '' }}</vpnGatewayId>
+ {% if vpn_connection.transit_gateway_id %}
+ <transitGatewayId>{{ vpn_connection.transit_gateway_id }}</transitGatewayId>
+ {% endif %}
+ <tagSet>
+ {% for tag in vpn_connection.get_tags() %}
+ <item>
+ <key>{{ tag.key }}</key>
+ <value>{{ tag.value }}</value>
+ </item>
+ {% endfor %}
+ </tagSet>
+ </item>
+ {% endfor %}
+ </vpnConnectionSet>
+</DescribeVpnConnectionsResponse>"""
+)
diff --git a/contrib/python/moto/py3/moto/ec2/responses/windows.py b/contrib/python/moto/py3/moto/ec2/responses/windows.py
new file mode 100644
index 0000000000..673fc6dedf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/responses/windows.py
@@ -0,0 +1,17 @@
+from moto.core.responses import BaseResponse
+
+
+class Windows(BaseResponse):
+ def bundle_instance(self):
+ raise NotImplementedError("Windows.bundle_instance is not yet implemented")
+
+ def cancel_bundle_task(self):
+ raise NotImplementedError("Windows.cancel_bundle_task is not yet implemented")
+
+ def describe_bundle_tasks(self):
+ raise NotImplementedError(
+ "Windows.describe_bundle_tasks is not yet implemented"
+ )
+
+ def get_password_data(self):
+ raise NotImplementedError("Windows.get_password_data is not yet implemented")
diff --git a/contrib/python/moto/py3/moto/ec2/urls.py b/contrib/python/moto/py3/moto/ec2/urls.py
new file mode 100644
index 0000000000..8ab8ead926
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/urls.py
@@ -0,0 +1,6 @@
+from .responses import EC2Response
+
+
+url_bases = [r"https?://ec2\.(.+)\.amazonaws\.com(|\.cn)"]
+
+url_paths = {"{0}/": EC2Response.dispatch}
diff --git a/contrib/python/moto/py3/moto/ec2/utils.py b/contrib/python/moto/py3/moto/ec2/utils.py
new file mode 100644
index 0000000000..08ddcddf20
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2/utils.py
@@ -0,0 +1,788 @@
+import base64
+import fnmatch
+import random
+import re
+import ipaddress
+
+from datetime import datetime
+from cryptography.hazmat.primitives import serialization
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives.asymmetric import rsa
+
+from moto.core import get_account_id
+from moto.iam import iam_backends
+from moto.utilities.utils import md5_hash
+
+EC2_RESOURCE_TO_PREFIX = {
+ "customer-gateway": "cgw",
+ "transit-gateway": "tgw",
+ "transit-gateway-route-table": "tgw-rtb",
+ "transit-gateway-attachment": "tgw-attach",
+ "dhcp-options": "dopt",
+ "flow-logs": "fl",
+ "image": "ami",
+ "instance": "i",
+ "internet-gateway": "igw",
+ "egress-only-internet-gateway": "eigw",
+ "launch-template": "lt",
+ "nat-gateway": "nat",
+ "network-acl": "acl",
+ "network-acl-subnet-assoc": "aclassoc",
+ "network-interface": "eni",
+ "network-interface-attachment": "eni-attach",
+ "reserved-instance": "uuid4",
+ "route-table": "rtb",
+ "route-table-association": "rtbassoc",
+ "security-group": "sg",
+ "security-group-rule": "sgr",
+ "snapshot": "snap",
+ "spot-instance-request": "sir",
+ "spot-fleet-request": "sfr",
+ "subnet": "subnet",
+ "subnet-ipv6-cidr-block-association": "subnet-cidr-assoc",
+ "reservation": "r",
+ "volume": "vol",
+ "vpc": "vpc",
+ "vpc-endpoint": "vpce",
+ "vpc-endpoint-service": "vpce-svc",
+ "managed-prefix-list": "pl",
+ "vpc-cidr-association-id": "vpc-cidr-assoc",
+ "vpc-elastic-ip": "eipalloc",
+ "vpc-elastic-ip-association": "eipassoc",
+ "vpc-peering-connection": "pcx",
+ "vpn-connection": "vpn",
+ "vpn-gateway": "vgw",
+ "iam-instance-profile-association": "iip-assoc",
+ "carrier-gateway": "cagw",
+}
+
+
+EC2_PREFIX_TO_RESOURCE = dict((v, k) for (k, v) in EC2_RESOURCE_TO_PREFIX.items())
+HEX_CHARS = list(str(x) for x in range(10)) + ["a", "b", "c", "d", "e", "f"]
+
+
+def random_resource_id(size=8):
+ return "".join(random.choice(HEX_CHARS) for _ in range(size))
+
+
+def random_id(prefix="", size=8):
+ return f"{prefix}-{random_resource_id(size)}"
+
+
+def random_ami_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["image"])
+
+
+def random_instance_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["instance"], size=17)
+
+
+def random_reservation_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["reservation"])
+
+
+def random_security_group_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["security-group"], size=17)
+
+
+def random_security_group_rule_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["security-group-rule"], size=17)
+
+
+def random_flow_log_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["flow-logs"])
+
+
+def random_snapshot_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["snapshot"])
+
+
+def random_spot_request_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["spot-instance-request"])
+
+
+def random_spot_fleet_request_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["spot-fleet-request"])
+
+
+def random_subnet_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["subnet"])
+
+
+def random_subnet_ipv6_cidr_block_association_id():
+ return random_id(
+ prefix=EC2_RESOURCE_TO_PREFIX["subnet-ipv6-cidr-block-association"]
+ )
+
+
+def random_subnet_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["route-table-association"])
+
+
+def random_network_acl_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["network-acl"])
+
+
+def random_network_acl_subnet_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["network-acl-subnet-assoc"])
+
+
+def random_vpn_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpn-gateway"])
+
+
+def random_vpn_connection_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpn-connection"])
+
+
+def random_customer_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["customer-gateway"])
+
+
+def random_volume_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["volume"])
+
+
+def random_vpc_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc"])
+
+
+def random_vpc_ep_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc-endpoint"], size=8)
+
+
+def random_vpc_cidr_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc-cidr-association-id"])
+
+
+def random_vpc_peering_connection_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc-peering-connection"])
+
+
+def random_eip_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc-elastic-ip-association"])
+
+
+def random_internet_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["internet-gateway"])
+
+
+def random_egress_only_internet_gateway_id():
+ return random_id(
+ prefix=EC2_RESOURCE_TO_PREFIX["egress-only-internet-gateway"], size=17
+ )
+
+
+def random_route_table_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["route-table"])
+
+
+def random_eip_allocation_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["vpc-elastic-ip"])
+
+
+def random_dhcp_option_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["dhcp-options"])
+
+
+def random_eni_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["network-interface"])
+
+
+def random_eni_attach_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["network-interface-attachment"])
+
+
+def random_nat_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["nat-gateway"], size=17)
+
+
+def random_transit_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["transit-gateway"], size=17)
+
+
+def random_transit_gateway_route_table_id():
+ return random_id(
+ prefix=EC2_RESOURCE_TO_PREFIX["transit-gateway-route-table"], size=17
+ )
+
+
+def random_transit_gateway_attachment_id():
+ return random_id(
+ prefix=EC2_RESOURCE_TO_PREFIX["transit-gateway-attachment"], size=17
+ )
+
+
+def random_launch_template_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["launch-template"], size=17)
+
+
+def random_iam_instance_profile_association_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["iam-instance-profile-association"])
+
+
+def random_carrier_gateway_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["carrier-gateway"], size=17)
+
+
+def random_public_ip():
+ return "54.214.{0}.{1}".format(random.choice(range(255)), random.choice(range(255)))
+
+
+def random_private_ip(cidr=None, ipv6=False):
+ # prefix - ula.prefixlen : get number of remaing length for the IP.
+ # prefix will be 32 for IPv4 and 128 for IPv6.
+ # random.getrandbits() will generate remaining bits for IPv6 or Ipv4 in decimal format
+ if cidr:
+ if ipv6:
+ ula = ipaddress.IPv6Network(cidr)
+ return str(ula.network_address + (random.getrandbits(128 - ula.prefixlen)))
+ ula = ipaddress.IPv4Network(cidr)
+ return str(ula.network_address + (random.getrandbits(32 - ula.prefixlen)))
+ if ipv6:
+ return "2001::cafe:%x/64" % random.getrandbits(16)
+ return "10.{0}.{1}.{2}".format(
+ random.choice(range(255)), random.choice(range(255)), random.choice(range(255))
+ )
+
+
+def random_ip():
+ return "127.{0}.{1}.{2}".format(
+ random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
+ )
+
+
+def generate_dns_from_ip(ip, dns_type="internal"):
+ splits = ip.split("/")[0].split(".") if "/" in ip else ip.split(".")
+ return "ip-{}-{}-{}-{}.ec2.{}".format(
+ splits[0], splits[1], splits[2], splits[3], dns_type
+ )
+
+
+def random_mac_address():
+ return "02:00:00:%02x:%02x:%02x" % (
+ random.randint(0, 255),
+ random.randint(0, 255),
+ random.randint(0, 255),
+ )
+
+
+def randor_ipv4_cidr():
+ return "10.0.{}.{}/16".format(random.randint(0, 255), random.randint(0, 255))
+
+
+def random_ipv6_cidr():
+ return "2400:6500:{}:{}00::/56".format(random_resource_id(4), random_resource_id(2))
+
+
+def generate_route_id(
+ route_table_id, cidr_block, ipv6_cidr_block=None, prefix_list=None
+):
+ if ipv6_cidr_block and not cidr_block:
+ cidr_block = ipv6_cidr_block
+ if prefix_list and not cidr_block:
+ cidr_block = prefix_list
+ return "%s~%s" % (route_table_id, cidr_block)
+
+
+def random_managed_prefix_list_id():
+ return random_id(prefix=EC2_RESOURCE_TO_PREFIX["managed-prefix-list"], size=8)
+
+
+def create_dns_entries(service_name, vpc_endpoint_id):
+ dns_entries = {}
+ dns_entries["dns_name"] = "{}-{}.{}".format(
+ vpc_endpoint_id, random_resource_id(8), service_name
+ )
+ dns_entries["hosted_zone_id"] = random_resource_id(13).upper()
+ return dns_entries
+
+
+def utc_date_and_time():
+ x = datetime.utcnow()
+ # Better performing alternative to x.strftime("%Y-%m-%dT%H:%M:%S.000Z")
+ return "{}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}.000Z".format(
+ x.year, x.month, x.day, x.hour, x.minute, x.second
+ )
+
+
+def split_route_id(route_id):
+ values = route_id.split("~")
+ return values[0], values[1]
+
+
+def get_attribute_value(parameter, querystring_dict):
+ for key, value in querystring_dict.items():
+ match = re.search(r"{0}.Value".format(parameter), key)
+ if match:
+ if value[0].lower() in ["true", "false"]:
+ return True if value[0].lower() in ["true"] else False
+ return value[0]
+ return None
+
+
+def get_object_value(obj, attr):
+ keys = attr.split(".")
+ val = obj
+ for key in keys:
+ if key == "owner_id":
+ return get_account_id()
+ elif hasattr(val, key):
+ val = getattr(val, key)
+ elif isinstance(val, dict):
+ val = val[key]
+ elif isinstance(val, list):
+ for item in val:
+ item_val = get_object_value(item, key)
+ if item_val:
+ return item_val
+ else:
+ return None
+ return val
+
+
+def is_tag_filter(filter_name):
+ return (
+ filter_name.startswith("tag:")
+ or filter_name.startswith("tag-value")
+ or filter_name.startswith("tag-key")
+ )
+
+
+def get_obj_tag(obj, filter_name):
+ tag_name = filter_name.replace("tag:", "", 1)
+ tags = dict((tag["key"], tag["value"]) for tag in obj.get_tags())
+ return tags.get(tag_name)
+
+
+def get_obj_tag_names(obj):
+ tags = set((tag["key"] for tag in obj.get_tags()))
+ return tags
+
+
+def get_obj_tag_values(obj, key=None):
+ tags = set(
+ (tag["value"] for tag in obj.get_tags() if tag["key"] == key or key is None)
+ )
+ return tags
+
+
+def add_tag_specification(tags):
+ tags = tags[0] if isinstance(tags, list) and len(tags) == 1 else tags
+ tags = (tags or {}).get("Tag", [])
+ tags = {t["Key"]: t["Value"] for t in tags}
+ return tags
+
+
+def tag_filter_matches(obj, filter_name, filter_values):
+ regex_filters = [re.compile(simple_aws_filter_to_re(f)) for f in filter_values]
+ if filter_name == "tag-key":
+ tag_values = get_obj_tag_names(obj)
+ elif filter_name == "tag-value":
+ tag_values = get_obj_tag_values(obj)
+ elif filter_name.startswith("tag:"):
+ key = filter_name[4:]
+ tag_values = get_obj_tag_values(obj, key=key)
+ else:
+ tag_values = [get_obj_tag(obj, filter_name) or ""]
+
+ for tag_value in tag_values:
+ if any(regex.match(tag_value) for regex in regex_filters):
+ return True
+
+ return False
+
+
+filter_dict_attribute_mapping = {
+ "instance-state-name": "state",
+ "instance-id": "id",
+ "state-reason-code": "_state_reason.code",
+ "source-dest-check": "source_dest_check",
+ "vpc-id": "vpc_id",
+ "group-id": "security_groups.id",
+ "instance.group-id": "security_groups.id",
+ "instance.group-name": "security_groups.name",
+ "instance-type": "instance_type",
+ "private-ip-address": "private_ip",
+ "ip-address": "public_ip",
+ "availability-zone": "placement",
+ "architecture": "architecture",
+ "image-id": "image_id",
+ "network-interface.private-dns-name": "private_dns",
+ "private-dns-name": "private_dns",
+ "owner-id": "owner_id",
+ "subnet-id": "subnet_id",
+ "dns-name": "public_dns",
+}
+
+
+def passes_filter_dict(instance, filter_dict):
+ for filter_name, filter_values in filter_dict.items():
+ if filter_name in filter_dict_attribute_mapping:
+ instance_attr = filter_dict_attribute_mapping[filter_name]
+ instance_value = get_object_value(instance, instance_attr)
+ if not instance_value_in_filter_values(instance_value, filter_values):
+ return False
+
+ elif is_tag_filter(filter_name):
+ if not tag_filter_matches(instance, filter_name, filter_values):
+ return False
+ else:
+ raise NotImplementedError(
+ "Filter dicts have not been implemented in Moto for '%s' yet. Feel free to open an issue at https://github.com/spulec/moto/issues"
+ % filter_name
+ )
+ return True
+
+
+def instance_value_in_filter_values(instance_value, filter_values):
+ if isinstance(instance_value, list):
+ if not set(filter_values).intersection(set(instance_value)):
+ return False
+ elif instance_value not in filter_values:
+ return False
+ return True
+
+
+def filter_reservations(reservations, filter_dict):
+ result = []
+ for reservation in reservations:
+ new_instances = []
+ for instance in reservation.instances:
+ if passes_filter_dict(instance, filter_dict):
+ new_instances.append(instance)
+ if new_instances:
+ reservation.instances = new_instances
+ result.append(reservation)
+ return result
+
+
+filter_dict_igw_mapping = {
+ "attachment.vpc-id": "vpc.id",
+ "attachment.state": "attachment_state",
+ "internet-gateway-id": "id",
+}
+
+
+def passes_igw_filter_dict(igw, filter_dict):
+ for filter_name, filter_values in filter_dict.items():
+ if filter_name in filter_dict_igw_mapping:
+ igw_attr = filter_dict_igw_mapping[filter_name]
+ if get_object_value(igw, igw_attr) not in filter_values:
+ return False
+ elif is_tag_filter(filter_name):
+ if not tag_filter_matches(igw, filter_name, filter_values):
+ return False
+ else:
+ raise NotImplementedError(
+ "Internet Gateway filter dicts have not been implemented in Moto for '%s' yet. Feel free to open an issue at https://github.com/spulec/moto/issues",
+ filter_name,
+ )
+ return True
+
+
+def filter_internet_gateways(igws, filter_dict):
+ result = []
+ for igw in igws:
+ if passes_igw_filter_dict(igw, filter_dict):
+ result.append(igw)
+ return result
+
+
+def is_filter_matching(obj, _filter, filter_value):
+ value = obj.get_filter_value(_filter)
+
+ if filter_value is None:
+ return False
+
+ if isinstance(value, str):
+ if not isinstance(filter_value, list):
+ filter_value = [filter_value]
+ if any(fnmatch.fnmatch(value, pattern) for pattern in filter_value):
+ return True
+ return False
+
+ if isinstance(value, type({}.keys())):
+ if isinstance(filter_value, str) and filter_value in value:
+ return True
+
+ try:
+ value = set(value)
+ return (value and value.issubset(filter_value)) or value.issuperset(
+ filter_value
+ )
+ except TypeError:
+ return value in filter_value
+
+
+def generic_filter(filters, objects):
+ if filters:
+ for (_filter, _filter_value) in filters.items():
+ objects = [
+ obj
+ for obj in objects
+ if is_filter_matching(obj, _filter, _filter_value)
+ ]
+
+ return objects
+
+
+def simple_aws_filter_to_re(filter_string):
+ tmp_filter = filter_string.replace(r"\?", "[?]")
+ tmp_filter = tmp_filter.replace(r"\*", "[*]")
+ tmp_filter = fnmatch.translate(tmp_filter)
+ return tmp_filter
+
+
+def random_key_pair():
+ private_key = rsa.generate_private_key(
+ public_exponent=65537, key_size=2048, backend=default_backend()
+ )
+ private_key_material = private_key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption(),
+ )
+ public_key_fingerprint = rsa_public_key_fingerprint(private_key.public_key())
+
+ return {
+ "fingerprint": public_key_fingerprint,
+ "material": private_key_material.decode("ascii"),
+ }
+
+
+def get_prefix(resource_id):
+ resource_id_prefix, _, after = resource_id.partition("-")
+ if resource_id_prefix == EC2_RESOURCE_TO_PREFIX["transit-gateway"]:
+ if after.startswith("rtb"):
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX["transit-gateway-route-table"]
+ if after.startswith("attach"):
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX["transit-gateway-attachment"]
+ if resource_id_prefix == EC2_RESOURCE_TO_PREFIX["network-interface"]:
+ if after.startswith("attach"):
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX["network-interface-attachment"]
+ if resource_id.startswith(EC2_RESOURCE_TO_PREFIX["vpc-endpoint-service"]):
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX["vpc-endpoint-service"]
+ if resource_id_prefix not in EC2_RESOURCE_TO_PREFIX.values():
+ uuid4hex = re.compile(r"[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}\Z", re.I)
+ if uuid4hex.match(resource_id) is not None:
+ resource_id_prefix = EC2_RESOURCE_TO_PREFIX["reserved-instance"]
+ else:
+ return None
+ return resource_id_prefix
+
+
+def is_valid_resource_id(resource_id):
+ valid_prefixes = EC2_RESOURCE_TO_PREFIX.values()
+ resource_id_prefix = get_prefix(resource_id)
+ if resource_id_prefix not in valid_prefixes:
+ return False
+ resource_id_pattern = resource_id_prefix + "-[0-9a-f]{8}"
+ resource_pattern_re = re.compile(resource_id_pattern)
+ return resource_pattern_re.match(resource_id) is not None
+
+
+def is_valid_cidr(cird):
+ cidr_pattern = r"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(\d|[1-2]\d|3[0-2]))$"
+ cidr_pattern_re = re.compile(cidr_pattern)
+ return cidr_pattern_re.match(cird) is not None
+
+
+def is_valid_ipv6_cidr(cird):
+ cidr_pattern = r"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$"
+ cidr_pattern_re = re.compile(cidr_pattern)
+ return cidr_pattern_re.match(cird) is not None
+
+
+def generate_instance_identity_document(instance):
+ """
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
+
+ A JSON file that describes an instance. Usually retrieved by URL:
+ http://169.254.169.254/latest/dynamic/instance-identity/document
+ Here we just fill a dictionary that represents the document
+
+ Typically, this document is used by the amazon-ecs-agent when registering a
+ new ContainerInstance
+ """
+
+ document = {
+ "devPayProductCodes": None,
+ "availabilityZone": instance.placement["AvailabilityZone"],
+ "privateIp": instance.private_ip_address,
+ "version": "2010-8-31",
+ "region": instance.placement["AvailabilityZone"][:-1],
+ "instanceId": instance.id,
+ "billingProducts": None,
+ "instanceType": instance.instance_type,
+ "accountId": "012345678910",
+ "pendingTime": "2015-11-19T16:32:11Z",
+ "imageId": instance.image_id,
+ "kernelId": instance.kernel_id,
+ "ramdiskId": instance.ramdisk_id,
+ "architecture": instance.architecture,
+ }
+
+ return document
+
+
+def rsa_public_key_parse(key_material):
+ # These imports take ~.5s; let's keep them local
+ import sshpubkeys.exceptions
+ from sshpubkeys.keys import SSHKey
+
+ try:
+ if not isinstance(key_material, bytes):
+ key_material = key_material.encode("ascii")
+
+ decoded_key = base64.b64decode(key_material).decode("ascii")
+ public_key = SSHKey(decoded_key)
+ except (sshpubkeys.exceptions.InvalidKeyException, UnicodeDecodeError):
+ raise ValueError("bad key")
+
+ if not public_key.rsa:
+ raise ValueError("bad key")
+
+ return public_key.rsa
+
+
+def rsa_public_key_fingerprint(rsa_public_key):
+ key_data = rsa_public_key.public_bytes(
+ encoding=serialization.Encoding.DER,
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
+ )
+ fingerprint_hex = md5_hash(key_data).hexdigest()
+ fingerprint = re.sub(r"([a-f0-9]{2})(?!$)", r"\1:", fingerprint_hex)
+ return fingerprint
+
+
+def filter_iam_instance_profile_associations(iam_instance_associations, filter_dict):
+ if not filter_dict:
+ return iam_instance_associations
+ result = []
+ for iam_instance_association in iam_instance_associations:
+ filter_passed = True
+ if filter_dict.get("instance-id"):
+ if (
+ iam_instance_association.instance.id
+ not in filter_dict.get("instance-id").values()
+ ):
+ filter_passed = False
+ if filter_dict.get("state"):
+ if iam_instance_association.state not in filter_dict.get("state").values():
+ filter_passed = False
+ if filter_passed:
+ result.append(iam_instance_association)
+ return result
+
+
+def filter_iam_instance_profiles(iam_instance_profile_arn, iam_instance_profile_name):
+ instance_profile = None
+ instance_profile_by_name = None
+ instance_profile_by_arn = None
+ if iam_instance_profile_name:
+ instance_profile_by_name = iam_backends["global"].get_instance_profile(
+ iam_instance_profile_name
+ )
+ instance_profile = instance_profile_by_name
+ if iam_instance_profile_arn:
+ instance_profile_by_arn = iam_backends["global"].get_instance_profile_by_arn(
+ iam_instance_profile_arn
+ )
+ instance_profile = instance_profile_by_arn
+ # We would prefer instance profile that we found by arn
+ if iam_instance_profile_arn and iam_instance_profile_name:
+ if instance_profile_by_name == instance_profile_by_arn:
+ instance_profile = instance_profile_by_arn
+ else:
+ instance_profile = None
+
+ return instance_profile
+
+
+def describe_tag_filter(filters, instances):
+ result = instances.copy()
+ for instance in instances:
+ for key in filters:
+ if key.startswith("tag:"):
+ match = re.match(r"tag:(.*)", key)
+ if match:
+ tag_key_name = match.group(1)
+ need_delete = True
+ for tag in instance.get_tags():
+ if tag.get("key") == tag_key_name and tag.get(
+ "value"
+ ) in filters.get(key):
+ need_delete = False
+ elif tag.get("key") == tag_key_name and tag.get(
+ "value"
+ ) not in filters.get(key):
+ need_delete = True
+ if need_delete:
+ result.remove(instance)
+ return result
+
+
+def gen_moto_amis(described_images, drop_images_missing_keys=True):
+ """Convert `boto3.EC2.Client.describe_images` output to form acceptable to `MOTO_AMIS_PATH`
+
+ Parameters
+ ==========
+ described_images : list of dicts
+ as returned by :ref:`boto3:EC2.Client.describe_images` in "Images" key
+ drop_images_missing_keys : bool, default=True
+ When `True` any entry in `images` that is missing a required key will silently
+ be excluded from the returned list
+
+ Throws
+ ======
+ `KeyError` when `drop_images_missing_keys` is `False` and a required key is missing
+ from an element of `images`
+
+ Returns
+ =======
+ list of dicts suitable to be serialized into JSON as a target for `MOTO_AMIS_PATH` environment
+ variable.
+
+ See Also
+ ========
+ * :ref:`moto.ec2.models.EC2Backend`
+ """
+ result = []
+ for image in described_images:
+ try:
+ tmp = {
+ "ami_id": image["ImageId"],
+ "name": image["Name"],
+ "description": image["Description"],
+ "owner_id": image["OwnerId"],
+ "public": image["Public"],
+ "virtualization_type": image["VirtualizationType"],
+ "architecture": image["Architecture"],
+ "state": image["State"],
+ "platform": image.get("Platform"),
+ "image_type": image["ImageType"],
+ "hypervisor": image["Hypervisor"],
+ "root_device_name": image["RootDeviceName"],
+ "root_device_type": image["RootDeviceType"],
+ "sriov": image.get("SriovNetSupport", "simple"),
+ }
+ result.append(tmp)
+ except Exception as err:
+ if not drop_images_missing_keys:
+ raise err
+
+ return result
+
+
+def convert_tag_spec(tag_spec_set):
+ # IN: [{"ResourceType": _type, "Tag": [{"Key": k, "Value": v}, ..]}]
+ # OUT: {_type: {k: v, ..}}
+ tags = {}
+ for tag_spec in tag_spec_set:
+ if tag_spec["ResourceType"] not in tags:
+ tags[tag_spec["ResourceType"]] = {}
+ tags[tag_spec["ResourceType"]].update(
+ {tag["Key"]: tag["Value"] for tag in tag_spec["Tag"]}
+ )
+ return tags
diff --git a/contrib/python/moto/py3/moto/ec2instanceconnect/__init__.py b/contrib/python/moto/py3/moto/ec2instanceconnect/__init__.py
new file mode 100644
index 0000000000..c53958f7e7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2instanceconnect/__init__.py
@@ -0,0 +1,4 @@
+from ..core.models import base_decorator
+from .models import ec2instanceconnect_backends
+
+mock_ec2instanceconnect = base_decorator(ec2instanceconnect_backends)
diff --git a/contrib/python/moto/py3/moto/ec2instanceconnect/models.py b/contrib/python/moto/py3/moto/ec2instanceconnect/models.py
new file mode 100644
index 0000000000..6dc184d39b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2instanceconnect/models.py
@@ -0,0 +1,13 @@
+import json
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+
+
+class Ec2InstanceConnectBackend(BaseBackend):
+ def send_ssh_public_key(self):
+ return json.dumps(
+ {"RequestId": "example-2a47-4c91-9700-e37e85162cb6", "Success": True}
+ )
+
+
+ec2instanceconnect_backends = BackendDict(Ec2InstanceConnectBackend, "ec2")
diff --git a/contrib/python/moto/py3/moto/ec2instanceconnect/responses.py b/contrib/python/moto/py3/moto/ec2instanceconnect/responses.py
new file mode 100644
index 0000000000..9fce11aa21
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2instanceconnect/responses.py
@@ -0,0 +1,11 @@
+from moto.core.responses import BaseResponse
+from .models import ec2instanceconnect_backends
+
+
+class Ec2InstanceConnectResponse(BaseResponse):
+ @property
+ def ec2instanceconnect_backend(self):
+ return ec2instanceconnect_backends[self.region]
+
+ def send_ssh_public_key(self):
+ return self.ec2instanceconnect_backend.send_ssh_public_key()
diff --git a/contrib/python/moto/py3/moto/ec2instanceconnect/urls.py b/contrib/python/moto/py3/moto/ec2instanceconnect/urls.py
new file mode 100644
index 0000000000..acb8686db6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ec2instanceconnect/urls.py
@@ -0,0 +1,5 @@
+from .responses import Ec2InstanceConnectResponse
+
+url_bases = [r"https?://ec2-instance-connect\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": Ec2InstanceConnectResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/ecr/__init__.py b/contrib/python/moto/py3/moto/ecr/__init__.py
new file mode 100644
index 0000000000..c85a330855
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/__init__.py
@@ -0,0 +1,5 @@
+from .models import ecr_backends
+from ..core.models import base_decorator
+
+ecr_backend = ecr_backends["us-east-1"]
+mock_ecr = base_decorator(ecr_backends)
diff --git a/contrib/python/moto/py3/moto/ecr/exceptions.py b/contrib/python/moto/py3/moto/ecr/exceptions.py
new file mode 100644
index 0000000000..a28fd8f4ee
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/exceptions.py
@@ -0,0 +1,133 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class LifecyclePolicyNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ "Lifecycle policy does not exist "
+ f"for the repository with name '{repository_name}' "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class LimitExceededException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=("The scan quota per image has been exceeded. Wait and try again."),
+ )
+
+
+class RegistryPolicyNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"Registry policy does not exist in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class RepositoryAlreadyExistsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"The repository with name '{repository_name}' already exists "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class RepositoryNotEmptyException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"The repository with name '{repository_name}' "
+ f"in registry with id '{registry_id}' "
+ "cannot be deleted because it still contains images"
+ ),
+ )
+
+
+class RepositoryNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"The repository with name '{repository_name}' does not exist "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class RepositoryPolicyNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ "Repository policy does not exist "
+ f"for the repository with name '{repository_name}' "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class ImageNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, image_id, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"The image with imageId {image_id} does not exist "
+ f"within the repository with name '{repository_name}' "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class InvalidParameterException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(error_type=__class__.__name__, message=message)
+
+
+class ScanNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, image_id, repository_name, registry_id):
+ super().__init__(
+ error_type=__class__.__name__,
+ message=(
+ f"Image scan does not exist for the image with '{image_id}' "
+ f"in the repository with name '{repository_name}' "
+ f"in the registry with id '{registry_id}'"
+ ),
+ )
+
+
+class ValidationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(error_type=__class__.__name__, message=message)
diff --git a/contrib/python/moto/py3/moto/ecr/models.py b/contrib/python/moto/py3/moto/ecr/models.py
new file mode 100644
index 0000000000..c74c51819c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/models.py
@@ -0,0 +1,952 @@
+import hashlib
+import json
+import re
+import uuid
+from collections import namedtuple
+from datetime import datetime, timezone
+from random import random
+from typing import Dict, List
+
+from botocore.exceptions import ParamValidationError
+
+from moto.core import BaseBackend, BaseModel, CloudFormationModel, get_account_id
+from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
+from moto.ecr.exceptions import (
+ ImageNotFoundException,
+ RepositoryNotFoundException,
+ RepositoryAlreadyExistsException,
+ RepositoryNotEmptyException,
+ InvalidParameterException,
+ RepositoryPolicyNotFoundException,
+ LifecyclePolicyNotFoundException,
+ RegistryPolicyNotFoundException,
+ LimitExceededException,
+ ScanNotFoundException,
+ ValidationException,
+)
+from moto.ecr.policy_validation import EcrLifecyclePolicyValidator
+from moto.iam.exceptions import MalformedPolicyDocument
+from moto.iam.policy_validation import IAMPolicyDocumentValidator
+from moto.utilities.tagging_service import TaggingService
+
+DEFAULT_REGISTRY_ID = get_account_id()
+ECR_REPOSITORY_ARN_PATTERN = "^arn:(?P<partition>[^:]+):ecr:(?P<region>[^:]+):(?P<account_id>[^:]+):repository/(?P<repo_name>.*)$"
+
+EcrRepositoryArn = namedtuple(
+ "EcrRepositoryArn", ["partition", "region", "account_id", "repo_name"]
+)
+
+
+class BaseObject(BaseModel):
+ def camelCase(self, key):
+ words = []
+ for i, word in enumerate(key.split("_")):
+ if i > 0:
+ words.append(word.title())
+ else:
+ words.append(word)
+ return "".join(words)
+
+ def gen_response_object(self):
+ response_object = dict()
+ for key, value in self.__dict__.items():
+ if "_" in key:
+ response_object[self.camelCase(key)] = value
+ else:
+ response_object[key] = value
+ return response_object
+
+ @property
+ def response_object(self):
+ return self.gen_response_object()
+
+
+class Repository(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ region_name,
+ repository_name,
+ registry_id,
+ encryption_config,
+ image_scan_config,
+ image_tag_mutablility,
+ ):
+ self.region_name = region_name
+ self.registry_id = registry_id or DEFAULT_REGISTRY_ID
+ self.arn = (
+ f"arn:aws:ecr:{region_name}:{self.registry_id}:repository/{repository_name}"
+ )
+ self.name = repository_name
+ self.created_at = datetime.utcnow()
+ self.uri = (
+ f"{self.registry_id}.dkr.ecr.{region_name}.amazonaws.com/{repository_name}"
+ )
+ self.image_tag_mutability = image_tag_mutablility or "MUTABLE"
+ self.image_scanning_configuration = image_scan_config or {"scanOnPush": False}
+ self.encryption_configuration = self._determine_encryption_config(
+ encryption_config
+ )
+ self.policy = None
+ self.lifecycle_policy = None
+ self.images: List[Image] = []
+
+ def _determine_encryption_config(self, encryption_config):
+ if not encryption_config:
+ return {"encryptionType": "AES256"}
+ if encryption_config == {"encryptionType": "KMS"}:
+ encryption_config[
+ "kmsKey"
+ ] = f"arn:aws:kms:{self.region_name}:{get_account_id()}:key/{uuid.uuid4()}"
+ return encryption_config
+
+ def _get_image(self, image_tag, image_digest):
+ # you can either search for one or both
+ image = next(
+ (
+ i
+ for i in self.images
+ if (not image_tag or image_tag in i.image_tags)
+ and (not image_digest or image_digest == i.get_image_digest())
+ ),
+ None,
+ )
+
+ if not image:
+ image_id_rep = "{{imageDigest:'{0}', imageTag:'{1}'}}".format(
+ image_digest or "null", image_tag or "null"
+ )
+
+ raise ImageNotFoundException(
+ image_id=image_id_rep,
+ repository_name=self.name,
+ registry_id=self.registry_id,
+ )
+
+ return image
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+
+ response_object["registryId"] = self.registry_id
+ response_object["repositoryArn"] = self.arn
+ response_object["repositoryName"] = self.name
+ response_object["repositoryUri"] = self.uri
+ response_object["createdAt"] = iso_8601_datetime_without_milliseconds(
+ self.created_at
+ )
+ del response_object["arn"], response_object["name"], response_object["images"]
+ return response_object
+
+ def update(self, image_scan_config=None, image_tag_mutability=None):
+ if image_scan_config:
+ self.image_scanning_configuration = image_scan_config
+ if image_tag_mutability:
+ self.image_tag_mutability = image_tag_mutability
+
+ def delete(self, region_name):
+ ecr_backend = ecr_backends[region_name]
+ ecr_backend.delete_repository(self.name)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn", "RepositoryUri"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ elif attribute_name == "RepositoryUri":
+ return self.uri
+
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "RepositoryName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html
+ return "AWS::ECR::Repository"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ ecr_backend = ecr_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ encryption_config = properties.get("EncryptionConfiguration")
+ image_scan_config = properties.get("ImageScanningConfiguration")
+ image_tag_mutablility = properties.get("ImageTagMutability")
+ tags = properties.get("Tags", [])
+
+ return ecr_backend.create_repository(
+ # RepositoryName is optional in CloudFormation, thus create a random
+ # name if necessary
+ repository_name=resource_name,
+ registry_id=None,
+ encryption_config=encryption_config,
+ image_scan_config=image_scan_config,
+ image_tag_mutablility=image_tag_mutablility,
+ tags=tags,
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ ecr_backend = ecr_backends[region_name]
+ properties = cloudformation_json["Properties"]
+ encryption_configuration = properties.get(
+ "EncryptionConfiguration", {"encryptionType": "AES256"}
+ )
+
+ if (
+ new_resource_name == original_resource.name
+ and encryption_configuration == original_resource.encryption_configuration
+ ):
+ original_resource.update(
+ properties.get("ImageScanningConfiguration"),
+ properties.get("ImageTagMutability"),
+ )
+
+ ecr_backend.tagger.tag_resource(
+ original_resource.arn, properties.get("Tags", [])
+ )
+
+ return original_resource
+ else:
+ original_resource.delete(region_name)
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+
+class Image(BaseObject):
+ def __init__(
+ self, tag, manifest, repository, digest=None, registry_id=DEFAULT_REGISTRY_ID
+ ):
+ self.image_tag = tag
+ self.image_tags = [tag] if tag is not None else []
+ self.image_manifest = manifest
+ self.image_size_in_bytes = 50 * 1024 * 1024
+ self.repository = repository
+ self.registry_id = registry_id
+ self.image_digest = digest
+ self.image_pushed_at = str(datetime.now(timezone.utc).isoformat())
+ self.last_scan = None
+
+ def _create_digest(self):
+ image_contents = "docker_image{0}".format(int(random() * 10**6))
+ self.image_digest = (
+ "sha256:%s" % hashlib.sha256(image_contents.encode("utf-8")).hexdigest()
+ )
+
+ def get_image_digest(self):
+ if not self.image_digest:
+ self._create_digest()
+ return self.image_digest
+
+ def get_image_manifest(self):
+ return self.image_manifest
+
+ def remove_tag(self, tag):
+ if tag is not None and tag in self.image_tags:
+ self.image_tags.remove(tag)
+ if self.image_tags:
+ self.image_tag = self.image_tags[-1]
+
+ def update_tag(self, tag):
+ self.image_tag = tag
+ if tag not in self.image_tags and tag is not None:
+ self.image_tags.append(tag)
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["imageId"] = {}
+ response_object["imageId"]["imageTag"] = self.image_tag
+ response_object["imageId"]["imageDigest"] = self.get_image_digest()
+ response_object["imageManifest"] = self.image_manifest
+ response_object["repositoryName"] = self.repository
+ response_object["registryId"] = self.registry_id
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_list_object(self):
+ response_object = self.gen_response_object()
+ response_object["imageTag"] = self.image_tag
+ response_object["imageDigest"] = self.get_image_digest()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_describe_object(self):
+ response_object = self.gen_response_object()
+ response_object["imageTags"] = self.image_tags
+ response_object["imageDigest"] = self.get_image_digest()
+ response_object["imageManifest"] = self.image_manifest
+ response_object["repositoryName"] = self.repository
+ response_object["registryId"] = self.registry_id
+ response_object["imageSizeInBytes"] = self.image_size_in_bytes
+ response_object["imagePushedAt"] = self.image_pushed_at
+ return {k: v for k, v in response_object.items() if v is not None and v != []}
+
+ @property
+ def response_batch_get_image(self):
+ response_object = {}
+ response_object["imageId"] = {}
+ response_object["imageId"]["imageTag"] = self.image_tag
+ response_object["imageId"]["imageDigest"] = self.get_image_digest()
+ response_object["imageManifest"] = self.image_manifest
+ response_object["repositoryName"] = self.repository
+ response_object["registryId"] = self.registry_id
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_batch_delete_image(self):
+ response_object = {}
+ response_object["imageDigest"] = self.get_image_digest()
+ response_object["imageTag"] = self.image_tag
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+
+class ECRBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.registry_policy = None
+ self.replication_config = {"rules": []}
+ self.repositories: Dict[str, Repository] = {}
+ self.tagger = TaggingService(tag_name="tags")
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ docker_endpoint = {
+ "AcceptanceRequired": False,
+ "AvailabilityZones": zones,
+ "BaseEndpointDnsNames": [f"dkr.ecr.{service_region}.vpce.amazonaws.com"],
+ "ManagesVpcEndpoints": False,
+ "Owner": "amazon",
+ "PrivateDnsName": f"*.dkr.ecr.{service_region}.amazonaws.com",
+ "PrivateDnsNameVerificationState": "verified",
+ "PrivateDnsNames": [
+ {"PrivateDnsName": f"*.dkr.ecr.{service_region}.amazonaws.com"}
+ ],
+ "ServiceId": f"vpce-svc-{BaseBackend.vpce_random_number()}",
+ "ServiceName": f"com.amazonaws.{service_region}.ecr.dkr",
+ "ServiceType": [{"ServiceType": "Interface"}],
+ "Tags": [],
+ "VpcEndpointPolicySupported": True,
+ }
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "api.ecr", special_service_name="ecr.api"
+ ) + [docker_endpoint]
+
+ def _get_repository(self, name, registry_id=None) -> Repository:
+ repo = self.repositories.get(name)
+ reg_id = registry_id or DEFAULT_REGISTRY_ID
+
+ if not repo or repo.registry_id != reg_id:
+ raise RepositoryNotFoundException(name, reg_id)
+ return repo
+
+ @staticmethod
+ def _parse_resource_arn(resource_arn) -> EcrRepositoryArn:
+ match = re.match(ECR_REPOSITORY_ARN_PATTERN, resource_arn)
+ if not match:
+ raise InvalidParameterException(
+ "Invalid parameter at 'resourceArn' failed to satisfy constraint: "
+ "'Invalid ARN'"
+ )
+ return EcrRepositoryArn(**match.groupdict())
+
+ def describe_repositories(self, registry_id=None, repository_names=None):
+ """
+ maxResults and nextToken not implemented
+ """
+ if repository_names:
+ for repository_name in repository_names:
+ if repository_name not in self.repositories:
+ raise RepositoryNotFoundException(
+ repository_name, registry_id or DEFAULT_REGISTRY_ID
+ )
+
+ repositories = []
+ for repository in self.repositories.values():
+ # If a registry_id was supplied, ensure this repository matches
+ if registry_id:
+ if repository.registry_id != registry_id:
+ continue
+ # If a list of repository names was supplied, esure this repository
+ # is in that list
+ if repository_names:
+ if repository.name not in repository_names:
+ continue
+ repositories.append(repository.response_object)
+ return repositories
+
+ def create_repository(
+ self,
+ repository_name,
+ registry_id,
+ encryption_config,
+ image_scan_config,
+ image_tag_mutablility,
+ tags,
+ ):
+ if self.repositories.get(repository_name):
+ raise RepositoryAlreadyExistsException(repository_name, DEFAULT_REGISTRY_ID)
+
+ repository = Repository(
+ region_name=self.region_name,
+ repository_name=repository_name,
+ registry_id=registry_id,
+ encryption_config=encryption_config,
+ image_scan_config=image_scan_config,
+ image_tag_mutablility=image_tag_mutablility,
+ )
+ self.repositories[repository_name] = repository
+ self.tagger.tag_resource(repository.arn, tags)
+
+ return repository
+
+ def delete_repository(self, repository_name, registry_id=None, force=False):
+ repo = self._get_repository(repository_name, registry_id)
+
+ if repo.images and not force:
+ raise RepositoryNotEmptyException(
+ repository_name, registry_id or DEFAULT_REGISTRY_ID
+ )
+
+ self.tagger.delete_all_tags_for_resource(repo.arn)
+ return self.repositories.pop(repository_name)
+
+ def list_images(self, repository_name, registry_id=None):
+ """
+ maxResults and filtering not implemented
+ """
+ repository = None
+ found = False
+ if repository_name in self.repositories:
+ repository = self.repositories[repository_name]
+ if registry_id:
+ if repository.registry_id == registry_id:
+ found = True
+ else:
+ found = True
+
+ if not found:
+ raise RepositoryNotFoundException(
+ repository_name, registry_id or DEFAULT_REGISTRY_ID
+ )
+
+ images = []
+ for image in repository.images:
+ images.append(image)
+ return images
+
+ def describe_images(self, repository_name, registry_id=None, image_ids=None):
+ repository = self._get_repository(repository_name, registry_id)
+
+ if image_ids:
+ response = set(
+ repository._get_image(
+ image_id.get("imageTag"), image_id.get("imageDigest")
+ )
+ for image_id in image_ids
+ )
+
+ else:
+ response = []
+ for image in repository.images:
+ response.append(image)
+
+ return response
+
+ def put_image(self, repository_name, image_manifest, image_tag):
+ if repository_name in self.repositories:
+ repository = self.repositories[repository_name]
+ else:
+ raise Exception("{0} is not a repository".format(repository_name))
+
+ existing_images = list(
+ filter(
+ lambda x: x.response_object["imageManifest"] == image_manifest,
+ repository.images,
+ )
+ )
+ if not existing_images:
+ # this image is not in ECR yet
+ image = Image(image_tag, image_manifest, repository_name)
+ repository.images.append(image)
+ return image
+ else:
+ # update existing image
+ existing_images[0].update_tag(image_tag)
+ return existing_images[0]
+
+ def batch_get_image(self, repository_name, registry_id=None, image_ids=None):
+ """
+ The parameter AcceptedMediaTypes has not yet been implemented
+ """
+ if repository_name in self.repositories:
+ repository = self.repositories[repository_name]
+ else:
+ raise RepositoryNotFoundException(
+ repository_name, registry_id or DEFAULT_REGISTRY_ID
+ )
+
+ if not image_ids:
+ raise ParamValidationError(
+ msg='Missing required parameter in input: "imageIds"'
+ )
+
+ response = {"images": [], "failures": []}
+
+ for image_id in image_ids:
+ found = False
+ for image in repository.images:
+ if (
+ "imageDigest" in image_id
+ and image.get_image_digest() == image_id["imageDigest"]
+ ) or (
+ "imageTag" in image_id and image.image_tag == image_id["imageTag"]
+ ):
+ found = True
+ response["images"].append(image.response_batch_get_image)
+
+ if not found:
+ response["failures"].append(
+ {
+ "imageId": {"imageTag": image_id.get("imageTag", "null")},
+ "failureCode": "ImageNotFound",
+ "failureReason": "Requested image not found",
+ }
+ )
+
+ return response
+
+ def batch_delete_image(self, repository_name, registry_id=None, image_ids=None):
+ if repository_name in self.repositories:
+ repository = self.repositories[repository_name]
+ else:
+ raise RepositoryNotFoundException(
+ repository_name, registry_id or DEFAULT_REGISTRY_ID
+ )
+
+ if not image_ids:
+ raise ParamValidationError(
+ msg='Missing required parameter in input: "imageIds"'
+ )
+
+ response = {"imageIds": [], "failures": []}
+
+ for image_id in image_ids:
+ image_found = False
+
+ # Is request missing both digest and tag?
+ if "imageDigest" not in image_id and "imageTag" not in image_id:
+ response["failures"].append(
+ {
+ "imageId": {},
+ "failureCode": "MissingDigestAndTag",
+ "failureReason": "Invalid request parameters: both tag and digest cannot be null",
+ }
+ )
+ continue
+
+ # If we have a digest, is it valid?
+ if "imageDigest" in image_id:
+ pattern = re.compile(r"^[0-9a-zA-Z_+\.-]+:[0-9a-fA-F]{64}")
+ if not pattern.match(image_id.get("imageDigest")):
+ response["failures"].append(
+ {
+ "imageId": {
+ "imageDigest": image_id.get("imageDigest", "null")
+ },
+ "failureCode": "InvalidImageDigest",
+ "failureReason": "Invalid request parameters: image digest should satisfy the regex '[a-zA-Z0-9-_+.]+:[a-fA-F0-9]+'",
+ }
+ )
+ continue
+
+ for num, image in enumerate(repository.images):
+
+ # Search by matching both digest and tag
+ if "imageDigest" in image_id and "imageTag" in image_id:
+ if (
+ image_id["imageDigest"] == image.get_image_digest()
+ and image_id["imageTag"] in image.image_tags
+ ):
+ image_found = True
+ for image_tag in reversed(image.image_tags):
+ repository.images[num].image_tag = image_tag
+ response["imageIds"].append(
+ image.response_batch_delete_image
+ )
+ repository.images[num].remove_tag(image_tag)
+ del repository.images[num]
+
+ # Search by matching digest
+ elif (
+ "imageDigest" in image_id
+ and image.get_image_digest() == image_id["imageDigest"]
+ ):
+ image_found = True
+ for image_tag in reversed(image.image_tags):
+ repository.images[num].image_tag = image_tag
+ response["imageIds"].append(image.response_batch_delete_image)
+ repository.images[num].remove_tag(image_tag)
+ del repository.images[num]
+
+ # Search by matching tag
+ elif (
+ "imageTag" in image_id and image_id["imageTag"] in image.image_tags
+ ):
+ image_found = True
+ repository.images[num].image_tag = image_id["imageTag"]
+ response["imageIds"].append(image.response_batch_delete_image)
+ if len(image.image_tags) > 1:
+ repository.images[num].remove_tag(image_id["imageTag"])
+ else:
+ repository.images.remove(image)
+
+ if not image_found:
+ failure_response = {
+ "imageId": {},
+ "failureCode": "ImageNotFound",
+ "failureReason": "Requested image not found",
+ }
+
+ if "imageDigest" in image_id:
+ failure_response["imageId"]["imageDigest"] = image_id.get(
+ "imageDigest", "null"
+ )
+
+ if "imageTag" in image_id:
+ failure_response["imageId"]["imageTag"] = image_id.get(
+ "imageTag", "null"
+ )
+
+ response["failures"].append(failure_response)
+
+ return response
+
+ def list_tags_for_resource(self, arn):
+ resource = self._parse_resource_arn(arn)
+ repo = self._get_repository(resource.repo_name, resource.account_id)
+
+ return self.tagger.list_tags_for_resource(repo.arn)
+
+ def tag_resource(self, arn, tags):
+ resource = self._parse_resource_arn(arn)
+ repo = self._get_repository(resource.repo_name, resource.account_id)
+ self.tagger.tag_resource(repo.arn, tags)
+
+ return {}
+
+ def untag_resource(self, arn, tag_keys):
+ resource = self._parse_resource_arn(arn)
+ repo = self._get_repository(resource.repo_name, resource.account_id)
+ self.tagger.untag_resource_using_names(repo.arn, tag_keys)
+
+ return {}
+
+ def put_image_tag_mutability(
+ self, registry_id, repository_name, image_tag_mutability
+ ):
+ if image_tag_mutability not in ["IMMUTABLE", "MUTABLE"]:
+ raise InvalidParameterException(
+ "Invalid parameter at 'imageTagMutability' failed to satisfy constraint: "
+ "'Member must satisfy enum value set: [IMMUTABLE, MUTABLE]'"
+ )
+
+ repo = self._get_repository(repository_name, registry_id)
+ repo.update(image_tag_mutability=image_tag_mutability)
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "imageTagMutability": repo.image_tag_mutability,
+ }
+
+ def put_image_scanning_configuration(
+ self, registry_id, repository_name, image_scan_config
+ ):
+ repo = self._get_repository(repository_name, registry_id)
+ repo.update(image_scan_config=image_scan_config)
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "imageScanningConfiguration": repo.image_scanning_configuration,
+ }
+
+ def set_repository_policy(self, registry_id, repository_name, policy_text):
+ repo = self._get_repository(repository_name, registry_id)
+
+ try:
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_text)
+ # the repository policy can be defined without a resource field
+ iam_policy_document_validator._validate_resource_exist = lambda: None
+ # the repository policy can have the old version 2008-10-17
+ iam_policy_document_validator._validate_version = lambda: None
+ iam_policy_document_validator.validate()
+ except MalformedPolicyDocument:
+ raise InvalidParameterException(
+ "Invalid parameter at 'PolicyText' failed to satisfy constraint: "
+ "'Invalid repository policy provided'"
+ )
+
+ repo.policy = policy_text
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "policyText": repo.policy,
+ }
+
+ def get_repository_policy(self, registry_id, repository_name):
+ repo = self._get_repository(repository_name, registry_id)
+
+ if not repo.policy:
+ raise RepositoryPolicyNotFoundException(repository_name, repo.registry_id)
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "policyText": repo.policy,
+ }
+
+ def delete_repository_policy(self, registry_id, repository_name):
+ repo = self._get_repository(repository_name, registry_id)
+ policy = repo.policy
+
+ if not policy:
+ raise RepositoryPolicyNotFoundException(repository_name, repo.registry_id)
+
+ repo.policy = None
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "policyText": policy,
+ }
+
+ def put_lifecycle_policy(self, registry_id, repository_name, lifecycle_policy_text):
+ repo = self._get_repository(repository_name, registry_id)
+
+ validator = EcrLifecyclePolicyValidator(lifecycle_policy_text)
+ validator.validate()
+
+ repo.lifecycle_policy = lifecycle_policy_text
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "lifecyclePolicyText": repo.lifecycle_policy,
+ }
+
+ def get_lifecycle_policy(self, registry_id, repository_name):
+ repo = self._get_repository(repository_name, registry_id)
+
+ if not repo.lifecycle_policy:
+ raise LifecyclePolicyNotFoundException(repository_name, repo.registry_id)
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "lifecyclePolicyText": repo.lifecycle_policy,
+ "lastEvaluatedAt": iso_8601_datetime_without_milliseconds(
+ datetime.utcnow()
+ ),
+ }
+
+ def delete_lifecycle_policy(self, registry_id, repository_name):
+ repo = self._get_repository(repository_name, registry_id)
+ policy = repo.lifecycle_policy
+
+ if not policy:
+ raise LifecyclePolicyNotFoundException(repository_name, repo.registry_id)
+
+ repo.lifecycle_policy = None
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "lifecyclePolicyText": policy,
+ "lastEvaluatedAt": iso_8601_datetime_without_milliseconds(
+ datetime.utcnow()
+ ),
+ }
+
+ def _validate_registry_policy_action(self, policy_text):
+ # only CreateRepository & ReplicateImage actions are allowed
+ VALID_ACTIONS = {"ecr:CreateRepository", "ecr:ReplicateImage"}
+
+ policy = json.loads(policy_text)
+ for statement in policy["Statement"]:
+ action = statement["Action"]
+ if isinstance(action, str):
+ action = [action]
+ if set(action) - VALID_ACTIONS:
+ raise MalformedPolicyDocument()
+
+ def put_registry_policy(self, policy_text):
+ try:
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_text)
+ iam_policy_document_validator.validate()
+
+ self._validate_registry_policy_action(policy_text)
+ except MalformedPolicyDocument:
+ raise InvalidParameterException(
+ "Invalid parameter at 'PolicyText' failed to satisfy constraint: "
+ "'Invalid registry policy provided'"
+ )
+
+ self.registry_policy = policy_text
+
+ return {
+ "registryId": get_account_id(),
+ "policyText": policy_text,
+ }
+
+ def get_registry_policy(self):
+ if not self.registry_policy:
+ raise RegistryPolicyNotFoundException(get_account_id())
+
+ return {
+ "registryId": get_account_id(),
+ "policyText": self.registry_policy,
+ }
+
+ def delete_registry_policy(self):
+ policy = self.registry_policy
+ if not policy:
+ raise RegistryPolicyNotFoundException(get_account_id())
+
+ self.registry_policy = None
+
+ return {
+ "registryId": get_account_id(),
+ "policyText": policy,
+ }
+
+ def start_image_scan(self, registry_id, repository_name, image_id):
+ repo = self._get_repository(repository_name, registry_id)
+
+ image = repo._get_image(image_id.get("imageTag"), image_id.get("imageDigest"))
+
+ # scanning an image is only allowed once per day
+ if image.last_scan and image.last_scan.date() == datetime.today().date():
+ raise LimitExceededException()
+
+ image.last_scan = datetime.today()
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "imageId": {
+ "imageDigest": image.image_digest,
+ "imageTag": image.image_tag,
+ },
+ "imageScanStatus": {"status": "IN_PROGRESS"},
+ }
+
+ def describe_image_scan_findings(self, registry_id, repository_name, image_id):
+ repo = self._get_repository(repository_name, registry_id)
+
+ image = repo._get_image(image_id.get("imageTag"), image_id.get("imageDigest"))
+
+ if not image.last_scan:
+ image_id_rep = "{{imageDigest:'{0}', imageTag:'{1}'}}".format(
+ image_id.get("imageDigest") or "null",
+ image_id.get("imageTag") or "null",
+ )
+ raise ScanNotFoundException(
+ image_id=image_id_rep,
+ repository_name=repository_name,
+ registry_id=repo.registry_id,
+ )
+
+ return {
+ "registryId": repo.registry_id,
+ "repositoryName": repository_name,
+ "imageId": {
+ "imageDigest": image.image_digest,
+ "imageTag": image.image_tag,
+ },
+ "imageScanStatus": {
+ "status": "COMPLETE",
+ "description": "The scan was completed successfully.",
+ },
+ "imageScanFindings": {
+ "imageScanCompletedAt": iso_8601_datetime_without_milliseconds(
+ image.last_scan
+ ),
+ "vulnerabilitySourceUpdatedAt": iso_8601_datetime_without_milliseconds(
+ datetime.utcnow()
+ ),
+ "findings": [
+ {
+ "name": "CVE-9999-9999",
+ "uri": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-9999-9999",
+ "severity": "HIGH",
+ "attributes": [
+ {"key": "package_version", "value": "9.9.9"},
+ {"key": "package_name", "value": "moto_fake"},
+ {
+ "key": "CVSS2_VECTOR",
+ "value": "AV:N/AC:L/Au:N/C:P/I:P/A:P",
+ },
+ {"key": "CVSS2_SCORE", "value": "7.5"},
+ ],
+ }
+ ],
+ "findingSeverityCounts": {"HIGH": 1},
+ },
+ }
+
+ def put_replication_configuration(self, replication_config):
+ rules = replication_config["rules"]
+ if len(rules) > 1:
+ raise ValidationException("This feature is disabled")
+
+ if len(rules) == 1:
+ for dest in rules[0]["destinations"]:
+ if (
+ dest["region"] == self.region_name
+ and dest["registryId"] == DEFAULT_REGISTRY_ID
+ ):
+ raise InvalidParameterException(
+ "Invalid parameter at 'replicationConfiguration' failed to satisfy constraint: "
+ "'Replication destination cannot be the same as the source registry'"
+ )
+
+ self.replication_config = replication_config
+
+ return {"replicationConfiguration": replication_config}
+
+ def describe_registry(self):
+ return {
+ "registryId": DEFAULT_REGISTRY_ID,
+ "replicationConfiguration": self.replication_config,
+ }
+
+
+ecr_backends = BackendDict(ECRBackend, "ecr")
diff --git a/contrib/python/moto/py3/moto/ecr/policy_validation.py b/contrib/python/moto/py3/moto/ecr/policy_validation.py
new file mode 100644
index 0000000000..18277a615b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/policy_validation.py
@@ -0,0 +1,233 @@
+import json
+
+from moto.ecr.exceptions import InvalidParameterException
+
+REQUIRED_RULE_PROPERTIES = {"rulePriority", "selection", "action"}
+VALID_RULE_PROPERTIES = {"description", *REQUIRED_RULE_PROPERTIES}
+
+REQUIRED_ACTION_PROPERTIES = {"type"}
+VALID_ACTION_PROPERTIES = REQUIRED_ACTION_PROPERTIES
+
+VALID_ACTION_TYPE_VALUES = {"expire"}
+
+REQUIRED_SELECTION_PROPERTIES = {"tagStatus", "countType", "countNumber"}
+VALID_SELECTION_PROPERTIES = {
+ "tagPrefixList",
+ "countUnit",
+ *REQUIRED_SELECTION_PROPERTIES,
+}
+
+VALID_SELECTION_TAG_STATUS_VALUES = {"tagged", "untagged", "any"}
+VALID_SELECTION_COUNT_TYPE_VALUES = {"imageCountMoreThan", "sinceImagePushed"}
+VALID_SELECTION_COUNT_UNIT_VALUES = {"days"}
+
+
+class EcrLifecyclePolicyValidator:
+ INVALID_PARAMETER_ERROR_MESSAGE = (
+ "Invalid parameter at 'LifecyclePolicyText' failed to satisfy constraint: "
+ "'Lifecycle policy validation failure: "
+ )
+
+ def __init__(self, policy_text):
+ self._policy_text = policy_text
+ self._policy_json = {}
+ self._rules = []
+
+ def validate(self):
+ try:
+ self._parse_policy()
+ except Exception:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ "Could not map policyString into LifecyclePolicy.'",
+ ]
+ )
+ )
+
+ try:
+ self._extract_rules()
+ except Exception:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ 'object has missing required properties (["rules"])\'',
+ ]
+ )
+ )
+
+ self._validate_rule_type()
+ self._validate_rule_top_properties()
+
+ def _parse_policy(self):
+ self._policy_json = json.loads(self._policy_text)
+ assert isinstance(self._policy_json, dict)
+
+ def _extract_rules(self):
+ assert "rules" in self._policy_json
+ assert isinstance(self._policy_json["rules"], list)
+
+ self._rules = self._policy_json["rules"]
+
+ def _validate_rule_type(self):
+ for rule in self._rules:
+ if not isinstance(rule, dict):
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f'instance type ({type(rule)}) does not match any allowed primitive type (allowed: ["object"])\'',
+ ]
+ )
+ )
+
+ def _validate_rule_top_properties(self):
+ for rule in self._rules:
+ rule_properties = set(rule.keys())
+ missing_properties = REQUIRED_RULE_PROPERTIES - rule_properties
+ if missing_properties:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"object has missing required properties ({json.dumps(sorted(missing_properties))})'",
+ ]
+ )
+ )
+
+ for rule_property in rule_properties:
+ if rule_property not in VALID_RULE_PROPERTIES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f'object instance has properties which are not allowed by the schema: (["{rule_property}"])\'',
+ ]
+ )
+ )
+
+ self._validate_action(rule["action"])
+ self._validate_selection(rule["selection"])
+
+ def _validate_action(self, action):
+ given_properties = set(action.keys())
+ missing_properties = REQUIRED_ACTION_PROPERTIES - given_properties
+
+ if missing_properties:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"object has missing required properties ({json.dumps(sorted(missing_properties))})'",
+ ]
+ )
+ )
+
+ for given_property in given_properties:
+ if given_property not in VALID_ACTION_PROPERTIES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ "object instance has properties "
+ f'which are not allowed by the schema: (["{given_property}"])\'',
+ ]
+ )
+ )
+
+ self._validate_action_type(action["type"])
+
+ def _validate_action_type(self, action_type):
+ if action_type not in VALID_ACTION_TYPE_VALUES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"instance value ({action_type}) not found in enum "
+ f":(possible values: {json.dumps(sorted(VALID_ACTION_TYPE_VALUES))})'",
+ ]
+ )
+ )
+
+ def _validate_selection(self, selection):
+ given_properties = set(selection.keys())
+ missing_properties = REQUIRED_SELECTION_PROPERTIES - given_properties
+
+ if missing_properties:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"object has missing required properties ({json.dumps(sorted(missing_properties))})'",
+ ]
+ )
+ )
+
+ for given_property in given_properties:
+ if given_property not in VALID_SELECTION_PROPERTIES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ "object instance has properties "
+ f'which are not allowed by the schema: (["{given_property}"])\'',
+ ]
+ )
+ )
+
+ self._validate_selection_tag_status(selection["tagStatus"])
+ self._validate_selection_count_type(selection["countType"])
+ self._validate_selection_count_unit(selection.get("countUnit"))
+ self._validate_selection_count_number(selection["countNumber"])
+
+ def _validate_selection_tag_status(self, tag_status):
+ if tag_status not in VALID_SELECTION_TAG_STATUS_VALUES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"instance value ({tag_status}) not found in enum "
+ f":(possible values: {json.dumps(sorted(VALID_SELECTION_TAG_STATUS_VALUES))})'",
+ ]
+ )
+ )
+
+ def _validate_selection_count_type(self, count_type):
+ if count_type not in VALID_SELECTION_COUNT_TYPE_VALUES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ "instance failed to match exactly one schema (matched 0 out of 2)",
+ ]
+ )
+ )
+
+ def _validate_selection_count_unit(self, count_unit):
+ if not count_unit:
+ return None
+
+ if count_unit not in VALID_SELECTION_COUNT_UNIT_VALUES:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ f"instance value ({count_unit}) not found in enum "
+ f":(possible values: {json.dumps(sorted(VALID_SELECTION_COUNT_UNIT_VALUES))})'",
+ ]
+ )
+ )
+
+ def _validate_selection_count_number(self, count_number):
+ if count_number < 1:
+ raise InvalidParameterException(
+ "".join(
+ [
+ self.INVALID_PARAMETER_ERROR_MESSAGE,
+ "numeric instance is lower than the required minimum "
+ f"(minimum: 1, found: {count_number})",
+ ]
+ )
+ )
diff --git a/contrib/python/moto/py3/moto/ecr/responses.py b/contrib/python/moto/py3/moto/ecr/responses.py
new file mode 100644
index 0000000000..8cfec74241
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/responses.py
@@ -0,0 +1,315 @@
+import json
+from base64 import b64encode
+from datetime import datetime
+import time
+
+from moto.core.responses import BaseResponse
+from .models import ecr_backends, DEFAULT_REGISTRY_ID
+
+
+class ECRResponse(BaseResponse):
+ @property
+ def ecr_backend(self):
+ return ecr_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def create_repository(self):
+ repository_name = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ encryption_config = self._get_param("encryptionConfiguration")
+ image_scan_config = self._get_param("imageScanningConfiguration")
+ image_tag_mutablility = self._get_param("imageTagMutability")
+ tags = self._get_param("tags", [])
+
+ repository = self.ecr_backend.create_repository(
+ repository_name=repository_name,
+ registry_id=registry_id,
+ encryption_config=encryption_config,
+ image_scan_config=image_scan_config,
+ image_tag_mutablility=image_tag_mutablility,
+ tags=tags,
+ )
+ return json.dumps({"repository": repository.response_object})
+
+ def describe_repositories(self):
+ describe_repositories_name = self._get_param("repositoryNames")
+ registry_id = self._get_param("registryId")
+
+ repositories = self.ecr_backend.describe_repositories(
+ repository_names=describe_repositories_name, registry_id=registry_id
+ )
+ return json.dumps({"repositories": repositories, "failures": []})
+
+ def delete_repository(self):
+ repository_str = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ force = self._get_param("force")
+
+ repository = self.ecr_backend.delete_repository(
+ repository_str, registry_id, force
+ )
+ return json.dumps({"repository": repository.response_object})
+
+ def put_image(self):
+ repository_str = self._get_param("repositoryName")
+ image_manifest = self._get_param("imageManifest")
+ image_tag = self._get_param("imageTag")
+ image = self.ecr_backend.put_image(repository_str, image_manifest, image_tag)
+
+ return json.dumps({"image": image.response_object})
+
+ def list_images(self):
+ repository_str = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ images = self.ecr_backend.list_images(repository_str, registry_id)
+ return json.dumps(
+ {"imageIds": [image.response_list_object for image in images]}
+ )
+
+ def describe_images(self):
+ repository_str = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ image_ids = self._get_param("imageIds")
+ images = self.ecr_backend.describe_images(
+ repository_str, registry_id, image_ids
+ )
+ return json.dumps(
+ {"imageDetails": [image.response_describe_object for image in images]}
+ )
+
+ def batch_check_layer_availability(self):
+ if self.is_not_dryrun("BatchCheckLayerAvailability"):
+ raise NotImplementedError(
+ "ECR.batch_check_layer_availability is not yet implemented"
+ )
+
+ def batch_delete_image(self):
+ repository_str = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ image_ids = self._get_param("imageIds")
+
+ response = self.ecr_backend.batch_delete_image(
+ repository_str, registry_id, image_ids
+ )
+ return json.dumps(response)
+
+ def batch_get_image(self):
+ repository_str = self._get_param("repositoryName")
+ registry_id = self._get_param("registryId")
+ image_ids = self._get_param("imageIds")
+
+ response = self.ecr_backend.batch_get_image(
+ repository_str, registry_id, image_ids
+ )
+ return json.dumps(response)
+
+ def complete_layer_upload(self):
+ if self.is_not_dryrun("CompleteLayerUpload"):
+ raise NotImplementedError(
+ "ECR.complete_layer_upload is not yet implemented"
+ )
+
+ def delete_repository_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+
+ return json.dumps(
+ self.ecr_backend.delete_repository_policy(
+ registry_id=registry_id, repository_name=repository_name
+ )
+ )
+
+ def get_authorization_token(self):
+ registry_ids = self._get_param("registryIds")
+ if not registry_ids:
+ registry_ids = [DEFAULT_REGISTRY_ID]
+ auth_data = []
+ for registry_id in registry_ids:
+ password = "{}-auth-token".format(registry_id)
+ auth_token = b64encode("AWS:{}".format(password).encode("ascii")).decode()
+ auth_data.append(
+ {
+ "authorizationToken": auth_token,
+ "expiresAt": time.mktime(datetime(2015, 1, 1).timetuple()),
+ "proxyEndpoint": "https://{}.dkr.ecr.{}.amazonaws.com".format(
+ registry_id, self.region
+ ),
+ }
+ )
+ return json.dumps({"authorizationData": auth_data})
+
+ def get_download_url_for_layer(self):
+ if self.is_not_dryrun("GetDownloadUrlForLayer"):
+ raise NotImplementedError(
+ "ECR.get_download_url_for_layer is not yet implemented"
+ )
+
+ def get_repository_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+
+ return json.dumps(
+ self.ecr_backend.get_repository_policy(
+ registry_id=registry_id, repository_name=repository_name
+ )
+ )
+
+ def initiate_layer_upload(self):
+ if self.is_not_dryrun("InitiateLayerUpload"):
+ raise NotImplementedError(
+ "ECR.initiate_layer_upload is not yet implemented"
+ )
+
+ def set_repository_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ policy_text = self._get_param("policyText")
+ # this is usually a safety flag to prevent accidental repository lock outs
+ # but this would need a much deeper validation of the provided policy
+ # force = self._get_param("force")
+
+ return json.dumps(
+ self.ecr_backend.set_repository_policy(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ policy_text=policy_text,
+ )
+ )
+
+ def upload_layer_part(self):
+ if self.is_not_dryrun("UploadLayerPart"):
+ raise NotImplementedError("ECR.upload_layer_part is not yet implemented")
+
+ def list_tags_for_resource(self):
+ arn = self._get_param("resourceArn")
+
+ return json.dumps(self.ecr_backend.list_tags_for_resource(arn))
+
+ def tag_resource(self):
+ arn = self._get_param("resourceArn")
+ tags = self._get_param("tags", [])
+
+ return json.dumps(self.ecr_backend.tag_resource(arn, tags))
+
+ def untag_resource(self):
+ arn = self._get_param("resourceArn")
+ tag_keys = self._get_param("tagKeys", [])
+
+ return json.dumps(self.ecr_backend.untag_resource(arn, tag_keys))
+
+ def put_image_tag_mutability(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ image_tag_mutability = self._get_param("imageTagMutability")
+
+ return json.dumps(
+ self.ecr_backend.put_image_tag_mutability(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ image_tag_mutability=image_tag_mutability,
+ )
+ )
+
+ def put_image_scanning_configuration(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ image_scan_config = self._get_param("imageScanningConfiguration")
+
+ return json.dumps(
+ self.ecr_backend.put_image_scanning_configuration(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ image_scan_config=image_scan_config,
+ )
+ )
+
+ def put_lifecycle_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ lifecycle_policy_text = self._get_param("lifecyclePolicyText")
+
+ return json.dumps(
+ self.ecr_backend.put_lifecycle_policy(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ lifecycle_policy_text=lifecycle_policy_text,
+ )
+ )
+
+ def get_lifecycle_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+
+ return json.dumps(
+ self.ecr_backend.get_lifecycle_policy(
+ registry_id=registry_id, repository_name=repository_name
+ )
+ )
+
+ def delete_lifecycle_policy(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+
+ return json.dumps(
+ self.ecr_backend.delete_lifecycle_policy(
+ registry_id=registry_id, repository_name=repository_name
+ )
+ )
+
+ def put_registry_policy(self):
+ policy_text = self._get_param("policyText")
+
+ return json.dumps(self.ecr_backend.put_registry_policy(policy_text=policy_text))
+
+ def get_registry_policy(self):
+ return json.dumps(self.ecr_backend.get_registry_policy())
+
+ def delete_registry_policy(self):
+ return json.dumps(self.ecr_backend.delete_registry_policy())
+
+ def start_image_scan(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ image_id = self._get_param("imageId")
+
+ return json.dumps(
+ self.ecr_backend.start_image_scan(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ image_id=image_id,
+ )
+ )
+
+ def describe_image_scan_findings(self):
+ registry_id = self._get_param("registryId")
+ repository_name = self._get_param("repositoryName")
+ image_id = self._get_param("imageId")
+
+ return json.dumps(
+ self.ecr_backend.describe_image_scan_findings(
+ registry_id=registry_id,
+ repository_name=repository_name,
+ image_id=image_id,
+ )
+ )
+
+ def put_replication_configuration(self):
+ replication_config = self._get_param("replicationConfiguration")
+
+ return json.dumps(
+ self.ecr_backend.put_replication_configuration(
+ replication_config=replication_config
+ )
+ )
+
+ def describe_registry(self):
+ return json.dumps(self.ecr_backend.describe_registry())
diff --git a/contrib/python/moto/py3/moto/ecr/urls.py b/contrib/python/moto/py3/moto/ecr/urls.py
new file mode 100644
index 0000000000..2371ea0106
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecr/urls.py
@@ -0,0 +1,8 @@
+from .responses import ECRResponse
+
+url_bases = [
+ r"https?://ecr\.(.+)\.amazonaws\.com",
+ r"https?://api\.ecr\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {"{0}/$": ECRResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/ecs/__init__.py b/contrib/python/moto/py3/moto/ecs/__init__.py
new file mode 100644
index 0000000000..cf9b335dbc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecs/__init__.py
@@ -0,0 +1,5 @@
+from .models import ecs_backends
+from ..core.models import base_decorator
+
+ecs_backend = ecs_backends["us-east-1"]
+mock_ecs = base_decorator(ecs_backends)
diff --git a/contrib/python/moto/py3/moto/ecs/exceptions.py b/contrib/python/moto/py3/moto/ecs/exceptions.py
new file mode 100644
index 0000000000..41f4f0eee6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecs/exceptions.py
@@ -0,0 +1,67 @@
+from moto.core.exceptions import RESTError, JsonRESTError
+
+
+class ServiceNotFoundException(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ error_type="ServiceNotFoundException", message="Service not found."
+ )
+
+
+class TaskDefinitionNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ error_type="ClientException",
+ message="The specified task definition does not exist.",
+ )
+
+
+class RevisionNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(error_type="ClientException", message="Revision is missing.")
+
+
+class TaskSetNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ error_type="ClientException",
+ message="The specified task set does not exist.",
+ )
+
+
+class ClusterNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ error_type="ClusterNotFoundException", message="Cluster not found."
+ )
+
+
+class EcsClientException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(error_type="ClientException", message=message)
+
+
+class InvalidParameterException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__(error_type="InvalidParameterException", message=message)
+
+
+class UnknownAccountSettingException(InvalidParameterException):
+ def __init__(self):
+ super().__init__(
+ "unknown should be one of [serviceLongArnFormat,taskLongArnFormat,containerInstanceLongArnFormat,containerLongArnFormat,awsvpcTrunking,containerInsights,dualStackIPv6]"
+ )
diff --git a/contrib/python/moto/py3/moto/ecs/models.py b/contrib/python/moto/py3/moto/ecs/models.py
new file mode 100644
index 0000000000..6c906966fb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecs/models.py
@@ -0,0 +1,1866 @@
+import re
+import uuid
+from copy import copy
+from datetime import datetime
+from random import random, randint
+
+import pytz
+
+from moto import settings
+from moto.core import BaseBackend, BaseModel, CloudFormationModel, get_account_id
+from moto.core.exceptions import JsonRESTError
+from moto.core.utils import (
+ unix_time,
+ pascal_to_camelcase,
+ remap_nested_keys,
+ BackendDict,
+)
+from moto.ec2 import ec2_backends
+from moto.utilities.tagging_service import TaggingService
+from .exceptions import (
+ EcsClientException,
+ ServiceNotFoundException,
+ TaskDefinitionNotFoundException,
+ TaskSetNotFoundException,
+ ClusterNotFoundException,
+ InvalidParameterException,
+ RevisionNotFoundException,
+ UnknownAccountSettingException,
+)
+
+
+class BaseObject(BaseModel):
+ def camelCase(self, key):
+ words = []
+ for i, word in enumerate(key.split("_")):
+ if i > 0:
+ words.append(word.title())
+ else:
+ words.append(word)
+ return "".join(words)
+
+ def gen_response_object(self):
+ response_object = copy(self.__dict__)
+ for key, value in self.__dict__.items():
+ if key.startswith("_"):
+ del response_object[key]
+ elif "_" in key:
+ response_object[self.camelCase(key)] = value
+ del response_object[key]
+ return response_object
+
+ @property
+ def response_object(self):
+ return self.gen_response_object()
+
+
+class AccountSetting(BaseObject):
+ def __init__(self, name, value):
+ self.name = name
+ self.value = value
+
+
+class Cluster(BaseObject, CloudFormationModel):
+ def __init__(self, cluster_name, region_name, cluster_settings=None):
+ self.active_services_count = 0
+ self.arn = "arn:aws:ecs:{0}:{1}:cluster/{2}".format(
+ region_name, get_account_id(), cluster_name
+ )
+ self.name = cluster_name
+ self.pending_tasks_count = 0
+ self.registered_container_instances_count = 0
+ self.running_tasks_count = 0
+ self.status = "ACTIVE"
+ self.region_name = region_name
+ self.settings = cluster_settings
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["clusterArn"] = self.arn
+ response_object["clusterName"] = self.name
+ del response_object["arn"], response_object["name"]
+ return response_object
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "ClusterName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html
+ return "AWS::ECS::Cluster"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ ecs_backend = ecs_backends[region_name]
+ return ecs_backend.create_cluster(
+ # ClusterName is optional in CloudFormation, thus create a random
+ # name if necessary
+ cluster_name=resource_name
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ if original_resource.name != new_resource_name:
+ ecs_backend = ecs_backends[region_name]
+ ecs_backend.delete_cluster(original_resource.arn)
+ return ecs_backend.create_cluster(
+ # ClusterName is optional in CloudFormation, thus create a
+ # random name if necessary
+ cluster_name=new_resource_name
+ )
+ else:
+ # no-op when nothing changed between old and new resources
+ return original_resource
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+
+class TaskDefinition(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ family,
+ revision,
+ container_definitions,
+ region_name,
+ network_mode=None,
+ volumes=None,
+ tags=None,
+ placement_constraints=None,
+ requires_compatibilities=None,
+ cpu=None,
+ memory=None,
+ task_role_arn=None,
+ execution_role_arn=None,
+ ):
+ self.family = family
+ self.revision = revision
+ self.arn = "arn:aws:ecs:{0}:{1}:task-definition/{2}:{3}".format(
+ region_name, get_account_id(), family, revision
+ )
+
+ default_container_definition = {
+ "cpu": 0,
+ "portMappings": [],
+ "essential": True,
+ "environment": [],
+ "mountPoints": [],
+ "volumesFrom": [],
+ }
+ self.container_definitions = []
+ for container_definition in container_definitions:
+ full_definition = default_container_definition.copy()
+ full_definition.update(container_definition)
+ self.container_definitions.append(full_definition)
+
+ self.tags = tags if tags is not None else []
+
+ if volumes is None:
+ self.volumes = []
+ else:
+ self.volumes = volumes
+
+ if not requires_compatibilities or requires_compatibilities == ["EC2"]:
+ self.compatibilities = ["EC2"]
+ else:
+ self.compatibilities = ["EC2", "FARGATE"]
+
+ if network_mode is None and "FARGATE" not in self.compatibilities:
+ self.network_mode = "bridge"
+ elif "FARGATE" in self.compatibilities:
+ self.network_mode = "awsvpc"
+ else:
+ self.network_mode = network_mode
+
+ if task_role_arn is not None:
+ self.task_role_arn = task_role_arn
+ if execution_role_arn is not None:
+ self.execution_role_arn = execution_role_arn
+
+ self.placement_constraints = (
+ placement_constraints if placement_constraints is not None else []
+ )
+
+ self.requires_compatibilities = requires_compatibilities
+
+ self.cpu = cpu
+ self.memory = memory
+ self.status = "ACTIVE"
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["taskDefinitionArn"] = response_object["arn"]
+ del response_object["arn"]
+ del response_object["tags"]
+
+ if not response_object["requiresCompatibilities"]:
+ del response_object["requiresCompatibilities"]
+ if not response_object["cpu"]:
+ del response_object["cpu"]
+ if not response_object["memory"]:
+ del response_object["memory"]
+
+ return response_object
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html
+ return "AWS::ECS::TaskDefinition"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ family = properties.get(
+ "Family", "task-definition-{0}".format(int(random() * 10**6))
+ )
+ container_definitions = remap_nested_keys(
+ properties.get("ContainerDefinitions", []), pascal_to_camelcase
+ )
+ volumes = remap_nested_keys(properties.get("Volumes", []), pascal_to_camelcase)
+
+ ecs_backend = ecs_backends[region_name]
+ return ecs_backend.register_task_definition(
+ family=family, container_definitions=container_definitions, volumes=volumes
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ family = properties.get(
+ "Family", "task-definition-{0}".format(int(random() * 10**6))
+ )
+ container_definitions = properties["ContainerDefinitions"]
+ volumes = properties.get("Volumes")
+ if (
+ original_resource.family != family
+ or original_resource.container_definitions != container_definitions
+ or original_resource.volumes != volumes
+ ):
+ # currently TaskRoleArn isn't stored at TaskDefinition
+ # instances
+ ecs_backend = ecs_backends[region_name]
+ ecs_backend.deregister_task_definition(original_resource.arn)
+ return ecs_backend.register_task_definition(
+ family=family,
+ container_definitions=container_definitions,
+ volumes=volumes,
+ )
+ else:
+ # no-op when nothing changed between old and new resources
+ return original_resource
+
+
+class Task(BaseObject):
+ def __init__(
+ self,
+ cluster,
+ task_definition,
+ container_instance_arn,
+ resource_requirements,
+ backend,
+ launch_type="",
+ overrides=None,
+ started_by="",
+ tags=None,
+ ):
+ self.id = str(uuid.uuid4())
+ self.cluster_name = cluster.name
+ self.cluster_arn = cluster.arn
+ self.container_instance_arn = container_instance_arn
+ self.last_status = "RUNNING"
+ self.desired_status = "RUNNING"
+ self.task_definition_arn = task_definition.arn
+ self.overrides = overrides or {}
+ self.containers = []
+ self.started_by = started_by
+ self.tags = tags or []
+ self.launch_type = launch_type
+ self.stopped_reason = ""
+ self.resource_requirements = resource_requirements
+ self.region_name = cluster.region_name
+ self._backend = backend
+
+ @property
+ def task_arn(self):
+ if self._backend.enable_long_arn_for_name(name="taskLongArnFormat"):
+ return f"arn:aws:ecs:{self.region_name}:{get_account_id()}:task/{self.cluster_name}/{self.id}"
+ return "arn:aws:ecs:{0}:{1}:task/{2}".format(
+ self.region_name, get_account_id(), self.id
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["taskArn"] = self.task_arn
+ return response_object
+
+
+class CapacityProvider(BaseObject):
+ def __init__(self, region_name, name, asg_details, tags):
+ self._id = str(uuid.uuid4())
+ self.capacity_provider_arn = f"arn:aws:ecs:{region_name}:{get_account_id()}:capacity_provider/{name}/{self._id}"
+ self.name = name
+ self.status = "ACTIVE"
+ self.auto_scaling_group_provider = asg_details
+ self.tags = tags
+
+
+class CapacityProviderFailure(BaseObject):
+ def __init__(self, reason, name, region_name):
+ self.reason = reason
+ self.arn = "arn:aws:ecs:{0}:{1}:capacity_provider/{2}".format(
+ region_name, get_account_id(), name
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["reason"] = self.reason
+ response_object["arn"] = self.arn
+ return response_object
+
+
+class Service(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ cluster,
+ service_name,
+ desired_count,
+ task_definition=None,
+ load_balancers=None,
+ scheduling_strategy=None,
+ tags=None,
+ deployment_controller=None,
+ launch_type=None,
+ backend=None,
+ service_registries=None,
+ ):
+ self.cluster_name = cluster.name
+ self.cluster_arn = cluster.arn
+ self.name = service_name
+ self.status = "ACTIVE"
+ self.running_count = 0
+ if task_definition:
+ self.task_definition = task_definition.arn
+ else:
+ self.task_definition = None
+ self.desired_count = desired_count
+ self.task_sets = []
+ self.deployment_controller = deployment_controller or {"type": "ECS"}
+ self.events = []
+ self.launch_type = launch_type
+ self.service_registries = service_registries or []
+ if self.deployment_controller["type"] == "ECS":
+ self.deployments = [
+ {
+ "createdAt": datetime.now(pytz.utc),
+ "desiredCount": self.desired_count,
+ "id": "ecs-svc/{}".format(randint(0, 32**12)),
+ "launchType": self.launch_type,
+ "pendingCount": self.desired_count,
+ "runningCount": 0,
+ "status": "PRIMARY",
+ "taskDefinition": self.task_definition,
+ "updatedAt": datetime.now(pytz.utc),
+ }
+ ]
+ else:
+ self.deployments = []
+ self.load_balancers = load_balancers if load_balancers is not None else []
+ self.scheduling_strategy = (
+ scheduling_strategy if scheduling_strategy is not None else "REPLICA"
+ )
+ self.tags = tags if tags is not None else []
+ self.pending_count = 0
+ self.region_name = cluster.region_name
+ self._backend = backend
+
+ @property
+ def arn(self):
+ if self._backend.enable_long_arn_for_name(name="serviceLongArnFormat"):
+ return f"arn:aws:ecs:{self.region_name}:{get_account_id()}:service/{self.cluster_name}/{self.name}"
+ return "arn:aws:ecs:{0}:{1}:service/{2}".format(
+ self.region_name, get_account_id(), self.name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ del response_object["name"], response_object["tags"]
+ response_object["serviceName"] = self.name
+ response_object["serviceArn"] = self.arn
+ response_object["schedulingStrategy"] = self.scheduling_strategy
+ if response_object["deploymentController"]["type"] == "ECS":
+ del response_object["deploymentController"]
+ del response_object["taskSets"]
+ else:
+ response_object["taskSets"] = [
+ t.response_object for t in response_object["taskSets"]
+ ]
+
+ for deployment in response_object["deployments"]:
+ if isinstance(deployment["createdAt"], datetime):
+ deployment["createdAt"] = unix_time(
+ deployment["createdAt"].replace(tzinfo=None)
+ )
+ if isinstance(deployment["updatedAt"], datetime):
+ deployment["updatedAt"] = unix_time(
+ deployment["updatedAt"].replace(tzinfo=None)
+ )
+
+ return response_object
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "ServiceName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html
+ return "AWS::ECS::Service"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ if isinstance(properties["Cluster"], Cluster):
+ cluster = properties["Cluster"].name
+ else:
+ cluster = properties["Cluster"]
+ if isinstance(properties["TaskDefinition"], TaskDefinition):
+ task_definition = properties["TaskDefinition"].family
+ else:
+ task_definition = properties["TaskDefinition"]
+ desired_count = properties.get("DesiredCount", None)
+ # TODO: LoadBalancers
+ # TODO: Role
+
+ ecs_backend = ecs_backends[region_name]
+ return ecs_backend.create_service(
+ cluster, resource_name, desired_count, task_definition_str=task_definition
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ if isinstance(properties["Cluster"], Cluster):
+ cluster_name = properties["Cluster"].name
+ else:
+ cluster_name = properties["Cluster"]
+ if isinstance(properties["TaskDefinition"], TaskDefinition):
+ task_definition = properties["TaskDefinition"].family
+ else:
+ task_definition = properties["TaskDefinition"]
+ desired_count = properties.get("DesiredCount", None)
+
+ ecs_backend = ecs_backends[region_name]
+ service_name = original_resource.name
+ if original_resource.cluster_arn != Cluster(cluster_name, region_name).arn:
+ # TODO: LoadBalancers
+ # TODO: Role
+ ecs_backend.delete_service(cluster_name, service_name)
+ return ecs_backend.create_service(
+ cluster_name,
+ new_resource_name,
+ desired_count,
+ task_definition_str=task_definition,
+ )
+ else:
+ return ecs_backend.update_service(
+ cluster_name, service_name, task_definition, desired_count
+ )
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Name"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Name":
+ return self.name
+ raise UnformattedGetAttTemplateException()
+
+
+class ContainerInstance(BaseObject):
+ def __init__(self, ec2_instance_id, region_name, cluster_name, backend):
+ self.ec2_instance_id = ec2_instance_id
+ self.agent_connected = True
+ self.status = "ACTIVE"
+ self.registered_resources = [
+ {
+ "doubleValue": 0.0,
+ "integerValue": 4096,
+ "longValue": 0,
+ "name": "CPU",
+ "type": "INTEGER",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 7482,
+ "longValue": 0,
+ "name": "MEMORY",
+ "type": "INTEGER",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "name": "PORTS",
+ "stringSetValue": ["22", "2376", "2375", "51678", "51679"],
+ "type": "STRINGSET",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "name": "PORTS_UDP",
+ "stringSetValue": [],
+ "type": "STRINGSET",
+ },
+ ]
+ self.pending_tasks_count = 0
+ self.remaining_resources = [
+ {
+ "doubleValue": 0.0,
+ "integerValue": 4096,
+ "longValue": 0,
+ "name": "CPU",
+ "type": "INTEGER",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 7482,
+ "longValue": 0,
+ "name": "MEMORY",
+ "type": "INTEGER",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "name": "PORTS",
+ "stringSetValue": ["22", "2376", "2375", "51678", "51679"],
+ "type": "STRINGSET",
+ },
+ {
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "name": "PORTS_UDP",
+ "stringSetValue": [],
+ "type": "STRINGSET",
+ },
+ ]
+ self.running_tasks_count = 0
+ self.version_info = {
+ "agentVersion": "1.0.0",
+ "agentHash": "4023248",
+ "dockerVersion": "DockerVersion: 1.5.0",
+ }
+ ec2_backend = ec2_backends[region_name]
+ ec2_instance = ec2_backend.get_instance(ec2_instance_id)
+ self.attributes = {
+ "ecs.ami-id": ec2_instance.image_id,
+ "ecs.availability-zone": ec2_instance.placement,
+ "ecs.instance-type": ec2_instance.instance_type,
+ "ecs.os-type": ec2_instance.platform
+ if ec2_instance.platform == "windows"
+ else "linux", # options are windows and linux, linux is default
+ }
+ self.registered_at = datetime.now(pytz.utc)
+ self.region_name = region_name
+ self.id = str(uuid.uuid4())
+ self.cluster_name = cluster_name
+ self._backend = backend
+
+ @property
+ def container_instance_arn(self):
+ if self._backend.enable_long_arn_for_name(
+ name="containerInstanceLongArnFormat"
+ ):
+ return f"arn:aws:ecs:{self.region_name}:{get_account_id()}:container-instance/{self.cluster_name}/{self.id}"
+ return f"arn:aws:ecs:{self.region_name}:{get_account_id()}:container-instance/{self.id}"
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["containerInstanceArn"] = self.container_instance_arn
+ response_object["attributes"] = [
+ self._format_attribute(name, value)
+ for name, value in response_object["attributes"].items()
+ ]
+ if isinstance(response_object["registeredAt"], datetime):
+ response_object["registeredAt"] = unix_time(
+ response_object["registeredAt"].replace(tzinfo=None)
+ )
+ return response_object
+
+ def _format_attribute(self, name, value):
+ formatted_attr = {"name": name}
+ if value is not None:
+ formatted_attr["value"] = value
+ return formatted_attr
+
+
+class ClusterFailure(BaseObject):
+ def __init__(self, reason, cluster_name, region_name):
+ self.reason = reason
+ self.arn = "arn:aws:ecs:{0}:{1}:cluster/{2}".format(
+ region_name, get_account_id(), cluster_name
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["reason"] = self.reason
+ response_object["arn"] = self.arn
+ return response_object
+
+
+class ContainerInstanceFailure(BaseObject):
+ def __init__(self, reason, container_instance_id, region_name):
+ self.reason = reason
+ self.arn = "arn:aws:ecs:{0}:{1}:container-instance/{2}".format(
+ region_name, get_account_id(), container_instance_id
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ response_object["reason"] = self.reason
+ response_object["arn"] = self.arn
+ return response_object
+
+
+class TaskSet(BaseObject):
+ def __init__(
+ self,
+ service,
+ cluster,
+ task_definition,
+ region_name,
+ external_id=None,
+ network_configuration=None,
+ load_balancers=None,
+ service_registries=None,
+ launch_type=None,
+ capacity_provider_strategy=None,
+ platform_version=None,
+ scale=None,
+ client_token=None,
+ tags=None,
+ ):
+ self.service = service
+ self.cluster = cluster
+ self.status = "ACTIVE"
+ self.task_definition = task_definition or ""
+ self.region_name = region_name
+ self.external_id = external_id or ""
+ self.network_configuration = network_configuration or {}
+ self.load_balancers = load_balancers or []
+ self.service_registries = service_registries or []
+ self.launch_type = launch_type
+ self.capacity_provider_strategy = capacity_provider_strategy or []
+ self.platform_version = platform_version or ""
+ self.scale = scale or {"value": 100.0, "unit": "PERCENT"}
+ self.client_token = client_token or ""
+ self.tags = tags or []
+ self.stabilityStatus = "STEADY_STATE"
+ self.createdAt = datetime.now(pytz.utc)
+ self.updatedAt = datetime.now(pytz.utc)
+ self.stabilityStatusAt = datetime.now(pytz.utc)
+ self.id = "ecs-svc/{}".format(randint(0, 32**12))
+ self.service_arn = ""
+ self.cluster_arn = ""
+
+ cluster_name = self.cluster.split("/")[-1]
+ service_name = self.service.split("/")[-1]
+ self.task_set_arn = "arn:aws:ecs:{0}:{1}:task-set/{2}/{3}/{4}".format(
+ region_name, get_account_id(), cluster_name, service_name, self.id
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ if isinstance(response_object["createdAt"], datetime):
+ response_object["createdAt"] = unix_time(
+ self.createdAt.replace(tzinfo=None)
+ )
+ if isinstance(response_object["updatedAt"], datetime):
+ response_object["updatedAt"] = unix_time(
+ self.updatedAt.replace(tzinfo=None)
+ )
+ if isinstance(response_object["stabilityStatusAt"], datetime):
+ response_object["stabilityStatusAt"] = unix_time(
+ self.stabilityStatusAt.replace(tzinfo=None)
+ )
+ del response_object["service"]
+ del response_object["cluster"]
+ return response_object
+
+
+class EC2ContainerServiceBackend(BaseBackend):
+ """
+ ECS resources use the new ARN format by default.
+ Use the following environment variable to revert back to the old/short ARN format:
+ `MOTO_ECS_NEW_ARN=false`
+
+ AWS reference: https://aws.amazon.com/blogs/compute/migrating-your-amazon-ecs-deployment-to-the-new-arn-and-resource-id-format-2/
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.account_settings = dict()
+ self.capacity_providers = dict()
+ self.clusters = {}
+ self.task_definitions = {}
+ self.tasks = {}
+ self.services = {}
+ self.container_instances = {}
+ self.task_sets = {}
+ self.tagger = TaggingService(
+ tag_name="tags", key_name="key", value_name="value"
+ )
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ecs"
+ )
+
+ def _get_cluster(self, name):
+ # short name or full ARN of the cluster
+ cluster_name = name.split("/")[-1]
+
+ cluster = self.clusters.get(cluster_name)
+ if not cluster:
+ raise ClusterNotFoundException
+
+ return cluster
+
+ def create_capacity_provider(self, name, asg_details, tags):
+ capacity_provider = CapacityProvider(self.region_name, name, asg_details, tags)
+ self.capacity_providers[name] = capacity_provider
+ if tags:
+ self.tagger.tag_resource(capacity_provider.capacity_provider_arn, tags)
+ return capacity_provider
+
+ def describe_task_definition(self, task_definition_str):
+ task_definition_name = task_definition_str.split("/")[-1]
+ if ":" in task_definition_name:
+ family, revision = task_definition_name.split(":")
+ revision = int(revision)
+ else:
+ family = task_definition_name
+ revision = self._get_last_task_definition_revision_id(family)
+
+ if (
+ family in self.task_definitions
+ and revision in self.task_definitions[family]
+ ):
+ return self.task_definitions[family][revision]
+ else:
+ raise Exception("{0} is not a task_definition".format(task_definition_name))
+
+ def create_cluster(self, cluster_name, tags=None, cluster_settings=None):
+ """
+ The following parameters are not yet implemented: configuration, capacityProviders, defaultCapacityProviderStrategy
+ """
+ cluster = Cluster(cluster_name, self.region_name, cluster_settings)
+ self.clusters[cluster_name] = cluster
+ if tags:
+ self.tagger.tag_resource(cluster.arn, tags)
+ return cluster
+
+ def _get_provider(self, name_or_arn):
+ for provider in self.capacity_providers.values():
+ if (
+ provider.name == name_or_arn
+ or provider.capacity_provider_arn == name_or_arn
+ ):
+ return provider
+
+ def describe_capacity_providers(self, names):
+ providers = []
+ failures = []
+ for name in names:
+ provider = self._get_provider(name)
+ if provider:
+ providers.append(provider)
+ else:
+ failures.append(
+ CapacityProviderFailure("MISSING", name, self.region_name)
+ )
+ return providers, failures
+
+ def delete_capacity_provider(self, name_or_arn):
+ provider = self._get_provider(name_or_arn)
+ self.capacity_providers.pop(provider.name)
+ return provider
+
+ def list_clusters(self):
+ """
+ maxSize and pagination not implemented
+ """
+ return [cluster.arn for cluster in self.clusters.values()]
+
+ def describe_clusters(self, list_clusters_name=None, include=None):
+ """
+ Only include=TAGS is currently supported.
+ """
+ list_clusters = []
+ failures = []
+ if list_clusters_name is None:
+ if "default" in self.clusters:
+ list_clusters.append(self.clusters["default"].response_object)
+ else:
+ for cluster in list_clusters_name:
+ cluster_name = cluster.split("/")[-1]
+ if cluster_name in self.clusters:
+ list_clusters.append(self.clusters[cluster_name].response_object)
+ else:
+ failures.append(
+ ClusterFailure("MISSING", cluster_name, self.region_name)
+ )
+
+ if "TAGS" in (include or []):
+ for cluster in list_clusters:
+ cluster_arn = cluster["clusterArn"]
+ if self.tagger.has_tags(cluster_arn):
+ cluster_tags = self.tagger.list_tags_for_resource(cluster_arn)
+ cluster.update(cluster_tags)
+
+ return list_clusters, failures
+
+ def delete_cluster(self, cluster_str):
+ cluster = self._get_cluster(cluster_str)
+
+ return self.clusters.pop(cluster.name)
+
+ def register_task_definition(
+ self,
+ family,
+ container_definitions,
+ volumes=None,
+ network_mode=None,
+ tags=None,
+ placement_constraints=None,
+ requires_compatibilities=None,
+ cpu=None,
+ memory=None,
+ task_role_arn=None,
+ execution_role_arn=None,
+ ):
+ if family in self.task_definitions:
+ last_id = self._get_last_task_definition_revision_id(family)
+ revision = (last_id or 0) + 1
+ else:
+ self.task_definitions[family] = {}
+ revision = 1
+ task_definition = TaskDefinition(
+ family,
+ revision,
+ container_definitions,
+ self.region_name,
+ volumes=volumes,
+ network_mode=network_mode,
+ tags=tags,
+ placement_constraints=placement_constraints,
+ requires_compatibilities=requires_compatibilities,
+ cpu=cpu,
+ memory=memory,
+ task_role_arn=task_role_arn,
+ execution_role_arn=execution_role_arn,
+ )
+ self.task_definitions[family][revision] = task_definition
+
+ return task_definition
+
+ def list_task_definitions(self, family_prefix):
+ task_arns = []
+ for task_definition_list in self.task_definitions.values():
+ task_arns.extend(
+ [
+ task_definition.arn
+ for task_definition in task_definition_list.values()
+ if family_prefix is None or task_definition.family == family_prefix
+ ]
+ )
+ return task_arns
+
+ def deregister_task_definition(self, task_definition_str):
+ task_definition_name = task_definition_str.split("/")[-1]
+ try:
+ family, revision = task_definition_name.split(":")
+ except ValueError:
+ raise RevisionNotFoundException
+ try:
+ revision = int(revision)
+ except ValueError:
+ raise InvalidParameterException(
+ "Invalid revision number. Number: " + revision
+ )
+ if (
+ family in self.task_definitions
+ and revision in self.task_definitions[family]
+ ):
+ task_definition = self.task_definitions[family].pop(revision)
+ task_definition.status = "INACTIVE"
+ return task_definition
+ else:
+ raise TaskDefinitionNotFoundException
+
+ def run_task(
+ self,
+ cluster_str,
+ task_definition_str,
+ count,
+ overrides,
+ started_by,
+ tags,
+ launch_type,
+ ):
+ cluster = self._get_cluster(cluster_str)
+
+ task_definition = self.describe_task_definition(task_definition_str)
+ if cluster.name not in self.tasks:
+ self.tasks[cluster.name] = {}
+ tasks = []
+ container_instances = list(
+ self.container_instances.get(cluster.name, {}).keys()
+ )
+ if not container_instances:
+ raise Exception("No instances found in cluster {}".format(cluster.name))
+ active_container_instances = [
+ x
+ for x in container_instances
+ if self.container_instances[cluster.name][x].status == "ACTIVE"
+ ]
+ resource_requirements = self._calculate_task_resource_requirements(
+ task_definition
+ )
+ # TODO: return event about unable to place task if not able to place enough tasks to meet count
+ placed_count = 0
+ for container_instance in active_container_instances:
+ container_instance = self.container_instances[cluster.name][
+ container_instance
+ ]
+ container_instance_arn = container_instance.container_instance_arn
+ try_to_place = True
+ while try_to_place:
+ can_be_placed = self._can_be_placed(
+ container_instance, resource_requirements
+ )
+ if can_be_placed:
+ task = Task(
+ cluster,
+ task_definition,
+ container_instance_arn,
+ resource_requirements,
+ backend=self,
+ overrides=overrides or {},
+ started_by=started_by or "",
+ tags=tags or [],
+ launch_type=launch_type or "",
+ )
+ self.update_container_instance_resources(
+ container_instance, resource_requirements
+ )
+ tasks.append(task)
+ self.tasks[cluster.name][task.task_arn] = task
+ placed_count += 1
+ if placed_count == count:
+ return tasks
+ else:
+ try_to_place = False
+ return tasks
+
+ @staticmethod
+ def _calculate_task_resource_requirements(task_definition):
+ resource_requirements = {"CPU": 0, "MEMORY": 0, "PORTS": [], "PORTS_UDP": []}
+ for container_definition in task_definition.container_definitions:
+ # cloudformation uses capitalized properties, while boto uses all lower case
+
+ # CPU is optional
+ resource_requirements["CPU"] += container_definition.get(
+ "cpu", container_definition.get("Cpu", 0)
+ )
+
+ # either memory or memory reservation must be provided
+ if (
+ "Memory" in container_definition
+ or "MemoryReservation" in container_definition
+ ):
+ resource_requirements["MEMORY"] += container_definition.get(
+ "Memory", container_definition.get("MemoryReservation")
+ )
+ else:
+ resource_requirements["MEMORY"] += container_definition.get(
+ "memory", container_definition.get("memoryReservation")
+ )
+
+ port_mapping_key = (
+ "PortMappings"
+ if "PortMappings" in container_definition
+ else "portMappings"
+ )
+ for port_mapping in container_definition.get(port_mapping_key, []):
+ if "hostPort" in port_mapping:
+ resource_requirements["PORTS"].append(port_mapping.get("hostPort"))
+ elif "HostPort" in port_mapping:
+ resource_requirements["PORTS"].append(port_mapping.get("HostPort"))
+
+ return resource_requirements
+
+ @staticmethod
+ def _can_be_placed(container_instance, task_resource_requirements):
+ """
+
+ :param container_instance: The container instance trying to be placed onto
+ :param task_resource_requirements: The calculated resource requirements of the task in the form of a dict
+ :return: A boolean stating whether the given container instance has enough resources to have the task placed on
+ it as well as a description, if it cannot be placed this will describe why.
+ """
+ # TODO: Implement default and other placement strategies as well as constraints:
+ # docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement.html
+ remaining_cpu = 0
+ remaining_memory = 0
+ reserved_ports = []
+ for resource in container_instance.remaining_resources:
+ if resource.get("name") == "CPU":
+ remaining_cpu = resource.get("integerValue")
+ elif resource.get("name") == "MEMORY":
+ remaining_memory = resource.get("integerValue")
+ elif resource.get("name") == "PORTS":
+ reserved_ports = resource.get("stringSetValue")
+ if task_resource_requirements.get("CPU") > remaining_cpu:
+ return False
+ if task_resource_requirements.get("MEMORY") > remaining_memory:
+ return False
+ ports_needed = task_resource_requirements.get("PORTS")
+ for port in ports_needed:
+ if str(port) in reserved_ports:
+ return False
+ return True
+
+ def start_task(
+ self,
+ cluster_str,
+ task_definition_str,
+ container_instances,
+ overrides,
+ started_by,
+ ):
+ cluster = self._get_cluster(cluster_str)
+
+ task_definition = self.describe_task_definition(task_definition_str)
+ if cluster.name not in self.tasks:
+ self.tasks[cluster.name] = {}
+ tasks = []
+ if not container_instances:
+ raise EcsClientException("Container Instances cannot be empty.")
+
+ container_instance_ids = [x.split("/")[-1] for x in container_instances]
+ resource_requirements = self._calculate_task_resource_requirements(
+ task_definition
+ )
+ for container_instance_id in container_instance_ids:
+ container_instance = self.container_instances[cluster.name][
+ container_instance_id
+ ]
+ task = Task(
+ cluster,
+ task_definition,
+ container_instance.container_instance_arn,
+ resource_requirements,
+ backend=self,
+ overrides=overrides or {},
+ started_by=started_by or "",
+ )
+ tasks.append(task)
+ self.update_container_instance_resources(
+ container_instance, resource_requirements
+ )
+ self.tasks[cluster.name][task.task_arn] = task
+ return tasks
+
+ def describe_tasks(self, cluster_str, tasks):
+ self._get_cluster(cluster_str)
+
+ if not tasks:
+ raise InvalidParameterException("Tasks cannot be empty.")
+ response = []
+ for cluster_tasks in self.tasks.values():
+ for task_arn, task in cluster_tasks.items():
+ task_id = task_arn.split("/")[-1]
+ if (
+ task_arn in tasks
+ or task.task_arn in tasks
+ or any(task_id in task for task in tasks)
+ ):
+ response.append(task)
+ return response
+
+ def list_tasks(
+ self,
+ cluster_str,
+ container_instance,
+ family,
+ started_by,
+ service_name,
+ desiredStatus,
+ ):
+ filtered_tasks = []
+ for cluster, tasks in self.tasks.items():
+ for task in tasks.values():
+ filtered_tasks.append(task)
+ if cluster_str:
+ cluster = self._get_cluster(cluster_str)
+
+ filtered_tasks = list(
+ filter(lambda t: cluster.name in t.cluster_arn, filtered_tasks)
+ )
+
+ if container_instance:
+ filtered_tasks = list(
+ filter(
+ lambda t: container_instance in t.container_instance_arn,
+ filtered_tasks,
+ )
+ )
+
+ if family:
+ task_definition_arns = self.list_task_definitions(family)
+ filtered_tasks = list(
+ filter(
+ lambda t: t.task_definition_arn in task_definition_arns,
+ filtered_tasks,
+ )
+ )
+
+ if started_by:
+ filtered_tasks = list(
+ filter(lambda t: started_by == t.started_by, filtered_tasks)
+ )
+
+ if service_name:
+ # TODO: We can't filter on `service_name` until the backend actually
+ # launches tasks as part of the service creation process.
+ pass
+
+ if desiredStatus:
+ filtered_tasks = list(
+ filter(lambda t: t.desired_status == desiredStatus, filtered_tasks)
+ )
+
+ return [t.task_arn for t in filtered_tasks]
+
+ def stop_task(self, cluster_str, task_str, reason):
+ cluster = self._get_cluster(cluster_str)
+
+ task_id = task_str.split("/")[-1]
+ tasks = self.tasks.get(cluster.name, None)
+ if not tasks:
+ raise Exception("Cluster {} has no registered tasks".format(cluster.name))
+ for task in tasks.keys():
+ if task.endswith(task_id):
+ container_instance_arn = tasks[task].container_instance_arn
+ container_instance = self.container_instances[cluster.name][
+ container_instance_arn.split("/")[-1]
+ ]
+ self.update_container_instance_resources(
+ container_instance, tasks[task].resource_requirements, removing=True
+ )
+ tasks[task].last_status = "STOPPED"
+ tasks[task].desired_status = "STOPPED"
+ tasks[task].stopped_reason = reason
+ return tasks[task]
+ raise Exception(
+ "Could not find task {} on cluster {}".format(task_str, cluster.name)
+ )
+
+ def _get_service(self, cluster_str, service_str):
+ cluster = self._get_cluster(cluster_str)
+ for service in self.services.values():
+ if service.cluster_name == cluster.name and (
+ service.name == service_str or service.arn == service_str
+ ):
+ return service
+ raise ServiceNotFoundException
+
+ def create_service(
+ self,
+ cluster_str,
+ service_name,
+ desired_count,
+ task_definition_str=None,
+ load_balancers=None,
+ scheduling_strategy=None,
+ tags=None,
+ deployment_controller=None,
+ launch_type=None,
+ service_registries=None,
+ ):
+ cluster = self._get_cluster(cluster_str)
+
+ if task_definition_str is not None:
+ task_definition = self.describe_task_definition(task_definition_str)
+ else:
+ task_definition = None
+ desired_count = desired_count if desired_count is not None else 0
+
+ launch_type = launch_type if launch_type is not None else "EC2"
+ if launch_type not in ["EC2", "FARGATE"]:
+ raise EcsClientException("launch type should be one of [EC2,FARGATE]")
+
+ service = Service(
+ cluster,
+ service_name,
+ desired_count,
+ task_definition,
+ load_balancers,
+ scheduling_strategy,
+ tags,
+ deployment_controller,
+ launch_type,
+ backend=self,
+ service_registries=service_registries,
+ )
+ cluster_service_pair = "{0}:{1}".format(cluster.name, service_name)
+ self.services[cluster_service_pair] = service
+
+ return service
+
+ def list_services(self, cluster_str, scheduling_strategy=None, launch_type=None):
+ cluster_name = cluster_str.split("/")[-1]
+ service_arns = []
+ for key, service in self.services.items():
+ if cluster_name + ":" not in key:
+ continue
+
+ if (
+ scheduling_strategy is not None
+ and service.scheduling_strategy != scheduling_strategy
+ ):
+ continue
+
+ if launch_type is not None and service.launch_type != launch_type:
+ continue
+
+ service_arns.append(service.arn)
+
+ return sorted(service_arns)
+
+ def describe_services(self, cluster_str, service_names_or_arns):
+ cluster = self._get_cluster(cluster_str)
+ service_names = [name.split("/")[-1] for name in service_names_or_arns]
+
+ result = []
+ failures = []
+ for name in service_names:
+ cluster_service_pair = "{0}:{1}".format(cluster.name, name)
+ if cluster_service_pair in self.services:
+ result.append(self.services[cluster_service_pair])
+ else:
+ missing_arn = (
+ f"arn:aws:ecs:{self.region_name}:{get_account_id()}:service/{name}"
+ )
+ failures.append({"arn": missing_arn, "reason": "MISSING"})
+
+ return result, failures
+
+ def update_service(
+ self, cluster_str, service_str, task_definition_str, desired_count
+ ):
+ cluster = self._get_cluster(cluster_str)
+
+ service_name = service_str.split("/")[-1]
+ cluster_service_pair = "{0}:{1}".format(cluster.name, service_name)
+ if cluster_service_pair in self.services:
+ if task_definition_str is not None:
+ self.describe_task_definition(task_definition_str)
+ self.services[
+ cluster_service_pair
+ ].task_definition = task_definition_str
+ if desired_count is not None:
+ self.services[cluster_service_pair].desired_count = desired_count
+ return self.services[cluster_service_pair]
+ else:
+ raise ServiceNotFoundException
+
+ def delete_service(self, cluster_name, service_name, force):
+ cluster = self._get_cluster(cluster_name)
+ service = self._get_service(cluster_name, service_name)
+
+ cluster_service_pair = "{0}:{1}".format(cluster.name, service.name)
+
+ service = self.services[cluster_service_pair]
+ if service.desired_count > 0 and not force:
+ raise InvalidParameterException(
+ "The service cannot be stopped while it is scaled above 0."
+ )
+ else:
+ return self.services.pop(cluster_service_pair)
+
+ def register_container_instance(self, cluster_str, ec2_instance_id):
+ cluster_name = cluster_str.split("/")[-1]
+ if cluster_name not in self.clusters:
+ raise Exception("{0} is not a cluster".format(cluster_name))
+ container_instance = ContainerInstance(
+ ec2_instance_id, self.region_name, cluster_name, backend=self
+ )
+ if not self.container_instances.get(cluster_name):
+ self.container_instances[cluster_name] = {}
+ container_instance_id = container_instance.container_instance_arn.split("/")[-1]
+ self.container_instances[cluster_name][
+ container_instance_id
+ ] = container_instance
+ self.clusters[cluster_name].registered_container_instances_count += 1
+ return container_instance
+
+ def list_container_instances(self, cluster_str):
+ cluster_name = cluster_str.split("/")[-1]
+ container_instances_values = self.container_instances.get(
+ cluster_name, {}
+ ).values()
+ container_instances = [
+ ci.container_instance_arn for ci in container_instances_values
+ ]
+ return sorted(container_instances)
+
+ def describe_container_instances(self, cluster_str, list_container_instance_ids):
+ cluster = self._get_cluster(cluster_str)
+
+ if not list_container_instance_ids:
+ raise EcsClientException("Container Instances cannot be empty.")
+ failures = []
+ container_instance_objects = []
+ for container_instance_id in list_container_instance_ids:
+ container_instance_id = container_instance_id.split("/")[-1]
+ container_instance = self.container_instances[cluster.name].get(
+ container_instance_id, None
+ )
+ if container_instance is not None:
+ container_instance_objects.append(container_instance)
+ else:
+ failures.append(
+ ContainerInstanceFailure(
+ "MISSING", container_instance_id, self.region_name
+ )
+ )
+
+ return container_instance_objects, failures
+
+ def update_container_instances_state(
+ self, cluster_str, list_container_instance_ids, status
+ ):
+ cluster = self._get_cluster(cluster_str)
+
+ status = status.upper()
+ if status not in ["ACTIVE", "DRAINING"]:
+ raise InvalidParameterException(
+ "Container instance status should be one of [ACTIVE, DRAINING]"
+ )
+ failures = []
+ container_instance_objects = []
+ list_container_instance_ids = [
+ x.split("/")[-1] for x in list_container_instance_ids
+ ]
+ for container_instance_id in list_container_instance_ids:
+ container_instance = self.container_instances[cluster.name].get(
+ container_instance_id, None
+ )
+ if container_instance is not None:
+ container_instance.status = status
+ container_instance_objects.append(container_instance)
+ else:
+ failures.append(
+ ContainerInstanceFailure(
+ "MISSING", container_instance_id, self.region_name
+ )
+ )
+
+ return container_instance_objects, failures
+
+ def update_container_instance_resources(
+ self, container_instance, task_resources, removing=False
+ ):
+ resource_multiplier = 1
+ if removing:
+ resource_multiplier = -1
+ for resource in container_instance.remaining_resources:
+ if resource.get("name") == "CPU":
+ resource["integerValue"] -= (
+ task_resources.get("CPU") * resource_multiplier
+ )
+ elif resource.get("name") == "MEMORY":
+ resource["integerValue"] -= (
+ task_resources.get("MEMORY") * resource_multiplier
+ )
+ elif resource.get("name") == "PORTS":
+ for port in task_resources.get("PORTS"):
+ if removing:
+ resource["stringSetValue"].remove(str(port))
+ else:
+ resource["stringSetValue"].append(str(port))
+ container_instance.running_tasks_count += resource_multiplier * 1
+
+ def deregister_container_instance(self, cluster_str, container_instance_str, force):
+ cluster = self._get_cluster(cluster_str)
+
+ container_instance_id = container_instance_str.split("/")[-1]
+ container_instance = self.container_instances[cluster.name].get(
+ container_instance_id
+ )
+ if container_instance is None:
+ raise Exception("{0} is not a container id in the cluster")
+ if not force and container_instance.running_tasks_count > 0:
+ raise Exception("Found running tasks on the instance.")
+ # Currently assume that people might want to do something based around deregistered instances
+ # with tasks left running on them - but nothing if no tasks were running already
+ elif force and container_instance.running_tasks_count > 0:
+ if not self.container_instances.get("orphaned"):
+ self.container_instances["orphaned"] = {}
+ self.container_instances["orphaned"][
+ container_instance_id
+ ] = container_instance
+ del self.container_instances[cluster.name][container_instance_id]
+ self._respond_to_cluster_state_update(cluster_str)
+ return container_instance
+
+ def _respond_to_cluster_state_update(self, cluster_str):
+ self._get_cluster(cluster_str)
+
+ pass
+
+ def put_attributes(self, cluster_name, attributes=None):
+ cluster = self._get_cluster(cluster_name)
+
+ if attributes is None:
+ raise InvalidParameterException("attributes can not be empty")
+
+ for attr in attributes:
+ self._put_attribute(
+ cluster.name,
+ attr["name"],
+ attr.get("value"),
+ attr.get("targetId"),
+ attr.get("targetType"),
+ )
+
+ def _put_attribute(
+ self, cluster_name, name, value=None, target_id=None, target_type=None
+ ):
+ if target_id is None and target_type is None:
+ for instance in self.container_instances[cluster_name].values():
+ instance.attributes[name] = value
+ elif target_type is None:
+ # targetId is full container instance arn
+ try:
+ arn = target_id.rsplit("/", 1)[-1]
+ self.container_instances[cluster_name][arn].attributes[name] = value
+ except KeyError:
+ raise JsonRESTError(
+ "TargetNotFoundException", "Could not find {0}".format(target_id)
+ )
+ else:
+ # targetId is container uuid, targetType must be container-instance
+ try:
+ if target_type != "container-instance":
+ raise JsonRESTError(
+ "TargetNotFoundException",
+ "Could not find {0}".format(target_id),
+ )
+
+ self.container_instances[cluster_name][target_id].attributes[
+ name
+ ] = value
+ except KeyError:
+ raise JsonRESTError(
+ "TargetNotFoundException", "Could not find {0}".format(target_id)
+ )
+
+ def list_attributes(
+ self,
+ target_type,
+ cluster_name=None,
+ attr_name=None,
+ attr_value=None,
+ ):
+ """
+ Pagination is not yet implemented
+ """
+ if target_type != "container-instance":
+ raise JsonRESTError(
+ "InvalidParameterException", "targetType must be container-instance"
+ )
+
+ filters = [lambda x: True]
+
+ # item will be {0 cluster_name, 1 arn, 2 name, 3 value}
+ if cluster_name is not None:
+ filters.append(lambda item: item[0] == cluster_name)
+ if attr_name:
+ filters.append(lambda item: item[2] == attr_name)
+ if attr_name:
+ filters.append(lambda item: item[3] == attr_value)
+
+ all_attrs = []
+ for cluster_name, cobj in self.container_instances.items():
+ for container_instance in cobj.values():
+ for key, value in container_instance.attributes.items():
+ all_attrs.append(
+ (
+ cluster_name,
+ container_instance.container_instance_arn,
+ key,
+ value,
+ )
+ )
+
+ return filter(lambda x: all(f(x) for f in filters), all_attrs)
+
+ def delete_attributes(self, cluster_name, attributes=None):
+ cluster = self._get_cluster(cluster_name)
+
+ if attributes is None:
+ raise JsonRESTError(
+ "InvalidParameterException", "attributes value is required"
+ )
+
+ for attr in attributes:
+ self._delete_attribute(
+ cluster.name,
+ attr["name"],
+ attr.get("value"),
+ attr.get("targetId"),
+ attr.get("targetType"),
+ )
+
+ def _delete_attribute(
+ self, cluster_name, name, value=None, target_id=None, target_type=None
+ ):
+ if target_id is None and target_type is None:
+ for instance in self.container_instances[cluster_name].values():
+ if name in instance.attributes and instance.attributes[name] == value:
+ del instance.attributes[name]
+ elif target_type is None:
+ # targetId is full container instance arn
+ try:
+ arn = target_id.rsplit("/", 1)[-1]
+ instance = self.container_instances[cluster_name][arn]
+ if name in instance.attributes and instance.attributes[name] == value:
+ del instance.attributes[name]
+ except KeyError:
+ raise JsonRESTError(
+ "TargetNotFoundException", "Could not find {0}".format(target_id)
+ )
+ else:
+ # targetId is container uuid, targetType must be container-instance
+ try:
+ if target_type != "container-instance":
+ raise JsonRESTError(
+ "TargetNotFoundException",
+ "Could not find {0}".format(target_id),
+ )
+
+ instance = self.container_instances[cluster_name][target_id]
+ if name in instance.attributes and instance.attributes[name] == value:
+ del instance.attributes[name]
+ except KeyError:
+ raise JsonRESTError(
+ "TargetNotFoundException", "Could not find {0}".format(target_id)
+ )
+
+ def list_task_definition_families(self, family_prefix=None):
+ """
+ The Status and pagination parameters are not yet implemented
+ """
+ for task_fam in self.task_definitions:
+ if family_prefix is not None and not task_fam.startswith(family_prefix):
+ continue
+
+ yield task_fam
+
+ @staticmethod
+ def _parse_resource_arn(resource_arn):
+ match = re.match(
+ "^arn:aws:ecs:(?P<region>[^:]+):(?P<account_id>[^:]+):(?P<service>[^:]+)/(?P<cluster_id>[^:]+)/(?P<id>.*)$",
+ resource_arn,
+ )
+ if not match:
+ # maybe a short-format ARN
+ match = re.match(
+ "^arn:aws:ecs:(?P<region>[^:]+):(?P<account_id>[^:]+):(?P<service>[^:]+)/(?P<id>.*)$",
+ resource_arn,
+ )
+ if not match:
+ raise JsonRESTError(
+ "InvalidParameterException", "The ARN provided is invalid."
+ )
+ return match.groupdict()
+
+ def list_tags_for_resource(self, resource_arn):
+ """Currently implemented only for task definitions and services"""
+ parsed_arn = self._parse_resource_arn(resource_arn)
+ if parsed_arn["service"] == "task-definition":
+ for task_definition in self.task_definitions.values():
+ for revision in task_definition.values():
+ if revision.arn == resource_arn:
+ return revision.tags
+ raise TaskDefinitionNotFoundException()
+ elif parsed_arn["service"] == "service":
+ for service in self.services.values():
+ if service.arn == resource_arn:
+ return service.tags
+ raise ServiceNotFoundException
+ raise NotImplementedError()
+
+ def _get_last_task_definition_revision_id(self, family):
+ definitions = self.task_definitions.get(family, {})
+ if definitions:
+ return max(definitions.keys())
+
+ def tag_resource(self, resource_arn, tags):
+ """Currently implemented only for services"""
+ parsed_arn = self._parse_resource_arn(resource_arn)
+ if parsed_arn["service"] == "service":
+ for service in self.services.values():
+ if service.arn == resource_arn:
+ service.tags = self._merge_tags(service.tags, tags)
+ return {}
+ raise ServiceNotFoundException
+ raise NotImplementedError()
+
+ def _merge_tags(self, existing_tags, new_tags):
+ merged_tags = new_tags
+ new_keys = self._get_keys(new_tags)
+ for existing_tag in existing_tags:
+ if existing_tag["key"] not in new_keys:
+ merged_tags.append(existing_tag)
+ return merged_tags
+
+ @staticmethod
+ def _get_keys(tags):
+ return [tag["key"] for tag in tags]
+
+ def untag_resource(self, resource_arn, tag_keys):
+ """Currently implemented only for services"""
+ parsed_arn = self._parse_resource_arn(resource_arn)
+ if parsed_arn["service"] == "service":
+ for service in self.services.values():
+ if service.arn == resource_arn:
+ service.tags = [
+ tag for tag in service.tags if tag["key"] not in tag_keys
+ ]
+ return {}
+ raise ServiceNotFoundException
+ raise NotImplementedError()
+
+ def create_task_set(
+ self,
+ service,
+ cluster_str,
+ task_definition,
+ external_id=None,
+ network_configuration=None,
+ load_balancers=None,
+ service_registries=None,
+ launch_type=None,
+ capacity_provider_strategy=None,
+ platform_version=None,
+ scale=None,
+ client_token=None,
+ tags=None,
+ ):
+ launch_type = launch_type if launch_type is not None else "EC2"
+ if launch_type not in ["EC2", "FARGATE"]:
+ raise EcsClientException("launch type should be one of [EC2,FARGATE]")
+
+ task_set = TaskSet(
+ service,
+ cluster_str,
+ task_definition,
+ self.region_name,
+ external_id=external_id,
+ network_configuration=network_configuration,
+ load_balancers=load_balancers,
+ service_registries=service_registries,
+ launch_type=launch_type,
+ capacity_provider_strategy=capacity_provider_strategy,
+ platform_version=platform_version,
+ scale=scale,
+ client_token=client_token,
+ tags=tags,
+ )
+
+ service_name = service.split("/")[-1]
+
+ cluster_obj = self._get_cluster(cluster_str)
+ service_obj = self.services.get(
+ "{0}:{1}".format(cluster_obj.name, service_name)
+ )
+ if not service_obj:
+ raise ServiceNotFoundException
+
+ task_set.task_definition = self.describe_task_definition(task_definition).arn
+ task_set.service_arn = service_obj.arn
+ task_set.cluster_arn = cluster_obj.arn
+
+ service_obj.task_sets.append(task_set)
+ # TODO: validate load balancers
+
+ return task_set
+
+ def describe_task_sets(self, cluster_str, service, task_sets=None, include=None):
+ task_sets = task_sets or []
+ include = include or []
+
+ cluster_obj = self._get_cluster(cluster_str)
+
+ service_name = service.split("/")[-1]
+ service_key = "{0}:{1}".format(cluster_obj.name, service_name)
+
+ service_obj = self.services.get(service_key)
+ if not service_obj:
+ raise ServiceNotFoundException
+
+ task_set_results = []
+ if task_sets:
+ for task_set in service_obj.task_sets:
+ if task_set.task_set_arn in task_sets:
+ task_set_results.append(task_set)
+ else:
+ task_set_results = service_obj.task_sets
+
+ return task_set_results
+
+ def delete_task_set(self, cluster, service, task_set):
+ """
+ The Force-parameter is not yet implemented
+ """
+ cluster_name = cluster.split("/")[-1]
+ service_name = service.split("/")[-1]
+
+ service_key = "{0}:{1}".format(cluster_name, service_name)
+ task_set_element = None
+ for i, ts in enumerate(self.services[service_key].task_sets):
+ if task_set == ts.task_set_arn:
+ task_set_element = i
+
+ if task_set_element is not None:
+ deleted_task_set = self.services[service_key].task_sets.pop(
+ task_set_element
+ )
+ else:
+ raise TaskSetNotFoundException
+
+ # TODO: add logic for `force` to raise an exception if `PRIMARY` task has not been scaled to 0.
+
+ return deleted_task_set
+
+ def update_task_set(self, cluster, service, task_set, scale):
+ cluster_name = cluster.split("/")[-1]
+ service_name = service.split("/")[-1]
+ task_set_obj = self.describe_task_sets(
+ cluster_name, service_name, task_sets=[task_set]
+ )[0]
+ task_set_obj.scale = scale
+ return task_set_obj
+
+ def update_service_primary_task_set(self, cluster, service, primary_task_set):
+ """Updates task sets be PRIMARY or ACTIVE for given cluster:service task sets"""
+ cluster_name = cluster.split("/")[-1]
+ service_name = service.split("/")[-1]
+ task_set_obj = self.describe_task_sets(
+ cluster_name, service_name, task_sets=[primary_task_set]
+ )[0]
+
+ services, _ = self.describe_services(cluster, [service])
+ service_obj = services[0]
+ service_obj.load_balancers = task_set_obj.load_balancers
+ service_obj.task_definition = task_set_obj.task_definition
+
+ for task_set in service_obj.task_sets:
+ if task_set.task_set_arn == primary_task_set:
+ task_set.status = "PRIMARY"
+ else:
+ task_set.status = "ACTIVE"
+ return task_set_obj
+
+ def list_account_settings(self, name=None, value=None):
+ expected_names = [
+ "serviceLongArnFormat",
+ "taskLongArnFormat",
+ "containerInstanceLongArnFormat",
+ "containerLongArnFormat",
+ "awsvpcTrunking",
+ "containerInsights",
+ "dualStackIPv6",
+ ]
+ if name and name not in expected_names:
+ raise UnknownAccountSettingException()
+ all_settings = self.account_settings.values()
+ return [
+ s
+ for s in all_settings
+ if (not name or s.name == name) and (not value or s.value == value)
+ ]
+
+ def put_account_setting(self, name, value):
+ account_setting = AccountSetting(name, value)
+ self.account_settings[name] = account_setting
+ return account_setting
+
+ def delete_account_setting(self, name):
+ self.account_settings.pop(name, None)
+
+ def enable_long_arn_for_name(self, name):
+ account = self.account_settings.get(name, None)
+ if account and account.value == "disabled":
+ return False
+ return settings.ecs_new_arn_format()
+
+
+ecs_backends = BackendDict(EC2ContainerServiceBackend, "ecs")
diff --git a/contrib/python/moto/py3/moto/ecs/responses.py b/contrib/python/moto/py3/moto/ecs/responses.py
new file mode 100644
index 0000000000..66d5c7a28c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecs/responses.py
@@ -0,0 +1,492 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import ecs_backends
+
+
+class EC2ContainerServiceResponse(BaseResponse):
+ @property
+ def ecs_backend(self):
+ """
+ ECS Backend
+
+ :return: ECS Backend object
+ :rtype: moto.ecs.models.EC2ContainerServiceBackend
+ """
+ return ecs_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def create_capacity_provider(self):
+ name = self._get_param("name")
+ asg_provider = self._get_param("autoScalingGroupProvider")
+ tags = self._get_param("tags")
+ provider = self.ecs_backend.create_capacity_provider(name, asg_provider, tags)
+ return json.dumps({"capacityProvider": provider.response_object})
+
+ def create_cluster(self):
+ cluster_name = self._get_param("clusterName")
+ tags = self._get_param("tags")
+ settings = self._get_param("settings")
+ if cluster_name is None:
+ cluster_name = "default"
+ cluster = self.ecs_backend.create_cluster(cluster_name, tags, settings)
+ return json.dumps({"cluster": cluster.response_object})
+
+ def list_clusters(self):
+ cluster_arns = self.ecs_backend.list_clusters()
+ return json.dumps(
+ {
+ "clusterArns": cluster_arns
+ # 'nextToken': str(uuid.uuid4())
+ }
+ )
+
+ def delete_capacity_provider(self):
+ name = self._get_param("capacityProvider")
+ provider = self.ecs_backend.delete_capacity_provider(name)
+ return json.dumps({"capacityProvider": provider.response_object})
+
+ def describe_capacity_providers(self):
+ names = self._get_param("capacityProviders")
+ providers, failures = self.ecs_backend.describe_capacity_providers(names)
+ return json.dumps(
+ {
+ "capacityProviders": [p.response_object for p in providers],
+ "failures": [p.response_object for p in failures],
+ }
+ )
+
+ def describe_clusters(self):
+ names = self._get_param("clusters")
+ include = self._get_param("include")
+ clusters, failures = self.ecs_backend.describe_clusters(names, include)
+ return json.dumps(
+ {
+ "clusters": clusters,
+ "failures": [cluster.response_object for cluster in failures],
+ }
+ )
+
+ def delete_cluster(self):
+ cluster_str = self._get_param("cluster")
+ cluster = self.ecs_backend.delete_cluster(cluster_str)
+ return json.dumps({"cluster": cluster.response_object})
+
+ def register_task_definition(self):
+ family = self._get_param("family")
+ container_definitions = self._get_param("containerDefinitions")
+ volumes = self._get_param("volumes")
+ tags = self._get_param("tags")
+ network_mode = self._get_param("networkMode")
+ placement_constraints = self._get_param("placementConstraints")
+ requires_compatibilities = self._get_param("requiresCompatibilities")
+ cpu = self._get_param("cpu")
+ memory = self._get_param("memory")
+ task_role_arn = self._get_param("taskRoleArn")
+ execution_role_arn = self._get_param("executionRoleArn")
+
+ task_definition = self.ecs_backend.register_task_definition(
+ family,
+ container_definitions,
+ volumes=volumes,
+ network_mode=network_mode,
+ tags=tags,
+ placement_constraints=placement_constraints,
+ requires_compatibilities=requires_compatibilities,
+ cpu=cpu,
+ memory=memory,
+ task_role_arn=task_role_arn,
+ execution_role_arn=execution_role_arn,
+ )
+ return json.dumps({"taskDefinition": task_definition.response_object})
+
+ def list_task_definitions(self):
+ family_prefix = self._get_param("familyPrefix")
+ task_definition_arns = self.ecs_backend.list_task_definitions(family_prefix)
+ return json.dumps(
+ {
+ "taskDefinitionArns": task_definition_arns
+ # 'nextToken': str(uuid.uuid4())
+ }
+ )
+
+ def describe_task_definition(self):
+ task_definition_str = self._get_param("taskDefinition")
+ data = self.ecs_backend.describe_task_definition(task_definition_str)
+ resp = {"taskDefinition": data.response_object, "failures": []}
+ if "TAGS" in self._get_param("include", []):
+ resp["tags"] = self.ecs_backend.list_tags_for_resource(data.arn)
+ return json.dumps(resp)
+
+ def deregister_task_definition(self):
+ task_definition_str = self._get_param("taskDefinition")
+ task_definition = self.ecs_backend.deregister_task_definition(
+ task_definition_str
+ )
+ return json.dumps({"taskDefinition": task_definition.response_object})
+
+ def run_task(self):
+ cluster_str = self._get_param("cluster", "default")
+ overrides = self._get_param("overrides")
+ task_definition_str = self._get_param("taskDefinition")
+ count = self._get_int_param("count", 1)
+ started_by = self._get_param("startedBy")
+ tags = self._get_param("tags")
+ launch_type = self._get_param("launchType")
+ tasks = self.ecs_backend.run_task(
+ cluster_str,
+ task_definition_str,
+ count,
+ overrides,
+ started_by,
+ tags,
+ launch_type,
+ )
+ return json.dumps(
+ {"tasks": [task.response_object for task in tasks], "failures": []}
+ )
+
+ def describe_tasks(self):
+ cluster = self._get_param("cluster", "default")
+ tasks = self._get_param("tasks")
+ data = self.ecs_backend.describe_tasks(cluster, tasks)
+ return json.dumps(
+ {"tasks": [task.response_object for task in data], "failures": []}
+ )
+
+ def start_task(self):
+ cluster_str = self._get_param("cluster", "default")
+ overrides = self._get_param("overrides")
+ task_definition_str = self._get_param("taskDefinition")
+ container_instances = self._get_param("containerInstances")
+ started_by = self._get_param("startedBy")
+ tasks = self.ecs_backend.start_task(
+ cluster_str, task_definition_str, container_instances, overrides, started_by
+ )
+ return json.dumps(
+ {"tasks": [task.response_object for task in tasks], "failures": []}
+ )
+
+ def list_tasks(self):
+ cluster_str = self._get_param("cluster", "default")
+ container_instance = self._get_param("containerInstance")
+ family = self._get_param("family")
+ started_by = self._get_param("startedBy")
+ service_name = self._get_param("serviceName")
+ desiredStatus = self._get_param("desiredStatus")
+ task_arns = self.ecs_backend.list_tasks(
+ cluster_str,
+ container_instance,
+ family,
+ started_by,
+ service_name,
+ desiredStatus,
+ )
+ return json.dumps({"taskArns": task_arns})
+
+ def stop_task(self):
+ cluster_str = self._get_param("cluster", "default")
+ task = self._get_param("task")
+ reason = self._get_param("reason")
+ task = self.ecs_backend.stop_task(cluster_str, task, reason)
+ return json.dumps({"task": task.response_object})
+
+ def create_service(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_name = self._get_param("serviceName")
+ task_definition_str = self._get_param("taskDefinition")
+ desired_count = self._get_int_param("desiredCount")
+ load_balancers = self._get_param("loadBalancers")
+ scheduling_strategy = self._get_param("schedulingStrategy")
+ service_registries = self._get_param("serviceRegistries")
+ tags = self._get_param("tags")
+ deployment_controller = self._get_param("deploymentController")
+ launch_type = self._get_param("launchType")
+ service = self.ecs_backend.create_service(
+ cluster_str,
+ service_name,
+ desired_count,
+ task_definition_str,
+ load_balancers,
+ scheduling_strategy,
+ tags,
+ deployment_controller,
+ launch_type,
+ service_registries=service_registries,
+ )
+ return json.dumps({"service": service.response_object})
+
+ def list_services(self):
+ cluster_str = self._get_param("cluster", "default")
+ scheduling_strategy = self._get_param("schedulingStrategy")
+ launch_type = self._get_param("launchType")
+ service_arns = self.ecs_backend.list_services(
+ cluster_str, scheduling_strategy, launch_type=launch_type
+ )
+ return json.dumps(
+ {
+ "serviceArns": service_arns
+ # ,
+ # 'nextToken': str(uuid.uuid4())
+ }
+ )
+
+ def describe_services(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_names = self._get_param("services")
+ services, failures = self.ecs_backend.describe_services(
+ cluster_str, service_names
+ )
+ resp = {
+ "services": [service.response_object for service in services],
+ "failures": failures,
+ }
+ if "TAGS" in self._get_param("include", []):
+ for i, service in enumerate(services):
+ resp["services"][i]["tags"] = self.ecs_backend.list_tags_for_resource(
+ service.arn
+ )
+ return json.dumps(resp)
+
+ def update_service(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_name = self._get_param("service")
+ task_definition = self._get_param("taskDefinition")
+ desired_count = self._get_int_param("desiredCount")
+ service = self.ecs_backend.update_service(
+ cluster_str, service_name, task_definition, desired_count
+ )
+ return json.dumps({"service": service.response_object})
+
+ def delete_service(self):
+ service_name = self._get_param("service")
+ cluster_name = self._get_param("cluster", "default")
+ force = self._get_param("force", False)
+ service = self.ecs_backend.delete_service(cluster_name, service_name, force)
+ return json.dumps({"service": service.response_object})
+
+ def register_container_instance(self):
+ cluster_str = self._get_param("cluster", "default")
+ instance_identity_document_str = self._get_param("instanceIdentityDocument")
+ instance_identity_document = json.loads(instance_identity_document_str)
+ ec2_instance_id = instance_identity_document["instanceId"]
+ container_instance = self.ecs_backend.register_container_instance(
+ cluster_str, ec2_instance_id
+ )
+ return json.dumps({"containerInstance": container_instance.response_object})
+
+ def deregister_container_instance(self):
+ cluster_str = self._get_param("cluster", "default")
+ container_instance_str = self._get_param("containerInstance")
+ force = self._get_param("force")
+ container_instance = self.ecs_backend.deregister_container_instance(
+ cluster_str, container_instance_str, force
+ )
+ return json.dumps({"containerInstance": container_instance.response_object})
+
+ def list_container_instances(self):
+ cluster_str = self._get_param("cluster", "default")
+ container_instance_arns = self.ecs_backend.list_container_instances(cluster_str)
+ return json.dumps({"containerInstanceArns": container_instance_arns})
+
+ def describe_container_instances(self):
+ cluster_str = self._get_param("cluster", "default")
+ list_container_instance_arns = self._get_param("containerInstances")
+ container_instances, failures = self.ecs_backend.describe_container_instances(
+ cluster_str, list_container_instance_arns
+ )
+ return json.dumps(
+ {
+ "failures": [ci.response_object for ci in failures],
+ "containerInstances": [
+ ci.response_object for ci in container_instances
+ ],
+ }
+ )
+
+ def update_container_instances_state(self):
+ cluster_str = self._get_param("cluster", "default")
+ list_container_instance_arns = self._get_param("containerInstances")
+ status_str = self._get_param("status")
+ (
+ container_instances,
+ failures,
+ ) = self.ecs_backend.update_container_instances_state(
+ cluster_str, list_container_instance_arns, status_str
+ )
+ return json.dumps(
+ {
+ "failures": [ci.response_object for ci in failures],
+ "containerInstances": [
+ ci.response_object for ci in container_instances
+ ],
+ }
+ )
+
+ def put_attributes(self):
+ cluster_name = self._get_param("cluster")
+ attributes = self._get_param("attributes")
+
+ self.ecs_backend.put_attributes(cluster_name, attributes)
+
+ return json.dumps({"attributes": attributes})
+
+ def list_attributes(self):
+ cluster_name = self._get_param("cluster")
+ attr_name = self._get_param("attributeName")
+ attr_value = self._get_param("attributeValue")
+ target_type = self._get_param("targetType")
+
+ results = self.ecs_backend.list_attributes(
+ target_type, cluster_name, attr_name, attr_value
+ )
+ # Result will be [item will be {0 cluster_name, 1 arn, 2 name, 3 value}]
+
+ formatted_results = []
+ for _, arn, name, value in results:
+ tmp_result = {"name": name, "targetId": arn}
+ if value is not None:
+ tmp_result["value"] = value
+ formatted_results.append(tmp_result)
+
+ return json.dumps({"attributes": formatted_results})
+
+ def delete_attributes(self):
+ cluster_name = self._get_param("cluster", "default")
+ attributes = self._get_param("attributes")
+
+ self.ecs_backend.delete_attributes(cluster_name, attributes)
+
+ return json.dumps({"attributes": attributes})
+
+ def discover_poll_endpoint(self):
+ # Here are the arguments, this api is used by the ecs client so obviously no decent
+ # documentation. Hence I've responded with valid but useless data
+ # cluster_name = self._get_param('cluster')
+ # instance = self._get_param('containerInstance')
+ return json.dumps(
+ {"endpoint": "http://localhost", "telemetryEndpoint": "http://localhost"}
+ )
+
+ def list_task_definition_families(self):
+ family_prefix = self._get_param("familyPrefix")
+ results = self.ecs_backend.list_task_definition_families(family_prefix)
+
+ return json.dumps({"families": list(results)})
+
+ def list_tags_for_resource(self):
+ resource_arn = self._get_param("resourceArn")
+ tags = self.ecs_backend.list_tags_for_resource(resource_arn)
+ return json.dumps({"tags": tags})
+
+ def tag_resource(self):
+ resource_arn = self._get_param("resourceArn")
+ tags = self._get_param("tags")
+ results = self.ecs_backend.tag_resource(resource_arn, tags)
+ return json.dumps(results)
+
+ def untag_resource(self):
+ resource_arn = self._get_param("resourceArn")
+ tag_keys = self._get_param("tagKeys")
+ results = self.ecs_backend.untag_resource(resource_arn, tag_keys)
+ return json.dumps(results)
+
+ def create_task_set(self):
+ service_str = self._get_param("service")
+ cluster_str = self._get_param("cluster", "default")
+ task_definition = self._get_param("taskDefinition")
+ external_id = self._get_param("externalId")
+ network_configuration = self._get_param("networkConfiguration")
+ load_balancers = self._get_param("loadBalancers")
+ service_registries = self._get_param("serviceRegistries")
+ launch_type = self._get_param("launchType")
+ capacity_provider_strategy = self._get_param("capacityProviderStrategy")
+ platform_version = self._get_param("platformVersion")
+ scale = self._get_param("scale")
+ client_token = self._get_param("clientToken")
+ tags = self._get_param("tags")
+ task_set = self.ecs_backend.create_task_set(
+ service_str,
+ cluster_str,
+ task_definition,
+ external_id=external_id,
+ network_configuration=network_configuration,
+ load_balancers=load_balancers,
+ service_registries=service_registries,
+ launch_type=launch_type,
+ capacity_provider_strategy=capacity_provider_strategy,
+ platform_version=platform_version,
+ scale=scale,
+ client_token=client_token,
+ tags=tags,
+ )
+ return json.dumps({"taskSet": task_set.response_object})
+
+ def describe_task_sets(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_str = self._get_param("service")
+ task_sets = self._get_param("taskSets")
+ include = self._get_param("include", [])
+ task_set_objs = self.ecs_backend.describe_task_sets(
+ cluster_str, service_str, task_sets, include
+ )
+
+ response_objs = [t.response_object for t in task_set_objs]
+ if "TAGS" not in include:
+ for ro in response_objs:
+ del ro["tags"]
+ return json.dumps({"taskSets": response_objs})
+
+ def delete_task_set(self):
+ cluster_str = self._get_param("cluster")
+ service_str = self._get_param("service")
+ task_set = self._get_param("taskSet")
+ task_set = self.ecs_backend.delete_task_set(cluster_str, service_str, task_set)
+ return json.dumps({"taskSet": task_set.response_object})
+
+ def update_task_set(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_str = self._get_param("service")
+ task_set = self._get_param("taskSet")
+ scale = self._get_param("scale")
+
+ task_set = self.ecs_backend.update_task_set(
+ cluster_str, service_str, task_set, scale
+ )
+ return json.dumps({"taskSet": task_set.response_object})
+
+ def update_service_primary_task_set(self):
+ cluster_str = self._get_param("cluster", "default")
+ service_str = self._get_param("service")
+ primary_task_set = self._get_param("primaryTaskSet")
+
+ task_set = self.ecs_backend.update_service_primary_task_set(
+ cluster_str, service_str, primary_task_set
+ )
+ return json.dumps({"taskSet": task_set.response_object})
+
+ def put_account_setting(self):
+ name = self._get_param("name")
+ value = self._get_param("value")
+ account_setting = self.ecs_backend.put_account_setting(name, value)
+ return json.dumps({"setting": account_setting.response_object})
+
+ def list_account_settings(self):
+ name = self._get_param("name")
+ value = self._get_param("value")
+ account_settings = self.ecs_backend.list_account_settings(name, value)
+ return json.dumps({"settings": [s.response_object for s in account_settings]})
+
+ def delete_account_setting(self):
+ name = self._get_param("name")
+ self.ecs_backend.delete_account_setting(name)
+ return "{}"
diff --git a/contrib/python/moto/py3/moto/ecs/urls.py b/contrib/python/moto/py3/moto/ecs/urls.py
new file mode 100644
index 0000000000..d7b5bcb3de
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ecs/urls.py
@@ -0,0 +1,5 @@
+from .responses import EC2ContainerServiceResponse
+
+url_bases = [r"https?://ecs\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": EC2ContainerServiceResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/efs/__init__.py b/contrib/python/moto/py3/moto/efs/__init__.py
new file mode 100644
index 0000000000..e03e33d7f1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/efs/__init__.py
@@ -0,0 +1,5 @@
+from ..core.models import base_decorator
+from .models import efs_backends
+
+efs_backend = efs_backends["us-east-1"]
+mock_efs = base_decorator(efs_backends)
diff --git a/contrib/python/moto/py3/moto/efs/exceptions.py b/contrib/python/moto/py3/moto/efs/exceptions.py
new file mode 100644
index 0000000000..a1f36c789f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/efs/exceptions.py
@@ -0,0 +1,109 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class EFSError(JsonRESTError):
+ pass
+
+
+class AccessPointNotFound(EFSError):
+ code = 404
+
+ def __init__(self, access_point_id):
+ super().__init__(
+ "AccessPointNotFound", f"Access Point {access_point_id} does not exist."
+ )
+
+
+class FileSystemAlreadyExists(EFSError):
+ code = 409
+
+ def __init__(self, creation_token, *args, **kwargs):
+ super().__init__(
+ "FileSystemAlreadyExists",
+ "File system with {} already exists.".format(creation_token),
+ *args,
+ **kwargs,
+ )
+
+
+class FileSystemNotFound(EFSError):
+ code = 404
+
+ def __init__(self, file_system_id, *args, **kwargs):
+ super().__init__(
+ "FileSystemNotFound",
+ "File system {} does not exist.".format(file_system_id),
+ *args,
+ **kwargs,
+ )
+
+
+class FileSystemInUse(EFSError):
+ code = 409
+
+ def __init__(self, msg, *args, **kwargs):
+ super().__init__("FileSystemInUse", msg, *args, **kwargs)
+
+
+class MountTargetConflict(EFSError):
+ code = 409
+
+ def __init__(self, msg, *args, **kwargs):
+ super().__init__("MountTargetConflict", msg, *args, **kwargs)
+
+
+class MountTargetNotFound(EFSError):
+ code = 404
+
+ def __init__(self, mount_target_id, *args, **kwargs):
+ super().__init__(
+ "MountTargetNotFound",
+ "Mount target '{}' does not exist.".format(mount_target_id),
+ *args,
+ **kwargs,
+ )
+
+
+class BadRequest(EFSError):
+ code = 400
+
+ def __init__(self, msg, *args, **kwargs):
+ super().__init__("BadRequest", msg, *args, **kwargs)
+
+
+class PolicyNotFound(EFSError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super().__init__("PolicyNotFound", *args, **kwargs)
+
+
+class SubnetNotFound(EFSError):
+ code = 404
+
+ def __init__(self, subnet_id, *args, **kwargs):
+ super().__init__(
+ "SubnetNotFound",
+ "The subnet ID '{}' does not exist".format(subnet_id),
+ *args,
+ **kwargs,
+ )
+
+
+class SecurityGroupNotFound(EFSError):
+ code = 404
+
+ def __init__(self, security_group_id, *args, **kwargs):
+ super().__init__(
+ "SecurityGroupNotFound",
+ "The SecurityGroup ID '{}' does not exist".format(security_group_id),
+ *args,
+ **kwargs,
+ )
+
+
+class SecurityGroupLimitExceeded(EFSError):
+ code = 400
+
+ def __init__(self, msg, *args, **kwargs):
+ super().__init__("SecurityGroupLimitExceeded", msg, *args, **kwargs)
diff --git a/contrib/python/moto/py3/moto/efs/models.py b/contrib/python/moto/py3/moto/efs/models.py
new file mode 100644
index 0000000000..77b9489a0a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/efs/models.py
@@ -0,0 +1,663 @@
+"""Implement models for EFS resources.
+
+See AWS docs for details:
+https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html
+"""
+
+import json
+import time
+from copy import deepcopy
+
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import (
+ camelcase_to_underscores,
+ get_random_hex,
+ underscores_to_camelcase,
+ BackendDict,
+)
+from moto.ec2 import ec2_backends
+from moto.ec2.exceptions import InvalidSubnetIdError
+from moto.efs.exceptions import (
+ AccessPointNotFound,
+ BadRequest,
+ FileSystemAlreadyExists,
+ FileSystemInUse,
+ FileSystemNotFound,
+ MountTargetConflict,
+ MountTargetNotFound,
+ PolicyNotFound,
+ SubnetNotFound,
+ SecurityGroupNotFound,
+ SecurityGroupLimitExceeded,
+)
+from moto.utilities.tagging_service import TaggingService
+from moto.utilities.utils import md5_hash
+
+
+def _lookup_az_id(az_name):
+ """Find the Availability zone ID given the AZ name."""
+ ec2 = ec2_backends[az_name[:-1]]
+ for zone in ec2.describe_availability_zones():
+ if zone.name == az_name:
+ return zone.zone_id
+
+
+class AccessPoint(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ client_token,
+ file_system_id,
+ name,
+ posix_user,
+ root_directory,
+ context,
+ ):
+ self.access_point_id = get_random_hex(8)
+ self.access_point_arn = "arn:aws:elasticfilesystem:{region}:{user_id}:access-point/fsap-{file_system_id}".format(
+ region=region_name,
+ user_id=get_account_id(),
+ file_system_id=self.access_point_id,
+ )
+ self.client_token = client_token
+ self.file_system_id = file_system_id
+ self.name = name
+ self.posix_user = posix_user
+
+ if not root_directory:
+ root_directory = {"Path": "/"}
+
+ self.root_directory = root_directory
+ self.context = context
+
+ def info_json(self):
+ tags = self.context.list_tags_for_resource(self.access_point_id)
+ return {
+ "ClientToken": self.client_token,
+ "Name": self.name,
+ "Tags": tags,
+ "AccessPointId": self.access_point_id,
+ "AccessPointArn": self.access_point_arn,
+ "FileSystemId": self.file_system_id,
+ "PosixUser": self.posix_user,
+ "RootDirectory": self.root_directory,
+ "OwnerId": get_account_id(),
+ "LifeCycleState": "available",
+ }
+
+
+class FileSystem(CloudFormationModel):
+ """A model for an EFS File System Volume."""
+
+ def __init__(
+ self,
+ region_name,
+ creation_token,
+ file_system_id,
+ context,
+ performance_mode,
+ encrypted,
+ kms_key_id,
+ throughput_mode,
+ provisioned_throughput_in_mibps,
+ availability_zone_name,
+ backup,
+ lifecycle_policies=None,
+ file_system_policy=None,
+ ):
+ if availability_zone_name:
+ backup = True
+ if kms_key_id and not encrypted:
+ raise BadRequest('If kms_key_id given, "encrypted" must be True.')
+
+ # Save given parameters
+ self.creation_token = creation_token
+ self.performance_mode = performance_mode or "generalPurpose"
+ self.encrypted = encrypted or False
+ self.kms_key_id = kms_key_id
+ self.throughput_mode = throughput_mode or "bursting"
+ self.provisioned_throughput_in_mibps = provisioned_throughput_in_mibps
+ self.availability_zone_name = availability_zone_name
+ self.availability_zone_id = None
+ if self.availability_zone_name:
+ self.availability_zone_id = _lookup_az_id(self.availability_zone_name)
+ self._backup = backup
+ self.lifecycle_policies = lifecycle_policies or []
+ self.file_system_policy = file_system_policy
+
+ self._context = context
+
+ # Generate AWS-assigned parameters
+ self.file_system_id = file_system_id
+ self.file_system_arn = "arn:aws:elasticfilesystem:{region}:{user_id}:file-system/{file_system_id}".format(
+ region=region_name,
+ user_id=get_account_id(),
+ file_system_id=self.file_system_id,
+ )
+ self.creation_time = time.time()
+ self.owner_id = get_account_id()
+
+ # Initialize some state parameters
+ self.life_cycle_state = "available"
+ self._mount_targets = {}
+ self._size_value = 0
+
+ @property
+ def size_in_bytes(self):
+ return {
+ "Value": self._size_value,
+ "ValueInIA": 0,
+ "ValueInStandard": self._size_value,
+ "Timestamp": time.time(),
+ }
+
+ @property
+ def physical_resource_id(self):
+ return self.file_system_id
+
+ @property
+ def number_of_mount_targets(self):
+ return len(self._mount_targets)
+
+ @property
+ def backup_policy(self):
+ if self._backup:
+ return {"Status": "ENABLED"}
+ else:
+ return
+
+ def info_json(self):
+ ret = {
+ underscores_to_camelcase(k.capitalize()): v
+ for k, v in self.__dict__.items()
+ if not k.startswith("_")
+ }
+ tags = self._context.list_tags_for_resource(self.file_system_id)
+ name = ""
+ for tag in tags:
+ if tag["Key"] == "Name":
+ name = tag["Value"]
+ break
+
+ ret.update(
+ Tags=tags,
+ SizeInBytes=self.size_in_bytes,
+ NumberOfMountTargets=self.number_of_mount_targets,
+ Name=name,
+ )
+ return ret
+
+ def add_mount_target(self, subnet, mount_target):
+ # Check that the mount target doesn't violate constraints.
+ for other_mount_target in self._mount_targets.values():
+ if other_mount_target.subnet_vpc_id != subnet.vpc_id:
+ raise MountTargetConflict(
+ "requested subnet for new mount target is not in the same VPC as existing mount targets"
+ )
+
+ if subnet.availability_zone in self._mount_targets:
+ raise MountTargetConflict("mount target already exists in this AZ")
+
+ self._mount_targets[subnet.availability_zone] = mount_target
+
+ def has_mount_target(self, subnet):
+ return subnet.availability_zone in self._mount_targets
+
+ def iter_mount_targets(self):
+ for mt in self._mount_targets.values():
+ yield mt
+
+ def remove_mount_target(self, subnet):
+ del self._mount_targets[subnet.availability_zone]
+
+ @staticmethod
+ def cloudformation_name_type():
+ return
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::EFS::FileSystem"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html
+ props = deepcopy(cloudformation_json["Properties"])
+ props = {camelcase_to_underscores(k): v for k, v in props.items()}
+ if "file_system_tags" in props:
+ props["tags"] = props.pop("file_system_tags")
+ if "backup_policy" in props:
+ if "status" not in props["backup_policy"]:
+ raise ValueError("BackupPolicy must be of type BackupPolicy.")
+ status = props.pop("backup_policy")["status"]
+ if status not in ["ENABLED", "DISABLED"]:
+ raise ValueError('Invalid status: "{}".'.format(status))
+ props["backup"] = status == "ENABLED"
+ if "bypass_policy_lockout_safety_check" in props:
+ raise ValueError(
+ "BypassPolicyLockoutSafetyCheck not currently "
+ "supported by AWS Cloudformation."
+ )
+
+ return efs_backends[region_name].create_file_system(resource_name, **props)
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ raise NotImplementedError(
+ "Update of EFS File System via cloudformation is not yet implemented."
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ return efs_backends[region_name].delete_file_system(resource_name)
+
+
+class MountTarget(CloudFormationModel):
+ """A model for an EFS Mount Target."""
+
+ def __init__(self, file_system, subnet, ip_address, security_groups):
+ # Set the simple given parameters.
+ self.file_system_id = file_system.file_system_id
+ self._file_system = file_system
+ self._file_system.add_mount_target(subnet, self)
+ self.subnet_id = subnet.id
+ self._subnet = subnet
+ self.vpc_id = subnet.vpc_id
+ self.security_groups = security_groups
+
+ # Check the number of security groups.
+ if self.security_groups is not None and len(self.security_groups) > 5:
+ raise SecurityGroupLimitExceeded(
+ "The maximum number of security groups per interface has been reached."
+ )
+
+ # Get an IP address if needed, otherwise validate the one we're given.
+ if ip_address is None:
+ ip_address = subnet.get_available_subnet_ip(self)
+ else:
+ try:
+ subnet.request_ip(ip_address, self)
+ except Exception as e:
+ if "IP" in str(e) and "CIDR" in str(e):
+ raise BadRequest(
+ "Address does not fall within the subnet's address range"
+ )
+ else:
+ raise e
+ self.ip_address = ip_address
+
+ # Init non-user-assigned values.
+ self.owner_id = get_account_id()
+ self.mount_target_id = "fsmt-{}".format(get_random_hex())
+ self.life_cycle_state = "available"
+ self.network_interface_id = None
+ self.availability_zone_id = subnet.availability_zone_id
+ self.availability_zone_name = subnet.availability_zone
+
+ def clean_up(self):
+ self._file_system.remove_mount_target(self._subnet)
+ self._subnet.del_subnet_ip(self.ip_address)
+
+ def set_network_interface(self, network_interface):
+ self.network_interface_id = network_interface.id
+
+ def info_json(self):
+ ret = {
+ underscores_to_camelcase(k.capitalize()): v
+ for k, v in self.__dict__.items()
+ if not k.startswith("_")
+ }
+ return ret
+
+ @property
+ def physical_resource_id(self):
+ return self.mounted_target_id
+
+ @property
+ def subnet_vpc_id(self):
+ return self._subnet.vpc_id
+
+ @staticmethod
+ def cloudformation_name_type():
+ pass
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::EFS::MountTarget"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html
+ props = deepcopy(cloudformation_json["Properties"])
+ props = {camelcase_to_underscores(k): v for k, v in props.items()}
+ return efs_backends[region_name].create_mount_target(**props)
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ raise NotImplementedError(
+ "Updates of EFS Mount Target via cloudformation are not yet implemented."
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ return efs_backends[region_name].delete_mount_target(resource_name)
+
+
+class EFSBackend(BaseBackend):
+ """The backend manager of EFS resources.
+
+ This is the state-machine for each region, tracking the file systems, mount targets,
+ and eventually access points that are deployed. Creating, updating, and destroying
+ such resources should always go through this class.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.creation_tokens = set()
+ self.access_points = dict()
+ self.file_systems_by_id = {}
+ self.mount_targets_by_id = {}
+ self.next_markers = {}
+ self.tagging_service = TaggingService()
+
+ def _mark_description(self, corpus, max_items):
+ if max_items < len(corpus):
+ new_corpus = corpus[max_items:]
+ new_corpus_dict = [c.info_json() for c in new_corpus]
+ new_hash = md5_hash(json.dumps(new_corpus_dict).encode("utf-8"))
+ next_marker = new_hash.hexdigest()
+ self.next_markers[next_marker] = new_corpus
+ else:
+ next_marker = None
+ return next_marker
+
+ @property
+ def ec2_backend(self):
+ return ec2_backends[self.region_name]
+
+ def create_file_system(
+ self,
+ creation_token,
+ performance_mode,
+ encrypted,
+ kms_key_id,
+ throughput_mode,
+ provisioned_throughput_in_mibps,
+ availability_zone_name,
+ backup,
+ tags,
+ ):
+ """Create a new EFS File System Volume.
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_CreateFileSystem.html
+ """
+ if not creation_token:
+ raise ValueError("No creation token given.")
+ if creation_token in self.creation_tokens:
+ raise FileSystemAlreadyExists(creation_token)
+
+ # Create a new file system ID:
+ def make_id():
+ return "fs-{}".format(get_random_hex())
+
+ fsid = make_id()
+ while fsid in self.file_systems_by_id:
+ fsid = make_id()
+ self.file_systems_by_id[fsid] = FileSystem(
+ self.region_name,
+ creation_token,
+ fsid,
+ context=self,
+ performance_mode=performance_mode,
+ encrypted=encrypted,
+ kms_key_id=kms_key_id,
+ throughput_mode=throughput_mode,
+ provisioned_throughput_in_mibps=provisioned_throughput_in_mibps,
+ availability_zone_name=availability_zone_name,
+ backup=backup,
+ )
+ self.tag_resource(fsid, tags)
+ self.creation_tokens.add(creation_token)
+ return self.file_systems_by_id[fsid]
+
+ def describe_file_systems(
+ self, marker=None, max_items=10, creation_token=None, file_system_id=None
+ ):
+ """Describe all the EFS File Systems, or specific File Systems.
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_DescribeFileSystems.html
+ """
+ # Restrict the possible corpus of resules based on inputs.
+ if creation_token and file_system_id:
+ raise BadRequest(
+ "Request cannot contain both a file system ID and a creation token."
+ )
+ elif creation_token:
+ # Handle the creation token case.
+ corpus = []
+ for fs in self.file_systems_by_id.values():
+ if fs.creation_token == creation_token:
+ corpus.append(fs)
+ elif file_system_id:
+ # Handle the case that a file_system_id is given.
+ if file_system_id not in self.file_systems_by_id:
+ raise FileSystemNotFound(file_system_id)
+ corpus = [self.file_systems_by_id[file_system_id]]
+ elif marker is not None:
+ # Handle the case that a marker is given.
+ if marker not in self.next_markers:
+ raise BadRequest("Invalid Marker")
+ corpus = self.next_markers[marker]
+ else:
+ # Handle the vanilla case.
+ corpus = [fs for fs in self.file_systems_by_id.values()]
+
+ # Handle the max_items parameter.
+ file_systems = corpus[:max_items]
+ next_marker = self._mark_description(corpus, max_items)
+ return next_marker, file_systems
+
+ def create_mount_target(
+ self, file_system_id, subnet_id, ip_address=None, security_groups=None
+ ):
+ """Create a new EFS Mount Target for a given File System to a given subnet.
+
+ Note that you can only create one mount target for each availability zone
+ (which is implied by the subnet ID).
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_CreateMountTarget.html
+ """
+ # Get the relevant existing resources
+ try:
+ subnet = self.ec2_backend.get_subnet(subnet_id)
+ except InvalidSubnetIdError:
+ raise SubnetNotFound(subnet_id)
+ if file_system_id not in self.file_systems_by_id:
+ raise FileSystemNotFound(file_system_id)
+ file_system = self.file_systems_by_id[file_system_id]
+
+ # Validate the security groups.
+ if security_groups:
+ sg_lookup = {sg.id for sg in self.ec2_backend.describe_security_groups()}
+ for sg_id in security_groups:
+ if sg_id not in sg_lookup:
+ raise SecurityGroupNotFound(sg_id)
+
+ # Create the new mount target
+ mount_target = MountTarget(file_system, subnet, ip_address, security_groups)
+
+ # Establish the network interface.
+ network_interface = self.ec2_backend.create_network_interface(
+ subnet, [mount_target.ip_address], group_ids=security_groups
+ )
+ mount_target.set_network_interface(network_interface)
+
+ # Record the new mount target
+ self.mount_targets_by_id[mount_target.mount_target_id] = mount_target
+ return mount_target
+
+ def describe_mount_targets(
+ self, max_items, file_system_id, mount_target_id, access_point_id, marker
+ ):
+ """Describe the mount targets given an access point ID, mount target ID or a file system ID.
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_DescribeMountTargets.html
+ """
+ # Restrict the possible corpus of results based on inputs.
+ if not (bool(file_system_id) ^ bool(mount_target_id) ^ bool(access_point_id)):
+ raise BadRequest("Must specify exactly one mutually exclusive parameter.")
+
+ if access_point_id:
+ file_system_id = self.access_points[access_point_id].file_system_id
+
+ if file_system_id:
+ # Handle the case that a file_system_id is given.
+ if file_system_id not in self.file_systems_by_id:
+ raise FileSystemNotFound(file_system_id)
+ corpus = [
+ mt
+ for mt in self.file_systems_by_id[file_system_id].iter_mount_targets()
+ ]
+ elif mount_target_id:
+ if mount_target_id not in self.mount_targets_by_id:
+ raise MountTargetNotFound(mount_target_id)
+ # Handle mount target specification case.
+ corpus = [self.mount_targets_by_id[mount_target_id]]
+
+ # Handle the case that a marker is given. Note that the handling is quite
+ # different from that in describe_file_systems.
+ if marker is not None:
+ if marker not in self.next_markers:
+ raise BadRequest("Invalid Marker")
+ corpus_mtids = {m.mount_target_id for m in corpus}
+ marked_mtids = {m.mount_target_id for m in self.next_markers[marker]}
+ mt_ids = corpus_mtids & marked_mtids
+ corpus = [self.mount_targets_by_id[mt_id] for mt_id in mt_ids]
+
+ # Handle the max_items parameter.
+ mount_targets = corpus[:max_items]
+ next_marker = self._mark_description(corpus, max_items)
+ return next_marker, mount_targets
+
+ def delete_file_system(self, file_system_id):
+ """Delete the file system specified by the given file_system_id.
+
+ Note that mount targets must be deleted first.
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_DeleteFileSystem.html
+ """
+ if file_system_id not in self.file_systems_by_id:
+ raise FileSystemNotFound(file_system_id)
+
+ file_system = self.file_systems_by_id[file_system_id]
+ if file_system.number_of_mount_targets > 0:
+ raise FileSystemInUse(
+ "Must delete all mount targets before deleting file system."
+ )
+
+ del self.file_systems_by_id[file_system_id]
+ self.creation_tokens.remove(file_system.creation_token)
+ return
+
+ def delete_mount_target(self, mount_target_id):
+ """Delete a mount target specified by the given mount_target_id.
+
+ Note that this will also delete a network interface.
+
+ https://docs.aws.amazon.com/efs/latest/ug/API_DeleteMountTarget.html
+ """
+ if mount_target_id not in self.mount_targets_by_id:
+ raise MountTargetNotFound(mount_target_id)
+
+ mount_target = self.mount_targets_by_id[mount_target_id]
+ self.ec2_backend.delete_network_interface(mount_target.network_interface_id)
+ del self.mount_targets_by_id[mount_target_id]
+ mount_target.clean_up()
+ return
+
+ def describe_backup_policy(self, file_system_id):
+ backup_policy = self.file_systems_by_id[file_system_id].backup_policy
+ if not backup_policy:
+ raise PolicyNotFound("None")
+ return backup_policy
+
+ def put_lifecycle_configuration(self, file_system_id, policies):
+ _, fss = self.describe_file_systems(file_system_id=file_system_id)
+ file_system = fss[0]
+ file_system.lifecycle_policies = policies
+
+ def describe_lifecycle_configuration(self, file_system_id):
+ _, fss = self.describe_file_systems(file_system_id=file_system_id)
+ file_system = fss[0]
+ return file_system.lifecycle_policies
+
+ def describe_mount_target_security_groups(self, mount_target_id):
+ if mount_target_id not in self.mount_targets_by_id:
+ raise MountTargetNotFound(mount_target_id)
+
+ mount_target = self.mount_targets_by_id[mount_target_id]
+ return mount_target.security_groups
+
+ def modify_mount_target_security_groups(self, mount_target_id, security_groups):
+ if mount_target_id not in self.mount_targets_by_id:
+ raise MountTargetNotFound(mount_target_id)
+
+ mount_target = self.mount_targets_by_id[mount_target_id]
+ mount_target.security_groups = security_groups
+
+ self.ec2_backend.modify_network_interface_attribute(
+ eni_id=mount_target.network_interface_id, group_ids=security_groups
+ )
+
+ def create_access_point(
+ self, client_token, tags, file_system_id, posix_user, root_directory
+ ):
+ name = next((tag["Value"] for tag in tags if tag["Key"] == "Name"), None)
+ access_point = AccessPoint(
+ self.region_name,
+ client_token,
+ file_system_id,
+ name,
+ posix_user,
+ root_directory,
+ context=self,
+ )
+ self.tagging_service.tag_resource(access_point.access_point_id, tags)
+ self.access_points[access_point.access_point_id] = access_point
+ return access_point
+
+ def describe_access_points(self, access_point_id):
+ """
+ Pagination is not yet implemented
+ """
+ if access_point_id:
+ if access_point_id not in self.access_points:
+ raise AccessPointNotFound(access_point_id)
+ return [self.access_points[access_point_id]]
+ return self.access_points.values()
+
+ def delete_access_point(self, access_point_id):
+ self.access_points.pop(access_point_id, None)
+
+ def list_tags_for_resource(self, resource_id):
+ return self.tagging_service.list_tags_for_resource(resource_id)["Tags"]
+
+ def tag_resource(self, resource_id, tags):
+ self.tagging_service.tag_resource(resource_id, tags)
+
+ def untag_resource(self, resource_id, tag_keys):
+ self.tagging_service.untag_resource_using_names(resource_id, tag_keys)
+
+
+efs_backends = BackendDict(EFSBackend, "efs")
diff --git a/contrib/python/moto/py3/moto/efs/responses.py b/contrib/python/moto/py3/moto/efs/responses.py
new file mode 100644
index 0000000000..4fb350772c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/efs/responses.py
@@ -0,0 +1,188 @@
+import json
+
+from moto.core.responses import BaseResponse
+
+from .models import efs_backends
+
+
+class EFSResponse(BaseResponse):
+ SERVICE_NAME = "efs"
+
+ @property
+ def efs_backend(self):
+ return efs_backends[self.region]
+
+ def create_file_system(self):
+ creation_token = self._get_param("CreationToken")
+ performance_mode = self._get_param("PerformanceMode")
+ encrypted = self._get_param("Encrypted")
+ kms_key_id = self._get_param("KmsKeyId")
+ throughput_mode = self._get_param("ThroughputMode")
+ provisioned_throughput_in_mibps = self._get_param(
+ "ProvisionedThroughputInMibps"
+ )
+ availability_zone_name = self._get_param("AvailabilityZoneName")
+ backup = self._get_param("Backup")
+ tags = self._get_param("Tags") or []
+ resource = self.efs_backend.create_file_system(
+ creation_token=creation_token,
+ performance_mode=performance_mode,
+ encrypted=encrypted,
+ kms_key_id=kms_key_id,
+ throughput_mode=throughput_mode,
+ provisioned_throughput_in_mibps=provisioned_throughput_in_mibps,
+ availability_zone_name=availability_zone_name,
+ backup=backup,
+ tags=tags,
+ )
+ return (
+ json.dumps(resource.info_json()),
+ {"status": 201, "Content-Type": "application/json"},
+ )
+
+ def describe_file_systems(self):
+ max_items = self._get_int_param("MaxItems", 10)
+ marker = self._get_param("Marker")
+ creation_token = self._get_param("CreationToken")
+ file_system_id = self._get_param("FileSystemId")
+ next_marker, file_systems = self.efs_backend.describe_file_systems(
+ marker=marker,
+ max_items=max_items,
+ creation_token=creation_token,
+ file_system_id=file_system_id,
+ )
+ resp_json = {"FileSystems": [fs.info_json() for fs in file_systems]}
+ if marker:
+ resp_json["Marker"] = marker
+ if next_marker:
+ resp_json["NextMarker"] = next_marker
+ return json.dumps(resp_json), {"Content-Type": "application/json"}
+
+ def create_mount_target(self):
+ file_system_id = self._get_param("FileSystemId")
+ subnet_id = self._get_param("SubnetId")
+ ip_address = self._get_param("IpAddress")
+ security_groups = self._get_param("SecurityGroups")
+ mount_target = self.efs_backend.create_mount_target(
+ file_system_id=file_system_id,
+ subnet_id=subnet_id,
+ ip_address=ip_address,
+ security_groups=security_groups,
+ )
+ return (
+ json.dumps(mount_target.info_json()),
+ {"Content-Type": "application/json"},
+ )
+
+ def describe_mount_targets(self):
+ max_items = self._get_int_param("MaxItems", 10)
+ marker = self._get_param("Marker")
+ file_system_id = self._get_param("FileSystemId")
+ mount_target_id = self._get_param("MountTargetId")
+ access_point_id = self._get_param("AccessPointId")
+ next_marker, mount_targets = self.efs_backend.describe_mount_targets(
+ max_items=max_items,
+ file_system_id=file_system_id,
+ mount_target_id=mount_target_id,
+ access_point_id=access_point_id,
+ marker=marker,
+ )
+ resp_json = {"MountTargets": [mt.info_json() for mt in mount_targets]}
+ if marker:
+ resp_json["Marker"] = marker
+ if next_marker:
+ resp_json["NextMarker"] = next_marker
+ return json.dumps(resp_json), {"Content-Type": "application/json"}
+
+ def delete_file_system(self):
+ file_system_id = self._get_param("FileSystemId")
+ self.efs_backend.delete_file_system(file_system_id)
+ return json.dumps(dict()), {"status": 204, "Content-Type": "application/json"}
+
+ def delete_mount_target(self):
+ mount_target_id = self._get_param("MountTargetId")
+ self.efs_backend.delete_mount_target(mount_target_id)
+ return json.dumps(dict()), {"status": 204, "Content-Type": "application/json"}
+
+ def describe_backup_policy(self):
+ file_system_id = self._get_param("FileSystemId")
+ backup_policy = self.efs_backend.describe_backup_policy(file_system_id)
+ resp = {"BackupPolicy": backup_policy}
+ return json.dumps(resp), {"Content-Type": "application/json"}
+
+ def put_lifecycle_configuration(self):
+ file_system_id = self._get_param("FileSystemId")
+ policies = self._get_param("LifecyclePolicies")
+ self.efs_backend.put_lifecycle_configuration(file_system_id, policies)
+ return json.dumps({"LifecyclePolicies": policies}), {
+ "Content-Type": "application/json"
+ }
+
+ def describe_lifecycle_configuration(self):
+ file_system_id = self._get_param("FileSystemId")
+ policies = self.efs_backend.describe_lifecycle_configuration(file_system_id)
+ return json.dumps({"LifecyclePolicies": policies}), {
+ "Content-Type": "application/json"
+ }
+
+ def describe_mount_target_security_groups(self):
+ mount_target_id = self._get_param("MountTargetId")
+ security_groups = self.efs_backend.describe_mount_target_security_groups(
+ mount_target_id
+ )
+ return json.dumps({"SecurityGroups": security_groups}), {
+ "Content-Type": "application/json"
+ }
+
+ def modify_mount_target_security_groups(self):
+ mount_target_id = self._get_param("MountTargetId")
+ security_groups = self._get_param("SecurityGroups")
+ self.efs_backend.modify_mount_target_security_groups(
+ mount_target_id, security_groups
+ )
+ return "{}", {"Content-Type": "application/json"}
+
+ def create_access_point(self):
+ client_token = self._get_param("ClientToken")
+ tags = self._get_param("Tags") or []
+ file_system_id = self._get_param("FileSystemId")
+ posix_user = self._get_param("PosixUser")
+ root_directory = self._get_param("RootDirectory")
+ access_point = self.efs_backend.create_access_point(
+ client_token,
+ tags=tags,
+ file_system_id=file_system_id,
+ posix_user=posix_user,
+ root_directory=root_directory,
+ )
+ return json.dumps(access_point.info_json()), {
+ "Content-Type": "application/json"
+ }
+
+ def describe_access_points(self):
+ access_point_id = self._get_param("AccessPointId")
+ access_points = self.efs_backend.describe_access_points(access_point_id)
+ resp = [ap.info_json() for ap in access_points]
+ return json.dumps({"AccessPoints": resp}), {"Content-Type": "application/json"}
+
+ def delete_access_point(self):
+ access_point_id = self._get_param("AccessPointId")
+ self.efs_backend.delete_access_point(access_point_id)
+ return "{}", {"Content-Type": "application/json"}
+
+ def list_tags_for_resource(self):
+ resource_id = self._get_param("ResourceId")
+ tags = self.efs_backend.list_tags_for_resource(resource_id)
+ return json.dumps({"Tags": tags}), {"Content-Type": "application/json"}
+
+ def tag_resource(self):
+ resource_id = self._get_param("ResourceId")
+ tags = self._get_param("Tags")
+ self.efs_backend.tag_resource(resource_id, tags)
+ return "{}", {"Content-Type": "application/json"}
+
+ def untag_resource(self):
+ resource_id = self._get_param("ResourceId")
+ tag_keys = self.querystring.get("tagKeys", [])
+ self.efs_backend.untag_resource(resource_id, tag_keys)
+ return "{}", {"Content-Type": "application/json"}
diff --git a/contrib/python/moto/py3/moto/efs/urls.py b/contrib/python/moto/py3/moto/efs/urls.py
new file mode 100644
index 0000000000..7cc53f31b0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/efs/urls.py
@@ -0,0 +1,24 @@
+from .responses import EFSResponse
+
+url_bases = [
+ r"https?://elasticfilesystem\.(.+)\.amazonaws.com",
+ r"https?://elasticfilesystem\.amazonaws.com",
+]
+
+
+response = EFSResponse()
+
+
+url_paths = {
+ "{0}/.*?$": response.dispatch,
+ "/2015-02-01/access-points": response.dispatch,
+ "/2015-02-01/access-points/<access_point_id>": response.dispatch,
+ "/2015-02-01/file-systems": response.dispatch,
+ "/2015-02-01/file-systems/<file_system_id>": response.dispatch,
+ "/2015-02-01/file-systems/<file_system_id>/backup-policy": response.dispatch,
+ "/2015-02-01/file-systems/<file_system_id>/lifecycle-configuration": response.dispatch,
+ "/2015-02-01/mount-targets": response.dispatch,
+ "/2015-02-01/mount-targets/<mount_target_id>": response.dispatch,
+ "/2015-02-01/mount-targets/<mount_target_id>/security-groups": response.dispatch,
+ "/2015-02-01/resource-tags/<resource_id>": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/eks/__init__.py b/contrib/python/moto/py3/moto/eks/__init__.py
new file mode 100644
index 0000000000..2cbbabf239
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/__init__.py
@@ -0,0 +1,6 @@
+from ..core.models import base_decorator
+from .models import eks_backends
+
+REGION = "us-east-1"
+eks_backend = eks_backends[REGION]
+mock_eks = base_decorator(eks_backends)
diff --git a/contrib/python/moto/py3/moto/eks/exceptions.py b/contrib/python/moto/py3/moto/eks/exceptions.py
new file mode 100644
index 0000000000..f25a5fcd65
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/exceptions.py
@@ -0,0 +1,34 @@
+import json
+
+from moto.core.exceptions import AWSError
+
+
+class EKSError(AWSError):
+ def __init__(self, **kwargs):
+ super(AWSError, self).__init__(error_type=self.TYPE, message="")
+ self.description = json.dumps(kwargs)
+ self.headers = {"status": self.STATUS, "x-amzn-ErrorType": self.TYPE}
+ self.code = self.STATUS
+
+ def response(self):
+ return self.STATUS, self.headers, self.description
+
+
+class ResourceInUseException(EKSError):
+ TYPE = "ResourceInUseException"
+ STATUS = 409
+
+
+class ResourceNotFoundException(EKSError):
+ TYPE = "ResourceNotFoundException"
+ STATUS = 404
+
+
+class InvalidParameterException(EKSError):
+ TYPE = "InvalidParameterException"
+ STATUS = 400
+
+
+class InvalidRequestException(EKSError):
+ TYPE = "InvalidRequestException"
+ STATUS = 400
diff --git a/contrib/python/moto/py3/moto/eks/models.py b/contrib/python/moto/py3/moto/eks/models.py
new file mode 100644
index 0000000000..98e118a059
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/models.py
@@ -0,0 +1,710 @@
+from datetime import datetime
+from uuid import uuid4
+
+from moto.core import get_account_id, BaseBackend
+from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
+
+from ..utilities.utils import random_string
+from .exceptions import (
+ InvalidParameterException,
+ InvalidRequestException,
+ ResourceInUseException,
+ ResourceNotFoundException,
+)
+from .utils import get_partition, validate_role_arn
+
+# String Templates
+CLUSTER_ARN_TEMPLATE = (
+ "arn:{partition}:eks:{region}:" + str(get_account_id()) + ":cluster/{name}"
+)
+FARGATE_PROFILE_ARN_TEMPLATE = (
+ "arn:{partition}:eks:{region}:"
+ + str(get_account_id())
+ + ":fargateprofile/{cluster_name}/{fargate_profile_name}/{uuid}"
+)
+NODEGROUP_ARN_TEMPLATE = (
+ "arn:{partition}:eks:{region}:"
+ + str(get_account_id())
+ + ":nodegroup/{cluster_name}/{nodegroup_name}/{uuid}"
+)
+ISSUER_TEMPLATE = "https://oidc.eks.{region}.amazonaws.com/id/" + random_string(10)
+ENDPOINT_TEMPLATE = (
+ "https://"
+ + random_string()
+ + "."
+ + random_string(3)
+ + ".{region}.eks.amazonaws.com/"
+)
+
+# Defaults used for creating a Cluster
+DEFAULT_KUBERNETES_NETWORK_CONFIG = {"serviceIpv4Cidr": "172.20.0.0/16"}
+DEFAULT_KUBERNETES_VERSION = "1.19"
+DEFAULT_LOGGING = {
+ "clusterLogging": [
+ {
+ "types": [
+ "api",
+ "audit",
+ "authenticator",
+ "controllerManager",
+ "scheduler",
+ ],
+ "enabled": False,
+ }
+ ]
+}
+DEFAULT_PLATFORM_VERSION = "eks.4"
+ACTIVE_STATUS = "ACTIVE"
+
+# Defaults used for creating a Managed Nodegroup
+DEFAULT_AMI_TYPE = "AL2_x86_64"
+DEFAULT_CAPACITY_TYPE = "ON_DEMAND"
+DEFAULT_DISK_SIZE = "20"
+DEFAULT_INSTANCE_TYPES = ["t3.medium"]
+DEFAULT_NODEGROUP_HEALTH = {"issues": []}
+DEFAULT_RELEASE_VERSION = "1.19.8-20210414"
+DEFAULT_REMOTE_ACCESS = {"ec2SshKey": "eksKeypair"}
+DEFAULT_SCALING_CONFIG = {"minSize": 2, "maxSize": 2, "desiredSize": 2}
+
+# Exception messages, also imported into testing.
+# Obtained through cURL responses from the actual APIs.
+CLUSTER_IN_USE_MSG = "Cluster has nodegroups attached"
+CLUSTER_EXISTS_MSG = "Cluster already exists with name: {clusterName}"
+CLUSTER_NOT_FOUND_MSG = "No cluster found for name: {clusterName}."
+CLUSTER_NOT_READY_MSG = "Cluster '{clusterName}' is not in ACTIVE status"
+FARGATE_PROFILE_EXISTS_MSG = (
+ "A Fargate Profile already exists with this name in this cluster."
+)
+FARGATE_PROFILE_NEEDS_SELECTOR_MSG = "Fargate Profile requires at least one selector."
+FARGATE_PROFILE_NOT_FOUND_MSG = (
+ "No Fargate Profile found with name: {fargateProfileName}."
+)
+FARGATE_PROFILE_SELECTOR_NEEDS_NAMESPACE = (
+ "Fargate Profile must have at least one selector with at least one namespace value."
+)
+FARGATE_PROFILE_TOO_MANY_LABELS = (
+ "Request contains Selector with more than 5 Label pairs"
+)
+LAUNCH_TEMPLATE_WITH_DISK_SIZE_MSG = (
+ "Disk size must be specified within the launch template."
+)
+LAUNCH_TEMPLATE_WITH_REMOTE_ACCESS_MSG = (
+ "Remote access configuration cannot be specified with a launch template."
+)
+NODEGROUP_EXISTS_MSG = (
+ "NodeGroup already exists with name {nodegroupName} and cluster name {clusterName}"
+)
+NODEGROUP_NOT_FOUND_MSG = "No node group found for name: {nodegroupName}."
+
+
+class Cluster:
+ def __init__(
+ self,
+ name,
+ role_arn,
+ resources_vpc_config,
+ region_name,
+ aws_partition,
+ version=None,
+ kubernetes_network_config=None,
+ logging=None,
+ client_request_token=None,
+ tags=None,
+ encryption_config=None,
+ ):
+ if encryption_config is None:
+ encryption_config = []
+ if tags is None:
+ tags = dict()
+
+ self.nodegroups = dict()
+ self.nodegroup_count = 0
+
+ self.fargate_profiles = dict()
+ self.fargate_profile_count = 0
+
+ self.arn = CLUSTER_ARN_TEMPLATE.format(
+ partition=aws_partition, region=region_name, name=name
+ )
+ self.certificateAuthority = {"data": random_string(1400)}
+ self.creation_date = iso_8601_datetime_without_milliseconds(datetime.now())
+ self.identity = {"oidc": {"issuer": ISSUER_TEMPLATE.format(region=region_name)}}
+ self.endpoint = ENDPOINT_TEMPLATE.format(region=region_name)
+
+ self.kubernetes_network_config = (
+ kubernetes_network_config or DEFAULT_KUBERNETES_NETWORK_CONFIG
+ )
+ self.logging = logging or DEFAULT_LOGGING
+ self.platformVersion = DEFAULT_PLATFORM_VERSION
+ self.status = ACTIVE_STATUS
+ self.version = version or DEFAULT_KUBERNETES_VERSION
+
+ self.client_request_token = client_request_token
+ self.encryption_config = encryption_config
+ self.name = name
+ self.resources_vpc_config = resources_vpc_config
+ self.role_arn = role_arn
+ self.tags = tags
+
+ def __iter__(self):
+ yield "name", self.name
+ yield "arn", self.arn
+ yield "createdAt", self.creation_date
+ yield "version", self.version
+ yield "endpoint", self.endpoint
+ yield "roleArn", self.role_arn
+ yield "resourcesVpcConfig", self.resources_vpc_config
+ yield "kubernetesNetworkConfig", self.kubernetes_network_config
+ yield "logging", self.logging
+ yield "identity", self.identity
+ yield "status", self.status
+ yield "certificateAuthority", self.certificateAuthority
+ yield "clientRequestToken", self.client_request_token
+ yield "platformVersion", self.platformVersion
+ yield "tags", self.tags
+ yield "encryptionConfig", self.encryption_config
+
+ def isActive(self):
+ return self.status == "ACTIVE"
+
+
+class FargateProfile:
+ def __init__(
+ self,
+ cluster_name,
+ fargate_profile_name,
+ pod_execution_role_arn,
+ selectors,
+ region_name,
+ aws_partition,
+ client_request_token=None,
+ subnets=None,
+ tags=None,
+ ):
+ if subnets is None:
+ subnets = list()
+ if tags is None:
+ tags = dict()
+
+ self.created_at = iso_8601_datetime_without_milliseconds(datetime.now())
+ self.uuid = str(uuid4())
+ self.fargate_profile_arn = FARGATE_PROFILE_ARN_TEMPLATE.format(
+ partition=aws_partition,
+ region=region_name,
+ cluster_name=cluster_name,
+ fargate_profile_name=fargate_profile_name,
+ uuid=self.uuid,
+ )
+
+ self.status = ACTIVE_STATUS
+ self.cluster_name = cluster_name
+ self.fargate_profile_name = fargate_profile_name
+ self.pod_execution_role_arn = pod_execution_role_arn
+ self.client_request_token = client_request_token
+ self.selectors = selectors
+ self.subnets = subnets
+ self.tags = tags
+
+ def __iter__(self):
+ yield "clusterName", self.cluster_name
+ yield "createdAt", self.created_at
+ yield "fargateProfileArn", self.fargate_profile_arn
+ yield "fargateProfileName", self.fargate_profile_name
+ yield "podExecutionRoleArn", self.pod_execution_role_arn
+ yield "selectors", self.selectors
+ yield "subnets", self.subnets
+ yield "status", self.status
+ yield "tags", self.tags
+
+
+class ManagedNodegroup:
+ def __init__(
+ self,
+ cluster_name,
+ node_role,
+ nodegroup_name,
+ subnets,
+ region_name,
+ aws_partition,
+ scaling_config=None,
+ disk_size=None,
+ instance_types=None,
+ ami_type=None,
+ remote_access=None,
+ labels=None,
+ taints=None,
+ tags=None,
+ client_request_token=None,
+ launch_template=None,
+ capacity_type=None,
+ version=None,
+ release_version=None,
+ ):
+ if tags is None:
+ tags = dict()
+ if labels is None:
+ labels = dict()
+ if taints is None:
+ taints = dict()
+
+ self.uuid = str(uuid4())
+ self.arn = NODEGROUP_ARN_TEMPLATE.format(
+ partition=aws_partition,
+ region=region_name,
+ cluster_name=cluster_name,
+ nodegroup_name=nodegroup_name,
+ uuid=self.uuid,
+ )
+ self.creation_date = iso_8601_datetime_without_milliseconds(datetime.now())
+ self.modified_date = iso_8601_datetime_without_milliseconds(datetime.now())
+ self.health = DEFAULT_NODEGROUP_HEALTH
+ self.resources = {
+ "autoScalingGroups": [{"name": "eks-" + self.uuid}],
+ "remoteAccessSecurityGroup": "sg-" + random_string(17).lower(),
+ }
+
+ self.ami_type = ami_type or DEFAULT_AMI_TYPE
+ self.capacity_type = capacity_type or DEFAULT_CAPACITY_TYPE
+ self.disk_size = disk_size or DEFAULT_DISK_SIZE
+ self.instance_types = instance_types or DEFAULT_INSTANCE_TYPES
+ self.release_version = release_version or DEFAULT_RELEASE_VERSION
+ self.remote_access = remote_access or DEFAULT_REMOTE_ACCESS
+ self.scaling_config = scaling_config or DEFAULT_SCALING_CONFIG
+ self.status = ACTIVE_STATUS
+ self.version = version or DEFAULT_KUBERNETES_VERSION
+
+ self.client_request_token = client_request_token
+ self.cluster_name = cluster_name
+ self.labels = labels
+ self.launch_template = launch_template
+ self.node_role = node_role
+ self.nodegroup_name = nodegroup_name
+ self.partition = aws_partition
+ self.region = region_name
+ self.subnets = subnets
+ self.tags = tags
+ self.taints = taints
+
+ def __iter__(self):
+ yield "nodegroupName", self.nodegroup_name
+ yield "nodegroupArn", self.arn
+ yield "clusterName", self.cluster_name
+ yield "version", self.version
+ yield "releaseVersion", self.release_version
+ yield "createdAt", self.creation_date
+ yield "modifiedAt", self.modified_date
+ yield "status", self.status
+ yield "capacityType", self.capacity_type
+ yield "scalingConfig", self.scaling_config
+ yield "instanceTypes", self.instance_types
+ yield "subnets", self.subnets
+ yield "remoteAccess", self.remote_access
+ yield "amiType", self.ami_type
+ yield "nodeRole", self.node_role
+ yield "labels", self.labels
+ yield "taints", self.taints
+ yield "resources", self.resources
+ yield "diskSize", self.disk_size
+ yield "health", self.health
+ yield "launchTemplate", self.launch_template
+ yield "tags", self.tags
+
+
+class EKSBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.clusters = dict()
+ self.cluster_count = 0
+ self.partition = get_partition(region_name)
+
+ def create_cluster(
+ self,
+ name,
+ role_arn,
+ resources_vpc_config,
+ version=None,
+ kubernetes_network_config=None,
+ logging=None,
+ client_request_token=None,
+ tags=None,
+ encryption_config=None,
+ ):
+ if name in self.clusters:
+ # Cluster exists.
+ raise ResourceInUseException(
+ clusterName=name,
+ nodegroupName=None,
+ addonName=None,
+ message=CLUSTER_EXISTS_MSG.format(clusterName=name),
+ )
+ validate_role_arn(role_arn)
+
+ cluster = Cluster(
+ name=name,
+ role_arn=role_arn,
+ resources_vpc_config=resources_vpc_config,
+ version=version,
+ kubernetes_network_config=kubernetes_network_config,
+ logging=logging,
+ client_request_token=client_request_token,
+ tags=tags,
+ encryption_config=encryption_config,
+ region_name=self.region_name,
+ aws_partition=self.partition,
+ )
+ self.clusters[name] = cluster
+ self.cluster_count += 1
+ return cluster
+
+ def create_fargate_profile(
+ self,
+ fargate_profile_name,
+ cluster_name,
+ selectors,
+ pod_execution_role_arn,
+ subnets=None,
+ client_request_token=None,
+ tags=None,
+ ):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ if fargate_profile_name in cluster.fargate_profiles:
+ # Fargate Profile already exists.
+ raise ResourceInUseException(
+ clusterName=None,
+ nodegroupName=None,
+ addonName=None,
+ message=FARGATE_PROFILE_EXISTS_MSG,
+ )
+ if not cluster.isActive():
+ raise InvalidRequestException(
+ message=CLUSTER_NOT_READY_MSG.format(clusterName=cluster_name)
+ )
+
+ _validate_fargate_profile_selectors(selectors)
+
+ fargate_profile = FargateProfile(
+ cluster_name=cluster_name,
+ fargate_profile_name=fargate_profile_name,
+ pod_execution_role_arn=pod_execution_role_arn,
+ client_request_token=client_request_token,
+ selectors=selectors,
+ subnets=subnets,
+ tags=tags,
+ region_name=self.region_name,
+ aws_partition=self.partition,
+ )
+
+ cluster.fargate_profiles[fargate_profile_name] = fargate_profile
+ cluster.fargate_profile_count += 1
+ return fargate_profile
+
+ def create_nodegroup(
+ self,
+ cluster_name,
+ node_role,
+ nodegroup_name,
+ subnets,
+ scaling_config=None,
+ disk_size=None,
+ instance_types=None,
+ ami_type=None,
+ remote_access=None,
+ labels=None,
+ taints=None,
+ tags=None,
+ client_request_token=None,
+ launch_template=None,
+ capacity_type=None,
+ version=None,
+ release_version=None,
+ ):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ if nodegroup_name in cluster.nodegroups:
+ # Nodegroup already exists.
+ raise ResourceInUseException(
+ clusterName=cluster_name,
+ nodegroupName=nodegroup_name,
+ addonName=None,
+ message=NODEGROUP_EXISTS_MSG.format(
+ nodegroupName=nodegroup_name, clusterName=cluster_name
+ ),
+ )
+ if not cluster.isActive():
+ raise InvalidRequestException(
+ message=CLUSTER_NOT_READY_MSG.format(clusterName=cluster_name)
+ )
+ if launch_template:
+ validate_launch_template_combination(disk_size, remote_access)
+ validate_role_arn(node_role)
+
+ nodegroup = ManagedNodegroup(
+ cluster_name=cluster_name,
+ node_role=node_role,
+ nodegroup_name=nodegroup_name,
+ subnets=subnets,
+ scaling_config=scaling_config,
+ disk_size=disk_size,
+ instance_types=instance_types,
+ ami_type=ami_type,
+ remote_access=remote_access,
+ labels=labels,
+ taints=taints,
+ tags=tags,
+ client_request_token=client_request_token,
+ launch_template=launch_template,
+ capacity_type=capacity_type,
+ version=version,
+ release_version=release_version,
+ region_name=self.region_name,
+ aws_partition=self.partition,
+ )
+
+ cluster.nodegroups[nodegroup_name] = nodegroup
+ cluster.nodegroup_count += 1
+ return nodegroup
+
+ def describe_cluster(self, name):
+ try:
+ # Cluster exists.
+ return self.clusters[name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=name),
+ )
+
+ def describe_fargate_profile(self, cluster_name, fargate_profile_name):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ try:
+ # Fargate Profile exists.
+ return cluster.fargate_profiles[fargate_profile_name]
+ except KeyError:
+ # Fargate Profile does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=FARGATE_PROFILE_NOT_FOUND_MSG.format(
+ fargateProfileName=fargate_profile_name
+ ),
+ )
+
+ def describe_nodegroup(self, cluster_name, nodegroup_name):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=nodegroup_name,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ try:
+ # Nodegroup exists.
+ return cluster.nodegroups[nodegroup_name]
+ except KeyError:
+ # Nodegroup does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=nodegroup_name,
+ fargateProfileName=None,
+ addonName=None,
+ message=NODEGROUP_NOT_FOUND_MSG.format(nodegroupName=nodegroup_name),
+ )
+
+ def delete_cluster(self, name):
+ try:
+ # Cluster exists.
+ validate_safe_to_delete(self.clusters[name])
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=name),
+ )
+
+ result = self.clusters.pop(name)
+ self.cluster_count -= 1
+ return result
+
+ def delete_fargate_profile(self, cluster_name, fargate_profile_name):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ try:
+ # Fargate Profile exists.
+ deleted_fargate_profile = cluster.fargate_profiles.pop(fargate_profile_name)
+ except KeyError:
+ # Fargate Profile does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=None,
+ fargateProfileName=fargate_profile_name,
+ addonName=None,
+ message=FARGATE_PROFILE_NOT_FOUND_MSG.format(
+ fargateProfileName=fargate_profile_name
+ ),
+ )
+
+ cluster.fargate_profile_count -= 1
+ return deleted_fargate_profile
+
+ def delete_nodegroup(self, cluster_name, nodegroup_name):
+ try:
+ # Cluster exists.
+ cluster = self.clusters[cluster_name]
+ except KeyError:
+ # Cluster does not exist.
+ raise ResourceNotFoundException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=CLUSTER_NOT_FOUND_MSG.format(clusterName=cluster_name),
+ )
+ try:
+ # Nodegroup exists.
+ result = cluster.nodegroups.pop(nodegroup_name)
+ except KeyError:
+ # Nodegroup does not exist.
+ raise ResourceNotFoundException(
+ clusterName=cluster_name,
+ nodegroupName=nodegroup_name,
+ fargateProfileName=None,
+ addonName=None,
+ message=NODEGROUP_NOT_FOUND_MSG.format(nodegroupName=nodegroup_name),
+ )
+
+ cluster.nodegroup_count -= 1
+ return result
+
+ def list_clusters(self, max_results, next_token):
+ return paginated_list(self.clusters.keys(), max_results, next_token)
+
+ def list_fargate_profiles(self, cluster_name, max_results, next_token):
+ cluster = self.clusters[cluster_name]
+ return paginated_list(cluster.fargate_profiles.keys(), max_results, next_token)
+
+ def list_nodegroups(self, cluster_name, max_results, next_token):
+ cluster = self.clusters[cluster_name]
+ return paginated_list(cluster.nodegroups.keys(), max_results, next_token)
+
+
+def paginated_list(full_list, max_results, next_token):
+ """
+ Returns a tuple containing a slice of the full list
+ starting at next_token and ending with at most the
+ max_results number of elements, and the new
+ next_token which can be passed back in for the next
+ segment of the full list.
+ """
+ sorted_list = sorted(full_list)
+ list_len = len(sorted_list)
+
+ start = sorted_list.index(next_token) if next_token else 0
+ end = min(start + max_results, list_len)
+ new_next = None if end == list_len else sorted_list[end]
+
+ return sorted_list[start:end], new_next
+
+
+def validate_safe_to_delete(cluster):
+ # A cluster which has nodegroups attached can not be deleted.
+ if cluster.nodegroup_count:
+ nodegroup_names = ",".join(list(cluster.nodegroups.keys()))
+ raise ResourceInUseException(
+ clusterName=cluster.name,
+ nodegroupName=nodegroup_names,
+ addonName=None,
+ message=CLUSTER_IN_USE_MSG,
+ )
+
+
+def validate_launch_template_combination(disk_size, remote_access):
+ if not (disk_size or remote_access):
+ return
+
+ raise InvalidParameterException(
+ message=LAUNCH_TEMPLATE_WITH_DISK_SIZE_MSG
+ if disk_size
+ else LAUNCH_TEMPLATE_WITH_REMOTE_ACCESS_MSG
+ )
+
+
+def _validate_fargate_profile_selectors(selectors):
+ def raise_exception(message):
+ raise InvalidParameterException(
+ clusterName=None,
+ nodegroupName=None,
+ fargateProfileName=None,
+ addonName=None,
+ message=message,
+ )
+
+ # At least one Selector must exist
+ if not selectors:
+ raise_exception(message=FARGATE_PROFILE_NEEDS_SELECTOR_MSG)
+
+ for selector in selectors:
+ # Every existing Selector must have a namespace
+ if "namespace" not in selector:
+ raise_exception(message=FARGATE_PROFILE_SELECTOR_NEEDS_NAMESPACE)
+ # If a selector has labels, it can not have more than 5
+ if len(selector.get("labels", {})) > 5:
+ raise_exception(message=FARGATE_PROFILE_TOO_MANY_LABELS)
+
+
+eks_backends = BackendDict(EKSBackend, "eks")
diff --git a/contrib/python/moto/py3/moto/eks/responses.py b/contrib/python/moto/py3/moto/eks/responses.py
new file mode 100644
index 0000000000..ddf83d51a0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/responses.py
@@ -0,0 +1,192 @@
+import json
+
+from moto.core.responses import BaseResponse
+
+from .models import eks_backends
+
+DEFAULT_MAX_RESULTS = 100
+DEFAULT_NEXT_TOKEN = ""
+
+
+class EKSResponse(BaseResponse):
+ SERVICE_NAME = "eks"
+
+ @property
+ def eks_backend(self):
+ return eks_backends[self.region]
+
+ def create_cluster(self):
+ name = self._get_param("name")
+ version = self._get_param("version")
+ role_arn = self._get_param("roleArn")
+ resources_vpc_config = self._get_param("resourcesVpcConfig")
+ kubernetes_network_config = self._get_param("kubernetesNetworkConfig")
+ logging = self._get_param("logging")
+ client_request_token = self._get_param("clientRequestToken")
+ tags = self._get_param("tags")
+ encryption_config = self._get_param("encryptionConfig")
+
+ cluster = self.eks_backend.create_cluster(
+ name=name,
+ version=version,
+ role_arn=role_arn,
+ resources_vpc_config=resources_vpc_config,
+ kubernetes_network_config=kubernetes_network_config,
+ logging=logging,
+ client_request_token=client_request_token,
+ tags=tags,
+ encryption_config=encryption_config,
+ )
+
+ return 200, {}, json.dumps({"cluster": dict(cluster)})
+
+ def create_fargate_profile(self):
+ fargate_profile_name = self._get_param("fargateProfileName")
+ cluster_name = self._get_param("name")
+ pod_execution_role_arn = self._get_param("podExecutionRoleArn")
+ subnets = self._get_param("subnets")
+ selectors = self._get_param("selectors")
+ client_request_token = self._get_param("clientRequestToken")
+ tags = self._get_param("tags")
+
+ fargate_profile = self.eks_backend.create_fargate_profile(
+ fargate_profile_name=fargate_profile_name,
+ cluster_name=cluster_name,
+ pod_execution_role_arn=pod_execution_role_arn,
+ subnets=subnets,
+ selectors=selectors,
+ client_request_token=client_request_token,
+ tags=tags,
+ )
+
+ return 200, {}, json.dumps({"fargateProfile": dict(fargate_profile)})
+
+ def create_nodegroup(self):
+ cluster_name = self._get_param("name")
+ nodegroup_name = self._get_param("nodegroupName")
+ scaling_config = self._get_param("scalingConfig")
+ disk_size = self._get_int_param("diskSize")
+ subnets = self._get_param("subnets")
+ instance_types = self._get_param("instanceTypes")
+ ami_type = self._get_param("amiType")
+ remote_access = self._get_param("remoteAccess")
+ node_role = self._get_param("nodeRole")
+ labels = self._get_param("labels")
+ tags = self._get_param("tags")
+ client_request_token = self._get_param("clientRequestToken")
+ launch_template = self._get_param("launchTemplate")
+ capacity_type = self._get_param("capacityType")
+ version = self._get_param("version")
+ release_version = self._get_param("releaseVersion")
+
+ nodegroup = self.eks_backend.create_nodegroup(
+ cluster_name=cluster_name,
+ nodegroup_name=nodegroup_name,
+ scaling_config=scaling_config,
+ disk_size=disk_size,
+ subnets=subnets,
+ instance_types=instance_types,
+ ami_type=ami_type,
+ remote_access=remote_access,
+ node_role=node_role,
+ labels=labels,
+ tags=tags,
+ client_request_token=client_request_token,
+ launch_template=launch_template,
+ capacity_type=capacity_type,
+ version=version,
+ release_version=release_version,
+ )
+
+ return 200, {}, json.dumps({"nodegroup": dict(nodegroup)})
+
+ def describe_cluster(self):
+ name = self._get_param("name")
+
+ cluster = self.eks_backend.describe_cluster(name=name)
+
+ return 200, {}, json.dumps({"cluster": dict(cluster)})
+
+ def describe_fargate_profile(self):
+ cluster_name = self._get_param("name")
+ fargate_profile_name = self._get_param("fargateProfileName")
+
+ fargate_profile = self.eks_backend.describe_fargate_profile(
+ cluster_name=cluster_name, fargate_profile_name=fargate_profile_name
+ )
+ return 200, {}, json.dumps({"fargateProfile": dict(fargate_profile)})
+
+ def describe_nodegroup(self):
+ cluster_name = self._get_param("name")
+ nodegroup_name = self._get_param("nodegroupName")
+
+ nodegroup = self.eks_backend.describe_nodegroup(
+ cluster_name=cluster_name, nodegroup_name=nodegroup_name
+ )
+
+ return 200, {}, json.dumps({"nodegroup": dict(nodegroup)})
+
+ def list_clusters(self):
+ max_results = self._get_int_param("maxResults", DEFAULT_MAX_RESULTS)
+ next_token = self._get_param("nextToken", DEFAULT_NEXT_TOKEN)
+
+ clusters, next_token = self.eks_backend.list_clusters(
+ max_results=max_results, next_token=next_token
+ )
+
+ return 200, {}, json.dumps(dict(clusters=clusters, nextToken=next_token))
+
+ def list_fargate_profiles(self):
+ cluster_name = self._get_param("name")
+ max_results = self._get_int_param("maxResults", DEFAULT_MAX_RESULTS)
+ next_token = self._get_param("nextToken", DEFAULT_NEXT_TOKEN)
+
+ fargate_profile_names, next_token = self.eks_backend.list_fargate_profiles(
+ cluster_name=cluster_name, max_results=max_results, next_token=next_token
+ )
+
+ return (
+ 200,
+ {},
+ json.dumps(
+ dict(fargateProfileNames=fargate_profile_names, nextToken=next_token)
+ ),
+ )
+
+ def list_nodegroups(self):
+ cluster_name = self._get_param("name")
+ max_results = self._get_int_param("maxResults", DEFAULT_MAX_RESULTS)
+ next_token = self._get_param("nextToken", DEFAULT_NEXT_TOKEN)
+
+ nodegroups, next_token = self.eks_backend.list_nodegroups(
+ cluster_name=cluster_name, max_results=max_results, next_token=next_token
+ )
+
+ return 200, {}, json.dumps(dict(nodegroups=nodegroups, nextToken=next_token))
+
+ def delete_cluster(self):
+ name = self._get_param("name")
+
+ cluster = self.eks_backend.delete_cluster(name=name)
+
+ return 200, {}, json.dumps({"cluster": dict(cluster)})
+
+ def delete_fargate_profile(self):
+ cluster_name = self._get_param("name")
+ fargate_profile_name = self._get_param("fargateProfileName")
+
+ fargate_profile = self.eks_backend.delete_fargate_profile(
+ cluster_name=cluster_name, fargate_profile_name=fargate_profile_name
+ )
+
+ return 200, {}, json.dumps({"fargateProfile": dict(fargate_profile)})
+
+ def delete_nodegroup(self):
+ cluster_name = self._get_param("name")
+ nodegroup_name = self._get_param("nodegroupName")
+
+ nodegroup = self.eks_backend.delete_nodegroup(
+ cluster_name=cluster_name, nodegroup_name=nodegroup_name
+ )
+
+ return 200, {}, json.dumps({"nodegroup": dict(nodegroup)})
diff --git a/contrib/python/moto/py3/moto/eks/urls.py b/contrib/python/moto/py3/moto/eks/urls.py
new file mode 100644
index 0000000000..f8355c7c3d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/urls.py
@@ -0,0 +1,18 @@
+from .responses import EKSResponse
+
+url_bases = [
+ r"https?://eks\.(.+)\.amazonaws.com",
+]
+
+
+response = EKSResponse()
+
+
+url_paths = {
+ "{0}/clusters$": response.dispatch,
+ "{0}/clusters/(?P<name>[^/]+)$": response.dispatch,
+ "{0}/clusters/(?P<name>[^/]+)/node-groups$": response.dispatch,
+ "{0}/clusters/(?P<name>[^/]+)/node-groups/(?P<nodegroupName>[^/]+)$": response.dispatch,
+ "{0}/clusters/(?P<name>[^/]+)/fargate-profiles$": response.dispatch,
+ "{0}/clusters/(?P<name>[^/]+)/fargate-profiles/(?P<fargateProfileName>[^/]+)$": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/eks/utils.py b/contrib/python/moto/py3/moto/eks/utils.py
new file mode 100644
index 0000000000..686cd2aad3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/eks/utils.py
@@ -0,0 +1,48 @@
+import inspect
+import re
+
+from boto3 import Session
+
+from moto.eks.exceptions import InvalidParameterException
+
+
+def get_partition(region):
+ valid_matches = [
+ # (region prefix, aws partition)
+ ("cn-", "aws-cn"),
+ ("us-gov-", "aws-us-gov"),
+ ("us-gov-iso-", "aws-iso"),
+ ("us-gov-iso-b-", "aws-iso-b"),
+ ]
+
+ for prefix, partition in valid_matches:
+ if region.startswith(prefix):
+ return partition
+ return "aws"
+
+
+def method_name(use_parent=False):
+ """
+ Returns the name of the method which called it from the stack in PascalCase.
+ If `use_parent` is True, returns the parent of the method which called it instead.
+ For example: False/default will return the name of the method calling it.
+ In a helper method, use True to return the name of the method which called the helper.
+ """
+ return (
+ # stack()[0] is this method, stack()[1] is the method which called this one, etc
+ inspect.stack()[int(use_parent) + 1][0]
+ .f_code.co_name.replace("_", " ")
+ .title()
+ .replace(" ", "")
+ )
+
+
+def validate_role_arn(arn):
+ valid_role_arn_format = re.compile(
+ "arn:(?P<partition>.+):iam::(?P<account_id>[0-9]{12}):role/.+"
+ )
+ match = valid_role_arn_format.match(arn)
+ valid_partition = match.group("partition") in Session().get_available_partitions()
+
+ if not all({arn, match, valid_partition}):
+ raise InvalidParameterException("Invalid Role Arn: '" + arn + "'")
diff --git a/contrib/python/moto/py3/moto/elasticache/__init__.py b/contrib/python/moto/py3/moto/elasticache/__init__.py
new file mode 100644
index 0000000000..44da97871c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticache/__init__.py
@@ -0,0 +1,4 @@
+from .models import elasticache_backends
+from ..core.models import base_decorator
+
+mock_elasticache = base_decorator(elasticache_backends)
diff --git a/contrib/python/moto/py3/moto/elasticache/exceptions.py b/contrib/python/moto/py3/moto/elasticache/exceptions.py
new file mode 100644
index 0000000000..8ce9ff14f6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticache/exceptions.py
@@ -0,0 +1,63 @@
+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 ElastiCacheException(RESTError):
+
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "ecerror")
+ self.templates["ecerror"] = EXCEPTION_RESPONSE
+ super().__init__(*args, **kwargs)
+
+
+class PasswordTooShort(ElastiCacheException):
+
+ code = 404
+
+ def __init__(self, **kwargs):
+ super().__init__(
+ "InvalidParameterValue",
+ message="Passwords length must be between 16-128 characters.",
+ **kwargs,
+ )
+
+
+class PasswordRequired(ElastiCacheException):
+
+ code = 404
+
+ def __init__(self, **kwargs):
+ super().__init__(
+ "InvalidParameterValue",
+ message="No password was provided. If you want to create/update the user without password, please use the NoPasswordRequired flag.",
+ **kwargs,
+ )
+
+
+class UserAlreadyExists(ElastiCacheException):
+
+ code = 404
+
+ def __init__(self, **kwargs):
+ super().__init__(
+ "UserAlreadyExists", message="User user1 already exists.", **kwargs
+ )
+
+
+class UserNotFound(ElastiCacheException):
+
+ code = 404
+
+ def __init__(self, user_id, **kwargs):
+ super().__init__("UserNotFound", message=f"User {user_id} not found.", **kwargs)
diff --git a/contrib/python/moto/py3/moto/elasticache/models.py b/contrib/python/moto/py3/moto/elasticache/models.py
new file mode 100644
index 0000000000..e1dade082a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticache/models.py
@@ -0,0 +1,90 @@
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import UserAlreadyExists, UserNotFound
+
+
+class User(BaseModel):
+ def __init__(
+ self,
+ region,
+ user_id,
+ user_name,
+ access_string,
+ engine,
+ no_password_required,
+ passwords=None,
+ ):
+ self.id = user_id
+ self.name = user_name
+ self.engine = engine
+ self.passwords = passwords or []
+ self.access_string = access_string
+ self.no_password_required = no_password_required
+ self.status = "active"
+ self.minimum_engine_version = "6.0"
+ self.usergroupids = []
+ self.region = region
+
+ @property
+ def arn(self):
+ return f"arn:aws:elasticache:{self.region}:{get_account_id()}:user:{self.id}"
+
+
+class ElastiCacheBackend(BaseBackend):
+ """Implementation of ElastiCache APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.users = dict()
+ self.users["default"] = User(
+ region=self.region_name,
+ user_id="default",
+ user_name="default",
+ engine="redis",
+ access_string="on ~* +@all",
+ no_password_required=True,
+ )
+
+ def create_user(
+ self, user_id, user_name, engine, passwords, access_string, no_password_required
+ ):
+ if user_id in self.users:
+ raise UserAlreadyExists
+ user = User(
+ region=self.region_name,
+ user_id=user_id,
+ user_name=user_name,
+ engine=engine,
+ passwords=passwords,
+ access_string=access_string,
+ no_password_required=no_password_required,
+ )
+ self.users[user_id] = user
+ return user
+
+ def delete_user(self, user_id):
+ if user_id in self.users:
+ user = self.users[user_id]
+ if user.status == "active":
+ user.status = "deleting"
+ return user
+ raise UserNotFound(user_id)
+
+ def describe_users(self, user_id):
+ """
+ Only the `user_id` parameter is currently supported.
+ Pagination is not yet implemented.
+ """
+ if user_id:
+ if user_id in self.users:
+ user = self.users[user_id]
+ if user.status == "deleting":
+ self.users.pop(user_id)
+ return [user]
+ else:
+ raise UserNotFound(user_id)
+ return self.users.values()
+
+
+elasticache_backends = BackendDict(ElastiCacheBackend, "elasticache")
diff --git a/contrib/python/moto/py3/moto/elasticache/responses.py b/contrib/python/moto/py3/moto/elasticache/responses.py
new file mode 100644
index 0000000000..b63e029e81
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticache/responses.py
@@ -0,0 +1,119 @@
+from moto.core.responses import BaseResponse
+from .exceptions import PasswordTooShort, PasswordRequired
+from .models import elasticache_backends
+
+
+class ElastiCacheResponse(BaseResponse):
+ """Handler for ElastiCache requests and responses."""
+
+ @property
+ def elasticache_backend(self):
+ """Return backend instance specific for this region."""
+ return elasticache_backends[self.region]
+
+ def create_user(self):
+ params = self._get_params()
+ user_id = params.get("UserId")
+ user_name = params.get("UserName")
+ engine = params.get("Engine")
+ passwords = params.get("Passwords", [])
+ no_password_required = self._get_bool_param("NoPasswordRequired", False)
+ password_required = not no_password_required
+ if password_required and not passwords:
+ raise PasswordRequired
+ if any([len(p) < 16 for p in passwords]):
+ raise PasswordTooShort
+ access_string = params.get("AccessString")
+ user = self.elasticache_backend.create_user(
+ user_id=user_id,
+ user_name=user_name,
+ engine=engine,
+ passwords=passwords,
+ access_string=access_string,
+ no_password_required=no_password_required,
+ )
+ template = self.response_template(CREATE_USER_TEMPLATE)
+ return template.render(user=user)
+
+ def delete_user(self):
+ params = self._get_params()
+ user_id = params.get("UserId")
+ user = self.elasticache_backend.delete_user(user_id=user_id)
+ template = self.response_template(DELETE_USER_TEMPLATE)
+ return template.render(user=user)
+
+ def describe_users(self):
+ params = self._get_params()
+ user_id = params.get("UserId")
+ users = self.elasticache_backend.describe_users(user_id=user_id)
+ template = self.response_template(DESCRIBE_USERS_TEMPLATE)
+ return template.render(users=users)
+
+
+USER_TEMPLATE = """<UserId>{{ user.id }}</UserId>
+ <UserName>{{ user.name }}</UserName>
+ <Status>{{ user.status }}</Status>
+ <Engine>{{ user.engine }}</Engine>
+ <MinimumEngineVersion>{{ user.minimum_engine_version }}</MinimumEngineVersion>
+ <AccessString>{{ user.access_string }}</AccessString>
+ <UserGroupIds>
+{% for usergroupid in user.usergroupids %}
+ <member>{{ usergroupid }}</member>
+{% endfor %}
+ </UserGroupIds>
+ <Authentication>
+ {% if user.no_password_required %}
+ <Type>no-password</Type>
+ {% else %}
+ <Type>password</Type>
+ <PasswordCount>{{ user.passwords|length }}</PasswordCount>
+ {% endif %}
+ </Authentication>
+ <ARN>{{ user.arn }}</ARN>"""
+
+
+CREATE_USER_TEMPLATE = (
+ """<CreateUserResponse xmlns="http://elasticache.amazonaws.com/doc/2015-02-02/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <CreateUserResult>
+ """
+ + USER_TEMPLATE
+ + """
+ </CreateUserResult>
+</CreateUserResponse>"""
+)
+
+DELETE_USER_TEMPLATE = (
+ """<DeleteUserResponse xmlns="http://elasticache.amazonaws.com/doc/2015-02-02/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DeleteUserResult>
+ """
+ + USER_TEMPLATE
+ + """
+ </DeleteUserResult>
+</DeleteUserResponse>"""
+)
+
+DESCRIBE_USERS_TEMPLATE = (
+ """<DescribeUsersResponse xmlns="http://elasticache.amazonaws.com/doc/2015-02-02/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DescribeUsersResult>
+ <Users>
+{% for user in users %}
+ <member>
+ """
+ + USER_TEMPLATE
+ + """
+ </member>
+{% endfor %}
+ </Users>
+ <Marker></Marker>
+ </DescribeUsersResult>
+</DescribeUsersResponse>"""
+)
diff --git a/contrib/python/moto/py3/moto/elasticache/urls.py b/contrib/python/moto/py3/moto/elasticache/urls.py
new file mode 100644
index 0000000000..755d63237d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticache/urls.py
@@ -0,0 +1,11 @@
+"""elasticache base URL and path."""
+from .responses import ElastiCacheResponse
+
+url_bases = [
+ r"https?://elasticache\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": ElastiCacheResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/__init__.py b/contrib/python/moto/py3/moto/elasticbeanstalk/__init__.py
new file mode 100644
index 0000000000..851fa445b7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/__init__.py
@@ -0,0 +1,4 @@
+from .models import eb_backends
+from moto.core.models import base_decorator
+
+mock_elasticbeanstalk = base_decorator(eb_backends)
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/exceptions.py b/contrib/python/moto/py3/moto/elasticbeanstalk/exceptions.py
new file mode 100644
index 0000000000..d880fa0012
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import RESTError
+
+
+class InvalidParameterValueError(RESTError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class ResourceNotFoundException(RESTError):
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundException", message)
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/models.py b/contrib/python/moto/py3/moto/elasticbeanstalk/models.py
new file mode 100644
index 0000000000..82388ad4dc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/models.py
@@ -0,0 +1,137 @@
+import weakref
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import BackendDict
+from .exceptions import InvalidParameterValueError, ResourceNotFoundException
+from .utils import make_arn
+
+
+class FakeEnvironment(BaseModel):
+ def __init__(self, application, environment_name, solution_stack_name, tags):
+ self.application = weakref.proxy(
+ application
+ ) # weakref to break circular dependencies
+ self.environment_name = environment_name
+ self.solution_stack_name = solution_stack_name
+ self.tags = tags
+
+ @property
+ def application_name(self):
+ return self.application.application_name
+
+ @property
+ def environment_arn(self):
+ resource_path = "%s/%s" % (self.application_name, self.environment_name)
+ return make_arn(self.region, get_account_id(), "environment", resource_path)
+
+ @property
+ def platform_arn(self):
+ return "TODO" # TODO
+
+ @property
+ def region(self):
+ return self.application.region
+
+
+class FakeApplication(BaseModel):
+ def __init__(self, backend, application_name):
+ self.backend = weakref.proxy(backend) # weakref to break cycles
+ self.application_name = application_name
+ self.environments = dict()
+
+ def create_environment(self, environment_name, solution_stack_name, tags):
+ if environment_name in self.environments:
+ raise InvalidParameterValueError
+
+ env = FakeEnvironment(
+ application=self,
+ environment_name=environment_name,
+ solution_stack_name=solution_stack_name,
+ tags=tags,
+ )
+ self.environments[environment_name] = env
+
+ return env
+
+ @property
+ def region(self):
+ return self.backend.region_name
+
+ @property
+ def arn(self):
+ return make_arn(
+ self.region, get_account_id(), "application", self.application_name
+ )
+
+
+class EBBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.applications = dict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "elasticbeanstalk"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "elasticbeanstalk-health"
+ )
+
+ def create_application(self, application_name):
+ if application_name in self.applications:
+ raise InvalidParameterValueError(
+ "Application {} already exists.".format(application_name)
+ )
+ new_app = FakeApplication(backend=self, application_name=application_name)
+ self.applications[application_name] = new_app
+ return new_app
+
+ def create_environment(self, app, environment_name, stack_name, tags):
+ return app.create_environment(
+ environment_name=environment_name, solution_stack_name=stack_name, tags=tags
+ )
+
+ def describe_environments(self):
+ envs = []
+ for app in self.applications.values():
+ for env in app.environments.values():
+ envs.append(env)
+ return envs
+
+ def list_available_solution_stacks(self):
+ # Implemented in response.py
+ pass
+
+ def update_tags_for_resource(self, resource_arn, tags_to_add, tags_to_remove):
+ try:
+ res = self._find_environment_by_arn(resource_arn)
+ except KeyError:
+ raise ResourceNotFoundException(
+ "Resource not found for ARN '{}'.".format(resource_arn)
+ )
+
+ for key, value in tags_to_add.items():
+ res.tags[key] = value
+
+ for key in tags_to_remove:
+ del res.tags[key]
+
+ def list_tags_for_resource(self, resource_arn):
+ try:
+ res = self._find_environment_by_arn(resource_arn)
+ except KeyError:
+ raise ResourceNotFoundException(
+ "Resource not found for ARN '{}'.".format(resource_arn)
+ )
+ return res.tags
+
+ def _find_environment_by_arn(self, arn):
+ for app in self.applications.keys():
+ for env in self.applications[app].environments.values():
+ if env.environment_arn == arn:
+ return env
+ raise KeyError()
+
+
+eb_backends = BackendDict(EBBackend, "elasticbeanstalk")
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/responses.py b/contrib/python/moto/py3/moto/elasticbeanstalk/responses.py
new file mode 100644
index 0000000000..adc20497b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/responses.py
@@ -0,0 +1,1386 @@
+from moto.core.responses import BaseResponse
+from moto.core.utils import tags_from_query_string
+from .models import eb_backends
+from .exceptions import InvalidParameterValueError
+
+
+class EBResponse(BaseResponse):
+ @property
+ def backend(self):
+ """
+ :rtype: EBBackend
+ """
+ return eb_backends[self.region]
+
+ def create_application(self):
+ app = self.backend.create_application(
+ application_name=self._get_param("ApplicationName")
+ )
+
+ template = self.response_template(EB_CREATE_APPLICATION)
+ return template.render(region_name=self.backend.region_name, application=app)
+
+ def describe_applications(self):
+ template = self.response_template(EB_DESCRIBE_APPLICATIONS)
+ return template.render(applications=self.backend.applications.values())
+
+ def create_environment(self):
+ application_name = self._get_param("ApplicationName")
+ try:
+ app = self.backend.applications[application_name]
+ except KeyError:
+ raise InvalidParameterValueError(
+ f"No Application named '{application_name}' found."
+ )
+
+ tags = tags_from_query_string(self.querystring, prefix="Tags.member")
+ env = self.backend.create_environment(
+ app,
+ environment_name=self._get_param("EnvironmentName"),
+ stack_name=self._get_param("SolutionStackName"),
+ tags=tags,
+ )
+
+ template = self.response_template(EB_CREATE_ENVIRONMENT)
+ return template.render(environment=env, region=self.backend.region_name)
+
+ def describe_environments(self):
+ envs = self.backend.describe_environments()
+
+ template = self.response_template(EB_DESCRIBE_ENVIRONMENTS)
+ return template.render(environments=envs)
+
+ def list_available_solution_stacks(self):
+ return EB_LIST_AVAILABLE_SOLUTION_STACKS
+
+ def update_tags_for_resource(self):
+ resource_arn = self._get_param("ResourceArn")
+ tags_to_add = tags_from_query_string(
+ self.querystring, prefix="TagsToAdd.member"
+ )
+ tags_to_remove = self._get_multi_param("TagsToRemove.member")
+ self.backend.update_tags_for_resource(resource_arn, tags_to_add, tags_to_remove)
+
+ return EB_UPDATE_TAGS_FOR_RESOURCE
+
+ def list_tags_for_resource(self):
+ resource_arn = self._get_param("ResourceArn")
+ tags = self.backend.list_tags_for_resource(resource_arn)
+
+ template = self.response_template(EB_LIST_TAGS_FOR_RESOURCE)
+ return template.render(tags=tags, arn=resource_arn)
+
+
+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>
+"""
+
+
+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>
+"""
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/urls.py b/contrib/python/moto/py3/moto/elasticbeanstalk/urls.py
new file mode 100644
index 0000000000..91f0cc2273
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/urls.py
@@ -0,0 +1,9 @@
+from .responses import EBResponse
+
+url_bases = [
+ r"https?://elasticbeanstalk\.(?P<region>[a-zA-Z0-9\-_]+)\.amazonaws.com",
+]
+
+url_paths = {
+ "{0}/$": EBResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/elasticbeanstalk/utils.py b/contrib/python/moto/py3/moto/elasticbeanstalk/utils.py
new file mode 100644
index 0000000000..e3e22a11d0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elasticbeanstalk/utils.py
@@ -0,0 +1,11 @@
+def make_arn(region, account_id, resource_type, resource_path):
+ arn_template = (
+ "arn:aws:elasticbeanstalk:{region}:{account_id}:{resource_type}/{resource_path}"
+ )
+ arn = arn_template.format(
+ region=region,
+ account_id=account_id,
+ resource_type=resource_type,
+ resource_path=resource_path,
+ )
+ return arn
diff --git a/contrib/python/moto/py3/moto/elastictranscoder/__init__.py b/contrib/python/moto/py3/moto/elastictranscoder/__init__.py
new file mode 100644
index 0000000000..9ac6afd750
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elastictranscoder/__init__.py
@@ -0,0 +1,4 @@
+from .models import elastictranscoder_backends
+from ..core.models import base_decorator
+
+mock_elastictranscoder = base_decorator(elastictranscoder_backends)
diff --git a/contrib/python/moto/py3/moto/elastictranscoder/models.py b/contrib/python/moto/py3/moto/elastictranscoder/models.py
new file mode 100644
index 0000000000..18ffb5c677
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elastictranscoder/models.py
@@ -0,0 +1,115 @@
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+import random
+import string
+
+
+class Pipeline(BaseModel):
+ def __init__(
+ self,
+ region,
+ name,
+ input_bucket,
+ output_bucket,
+ role,
+ content_config,
+ thumbnail_config,
+ ):
+ a = "".join(random.choice(string.digits) for _ in range(13))
+ b = "".join(random.choice(string.ascii_lowercase) for _ in range(6))
+ self.id = "{}-{}".format(a, b)
+ self.name = name
+ self.arn = "arn:aws:elastictranscoder:{}:{}:pipeline/{}".format(
+ region, get_account_id(), self.id
+ )
+ self.status = "Active"
+ self.input_bucket = input_bucket
+ self.output_bucket = output_bucket or content_config["Bucket"]
+ self.role = role
+ self.content_config = content_config or {"Bucket": self.output_bucket}
+ if "Permissions" not in self.content_config:
+ self.content_config["Permissions"] = []
+ self.thumbnail_config = thumbnail_config or {"Bucket": self.output_bucket}
+ if "Permissions" not in self.thumbnail_config:
+ self.thumbnail_config["Permissions"] = []
+
+ def update(self, name, input_bucket, role):
+ if name:
+ self.name = name
+ if input_bucket:
+ self.input_bucket = input_bucket
+ if role:
+ self.role = role
+
+ def to_dict(self):
+ return {
+ "Id": self.id,
+ "Name": self.name,
+ "Arn": self.arn,
+ "Status": self.status,
+ "InputBucket": self.input_bucket,
+ "OutputBucket": self.output_bucket,
+ "Role": self.role,
+ "Notifications": {
+ "Progressing": "",
+ "Completed": "",
+ "Warning": "",
+ "Error": "",
+ },
+ "ContentConfig": self.content_config,
+ "ThumbnailConfig": self.thumbnail_config,
+ }
+
+
+class ElasticTranscoderBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.pipelines = {}
+
+ def create_pipeline(
+ self,
+ name,
+ input_bucket,
+ output_bucket,
+ role,
+ content_config,
+ thumbnail_config,
+ ):
+ """
+ The following parameters are not yet implemented:
+ AWSKMSKeyArn, Notifications
+ """
+ pipeline = Pipeline(
+ self.region_name,
+ name,
+ input_bucket,
+ output_bucket,
+ role,
+ content_config,
+ thumbnail_config,
+ )
+ self.pipelines[pipeline.id] = pipeline
+ warnings = []
+ return pipeline, warnings
+
+ def list_pipelines(self):
+ return [p.to_dict() for _, p in self.pipelines.items()]
+
+ def read_pipeline(self, pipeline_id):
+ return self.pipelines[pipeline_id]
+
+ def update_pipeline(self, pipeline_id, name, input_bucket, role):
+ """
+ The following parameters are not yet implemented:
+ AWSKMSKeyArn, Notifications, ContentConfig, ThumbnailConfig
+ """
+ pipeline = self.read_pipeline(pipeline_id)
+ pipeline.update(name, input_bucket, role)
+ warnings = []
+ return pipeline, warnings
+
+ def delete_pipeline(self, pipeline_id):
+ self.pipelines.pop(pipeline_id)
+
+
+elastictranscoder_backends = BackendDict(ElasticTranscoderBackend, "elastictranscoder")
diff --git a/contrib/python/moto/py3/moto/elastictranscoder/responses.py b/contrib/python/moto/py3/moto/elastictranscoder/responses.py
new file mode 100644
index 0000000000..0a9dea0d27
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elastictranscoder/responses.py
@@ -0,0 +1,131 @@
+from moto.core import get_account_id
+from moto.core.responses import BaseResponse
+from .models import elastictranscoder_backends
+import json
+import re
+
+
+class ElasticTranscoderResponse(BaseResponse):
+ SERVICE_NAME = "elastictranscoder"
+
+ @property
+ def elastictranscoder_backend(self):
+ return elastictranscoder_backends[self.region]
+
+ def pipelines(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_pipeline()
+ elif request.method == "GET":
+ return self.list_pipelines()
+ else:
+ return self.update_pipeline()
+
+ def individual_pipeline(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.read_pipeline()
+ elif request.method == "DELETE":
+ return self.delete_pipeline()
+ else:
+ return self.update_pipeline()
+
+ def create_pipeline(self):
+ name = self._get_param("Name")
+ input_bucket = self._get_param("InputBucket")
+ output_bucket = self._get_param("OutputBucket")
+ role = self._get_param("Role")
+ content_config = self._get_param("ContentConfig")
+ thumbnail_config = self._get_param("ThumbnailConfig")
+ if not role:
+ return self.err("Role cannot be blank")
+ if not re.match("^arn:aws:iam::[0-9]+:role/.+", role):
+ return self.err("Role ARN is invalid: {}".format(role))
+ if not output_bucket and not content_config:
+ return self.err(
+ "[OutputBucket and ContentConfig:Bucket are not allowed to both be null.]"
+ )
+ if output_bucket and content_config:
+ return self.err("[OutputBucket and ContentConfig are mutually exclusive.]")
+ if content_config and not thumbnail_config:
+ return self.err(
+ "[ThumbnailConfig:Bucket is not allowed to be null if ContentConfig is specified.]"
+ )
+ pipeline, warnings = self.elastictranscoder_backend.create_pipeline(
+ name=name,
+ input_bucket=input_bucket,
+ output_bucket=output_bucket,
+ role=role,
+ content_config=content_config,
+ thumbnail_config=thumbnail_config,
+ )
+ return (
+ 201,
+ {"status": 201},
+ json.dumps({"Pipeline": pipeline.to_dict(), "Warnings": warnings}),
+ )
+
+ def list_pipelines(self):
+ return (
+ 200,
+ {},
+ json.dumps({"Pipelines": self.elastictranscoder_backend.list_pipelines()}),
+ )
+
+ def validate_pipeline_id(self, pipeline_id):
+ r = "^\\d{13}-\\w{6}$"
+ if not re.match(r, pipeline_id):
+ msg = "1 validation error detected: Value '{}' at 'id' failed to satisfy constraint: Member must satisfy regular expression pattern: {}".format(
+ pipeline_id, r
+ )
+ return self.err(msg)
+ try:
+ self.elastictranscoder_backend.read_pipeline(pipeline_id)
+ return None
+ except KeyError:
+ msg = "The specified pipeline was not found: account={}, pipelineId={}.".format(
+ get_account_id(), pipeline_id
+ )
+ return (
+ 404,
+ {"status": 404, "x-amzn-ErrorType": "ResourceNotFoundException"},
+ json.dumps({"message": msg}),
+ )
+
+ def read_pipeline(self):
+ _id = self.path.rsplit("/", 1)[-1]
+ err = self.validate_pipeline_id(_id)
+ if err:
+ return err
+ pipeline = self.elastictranscoder_backend.read_pipeline(_id)
+ return 200, {}, json.dumps({"Pipeline": pipeline.to_dict()})
+
+ def update_pipeline(self):
+ _id = self.path.rsplit("/", 1)[-1]
+ name = self._get_param("Name")
+ input_bucket = self._get_param("InputBucket")
+ role = self._get_param("Role")
+ err = self.validate_pipeline_id(_id)
+ if err:
+ return err
+ pipeline, warnings = self.elastictranscoder_backend.update_pipeline(
+ pipeline_id=_id, name=name, input_bucket=input_bucket, role=role
+ )
+
+ return (
+ 200,
+ {},
+ json.dumps({"Pipeline": pipeline.to_dict(), "Warnings": warnings}),
+ )
+
+ def delete_pipeline(self):
+ _id = self.path.rsplit("/", 1)[-1]
+ self.elastictranscoder_backend.delete_pipeline(pipeline_id=_id)
+ return 200, {}, "{}"
+
+ def err(self, msg):
+ return (
+ 400,
+ {"status": 400, "x-amzn-ErrorType": "ValidationException"},
+ json.dumps({"message": msg}),
+ )
diff --git a/contrib/python/moto/py3/moto/elastictranscoder/urls.py b/contrib/python/moto/py3/moto/elastictranscoder/urls.py
new file mode 100644
index 0000000000..e751dba4e8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elastictranscoder/urls.py
@@ -0,0 +1,14 @@
+from .responses import ElasticTranscoderResponse
+
+url_bases = [
+ r"https?://elastictranscoder\.(.+)\.amazonaws.com",
+]
+
+
+response = ElasticTranscoderResponse()
+
+
+url_paths = {
+ r"{0}/(?P<api_version>[^/]+)/pipelines/?$": response.pipelines,
+ r"{0}/(?P<api_version>[^/]+)/pipelines/(?P<pipeline_id>[^/]+)/?$": response.individual_pipeline,
+}
diff --git a/contrib/python/moto/py3/moto/elb/__init__.py b/contrib/python/moto/py3/moto/elb/__init__.py
new file mode 100644
index 0000000000..5fc8a33e81
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/__init__.py
@@ -0,0 +1,5 @@
+from .models import elb_backends
+from ..core.models import base_decorator
+
+elb_backend = elb_backends["us-east-1"]
+mock_elb = base_decorator(elb_backends)
diff --git a/contrib/python/moto/py3/moto/elb/exceptions.py b/contrib/python/moto/py3/moto/elb/exceptions.py
new file mode 100644
index 0000000000..56ddb79585
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/exceptions.py
@@ -0,0 +1,86 @@
+from moto.core.exceptions import RESTError
+
+
+class ELBClientError(RESTError):
+ code = 400
+
+ def __init__(self, error_type, message):
+ super().__init__(error_type, message, template="wrapped_single_error")
+
+
+class DuplicateTagKeysError(ELBClientError):
+ def __init__(self, cidr):
+ super().__init__(
+ "DuplicateTagKeys", "Tag key was specified more than once: {0}".format(cidr)
+ )
+
+
+class CertificateNotFoundException(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "CertificateNotFoundException", "Supplied certificate was not found"
+ )
+
+
+class LoadBalancerNotFoundError(ELBClientError):
+ def __init__(self, cidr):
+ super().__init__(
+ "LoadBalancerNotFound",
+ "The specified load balancer does not exist: {0}".format(cidr),
+ )
+
+
+class PolicyNotFoundError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "PolicyNotFound", "There is no policy with name . for load balancer ."
+ )
+
+
+class TooManyTagsError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "LoadBalancerNotFound",
+ "The quota for the number of tags that can be assigned to a load balancer has been reached",
+ )
+
+
+class BadHealthCheckDefinition(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "ValidationError",
+ "HealthCheck Target must begin with one of HTTP, TCP, HTTPS, SSL",
+ )
+
+
+class DuplicateListenerError(ELBClientError):
+ def __init__(self, name, port):
+ super().__init__(
+ "DuplicateListener",
+ "A listener already exists for {0} with LoadBalancerPort {1}, but with a different InstancePort, Protocol, or SSLCertificateId".format(
+ name, port
+ ),
+ )
+
+
+class DuplicateLoadBalancerName(ELBClientError):
+ def __init__(self, name):
+ super().__init__(
+ "DuplicateLoadBalancerName",
+ "The specified load balancer name already exists for this account: {0}".format(
+ name
+ ),
+ )
+
+
+class EmptyListenersError(ELBClientError):
+ def __init__(self):
+ super().__init__("ValidationError", "Listeners cannot be empty")
+
+
+class InvalidSecurityGroupError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "ValidationError",
+ "One or more of the specified security groups do not exist.",
+ )
diff --git a/contrib/python/moto/py3/moto/elb/models.py b/contrib/python/moto/py3/moto/elb/models.py
new file mode 100644
index 0000000000..4290d7567e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/models.py
@@ -0,0 +1,613 @@
+import datetime
+
+import pytz
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import BackendDict
+from moto.ec2.models import ec2_backends
+from moto.ec2.exceptions import InvalidInstanceIdError
+from uuid import uuid4
+from .exceptions import (
+ BadHealthCheckDefinition,
+ DuplicateLoadBalancerName,
+ DuplicateListenerError,
+ EmptyListenersError,
+ InvalidSecurityGroupError,
+ LoadBalancerNotFoundError,
+ PolicyNotFoundError,
+ TooManyTagsError,
+ CertificateNotFoundException,
+)
+from .policies import AppCookieStickinessPolicy, LbCookieStickinessPolicy, OtherPolicy
+
+
+class FakeHealthCheck(BaseModel):
+ def __init__(
+ self, timeout, healthy_threshold, unhealthy_threshold, interval, target
+ ):
+ self.timeout = timeout
+ self.healthy_threshold = healthy_threshold
+ self.unhealthy_threshold = unhealthy_threshold
+ self.interval = interval
+ self.target = target
+ if not target.startswith(("HTTP", "TCP", "HTTPS", "SSL")):
+ raise BadHealthCheckDefinition
+
+
+class FakeListener(BaseModel):
+ def __init__(self, load_balancer_port, instance_port, protocol, ssl_certificate_id):
+ self.load_balancer_port = load_balancer_port
+ self.instance_port = instance_port
+ self.protocol = protocol.upper()
+ self.ssl_certificate_id = ssl_certificate_id
+ self.policy_names = []
+
+ def __repr__(self):
+ return "FakeListener(lbp: %s, inp: %s, pro: %s, cid: %s, policies: %s)" % (
+ self.load_balancer_port,
+ self.instance_port,
+ self.protocol,
+ self.ssl_certificate_id,
+ self.policy_names,
+ )
+
+
+class FakeBackend(BaseModel):
+ def __init__(self, instance_port):
+ self.instance_port = instance_port
+ self.policy_names = []
+
+ def __repr__(self):
+ return "FakeBackend(inp: %s, policies: %s)" % (
+ self.instance_port,
+ self.policy_names,
+ )
+
+
+class FakeLoadBalancer(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ zones,
+ ports,
+ scheme=None,
+ vpc_id=None,
+ subnets=None,
+ security_groups=None,
+ elb_backend=None,
+ ):
+ self.name = name
+ self.health_check = None
+ self.instance_sparse_ids = []
+ self.instance_autoscaling_ids = []
+ self.zones = zones
+ self.listeners = []
+ self.backends = []
+ self.created_time = datetime.datetime.now(pytz.utc)
+ self.scheme = scheme or "internet-facing"
+ self.attributes = FakeLoadBalancer.get_default_attributes()
+ self.policies = []
+ self.security_groups = security_groups or []
+ self.subnets = subnets or []
+ self.vpc_id = vpc_id
+ self.tags = {}
+ self.dns_name = "%s.us-east-1.elb.amazonaws.com" % (name)
+
+ for port in ports:
+ listener = FakeListener(
+ protocol=(port.get("protocol") or port["Protocol"]),
+ load_balancer_port=(
+ port.get("load_balancer_port") or port["LoadBalancerPort"]
+ ),
+ instance_port=(port.get("instance_port") or port["InstancePort"]),
+ ssl_certificate_id=port.get(
+ "ssl_certificate_id", port.get("SSLCertificateId")
+ ),
+ )
+ if (
+ listener.ssl_certificate_id
+ and not listener.ssl_certificate_id.startswith("arn:aws:iam:")
+ ):
+ elb_backend._register_certificate(
+ listener.ssl_certificate_id, self.dns_name
+ )
+
+ self.listeners.append(listener)
+
+ # it is unclear per the AWS documentation as to when or how backend
+ # information gets set, so let's guess and set it here *shrug*
+ backend = FakeBackend(
+ instance_port=(port.get("instance_port") or port["InstancePort"])
+ )
+ self.backends.append(backend)
+
+ @property
+ def instance_ids(self):
+ """Return all the instances attached to the ELB"""
+ return self.instance_sparse_ids + self.instance_autoscaling_ids
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "LoadBalancerName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancing-loadbalancer.html
+ return "AWS::ElasticLoadBalancing::LoadBalancer"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ elb_backend = elb_backends[region_name]
+ new_elb = elb_backend.create_load_balancer(
+ name=properties.get("LoadBalancerName", resource_name),
+ zones=properties.get("AvailabilityZones", []),
+ ports=properties["Listeners"],
+ scheme=properties.get("Scheme", "internet-facing"),
+ )
+
+ instance_ids = properties.get("Instances", [])
+ for instance_id in instance_ids:
+ elb_backend.register_instances(new_elb.name, [instance_id])
+
+ policies = properties.get("Policies", [])
+ port_policies = {}
+ for policy in policies:
+ policy_name = policy["PolicyName"]
+ other_policy = OtherPolicy()
+ other_policy.policy_name = policy_name
+ elb_backend.create_lb_other_policy(new_elb.name, other_policy)
+ for port in policy.get("InstancePorts", []):
+ policies_for_port = port_policies.get(port, set())
+ policies_for_port.add(policy_name)
+ port_policies[port] = policies_for_port
+
+ for port, policies in port_policies.items():
+ elb_backend.set_load_balancer_policies_of_backend_server(
+ new_elb.name, port, list(policies)
+ )
+
+ health_check = properties.get("HealthCheck")
+ if health_check:
+ elb_backend.configure_health_check(
+ load_balancer_name=new_elb.name,
+ timeout=health_check["Timeout"],
+ healthy_threshold=health_check["HealthyThreshold"],
+ unhealthy_threshold=health_check["UnhealthyThreshold"],
+ interval=health_check["Interval"],
+ target=health_check["Target"],
+ )
+
+ return new_elb
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ elb_backend = elb_backends[region_name]
+ try:
+ elb_backend.delete_load_balancer(resource_name)
+ except KeyError:
+ pass
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in [
+ "CanonicalHostedZoneName",
+ "CanonicalHostedZoneNameID",
+ "DNSName",
+ "SourceSecurityGroup.GroupName",
+ "SourceSecurityGroup.OwnerAlias",
+ ]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "CanonicalHostedZoneName":
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "CanonicalHostedZoneName" ]"'
+ )
+ elif attribute_name == "CanonicalHostedZoneNameID":
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "CanonicalHostedZoneNameID" ]"'
+ )
+ elif attribute_name == "DNSName":
+ return self.dns_name
+ elif attribute_name == "SourceSecurityGroup.GroupName":
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "SourceSecurityGroup.GroupName" ]"'
+ )
+ elif attribute_name == "SourceSecurityGroup.OwnerAlias":
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "SourceSecurityGroup.OwnerAlias" ]"'
+ )
+ raise UnformattedGetAttTemplateException()
+
+ @classmethod
+ def get_default_attributes(cls):
+ attributes = dict()
+ attributes["cross_zone_load_balancing"] = {"enabled": False}
+ attributes["connection_draining"] = {"enabled": False}
+ attributes["access_log"] = {"enabled": False}
+ attributes["connection_settings"] = {"idle_timeout": 60}
+
+ return attributes
+
+ def add_tag(self, key, value):
+ if len(self.tags) >= 10 and key not in self.tags:
+ raise TooManyTagsError()
+ self.tags[key] = value
+
+ def list_tags(self):
+ return self.tags
+
+ def remove_tag(self, key):
+ if key in self.tags:
+ del self.tags[key]
+
+ def delete(self, region):
+ """Not exposed as part of the ELB API - used for CloudFormation."""
+ elb_backends[region].delete_load_balancer(self.name)
+
+
+class ELBBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.load_balancers = OrderedDict()
+
+ def create_load_balancer(
+ self,
+ name,
+ zones,
+ ports,
+ scheme="internet-facing",
+ subnets=None,
+ security_groups=None,
+ ):
+ vpc_id = None
+ ec2_backend = ec2_backends[self.region_name]
+ if subnets:
+ subnet = ec2_backend.get_subnet(subnets[0])
+ vpc_id = subnet.vpc_id
+ elif zones:
+ subnets = [
+ ec2_backend.get_default_subnet(availability_zone=zone).id
+ for zone in zones
+ ]
+ subnet = ec2_backend.get_subnet(subnets[0])
+ vpc_id = subnet.vpc_id
+ if name in self.load_balancers:
+ raise DuplicateLoadBalancerName(name)
+ if not ports:
+ raise EmptyListenersError()
+ if not security_groups:
+ sg = ec2_backend.create_security_group(
+ name=f"default_elb_{uuid4()}",
+ description="ELB created security group used when no security group is specified during ELB creation - modifications could impact traffic to future ELBs",
+ vpc_id=vpc_id,
+ )
+ security_groups = [sg.id]
+ for security_group in security_groups:
+ if ec2_backend.get_security_group_from_id(security_group) is None:
+ raise InvalidSecurityGroupError()
+ new_load_balancer = FakeLoadBalancer(
+ name=name,
+ zones=zones,
+ ports=ports,
+ scheme=scheme,
+ subnets=subnets,
+ security_groups=security_groups,
+ vpc_id=vpc_id,
+ elb_backend=self,
+ )
+ self.load_balancers[name] = new_load_balancer
+ return new_load_balancer
+
+ def create_load_balancer_listeners(self, name, ports):
+ balancer = self.load_balancers.get(name, None)
+ if balancer:
+ for port in ports:
+ protocol = port["protocol"]
+ instance_port = port["instance_port"]
+ lb_port = port["load_balancer_port"]
+ ssl_certificate_id = port.get("ssl_certificate_id")
+ for listener in balancer.listeners:
+ if lb_port == listener.load_balancer_port:
+ if protocol.lower() != listener.protocol.lower():
+ raise DuplicateListenerError(name, lb_port)
+ if instance_port != listener.instance_port:
+ raise DuplicateListenerError(name, lb_port)
+ if ssl_certificate_id != listener.ssl_certificate_id:
+ raise DuplicateListenerError(name, lb_port)
+ break
+ else:
+ if ssl_certificate_id and not ssl_certificate_id.startswith(
+ "arn:aws:iam::"
+ ):
+ self._register_certificate(
+ ssl_certificate_id, balancer.dns_name
+ )
+ balancer.listeners.append(
+ FakeListener(
+ lb_port, instance_port, protocol, ssl_certificate_id
+ )
+ )
+
+ return balancer
+
+ def describe_load_balancers(self, names):
+ balancers = self.load_balancers.values()
+ if names:
+ matched_balancers = [
+ balancer for balancer in balancers if balancer.name in names
+ ]
+ if len(names) != len(matched_balancers):
+ missing_elb = list(set(names) - set(matched_balancers))[0]
+ raise LoadBalancerNotFoundError(missing_elb)
+ return matched_balancers
+ else:
+ return balancers
+
+ def describe_load_balancer_policies(self, lb_name, policy_names):
+ lb = self.describe_load_balancers([lb_name])[0]
+ policies = lb.policies
+ if policy_names:
+ policies = [p for p in policies if p.policy_name in policy_names]
+ if len(policy_names) != len(policies):
+ raise PolicyNotFoundError()
+ return policies
+
+ def describe_instance_health(self, lb_name, instances):
+ provided_ids = [i["InstanceId"] for i in instances]
+ registered_ids = self.get_load_balancer(lb_name).instance_ids
+ ec2_backend = ec2_backends[self.region_name]
+ if len(provided_ids) == 0:
+ provided_ids = registered_ids
+ instances = []
+ for instance_id in provided_ids:
+ if instance_id not in registered_ids:
+ instances.append({"InstanceId": instance_id, "State": "Unknown"})
+ else:
+ try:
+ instance = ec2_backend.get_instance(instance_id)
+ state = "InService" if instance.is_running() else "OutOfService"
+ instances.append({"InstanceId": instance_id, "State": state})
+ except InvalidInstanceIdError:
+ pass
+
+ return instances
+
+ def delete_load_balancer_listeners(self, name, ports):
+ balancer = self.load_balancers.get(name, None)
+ listeners = []
+ if balancer:
+ for lb_port in ports:
+ for listener in balancer.listeners:
+ if int(lb_port) == int(listener.load_balancer_port):
+ continue
+ else:
+ listeners.append(listener)
+ balancer.listeners = listeners
+ return balancer
+
+ def delete_load_balancer(self, load_balancer_name):
+ self.load_balancers.pop(load_balancer_name, None)
+
+ def delete_load_balancer_policy(self, lb_name, policy_name):
+ lb = self.get_load_balancer(lb_name)
+ lb.policies = [p for p in lb.policies if p.policy_name != policy_name]
+
+ def get_load_balancer(self, load_balancer_name):
+ return self.load_balancers.get(load_balancer_name)
+
+ def apply_security_groups_to_load_balancer(
+ self, load_balancer_name, security_group_ids
+ ):
+ load_balancer = self.load_balancers.get(load_balancer_name)
+ ec2_backend = ec2_backends[self.region_name]
+ for security_group_id in security_group_ids:
+ if ec2_backend.get_security_group_from_id(security_group_id) is None:
+ raise InvalidSecurityGroupError()
+ load_balancer.security_groups = security_group_ids
+
+ def configure_health_check(
+ self,
+ load_balancer_name,
+ timeout,
+ healthy_threshold,
+ unhealthy_threshold,
+ interval,
+ target,
+ ):
+ check = FakeHealthCheck(
+ timeout, healthy_threshold, unhealthy_threshold, interval, target
+ )
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ load_balancer.health_check = check
+ return check
+
+ def set_load_balancer_listener_ssl_certificate(
+ self, name, lb_port, ssl_certificate_id
+ ):
+ balancer = self.load_balancers.get(name, None)
+ if balancer:
+ for idx, listener in enumerate(balancer.listeners):
+ if lb_port == listener.load_balancer_port:
+ balancer.listeners[idx].ssl_certificate_id = ssl_certificate_id
+ if ssl_certificate_id:
+ self._register_certificate(
+ ssl_certificate_id, balancer.dns_name
+ )
+ return balancer
+
+ def register_instances(
+ self, load_balancer_name, instance_ids, from_autoscaling=False
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ attr_name = (
+ "instance_sparse_ids"
+ if not from_autoscaling
+ else "instance_autoscaling_ids"
+ )
+
+ actual_instance_ids = getattr(load_balancer, attr_name)
+ actual_instance_ids.extend(instance_ids)
+ return load_balancer
+
+ def deregister_instances(
+ self, load_balancer_name, instance_ids, from_autoscaling=False
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ attr_name = (
+ "instance_sparse_ids"
+ if not from_autoscaling
+ else "instance_autoscaling_ids"
+ )
+ actual_instance_ids = getattr(load_balancer, attr_name)
+
+ new_instance_ids = [
+ instance_id
+ for instance_id in actual_instance_ids
+ if instance_id not in instance_ids
+ ]
+
+ setattr(load_balancer, attr_name, new_instance_ids)
+
+ return load_balancer
+
+ def modify_load_balancer_attributes(
+ self,
+ load_balancer_name,
+ cross_zone=None,
+ connection_settings=None,
+ connection_draining=None,
+ access_log=None,
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ if cross_zone:
+ load_balancer.attributes["cross_zone_load_balancing"] = cross_zone
+ if connection_settings:
+ load_balancer.attributes["connection_settings"] = connection_settings
+ if connection_draining:
+ load_balancer.attributes["connection_draining"] = connection_draining
+ if "timeout" not in connection_draining:
+ load_balancer.attributes["connection_draining"][
+ "timeout"
+ ] = 300 # default
+ if access_log:
+ load_balancer.attributes["access_log"] = access_log
+
+ def create_lb_other_policy(
+ self, load_balancer_name, policy_name, policy_type_name, policy_attrs
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ if policy_name not in [p.policy_name for p in load_balancer.policies]:
+ load_balancer.policies.append(
+ OtherPolicy(policy_name, policy_type_name, policy_attrs)
+ )
+
+ return load_balancer
+
+ def create_app_cookie_stickiness_policy(
+ self, load_balancer_name, policy_name, cookie_name
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ policy = AppCookieStickinessPolicy(policy_name, cookie_name)
+ load_balancer.policies.append(policy)
+ return load_balancer
+
+ def create_lb_cookie_stickiness_policy(
+ self, load_balancer_name, policy_name, cookie_expiration_period
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ policy = LbCookieStickinessPolicy(policy_name, cookie_expiration_period)
+ load_balancer.policies.append(policy)
+ return load_balancer
+
+ def set_load_balancer_policies_of_backend_server(
+ self, load_balancer_name, instance_port, policies
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ backend = [
+ b for b in load_balancer.backends if int(b.instance_port) == instance_port
+ ][0]
+ backend_idx = load_balancer.backends.index(backend)
+ backend.policy_names = policies
+ load_balancer.backends[backend_idx] = backend
+ return load_balancer
+
+ def set_load_balancer_policies_of_listener(
+ self, load_balancer_name, load_balancer_port, policies
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ listener = [
+ l_listener
+ for l_listener in load_balancer.listeners
+ if int(l_listener.load_balancer_port) == load_balancer_port
+ ][0]
+ listener_idx = load_balancer.listeners.index(listener)
+ listener.policy_names = policies
+ load_balancer.listeners[listener_idx] = listener
+ return load_balancer
+
+ def _register_certificate(self, ssl_certificate_id, dns_name):
+ from moto.acm.models import acm_backends, AWSResourceNotFoundException
+
+ acm_backend = acm_backends[self.region_name]
+ try:
+ acm_backend.set_certificate_in_use_by(ssl_certificate_id, dns_name)
+ except AWSResourceNotFoundException:
+ raise CertificateNotFoundException()
+
+ def enable_availability_zones_for_load_balancer(
+ self, load_balancer_name, availability_zones
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ load_balancer.zones = sorted(
+ list(set(load_balancer.zones + availability_zones))
+ )
+ return load_balancer.zones
+
+ def disable_availability_zones_for_load_balancer(
+ self, load_balancer_name, availability_zones
+ ):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ load_balancer.zones = sorted(
+ list(
+ set([az for az in load_balancer.zones if az not in availability_zones])
+ )
+ )
+ return load_balancer.zones
+
+ def attach_load_balancer_to_subnets(self, load_balancer_name, subnets):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ load_balancer.subnets = list(set(load_balancer.subnets + subnets))
+ return load_balancer.subnets
+
+ def detach_load_balancer_from_subnets(self, load_balancer_name, subnets):
+ load_balancer = self.get_load_balancer(load_balancer_name)
+ load_balancer.subnets = [s for s in load_balancer.subnets if s not in subnets]
+ return load_balancer.subnets
+
+
+# Use the same regions as EC2
+elb_backends = BackendDict(ELBBackend, "ec2")
diff --git a/contrib/python/moto/py3/moto/elb/policies.py b/contrib/python/moto/py3/moto/elb/policies.py
new file mode 100644
index 0000000000..b1a6eb39cd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/policies.py
@@ -0,0 +1,24 @@
+class Policy(object):
+ def __init__(self, policy_type_name):
+ self.policy_type_name = policy_type_name
+
+
+class AppCookieStickinessPolicy(Policy):
+ def __init__(self, policy_name, cookie_name):
+ super().__init__(policy_type_name="AppCookieStickinessPolicy")
+ self.policy_name = policy_name
+ self.cookie_name = cookie_name
+
+
+class LbCookieStickinessPolicy(Policy):
+ def __init__(self, policy_name, cookie_expiration_period):
+ super().__init__(policy_type_name="LbCookieStickinessPolicy")
+ self.policy_name = policy_name
+ self.cookie_expiration_period = cookie_expiration_period
+
+
+class OtherPolicy(Policy):
+ def __init__(self, policy_name, policy_type_name, policy_attrs):
+ super().__init__(policy_type_name=policy_type_name)
+ self.policy_name = policy_name
+ self.attributes = policy_attrs or []
diff --git a/contrib/python/moto/py3/moto/elb/responses.py b/contrib/python/moto/py3/moto/elb/responses.py
new file mode 100644
index 0000000000..3c2389e2c8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/responses.py
@@ -0,0 +1,893 @@
+from moto.core import get_account_id
+from moto.core.responses import BaseResponse
+from .models import elb_backends
+from .exceptions import DuplicateTagKeysError, LoadBalancerNotFoundError
+
+
+class ELBResponse(BaseResponse):
+ @property
+ def elb_backend(self):
+ return elb_backends[self.region]
+
+ def create_load_balancer(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ availability_zones = self._get_multi_param("AvailabilityZones.member")
+ ports = self._get_list_prefix("Listeners.member")
+ scheme = self._get_param("Scheme")
+ subnets = self._get_multi_param("Subnets.member")
+ security_groups = self._get_multi_param("SecurityGroups.member")
+
+ load_balancer = self.elb_backend.create_load_balancer(
+ name=load_balancer_name,
+ zones=availability_zones,
+ ports=ports,
+ scheme=scheme,
+ subnets=subnets,
+ security_groups=security_groups,
+ )
+ self._add_tags(load_balancer)
+ template = self.response_template(CREATE_LOAD_BALANCER_TEMPLATE)
+ return template.render(load_balancer=load_balancer)
+
+ def create_load_balancer_listeners(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ ports = self._get_list_prefix("Listeners.member")
+
+ self.elb_backend.create_load_balancer_listeners(
+ name=load_balancer_name, ports=ports
+ )
+
+ template = self.response_template(CREATE_LOAD_BALANCER_LISTENERS_TEMPLATE)
+ return template.render()
+
+ def describe_load_balancers(self):
+ names = self._get_multi_param("LoadBalancerNames.member")
+ all_load_balancers = list(self.elb_backend.describe_load_balancers(names))
+ marker = self._get_param("Marker")
+ all_names = [balancer.name for balancer in all_load_balancers]
+ if marker:
+ start = all_names.index(marker) + 1
+ else:
+ start = 0
+ page_size = self._get_int_param(
+ "PageSize", 50
+ ) # the default is 400, but using 50 to make testing easier
+ load_balancers_resp = all_load_balancers[start : start + page_size]
+ next_marker = None
+ if len(all_load_balancers) > start + page_size:
+ next_marker = load_balancers_resp[-1].name
+
+ template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE)
+ return template.render(
+ ACCOUNT_ID=get_account_id(),
+ load_balancers=load_balancers_resp,
+ marker=next_marker,
+ )
+
+ def delete_load_balancer_listeners(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ ports = self._get_multi_param("LoadBalancerPorts.member")
+ ports = [int(port) for port in ports]
+
+ self.elb_backend.delete_load_balancer_listeners(load_balancer_name, ports)
+ template = self.response_template(DELETE_LOAD_BALANCER_LISTENERS)
+ return template.render()
+
+ def delete_load_balancer(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ self.elb_backend.delete_load_balancer(load_balancer_name)
+ template = self.response_template(DELETE_LOAD_BALANCER_TEMPLATE)
+ return template.render()
+
+ def delete_load_balancer_policy(self):
+ load_balancer_name = self.querystring.get("LoadBalancerName")[0]
+ names = self._get_param("PolicyName")
+ self.elb_backend.delete_load_balancer_policy(
+ lb_name=load_balancer_name, policy_name=names
+ )
+
+ template = self.response_template(DELETE_LOAD_BALANCER_POLICY)
+ return template.render()
+
+ def apply_security_groups_to_load_balancer(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ security_group_ids = self._get_multi_param("SecurityGroups.member")
+ self.elb_backend.apply_security_groups_to_load_balancer(
+ load_balancer_name, security_group_ids
+ )
+ template = self.response_template(APPLY_SECURITY_GROUPS_TEMPLATE)
+ return template.render(security_group_ids=security_group_ids)
+
+ def configure_health_check(self):
+ check = self.elb_backend.configure_health_check(
+ load_balancer_name=self._get_param("LoadBalancerName"),
+ timeout=self._get_param("HealthCheck.Timeout"),
+ healthy_threshold=self._get_param("HealthCheck.HealthyThreshold"),
+ unhealthy_threshold=self._get_param("HealthCheck.UnhealthyThreshold"),
+ interval=self._get_param("HealthCheck.Interval"),
+ target=self._get_param("HealthCheck.Target"),
+ )
+ template = self.response_template(CONFIGURE_HEALTH_CHECK_TEMPLATE)
+ return template.render(check=check)
+
+ def register_instances_with_load_balancer(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ instance_ids = [
+ list(param.values())[0]
+ for param in self._get_list_prefix("Instances.member")
+ ]
+ template = self.response_template(REGISTER_INSTANCES_TEMPLATE)
+ load_balancer = self.elb_backend.register_instances(
+ load_balancer_name, instance_ids
+ )
+ return template.render(load_balancer=load_balancer)
+
+ def set_load_balancer_listener_ssl_certificate(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ ssl_certificate_id = self.querystring["SSLCertificateId"][0]
+ lb_port = self.querystring["LoadBalancerPort"][0]
+
+ self.elb_backend.set_load_balancer_listener_ssl_certificate(
+ load_balancer_name, lb_port, ssl_certificate_id
+ )
+
+ template = self.response_template(SET_LOAD_BALANCER_SSL_CERTIFICATE)
+ return template.render()
+
+ def deregister_instances_from_load_balancer(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ instance_ids = [
+ list(param.values())[0]
+ for param in self._get_list_prefix("Instances.member")
+ ]
+ template = self.response_template(DEREGISTER_INSTANCES_TEMPLATE)
+ load_balancer = self.elb_backend.deregister_instances(
+ load_balancer_name, instance_ids
+ )
+ return template.render(load_balancer=load_balancer)
+
+ def describe_load_balancer_attributes(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ load_balancer = self.elb_backend.get_load_balancer(load_balancer_name)
+ template = self.response_template(DESCRIBE_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=load_balancer.attributes)
+
+ def modify_load_balancer_attributes(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ load_balancer = self.elb_backend.get_load_balancer(load_balancer_name)
+
+ cross_zone = self._get_dict_param(
+ "LoadBalancerAttributes.CrossZoneLoadBalancing."
+ )
+ if cross_zone:
+ self.elb_backend.modify_load_balancer_attributes(
+ load_balancer_name, cross_zone=cross_zone
+ )
+
+ access_log = self._get_dict_param("LoadBalancerAttributes.AccessLog.")
+ if access_log:
+ self.elb_backend.modify_load_balancer_attributes(
+ load_balancer_name, access_log=access_log
+ )
+
+ connection_draining = self._get_dict_param(
+ "LoadBalancerAttributes.ConnectionDraining."
+ )
+ if connection_draining:
+ self.elb_backend.modify_load_balancer_attributes(
+ load_balancer_name, connection_draining=connection_draining
+ )
+
+ connection_settings = self._get_dict_param(
+ "LoadBalancerAttributes.ConnectionSettings."
+ )
+ if connection_settings:
+ self.elb_backend.modify_load_balancer_attributes(
+ load_balancer_name, connection_settings=connection_settings
+ )
+
+ template = self.response_template(MODIFY_ATTRIBUTES_TEMPLATE)
+ return template.render(
+ load_balancer=load_balancer, attributes=load_balancer.attributes
+ )
+
+ def create_load_balancer_policy(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+
+ policy_name = self._get_param("PolicyName")
+ policy_type_name = self._get_param("PolicyTypeName")
+ policy_attrs = self._get_multi_param("PolicyAttributes.member.")
+
+ self.elb_backend.create_lb_other_policy(
+ load_balancer_name, policy_name, policy_type_name, policy_attrs
+ )
+
+ template = self.response_template(CREATE_LOAD_BALANCER_POLICY_TEMPLATE)
+ return template.render()
+
+ def create_app_cookie_stickiness_policy(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+
+ policy_name = self._get_param("PolicyName")
+ cookie_name = self._get_param("CookieName")
+
+ self.elb_backend.create_app_cookie_stickiness_policy(
+ load_balancer_name, policy_name, cookie_name
+ )
+
+ template = self.response_template(CREATE_APP_COOKIE_STICKINESS_POLICY_TEMPLATE)
+ return template.render()
+
+ def create_lb_cookie_stickiness_policy(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+
+ policy_name = self._get_param("PolicyName")
+ cookie_expirations = self._get_param("CookieExpirationPeriod")
+ if cookie_expirations:
+ cookie_expiration_period = int(cookie_expirations)
+ else:
+ cookie_expiration_period = None
+
+ self.elb_backend.create_lb_cookie_stickiness_policy(
+ load_balancer_name, policy_name, cookie_expiration_period
+ )
+
+ template = self.response_template(CREATE_LB_COOKIE_STICKINESS_POLICY_TEMPLATE)
+ return template.render()
+
+ def set_load_balancer_policies_of_listener(self):
+ load_balancer_name = self._get_param("LoadBalancerName")
+ load_balancer = self.elb_backend.get_load_balancer(load_balancer_name)
+ load_balancer_port = int(self._get_param("LoadBalancerPort"))
+
+ mb_listener = [
+ listner
+ for listner in load_balancer.listeners
+ if int(listner.load_balancer_port) == load_balancer_port
+ ]
+ if mb_listener:
+ policies = self._get_multi_param("PolicyNames.member")
+ self.elb_backend.set_load_balancer_policies_of_listener(
+ load_balancer_name, load_balancer_port, policies
+ )
+ # else: explode?
+
+ template = self.response_template(
+ SET_LOAD_BALANCER_POLICIES_OF_LISTENER_TEMPLATE
+ )
+ return template.render()
+
+ def set_load_balancer_policies_for_backend_server(self):
+ load_balancer_name = self.querystring.get("LoadBalancerName")[0]
+ load_balancer = self.elb_backend.get_load_balancer(load_balancer_name)
+ instance_port = int(self.querystring.get("InstancePort")[0])
+
+ mb_backend = [
+ b for b in load_balancer.backends if int(b.instance_port) == instance_port
+ ]
+ if mb_backend:
+ policies = self._get_multi_param("PolicyNames.member")
+ self.elb_backend.set_load_balancer_policies_of_backend_server(
+ load_balancer_name, instance_port, policies
+ )
+ # else: explode?
+
+ template = self.response_template(
+ SET_LOAD_BALANCER_POLICIES_FOR_BACKEND_SERVER_TEMPLATE
+ )
+ return template.render()
+
+ def describe_load_balancer_policies(self):
+ load_balancer_name = self.querystring.get("LoadBalancerName")[0]
+ names = self._get_multi_param("PolicyNames.member.")
+ policies = self.elb_backend.describe_load_balancer_policies(
+ lb_name=load_balancer_name, policy_names=names
+ )
+
+ template = self.response_template(DESCRIBE_LOAD_BALANCER_POLICIES_TEMPLATE)
+ return template.render(policies=policies)
+
+ def describe_instance_health(self):
+ lb_name = self._get_param("LoadBalancerName")
+ instances = self._get_params().get("Instances", [])
+ instances = self.elb_backend.describe_instance_health(lb_name, instances)
+ template = self.response_template(DESCRIBE_INSTANCE_HEALTH_TEMPLATE)
+ return template.render(instances=instances)
+
+ def add_tags(self):
+
+ for key, value in self.querystring.items():
+ if "LoadBalancerNames.member" in key:
+ load_balancer_name = value[0]
+ elb = self.elb_backend.get_load_balancer(load_balancer_name)
+ if not elb:
+ raise LoadBalancerNotFoundError(load_balancer_name)
+
+ self._add_tags(elb)
+
+ template = self.response_template(ADD_TAGS_TEMPLATE)
+ return template.render()
+
+ def remove_tags(self):
+ for key in self.querystring:
+ if "LoadBalancerNames.member" in key:
+ number = key.split(".")[2]
+ load_balancer_name = self._get_param(
+ "LoadBalancerNames.member.{0}".format(number)
+ )
+ elb = self.elb_backend.get_load_balancer(load_balancer_name)
+ if not elb:
+ raise LoadBalancerNotFoundError(load_balancer_name)
+
+ for t_key, t_val in self.querystring.items():
+ if t_key.startswith("Tags.member."):
+ if t_key.split(".")[3] == "Key":
+ elb.remove_tag(t_val[0])
+
+ template = self.response_template(REMOVE_TAGS_TEMPLATE)
+ return template.render()
+
+ def describe_tags(self):
+ elbs = []
+ for key in self.querystring:
+ if "LoadBalancerNames.member" in key:
+ number = key.split(".")[2]
+ load_balancer_name = self._get_param(
+ "LoadBalancerNames.member.{0}".format(number)
+ )
+ elb = self.elb_backend.get_load_balancer(load_balancer_name)
+ if not elb:
+ raise LoadBalancerNotFoundError(load_balancer_name)
+ elbs.append(elb)
+
+ template = self.response_template(DESCRIBE_TAGS_TEMPLATE)
+ return template.render(load_balancers=elbs)
+
+ def _add_tags(self, elb):
+ tag_values = []
+ tag_keys = []
+
+ for t_key, t_val in sorted(self.querystring.items()):
+ if t_key.startswith("Tags.member."):
+ if t_key.split(".")[3] == "Key":
+ tag_keys.extend(t_val)
+ elif t_key.split(".")[3] == "Value":
+ tag_values.extend(t_val)
+
+ counts = {}
+ for i in tag_keys:
+ counts[i] = tag_keys.count(i)
+
+ counts = sorted(counts.items(), key=lambda i: i[1], reverse=True)
+
+ if counts and counts[0][1] > 1:
+ # We have dupes...
+ raise DuplicateTagKeysError(counts[0])
+
+ for tag_key, tag_value in zip(tag_keys, tag_values):
+ elb.add_tag(tag_key, tag_value)
+
+ def enable_availability_zones_for_load_balancer(self):
+ params = self._get_params()
+ load_balancer_name = params.get("LoadBalancerName")
+ availability_zones = params.get("AvailabilityZones")
+ availability_zones = (
+ self.elb_backend.enable_availability_zones_for_load_balancer(
+ load_balancer_name=load_balancer_name,
+ availability_zones=availability_zones,
+ )
+ )
+ template = self.response_template(
+ ENABLE_AVAILABILITY_ZONES_FOR_LOAD_BALANCER_TEMPLATE
+ )
+ return template.render(availability_zones=availability_zones)
+
+ def disable_availability_zones_for_load_balancer(self):
+ params = self._get_params()
+ load_balancer_name = params.get("LoadBalancerName")
+ availability_zones = params.get("AvailabilityZones")
+ availability_zones = (
+ self.elb_backend.disable_availability_zones_for_load_balancer(
+ load_balancer_name=load_balancer_name,
+ availability_zones=availability_zones,
+ )
+ )
+ template = self.response_template(
+ DISABLE_AVAILABILITY_ZONES_FOR_LOAD_BALANCER_TEMPLATE
+ )
+ return template.render(availability_zones=availability_zones)
+
+ def attach_load_balancer_to_subnets(self):
+ params = self._get_params()
+ load_balancer_name = params.get("LoadBalancerName")
+ subnets = params.get("Subnets")
+
+ all_subnets = self.elb_backend.attach_load_balancer_to_subnets(
+ load_balancer_name, subnets
+ )
+ template = self.response_template(ATTACH_LB_TO_SUBNETS_TEMPLATE)
+ return template.render(subnets=all_subnets)
+
+ def detach_load_balancer_from_subnets(self):
+ params = self._get_params()
+ load_balancer_name = params.get("LoadBalancerName")
+ subnets = params.get("Subnets")
+
+ all_subnets = self.elb_backend.detach_load_balancer_from_subnets(
+ load_balancer_name, subnets
+ )
+ template = self.response_template(DETACH_LB_FROM_SUBNETS_TEMPLATE)
+ return template.render(subnets=all_subnets)
+
+
+ADD_TAGS_TEMPLATE = """<AddTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <AddTagsResult/>
+ <ResponseMetadata>
+ <RequestId>360e81f7-1100-11e4-b6ed-0f30EXAMPLE</RequestId>
+ </ResponseMetadata>
+</AddTagsResponse>"""
+
+REMOVE_TAGS_TEMPLATE = """<RemoveTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <RemoveTagsResult/>
+ <ResponseMetadata>
+ <RequestId>360e81f7-1100-11e4-b6ed-0f30EXAMPLE</RequestId>
+ </ResponseMetadata>
+</RemoveTagsResponse>"""
+
+DESCRIBE_TAGS_TEMPLATE = """<DescribeTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DescribeTagsResult>
+ <TagDescriptions>
+ {% for elb in load_balancers %}
+ <member>
+ <LoadBalancerName>{{ elb.name }}</LoadBalancerName>
+ <Tags>
+ {% for key, value in elb.tags.items() %}
+ <member>
+ <Value>{{ value }}</Value>
+ <Key>{{ key }}</Key>
+ </member>
+ {% endfor %}
+ </Tags>
+ </member>
+ {% endfor %}
+ </TagDescriptions>
+ </DescribeTagsResult>
+ <ResponseMetadata>
+ <RequestId>360e81f7-1100-11e4-b6ed-0f30EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeTagsResponse>"""
+
+
+DESCRIBE_LOAD_BALANCER_POLICIES_TEMPLATE = """<DescribeLoadBalancerPoliciesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DescribeLoadBalancerPoliciesResult>
+ <PolicyDescriptions>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.policy_name }}</PolicyName>
+ <PolicyTypeName>{{ policy.policy_type_name }}</PolicyTypeName>
+ <PolicyAttributeDescriptions>
+ {% for attr in policy.attributes %}
+ <member>
+ <AttributeName>{{ attr["AttributeName"] }}</AttributeName>
+ <AttributeValue>{{ attr["AttributeValue"] }}</AttributeValue>
+ </member>
+ {% endfor %}
+ </PolicyAttributeDescriptions>
+ </member>
+ {% endfor %}
+ </PolicyDescriptions>
+ </DescribeLoadBalancerPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>360e81f7-1100-11e4-b6ed-0f30EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancerPoliciesResponse>"""
+
+
+CREATE_LOAD_BALANCER_TEMPLATE = """<CreateLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <CreateLoadBalancerResult>
+ <DNSName>{{ load_balancer.dns_name }}</DNSName>
+ </CreateLoadBalancerResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLoadBalancerResponse>"""
+
+CREATE_LOAD_BALANCER_LISTENERS_TEMPLATE = """<CreateLoadBalancerListenersResponse xmlns="http://elasticloadbalancing.amazon aws.com/doc/2012-06-01/">
+ <CreateLoadBalancerListenersResult/>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLoadBalancerListenersResponse>"""
+
+DELETE_LOAD_BALANCER_TEMPLATE = """<DeleteLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DeleteLoadBalancerResult/>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteLoadBalancerResponse>"""
+
+DESCRIBE_LOAD_BALANCERS_TEMPLATE = """<DescribeLoadBalancersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DescribeLoadBalancersResult>
+ <LoadBalancerDescriptions>
+ {% for load_balancer in load_balancers %}
+ <member>
+ <SecurityGroups>
+ {% for security_group_id in load_balancer.security_groups %}
+ <member>{{ security_group_id }}</member>
+ {% endfor %}
+ </SecurityGroups>
+ {% if load_balancer.vpc_id %}
+ <SourceSecurityGroup>
+ <OwnerAlias>{{ ACCOUNT_ID }}</OwnerAlias>
+ <GroupName>default</GroupName>
+ </SourceSecurityGroup>
+ {% endif %}
+ <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
+ <CreatedTime>{{ load_balancer.created_time.isoformat() }}</CreatedTime>
+ <HealthCheck>
+ {% if load_balancer.health_check %}
+ <Interval>{{ load_balancer.health_check.interval }}</Interval>
+ <Target>{{ load_balancer.health_check.target }}</Target>
+ <HealthyThreshold>{{ load_balancer.health_check.healthy_threshold }}</HealthyThreshold>
+ <Timeout>{{ load_balancer.health_check.timeout }}</Timeout>
+ <UnhealthyThreshold>{{ load_balancer.health_check.unhealthy_threshold }}</UnhealthyThreshold>
+ {% else %}
+ <Target></Target>
+ {% endif %}
+ </HealthCheck>
+ {% if load_balancer.vpc_id %}
+ <VPCId>{{ load_balancer.vpc_id }}</VPCId>
+ {% else %}
+ <VPCId />
+ {% endif %}
+ <ListenerDescriptions>
+ {% for listener in load_balancer.listeners %}
+ <member>
+ <PolicyNames>
+ {% for policy_name in listener.policy_names %}
+ <member>{{ policy_name }}</member>
+ {% endfor %}
+ </PolicyNames>
+ <Listener>
+ <Protocol>{{ listener.protocol }}</Protocol>
+ <LoadBalancerPort>{{ listener.load_balancer_port }}</LoadBalancerPort>
+ <InstanceProtocol>{{ listener.protocol }}</InstanceProtocol>
+ <InstancePort>{{ listener.instance_port }}</InstancePort>
+ <SSLCertificateId>{{ listener.ssl_certificate_id }}</SSLCertificateId>
+ </Listener>
+ </member>
+ {% endfor %}
+ </ListenerDescriptions>
+ <Instances>
+ {% for instance_id in load_balancer.instance_ids %}
+ <member>
+ <InstanceId>{{ instance_id }}</InstanceId>
+ </member>
+ {% endfor %}
+ </Instances>
+ <Policies>
+ <AppCookieStickinessPolicies>
+ {% for policy in load_balancer.policies %}
+ {% if policy.policy_type_name == "AppCookieStickinessPolicy" %}
+ <member>
+ <CookieName>{{ policy.cookie_name }}</CookieName>
+ <PolicyName>{{ policy.policy_name }}</PolicyName>
+ </member>
+ {% endif %}
+ {% endfor %}
+ </AppCookieStickinessPolicies>
+ <LBCookieStickinessPolicies>
+ {% for policy in load_balancer.policies %}
+ {% if policy.policy_type_name == "LbCookieStickinessPolicy" %}
+ <member>
+ {% if policy.cookie_expiration_period %}
+ <CookieExpirationPeriod>{{ policy.cookie_expiration_period }}</CookieExpirationPeriod>
+ {% endif %}
+ <PolicyName>{{ policy.policy_name }}</PolicyName>
+ </member>
+ {% endif %}
+ {% endfor %}
+ </LBCookieStickinessPolicies>
+ <OtherPolicies>
+ {% for policy in load_balancer.policies %}
+ {% if policy.policy_type_name not in ["AppCookieStickinessPolicy", "LbCookieStickinessPolicy"] %}
+ <member>{{ policy.policy_name }}</member>
+ {% endif %}
+ {% endfor %}
+ </OtherPolicies>
+ </Policies>
+ <AvailabilityZones>
+ {% for zone in load_balancer.zones %}
+ <member>{{ zone }}</member>
+ {% endfor %}
+ </AvailabilityZones>
+ <CanonicalHostedZoneName>{{ load_balancer.dns_name }}</CanonicalHostedZoneName>
+ <CanonicalHostedZoneNameID>Z3ZONEID</CanonicalHostedZoneNameID>
+ <Scheme>{{ load_balancer.scheme }}</Scheme>
+ <DNSName>{{ load_balancer.dns_name }}</DNSName>
+ <BackendServerDescriptions>
+ {% for backend in load_balancer.backends %}
+ {% if backend.policy_names %}
+ <member>
+ <InstancePort>{{ backend.instance_port }}</InstancePort>
+ <PolicyNames>
+ {% for policy in backend.policy_names %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </PolicyNames>
+ </member>
+ {% endif %}
+ {% endfor %}
+ </BackendServerDescriptions>
+ <Subnets>
+ {% for subnet in load_balancer.subnets %}
+ <member>{{ subnet }}</member>
+ {% endfor %}
+ </Subnets>
+ </member>
+ {% endfor %}
+ </LoadBalancerDescriptions>
+ {% if marker %}
+ <NextMarker>{{ marker }}</NextMarker>
+ {% endif %}
+ </DescribeLoadBalancersResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancersResponse>"""
+
+APPLY_SECURITY_GROUPS_TEMPLATE = """<ApplySecurityGroupsToLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <ApplySecurityGroupsToLoadBalancerResult>
+ <SecurityGroups>
+ {% for security_group_id in security_group_ids %}
+ <member>{{ security_group_id }}</member>
+ {% endfor %}
+ </SecurityGroups>
+ </ApplySecurityGroupsToLoadBalancerResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</ApplySecurityGroupsToLoadBalancerResponse>"""
+
+CONFIGURE_HEALTH_CHECK_TEMPLATE = """<ConfigureHealthCheckResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <ConfigureHealthCheckResult>
+ <HealthCheck>
+ <Interval>{{ check.interval }}</Interval>
+ <Target>{{ check.target }}</Target>
+ <HealthyThreshold>{{ check.healthy_threshold }}</HealthyThreshold>
+ <Timeout>{{ check.timeout }}</Timeout>
+ <UnhealthyThreshold>{{ check.unhealthy_threshold }}</UnhealthyThreshold>
+ </HealthCheck>
+ </ConfigureHealthCheckResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</ConfigureHealthCheckResponse>"""
+
+REGISTER_INSTANCES_TEMPLATE = """<RegisterInstancesWithLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <RegisterInstancesWithLoadBalancerResult>
+ <Instances>
+ {% for instance_id in load_balancer.instance_ids %}
+ <member>
+ <InstanceId>{{ instance_id }}</InstanceId>
+ </member>
+ {% endfor %}
+ </Instances>
+ </RegisterInstancesWithLoadBalancerResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</RegisterInstancesWithLoadBalancerResponse>"""
+
+DEREGISTER_INSTANCES_TEMPLATE = """<DeregisterInstancesFromLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DeregisterInstancesFromLoadBalancerResult>
+ <Instances>
+ {% for instance_id in load_balancer.instance_ids %}
+ <member>
+ <InstanceId>{{ instance_id }}</InstanceId>
+ </member>
+ {% endfor %}
+ </Instances>
+ </DeregisterInstancesFromLoadBalancerResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</DeregisterInstancesFromLoadBalancerResponse>"""
+
+SET_LOAD_BALANCER_SSL_CERTIFICATE = """<SetLoadBalancerListenerSSLCertificateResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <SetLoadBalancerListenerSSLCertificateResult/>
+<ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+</ResponseMetadata>
+</SetLoadBalancerListenerSSLCertificateResponse>"""
+
+
+DELETE_LOAD_BALANCER_LISTENERS = """<DeleteLoadBalancerListenersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DeleteLoadBalancerListenersResult/>
+<ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+</ResponseMetadata>
+</DeleteLoadBalancerListenersResponse>"""
+
+
+DELETE_LOAD_BALANCER_POLICY = """<DeleteLoadBalancerPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DeleteLoadBalancerPolicyResult/>
+<ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+</ResponseMetadata>
+</DeleteLoadBalancerPolicyResponse>"""
+
+DESCRIBE_ATTRIBUTES_TEMPLATE = """<DescribeLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DescribeLoadBalancerAttributesResult>
+ <LoadBalancerAttributes>
+ <AccessLog>
+ <Enabled>{{ attributes["access_log"]["enabled"] }}</Enabled>
+ {% if attributes["access_log"]["enabled"] == 'true' %}
+ <S3BucketName>{{ attributes["access_log"]["s3_bucket_name"] }}</S3BucketName>
+ <S3BucketPrefix>{{ attributes["access_log"]["s3_bucket_prefix"] }}</S3BucketPrefix>
+ <EmitInterval>{{ attributes["access_log"]["emit_interval"] }}</EmitInterval>
+ {% endif %}
+ </AccessLog>
+ <ConnectionSettings>
+ <IdleTimeout>{{ attributes["connection_settings"]["idle_timeout"] }}</IdleTimeout>
+ </ConnectionSettings>
+ <CrossZoneLoadBalancing>
+ <Enabled>{{ attributes.cross_zone_load_balancing.enabled }}</Enabled>
+ </CrossZoneLoadBalancing>
+ <ConnectionDraining>
+ <Enabled>{{ attributes["connection_draining"]["enabled"] }}</Enabled>
+ {% if attributes["connection_draining"]["timeout"] %}
+ <Timeout>{{ attributes["connection_draining"]["timeout"] }}</Timeout>
+ {% endif %}
+ </ConnectionDraining>
+ </LoadBalancerAttributes>
+ </DescribeLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancerAttributesResponse>
+"""
+
+MODIFY_ATTRIBUTES_TEMPLATE = """<ModifyLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <ModifyLoadBalancerAttributesResult>
+ <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
+ <LoadBalancerAttributes>
+ <AccessLog>
+ <Enabled>{{ attributes["access_log"]["enabled"] == 'true' }}</Enabled>
+ {% if attributes["access_log"]["enabled"] == 'true' %}
+ <S3BucketName>{{ attributes["access_log"]["s3_bucket_name"] }}</S3BucketName>
+ <S3BucketPrefix>{{ attributes["access_log"]["s3_bucket_prefix"] }}</S3BucketPrefix>
+ <EmitInterval>{{ attributes["access_log"]["emit_interval"] }}</EmitInterval>
+ {% endif %}
+ </AccessLog>
+ <ConnectionSettings>
+ <IdleTimeout>{{ attributes["connection_settings"]["idle_timeout"] }}</IdleTimeout>
+ </ConnectionSettings>
+ <CrossZoneLoadBalancing>
+ <Enabled>{{ attributes.cross_zone_load_balancing.enabled }}</Enabled>
+ </CrossZoneLoadBalancing>
+ <ConnectionDraining>
+ {% if attributes["connection_draining"]["enabled"] == 'true' %}
+ <Enabled>true</Enabled>
+ <Timeout>{{ attributes["connection_draining"]["timeout"] }}</Timeout>
+ {% else %}
+ <Enabled>false</Enabled>
+ {% endif %}
+ </ConnectionDraining>
+ </LoadBalancerAttributes>
+ </ModifyLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ModifyLoadBalancerAttributesResponse>
+"""
+
+CREATE_LOAD_BALANCER_POLICY_TEMPLATE = """<CreateLoadBalancerPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <CreateLoadBalancerPolicyResult/>
+ <ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLoadBalancerPolicyResponse>
+"""
+
+CREATE_LB_COOKIE_STICKINESS_POLICY_TEMPLATE = """<CreateLBCookieStickinessPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <CreateLBCookieStickinessPolicyResult/>
+ <ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLBCookieStickinessPolicyResponse>
+"""
+
+CREATE_APP_COOKIE_STICKINESS_POLICY_TEMPLATE = """<CreateAppCookieStickinessPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <CreateAppCookieStickinessPolicyResult/>
+ <ResponseMetadata>
+ <RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateAppCookieStickinessPolicyResponse>
+"""
+
+SET_LOAD_BALANCER_POLICIES_OF_LISTENER_TEMPLATE = """<SetLoadBalancerPoliciesOfListenerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <SetLoadBalancerPoliciesOfListenerResult/>
+ <ResponseMetadata>
+ <RequestId>07b1ecbc-1100-11e3-acaf-dd7edEXAMPLE</RequestId>
+ </ResponseMetadata>
+</SetLoadBalancerPoliciesOfListenerResponse>
+"""
+
+SET_LOAD_BALANCER_POLICIES_FOR_BACKEND_SERVER_TEMPLATE = """<SetLoadBalancerPoliciesForBackendServerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <SetLoadBalancerPoliciesForBackendServerResult/>
+ <ResponseMetadata>
+ <RequestId>0eb9b381-dde0-11e2-8d78-6ddbaEXAMPLE</RequestId>
+ </ResponseMetadata>
+</SetLoadBalancerPoliciesForBackendServerResponse>
+"""
+
+DESCRIBE_INSTANCE_HEALTH_TEMPLATE = """<DescribeInstanceHealthResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DescribeInstanceHealthResult>
+ <InstanceStates>
+ {% for instance in instances %}
+ <member>
+ <Description>N/A</Description>
+ <InstanceId>{{ instance['InstanceId'] }}</InstanceId>
+ <State>{{ instance['State'] }}</State>
+ <ReasonCode>N/A</ReasonCode>
+ </member>
+ {% endfor %}
+ </InstanceStates>
+ </DescribeInstanceHealthResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeInstanceHealthResponse>"""
+
+ENABLE_AVAILABILITY_ZONES_FOR_LOAD_BALANCER_TEMPLATE = """<EnableAvailabilityZonesForLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <EnableAvailabilityZonesForLoadBalancerResult>
+ <AvailabilityZones>
+{% for az in availability_zones %}
+ <AvailabilityZone>{{ az }}</AvailabilityZone>
+{% endfor %}
+ </AvailabilityZones>
+ </EnableAvailabilityZonesForLoadBalancerResult>
+</EnableAvailabilityZonesForLoadBalancerResponse>"""
+
+DISABLE_AVAILABILITY_ZONES_FOR_LOAD_BALANCER_TEMPLATE = """<DisableAvailabilityZonesForLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DisableAvailabilityZonesForLoadBalancerResult>
+ <AvailabilityZones>
+{% for az in availability_zones %}
+ <AvailabilityZone>{{ az }}</AvailabilityZone>
+{% endfor %}
+ </AvailabilityZones>
+ </DisableAvailabilityZonesForLoadBalancerResult>
+</DisableAvailabilityZonesForLoadBalancerResponse>"""
+
+ATTACH_LB_TO_SUBNETS_TEMPLATE = """<AttachLoadBalancerToSubnetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <AttachLoadBalancerToSubnetsResult>
+ <Subnets>
+ {% for subnet in subnets %}
+ <member>{{ subnet }}</member>
+ {% endfor %}
+ </Subnets>
+ </AttachLoadBalancerToSubnetsResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</AttachLoadBalancerToSubnetsResponse>"""
+
+DETACH_LB_FROM_SUBNETS_TEMPLATE = """<DetachLoadBalancerFromSubnetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
+ <DetachLoadBalancerFromSubnetsResult>
+ <Subnets>
+ {% for subnet in subnets %}
+ <member>{{ subnet }}</member>
+ {% endfor %}
+ </Subnets>
+ </DetachLoadBalancerFromSubnetsResult>
+ <ResponseMetadata>
+ <RequestId>f9880f01-7852-629d-a6c3-3ae2-666a409287e6dc0c</RequestId>
+ </ResponseMetadata>
+</DetachLoadBalancerFromSubnetsResponse>"""
diff --git a/contrib/python/moto/py3/moto/elb/urls.py b/contrib/python/moto/py3/moto/elb/urls.py
new file mode 100644
index 0000000000..5495c62c78
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elb/urls.py
@@ -0,0 +1,39 @@
+from urllib.parse import parse_qs
+from botocore.awsrequest import AWSPreparedRequest
+
+from moto.elb.responses import ELBResponse
+from moto.elbv2.responses import ELBV2Response
+
+
+def api_version_elb_backend(*args, **kwargs):
+ """
+ ELB and ELBV2 (Classic and Application load balancers) use the same
+ hostname and url space. To differentiate them we must read the
+ `Version` parameter out of the url-encoded request body. TODO: There
+ has _got_ to be a better way to do this. Please help us think of
+ one.
+ """
+ request = args[0]
+
+ if hasattr(request, "values"):
+ # boto3
+ version = request.values.get("Version")
+ elif isinstance(request, AWSPreparedRequest):
+ # boto in-memory
+ version = parse_qs(request.body).get("Version")[0]
+ else:
+ # boto in server mode
+ request.parse_request()
+ version = request.querystring.get("Version")[0]
+
+ if "2012-06-01" == version:
+ return ELBResponse.dispatch(*args, **kwargs)
+ elif "2015-12-01" == version:
+ return ELBV2Response.dispatch(*args, **kwargs)
+ else:
+ raise Exception("Unknown ELB API version: {}".format(version))
+
+
+url_bases = [r"https?://elasticloadbalancing\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": api_version_elb_backend}
diff --git a/contrib/python/moto/py3/moto/elbv2/__init__.py b/contrib/python/moto/py3/moto/elbv2/__init__.py
new file mode 100644
index 0000000000..5217dd29f6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/__init__.py
@@ -0,0 +1,5 @@
+from .models import elbv2_backends
+from ..core.models import base_decorator
+
+elb_backend = elbv2_backends["us-east-1"]
+mock_elbv2 = base_decorator(elbv2_backends)
diff --git a/contrib/python/moto/py3/moto/elbv2/exceptions.py b/contrib/python/moto/py3/moto/elbv2/exceptions.py
new file mode 100644
index 0000000000..425a6940f8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/exceptions.py
@@ -0,0 +1,187 @@
+from moto.core.exceptions import RESTError
+
+
+class ELBClientError(RESTError):
+ code = 400
+
+ def __init__(self, error_type, message):
+ super().__init__(error_type, message, template="wrapped_single_error")
+
+
+class DuplicateTagKeysError(ELBClientError):
+ def __init__(self, cidr):
+ super().__init__(
+ "DuplicateTagKeys", "Tag key was specified more than once: {0}".format(cidr)
+ )
+
+
+class LoadBalancerNotFoundError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "LoadBalancerNotFound", "The specified load balancer does not exist."
+ )
+
+
+class ListenerNotFoundError(ELBClientError):
+ def __init__(self):
+ super().__init__("ListenerNotFound", "The specified listener does not exist.")
+
+
+class SubnetNotFoundError(ELBClientError):
+ def __init__(self):
+ super().__init__("SubnetNotFound", "The specified subnet does not exist.")
+
+
+class TargetGroupNotFoundError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "TargetGroupNotFound", "The specified target group does not exist."
+ )
+
+
+class TooManyTagsError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "TooManyTagsError",
+ "The quota for the number of tags that can be assigned to a load balancer has been reached",
+ )
+
+
+class BadHealthCheckDefinition(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "ValidationError",
+ "HealthCheck Target must begin with one of HTTP, TCP, HTTPS, SSL",
+ )
+
+
+class DuplicateListenerError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "DuplicateListener", "A listener with the specified port already exists."
+ )
+
+
+class DuplicateLoadBalancerName(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "DuplicateLoadBalancerName",
+ "A load balancer with the specified name already exists.",
+ )
+
+
+class DuplicateTargetGroupName(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "DuplicateTargetGroupName",
+ "A target group with the specified name already exists.",
+ )
+
+
+class InvalidTargetError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "InvalidTarget",
+ "The specified target does not exist or is not in the same VPC as the target group.",
+ )
+
+
+class EmptyListenersError(ELBClientError):
+ def __init__(self):
+ super().__init__("ValidationError", "Listeners cannot be empty")
+
+
+class PriorityInUseError(ELBClientError):
+ def __init__(self):
+ super().__init__("PriorityInUse", "The specified priority is in use.")
+
+
+class InvalidConditionFieldError(ELBClientError):
+ VALID_FIELDS = [
+ "path-pattern",
+ "host-header",
+ "http-header",
+ "http-request-method",
+ "query-string",
+ "source-ip",
+ ]
+
+ def __init__(self, invalid_name):
+ super().__init__(
+ "ValidationError",
+ "Condition field '%s' must be one of '[%s]'"
+ % (invalid_name, ",".join(self.VALID_FIELDS)),
+ )
+
+
+class InvalidConditionValueError(ELBClientError):
+ def __init__(self, msg):
+ super().__init__("ValidationError", msg)
+
+
+class InvalidActionTypeError(ELBClientError):
+ def __init__(self, invalid_name, index):
+ super().__init__(
+ "ValidationError",
+ "1 validation error detected: Value '%s' at 'actions.%s.member.type' failed to satisfy constraint: Member must satisfy enum value set: [forward, redirect, fixed-response]"
+ % (invalid_name, index),
+ )
+
+
+class ActionTargetGroupNotFoundError(ELBClientError):
+ def __init__(self, arn):
+ super().__init__("TargetGroupNotFound", "Target group '%s' not found" % arn)
+
+
+class ListenerOrBalancerMissingError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "ValidationError",
+ "You must specify either listener ARNs or a load balancer ARN",
+ )
+
+
+class InvalidDescribeRulesRequest(ELBClientError):
+ def __init__(self, msg):
+ super().__init__("ValidationError", msg)
+
+
+class ResourceInUseError(ELBClientError):
+ def __init__(self, msg="A specified resource is in use"):
+ super().__init__("ResourceInUse", msg)
+
+
+class RuleNotFoundError(ELBClientError):
+ def __init__(self, msg=None):
+ msg = msg or "The specified rule does not exist."
+ super().__init__("RuleNotFound", msg)
+
+
+class DuplicatePriorityError(ELBClientError):
+ def __init__(self, invalid_value):
+ super().__init__(
+ "ValidationError",
+ "Priority '%s' was provided multiple times" % invalid_value,
+ )
+
+
+class InvalidTargetGroupNameError(ELBClientError):
+ def __init__(self, msg):
+ super().__init__("ValidationError", msg)
+
+
+class InvalidModifyRuleArgumentsError(ELBClientError):
+ def __init__(self):
+ super().__init__(
+ "ValidationError", "Either conditions or actions must be specified"
+ )
+
+
+class InvalidStatusCodeActionTypeError(ELBClientError):
+ def __init__(self, msg):
+ super().__init__("ValidationError", msg)
+
+
+class InvalidLoadBalancerActionException(ELBClientError):
+ def __init__(self, msg):
+ super().__init__("InvalidLoadBalancerAction", msg)
diff --git a/contrib/python/moto/py3/moto/elbv2/models.py b/contrib/python/moto/py3/moto/elbv2/models.py
new file mode 100644
index 0000000000..69eba6f0eb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/models.py
@@ -0,0 +1,1650 @@
+import datetime
+import re
+from jinja2 import Template
+from botocore.exceptions import ParamValidationError
+from collections import OrderedDict
+from moto.core.exceptions import RESTError
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import (
+ iso_8601_datetime_with_milliseconds,
+ get_random_hex,
+ BackendDict,
+)
+from moto.ec2.models import ec2_backends
+from moto.utilities.tagging_service import TaggingService
+from .utils import make_arn_for_target_group
+from .utils import make_arn_for_load_balancer
+from .exceptions import (
+ DuplicateLoadBalancerName,
+ DuplicateListenerError,
+ DuplicateTargetGroupName,
+ InvalidTargetError,
+ ListenerNotFoundError,
+ LoadBalancerNotFoundError,
+ SubnetNotFoundError,
+ TargetGroupNotFoundError,
+ TooManyTagsError,
+ PriorityInUseError,
+ InvalidConditionFieldError,
+ InvalidConditionValueError,
+ InvalidActionTypeError,
+ ActionTargetGroupNotFoundError,
+ InvalidDescribeRulesRequest,
+ ResourceInUseError,
+ RuleNotFoundError,
+ DuplicatePriorityError,
+ InvalidTargetGroupNameError,
+ InvalidModifyRuleArgumentsError,
+ InvalidStatusCodeActionTypeError,
+ InvalidLoadBalancerActionException,
+)
+
+ALLOWED_ACTIONS = [
+ "redirect",
+ "authenticate-cognito",
+ "authenticate-oidc",
+ "fixed-response",
+ "forward",
+]
+
+
+class FakeHealthStatus(BaseModel):
+ def __init__(
+ self, instance_id, port, health_port, status, reason=None, description=None
+ ):
+ self.instance_id = instance_id
+ self.port = port
+ self.health_port = health_port
+ self.status = status
+ self.reason = reason
+ self.description = description
+
+
+class FakeTargetGroup(CloudFormationModel):
+ HTTP_CODE_REGEX = re.compile(r"(?:(?:\d+-\d+|\d+),?)+")
+
+ def __init__(
+ self,
+ name,
+ arn,
+ vpc_id,
+ protocol,
+ port,
+ protocol_version=None,
+ healthcheck_protocol=None,
+ healthcheck_port=None,
+ healthcheck_path=None,
+ healthcheck_interval_seconds=None,
+ healthcheck_timeout_seconds=None,
+ healthcheck_enabled=None,
+ healthy_threshold_count=None,
+ unhealthy_threshold_count=None,
+ matcher=None,
+ target_type=None,
+ ):
+ # TODO: default values differs when you add Network Load balancer
+ self.name = name
+ self.arn = arn
+ self.vpc_id = vpc_id
+ self.protocol = protocol
+ self.protocol_version = protocol_version or "HTTP1"
+ self.port = port
+ self.healthcheck_protocol = healthcheck_protocol or self.protocol
+ self.healthcheck_port = healthcheck_port
+ self.healthcheck_path = healthcheck_path
+ self.healthcheck_interval_seconds = healthcheck_interval_seconds or 30
+ self.healthcheck_timeout_seconds = healthcheck_timeout_seconds
+ if not healthcheck_timeout_seconds:
+ # Default depends on protocol
+ if protocol in ["TCP", "TLS"]:
+ self.healthcheck_timeout_seconds = 6
+ elif protocol in ["HTTP", "HTTPS", "GENEVE"]:
+ self.healthcheck_timeout_seconds = 5
+ else:
+ self.healthcheck_timeout_seconds = 30
+ self.healthcheck_enabled = healthcheck_enabled
+ self.healthy_threshold_count = healthy_threshold_count or 5
+ self.unhealthy_threshold_count = unhealthy_threshold_count or 2
+ self.load_balancer_arns = []
+ if self.healthcheck_protocol != "TCP":
+ self.matcher = matcher or {"HttpCode": "200"}
+ self.healthcheck_path = self.healthcheck_path or "/"
+ self.healthcheck_port = self.healthcheck_port or str(self.port)
+ self.target_type = target_type
+
+ self.attributes = {
+ "deregistration_delay.timeout_seconds": 300,
+ "stickiness.enabled": "false",
+ "load_balancing.algorithm.type": "round_robin",
+ "slow_start.duration_seconds": 0,
+ "waf.fail_open.enabled": "false",
+ }
+
+ self.targets = OrderedDict()
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ def register(self, targets):
+ for target in targets:
+ self.targets[target["id"]] = {
+ "id": target["id"],
+ "port": target.get("port", self.port),
+ }
+
+ def deregister(self, targets):
+ for target in targets:
+ t = self.targets.pop(target["id"], None)
+ if not t:
+ raise InvalidTargetError()
+
+ def deregister_terminated_instances(self, instance_ids):
+ for target_id in list(self.targets.keys()):
+ if target_id in instance_ids:
+ del self.targets[target_id]
+
+ def health_for(self, target, ec2_backend):
+ t = self.targets.get(target["id"])
+ if t is None:
+ raise InvalidTargetError()
+ if t["id"].startswith("i-"): # EC2 instance ID
+ instance = ec2_backend.get_instance_by_id(t["id"])
+ if instance.state == "stopped":
+ return FakeHealthStatus(
+ t["id"],
+ t["port"],
+ self.healthcheck_port,
+ "unused",
+ "Target.InvalidState",
+ "Target is in the stopped state",
+ )
+ return FakeHealthStatus(t["id"], t["port"], self.healthcheck_port, "healthy")
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html
+ return "AWS::ElasticLoadBalancingV2::TargetGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ elbv2_backend = elbv2_backends[region_name]
+
+ vpc_id = properties.get("VpcId")
+ protocol = properties.get("Protocol")
+ port = properties.get("Port")
+ healthcheck_protocol = properties.get("HealthCheckProtocol")
+ healthcheck_port = properties.get("HealthCheckPort")
+ healthcheck_path = properties.get("HealthCheckPath")
+ healthcheck_interval_seconds = properties.get("HealthCheckIntervalSeconds")
+ healthcheck_timeout_seconds = properties.get("HealthCheckTimeoutSeconds")
+ healthy_threshold_count = properties.get("HealthyThresholdCount")
+ unhealthy_threshold_count = properties.get("UnhealthyThresholdCount")
+ matcher = properties.get("Matcher")
+ target_type = properties.get("TargetType")
+
+ target_group = elbv2_backend.create_target_group(
+ name=resource_name,
+ vpc_id=vpc_id,
+ protocol=protocol,
+ port=port,
+ healthcheck_protocol=healthcheck_protocol,
+ healthcheck_port=healthcheck_port,
+ healthcheck_path=healthcheck_path,
+ healthcheck_interval_seconds=healthcheck_interval_seconds,
+ healthcheck_timeout_seconds=healthcheck_timeout_seconds,
+ healthy_threshold_count=healthy_threshold_count,
+ unhealthy_threshold_count=unhealthy_threshold_count,
+ matcher=matcher,
+ target_type=target_type,
+ )
+ return target_group
+
+
+class FakeListener(CloudFormationModel):
+ def __init__(
+ self,
+ load_balancer_arn,
+ arn,
+ protocol,
+ port,
+ ssl_policy,
+ certificate,
+ default_actions,
+ alpn_policy,
+ ):
+ self.load_balancer_arn = load_balancer_arn
+ self.arn = arn
+ self.protocol = (protocol or "").upper()
+ self.port = port
+ self.ssl_policy = ssl_policy
+ self.certificate = certificate
+ self.certificates = [certificate] if certificate is not None else []
+ self.default_actions = default_actions
+ self.alpn_policy = alpn_policy or []
+ self._non_default_rules = OrderedDict()
+ self._default_rule = OrderedDict()
+ self._default_rule[0] = FakeRule(
+ listener_arn=self.arn,
+ conditions=[],
+ priority="default",
+ actions=default_actions,
+ is_default=True,
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @property
+ def rules(self):
+ return OrderedDict(
+ list(self._non_default_rules.items()) + list(self._default_rule.items())
+ )
+
+ def remove_rule(self, arn):
+ self._non_default_rules.pop(arn)
+
+ def register(self, arn, rule):
+ self._non_default_rules[arn] = rule
+ sorted(self._non_default_rules.values(), key=lambda x: x.priority)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html
+ return "AWS::ElasticLoadBalancingV2::Listener"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ elbv2_backend = elbv2_backends[region_name]
+ load_balancer_arn = properties.get("LoadBalancerArn")
+ protocol = properties.get("Protocol")
+ port = properties.get("Port")
+ ssl_policy = properties.get("SslPolicy")
+ certificates = properties.get("Certificates")
+
+ default_actions = elbv2_backend.convert_and_validate_properties(properties)
+ certificates = elbv2_backend.convert_and_validate_certificates(certificates)
+ listener = elbv2_backend.create_listener(
+ load_balancer_arn, protocol, port, ssl_policy, certificates, default_actions
+ )
+ return listener
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ elbv2_backend = elbv2_backends[region_name]
+ protocol = properties.get("Protocol")
+ port = properties.get("Port")
+ ssl_policy = properties.get("SslPolicy")
+ certificates = properties.get("Certificates")
+
+ default_actions = elbv2_backend.convert_and_validate_properties(properties)
+ certificates = elbv2_backend.convert_and_validate_certificates(certificates)
+ listener = elbv2_backend.modify_listener(
+ original_resource.arn,
+ port,
+ protocol,
+ ssl_policy,
+ certificates,
+ default_actions,
+ )
+ return listener
+
+
+class FakeListenerRule(CloudFormationModel):
+ def __init__(self, listener_arn, arn, conditions, priority, actions):
+ self.listener_arn = listener_arn
+ self.arn = arn
+ self.conditions = conditions
+ self.actions = actions
+ self.priority = priority
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html
+ return "AWS::ElasticLoadBalancingV2::ListenerRule"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ elbv2_backend = elbv2_backends[region_name]
+ listener_arn = properties.get("ListenerArn")
+ priority = properties.get("Priority")
+ conditions = properties.get("Conditions")
+
+ actions = elbv2_backend.convert_and_validate_action_properties(properties)
+ listener_rule = elbv2_backend.create_rule(
+ listener_arn, conditions, priority, actions
+ )
+ return listener_rule
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+
+ properties = cloudformation_json["Properties"]
+
+ elbv2_backend = elbv2_backends[region_name]
+ conditions = properties.get("Conditions")
+
+ actions = elbv2_backend.convert_and_validate_action_properties(properties)
+ listener_rule = elbv2_backend.modify_rule(
+ original_resource.arn, conditions, actions
+ )
+ return listener_rule
+
+
+class FakeRule(BaseModel):
+ def __init__(self, listener_arn, conditions, priority, actions, is_default):
+ self.listener_arn = listener_arn
+ self.arn = listener_arn.replace(":listener/", ":listener-rule/") + "/%s" % (
+ id(self)
+ )
+ self.conditions = conditions
+ self.priority = priority # int or 'default'
+ self.actions = actions
+ self.is_default = is_default
+
+
+class FakeAction(BaseModel):
+ def __init__(self, data):
+ self.data = data
+ self.type = data.get("Type")
+
+ if "ForwardConfig" in self.data:
+ if "TargetGroupStickinessConfig" not in self.data["ForwardConfig"]:
+ self.data["ForwardConfig"]["TargetGroupStickinessConfig"] = {
+ "Enabled": "false"
+ }
+
+ def to_xml(self):
+ template = Template(
+ """<Type>{{ action.type }}</Type>
+ {% if "Order" in action.data %}
+ <Order>{{ action.data["Order"] }}</Order>
+ {% endif %}
+ {% if action.type == "forward" and "ForwardConfig" in action.data %}
+ <ForwardConfig>
+ <TargetGroups>
+ {% for target_group in action.data["ForwardConfig"]["TargetGroups"] %}
+ <member>
+ <TargetGroupArn>{{ target_group["TargetGroupArn"] }}</TargetGroupArn>
+ <Weight>{{ target_group["Weight"] }}</Weight>
+ </member>
+ {% endfor %}
+ </TargetGroups>
+ <TargetGroupStickinessConfig>
+ <Enabled>{{ action.data["ForwardConfig"]["TargetGroupStickinessConfig"]["Enabled"] }}</Enabled>
+ {% if "DurationSeconds" in action.data["ForwardConfig"]["TargetGroupStickinessConfig"] %}
+ <DurationSeconds>{{ action.data["ForwardConfig"]["TargetGroupStickinessConfig"]["DurationSeconds"] }}</DurationSeconds>
+ {% endif %}
+ </TargetGroupStickinessConfig>
+ </ForwardConfig>
+ {% endif %}
+ {% if action.type == "forward" and "ForwardConfig" not in action.data %}
+ <TargetGroupArn>{{ action.data["TargetGroupArn"] }}</TargetGroupArn>
+ {% elif action.type == "redirect" %}
+ <RedirectConfig>
+ <Protocol>{{ action.data["RedirectConfig"]["Protocol"] }}</Protocol>
+ <Port>{{ action.data["RedirectConfig"]["Port"] }}</Port>
+ <StatusCode>{{ action.data["RedirectConfig"]["StatusCode"] }}</StatusCode>
+ {% if action.data["RedirectConfig"]["Host"] %}<Host>{{ action.data["RedirectConfig"]["Host"] }}</Host>{% endif %}
+ {% if action.data["RedirectConfig"]["Path"] %}<Path>{{ action.data["RedirectConfig"]["Path"] }}</Path>{% endif %}
+ {% if action.data["RedirectConfig"]["Query"] %}<Query>{{ action.data["RedirectConfig"]["Query"] }}</Query>{% endif %}
+ </RedirectConfig>
+ {% elif action.type == "authenticate-cognito" %}
+ <AuthenticateCognitoConfig>
+ <UserPoolArn>{{ action.data["AuthenticateCognitoConfig"]["UserPoolArn"] }}</UserPoolArn>
+ <UserPoolClientId>{{ action.data["AuthenticateCognitoConfig"]["UserPoolClientId"] }}</UserPoolClientId>
+ <UserPoolDomain>{{ action.data["AuthenticateCognitoConfig"]["UserPoolDomain"] }}</UserPoolDomain>
+ {% if "SessionCookieName" in action.data["AuthenticateCognitoConfig"] %}
+ <SessionCookieName>{{ action.data["AuthenticateCognitoConfig"]["SessionCookieName"] }}</SessionCookieName>
+ {% endif %}
+ {% if "Scope" in action.data["AuthenticateCognitoConfig"] %}
+ <Scope>{{ action.data["AuthenticateCognitoConfig"]["Scope"] }}</Scope>
+ {% endif %}
+ {% if "SessionTimeout" in action.data["AuthenticateCognitoConfig"] %}
+ <SessionTimeout>{{ action.data["AuthenticateCognitoConfig"]["SessionTimeout"] }}</SessionTimeout>
+ {% endif %}
+ {% if action.data["AuthenticateCognitoConfig"].get("AuthenticationRequestExtraParams") %}
+ <AuthenticationRequestExtraParams>
+ {% for entry in action.data["AuthenticateCognitoConfig"].get("AuthenticationRequestExtraParams", {}).get("entry", {}).values() %}
+ <member>
+ <key>{{ entry["key"] }}</key>
+ <value>{{ entry["value"] }}</value>
+ </member>
+ {% endfor %}
+ </AuthenticationRequestExtraParams>
+ {% endif %}
+ {% if "OnUnauthenticatedRequest" in action.data["AuthenticateCognitoConfig"] %}
+ <OnUnauthenticatedRequest>{{ action.data["AuthenticateCognitoConfig"]["OnUnauthenticatedRequest"] }}</OnUnauthenticatedRequest>
+ {% endif %}
+ </AuthenticateCognitoConfig>
+ {% elif action.type == "authenticate-oidc" %}
+ <AuthenticateOidcConfig>
+ <AuthorizationEndpoint>{{ action.data["AuthenticateOidcConfig"]["AuthorizationEndpoint"] }}</AuthorizationEndpoint>
+ <ClientId>{{ action.data["AuthenticateOidcConfig"]["ClientId"] }}</ClientId>
+ {% if "ClientSecret" in action.data["AuthenticateOidcConfig"] %}
+ <ClientSecret>{{ action.data["AuthenticateOidcConfig"]["ClientSecret"] }}</ClientSecret>
+ {% endif %}
+ <Issuer>{{ action.data["AuthenticateOidcConfig"]["Issuer"] }}</Issuer>
+ <TokenEndpoint>{{ action.data["AuthenticateOidcConfig"]["TokenEndpoint"] }}</TokenEndpoint>
+ <UserInfoEndpoint>{{ action.data["AuthenticateOidcConfig"]["UserInfoEndpoint"] }}</UserInfoEndpoint>
+ {% if "OnUnauthenticatedRequest" in action.data["AuthenticateOidcConfig"] %}
+ <OnUnauthenticatedRequest>{{ action.data["AuthenticateOidcConfig"]["OnUnauthenticatedRequest"] }}</OnUnauthenticatedRequest>
+ {% endif %}
+ {% if "UseExistingClientSecret" in action.data["AuthenticateOidcConfig"] %}
+ <UseExistingClientSecret>{{ action.data["AuthenticateOidcConfig"]["UseExistingClientSecret"] }}</UseExistingClientSecret>
+ {% endif %}
+ {% if "SessionTimeout" in action.data["AuthenticateOidcConfig"] %}
+ <SessionTimeout>{{ action.data["AuthenticateOidcConfig"]["SessionTimeout"] }}</SessionTimeout>
+ {% endif %}
+ {% if "SessionCookieName" in action.data["AuthenticateOidcConfig"] %}
+ <SessionCookieName>{{ action.data["AuthenticateOidcConfig"]["SessionCookieName"] }}</SessionCookieName>
+ {% endif %}
+ {% if "Scope" in action.data["AuthenticateOidcConfig"] %}
+ <Scope>{{ action.data["AuthenticateOidcConfig"]["Scope"] }}</Scope>
+ {% endif %}
+ {% if action.data["AuthenticateOidcConfig"].get("AuthenticationRequestExtraParams") %}
+ <AuthenticationRequestExtraParams>
+ {% for entry in action.data["AuthenticateOidcConfig"].get("AuthenticationRequestExtraParams", {}).get("entry", {}).values() %}
+ <member><key>{{ entry["key"] }}</key><value>{{ entry["value"] }}</value></member>
+ {% endfor %}
+ </AuthenticationRequestExtraParams>
+ {% endif %}
+ </AuthenticateOidcConfig>
+ {% elif action.type == "fixed-response" %}
+ <FixedResponseConfig>
+ <ContentType>{{ action.data["FixedResponseConfig"]["ContentType"] }}</ContentType>
+ <MessageBody>{{ action.data["FixedResponseConfig"]["MessageBody"] }}</MessageBody>
+ <StatusCode>{{ action.data["FixedResponseConfig"]["StatusCode"] }}</StatusCode>
+ </FixedResponseConfig>
+ {% endif %}
+ """
+ )
+ return template.render(action=self)
+
+
+class FakeBackend(BaseModel):
+ def __init__(self, instance_port):
+ self.instance_port = instance_port
+ self.policy_names = []
+
+ def __repr__(self):
+ return "FakeBackend(inp: %s, policies: %s)" % (
+ self.instance_port,
+ self.policy_names,
+ )
+
+
+class FakeLoadBalancer(CloudFormationModel):
+ VALID_ATTRS = {
+ "access_logs.s3.enabled",
+ "access_logs.s3.bucket",
+ "access_logs.s3.prefix",
+ "deletion_protection.enabled",
+ "idle_timeout.timeout_seconds",
+ "ipv6.deny_all_igw_traffic",
+ "load_balancing.cross_zone.enabled",
+ "routing.http.desync_mitigation_mode",
+ "routing.http.drop_invalid_header_fields.enabled",
+ "routing.http.x_amzn_tls_version_and_cipher_suite.enabled",
+ "routing.http.xff_client_port.enabled",
+ "routing.http2.enabled",
+ "waf.fail_open.enabled",
+ }
+
+ def __init__(
+ self,
+ name,
+ security_groups,
+ subnets,
+ vpc_id,
+ arn,
+ dns_name,
+ state,
+ scheme="internet-facing",
+ loadbalancer_type=None,
+ ):
+ self.name = name
+ self.created_time = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+ self.scheme = scheme
+ self.security_groups = security_groups
+ self.subnets = subnets or []
+ self.vpc_id = vpc_id
+ self.listeners = OrderedDict()
+ self.tags = {}
+ self.arn = arn
+ self.dns_name = dns_name
+ self.state = state
+ self.loadbalancer_type = loadbalancer_type or "application"
+
+ self.stack = "ipv4"
+ self.attrs = {
+ # "access_logs.s3.enabled": "false", # commented out for TF compatibility
+ "access_logs.s3.bucket": None,
+ "access_logs.s3.prefix": None,
+ "deletion_protection.enabled": "false",
+ # "idle_timeout.timeout_seconds": "60", # commented out for TF compatibility
+ }
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ def activate(self):
+ if self.state == "provisioning":
+ self.state = "active"
+
+ def delete(self, region):
+ """Not exposed as part of the ELB API - used for CloudFormation."""
+ elbv2_backends[region].delete_load_balancer(self.arn)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html
+ return "AWS::ElasticLoadBalancingV2::LoadBalancer"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ elbv2_backend = elbv2_backends[region_name]
+
+ security_groups = properties.get("SecurityGroups")
+ subnet_ids = properties.get("Subnets")
+ scheme = properties.get("Scheme", "internet-facing")
+
+ load_balancer = elbv2_backend.create_load_balancer(
+ resource_name, security_groups, subnet_ids, scheme=scheme
+ )
+ return load_balancer
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in [
+ "DNSName",
+ "LoadBalancerName",
+ "CanonicalHostedZoneID",
+ "LoadBalancerFullName",
+ "SecurityGroups",
+ ]
+
+ def get_cfn_attribute(self, attribute_name):
+ """
+ Implemented attributes:
+ * DNSName
+ * LoadBalancerName
+
+ Not implemented:
+ * CanonicalHostedZoneID
+ * LoadBalancerFullName
+ * SecurityGroups
+
+ This method is similar to models.py:FakeLoadBalancer.get_cfn_attribute()
+ """
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ not_implemented_yet = [
+ "CanonicalHostedZoneID",
+ "LoadBalancerFullName",
+ "SecurityGroups",
+ ]
+ if attribute_name == "DNSName":
+ return self.dns_name
+ elif attribute_name == "LoadBalancerName":
+ return self.name
+ elif attribute_name in not_implemented_yet:
+ raise NotImplementedError(
+ '"Fn::GetAtt" : [ "{0}" , "%s" ]"' % attribute_name
+ )
+ else:
+ raise UnformattedGetAttTemplateException()
+
+
+class ELBv2Backend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.target_groups = OrderedDict()
+ self.load_balancers = OrderedDict()
+ self.tagging_service = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "elasticloadbalancing"
+ )
+
+ @property
+ def ec2_backend(self):
+ """
+ EC2 backend
+
+ :return: EC2 Backend
+ :rtype: moto.ec2.models.EC2Backend
+ """
+ return ec2_backends[self.region_name]
+
+ def create_load_balancer(
+ self,
+ name,
+ security_groups,
+ subnet_ids,
+ subnet_mappings=None,
+ scheme="internet-facing",
+ loadbalancer_type=None,
+ tags=None,
+ ):
+ vpc_id = None
+ subnets = []
+ state = "provisioning"
+
+ if not subnet_ids and not subnet_mappings:
+ raise SubnetNotFoundError()
+ for subnet_id in subnet_ids:
+ subnet = self.ec2_backend.get_subnet(subnet_id)
+ if subnet is None:
+ raise SubnetNotFoundError()
+ subnets.append(subnet)
+ for subnet in subnet_mappings or []:
+ subnet_id = subnet["SubnetId"]
+ subnet = self.ec2_backend.get_subnet(subnet_id)
+ if subnet is None:
+ raise SubnetNotFoundError()
+ subnets.append(subnet)
+
+ vpc_id = subnets[0].vpc_id
+ arn = make_arn_for_load_balancer(
+ account_id=get_account_id(), name=name, region_name=self.region_name
+ )
+ dns_name = "%s-1.%s.elb.amazonaws.com" % (name, self.region_name)
+
+ if arn in self.load_balancers:
+ raise DuplicateLoadBalancerName()
+
+ new_load_balancer = FakeLoadBalancer(
+ name=name,
+ security_groups=security_groups,
+ arn=arn,
+ scheme=scheme,
+ subnets=subnets,
+ vpc_id=vpc_id,
+ dns_name=dns_name,
+ state=state,
+ loadbalancer_type=loadbalancer_type,
+ )
+ self.load_balancers[arn] = new_load_balancer
+ self.tagging_service.tag_resource(arn, tags)
+ return new_load_balancer
+
+ def convert_and_validate_action_properties(self, properties):
+
+ # transform Actions to confirm with the rest of the code and XML templates
+ default_actions = []
+ for i, action in enumerate(properties["Actions"]):
+ action_type = action["Type"]
+ if action_type in ALLOWED_ACTIONS:
+ default_actions.append(action)
+ else:
+ raise InvalidActionTypeError(action_type, i + 1)
+ return default_actions
+
+ def create_rule(self, listener_arn, conditions, priority, actions, tags=None):
+ actions = [FakeAction(action) for action in actions]
+ listeners = self.describe_listeners(None, [listener_arn])
+ if not listeners:
+ raise ListenerNotFoundError()
+ listener = listeners[0]
+
+ # validate conditions
+ # see: https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html
+ self._validate_conditions(conditions)
+
+ # TODO: check QueryStringConfig condition
+ # TODO: check HttpRequestMethodConfig condition
+ # TODO: check SourceIpConfig condition
+ # TODO: check pattern of value for 'host-header'
+ # TODO: check pattern of value for 'path-pattern'
+
+ # validate Priority
+ for rule in listener.rules.values():
+ if rule.priority == priority:
+ raise PriorityInUseError()
+
+ self._validate_actions(actions)
+ arn = listener_arn.replace(":listener/", ":listener-rule/")
+ arn += "/%s" % (get_random_hex(16))
+
+ # TODO: check for error 'TooManyRegistrationsForTargetId'
+ # TODO: check for error 'TooManyRules'
+
+ # create rule
+ rule = FakeListenerRule(listener.arn, arn, conditions, priority, actions)
+ listener.register(arn, rule)
+ self.tagging_service.tag_resource(arn, tags)
+ return rule
+
+ def _validate_conditions(self, conditions):
+ for condition in conditions:
+ if "Field" in condition:
+ field = condition["Field"]
+ if field not in [
+ "host-header",
+ "http-header",
+ "http-request-method",
+ "path-pattern",
+ "query-string",
+ "source-ip",
+ ]:
+ raise InvalidConditionFieldError(field)
+ if "Values" in condition and field not in [
+ "host-header",
+ "path-pattern",
+ ]:
+ raise InvalidConditionValueError(
+ "The 'Values' field is not compatible with '%s'" % field
+ )
+ else:
+ method_name = "_validate_" + field.replace("-", "_") + "_condition"
+ func = getattr(self, method_name)
+ func(condition)
+
+ def _validate_host_header_condition(self, condition):
+ values = None
+ if "HostHeaderConfig" in condition:
+ values = condition["HostHeaderConfig"]["Values"]
+ elif "Values" in condition:
+ values = condition["Values"]
+ if len(values) > 1:
+ raise InvalidConditionValueError(
+ "The 'host-header' field contains too many values; the limit is '1'"
+ )
+ if values is None or len(values) == 0:
+ raise InvalidConditionValueError("A condition value must be specified")
+ for value in values:
+ if len(value) > 128:
+ raise InvalidConditionValueError(
+ "The 'host-header' value is too long; the limit is '128'"
+ )
+
+ def _validate_http_header_condition(self, condition):
+ if "HttpHeaderConfig" in condition:
+ config = condition["HttpHeaderConfig"]
+ name = config.get("HttpHeaderName")
+ if len(name) > 40:
+ raise InvalidConditionValueError(
+ "The 'HttpHeaderName' value is too long; the limit is '40'"
+ )
+ values = config["Values"]
+ for value in values:
+ if len(value) > 128:
+ raise InvalidConditionValueError(
+ "The 'http-header' value is too long; the limit is '128'"
+ )
+ else:
+ raise InvalidConditionValueError(
+ "A 'HttpHeaderConfig' must be specified with 'http-header'"
+ )
+
+ def _validate_http_request_method_condition(self, condition):
+ if "HttpRequestMethodConfig" in condition:
+ for value in condition["HttpRequestMethodConfig"]["Values"]:
+ if len(value) > 40:
+ raise InvalidConditionValueError(
+ "The 'http-request-method' value is too long; the limit is '40'"
+ )
+ if not re.match("[A-Z_-]+", value):
+ raise InvalidConditionValueError(
+ "The 'http-request-method' value is invalid; the allowed characters are A-Z, hyphen and underscore"
+ )
+ else:
+ raise InvalidConditionValueError(
+ "A 'HttpRequestMethodConfig' must be specified with 'http-request-method'"
+ )
+
+ def _validate_path_pattern_condition(self, condition):
+ values = None
+ if "PathPatternConfig" in condition:
+ values = condition["PathPatternConfig"]["Values"]
+ elif "Values" in condition:
+ values = condition["Values"]
+ if len(values) > 1:
+ raise InvalidConditionValueError(
+ "The 'path-pattern' field contains too many values; the limit is '1'"
+ )
+ if values is None or len(values) == 0:
+ raise InvalidConditionValueError("A condition value must be specified")
+ if condition.get("Values") and condition.get("PathPatternConfig"):
+ raise InvalidConditionValueError(
+ "You cannot provide both Values and 'PathPatternConfig' for a condition of type 'path-pattern'"
+ )
+ for value in values:
+ if len(value) > 128:
+ raise InvalidConditionValueError(
+ "The 'path-pattern' value is too long; the limit is '128'"
+ )
+
+ def _validate_source_ip_condition(self, condition):
+ if "SourceIpConfig" in condition:
+ values = condition["SourceIpConfig"].get("Values", [])
+ if len(values) == 0:
+ raise InvalidConditionValueError(
+ "A 'source-ip' value must be specified"
+ )
+ else:
+ raise InvalidConditionValueError(
+ "A 'SourceIpConfig' must be specified with 'source-ip'"
+ )
+
+ def _validate_query_string_condition(self, condition):
+ if "QueryStringConfig" in condition:
+ config = condition["QueryStringConfig"]
+ values = config["Values"]
+ for value in values:
+ if "Value" not in value:
+ raise InvalidConditionValueError(
+ "A 'Value' must be specified in 'QueryStringKeyValuePair'"
+ )
+ if "Key" in value and len(value["Key"]) > 128:
+ raise InvalidConditionValueError(
+ "The 'Key' value is too long; the limit is '128'"
+ )
+ if len(value["Value"]) > 128:
+ raise InvalidConditionValueError(
+ "The 'Value' value is too long; the limit is '128'"
+ )
+ else:
+ raise InvalidConditionValueError(
+ "A 'QueryStringConfig' must be specified with 'query-string'"
+ )
+
+ def _get_target_group_arns_from(self, action_data):
+ if "TargetGroupArn" in action_data:
+ return [action_data["TargetGroupArn"]]
+ elif "ForwardConfig" in action_data:
+ return [
+ tg["TargetGroupArn"]
+ for tg in action_data["ForwardConfig"].get("TargetGroups", [])
+ ]
+ else:
+ return []
+
+ def _validate_actions(self, actions):
+ # validate Actions
+ target_group_arns = [
+ target_group.arn for target_group in self.target_groups.values()
+ ]
+ for i, action in enumerate(actions):
+ index = i + 1
+ action_type = action.type
+ if action_type == "forward":
+ found_arns = self._get_target_group_arns_from(action_data=action.data)
+ for target_group_arn in found_arns:
+ if target_group_arn not in target_group_arns:
+ raise ActionTargetGroupNotFoundError(target_group_arn)
+ elif action_type == "fixed-response":
+ self._validate_fixed_response_action(action, i, index)
+ elif action_type in [
+ "redirect",
+ "authenticate-cognito",
+ "authenticate-oidc",
+ ]:
+ pass
+ # pass if listener rule has forward_config as an Action property
+ elif action_type == "forward" and "ForwardConfig" in action.data.keys():
+ pass
+ else:
+ raise InvalidActionTypeError(action_type, index)
+
+ def _validate_fixed_response_action(self, action, i, index):
+ status_code = action.data.get("FixedResponseConfig", {}).get("StatusCode")
+ if status_code is None:
+ raise ParamValidationError(
+ report='Missing required parameter in Actions[%s].FixedResponseConfig: "StatusCode"'
+ % i
+ )
+ expression = r"^(2|4|5)\d\d$"
+ if not re.match(expression, status_code):
+ raise InvalidStatusCodeActionTypeError(
+ "1 validation error detected: Value '{}' at 'actions.{}.member.fixedResponseConfig.statusCode' failed to satisfy constraint: \
+Member must satisfy regular expression pattern: {}".format(
+ status_code, index, expression
+ )
+ )
+ content_type = action.data["FixedResponseConfig"].get("ContentType")
+ if content_type and content_type not in [
+ "text/plain",
+ "text/css",
+ "text/html",
+ "application/javascript",
+ "application/json",
+ ]:
+ raise InvalidLoadBalancerActionException(
+ "The ContentType must be one of:'text/html', 'application/json', 'application/javascript', 'text/css', 'text/plain'"
+ )
+
+ def create_target_group(self, name, **kwargs):
+ if len(name) > 32:
+ raise InvalidTargetGroupNameError(
+ "Target group name '{}' cannot be longer than '32' characters".format(
+ name
+ )
+ )
+ if not re.match(r"^[a-zA-Z0-9\-]+$", name):
+ raise InvalidTargetGroupNameError(
+ "Target group name '{}' can only contain characters that are alphanumeric characters or hyphens(-)".format(
+ name
+ )
+ )
+
+ # undocumented validation
+ if not re.match(r"(?!.*--)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$", name):
+ raise InvalidTargetGroupNameError(
+ "1 validation error detected: Value '%s' at 'targetGroup.targetGroupArn.targetGroupName' failed to satisfy constraint: Member must satisfy regular expression pattern: (?!.*--)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$"
+ % name
+ )
+
+ if name.startswith("-") or name.endswith("-"):
+ raise InvalidTargetGroupNameError(
+ "Target group name '%s' cannot begin or end with '-'" % name
+ )
+ for target_group in self.target_groups.values():
+ if target_group.name == name:
+ raise DuplicateTargetGroupName()
+
+ valid_protocols = ["HTTPS", "HTTP", "TCP", "TLS", "UDP", "TCP_UDP", "GENEVE"]
+ if (
+ kwargs.get("healthcheck_protocol")
+ and kwargs["healthcheck_protocol"] not in valid_protocols
+ ):
+ raise InvalidConditionValueError(
+ "Value {} at 'healthCheckProtocol' failed to satisfy constraint: "
+ "Member must satisfy enum value set: {}".format(
+ kwargs["healthcheck_protocol"], valid_protocols
+ )
+ )
+ if kwargs.get("protocol") and kwargs["protocol"] not in valid_protocols:
+ raise InvalidConditionValueError(
+ "Value {} at 'protocol' failed to satisfy constraint: "
+ "Member must satisfy enum value set: {}".format(
+ kwargs["protocol"], valid_protocols
+ )
+ )
+
+ if (
+ kwargs.get("matcher")
+ and kwargs["matcher"].get("HttpCode")
+ and FakeTargetGroup.HTTP_CODE_REGEX.match(kwargs["matcher"]["HttpCode"])
+ is None
+ ):
+ raise RESTError(
+ "InvalidParameterValue",
+ "HttpCode must be like 200 | 200-399 | 200,201 ...",
+ )
+
+ arn = make_arn_for_target_group(
+ account_id=get_account_id(), name=name, region_name=self.region_name
+ )
+ tags = kwargs.pop("tags", None)
+ target_group = FakeTargetGroup(name, arn, **kwargs)
+ self.target_groups[target_group.arn] = target_group
+ if tags:
+ self.add_tags(resource_arns=[target_group.arn], tags=tags)
+ return target_group
+
+ def modify_target_group_attributes(self, target_group_arn, attributes):
+ target_group = self.target_groups.get(target_group_arn)
+ if not target_group:
+ raise TargetGroupNotFoundError()
+
+ target_group.attributes.update(attributes)
+
+ def convert_and_validate_certificates(self, certificates):
+
+ # transform default certificate to conform with the rest of the code and XML templates
+ for cert in certificates or []:
+ cert["certificate_arn"] = cert["CertificateArn"]
+
+ return certificates
+
+ def convert_and_validate_properties(self, properties):
+
+ # transform default actions to confirm with the rest of the code and XML templates
+ # Caller: CF create/update for type "AWS::ElasticLoadBalancingV2::Listener"
+ default_actions = []
+ for i, action in enumerate(properties["DefaultActions"]):
+ action_type = action["Type"]
+ if action_type == "forward":
+ default_actions.append(
+ {"Type": action_type, "TargetGroupArn": action["TargetGroupArn"]}
+ )
+ elif action_type in ALLOWED_ACTIONS:
+ default_actions.append(action)
+ else:
+ raise InvalidActionTypeError(action_type, i + 1)
+ return default_actions
+
+ def create_listener(
+ self,
+ load_balancer_arn,
+ protocol,
+ port,
+ ssl_policy,
+ certificate,
+ default_actions,
+ alpn_policy=None,
+ tags=None,
+ ):
+ default_actions = [FakeAction(action) for action in default_actions]
+ balancer = self.load_balancers.get(load_balancer_arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+ if port in balancer.listeners:
+ raise DuplicateListenerError()
+
+ self._validate_actions(default_actions)
+
+ arn = load_balancer_arn.replace(":loadbalancer/", ":listener/") + "/%s%s" % (
+ port,
+ id(self),
+ )
+ listener = FakeListener(
+ load_balancer_arn,
+ arn,
+ protocol,
+ port,
+ ssl_policy,
+ certificate,
+ default_actions,
+ alpn_policy,
+ )
+ balancer.listeners[listener.arn] = listener
+ for action in default_actions:
+ if action.type == "forward":
+ found_arns = self._get_target_group_arns_from(action_data=action.data)
+ for arn in found_arns:
+ target_group = self.target_groups[arn]
+ target_group.load_balancer_arns.append(load_balancer_arn)
+
+ self.tagging_service.tag_resource(listener.arn, tags)
+
+ return listener
+
+ def describe_load_balancers(self, arns, names):
+ balancers = self.load_balancers.values()
+ arns = arns or []
+ names = names or []
+ if not arns and not names:
+ for balancer in balancers:
+ balancer.activate()
+ return balancers
+
+ matched_balancers = []
+ matched_balancer = None
+
+ for arn in arns:
+ for balancer in balancers:
+ balancer.activate()
+ if balancer.arn == arn:
+ matched_balancer = balancer
+ if matched_balancer is None:
+ raise LoadBalancerNotFoundError()
+ elif matched_balancer not in matched_balancers:
+ matched_balancers.append(matched_balancer)
+
+ for name in names:
+ for balancer in balancers:
+ balancer.activate()
+ if balancer.name == name:
+ matched_balancer = balancer
+ if matched_balancer is None:
+ raise LoadBalancerNotFoundError()
+ elif matched_balancer not in matched_balancers:
+ matched_balancers.append(matched_balancer)
+
+ return matched_balancers
+
+ def describe_rules(self, listener_arn, rule_arns):
+ if listener_arn is None and not rule_arns:
+ raise InvalidDescribeRulesRequest(
+ "You must specify either listener rule ARNs or a listener ARN"
+ )
+ if listener_arn is not None and rule_arns is not None:
+ raise InvalidDescribeRulesRequest(
+ "Listener rule ARNs and a listener ARN cannot be specified at the same time"
+ )
+ if listener_arn:
+ listener = self.describe_listeners(None, [listener_arn])[0]
+ return listener.rules.values()
+
+ # search for rule arns
+ matched_rules = []
+ for load_balancer_arn in self.load_balancers:
+ listeners = self.load_balancers.get(load_balancer_arn).listeners.values()
+ for listener in listeners:
+ for rule in listener.rules.values():
+ if rule.arn in rule_arns:
+ matched_rules.append(rule)
+ if len(matched_rules) != len(rule_arns):
+ raise RuleNotFoundError("One or more rules not found")
+ return matched_rules
+
+ def describe_target_groups(self, load_balancer_arn, target_group_arns, names):
+ if load_balancer_arn:
+ if load_balancer_arn not in self.load_balancers:
+ raise LoadBalancerNotFoundError()
+ return [
+ tg
+ for tg in self.target_groups.values()
+ if load_balancer_arn in tg.load_balancer_arns
+ ]
+
+ if target_group_arns:
+ try:
+ return [self.target_groups[arn] for arn in target_group_arns]
+ except KeyError:
+ raise TargetGroupNotFoundError()
+ if names:
+ matched = []
+ for name in names:
+ found = None
+ for target_group in self.target_groups.values():
+ if target_group.name == name:
+ found = target_group
+ if not found:
+ raise TargetGroupNotFoundError()
+ matched.append(found)
+ return matched
+
+ return self.target_groups.values()
+
+ def describe_listeners(self, load_balancer_arn, listener_arns):
+ if load_balancer_arn:
+ if load_balancer_arn not in self.load_balancers:
+ raise LoadBalancerNotFoundError()
+ return self.load_balancers.get(load_balancer_arn).listeners.values()
+
+ matched = []
+ for load_balancer in self.load_balancers.values():
+ for listener_arn in listener_arns:
+ listener = load_balancer.listeners.get(listener_arn)
+ if listener:
+ matched.append(listener)
+ if listener_arns and len(matched) == 0:
+ raise ListenerNotFoundError()
+ return matched
+
+ def delete_load_balancer(self, arn):
+ self.load_balancers.pop(arn, None)
+
+ def delete_rule(self, arn):
+ for load_balancer_arn in self.load_balancers:
+ listeners = self.load_balancers.get(load_balancer_arn).listeners.values()
+ for listener in listeners:
+ for rule in listener.rules.values():
+ if rule.arn == arn:
+ listener.remove_rule(rule.arn)
+ return
+
+ # should raise RuleNotFound Error according to the AWS API doc
+ # however, boto3 does't raise error even if rule is not found
+
+ def delete_target_group(self, target_group_arn):
+ if target_group_arn not in self.target_groups:
+ raise TargetGroupNotFoundError()
+
+ target_group = self.target_groups[target_group_arn]
+ if target_group:
+ if self._any_listener_using(target_group_arn):
+ raise ResourceInUseError(
+ "The target group '{}' is currently in use by a listener or a rule".format(
+ target_group_arn
+ )
+ )
+ del self.target_groups[target_group_arn]
+ return target_group
+
+ def delete_listener(self, listener_arn):
+ for load_balancer in self.load_balancers.values():
+ listener = load_balancer.listeners.pop(listener_arn, None)
+ if listener:
+ return listener
+ raise ListenerNotFoundError()
+
+ def modify_rule(self, rule_arn, conditions, actions):
+ actions = [FakeAction(action) for action in actions]
+ # if conditions or actions is empty list, do not update the attributes
+ if not conditions and not actions:
+ raise InvalidModifyRuleArgumentsError()
+ rules = self.describe_rules(listener_arn=None, rule_arns=[rule_arn])
+ if not rules:
+ raise RuleNotFoundError()
+ rule = rules[0]
+
+ self._validate_conditions(conditions)
+ # TODO: check pattern of value for 'host-header'
+ # TODO: check pattern of value for 'path-pattern'
+
+ # validate Actions
+ self._validate_actions(actions)
+
+ # TODO: check for error 'TooManyRegistrationsForTargetId'
+ # TODO: check for error 'TooManyRules'
+
+ # modify rule
+ if conditions:
+ rule.conditions = conditions
+ if actions:
+ rule.actions = actions
+ return rule
+
+ def register_targets(self, target_group_arn, instances):
+ target_group = self.target_groups.get(target_group_arn)
+ if target_group is None:
+ raise TargetGroupNotFoundError()
+ target_group.register(instances)
+
+ def deregister_targets(self, target_group_arn, instances):
+ target_group = self.target_groups.get(target_group_arn)
+ if target_group is None:
+ raise TargetGroupNotFoundError()
+ target_group.deregister(instances)
+
+ def describe_target_health(self, target_group_arn, targets):
+ target_group = self.target_groups.get(target_group_arn)
+ if target_group is None:
+ raise TargetGroupNotFoundError()
+
+ if not targets:
+ targets = target_group.targets.values()
+ return [target_group.health_for(target, self.ec2_backend) for target in targets]
+
+ def set_rule_priorities(self, rule_priorities):
+ # validate
+ priorities = [rule_priority["priority"] for rule_priority in rule_priorities]
+ for priority in set(priorities):
+ if priorities.count(priority) > 1:
+ raise DuplicatePriorityError(priority)
+
+ # validate
+ for rule_priority in rule_priorities:
+ given_rule_arn = rule_priority["rule_arn"]
+ priority = rule_priority["priority"]
+ _given_rules = self.describe_rules(
+ listener_arn=None, rule_arns=[given_rule_arn]
+ )
+ if not _given_rules:
+ raise RuleNotFoundError()
+ given_rule = _given_rules[0]
+ listeners = self.describe_listeners(None, [given_rule.listener_arn])
+ listener = listeners[0]
+ for rule_in_listener in listener.rules.values():
+ if rule_in_listener.priority == priority:
+ raise PriorityInUseError()
+ # modify
+ modified_rules = []
+ for rule_priority in rule_priorities:
+ given_rule_arn = rule_priority["rule_arn"]
+ priority = rule_priority["priority"]
+ _given_rules = self.describe_rules(
+ listener_arn=None, rule_arns=[given_rule_arn]
+ )
+ if not _given_rules:
+ raise RuleNotFoundError()
+ given_rule = _given_rules[0]
+ given_rule.priority = priority
+ modified_rules.append(given_rule)
+ return modified_rules
+
+ def set_ip_address_type(self, arn, ip_type):
+ if ip_type not in ("internal", "dualstack"):
+ raise RESTError(
+ "InvalidParameterValue",
+ "IpAddressType must be either internal | dualstack",
+ )
+
+ balancer = self.load_balancers.get(arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+
+ if ip_type == "dualstack" and balancer.scheme == "internal":
+ raise RESTError(
+ "InvalidConfigurationRequest",
+ "Internal load balancers cannot be dualstack",
+ )
+
+ balancer.stack = ip_type
+
+ def set_security_groups(self, arn, sec_groups):
+ balancer = self.load_balancers.get(arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+
+ # Check all security groups exist
+ for sec_group_id in sec_groups:
+ if self.ec2_backend.get_security_group_from_id(sec_group_id) is None:
+ raise RESTError(
+ "InvalidSecurityGroup",
+ "Security group {0} does not exist".format(sec_group_id),
+ )
+
+ balancer.security_groups = sec_groups
+
+ def set_subnets(self, arn, subnets, subnet_mappings):
+ balancer = self.load_balancers.get(arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+
+ subnet_objects = []
+ sub_zone_list = {}
+ for subnet in subnets:
+ try:
+ subnet = self._get_subnet(sub_zone_list, subnet)
+
+ sub_zone_list[subnet.availability_zone] = subnet.id
+ subnet_objects.append(subnet)
+ except Exception:
+ raise SubnetNotFoundError()
+
+ for subnet_mapping in subnet_mappings:
+ subnet_id = subnet_mapping["SubnetId"]
+ subnet = self._get_subnet(sub_zone_list, subnet_id)
+
+ sub_zone_list[subnet.availability_zone] = subnet.id
+ subnet_objects.append(subnet)
+
+ if len(sub_zone_list) < 2:
+ raise RESTError(
+ "InvalidConfigurationRequest",
+ "More than 1 availability zone must be specified",
+ )
+
+ balancer.subnets = subnet_objects
+
+ return sub_zone_list.items()
+
+ def _get_subnet(self, sub_zone_list, subnet):
+ subnet = self.ec2_backend.get_subnet(subnet)
+ if subnet.availability_zone in sub_zone_list:
+ raise RESTError(
+ "InvalidConfigurationRequest",
+ "More than 1 subnet cannot be specified for 1 availability zone",
+ )
+ return subnet
+
+ def modify_load_balancer_attributes(self, arn, attrs):
+ balancer = self.load_balancers.get(arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+
+ for key in attrs:
+ if key not in FakeLoadBalancer.VALID_ATTRS:
+ raise RESTError(
+ "InvalidConfigurationRequest", "Key {0} not valid".format(key)
+ )
+
+ balancer.attrs.update(attrs)
+ return balancer.attrs
+
+ def describe_load_balancer_attributes(self, arn):
+ balancer = self.load_balancers.get(arn)
+ if balancer is None:
+ raise LoadBalancerNotFoundError()
+
+ return balancer.attrs
+
+ def modify_target_group(
+ self,
+ arn,
+ health_check_proto=None,
+ health_check_port=None,
+ health_check_path=None,
+ health_check_interval=None,
+ health_check_timeout=None,
+ healthy_threshold_count=None,
+ unhealthy_threshold_count=None,
+ http_codes=None,
+ health_check_enabled=None,
+ ):
+ target_group = self.target_groups.get(arn)
+ if target_group is None:
+ raise TargetGroupNotFoundError()
+
+ if (
+ http_codes is not None
+ and FakeTargetGroup.HTTP_CODE_REGEX.match(http_codes) is None
+ ):
+ raise RESTError(
+ "InvalidParameterValue",
+ "HttpCode must be like 200 | 200-399 | 200,201 ...",
+ )
+
+ if http_codes is not None and target_group.protocol in ["HTTP", "HTTPS"]:
+ target_group.matcher["HttpCode"] = http_codes
+ if health_check_interval is not None:
+ target_group.healthcheck_interval_seconds = health_check_interval
+ if health_check_path is not None:
+ target_group.healthcheck_path = health_check_path
+ if health_check_port is not None:
+ target_group.healthcheck_port = health_check_port
+ if health_check_proto is not None:
+ target_group.healthcheck_protocol = health_check_proto
+ if health_check_timeout is not None:
+ target_group.healthcheck_timeout_seconds = health_check_timeout
+ if health_check_enabled is not None:
+ target_group.healthcheck_enabled = health_check_enabled
+ if healthy_threshold_count is not None:
+ target_group.healthy_threshold_count = healthy_threshold_count
+ if unhealthy_threshold_count is not None:
+ target_group.unhealthy_threshold_count = unhealthy_threshold_count
+
+ return target_group
+
+ def modify_listener(
+ self,
+ arn,
+ port=None,
+ protocol=None,
+ ssl_policy=None,
+ certificates=None,
+ default_actions=None,
+ ):
+ default_actions = [FakeAction(action) for action in default_actions]
+ listener = self.describe_listeners(load_balancer_arn=None, listener_arns=[arn])[
+ 0
+ ]
+
+ if port is not None:
+ listener.port = port
+
+ if protocol not in (None, "HTTP", "HTTPS", "TCP"):
+ raise RESTError(
+ "UnsupportedProtocol", "Protocol {0} is not supported".format(protocol)
+ )
+
+ # HTTPS checks
+ protocol_becomes_https = protocol == "HTTPS"
+ protocol_stays_https = protocol is None and listener.protocol == "HTTPS"
+ if protocol_becomes_https or protocol_stays_https:
+ # Check certificates exist
+ if certificates:
+ default_cert = certificates[0]
+ default_cert_arn = default_cert["certificate_arn"]
+ if not self._certificate_exists(certificate_arn=default_cert_arn):
+ raise RESTError(
+ "CertificateNotFound",
+ "Certificate {0} not found".format(default_cert_arn),
+ )
+ listener.certificate = default_cert_arn
+ listener.certificates = certificates
+ elif len(certificates) == 0 and len(listener.certificates) == 0:
+ raise RESTError(
+ "CertificateWereNotPassed",
+ "You must provide a list containing exactly one certificate if the listener protocol is HTTPS.",
+ )
+ # else:
+ # The list was not provided, meaning we just keep the existing certificates (if any)
+
+ if protocol is not None:
+ listener.protocol = protocol
+
+ if ssl_policy is not None:
+ # Its already validated in responses.py
+ listener.ssl_policy = ssl_policy
+
+ if default_actions is not None and default_actions != []:
+ # Is currently not validated
+ listener.default_actions = default_actions
+ listener._default_rule[0].actions = default_actions
+
+ return listener
+
+ def _certificate_exists(self, certificate_arn):
+ """
+ Verify the provided certificate exists in either ACM or IAM
+ """
+ from moto.acm import acm_backends
+ from moto.acm.models import AWSResourceNotFoundException
+
+ try:
+ acm_backend = acm_backends[self.region_name]
+ acm_backend.get_certificate(certificate_arn)
+ return True
+ except AWSResourceNotFoundException:
+ pass
+
+ from moto.iam import iam_backend
+
+ cert = iam_backend.get_certificate_by_arn(certificate_arn)
+ if cert is not None:
+ return True
+
+ # ACM threw an error, and IAM did not return a certificate
+ # Safe to assume it doesn't exist when we get here
+ return False
+
+ def _any_listener_using(self, target_group_arn):
+ for load_balancer in self.load_balancers.values():
+ for listener in load_balancer.listeners.values():
+ for rule in listener.rules.values():
+ for action in rule.actions:
+ found_arns = self._get_target_group_arns_from(
+ action_data=action.data
+ )
+ if target_group_arn in found_arns:
+ return True
+ return False
+
+ def notify_terminate_instances(self, instance_ids):
+ for target_group in self.target_groups.values():
+ target_group.deregister_terminated_instances(instance_ids)
+
+ def add_listener_certificates(self, arn, certificates):
+ listener = self.describe_listeners(load_balancer_arn=None, listener_arns=[arn])[
+ 0
+ ]
+ listener.certificates.extend([c["certificate_arn"] for c in certificates])
+ return listener.certificates
+
+ def describe_listener_certificates(self, arn):
+ listener = self.describe_listeners(load_balancer_arn=None, listener_arns=[arn])[
+ 0
+ ]
+ return listener.certificates
+
+ def remove_listener_certificates(self, arn, certificates):
+ listener = self.describe_listeners(load_balancer_arn=None, listener_arns=[arn])[
+ 0
+ ]
+ cert_arns = [c["certificate_arn"] for c in certificates]
+ listener.certificates = [c for c in listener.certificates if c not in cert_arns]
+
+ def add_tags(self, resource_arns, tags):
+ tag_dict = self.tagging_service.flatten_tag_list(tags)
+ for arn in resource_arns:
+ existing = self.tagging_service.get_tag_dict_for_resource(arn)
+ for key in tag_dict:
+ if len(existing) >= 10 and key not in existing:
+ raise TooManyTagsError()
+ self._get_resource_by_arn(arn)
+ self.tagging_service.tag_resource(arn, tags)
+
+ def remove_tags(self, resource_arns, tag_keys):
+ for arn in resource_arns:
+ self.tagging_service.untag_resource_using_names(arn, tag_keys)
+
+ def describe_tags(self, resource_arns):
+ return {
+ arn: self.tagging_service.get_tag_dict_for_resource(arn)
+ for arn in resource_arns
+ }
+
+ def _get_resource_by_arn(self, arn):
+ if ":targetgroup" in arn:
+ resource = self.target_groups.get(arn)
+ if not resource:
+ raise TargetGroupNotFoundError()
+ elif ":loadbalancer" in arn:
+ resource = self.load_balancers.get(arn)
+ if not resource:
+ raise LoadBalancerNotFoundError()
+ elif ":listener-rule" in arn:
+ lb_arn = arn.replace(":listener-rule", ":loadbalancer").rsplit("/", 2)[0]
+ balancer = self.load_balancers.get(lb_arn)
+ if not balancer:
+ raise LoadBalancerNotFoundError()
+ listener_arn = arn.replace(":listener-rule", ":listener").rsplit("/", 1)[0]
+ listener = balancer.listeners.get(listener_arn)
+ if not listener:
+ raise ListenerNotFoundError()
+ resource = listener.rules.get(arn)
+ if not resource:
+ raise RuleNotFoundError()
+ elif ":listener" in arn:
+ lb_arn, _, _ = arn.replace(":listener", ":loadbalancer").rpartition("/")
+ balancer = self.load_balancers.get(lb_arn)
+ if not balancer:
+ raise LoadBalancerNotFoundError()
+ resource = balancer.listeners.get(arn)
+ if not resource:
+ raise ListenerNotFoundError()
+ else:
+ raise LoadBalancerNotFoundError()
+ return resource
+
+
+elbv2_backends = BackendDict(ELBv2Backend, "ec2")
diff --git a/contrib/python/moto/py3/moto/elbv2/responses.py b/contrib/python/moto/py3/moto/elbv2/responses.py
new file mode 100644
index 0000000000..28ef9b8d56
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/responses.py
@@ -0,0 +1,1730 @@
+from moto.core.exceptions import RESTError
+from moto.core.utils import amzn_request_id
+from moto.core.responses import BaseResponse
+from .models import elbv2_backends
+from .exceptions import TargetGroupNotFoundError
+from .exceptions import ListenerOrBalancerMissingError
+
+SSL_POLICIES = [
+ {
+ "name": "ELBSecurityPolicy-2016-08",
+ "ssl_protocols": ["TLSv1", "TLSv1.1", "TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES128-SHA256", "priority": 3},
+ {"name": "ECDHE-RSA-AES128-SHA256", "priority": 4},
+ {"name": "ECDHE-ECDSA-AES128-SHA", "priority": 5},
+ {"name": "ECDHE-RSA-AES128-SHA", "priority": 6},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 7},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 8},
+ {"name": "ECDHE-ECDSA-AES256-SHA384", "priority": 9},
+ {"name": "ECDHE-RSA-AES256-SHA384", "priority": 10},
+ {"name": "ECDHE-RSA-AES256-SHA", "priority": 11},
+ {"name": "ECDHE-ECDSA-AES256-SHA", "priority": 12},
+ {"name": "AES128-GCM-SHA256", "priority": 13},
+ {"name": "AES128-SHA256", "priority": 14},
+ {"name": "AES128-SHA", "priority": 15},
+ {"name": "AES256-GCM-SHA384", "priority": 16},
+ {"name": "AES256-SHA256", "priority": 17},
+ {"name": "AES256-SHA", "priority": 18},
+ ],
+ },
+ {
+ "name": "ELBSecurityPolicy-TLS-1-2-2017-01",
+ "ssl_protocols": ["TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES128-SHA256", "priority": 3},
+ {"name": "ECDHE-RSA-AES128-SHA256", "priority": 4},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 5},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 6},
+ {"name": "ECDHE-ECDSA-AES256-SHA384", "priority": 7},
+ {"name": "ECDHE-RSA-AES256-SHA384", "priority": 8},
+ {"name": "AES128-GCM-SHA256", "priority": 9},
+ {"name": "AES128-SHA256", "priority": 10},
+ {"name": "AES256-GCM-SHA384", "priority": 11},
+ {"name": "AES256-SHA256", "priority": 12},
+ ],
+ },
+ {
+ "name": "ELBSecurityPolicy-TLS-1-1-2017-01",
+ "ssl_protocols": ["TLSv1.1", "TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES128-SHA256", "priority": 3},
+ {"name": "ECDHE-RSA-AES128-SHA256", "priority": 4},
+ {"name": "ECDHE-ECDSA-AES128-SHA", "priority": 5},
+ {"name": "ECDHE-RSA-AES128-SHA", "priority": 6},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 7},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 8},
+ {"name": "ECDHE-ECDSA-AES256-SHA384", "priority": 9},
+ {"name": "ECDHE-RSA-AES256-SHA384", "priority": 10},
+ {"name": "ECDHE-RSA-AES256-SHA", "priority": 11},
+ {"name": "ECDHE-ECDSA-AES256-SHA", "priority": 12},
+ {"name": "AES128-GCM-SHA256", "priority": 13},
+ {"name": "AES128-SHA256", "priority": 14},
+ {"name": "AES128-SHA", "priority": 15},
+ {"name": "AES256-GCM-SHA384", "priority": 16},
+ {"name": "AES256-SHA256", "priority": 17},
+ {"name": "AES256-SHA", "priority": 18},
+ ],
+ },
+ {
+ "name": "ELBSecurityPolicy-2015-05",
+ "ssl_protocols": ["TLSv1", "TLSv1.1", "TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES128-SHA256", "priority": 3},
+ {"name": "ECDHE-RSA-AES128-SHA256", "priority": 4},
+ {"name": "ECDHE-ECDSA-AES128-SHA", "priority": 5},
+ {"name": "ECDHE-RSA-AES128-SHA", "priority": 6},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 7},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 8},
+ {"name": "ECDHE-ECDSA-AES256-SHA384", "priority": 9},
+ {"name": "ECDHE-RSA-AES256-SHA384", "priority": 10},
+ {"name": "ECDHE-RSA-AES256-SHA", "priority": 11},
+ {"name": "ECDHE-ECDSA-AES256-SHA", "priority": 12},
+ {"name": "AES128-GCM-SHA256", "priority": 13},
+ {"name": "AES128-SHA256", "priority": 14},
+ {"name": "AES128-SHA", "priority": 15},
+ {"name": "AES256-GCM-SHA384", "priority": 16},
+ {"name": "AES256-SHA256", "priority": 17},
+ {"name": "AES256-SHA", "priority": 18},
+ ],
+ },
+ {
+ "name": "ELBSecurityPolicy-TLS-1-0-2015-04",
+ "ssl_protocols": ["TLSv1", "TLSv1.1", "TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES128-SHA256", "priority": 3},
+ {"name": "ECDHE-RSA-AES128-SHA256", "priority": 4},
+ {"name": "ECDHE-ECDSA-AES128-SHA", "priority": 5},
+ {"name": "ECDHE-RSA-AES128-SHA", "priority": 6},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 7},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 8},
+ {"name": "ECDHE-ECDSA-AES256-SHA384", "priority": 9},
+ {"name": "ECDHE-RSA-AES256-SHA384", "priority": 10},
+ {"name": "ECDHE-RSA-AES256-SHA", "priority": 11},
+ {"name": "ECDHE-ECDSA-AES256-SHA", "priority": 12},
+ {"name": "AES128-GCM-SHA256", "priority": 13},
+ {"name": "AES128-SHA256", "priority": 14},
+ {"name": "AES128-SHA", "priority": 15},
+ {"name": "AES256-GCM-SHA384", "priority": 16},
+ {"name": "AES256-SHA256", "priority": 17},
+ {"name": "AES256-SHA", "priority": 18},
+ {"name": "DES-CBC3-SHA", "priority": 19},
+ ],
+ },
+ {
+ "name": "ELBSecurityPolicy-FS-1-2-Res-2020-10",
+ "ssl_protocols": ["TLSv1.2"],
+ "ciphers": [
+ {"name": "ECDHE-ECDSA-AES128-GCM-SHA256", "priority": 1},
+ {"name": "ECDHE-RSA-AES128-GCM-SHA256", "priority": 2},
+ {"name": "ECDHE-ECDSA-AES256-GCM-SHA384", "priority": 3},
+ {"name": "ECDHE-RSA-AES256-GCM-SHA384", "priority": 4},
+ ],
+ },
+]
+
+
+class ELBV2Response(BaseResponse):
+ @property
+ def elbv2_backend(self):
+ return elbv2_backends[self.region]
+
+ @amzn_request_id
+ def create_load_balancer(self):
+ params = self._get_params()
+ load_balancer_name = params.get("Name")
+ subnet_ids = self._get_multi_param("Subnets.member")
+ subnet_mappings = params.get("SubnetMappings", [])
+ security_groups = self._get_multi_param("SecurityGroups.member")
+ scheme = params.get("Scheme")
+ loadbalancer_type = params.get("Type")
+ tags = params.get("Tags")
+
+ load_balancer = self.elbv2_backend.create_load_balancer(
+ name=load_balancer_name,
+ security_groups=security_groups,
+ subnet_ids=subnet_ids,
+ subnet_mappings=subnet_mappings,
+ scheme=scheme,
+ loadbalancer_type=loadbalancer_type,
+ tags=tags,
+ )
+ template = self.response_template(CREATE_LOAD_BALANCER_TEMPLATE)
+ return template.render(load_balancer=load_balancer)
+
+ @amzn_request_id
+ def create_rule(self):
+ params = self._get_params()
+ rules = self.elbv2_backend.create_rule(
+ listener_arn=params["ListenerArn"],
+ conditions=params["Conditions"],
+ priority=params["Priority"],
+ actions=params["Actions"],
+ tags=params.get("Tags"),
+ )
+
+ template = self.response_template(CREATE_RULE_TEMPLATE)
+ return template.render(rules=rules)
+
+ @amzn_request_id
+ def create_target_group(self):
+ params = self._get_params()
+ name = params.get("Name")
+ vpc_id = params.get("VpcId")
+ protocol = params.get("Protocol")
+ protocol_version = params.get("ProtocolVersion", "HTTP1")
+ port = params.get("Port")
+ healthcheck_protocol = self._get_param("HealthCheckProtocol")
+ healthcheck_port = self._get_param("HealthCheckPort")
+ healthcheck_path = self._get_param("HealthCheckPath")
+ healthcheck_interval_seconds = self._get_param("HealthCheckIntervalSeconds")
+ healthcheck_timeout_seconds = self._get_param("HealthCheckTimeoutSeconds")
+ healthcheck_enabled = self._get_param("HealthCheckEnabled")
+ healthy_threshold_count = self._get_param("HealthyThresholdCount")
+ unhealthy_threshold_count = self._get_param("UnhealthyThresholdCount")
+ matcher = params.get("Matcher")
+ target_type = params.get("TargetType")
+ tags = params.get("Tags")
+
+ target_group = self.elbv2_backend.create_target_group(
+ name,
+ vpc_id=vpc_id,
+ protocol=protocol,
+ protocol_version=protocol_version,
+ port=port,
+ healthcheck_protocol=healthcheck_protocol,
+ healthcheck_port=healthcheck_port,
+ healthcheck_path=healthcheck_path,
+ healthcheck_interval_seconds=healthcheck_interval_seconds,
+ healthcheck_timeout_seconds=healthcheck_timeout_seconds,
+ healthcheck_enabled=healthcheck_enabled,
+ healthy_threshold_count=healthy_threshold_count,
+ unhealthy_threshold_count=unhealthy_threshold_count,
+ matcher=matcher,
+ target_type=target_type,
+ tags=tags,
+ )
+
+ template = self.response_template(CREATE_TARGET_GROUP_TEMPLATE)
+ return template.render(target_group=target_group)
+
+ @amzn_request_id
+ def create_listener(self):
+ params = self._get_params()
+ load_balancer_arn = self._get_param("LoadBalancerArn")
+ protocol = self._get_param("Protocol")
+ port = self._get_param("Port")
+ ssl_policy = self._get_param("SslPolicy", "ELBSecurityPolicy-2016-08")
+ certificates = self._get_list_prefix("Certificates.member")
+ if certificates:
+ certificate = certificates[0].get("certificate_arn")
+ else:
+ certificate = None
+ default_actions = params.get("DefaultActions", [])
+ alpn_policy = params.get("AlpnPolicy", [])
+ tags = params.get("Tags")
+
+ listener = self.elbv2_backend.create_listener(
+ load_balancer_arn=load_balancer_arn,
+ protocol=protocol,
+ port=port,
+ ssl_policy=ssl_policy,
+ certificate=certificate,
+ default_actions=default_actions,
+ alpn_policy=alpn_policy,
+ tags=tags,
+ )
+
+ template = self.response_template(CREATE_LISTENER_TEMPLATE)
+ return template.render(listener=listener)
+
+ @amzn_request_id
+ def describe_load_balancers(self):
+ arns = self._get_multi_param("LoadBalancerArns.member")
+ names = self._get_multi_param("Names.member")
+ all_load_balancers = list(
+ self.elbv2_backend.describe_load_balancers(arns, names)
+ )
+ marker = self._get_param("Marker")
+ all_names = [balancer.name for balancer in all_load_balancers]
+ if marker:
+ start = all_names.index(marker) + 1
+ else:
+ start = 0
+ page_size = self._get_int_param(
+ "PageSize", 50
+ ) # the default is 400, but using 50 to make testing easier
+ load_balancers_resp = all_load_balancers[start : start + page_size]
+ next_marker = None
+ if len(all_load_balancers) > start + page_size:
+ next_marker = load_balancers_resp[-1].name
+
+ template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE)
+ return template.render(load_balancers=load_balancers_resp, marker=next_marker)
+
+ @amzn_request_id
+ def describe_rules(self):
+ listener_arn = self._get_param("ListenerArn")
+ rule_arns = (
+ self._get_multi_param("RuleArns.member")
+ if any(
+ k
+ for k in list(self.querystring.keys())
+ if k.startswith("RuleArns.member")
+ )
+ else None
+ )
+ all_rules = list(self.elbv2_backend.describe_rules(listener_arn, rule_arns))
+ all_arns = [rule.arn for rule in all_rules]
+ page_size = self._get_int_param("PageSize", 50) # set 50 for temporary
+
+ marker = self._get_param("Marker")
+ if marker:
+ start = all_arns.index(marker) + 1
+ else:
+ start = 0
+ rules_resp = all_rules[start : start + page_size]
+ next_marker = None
+
+ if len(all_rules) > start + page_size:
+ next_marker = rules_resp[-1].arn
+ template = self.response_template(DESCRIBE_RULES_TEMPLATE)
+ return template.render(rules=rules_resp, marker=next_marker)
+
+ @amzn_request_id
+ def describe_target_groups(self):
+ load_balancer_arn = self._get_param("LoadBalancerArn")
+ target_group_arns = self._get_multi_param("TargetGroupArns.member")
+ names = self._get_multi_param("Names.member")
+
+ target_groups = self.elbv2_backend.describe_target_groups(
+ load_balancer_arn, target_group_arns, names
+ )
+ template = self.response_template(DESCRIBE_TARGET_GROUPS_TEMPLATE)
+ return template.render(target_groups=target_groups)
+
+ @amzn_request_id
+ def describe_target_group_attributes(self):
+ target_group_arn = self._get_param("TargetGroupArn")
+ target_group = self.elbv2_backend.target_groups.get(target_group_arn)
+ if not target_group:
+ raise TargetGroupNotFoundError()
+ template = self.response_template(DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=target_group.attributes)
+
+ @amzn_request_id
+ def describe_listeners(self):
+ load_balancer_arn = self._get_param("LoadBalancerArn")
+ listener_arns = self._get_multi_param("ListenerArns.member")
+ if not load_balancer_arn and not listener_arns:
+ raise ListenerOrBalancerMissingError()
+
+ listeners = self.elbv2_backend.describe_listeners(
+ load_balancer_arn, listener_arns
+ )
+ template = self.response_template(DESCRIBE_LISTENERS_TEMPLATE)
+ return template.render(listeners=listeners)
+
+ @amzn_request_id
+ def delete_load_balancer(self):
+ arn = self._get_param("LoadBalancerArn")
+ self.elbv2_backend.delete_load_balancer(arn)
+ template = self.response_template(DELETE_LOAD_BALANCER_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def delete_rule(self):
+ arn = self._get_param("RuleArn")
+ self.elbv2_backend.delete_rule(arn)
+ template = self.response_template(DELETE_RULE_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def delete_target_group(self):
+ arn = self._get_param("TargetGroupArn")
+ self.elbv2_backend.delete_target_group(arn)
+ template = self.response_template(DELETE_TARGET_GROUP_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def delete_listener(self):
+ arn = self._get_param("ListenerArn")
+ self.elbv2_backend.delete_listener(arn)
+ template = self.response_template(DELETE_LISTENER_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def modify_rule(self):
+ rule_arn = self._get_param("RuleArn")
+ params = self._get_params()
+ conditions = params.get("Conditions", [])
+ actions = params.get("Actions", [])
+ rules = self.elbv2_backend.modify_rule(
+ rule_arn=rule_arn, conditions=conditions, actions=actions
+ )
+ template = self.response_template(MODIFY_RULE_TEMPLATE)
+ return template.render(rules=rules)
+
+ @amzn_request_id
+ def modify_target_group_attributes(self):
+ target_group_arn = self._get_param("TargetGroupArn")
+ attributes = self._get_list_prefix("Attributes.member")
+ attributes = {attr["key"]: attr["value"] for attr in attributes}
+ self.elbv2_backend.modify_target_group_attributes(target_group_arn, attributes)
+
+ template = self.response_template(MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=attributes)
+
+ @amzn_request_id
+ def register_targets(self):
+ target_group_arn = self._get_param("TargetGroupArn")
+ targets = self._get_list_prefix("Targets.member")
+ self.elbv2_backend.register_targets(target_group_arn, targets)
+
+ template = self.response_template(REGISTER_TARGETS_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def deregister_targets(self):
+ target_group_arn = self._get_param("TargetGroupArn")
+ targets = self._get_list_prefix("Targets.member")
+ self.elbv2_backend.deregister_targets(target_group_arn, targets)
+
+ template = self.response_template(DEREGISTER_TARGETS_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def describe_target_health(self):
+ target_group_arn = self._get_param("TargetGroupArn")
+ targets = self._get_list_prefix("Targets.member")
+ target_health_descriptions = self.elbv2_backend.describe_target_health(
+ target_group_arn, targets
+ )
+
+ template = self.response_template(DESCRIBE_TARGET_HEALTH_TEMPLATE)
+ return template.render(target_health_descriptions=target_health_descriptions)
+
+ @amzn_request_id
+ def set_rule_priorities(self):
+ rule_priorities = self._get_list_prefix("RulePriorities.member")
+ for rule_priority in rule_priorities:
+ rule_priority["priority"] = int(rule_priority["priority"])
+ rules = self.elbv2_backend.set_rule_priorities(rule_priorities)
+ template = self.response_template(SET_RULE_PRIORITIES_TEMPLATE)
+ return template.render(rules=rules)
+
+ @amzn_request_id
+ def add_tags(self):
+ resource_arns = self._get_multi_param("ResourceArns.member")
+ tags = self._get_params().get("Tags")
+ tags = self._get_params().get("Tags")
+
+ self.elbv2_backend.add_tags(resource_arns, tags)
+
+ template = self.response_template(ADD_TAGS_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def remove_tags(self):
+ resource_arns = self._get_multi_param("ResourceArns.member")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ self.elbv2_backend.remove_tags(resource_arns, tag_keys)
+
+ template = self.response_template(REMOVE_TAGS_TEMPLATE)
+ return template.render()
+
+ @amzn_request_id
+ def describe_tags(self):
+ resource_arns = self._get_multi_param("ResourceArns.member")
+ resource_tags = self.elbv2_backend.describe_tags(resource_arns)
+
+ template = self.response_template(DESCRIBE_TAGS_TEMPLATE)
+ return template.render(resource_tags=resource_tags)
+
+ @amzn_request_id
+ def describe_account_limits(self):
+ # Supports paging but not worth implementing yet
+ # marker = self._get_param('Marker')
+ # page_size = self._get_int_param('PageSize')
+
+ limits = {
+ "application-load-balancers": 20,
+ "target-groups": 3000,
+ "targets-per-application-load-balancer": 30,
+ "listeners-per-application-load-balancer": 50,
+ "rules-per-application-load-balancer": 100,
+ "network-load-balancers": 20,
+ "targets-per-network-load-balancer": 200,
+ "listeners-per-network-load-balancer": 50,
+ }
+
+ template = self.response_template(DESCRIBE_LIMITS_TEMPLATE)
+ return template.render(limits=limits)
+
+ @amzn_request_id
+ def describe_ssl_policies(self):
+ names = self._get_multi_param("Names.member.")
+ # Supports paging but not worth implementing yet
+ # marker = self._get_param('Marker')
+ # page_size = self._get_int_param('PageSize')
+
+ policies = SSL_POLICIES
+ if names:
+ policies = filter(lambda policy: policy["name"] in names, policies)
+
+ template = self.response_template(DESCRIBE_SSL_POLICIES_TEMPLATE)
+ return template.render(policies=policies)
+
+ @amzn_request_id
+ def set_ip_address_type(self):
+ arn = self._get_param("LoadBalancerArn")
+ ip_type = self._get_param("IpAddressType")
+
+ self.elbv2_backend.set_ip_address_type(arn, ip_type)
+
+ template = self.response_template(SET_IP_ADDRESS_TYPE_TEMPLATE)
+ return template.render(ip_type=ip_type)
+
+ @amzn_request_id
+ def set_security_groups(self):
+ arn = self._get_param("LoadBalancerArn")
+ sec_groups = self._get_multi_param("SecurityGroups.member.")
+
+ self.elbv2_backend.set_security_groups(arn, sec_groups)
+
+ template = self.response_template(SET_SECURITY_GROUPS_TEMPLATE)
+ return template.render(sec_groups=sec_groups)
+
+ @amzn_request_id
+ def set_subnets(self):
+ arn = self._get_param("LoadBalancerArn")
+ subnets = self._get_multi_param("Subnets.member.")
+ subnet_mappings = self._get_params().get("SubnetMappings", [])
+
+ subnet_zone_list = self.elbv2_backend.set_subnets(arn, subnets, subnet_mappings)
+
+ template = self.response_template(SET_SUBNETS_TEMPLATE)
+ return template.render(subnets=subnet_zone_list)
+
+ @amzn_request_id
+ def modify_load_balancer_attributes(self):
+ arn = self._get_param("LoadBalancerArn")
+ attrs = self._get_map_prefix(
+ "Attributes.member", key_end="Key", value_end="Value"
+ )
+
+ all_attrs = self.elbv2_backend.modify_load_balancer_attributes(arn, attrs)
+
+ template = self.response_template(MODIFY_LOADBALANCER_ATTRS_TEMPLATE)
+ return template.render(attrs=all_attrs)
+
+ @amzn_request_id
+ def describe_load_balancer_attributes(self):
+ arn = self._get_param("LoadBalancerArn")
+ attrs = self.elbv2_backend.describe_load_balancer_attributes(arn)
+
+ template = self.response_template(DESCRIBE_LOADBALANCER_ATTRS_TEMPLATE)
+ return template.render(attrs=attrs)
+
+ @amzn_request_id
+ def modify_target_group(self):
+ arn = self._get_param("TargetGroupArn")
+
+ health_check_proto = self._get_param(
+ "HealthCheckProtocol"
+ ) # 'HTTP' | 'HTTPS' | 'TCP',
+ health_check_port = self._get_param("HealthCheckPort")
+ health_check_path = self._get_param("HealthCheckPath")
+ health_check_interval = self._get_param("HealthCheckIntervalSeconds")
+ health_check_timeout = self._get_param("HealthCheckTimeoutSeconds")
+ health_check_enabled = self._get_param("HealthCheckEnabled")
+ healthy_threshold_count = self._get_param("HealthyThresholdCount")
+ unhealthy_threshold_count = self._get_param("UnhealthyThresholdCount")
+ http_codes = self._get_param("Matcher.HttpCode")
+
+ target_group = self.elbv2_backend.modify_target_group(
+ arn,
+ health_check_proto,
+ health_check_port,
+ health_check_path,
+ health_check_interval,
+ health_check_timeout,
+ healthy_threshold_count,
+ unhealthy_threshold_count,
+ http_codes,
+ health_check_enabled=health_check_enabled,
+ )
+
+ template = self.response_template(MODIFY_TARGET_GROUP_TEMPLATE)
+ return template.render(target_group=target_group)
+
+ @amzn_request_id
+ def modify_listener(self):
+ arn = self._get_param("ListenerArn")
+ port = self._get_param("Port")
+ protocol = self._get_param("Protocol")
+ ssl_policy = self._get_param("SslPolicy")
+ certificates = self._get_list_prefix("Certificates.member")
+ default_actions = self._get_params().get("DefaultActions", [])
+
+ # Should really move SSL Policies to models
+ if ssl_policy is not None and ssl_policy not in [
+ item["name"] for item in SSL_POLICIES
+ ]:
+ raise RESTError(
+ "SSLPolicyNotFound", "Policy {0} not found".format(ssl_policy)
+ )
+
+ listener = self.elbv2_backend.modify_listener(
+ arn, port, protocol, ssl_policy, certificates, default_actions
+ )
+
+ template = self.response_template(MODIFY_LISTENER_TEMPLATE)
+ return template.render(listener=listener)
+
+ @amzn_request_id
+ def add_listener_certificates(self):
+ arn = self._get_param("ListenerArn")
+ certificates = self._get_list_prefix("Certificates.member")
+ certificates = self.elbv2_backend.add_listener_certificates(arn, certificates)
+
+ template = self.response_template(ADD_LISTENER_CERTIFICATES_TEMPLATE)
+ return template.render(certificates=certificates)
+
+ @amzn_request_id
+ def describe_listener_certificates(self):
+ arn = self._get_param("ListenerArn")
+ certificates = self.elbv2_backend.describe_listener_certificates(arn)
+
+ template = self.response_template(DESCRIBE_LISTENER_CERTIFICATES_TEMPLATE)
+ return template.render(certificates=certificates)
+
+ @amzn_request_id
+ def remove_listener_certificates(self):
+ arn = self._get_param("ListenerArn")
+ certificates = self._get_list_prefix("Certificates.member")
+ certificates = self.elbv2_backend.remove_listener_certificates(
+ arn, certificates
+ )
+
+ template = self.response_template(REMOVE_LISTENER_CERTIFICATES_TEMPLATE)
+ return template.render(certificates=certificates)
+
+
+ADD_TAGS_TEMPLATE = """<AddTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <AddTagsResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</AddTagsResponse>"""
+
+REMOVE_TAGS_TEMPLATE = """<RemoveTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <RemoveTagsResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</RemoveTagsResponse>"""
+
+DESCRIBE_TAGS_TEMPLATE = """<DescribeTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeTagsResult>
+ <TagDescriptions>
+ {% for resource_arn, tags in resource_tags.items() %}
+ <member>
+ <ResourceArn>{{ resource_arn }}</ResourceArn>
+ <Tags>
+ {% for key, value in tags.items() %}
+ <member>
+ <Value>{{ value }}</Value>
+ <Key>{{ key }}</Key>
+ </member>
+ {% endfor %}
+ </Tags>
+ </member>
+ {% endfor %}
+ </TagDescriptions>
+ </DescribeTagsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeTagsResponse>"""
+
+CREATE_LOAD_BALANCER_TEMPLATE = """<CreateLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <CreateLoadBalancerResult>
+ <LoadBalancers>
+ <member>
+ <LoadBalancerArn>{{ load_balancer.arn }}</LoadBalancerArn>
+ <Scheme>{{ load_balancer.scheme }}</Scheme>
+ <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
+ <VpcId>{{ load_balancer.vpc_id }}</VpcId>
+ <CanonicalHostedZoneId>Z2P70J7EXAMPLE</CanonicalHostedZoneId>
+ <CreatedTime>{{ load_balancer.created_time }}</CreatedTime>
+ <AvailabilityZones>
+ {% for subnet in load_balancer.subnets %}
+ <member>
+ <SubnetId>{{ subnet.id }}</SubnetId>
+ <ZoneName>{{ subnet.availability_zone }}</ZoneName>
+ </member>
+ {% endfor %}
+ </AvailabilityZones>
+ <SecurityGroups>
+ {% for security_group in load_balancer.security_groups %}
+ <member>{{ security_group }}</member>
+ {% endfor %}
+ </SecurityGroups>
+ <DNSName>{{ load_balancer.dns_name }}</DNSName>
+ <State>
+ <Code>{{ load_balancer.state }}</Code>
+ </State>
+ <Type>{{ load_balancer.loadbalancer_type }}</Type>
+ </member>
+ </LoadBalancers>
+ </CreateLoadBalancerResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateLoadBalancerResponse>"""
+
+CREATE_RULE_TEMPLATE = """<CreateRuleResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <CreateRuleResult>
+ <Rules>
+ <member>
+ <IsDefault>{{ "true" if rules.is_default else "false" }}</IsDefault>
+ <Conditions>
+ {% for condition in rules.conditions %}
+ <member>
+ <Field>{{ condition["Field"] }}</Field>
+ {% if "Values" in condition %}
+ <Values>
+ {% for value in condition["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ {% endif %}
+ {% if "HttpHeaderConfig" in condition %}
+ <HttpHeaderConfig>
+ <HttpHeaderName>{{ condition["HttpHeaderConfig"]["HttpHeaderName"] }}</HttpHeaderName>
+ <Values>
+ {% for value in condition["HttpHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpHeaderConfig>
+ {% endif %}
+ {% if "HttpRequestMethodConfig" in condition %}
+ <HttpRequestMethodConfig>
+ <Values>
+ {% for value in condition["HttpRequestMethodConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpRequestMethodConfig>
+ {% endif %}
+ {% if "QueryStringConfig" in condition %}
+ <QueryStringConfig>
+ <Values>
+ {% for value in condition["QueryStringConfig"]["Values"] %}
+ <member>
+ <Key>{{ value["Key"] }}</Key>
+ <Value>{{ value["Value"] }}</Value>
+ </member>
+ {% endfor %}
+ </Values>
+ </QueryStringConfig>
+ {% endif %}
+ {% if "SourceIpConfig" in condition %}
+ <SourceIpConfig>
+ <Values>
+ {% for value in condition["SourceIpConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </SourceIpConfig>
+ {% endif %}
+ {% if "PathPatternConfig" in condition %}
+ <PathPatternConfig>
+ <Values>
+ {% for value in condition["PathPatternConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </PathPatternConfig>
+ {% endif %}
+ {% if "HostHeaderConfig" in condition %}
+ <HostHeaderConfig>
+ <Values>
+ {% for value in condition["HostHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HostHeaderConfig>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Conditions>
+ <Priority>{{ rules.priority }}</Priority>
+ <RuleArn>{{ rules.arn }}</RuleArn>
+ <Actions>
+ {% for action in rules.actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </Actions>
+ </member>
+ </Rules>
+ </CreateRuleResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateRuleResponse>"""
+
+CREATE_TARGET_GROUP_TEMPLATE = """<CreateTargetGroupResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <CreateTargetGroupResult>
+ <TargetGroups>
+ <member>
+ <TargetGroupArn>{{ target_group.arn }}</TargetGroupArn>
+ <TargetGroupName>{{ target_group.name }}</TargetGroupName>
+ {% if target_group.protocol %}
+ <Protocol>{{ target_group.protocol }}</Protocol>
+ {% endif %}
+ {% if target_group.port %}
+ <Port>{{ target_group.port }}</Port>
+ {% endif %}
+ {% if target_group.vpc_id %}
+ <VpcId>{{ target_group.vpc_id }}</VpcId>
+ {% endif %}
+ <HealthCheckProtocol>{{ target_group.healthcheck_protocol }}</HealthCheckProtocol>
+ {% if target_group.healthcheck_port %}<HealthCheckPort>{{ target_group.healthcheck_port }}</HealthCheckPort>{% endif %}
+ <HealthCheckPath>{{ target_group.healthcheck_path or '' }}</HealthCheckPath>
+ <HealthCheckIntervalSeconds>{{ target_group.healthcheck_interval_seconds }}</HealthCheckIntervalSeconds>
+ <HealthCheckTimeoutSeconds>{{ target_group.healthcheck_timeout_seconds }}</HealthCheckTimeoutSeconds>
+ <HealthCheckEnabled>{{ target_group.healthcheck_enabled and 'true' or 'false' }}</HealthCheckEnabled>
+ <HealthyThresholdCount>{{ target_group.healthy_threshold_count }}</HealthyThresholdCount>
+ <UnhealthyThresholdCount>{{ target_group.unhealthy_threshold_count }}</UnhealthyThresholdCount>
+ {% if target_group.matcher %}
+ <Matcher>
+ <HttpCode>{{ target_group.matcher['HttpCode'] }}</HttpCode>
+ </Matcher>
+ {% endif %}
+ {% if target_group.target_type %}
+ <TargetType>{{ target_group.target_type }}</TargetType>
+ {% endif %}
+ </member>
+ </TargetGroups>
+ </CreateTargetGroupResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateTargetGroupResponse>"""
+
+CREATE_LISTENER_TEMPLATE = """<CreateListenerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <CreateListenerResult>
+ <Listeners>
+ <member>
+ <LoadBalancerArn>{{ listener.load_balancer_arn }}</LoadBalancerArn>
+ <Protocol>{{ listener.protocol }}</Protocol>
+ {% if listener.certificates %}
+ <Certificates>
+ {% for cert in listener.certificates %}
+ <member>
+ <CertificateArn>{{ cert }}</CertificateArn>
+ </member>
+ {% endfor %}
+ </Certificates>
+ {% endif %}
+ {% if listener.port %}
+ <Port>{{ listener.port }}</Port>
+ {% endif %}
+ <SslPolicy>{{ listener.ssl_policy }}</SslPolicy>
+ <ListenerArn>{{ listener.arn }}</ListenerArn>
+ <DefaultActions>
+ {% for action in listener.default_actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </DefaultActions>
+ <AlpnPolicy>
+ {% for policy in listener.alpn_policy %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </AlpnPolicy>
+ </member>
+ </Listeners>
+ </CreateListenerResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateListenerResponse>"""
+
+DELETE_LOAD_BALANCER_TEMPLATE = """<DeleteLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DeleteLoadBalancerResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeleteLoadBalancerResponse>"""
+
+DELETE_RULE_TEMPLATE = """<DeleteRuleResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DeleteRuleResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeleteRuleResponse>"""
+
+DELETE_TARGET_GROUP_TEMPLATE = """<DeleteTargetGroupResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DeleteTargetGroupResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeleteTargetGroupResponse>"""
+
+DELETE_LISTENER_TEMPLATE = """<DeleteListenerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DeleteListenerResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeleteListenerResponse>"""
+
+DESCRIBE_LOAD_BALANCERS_TEMPLATE = """<DescribeLoadBalancersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeLoadBalancersResult>
+ <LoadBalancers>
+ {% for load_balancer in load_balancers %}
+ <member>
+ <LoadBalancerArn>{{ load_balancer.arn }}</LoadBalancerArn>
+ <Scheme>{{ load_balancer.scheme }}</Scheme>
+ <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
+ <VpcId>{{ load_balancer.vpc_id }}</VpcId>
+ <CanonicalHostedZoneId>Z2P70J7EXAMPLE</CanonicalHostedZoneId>
+ <CreatedTime>{{ load_balancer.created_time }}</CreatedTime>
+ <AvailabilityZones>
+ {% for subnet in load_balancer.subnets %}
+ <member>
+ <SubnetId>{{ subnet.id }}</SubnetId>
+ <ZoneName>{{ subnet.availability_zone }}</ZoneName>
+ </member>
+ {% endfor %}
+ </AvailabilityZones>
+ <SecurityGroups>
+ {% for security_group in load_balancer.security_groups %}
+ <member>{{ security_group }}</member>
+ {% endfor %}
+ </SecurityGroups>
+ <DNSName>{{ load_balancer.dns_name }}</DNSName>
+ <State>
+ <Code>{{ load_balancer.state }}</Code>
+ </State>
+ <Type>{{ load_balancer.loadbalancer_type }}</Type>
+ <IpAddressType>ipv4</IpAddressType>
+ </member>
+ {% endfor %}
+ </LoadBalancers>
+ {% if marker %}
+ <NextMarker>{{ marker }}</NextMarker>
+ {% endif %}
+ </DescribeLoadBalancersResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancersResponse>"""
+
+DESCRIBE_RULES_TEMPLATE = """<DescribeRulesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeRulesResult>
+ <Rules>
+ {% for rule in rules %}
+ <member>
+ <IsDefault>{{ "true" if rule.is_default else "false" }}</IsDefault>
+ <Conditions>
+ {% for condition in rule.conditions %}
+ <member>
+ <Field>{{ condition["Field"] }}</Field>
+ {% if "HttpHeaderConfig" in condition %}
+ <HttpHeaderConfig>
+ <HttpHeaderName>{{ condition["HttpHeaderConfig"]["HttpHeaderName"] }}</HttpHeaderName>
+ <Values>
+ {% for value in condition["HttpHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpHeaderConfig>
+ {% endif %}
+ {% if "HttpRequestMethodConfig" in condition %}
+ <HttpRequestMethodConfig>
+ <Values>
+ {% for value in condition["HttpRequestMethodConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpRequestMethodConfig>
+ {% endif %}
+ {% if "QueryStringConfig" in condition %}
+ <QueryStringConfig>
+ <Values>
+ {% for value in condition["QueryStringConfig"]["Values"] %}
+ <member>
+ <Key>{{ value["Key"] }}</Key>
+ <Value>{{ value["Value"] }}</Value>
+ </member>
+ {% endfor %}
+ </Values>
+ </QueryStringConfig>
+ {% endif %}
+ {% if "SourceIpConfig" in condition %}
+ <SourceIpConfig>
+ <Values>
+ {% for value in condition["SourceIpConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </SourceIpConfig>
+ {% endif %}
+ {% if "PathPatternConfig" in condition %}
+ <PathPatternConfig>
+ <Values>
+ {% for value in condition["PathPatternConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </PathPatternConfig>
+ {% endif %}
+ {% if "HostHeaderConfig" in condition %}
+ <HostHeaderConfig>
+ <Values>
+ {% for value in condition["HostHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HostHeaderConfig>
+ {% endif %}
+ {% if "Values" in condition %}
+ <Values>
+ {% for value in condition["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Conditions>
+ <Priority>{{ rule.priority }}</Priority>
+ <RuleArn>{{ rule.arn }}</RuleArn>
+ <Actions>
+ {% for action in rule.actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </Actions>
+ </member>
+ {% endfor %}
+ </Rules>
+ {% if marker %}
+ <NextMarker>{{ marker }}</NextMarker>
+ {% endif %}
+ </DescribeRulesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeRulesResponse>"""
+
+DESCRIBE_TARGET_GROUPS_TEMPLATE = """<DescribeTargetGroupsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeTargetGroupsResult>
+ <TargetGroups>
+ {% for target_group in target_groups %}
+ <member>
+ <TargetGroupArn>{{ target_group.arn }}</TargetGroupArn>
+ <TargetGroupName>{{ target_group.name }}</TargetGroupName>
+ {% if target_group.protocol %}
+ <Protocol>{{ target_group.protocol }}</Protocol>
+ <ProtocolVersion>{{ target_group.protocol_version }}</ProtocolVersion>
+ {% endif %}
+ {% if target_group.port %}
+ <Port>{{ target_group.port }}</Port>
+ {% endif %}
+ {% if target_group.vpc_id %}
+ <VpcId>{{ target_group.vpc_id }}</VpcId>
+ {% endif %}
+ <HealthCheckProtocol>{{ target_group.healthcheck_protocol }}</HealthCheckProtocol>
+ {% if target_group.healthcheck_port %}<HealthCheckPort>{{ target_group.healthcheck_port }}</HealthCheckPort>{% endif %}
+ <HealthCheckPath>{{ target_group.healthcheck_path or '' }}</HealthCheckPath>
+ <HealthCheckIntervalSeconds>{{ target_group.healthcheck_interval_seconds }}</HealthCheckIntervalSeconds>
+ <HealthCheckTimeoutSeconds>{{ target_group.healthcheck_timeout_seconds }}</HealthCheckTimeoutSeconds>
+ <HealthCheckEnabled>{{ target_group.healthcheck_enabled and 'true' or 'false' }}</HealthCheckEnabled>
+ <HealthyThresholdCount>{{ target_group.healthy_threshold_count }}</HealthyThresholdCount>
+ <UnhealthyThresholdCount>{{ target_group.unhealthy_threshold_count }}</UnhealthyThresholdCount>
+ {% if target_group.matcher %}
+ <Matcher>
+ <HttpCode>{{ target_group.matcher['HttpCode'] }}</HttpCode>
+ </Matcher>
+ {% endif %}
+ {% if target_group.target_type %}
+ <TargetType>{{ target_group.target_type }}</TargetType>
+ {% endif %}
+ <LoadBalancerArns>
+ {% for load_balancer_arn in target_group.load_balancer_arns %}
+ <member>{{ load_balancer_arn }}</member>
+ {% endfor %}
+ </LoadBalancerArns>
+ </member>
+ {% endfor %}
+ </TargetGroups>
+ </DescribeTargetGroupsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeTargetGroupsResponse>"""
+
+DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """<DescribeTargetGroupAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeTargetGroupAttributesResult>
+ <Attributes>
+ {% for key, value in attributes.items() %}
+ <member>
+ <Key>{{ key }}</Key>
+ <Value>{{ value }}</Value>
+ </member>
+ {% endfor %}
+ </Attributes>
+ </DescribeTargetGroupAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeTargetGroupAttributesResponse>"""
+
+DESCRIBE_LISTENERS_TEMPLATE = """<DescribeListenersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeListenersResult>
+ <Listeners>
+ {% for listener in listeners %}
+ <member>
+ <LoadBalancerArn>{{ listener.load_balancer_arn }}</LoadBalancerArn>
+ <Protocol>{{ listener.protocol }}</Protocol>
+ {% if listener.certificate %}
+ <Certificates>
+ <member>
+ <CertificateArn>{{ listener.certificate }}</CertificateArn>
+ </member>
+ </Certificates>
+ {% endif %}
+ {% if listener.port %}<Port>{{ listener.port }}</Port>{% endif %}
+ <SslPolicy>{{ listener.ssl_policy }}</SslPolicy>
+ <ListenerArn>{{ listener.arn }}</ListenerArn>
+ <DefaultActions>
+ {% for action in listener.default_actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </DefaultActions>
+ <AlpnPolicy>
+ {% for policy in listener.alpn_policy %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </AlpnPolicy>
+ </member>
+ {% endfor %}
+ </Listeners>
+ </DescribeListenersResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeListenersResponse>"""
+
+CONFIGURE_HEALTH_CHECK_TEMPLATE = """<ConfigureHealthCheckResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ConfigureHealthCheckResult>
+ <HealthCheck>
+ <Interval>{{ check.interval }}</Interval>
+ <Target>{{ check.target }}</Target>
+ <HealthyThreshold>{{ check.healthy_threshold }}</HealthyThreshold>
+ <Timeout>{{ check.timeout }}</Timeout>
+ <UnhealthyThreshold>{{ check.unhealthy_threshold }}</UnhealthyThreshold>
+ </HealthCheck>
+ </ConfigureHealthCheckResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ConfigureHealthCheckResponse>"""
+
+MODIFY_RULE_TEMPLATE = """<ModifyRuleResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyRuleResult>
+ <Rules>
+ <member>
+ <IsDefault>{{ "true" if rules.is_default else "false" }}</IsDefault>
+ <Conditions>
+ {% for condition in rules.conditions %}
+ <member>
+ <Field>{{ condition["Field"] }}</Field>
+ {% if "PathPatternConfig" in condition %}
+ <PathPatternConfig>
+ <Values>
+ {% for value in condition["PathPatternConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </PathPatternConfig>
+ {% endif %}
+ {% if "HostHeaderConfig" in condition %}
+ <HostHeaderConfig>
+ <Values>
+ {% for value in condition["HostHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HostHeaderConfig>
+ {% endif %}
+ {% if "HttpHeaderConfig" in condition %}
+ <HttpHeaderConfig>
+ <HttpHeaderName>{{ condition["HttpHeaderConfig"]["HttpHeaderName"] }}</HttpHeaderName>
+ <Values>
+ {% for value in condition["HttpHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpHeaderConfig>
+ {% endif %}
+ {% if "HttpRequestMethodConfig" in condition %}
+ <HttpRequestMethodConfig>
+ <Values>
+ {% for value in condition["HttpRequestMethodConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpRequestMethodConfig>
+ {% endif %}
+ {% if "QueryStringConfig" in condition %}
+ <QueryStringConfig>
+ <Values>
+ {% for value in condition["QueryStringConfig"]["Values"] %}
+ <member>
+ <Key>{{ value["Key"] }}</Key>
+ <Value>{{ value["Value"] }}</Value>
+ </member>
+ {% endfor %}
+ </Values>
+ </QueryStringConfig>
+ {% endif %}
+ {% if "SourceIpConfig" in condition %}
+ <SourceIpConfig>
+ <Values>
+ {% for value in condition["SourceIpConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </SourceIpConfig>
+ {% endif %}
+ {% if "Values" in condition %}
+ <Values>
+ {% for value in condition["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Conditions>
+ <Priority>{{ rules.priority }}</Priority>
+ <RuleArn>{{ rules.arn }}</RuleArn>
+ <Actions>
+ {% for action in rules.actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </Actions>
+ </member>
+ </Rules>
+ </ModifyRuleResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyRuleResponse>"""
+
+MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """<ModifyTargetGroupAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyTargetGroupAttributesResult>
+ <Attributes>
+ {% for key, value in attributes.items() %}
+ <member>
+ <Key>{{ key }}</Key>
+ <Value>{{ value }}</Value>
+ </member>
+ {% endfor %}
+ </Attributes>
+ </ModifyTargetGroupAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyTargetGroupAttributesResponse>"""
+
+REGISTER_TARGETS_TEMPLATE = """<RegisterTargetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <RegisterTargetsResult>
+ </RegisterTargetsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</RegisterTargetsResponse>"""
+
+DEREGISTER_TARGETS_TEMPLATE = """<DeregisterTargetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DeregisterTargetsResult>
+ </DeregisterTargetsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DeregisterTargetsResponse>"""
+
+SET_LOAD_BALANCER_SSL_CERTIFICATE = """<SetLoadBalancerListenerSSLCertificateResponse xmlns="http://elasticloadbalan cing.amazonaws.com/doc/2015-12-01/">
+ <SetLoadBalancerListenerSSLCertificateResult/>
+<ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+</ResponseMetadata>
+</SetLoadBalancerListenerSSLCertificateResponse>"""
+
+DELETE_LOAD_BALANCER_LISTENERS = """<DeleteLoadBalancerListenersResponse xmlns="http://elasticloadbalan cing.amazonaws.com/doc/2015-12-01/">
+ <DeleteLoadBalancerListenersResult/>
+<ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+</ResponseMetadata>
+</DeleteLoadBalancerListenersResponse>"""
+
+DESCRIBE_ATTRIBUTES_TEMPLATE = """<DescribeLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeLoadBalancerAttributesResult>
+ <LoadBalancerAttributes>
+ <AccessLog>
+ <Enabled>{{ attributes.access_log.enabled }}</Enabled>
+ {% if attributes.access_log.enabled %}
+ <S3BucketName>{{ attributes.access_log.s3_bucket_name }}</S3BucketName>
+ <S3BucketPrefix>{{ attributes.access_log.s3_bucket_prefix }}</S3BucketPrefix>
+ <EmitInterval>{{ attributes.access_log.emit_interval }}</EmitInterval>
+ {% endif %}
+ </AccessLog>
+ <ConnectionSettings>
+ <IdleTimeout>{{ attributes.connecting_settings.idle_timeout }}</IdleTimeout>
+ </ConnectionSettings>
+ <CrossZoneLoadBalancing>
+ <Enabled>{{ attributes.cross_zone_load_balancing.enabled }}</Enabled>
+ </CrossZoneLoadBalancing>
+ <ConnectionDraining>
+ {% if attributes.connection_draining.enabled %}
+ <Enabled>true</Enabled>
+ <Timeout>{{ attributes.connection_draining.timeout }}</Timeout>
+ {% else %}
+ <Enabled>false</Enabled>
+ {% endif %}
+ </ConnectionDraining>
+ </LoadBalancerAttributes>
+ </DescribeLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancerAttributesResponse>
+"""
+
+MODIFY_ATTRIBUTES_TEMPLATE = """<ModifyLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyLoadBalancerAttributesResult>
+ <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
+ <LoadBalancerAttributes>
+ <AccessLog>
+ <Enabled>{{ attributes.access_log.enabled }}</Enabled>
+ {% if attributes.access_log.enabled %}
+ <S3BucketName>{{ attributes.access_log.s3_bucket_name }}</S3BucketName>
+ <S3BucketPrefix>{{ attributes.access_log.s3_bucket_prefix }}</S3BucketPrefix>
+ <EmitInterval>{{ attributes.access_log.emit_interval }}</EmitInterval>
+ {% endif %}
+ </AccessLog>
+ <ConnectionSettings>
+ <IdleTimeout>{{ attributes.connecting_settings.idle_timeout }}</IdleTimeout>
+ </ConnectionSettings>
+ <CrossZoneLoadBalancing>
+ <Enabled>{{ attributes.cross_zone_load_balancing.enabled }}</Enabled>
+ </CrossZoneLoadBalancing>
+ <ConnectionDraining>
+ {% if attributes.connection_draining.enabled %}
+ <Enabled>true</Enabled>
+ <Timeout>{{ attributes.connection_draining.timeout }}</Timeout>
+ {% else %}
+ <Enabled>false</Enabled>
+ {% endif %}
+ </ConnectionDraining>
+ </LoadBalancerAttributes>
+ </ModifyLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyLoadBalancerAttributesResponse>
+"""
+
+CREATE_LOAD_BALANCER_POLICY_TEMPLATE = """<CreateLoadBalancerPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <CreateLoadBalancerPolicyResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</CreateLoadBalancerPolicyResponse>
+"""
+
+SET_LOAD_BALANCER_POLICIES_OF_LISTENER_TEMPLATE = """<SetLoadBalancerPoliciesOfListenerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetLoadBalancerPoliciesOfListenerResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetLoadBalancerPoliciesOfListenerResponse>
+"""
+
+SET_LOAD_BALANCER_POLICIES_FOR_BACKEND_SERVER_TEMPLATE = """<SetLoadBalancerPoliciesForBackendServerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetLoadBalancerPoliciesForBackendServerResult/>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetLoadBalancerPoliciesForBackendServerResponse>
+"""
+
+DESCRIBE_TARGET_HEALTH_TEMPLATE = """<DescribeTargetHealthResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeTargetHealthResult>
+ <TargetHealthDescriptions>
+ {% for target_health in target_health_descriptions %}
+ <member>
+ {% if target_health.health_port %}<HealthCheckPort>{{ target_health.health_port }}</HealthCheckPort>{% endif %}
+ <TargetHealth>
+ <State>{{ target_health.status }}</State>
+ {% if target_health.reason %}
+ <Reason>{{ target_health.reason }}</Reason>
+ {% endif %}
+ {% if target_health.description %}
+ <Description>{{ target_health.description }}</Description>
+ {% endif %}
+ </TargetHealth>
+ <Target>
+ {% if target_health.port %}
+ <Port>{{ target_health.port }}</Port>
+ {% endif %}
+ <Id>{{ target_health.instance_id }}</Id>
+ </Target>
+ </member>
+ {% endfor %}
+ </TargetHealthDescriptions>
+ </DescribeTargetHealthResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeTargetHealthResponse>"""
+
+SET_RULE_PRIORITIES_TEMPLATE = """<SetRulePrioritiesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetRulePrioritiesResult>
+ <Rules>
+ {% for rule in rules %}
+ <member>
+ <IsDefault>{{ "true" if rule.is_default else "false" }}</IsDefault>
+ <Conditions>
+ {% for condition in rule.conditions %}
+ <member>
+ <Field>{{ condition["Field"] }}</Field>
+ {% if "Values" in condition %}
+ <Values>
+ {% for value in condition["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ {% endif %}
+ {% if "HttpHeaderConfig" in condition %}
+ <HttpHeaderConfig>
+ <HttpHeaderName>{{ condition["HttpHeaderConfig"]["HttpHeaderName"] }}</HttpHeaderName>
+ <Values>
+ {% for value in condition["HttpHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpHeaderConfig>
+ {% endif %}
+ {% if "HttpRequestMethodConfig" in condition %}
+ <HttpRequestMethodConfig>
+ <Values>
+ {% for value in condition["HttpRequestMethodConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HttpRequestMethodConfig>
+ {% endif %}
+ {% if "QueryStringConfig" in condition %}
+ <QueryStringConfig>
+ <Values>
+ {% for value in condition["QueryStringConfig"]["Values"] %}
+ <member>
+ <Key>{{ value["Key"] }}</Key>
+ <Value>{{ value["Value"] }}</Value>
+ </member>
+ {% endfor %}
+ </Values>
+ </QueryStringConfig>
+ {% endif %}
+ {% if "SourceIpConfig" in condition %}
+ <SourceIpConfig>
+ <Values>
+ {% for value in condition["SourceIpConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </SourceIpConfig>
+ {% endif %}
+ {% if "PathPatternConfig" in condition %}
+ <PathPatternConfig>
+ <Values>
+ {% for value in condition["PathPatternConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </PathPatternConfig>
+ {% endif %}
+ {% if "HostHeaderConfig" in condition %}
+ <HostHeaderConfig>
+ <Values>
+ {% for value in condition["HostHeaderConfig"]["Values"] %}
+ <member>{{ value }}</member>
+ {% endfor %}
+ </Values>
+ </HostHeaderConfig>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Conditions>
+ <Priority>{{ rule.priority }}</Priority>
+ <RuleArn>{{ rule.arn }}</RuleArn>
+ <Actions>
+ {% for action in rule.actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </Actions>
+ </member>
+ {% endfor %}
+ </Rules>
+ </SetRulePrioritiesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetRulePrioritiesResponse>"""
+
+DESCRIBE_LIMITS_TEMPLATE = """<DescribeAccountLimitsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeAccountLimitsResult>
+ <Limits>
+ {% for key, value in limits.items() %}
+ <member>
+ <Name>{{ key }}</Name>
+ <Max>{{ value }}</Max>
+ </member>
+ {% endfor %}
+ </Limits>
+ </DescribeAccountLimitsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeAccountLimitsResponse>"""
+
+DESCRIBE_SSL_POLICIES_TEMPLATE = """<DescribeSSLPoliciesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeSSLPoliciesResult>
+ <SslPolicies>
+ {% for policy in policies %}
+ <member>
+ <Name>{{ policy['name'] }}</Name>
+ <Ciphers>
+ {% for cipher in policy['ciphers'] %}
+ <member>
+ <Name>{{ cipher['name'] }}</Name>
+ <Priority>{{ cipher['priority'] }}</Priority>
+ </member>
+ {% endfor %}
+ </Ciphers>
+ <SslProtocols>
+ {% for proto in policy['ssl_protocols'] %}
+ <member>{{ proto }}</member>
+ {% endfor %}
+ </SslProtocols>
+ </member>
+ {% endfor %}
+ </SslPolicies>
+ </DescribeSSLPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeSSLPoliciesResponse>"""
+
+SET_IP_ADDRESS_TYPE_TEMPLATE = """<SetIpAddressTypeResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetIpAddressTypeResult>
+ <IpAddressType>{{ ip_type }}</IpAddressType>
+ </SetIpAddressTypeResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetIpAddressTypeResponse>"""
+
+SET_SECURITY_GROUPS_TEMPLATE = """<SetSecurityGroupsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetSecurityGroupsResult>
+ <SecurityGroupIds>
+ {% for group in sec_groups %}
+ <member>{{ group }}</member>
+ {% endfor %}
+ </SecurityGroupIds>
+ </SetSecurityGroupsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetSecurityGroupsResponse>"""
+
+SET_SUBNETS_TEMPLATE = """<SetSubnetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <SetSubnetsResult>
+ <AvailabilityZones>
+ {% for zone_id, subnet_id in subnets %}
+ <member>
+ <SubnetId>{{ subnet_id }}</SubnetId>
+ <ZoneName>{{ zone_id }}</ZoneName>
+ </member>
+ {% endfor %}
+ </AvailabilityZones>
+ </SetSubnetsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</SetSubnetsResponse>"""
+
+MODIFY_LOADBALANCER_ATTRS_TEMPLATE = """<ModifyLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyLoadBalancerAttributesResult>
+ <Attributes>
+ {% for key, value in attrs.items() %}
+ <member>
+ {% if value == None %}<Value />{% else %}<Value>{{ value }}</Value>{% endif %}
+ <Key>{{ key }}</Key>
+ </member>
+ {% endfor %}
+ </Attributes>
+ </ModifyLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyLoadBalancerAttributesResponse>"""
+
+DESCRIBE_LOADBALANCER_ATTRS_TEMPLATE = """<DescribeLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeLoadBalancerAttributesResult>
+ <Attributes>
+ {% for key, value in attrs.items() %}
+ <member>
+ {% if value == None %}<Value />{% else %}<Value>{{ value }}</Value>{% endif %}
+ <Key>{{ key }}</Key>
+ </member>
+ {% endfor %}
+ </Attributes>
+ </DescribeLoadBalancerAttributesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeLoadBalancerAttributesResponse>"""
+
+
+MODIFY_TARGET_GROUP_TEMPLATE = """<ModifyTargetGroupResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyTargetGroupResult>
+ <TargetGroups>
+ <member>
+ <TargetGroupArn>{{ target_group.arn }}</TargetGroupArn>
+ <TargetGroupName>{{ target_group.name }}</TargetGroupName>
+ <Protocol>{{ target_group.protocol }}</Protocol>
+ {% if target_group.port %}<Port>{{ target_group.port }}</Port>{% endif %}
+ <VpcId>{{ target_group.vpc_id }}</VpcId>
+ <HealthCheckProtocol>{{ target_group.healthcheck_protocol }}</HealthCheckProtocol>
+ {% if target_group.healthcheck_port %}<HealthCheckPort>{{ target_group.healthcheck_port }}</HealthCheckPort>{% endif %}
+ <HealthCheckPath>{{ target_group.healthcheck_path }}</HealthCheckPath>
+ <HealthCheckIntervalSeconds>{{ target_group.healthcheck_interval_seconds }}</HealthCheckIntervalSeconds>
+ <HealthCheckTimeoutSeconds>{{ target_group.healthcheck_timeout_seconds }}</HealthCheckTimeoutSeconds>
+ <HealthyThresholdCount>{{ target_group.healthy_threshold_count }}</HealthyThresholdCount>
+ <UnhealthyThresholdCount>{{ target_group.unhealthy_threshold_count }}</UnhealthyThresholdCount>
+ {% if target_group.protocol in ["HTTP", "HTTPS"] %}
+ <Matcher>
+ <HttpCode>{{ target_group.matcher['HttpCode'] }}</HttpCode>
+ </Matcher>
+ {% endif %}
+ <LoadBalancerArns>
+ {% for load_balancer_arn in target_group.load_balancer_arns %}
+ <member>{{ load_balancer_arn }}</member>
+ {% endfor %}
+ </LoadBalancerArns>
+ </member>
+ </TargetGroups>
+ </ModifyTargetGroupResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyTargetGroupResponse>"""
+
+MODIFY_LISTENER_TEMPLATE = """<ModifyListenerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <ModifyListenerResult>
+ <Listeners>
+ <member>
+ <LoadBalancerArn>{{ listener.load_balancer_arn }}</LoadBalancerArn>
+ <Protocol>{{ listener.protocol }}</Protocol>
+ {% if listener.certificates %}
+ <Certificates>
+ {% for cert in listener.certificates %}
+ <member>
+ <CertificateArn>{{ cert["certificate_arn"] }}</CertificateArn>
+ </member>
+ {% endfor %}
+ </Certificates>
+ {% endif %}
+ <Port>{{ listener.port }}</Port>
+ <SslPolicy>{{ listener.ssl_policy }}</SslPolicy>
+ <ListenerArn>{{ listener.arn }}</ListenerArn>
+ <DefaultActions>
+ {% for action in listener.default_actions %}
+ <member>
+ {{ action.to_xml() }}
+ </member>
+ {% endfor %}
+ </DefaultActions>
+ </member>
+ </Listeners>
+ </ModifyListenerResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ModifyListenerResponse>"""
+
+ADD_LISTENER_CERTIFICATES_TEMPLATE = """<AddListenerCertificatesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <AddListenerCertificatesResult>
+ <Certificates>
+ {% for cert in certificates %}
+ <member>
+ <CertificateArn>{{ cert }}</CertificateArn>
+ </member>
+ {% endfor %}
+ </Certificates>
+ </AddListenerCertificatesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</AddListenerCertificatesResponse>"""
+
+DESCRIBE_LISTENER_CERTIFICATES_TEMPLATE = """<DescribeListenerCertificatesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <DescribeListenerCertificatesResult>
+ <Certificates>
+ {% for cert in certificates %}
+ <member>
+ <CertificateArn>{{ cert }}</CertificateArn>
+ </member>
+ {% endfor %}
+ </Certificates>
+ </DescribeListenerCertificatesResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</DescribeListenerCertificatesResponse>"""
+
+REMOVE_LISTENER_CERTIFICATES_TEMPLATE = """<RemoveListenerCertificatesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
+ <RemoveListenerCertificatesResult />
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</RemoveListenerCertificatesResponse>"""
diff --git a/contrib/python/moto/py3/moto/elbv2/urls.py b/contrib/python/moto/py3/moto/elbv2/urls.py
new file mode 100644
index 0000000000..7617b941b3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/urls.py
@@ -0,0 +1,5 @@
+from ..elb.urls import api_version_elb_backend
+
+url_bases = [r"https?://elasticloadbalancing\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": api_version_elb_backend}
diff --git a/contrib/python/moto/py3/moto/elbv2/utils.py b/contrib/python/moto/py3/moto/elbv2/utils.py
new file mode 100644
index 0000000000..6a9ecb458c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/elbv2/utils.py
@@ -0,0 +1,10 @@
+def make_arn_for_load_balancer(account_id, name, region_name):
+ return "arn:aws:elasticloadbalancing:{}:{}:loadbalancer/app/{}/50dc6c495c0c9188".format(
+ region_name, account_id, name
+ )
+
+
+def make_arn_for_target_group(account_id, name, region_name):
+ return "arn:aws:elasticloadbalancing:{}:{}:targetgroup/{}/50dc6c495c0c9188".format(
+ region_name, account_id, name
+ )
diff --git a/contrib/python/moto/py3/moto/emr/__init__.py b/contrib/python/moto/py3/moto/emr/__init__.py
new file mode 100644
index 0000000000..dc95b003a6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/__init__.py
@@ -0,0 +1,5 @@
+from .models import emr_backends
+from ..core.models import base_decorator
+
+emr_backend = emr_backends["us-east-1"]
+mock_emr = base_decorator(emr_backends)
diff --git a/contrib/python/moto/py3/moto/emr/exceptions.py b/contrib/python/moto/py3/moto/emr/exceptions.py
new file mode 100644
index 0000000000..fe3c878ea8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/exceptions.py
@@ -0,0 +1,16 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidRequestException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("InvalidRequestException", message, **kwargs)
+
+
+class ValidationException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ValidationException", message, **kwargs)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ResourceNotFoundException", message, **kwargs)
diff --git a/contrib/python/moto/py3/moto/emr/models.py b/contrib/python/moto/py3/moto/emr/models.py
new file mode 100644
index 0000000000..3411f573c0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/models.py
@@ -0,0 +1,707 @@
+from datetime import datetime
+from datetime import timedelta
+
+import warnings
+
+import pytz
+from dateutil.parser import parse as dtparse
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.emr.exceptions import (
+ InvalidRequestException,
+ ValidationException,
+ ResourceNotFoundException,
+)
+from .utils import (
+ random_instance_group_id,
+ random_cluster_id,
+ random_step_id,
+ CamelToUnderscoresWalker,
+ EmrSecurityGroupManager,
+)
+
+EXAMPLE_AMI_ID = "ami-12c6146b"
+
+
+class FakeApplication(BaseModel):
+ def __init__(self, name, version, args=None, additional_info=None):
+ self.additional_info = additional_info or {}
+ self.args = args or []
+ self.name = name
+ self.version = version
+
+
+class FakeBootstrapAction(BaseModel):
+ def __init__(self, args, name, script_path):
+ self.args = args or []
+ self.name = name
+ self.script_path = script_path
+
+
+class FakeInstance(BaseModel):
+ def __init__(
+ self, ec2_instance_id, instance_group, instance_fleet_id=None, instance_id=None
+ ):
+ self.id = instance_id or random_instance_group_id()
+ self.ec2_instance_id = ec2_instance_id
+ self.instance_group = instance_group
+ self.instance_fleet_id = instance_fleet_id
+
+
+class FakeInstanceGroup(BaseModel):
+ def __init__(
+ self,
+ cluster_id,
+ instance_count,
+ instance_role,
+ instance_type,
+ market="ON_DEMAND",
+ name=None,
+ instance_group_id=None,
+ bid_price=None,
+ ebs_configuration=None,
+ auto_scaling_policy=None,
+ ):
+ self.id = instance_group_id or random_instance_group_id()
+ self.cluster_id = cluster_id
+
+ self.bid_price = bid_price
+ self.market = market
+ if name is None:
+ if instance_role == "MASTER":
+ name = "master"
+ elif instance_role == "CORE":
+ name = "slave"
+ else:
+ name = "Task instance group"
+ self.name = name
+ self.num_instances = instance_count
+ self.role = instance_role
+ self.type = instance_type
+ self.ebs_configuration = ebs_configuration
+ self.auto_scaling_policy = auto_scaling_policy
+ self.creation_datetime = datetime.now(pytz.utc)
+ self.start_datetime = datetime.now(pytz.utc)
+ self.ready_datetime = datetime.now(pytz.utc)
+ self.end_datetime = None
+ self.state = "RUNNING"
+
+ def set_instance_count(self, instance_count):
+ self.num_instances = instance_count
+
+ @property
+ def auto_scaling_policy(self):
+ return self._auto_scaling_policy
+
+ @auto_scaling_policy.setter
+ def auto_scaling_policy(self, value):
+ if value is None:
+ self._auto_scaling_policy = value
+ return
+ self._auto_scaling_policy = CamelToUnderscoresWalker.parse(value)
+ self._auto_scaling_policy["status"] = {"state": "ATTACHED"}
+ # Transform common ${emr.clusterId} placeholder in any dimensions it occurs in.
+ if "rules" in self._auto_scaling_policy:
+ for rule in self._auto_scaling_policy["rules"]:
+ if (
+ "trigger" in rule
+ and "cloud_watch_alarm_definition" in rule["trigger"]
+ and "dimensions" in rule["trigger"]["cloud_watch_alarm_definition"]
+ ):
+ for dimension in rule["trigger"]["cloud_watch_alarm_definition"][
+ "dimensions"
+ ]:
+ if (
+ "value" in dimension
+ and dimension["value"] == "${emr.clusterId}"
+ ):
+ dimension["value"] = self.cluster_id
+
+
+class FakeStep(BaseModel):
+ def __init__(
+ self,
+ state,
+ name="",
+ jar="",
+ args=None,
+ properties=None,
+ action_on_failure="TERMINATE_CLUSTER",
+ ):
+ self.id = random_step_id()
+
+ self.action_on_failure = action_on_failure
+ self.args = args or []
+ self.name = name
+ self.jar = jar
+ self.properties = properties or {}
+
+ self.creation_datetime = datetime.now(pytz.utc)
+ self.end_datetime = None
+ self.ready_datetime = None
+ self.start_datetime = None
+ self.state = state
+
+ def start(self):
+ self.start_datetime = datetime.now(pytz.utc)
+
+
+class FakeCluster(BaseModel):
+ def __init__(
+ self,
+ emr_backend,
+ name,
+ log_uri,
+ job_flow_role,
+ service_role,
+ steps,
+ instance_attrs,
+ bootstrap_actions=None,
+ configurations=None,
+ cluster_id=None,
+ visible_to_all_users="false",
+ release_label=None,
+ requested_ami_version=None,
+ running_ami_version=None,
+ custom_ami_id=None,
+ step_concurrency_level=1,
+ security_configuration=None,
+ kerberos_attributes=None,
+ auto_scaling_role=None,
+ ):
+ self.id = cluster_id or random_cluster_id()
+ emr_backend.clusters[self.id] = self
+ self.emr_backend = emr_backend
+
+ self.applications = []
+
+ self.bootstrap_actions = []
+ for bootstrap_action in bootstrap_actions or []:
+ self.add_bootstrap_action(bootstrap_action)
+
+ self.configurations = configurations or []
+
+ self.tags = {}
+
+ self.log_uri = log_uri
+ self.name = name
+ self.normalized_instance_hours = 0
+
+ self.steps = []
+ self.add_steps(steps)
+
+ self.set_visibility(visible_to_all_users)
+
+ self.instance_group_ids = []
+ self.instances = []
+ self.master_instance_group_id = None
+ self.core_instance_group_id = None
+ if (
+ "master_instance_type" in instance_attrs
+ and instance_attrs["master_instance_type"]
+ ):
+ self.emr_backend.add_instance_groups(
+ self.id,
+ [
+ {
+ "instance_count": 1,
+ "instance_role": "MASTER",
+ "instance_type": instance_attrs["master_instance_type"],
+ "market": "ON_DEMAND",
+ "name": "master",
+ }
+ ],
+ )
+ if (
+ "slave_instance_type" in instance_attrs
+ and instance_attrs["slave_instance_type"]
+ ):
+ self.emr_backend.add_instance_groups(
+ self.id,
+ [
+ {
+ "instance_count": instance_attrs["instance_count"] - 1,
+ "instance_role": "CORE",
+ "instance_type": instance_attrs["slave_instance_type"],
+ "market": "ON_DEMAND",
+ "name": "slave",
+ }
+ ],
+ )
+ self.additional_master_security_groups = instance_attrs.get(
+ "additional_master_security_groups"
+ )
+ self.additional_slave_security_groups = instance_attrs.get(
+ "additional_slave_security_groups"
+ )
+ self.availability_zone = instance_attrs.get("availability_zone")
+ self.ec2_key_name = instance_attrs.get("ec2_key_name")
+ self.ec2_subnet_id = instance_attrs.get("ec2_subnet_id")
+ self.hadoop_version = instance_attrs.get("hadoop_version")
+ self.keep_job_flow_alive_when_no_steps = instance_attrs.get(
+ "keep_job_flow_alive_when_no_steps"
+ )
+ self.master_security_group = instance_attrs.get(
+ "emr_managed_master_security_group"
+ )
+ self.service_access_security_group = instance_attrs.get(
+ "service_access_security_group"
+ )
+ self.slave_security_group = instance_attrs.get(
+ "emr_managed_slave_security_group"
+ )
+ self.termination_protected = instance_attrs.get("termination_protected")
+
+ self.release_label = release_label
+ self.requested_ami_version = requested_ami_version
+ self.running_ami_version = running_ami_version
+ self.custom_ami_id = custom_ami_id
+
+ self.role = job_flow_role or "EMRJobflowDefault"
+ self.service_role = service_role
+ self.step_concurrency_level = step_concurrency_level
+
+ self.creation_datetime = datetime.now(pytz.utc)
+ self.start_datetime = None
+ self.ready_datetime = None
+ self.end_datetime = None
+ self.state = None
+
+ self.start_cluster()
+ self.run_bootstrap_actions()
+ if self.steps:
+ self.steps[0].start()
+ self.security_configuration = (
+ security_configuration # ToDo: Raise if doesn't already exist.
+ )
+ self.kerberos_attributes = kerberos_attributes
+ self.auto_scaling_role = auto_scaling_role
+
+ @property
+ def arn(self):
+ return "arn:aws:elasticmapreduce:{0}:{1}:cluster/{2}".format(
+ self.emr_backend.region_name, get_account_id(), self.id
+ )
+
+ @property
+ def instance_groups(self):
+ return self.emr_backend.get_instance_groups(self.instance_group_ids)
+
+ @property
+ def master_instance_type(self):
+ return self.emr_backend.instance_groups[self.master_instance_group_id].type
+
+ @property
+ def slave_instance_type(self):
+ return self.emr_backend.instance_groups[self.core_instance_group_id].type
+
+ @property
+ def instance_count(self):
+ return sum(group.num_instances for group in self.instance_groups)
+
+ def start_cluster(self):
+ self.state = "STARTING"
+ self.start_datetime = datetime.now(pytz.utc)
+
+ def run_bootstrap_actions(self):
+ self.state = "BOOTSTRAPPING"
+ self.ready_datetime = datetime.now(pytz.utc)
+ self.state = "WAITING"
+ if not self.steps:
+ if not self.keep_job_flow_alive_when_no_steps:
+ self.terminate()
+
+ def terminate(self):
+ self.state = "TERMINATING"
+ self.end_datetime = datetime.now(pytz.utc)
+ self.state = "TERMINATED"
+
+ def add_applications(self, applications):
+ self.applications.extend(
+ [
+ FakeApplication(
+ name=app.get("name", ""),
+ version=app.get("version", ""),
+ args=app.get("args", []),
+ additional_info=app.get("additiona_info", {}),
+ )
+ for app in applications
+ ]
+ )
+
+ def add_bootstrap_action(self, bootstrap_action):
+ self.bootstrap_actions.append(FakeBootstrapAction(**bootstrap_action))
+
+ def add_instance_group(self, instance_group):
+ if instance_group.role == "MASTER":
+ if self.master_instance_group_id:
+ raise Exception("Cannot add another master instance group")
+ self.master_instance_group_id = instance_group.id
+ num_master_nodes = instance_group.num_instances
+ if num_master_nodes > 1:
+ # Cluster is HA
+ if num_master_nodes != 3:
+ raise ValidationException(
+ "Master instance group must have exactly 3 instances for HA clusters."
+ )
+ self.keep_job_flow_alive_when_no_steps = True
+ self.termination_protected = True
+ if instance_group.role == "CORE":
+ if self.core_instance_group_id:
+ raise Exception("Cannot add another core instance group")
+ self.core_instance_group_id = instance_group.id
+ self.instance_group_ids.append(instance_group.id)
+
+ def add_instance(self, instance):
+ self.instances.append(instance)
+
+ def add_steps(self, steps):
+ added_steps = []
+ for step in steps:
+ if self.steps:
+ # If we already have other steps, this one is pending
+ fake = FakeStep(state="PENDING", **step)
+ else:
+ fake = FakeStep(state="RUNNING", **step)
+ self.steps.append(fake)
+ added_steps.append(fake)
+ self.state = "RUNNING"
+ return added_steps
+
+ def add_tags(self, tags):
+ self.tags.update(tags)
+
+ def remove_tags(self, tag_keys):
+ for key in tag_keys:
+ self.tags.pop(key, None)
+
+ def set_termination_protection(self, value):
+ self.termination_protected = value
+
+ def set_visibility(self, visibility):
+ self.visible_to_all_users = visibility
+
+
+class FakeSecurityConfiguration(BaseModel):
+ def __init__(self, name, security_configuration):
+ self.name = name
+ self.security_configuration = security_configuration
+ self.creation_date_time = datetime.now(pytz.utc)
+
+
+class ElasticMapReduceBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.clusters = {}
+ self.instance_groups = {}
+ self.security_configurations = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "elasticmapreduce"
+ )
+
+ @property
+ def ec2_backend(self):
+ """
+ :return: EC2 Backend
+ :rtype: moto.ec2.models.EC2Backend
+ """
+ from moto.ec2 import ec2_backends
+
+ return ec2_backends[self.region_name]
+
+ def add_applications(self, cluster_id, applications):
+ cluster = self.describe_cluster(cluster_id)
+ cluster.add_applications(applications)
+
+ def add_instance_groups(self, cluster_id, instance_groups):
+ cluster = self.clusters[cluster_id]
+ result_groups = []
+ for instance_group in instance_groups:
+ group = FakeInstanceGroup(cluster_id=cluster_id, **instance_group)
+ self.instance_groups[group.id] = group
+ cluster.add_instance_group(group)
+ result_groups.append(group)
+ return result_groups
+
+ def add_instances(self, cluster_id, instances, instance_group):
+ cluster = self.clusters[cluster_id]
+ instances["is_instance_type_default"] = not instances.get("instance_type")
+ response = self.ec2_backend.add_instances(
+ EXAMPLE_AMI_ID, instances["instance_count"], "", [], **instances
+ )
+ for instance in response.instances:
+ instance = FakeInstance(
+ ec2_instance_id=instance.id, instance_group=instance_group
+ )
+ cluster.add_instance(instance)
+
+ def add_job_flow_steps(self, job_flow_id, steps):
+ cluster = self.clusters[job_flow_id]
+ steps = cluster.add_steps(steps)
+ return steps
+
+ def add_tags(self, cluster_id, tags):
+ cluster = self.describe_cluster(cluster_id)
+ cluster.add_tags(tags)
+
+ def describe_job_flows(
+ self,
+ job_flow_ids=None,
+ job_flow_states=None,
+ created_after=None,
+ created_before=None,
+ ):
+ clusters = self.clusters.values()
+
+ within_two_month = datetime.now(pytz.utc) - timedelta(days=60)
+ clusters = [c for c in clusters if c.creation_datetime >= within_two_month]
+
+ if job_flow_ids:
+ clusters = [c for c in clusters if c.id in job_flow_ids]
+ if job_flow_states:
+ clusters = [c for c in clusters if c.state in job_flow_states]
+ if created_after:
+ created_after = dtparse(created_after)
+ clusters = [c for c in clusters if c.creation_datetime > created_after]
+ if created_before:
+ created_before = dtparse(created_before)
+ clusters = [c for c in clusters if c.creation_datetime < created_before]
+
+ # Amazon EMR can return a maximum of 512 job flow descriptions
+ return sorted(clusters, key=lambda x: x.id)[:512]
+
+ def describe_step(self, cluster_id, step_id):
+ cluster = self.clusters[cluster_id]
+ for step in cluster.steps:
+ if step.id == step_id:
+ return step
+
+ def describe_cluster(self, cluster_id):
+ if cluster_id in self.clusters:
+ return self.clusters[cluster_id]
+ raise ResourceNotFoundException("")
+
+ def get_instance_groups(self, instance_group_ids):
+ return [
+ group
+ for group_id, group in self.instance_groups.items()
+ if group_id in instance_group_ids
+ ]
+
+ def list_bootstrap_actions(self, cluster_id, marker=None):
+ max_items = 50
+ actions = self.clusters[cluster_id].bootstrap_actions
+ start_idx = 0 if marker is None else int(marker)
+ marker = (
+ None
+ if len(actions) <= start_idx + max_items
+ else str(start_idx + max_items)
+ )
+ return actions[start_idx : start_idx + max_items], marker
+
+ def list_clusters(
+ self, cluster_states=None, created_after=None, created_before=None, marker=None
+ ):
+ max_items = 50
+ clusters = self.clusters.values()
+ if cluster_states:
+ clusters = [c for c in clusters if c.state in cluster_states]
+ if created_after:
+ created_after = dtparse(created_after)
+ clusters = [c for c in clusters if c.creation_datetime > created_after]
+ if created_before:
+ created_before = dtparse(created_before)
+ clusters = [c for c in clusters if c.creation_datetime < created_before]
+ clusters = sorted(clusters, key=lambda x: x.id)
+ start_idx = 0 if marker is None else int(marker)
+ marker = (
+ None
+ if len(clusters) <= start_idx + max_items
+ else str(start_idx + max_items)
+ )
+ return clusters[start_idx : start_idx + max_items], marker
+
+ def list_instance_groups(self, cluster_id, marker=None):
+ max_items = 50
+ groups = sorted(self.clusters[cluster_id].instance_groups, key=lambda x: x.id)
+ start_idx = 0 if marker is None else int(marker)
+ marker = (
+ None if len(groups) <= start_idx + max_items else str(start_idx + max_items)
+ )
+ return groups[start_idx : start_idx + max_items], marker
+
+ def list_instances(
+ self, cluster_id, marker=None, instance_group_id=None, instance_group_types=None
+ ):
+ max_items = 50
+ groups = sorted(self.clusters[cluster_id].instances, key=lambda x: x.id)
+ start_idx = 0 if marker is None else int(marker)
+ marker = (
+ None if len(groups) <= start_idx + max_items else str(start_idx + max_items)
+ )
+ if instance_group_id:
+ groups = [g for g in groups if g.instance_group.id == instance_group_id]
+ if instance_group_types:
+ groups = [
+ g for g in groups if g.instance_group.role in instance_group_types
+ ]
+ for g in groups:
+ g.details = self.ec2_backend.get_instance(g.ec2_instance_id)
+ return groups[start_idx : start_idx + max_items], marker
+
+ def list_steps(self, cluster_id, marker=None, step_ids=None, step_states=None):
+ max_items = 50
+ steps = sorted(
+ self.clusters[cluster_id].steps,
+ key=lambda o: o.creation_datetime,
+ reverse=True,
+ )
+ if step_ids:
+ steps = [s for s in steps if s.id in step_ids]
+ if step_states:
+ steps = [s for s in steps if s.state in step_states]
+ start_idx = 0 if marker is None else int(marker)
+ marker = (
+ None if len(steps) <= start_idx + max_items else str(start_idx + max_items)
+ )
+ return steps[start_idx : start_idx + max_items], marker
+
+ def modify_cluster(self, cluster_id, step_concurrency_level):
+ cluster = self.clusters[cluster_id]
+ cluster.step_concurrency_level = step_concurrency_level
+ return cluster
+
+ def modify_instance_groups(self, instance_groups):
+ result_groups = []
+ for instance_group in instance_groups:
+ group = self.instance_groups[instance_group["instance_group_id"]]
+ group.set_instance_count(int(instance_group["instance_count"]))
+ return result_groups
+
+ def remove_tags(self, cluster_id, tag_keys):
+ cluster = self.describe_cluster(cluster_id)
+ cluster.remove_tags(tag_keys)
+
+ def _manage_security_groups(
+ self,
+ ec2_subnet_id,
+ emr_managed_master_security_group,
+ emr_managed_slave_security_group,
+ service_access_security_group,
+ **_
+ ):
+ default_return_value = (
+ emr_managed_master_security_group,
+ emr_managed_slave_security_group,
+ service_access_security_group,
+ )
+ if not ec2_subnet_id:
+ # TODO: Set up Security Groups in Default VPC.
+ return default_return_value
+
+ from moto.ec2.exceptions import InvalidSubnetIdError
+
+ try:
+ subnet = self.ec2_backend.get_subnet(ec2_subnet_id)
+ except InvalidSubnetIdError:
+ warnings.warn(
+ "Could not find Subnet with id: {0}\n"
+ "In the near future, this will raise an error.\n"
+ "Use ec2.describe_subnets() to find a suitable id "
+ "for your test.".format(ec2_subnet_id),
+ PendingDeprecationWarning,
+ )
+ return default_return_value
+
+ manager = EmrSecurityGroupManager(self.ec2_backend, subnet.vpc_id)
+ master, slave, service = manager.manage_security_groups(
+ emr_managed_master_security_group,
+ emr_managed_slave_security_group,
+ service_access_security_group,
+ )
+ return master.id, slave.id, service.id
+
+ def run_job_flow(self, **kwargs):
+ (
+ kwargs["instance_attrs"]["emr_managed_master_security_group"],
+ kwargs["instance_attrs"]["emr_managed_slave_security_group"],
+ kwargs["instance_attrs"]["service_access_security_group"],
+ ) = self._manage_security_groups(**kwargs["instance_attrs"])
+ return FakeCluster(self, **kwargs)
+
+ def set_visible_to_all_users(self, job_flow_ids, visible_to_all_users):
+ for job_flow_id in job_flow_ids:
+ cluster = self.clusters[job_flow_id]
+ cluster.set_visibility(visible_to_all_users)
+
+ def set_termination_protection(self, job_flow_ids, value):
+ for job_flow_id in job_flow_ids:
+ cluster = self.clusters[job_flow_id]
+ cluster.set_termination_protection(value)
+
+ def terminate_job_flows(self, job_flow_ids):
+ clusters_terminated = []
+ clusters_protected = []
+ for job_flow_id in job_flow_ids:
+ cluster = self.clusters[job_flow_id]
+ if cluster.termination_protected:
+ clusters_protected.append(cluster)
+ continue
+ cluster.terminate()
+ clusters_terminated.append(cluster)
+ if clusters_protected:
+ raise ValidationException(
+ "Could not shut down one or more job flows since they are termination protected."
+ )
+ return clusters_terminated
+
+ def put_auto_scaling_policy(self, instance_group_id, auto_scaling_policy):
+ instance_groups = self.get_instance_groups(
+ instance_group_ids=[instance_group_id]
+ )
+ if len(instance_groups) == 0:
+ return None
+ instance_group = instance_groups[0]
+ instance_group.auto_scaling_policy = auto_scaling_policy
+ return instance_group
+
+ def remove_auto_scaling_policy(self, instance_group_id):
+ self.put_auto_scaling_policy(instance_group_id, auto_scaling_policy=None)
+
+ def create_security_configuration(self, name, security_configuration):
+ if name in self.security_configurations:
+ raise InvalidRequestException(
+ message="SecurityConfiguration with name '{}' already exists.".format(
+ name
+ )
+ )
+ security_configuration = FakeSecurityConfiguration(
+ name=name, security_configuration=security_configuration
+ )
+ self.security_configurations[name] = security_configuration
+ return security_configuration
+
+ def get_security_configuration(self, name):
+ if name not in self.security_configurations:
+ raise InvalidRequestException(
+ message="Security configuration with name '{}' does not exist.".format(
+ name
+ )
+ )
+ return self.security_configurations[name]
+
+ def delete_security_configuration(self, name):
+ if name not in self.security_configurations:
+ raise InvalidRequestException(
+ message="Security configuration with name '{}' does not exist.".format(
+ name
+ )
+ )
+ del self.security_configurations[name]
+
+
+emr_backends = BackendDict(ElasticMapReduceBackend, "emr")
diff --git a/contrib/python/moto/py3/moto/emr/responses.py b/contrib/python/moto/py3/moto/emr/responses.py
new file mode 100644
index 0000000000..c98e96750f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/responses.py
@@ -0,0 +1,1414 @@
+import json
+import re
+from datetime import datetime
+from functools import wraps
+
+import pytz
+
+from urllib.parse import urlparse
+from moto.core.responses import AWSServiceSpec
+from moto.core.responses import BaseResponse
+from moto.core.responses import xml_to_json_response
+from moto.core.utils import tags_from_query_string
+from .exceptions import ValidationException
+from .models import emr_backends
+from .utils import steps_from_query_string, Unflattener, ReleaseLabel
+
+
+def generate_boto3_response(operation):
+ """The decorator to convert an XML response to JSON, if the request is
+ determined to be from boto3. Pass the API action as a parameter.
+
+ """
+
+ def _boto3_request(method):
+ @wraps(method)
+ def f(self, *args, **kwargs):
+ rendered = method(self, *args, **kwargs)
+ if "json" in self.headers.get("Content-Type", []):
+ self.response_headers.update(
+ {
+ "x-amzn-requestid": "2690d7eb-ed86-11dd-9877-6fad448a8419",
+ "date": datetime.now(pytz.utc).strftime(
+ "%a, %d %b %Y %H:%M:%S %Z"
+ ),
+ "content-type": "application/x-amz-json-1.1",
+ }
+ )
+ resp = xml_to_json_response(self.aws_service_spec, operation, rendered)
+ return "" if resp is None else json.dumps(resp)
+ return rendered
+
+ return f
+
+ return _boto3_request
+
+
+class ElasticMapReduceResponse(BaseResponse):
+
+ # EMR end points are inconsistent in the placement of region name
+ # in the URL, so parsing it out needs to be handled differently
+ region_regex = [
+ re.compile(r"elasticmapreduce\.(.+?)\.amazonaws\.com"),
+ re.compile(r"(.+?)\.elasticmapreduce\.amazonaws\.com"),
+ ]
+
+ aws_service_spec = AWSServiceSpec("data/emr/2009-03-31/service-2.json")
+
+ def get_region_from_url(self, request, full_url):
+ parsed = urlparse(full_url)
+ for regex in self.region_regex:
+ match = regex.search(parsed.netloc)
+ if match:
+ return match.group(1)
+ return self.default_region
+
+ @property
+ def backend(self):
+ return emr_backends[self.region]
+
+ @generate_boto3_response("AddInstanceGroups")
+ def add_instance_groups(self):
+ jobflow_id = self._get_param("JobFlowId")
+ instance_groups = self._get_list_prefix("InstanceGroups.member")
+ for item in instance_groups:
+ item["instance_count"] = int(item["instance_count"])
+ # Adding support to EbsConfiguration
+ self._parse_ebs_configuration(item)
+ # Adding support for auto_scaling_policy
+ Unflattener.unflatten_complex_params(item, "auto_scaling_policy")
+ instance_groups = self.backend.add_instance_groups(jobflow_id, instance_groups)
+ template = self.response_template(ADD_INSTANCE_GROUPS_TEMPLATE)
+ return template.render(instance_groups=instance_groups)
+
+ @generate_boto3_response("AddJobFlowSteps")
+ def add_job_flow_steps(self):
+ job_flow_id = self._get_param("JobFlowId")
+ steps = self.backend.add_job_flow_steps(
+ job_flow_id, steps_from_query_string(self._get_list_prefix("Steps.member"))
+ )
+ template = self.response_template(ADD_JOB_FLOW_STEPS_TEMPLATE)
+ return template.render(steps=steps)
+
+ @generate_boto3_response("AddTags")
+ def add_tags(self):
+ cluster_id = self._get_param("ResourceId")
+ tags = tags_from_query_string(self.querystring, prefix="Tags")
+ self.backend.add_tags(cluster_id, tags)
+ template = self.response_template(ADD_TAGS_TEMPLATE)
+ return template.render()
+
+ def cancel_steps(self):
+ raise NotImplementedError
+
+ @generate_boto3_response("CreateSecurityConfiguration")
+ def create_security_configuration(self):
+ name = self._get_param("Name")
+ security_configuration = self._get_param("SecurityConfiguration")
+ resp = self.backend.create_security_configuration(
+ name=name, security_configuration=security_configuration
+ )
+ template = self.response_template(CREATE_SECURITY_CONFIGURATION_TEMPLATE)
+ return template.render(name=name, creation_date_time=resp.creation_date_time)
+
+ @generate_boto3_response("DescribeSecurityConfiguration")
+ def describe_security_configuration(self):
+ name = self._get_param("Name")
+ security_configuration = self.backend.get_security_configuration(name=name)
+ template = self.response_template(DESCRIBE_SECURITY_CONFIGURATION_TEMPLATE)
+ return template.render(security_configuration=security_configuration)
+
+ @generate_boto3_response("DeleteSecurityConfiguration")
+ def delete_security_configuration(self):
+ name = self._get_param("Name")
+ self.backend.delete_security_configuration(name=name)
+ template = self.response_template(DELETE_SECURITY_CONFIGURATION_TEMPLATE)
+ return template.render()
+
+ @generate_boto3_response("DescribeCluster")
+ def describe_cluster(self):
+ cluster_id = self._get_param("ClusterId")
+ cluster = self.backend.describe_cluster(cluster_id)
+ template = self.response_template(DESCRIBE_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ @generate_boto3_response("DescribeJobFlows")
+ def describe_job_flows(self):
+ created_after = self._get_param("CreatedAfter")
+ created_before = self._get_param("CreatedBefore")
+ job_flow_ids = self._get_multi_param("JobFlowIds.member")
+ job_flow_states = self._get_multi_param("JobFlowStates.member")
+ clusters = self.backend.describe_job_flows(
+ job_flow_ids, job_flow_states, created_after, created_before
+ )
+ template = self.response_template(DESCRIBE_JOB_FLOWS_TEMPLATE)
+ return template.render(clusters=clusters)
+
+ @generate_boto3_response("DescribeStep")
+ def describe_step(self):
+ cluster_id = self._get_param("ClusterId")
+ step_id = self._get_param("StepId")
+ step = self.backend.describe_step(cluster_id, step_id)
+ template = self.response_template(DESCRIBE_STEP_TEMPLATE)
+ return template.render(step=step)
+
+ @generate_boto3_response("ListBootstrapActions")
+ def list_bootstrap_actions(self):
+ cluster_id = self._get_param("ClusterId")
+ marker = self._get_param("Marker")
+ bootstrap_actions, marker = self.backend.list_bootstrap_actions(
+ cluster_id, marker
+ )
+ template = self.response_template(LIST_BOOTSTRAP_ACTIONS_TEMPLATE)
+ return template.render(bootstrap_actions=bootstrap_actions, marker=marker)
+
+ @generate_boto3_response("ListClusters")
+ def list_clusters(self):
+ cluster_states = self._get_multi_param("ClusterStates.member")
+ created_after = self._get_param("CreatedAfter")
+ created_before = self._get_param("CreatedBefore")
+ marker = self._get_param("Marker")
+ clusters, marker = self.backend.list_clusters(
+ cluster_states, created_after, created_before, marker
+ )
+ template = self.response_template(LIST_CLUSTERS_TEMPLATE)
+ return template.render(clusters=clusters, marker=marker)
+
+ @generate_boto3_response("ListInstanceGroups")
+ def list_instance_groups(self):
+ cluster_id = self._get_param("ClusterId")
+ marker = self._get_param("Marker")
+ instance_groups, marker = self.backend.list_instance_groups(
+ cluster_id, marker=marker
+ )
+ template = self.response_template(LIST_INSTANCE_GROUPS_TEMPLATE)
+ return template.render(instance_groups=instance_groups, marker=marker)
+
+ @generate_boto3_response("ListInstances")
+ def list_instances(self):
+ cluster_id = self._get_param("ClusterId")
+ marker = self._get_param("Marker")
+ instance_group_id = self._get_param("InstanceGroupId")
+ instance_group_types = self._get_param("InstanceGroupTypes")
+ instances, marker = self.backend.list_instances(
+ cluster_id,
+ marker=marker,
+ instance_group_id=instance_group_id,
+ instance_group_types=instance_group_types,
+ )
+ template = self.response_template(LIST_INSTANCES_TEMPLATE)
+ return template.render(instances=instances, marker=marker)
+
+ @generate_boto3_response("ListSteps")
+ def list_steps(self):
+ cluster_id = self._get_param("ClusterId")
+ marker = self._get_param("Marker")
+ step_ids = self._get_multi_param("StepIds.member")
+ step_states = self._get_multi_param("StepStates.member")
+ steps, marker = self.backend.list_steps(
+ cluster_id, marker=marker, step_ids=step_ids, step_states=step_states
+ )
+ template = self.response_template(LIST_STEPS_TEMPLATE)
+ return template.render(steps=steps, marker=marker)
+
+ @generate_boto3_response("ModifyCluster")
+ def modify_cluster(self):
+ cluster_id = self._get_param("ClusterId")
+ step_concurrency_level = self._get_param("StepConcurrencyLevel")
+ cluster = self.backend.modify_cluster(cluster_id, step_concurrency_level)
+ template = self.response_template(MODIFY_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ @generate_boto3_response("ModifyInstanceGroups")
+ def modify_instance_groups(self):
+ instance_groups = self._get_list_prefix("InstanceGroups.member")
+ for item in instance_groups:
+ item["instance_count"] = int(item["instance_count"])
+ instance_groups = self.backend.modify_instance_groups(instance_groups)
+ template = self.response_template(MODIFY_INSTANCE_GROUPS_TEMPLATE)
+ return template.render(instance_groups=instance_groups)
+
+ @generate_boto3_response("RemoveTags")
+ def remove_tags(self):
+ cluster_id = self._get_param("ResourceId")
+ tag_keys = self._get_multi_param("TagKeys.member")
+ self.backend.remove_tags(cluster_id, tag_keys)
+ template = self.response_template(REMOVE_TAGS_TEMPLATE)
+ return template.render()
+
+ @generate_boto3_response("RunJobFlow")
+ def run_job_flow(self):
+ instance_attrs = dict(
+ master_instance_type=self._get_param("Instances.MasterInstanceType"),
+ slave_instance_type=self._get_param("Instances.SlaveInstanceType"),
+ instance_count=self._get_int_param("Instances.InstanceCount", 1),
+ ec2_key_name=self._get_param("Instances.Ec2KeyName"),
+ ec2_subnet_id=self._get_param("Instances.Ec2SubnetId"),
+ hadoop_version=self._get_param("Instances.HadoopVersion"),
+ availability_zone=self._get_param(
+ "Instances.Placement.AvailabilityZone", self.backend.region_name + "a"
+ ),
+ keep_job_flow_alive_when_no_steps=self._get_bool_param(
+ "Instances.KeepJobFlowAliveWhenNoSteps", False
+ ),
+ termination_protected=self._get_bool_param(
+ "Instances.TerminationProtected", False
+ ),
+ emr_managed_master_security_group=self._get_param(
+ "Instances.EmrManagedMasterSecurityGroup"
+ ),
+ emr_managed_slave_security_group=self._get_param(
+ "Instances.EmrManagedSlaveSecurityGroup"
+ ),
+ service_access_security_group=self._get_param(
+ "Instances.ServiceAccessSecurityGroup"
+ ),
+ additional_master_security_groups=self._get_multi_param(
+ "Instances.AdditionalMasterSecurityGroups.member."
+ ),
+ additional_slave_security_groups=self._get_multi_param(
+ "Instances.AdditionalSlaveSecurityGroups.member."
+ ),
+ )
+
+ kwargs = dict(
+ name=self._get_param("Name"),
+ log_uri=self._get_param("LogUri"),
+ job_flow_role=self._get_param("JobFlowRole"),
+ service_role=self._get_param("ServiceRole"),
+ auto_scaling_role=self._get_param("AutoScalingRole"),
+ steps=steps_from_query_string(self._get_list_prefix("Steps.member")),
+ visible_to_all_users=self._get_bool_param("VisibleToAllUsers", False),
+ instance_attrs=instance_attrs,
+ )
+
+ bootstrap_actions = self._get_list_prefix("BootstrapActions.member")
+ if bootstrap_actions:
+ for ba in bootstrap_actions:
+ args = []
+ idx = 1
+ keyfmt = "script_bootstrap_action._args.member.{0}"
+ key = keyfmt.format(idx)
+ while key in ba:
+ args.append(ba.pop(key))
+ idx += 1
+ key = keyfmt.format(idx)
+ ba["args"] = args
+ ba["script_path"] = ba.pop("script_bootstrap_action._path")
+ kwargs["bootstrap_actions"] = bootstrap_actions
+
+ configurations = self._get_list_prefix("Configurations.member")
+ if configurations:
+ for idx, config in enumerate(configurations, 1):
+ for key in list(config.keys()):
+ if key.startswith("properties."):
+ config.pop(key)
+ config["properties"] = {}
+ map_items = self._get_map_prefix(
+ "Configurations.member.{0}.Properties.entry".format(idx)
+ )
+ config["properties"] = map_items
+
+ kwargs["configurations"] = configurations
+
+ release_label = self._get_param("ReleaseLabel")
+ ami_version = self._get_param("AmiVersion")
+ if release_label:
+ kwargs["release_label"] = release_label
+ if ami_version:
+ message = (
+ "Only one AMI version and release label may be specified. "
+ "Provided AMI: {0}, release label: {1}."
+ ).format(ami_version, release_label)
+ raise ValidationException(message=message)
+ else:
+ if ami_version:
+ kwargs["requested_ami_version"] = ami_version
+ kwargs["running_ami_version"] = ami_version
+ else:
+ kwargs["running_ami_version"] = "1.0.0"
+
+ custom_ami_id = self._get_param("CustomAmiId")
+ if custom_ami_id:
+ kwargs["custom_ami_id"] = custom_ami_id
+ if release_label and (
+ ReleaseLabel(release_label) < ReleaseLabel("emr-5.7.0")
+ ):
+ message = "Custom AMI is not allowed"
+ raise ValidationException(message=message)
+ elif ami_version:
+ message = "Custom AMI is not supported in this version of EMR"
+ raise ValidationException(message=message)
+
+ step_concurrency_level = self._get_param("StepConcurrencyLevel")
+ if step_concurrency_level:
+ kwargs["step_concurrency_level"] = step_concurrency_level
+
+ security_configuration = self._get_param("SecurityConfiguration")
+ if security_configuration:
+ kwargs["security_configuration"] = security_configuration
+
+ kerberos_attributes = {}
+ kwargs["kerberos_attributes"] = kerberos_attributes
+
+ realm = self._get_param("KerberosAttributes.Realm")
+ if realm:
+ kerberos_attributes["Realm"] = realm
+
+ kdc_admin_password = self._get_param("KerberosAttributes.KdcAdminPassword")
+ if kdc_admin_password:
+ kerberos_attributes["KdcAdminPassword"] = kdc_admin_password
+
+ cross_realm_principal_password = self._get_param(
+ "KerberosAttributes.CrossRealmTrustPrincipalPassword"
+ )
+ if cross_realm_principal_password:
+ kerberos_attributes[
+ "CrossRealmTrustPrincipalPassword"
+ ] = cross_realm_principal_password
+
+ ad_domain_join_user = self._get_param("KerberosAttributes.ADDomainJoinUser")
+ if ad_domain_join_user:
+ kerberos_attributes["ADDomainJoinUser"] = ad_domain_join_user
+
+ ad_domain_join_password = self._get_param(
+ "KerberosAttributes.ADDomainJoinPassword"
+ )
+ if ad_domain_join_password:
+ kerberos_attributes["ADDomainJoinPassword"] = ad_domain_join_password
+
+ cluster = self.backend.run_job_flow(**kwargs)
+
+ applications = self._get_list_prefix("Applications.member")
+ if applications:
+ self.backend.add_applications(cluster.id, applications)
+ else:
+ self.backend.add_applications(
+ cluster.id, [{"Name": "Hadoop", "Version": "0.18"}]
+ )
+
+ instance_groups = self._get_list_prefix("Instances.InstanceGroups.member")
+ if instance_groups:
+ for ig in instance_groups:
+ ig["instance_count"] = int(ig["instance_count"])
+ # Adding support to EbsConfiguration
+ self._parse_ebs_configuration(ig)
+ # Adding support for auto_scaling_policy
+ Unflattener.unflatten_complex_params(ig, "auto_scaling_policy")
+ instance_group_result = self.backend.add_instance_groups(
+ cluster.id, instance_groups
+ )
+ for i in range(0, len(instance_group_result)):
+ self.backend.add_instances(
+ cluster.id, instance_groups[i], instance_group_result[i]
+ )
+
+ tags = self._get_list_prefix("Tags.member")
+ if tags:
+ self.backend.add_tags(
+ cluster.id, dict((d["key"], d["value"]) for d in tags)
+ )
+
+ template = self.response_template(RUN_JOB_FLOW_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ def _has_key_prefix(self, key_prefix, value):
+ for key in value: # iter on both keys and values
+ if key.startswith(key_prefix):
+ return True
+ return False
+
+ def _parse_ebs_configuration(self, instance_group):
+ key_ebs_config = "ebs_configuration"
+ ebs_configuration = dict()
+ # Filter only EBS config keys
+ for key in instance_group:
+ if key.startswith(key_ebs_config):
+ ebs_configuration[key] = instance_group[key]
+
+ if len(ebs_configuration) > 0:
+ # Key that should be extracted
+ ebs_optimized = "ebs_optimized"
+ ebs_block_device_configs = "ebs_block_device_configs"
+ volume_specification = "volume_specification"
+ size_in_gb = "size_in_gb"
+ volume_type = "volume_type"
+ iops = "iops"
+ volumes_per_instance = "volumes_per_instance"
+
+ key_ebs_optimized = "{0}._{1}".format(key_ebs_config, ebs_optimized)
+ # EbsOptimized config
+ if key_ebs_optimized in ebs_configuration:
+ instance_group.pop(key_ebs_optimized)
+ ebs_configuration[ebs_optimized] = ebs_configuration.pop(
+ key_ebs_optimized
+ )
+
+ # Ebs Blocks
+ ebs_blocks = []
+ idx = 1
+ keyfmt = "{0}._{1}.member.{{}}".format(
+ key_ebs_config, ebs_block_device_configs
+ )
+ key = keyfmt.format(idx)
+ while self._has_key_prefix(key, ebs_configuration):
+ vlespc_keyfmt = "{0}._{1}._{{}}".format(key, volume_specification)
+ vol_size = vlespc_keyfmt.format(size_in_gb)
+ vol_iops = vlespc_keyfmt.format(iops)
+ vol_type = vlespc_keyfmt.format(volume_type)
+
+ ebs_block = dict()
+ ebs_block[volume_specification] = dict()
+ if vol_size in ebs_configuration:
+ instance_group.pop(vol_size)
+ ebs_block[volume_specification][size_in_gb] = int(
+ ebs_configuration.pop(vol_size)
+ )
+ if vol_iops in ebs_configuration:
+ instance_group.pop(vol_iops)
+ ebs_block[volume_specification][iops] = ebs_configuration.pop(
+ vol_iops
+ )
+ if vol_type in ebs_configuration:
+ instance_group.pop(vol_type)
+ ebs_block[volume_specification][
+ volume_type
+ ] = ebs_configuration.pop(vol_type)
+
+ per_instance = "{0}._{1}".format(key, volumes_per_instance)
+ if per_instance in ebs_configuration:
+ instance_group.pop(per_instance)
+ ebs_block[volumes_per_instance] = int(
+ ebs_configuration.pop(per_instance)
+ )
+
+ if len(ebs_block) > 0:
+ ebs_blocks.append(ebs_block)
+ idx += 1
+ key = keyfmt.format(idx)
+
+ if len(ebs_blocks) > 0:
+ ebs_configuration[ebs_block_device_configs] = ebs_blocks
+ instance_group[key_ebs_config] = ebs_configuration
+
+ @generate_boto3_response("SetTerminationProtection")
+ def set_termination_protection(self):
+ termination_protection = self._get_bool_param("TerminationProtected")
+ job_ids = self._get_multi_param("JobFlowIds.member")
+ self.backend.set_termination_protection(job_ids, termination_protection)
+ template = self.response_template(SET_TERMINATION_PROTECTION_TEMPLATE)
+ return template.render()
+
+ @generate_boto3_response("SetVisibleToAllUsers")
+ def set_visible_to_all_users(self):
+ visible_to_all_users = self._get_param("VisibleToAllUsers")
+ job_ids = self._get_multi_param("JobFlowIds.member")
+ self.backend.set_visible_to_all_users(job_ids, visible_to_all_users)
+ template = self.response_template(SET_VISIBLE_TO_ALL_USERS_TEMPLATE)
+ return template.render()
+
+ @generate_boto3_response("TerminateJobFlows")
+ def terminate_job_flows(self):
+ job_ids = self._get_multi_param("JobFlowIds.member.")
+ self.backend.terminate_job_flows(job_ids)
+ template = self.response_template(TERMINATE_JOB_FLOWS_TEMPLATE)
+ return template.render()
+
+ @generate_boto3_response("PutAutoScalingPolicy")
+ def put_auto_scaling_policy(self):
+ cluster_id = self._get_param("ClusterId")
+ cluster = self.backend.describe_cluster(cluster_id)
+ instance_group_id = self._get_param("InstanceGroupId")
+ auto_scaling_policy = self._get_param("AutoScalingPolicy")
+ instance_group = self.backend.put_auto_scaling_policy(
+ instance_group_id, auto_scaling_policy
+ )
+ template = self.response_template(PUT_AUTO_SCALING_POLICY)
+ return template.render(
+ cluster_id=cluster_id, cluster=cluster, instance_group=instance_group
+ )
+
+ @generate_boto3_response("RemoveAutoScalingPolicy")
+ def remove_auto_scaling_policy(self):
+ cluster_id = self._get_param("ClusterId")
+ instance_group_id = self._get_param("InstanceGroupId")
+ instance_group = self.backend.remove_auto_scaling_policy(instance_group_id)
+ template = self.response_template(REMOVE_AUTO_SCALING_POLICY)
+ return template.render(cluster_id=cluster_id, instance_group=instance_group)
+
+
+ADD_INSTANCE_GROUPS_TEMPLATE = """<AddInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <AddInstanceGroupsResult>
+ <InstanceGroupIds>
+ {% for instance_group in instance_groups %}
+ <member>{{ instance_group.id }}</member>
+ {% endfor %}
+ </InstanceGroupIds>
+ </AddInstanceGroupsResult>
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</AddInstanceGroupsResponse>"""
+
+ADD_JOB_FLOW_STEPS_TEMPLATE = """<AddJobFlowStepsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <AddJobFlowStepsResult>
+ <StepIds>
+ {% for step in steps %}
+ <member>{{ step.id }}</member>
+ {% endfor %}
+ </StepIds>
+ </AddJobFlowStepsResult>
+ <ResponseMetadata>
+ <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</AddJobFlowStepsResponse>"""
+
+ADD_TAGS_TEMPLATE = """<AddTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</AddTagsResponse>"""
+
+DESCRIBE_CLUSTER_TEMPLATE = """<DescribeClusterResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <DescribeClusterResult>
+ <Cluster>
+ <Applications>
+ {% for application in cluster.applications %}
+ <member>
+ <Name>{{ application.name }}</Name>
+ <Version>{{ application.version }}</Version>
+ </member>
+ {% endfor %}
+ </Applications>
+ <AutoTerminate>{{ (not cluster.keep_job_flow_alive_when_no_steps)|lower }}</AutoTerminate>
+ <Configurations>
+ {% for configuration in cluster.configurations %}
+ <member>
+ <Classification>{{ configuration['classification'] }}</Classification>
+ <Properties>
+ {% for key, value in configuration['properties'].items() %}
+ <entry>
+ <key>{{ key }}</key>
+ <value>{{ value }}</value>
+ </entry>
+ {% endfor %}
+ </Properties>
+ </member>
+ {% endfor %}
+ </Configurations>
+ {% if cluster.custom_ami_id is not none %}
+ <CustomAmiId>{{ cluster.custom_ami_id }}</CustomAmiId>
+ {% endif %}
+ <Ec2InstanceAttributes>
+ <AdditionalMasterSecurityGroups>
+ {% for each in cluster.additional_master_security_groups %}
+ <member>{{ each }}</member>
+ {% endfor %}
+ </AdditionalMasterSecurityGroups>
+ <AdditionalSlaveSecurityGroups>
+ {% for each in cluster.additional_slave_security_groups %}
+ <member>{{ each }}</member>
+ {% endfor %}
+ </AdditionalSlaveSecurityGroups>
+ <Ec2AvailabilityZone>{{ cluster.availability_zone }}</Ec2AvailabilityZone>
+ <Ec2KeyName>{{ cluster.ec2_key_name }}</Ec2KeyName>
+ <Ec2SubnetId>{{ cluster.ec2_subnet_id }}</Ec2SubnetId>
+ <IamInstanceProfile>{{ cluster.role }}</IamInstanceProfile>
+ <EmrManagedMasterSecurityGroup>{{ cluster.master_security_group }}</EmrManagedMasterSecurityGroup>
+ <EmrManagedSlaveSecurityGroup>{{ cluster.slave_security_group }}</EmrManagedSlaveSecurityGroup>
+ <ServiceAccessSecurityGroup>{{ cluster.service_access_security_group }}</ServiceAccessSecurityGroup>
+ </Ec2InstanceAttributes>
+ <Id>{{ cluster.id }}</Id>
+ <KerberosAttributes>
+ {% if 'Realm' in cluster.kerberos_attributes%}
+ <Realm>{{ cluster.kerberos_attributes['Realm'] }}</Realm>
+ {% endif %}
+ {% if 'KdcAdminPassword' in cluster.kerberos_attributes%}
+ <KdcAdminPassword>{{ cluster.kerberos_attributes['KdcAdminPassword'] }}</KdcAdminPassword>
+ {% endif %}
+ {% if 'CrossRealmTrustPrincipalPassword' in cluster.kerberos_attributes%}
+ <CrossRealmTrustPrincipalPassword>{{ cluster.kerberos_attributes['CrossRealmTrustPrincipalPassword'] }}</CrossRealmTrustPrincipalPassword>
+ {% endif %}
+ {% if 'ADDomainJoinUser' in cluster.kerberos_attributes%}
+ <ADDomainJoinUser>{{ cluster.kerberos_attributes['ADDomainJoinUser'] }}</ADDomainJoinUser>
+ {% endif %}
+ {% if 'ADDomainJoinPassword' in cluster.kerberos_attributes%}
+ <ADDomainJoinPassword>{{ cluster.kerberos_attributes['ADDomainJoinPassword'] }}</ADDomainJoinPassword>
+ {% endif %}
+ </KerberosAttributes>
+ <LogUri>{{ cluster.log_uri }}</LogUri>
+ <MasterPublicDnsName>ec2-184-0-0-1.us-west-1.compute.amazonaws.com</MasterPublicDnsName>
+ <Name>{{ cluster.name }}</Name>
+ <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
+ {% if cluster.release_label is not none %}
+ <ReleaseLabel>{{ cluster.release_label }}</ReleaseLabel>
+ {% endif %}
+ {% if cluster.requested_ami_version is not none %}
+ <RequestedAmiVersion>{{ cluster.requested_ami_version }}</RequestedAmiVersion>
+ {% endif %}
+ {% if cluster.running_ami_version is not none %}
+ <RunningAmiVersion>{{ cluster.running_ami_version }}</RunningAmiVersion>
+ {% endif %}
+ {% if cluster.security_configuration is not none %}
+ <SecurityConfiguration>{{ cluster.security_configuration }}</SecurityConfiguration>
+ {% endif %}
+ <ServiceRole>{{ cluster.service_role }}</ServiceRole>
+ <AutoScalingRole>{{ cluster.auto_scaling_role }}</AutoScalingRole>
+ <Status>
+ <State>{{ cluster.state }}</State>
+ <StateChangeReason>
+ {% if cluster.last_state_change_reason is not none %}
+ <Message>{{ cluster.last_state_change_reason }}</Message>
+ {% endif %}
+ <Code>USER_REQUEST</Code>
+ </StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if cluster.end_datetime is not none %}
+ <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if cluster.ready_datetime is not none %}
+ <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ <Tags>
+ {% for tag_key, tag_value in cluster.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ <TerminationProtected>{{ cluster.termination_protected|lower }}</TerminationProtected>
+ <VisibleToAllUsers>{{ cluster.visible_to_all_users|lower }}</VisibleToAllUsers>
+ <StepConcurrencyLevel>{{ cluster.step_concurrency_level }}</StepConcurrencyLevel>
+ <ClusterArn>{{ cluster.arn }}</ClusterArn>
+ </Cluster>
+ </DescribeClusterResult>
+ <ResponseMetadata>
+ <RequestId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</RequestId>
+ </ResponseMetadata>
+</DescribeClusterResponse>"""
+
+DESCRIBE_JOB_FLOWS_TEMPLATE = """<DescribeJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <DescribeJobFlowsResult>
+ <JobFlows>
+ {% for cluster in clusters %}
+ <member>
+ {% if cluster.running_ami_version is not none %}
+ <AmiVersion>{{ cluster.running_ami_version }}</AmiVersion>
+ {% endif %}
+ {% if cluster.bootstrap_actions %}
+ <BootstrapActions>
+ {% for bootstrap_action in cluster.bootstrap_actions %}
+ <member>
+ <BootstrapActionConfig>
+ <Name>{{ bootstrap_action.name }}</Name>
+ <ScriptBootstrapAction>
+ <Args>
+ {% for arg in bootstrap_action.args %}
+ <member>{{ arg | escape }}</member>
+ {% endfor %}
+ </Args>
+ <Path>{{ bootstrap_action.script_path | escape }}</Path>
+ </ScriptBootstrapAction>
+ </BootstrapActionConfig>
+ </member>
+ {% endfor %}
+ </BootstrapActions>
+ {% endif %}
+ <ExecutionStatusDetail>
+ <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if cluster.end_datetime is not none %}
+ <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if cluster.last_state_change_reason is not none %}
+ <LastStateChangeReason>{{ cluster.last_state_change_reason }}</LastStateChangeReason>
+ {% endif %}
+ {% if cluster.ready_datetime is not none %}
+ <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ {% if cluster.start_datetime is not none %}
+ <StartDateTime>{{ cluster.start_datetime.isoformat() }}</StartDateTime>
+ {% endif %}
+ <State>{{ cluster.state }}</State>
+ </ExecutionStatusDetail>
+ <Instances>
+ {% if cluster.ec2_key_name is not none %}
+ <Ec2KeyName>{{ cluster.ec2_key_name }}</Ec2KeyName>
+ {% endif %}
+ {% if cluster.ec2_subnet_id is not none %}
+ <Ec2SubnetId>{{ cluster.ec2_subnet_id }}</Ec2SubnetId>
+ {% endif %}
+ <HadoopVersion>{{ cluster.hadoop_version }}</HadoopVersion>
+ <InstanceCount>{{ cluster.instance_count }}</InstanceCount>
+ <InstanceGroups>
+ {% for instance_group in cluster.instance_groups %}
+ <member>
+ {% if instance_group.bid_price is not none %}
+ <BidPrice>{{ instance_group.bid_price }}</BidPrice>
+ {% endif %}
+ <CreationDateTime>{{ instance_group.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if instance_group.end_datetime is not none %}
+ <EndDateTime>{{ instance_group.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+
+ <InstanceGroupId>{{ instance_group.id }}</InstanceGroupId>
+ <InstanceRequestCount>{{ instance_group.num_instances }}</InstanceRequestCount>
+ <InstanceRole>{{ instance_group.role }}</InstanceRole>
+ <InstanceRunningCount>{{ instance_group.num_instances }}</InstanceRunningCount>
+ <InstanceType>{{ instance_group.type }}</InstanceType>
+ <LastStateChangeReason/>
+ <Market>{{ instance_group.market }}</Market>
+ <Name>{{ instance_group.name }}</Name>
+ {% if instance_group.ready_datetime is not none %}
+ <ReadyDateTime>{{ instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ {% if instance_group.start_datetime is not none %}
+ <StartDateTime>{{ instance_group.start_datetime.isoformat() }}</StartDateTime>
+ {% endif %}
+ <State>{{ instance_group.state }}</State>
+ </member>
+ {% endfor %}
+ </InstanceGroups>
+ <KeepJobFlowAliveWhenNoSteps>{{ cluster.keep_job_flow_alive_when_no_steps|lower }}</KeepJobFlowAliveWhenNoSteps>
+ <MasterInstanceId>{{ cluster.master_instance_id }}</MasterInstanceId>
+ <MasterInstanceType>{{ cluster.master_instance_type }}</MasterInstanceType>
+ <MasterPublicDnsName>ec2-184-0-0-1.{{ cluster.region }}.compute.amazonaws.com</MasterPublicDnsName>
+ <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
+ <Placement>
+ <AvailabilityZone>{{ cluster.availability_zone }}</AvailabilityZone>
+ </Placement>
+ <SlaveInstanceType>{{ cluster.slave_instance_type }}</SlaveInstanceType>
+ <TerminationProtected>{{ cluster.termination_protected|lower }}</TerminationProtected>
+ </Instances>
+ <JobFlowId>{{ cluster.id }}</JobFlowId>
+ <JobFlowRole>{{ cluster.role }}</JobFlowRole>
+ <LogUri>{{ cluster.log_uri }}</LogUri>
+ <Name>{{ cluster.name }}</Name>
+ <ServiceRole>{{ cluster.service_role }}</ServiceRole>
+ <Steps>
+ {% for step in cluster.steps %}
+ <member>
+ <ExecutionStatusDetail>
+ <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if step.end_datetime is not none %}
+ <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if step.last_state_change_reason is not none %}
+ <LastStateChangeReason>{{ step.last_state_change_reason }}</LastStateChangeReason>
+ {% endif %}
+ {% if step.ready_datetime is not none %}
+ <ReadyDateTime>{{ step.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ {% if step.start_datetime is not none %}
+ <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
+ {% endif %}
+ <State>{{ step.state }}</State>
+ </ExecutionStatusDetail>
+ <StepConfig>
+ <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
+ <HadoopJarStep>
+ <Jar>{{ step.jar }}</Jar>
+ <MainClass>{{ step.main_class }}</MainClass>
+ <Args>
+ {% for arg in step.args %}
+ <member>{{ arg | escape }}</member>
+ {% endfor %}
+ </Args>
+ <Properties/>
+ </HadoopJarStep>
+ <Name>{{ step.name | escape }}</Name>
+ </StepConfig>
+ </member>
+ {% endfor %}
+ </Steps>
+ <SupportedProducts/>
+ <VisibleToAllUsers>{{ cluster.visible_to_all_users|lower }}</VisibleToAllUsers>
+ </member>
+ {% endfor %}
+ </JobFlows>
+ </DescribeJobFlowsResult>
+ <ResponseMetadata>
+ <RequestId>9cea3229-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</DescribeJobFlowsResponse>"""
+
+DESCRIBE_STEP_TEMPLATE = """<DescribeStepResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <DescribeStepResult>
+ <Step>
+ <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
+ <Config>
+ <Args>
+ {% for arg in step.args %}
+ <member>{{ arg | escape }}</member>
+ {% endfor %}
+ </Args>
+ <Jar>{{ step.jar }}</Jar>
+ <MainClass/>
+ <Properties>
+ {% for key, val in step.properties.items() %}
+ <member>
+ <key>{{ key }}</key>
+ <value>{{ val | escape }}</value>
+ </member>
+ {% endfor %}
+ </Properties>
+ </Config>
+ <Id>{{ step.id }}</Id>
+ <Name>{{ step.name | escape }}</Name>
+ <Status>
+ <FailureDetails>
+ <Reason/>
+ <Message/>
+ <LogFile/>
+ </FailureDetails>
+ <State>{{ step.state }}</State>
+ <StateChangeReason>{{ step.state_change_reason }}</StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if step.end_datetime is not none %}
+ <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if step.ready_datetime is not none %}
+ <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ </Step>
+ </DescribeStepResult>
+ <ResponseMetadata>
+ <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</DescribeStepResponse>"""
+
+LIST_BOOTSTRAP_ACTIONS_TEMPLATE = """<ListBootstrapActionsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ListBootstrapActionsResult>
+ <BootstrapActions>
+ {% for bootstrap_action in bootstrap_actions %}
+ <member>
+ <Args>
+ {% for arg in bootstrap_action.args %}
+ <member>{{ arg | escape }}</member>
+ {% endfor %}
+ </Args>
+ <Name>{{ bootstrap_action.name }}</Name>
+ <ScriptPath>{{ bootstrap_action.script_path }}</ScriptPath>
+ </member>
+ {% endfor %}
+ </BootstrapActions>
+ {% if marker is not none %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </ListBootstrapActionsResult>
+ <ResponseMetadata>
+ <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</ListBootstrapActionsResponse>"""
+
+LIST_CLUSTERS_TEMPLATE = """<ListClustersResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ListClustersResult>
+ <Clusters>
+ {% for cluster in clusters %}
+ <member>
+ <Id>{{ cluster.id }}</Id>
+ <Name>{{ cluster.name }}</Name>
+ <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
+ <Status>
+ <State>{{ cluster.state }}</State>
+ <StateChangeReason>
+ <Code>USER_REQUEST</Code>
+ {% if cluster.last_state_change_reason is not none %}
+ <Message>{{ cluster.last_state_change_reason }}</Message>
+ {% endif %}
+ </StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if cluster.end_datetime is not none %}
+ <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if cluster.ready_datetime is not none %}
+ <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ <ClusterArn>{{ cluster.arn }}</ClusterArn>
+ </member>
+ {% endfor %}
+ </Clusters>
+ {% if marker is not none %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </ListClustersResult>
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8418</RequestId>
+ </ResponseMetadata>
+</ListClustersResponse>"""
+
+LIST_INSTANCE_GROUPS_TEMPLATE = """<ListInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ListInstanceGroupsResult>
+ <InstanceGroups>
+ {% for instance_group in instance_groups %}
+ <member>
+ {% if instance_group.bid_price is not none %}
+ <BidPrice>{{ instance_group.bid_price }}</BidPrice>
+ {% endif %}
+ <Configurations/>
+ {% if instance_group.ebs_configuration is not none %}
+ <EbsBlockDevices>
+ {% for ebs_block_device in instance_group.ebs_configuration.ebs_block_device_configs %}
+ {% for i in range(ebs_block_device.volumes_per_instance) %}
+ <member>
+ <VolumeSpecification>
+ <VolumeType>{{ebs_block_device.volume_specification.volume_type}}</VolumeType>
+ <Iops>{{ebs_block_device.volume_specification.iops}}</Iops>
+ <SizeInGB>{{ebs_block_device.volume_specification.size_in_gb}}</SizeInGB>
+ </VolumeSpecification>
+ <Device>/dev/sd{{i}}</Device>
+ </member>
+ {% endfor %}
+ {% endfor %}
+ </EbsBlockDevices>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy is not none %}
+ <AutoScalingPolicy>
+ {% if instance_group.auto_scaling_policy.constraints is not none %}
+ <Constraints>
+ {% if instance_group.auto_scaling_policy.constraints.min_capacity is not none %}
+ <MinCapacity>{{instance_group.auto_scaling_policy.constraints.min_capacity}}</MinCapacity>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.constraints.max_capacity is not none %}
+ <MaxCapacity>{{instance_group.auto_scaling_policy.constraints.max_capacity}}</MaxCapacity>
+ {% endif %}
+ </Constraints>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.rules is not none %}
+ <Rules>
+ {% for rule in instance_group.auto_scaling_policy.rules %}
+ <member>
+ {% if 'name' in rule %}
+ <Name>{{rule['name']}}</Name>
+ {% endif %}
+ {% if 'description' in rule %}
+ <Description>{{rule['description']}}</Description>
+ {% endif %}
+ {% if 'action' in rule %}
+ <Action>
+ {% if 'market' in rule['action'] %}
+ <Market>{{rule['action']['market']}}</Market>
+ {% endif %}
+ {% if 'simple_scaling_policy_configuration' in rule['action'] %}
+ <SimpleScalingPolicyConfiguration>
+ {% if 'adjustment_type' in rule['action']['simple_scaling_policy_configuration'] %}
+ <AdjustmentType>{{rule['action']['simple_scaling_policy_configuration']['adjustment_type']}}</AdjustmentType>
+ {% endif %}
+ {% if 'scaling_adjustment' in rule['action']['simple_scaling_policy_configuration'] %}
+ <ScalingAdjustment>{{rule['action']['simple_scaling_policy_configuration']['scaling_adjustment']}}</ScalingAdjustment>
+ {% endif %}
+ {% if 'cool_down' in rule['action']['simple_scaling_policy_configuration'] %}
+ <CoolDown>{{rule['action']['simple_scaling_policy_configuration']['cool_down']}}</CoolDown>
+ {% endif %}
+ </SimpleScalingPolicyConfiguration>
+ {% endif %}
+ </Action>
+ {% endif %}
+ {% if 'trigger' in rule %}
+ <Trigger>
+ {% if 'cloud_watch_alarm_definition' in rule['trigger'] %}
+ <CloudWatchAlarmDefinition>
+ {% if 'comparison_operator' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <ComparisonOperator>{{rule['trigger']['cloud_watch_alarm_definition']['comparison_operator']}}</ComparisonOperator>
+ {% endif %}
+ {% if 'evaluation_periods' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <EvaluationPeriods>{{rule['trigger']['cloud_watch_alarm_definition']['evaluation_periods']}}</EvaluationPeriods>
+ {% endif %}
+ {% if 'metric_name' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <MetricName>{{rule['trigger']['cloud_watch_alarm_definition']['metric_name']}}</MetricName>
+ {% endif %}
+ {% if 'namespace' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Namespace>{{rule['trigger']['cloud_watch_alarm_definition']['namespace']}}</Namespace>
+ {% endif %}
+ {% if 'period' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Period>{{rule['trigger']['cloud_watch_alarm_definition']['period']}}</Period>
+ {% endif %}
+ {% if 'statistic' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Statistic>{{rule['trigger']['cloud_watch_alarm_definition']['statistic']}}</Statistic>
+ {% endif %}
+ {% if 'threshold' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Threshold>{{rule['trigger']['cloud_watch_alarm_definition']['threshold']}}</Threshold>
+ {% endif %}
+ {% if 'unit' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Unit>{{rule['trigger']['cloud_watch_alarm_definition']['unit']}}</Unit>
+ {% endif %}
+ {% if 'dimensions' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Dimensions>
+ {% for dimension in rule['trigger']['cloud_watch_alarm_definition']['dimensions'] %}
+ <member>
+ {% if 'key' in dimension %}
+ <Key>{{dimension['key']}}</Key>
+ {% endif %}
+ {% if 'value' in dimension %}
+ <Value>{{dimension['value']}}</Value>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Dimensions>
+ {% endif %}
+ </CloudWatchAlarmDefinition>
+ {% endif %}
+ </Trigger>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Rules>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.status is not none %}
+ <Status>
+ {% if 'state' in instance_group.auto_scaling_policy.status %}
+ <State>{{instance_group.auto_scaling_policy.status['state']}}</State>
+ {% endif %}
+ </Status>
+ {% endif %}
+ </AutoScalingPolicy>
+ {% endif %}
+ {% if instance_group.ebs_optimized is not none %}
+ <EbsOptimized>{{ instance_group.ebs_optimized }}</EbsOptimized>
+ {% endif %}
+ <Id>{{ instance_group.id }}</Id>
+ <InstanceGroupType>{{ instance_group.role }}</InstanceGroupType>
+ <InstanceType>{{ instance_group.type }}</InstanceType>
+ <Market>{{ instance_group.market }}</Market>
+ <Name>{{ instance_group.name }}</Name>
+ <RequestedInstanceCount>{{ instance_group.num_instances }}</RequestedInstanceCount>
+ <RunningInstanceCount>{{ instance_group.num_instances }}</RunningInstanceCount>
+ <Status>
+ <State>{{ instance_group.state }}</State>
+ <StateChangeReason>
+ {% if instance_group.state_change_reason is not none %}
+ <Message>{{ instance_group.state_change_reason }}</Message>
+ {% endif %}
+ <Code>USER_REQUEST</Code>
+ </StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ instance_group.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if instance_group.end_datetime is not none %}
+ <EndDateTime>{{ instance_group.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if instance_group.ready_datetime is not none %}
+ <ReadyDateTime>{{ instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ </member>
+ {% endfor %}
+ </InstanceGroups>
+ {% if marker is not none %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </ListInstanceGroupsResult>
+ <ResponseMetadata>
+ <RequestId>8296d8b8-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</ListInstanceGroupsResponse>"""
+
+LIST_INSTANCES_TEMPLATE = """<ListInstancesResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ListInstancesResult>
+ <Instances>
+ {% for instance in instances %}
+ <member>
+ <Id>{{ instance.id }}</Id>
+ <Ec2InstanceId>{{ instance.ec2_instance_id }}</Ec2InstanceId>
+ <PublicDnsName>{{ instance.details.public_dns }}</PublicDnsName>
+ <PublicIpAddress>{{ instance.details.public_ip }}</PublicIpAddress>
+ <PrivateDnsName>{{ instance.details.private_dns }}</PrivateDnsName>
+ <PrivateIpAddress>{{ instance.details.private_ip }}</PrivateIpAddress>
+ <InstanceGroupId>{{ instance.instance_group.id }}</InstanceGroupId>
+ <InstanceFleetId>{{ instance.instance_fleet_id }}</InstanceFleetId>
+ <Market>{{ instance.instance_group.market }}</Market>
+ <InstanceType>{{ instance.details.instance_type }}</InstanceType>
+ <EbsVolumes>
+ {% for volume in instance.details.block_device_mapping %}
+ <member>
+ <Device>{{ volume }}</Device>
+ <VolumeId>{{ instance.details.block_device_mapping[volume].volume_id }}</VolumeId>
+ </member>
+ {% endfor %}
+ </EbsVolumes>
+ <Status>
+ <State>{{ instance.instance_group.state }}</State>
+ <StateChangeReason>
+ {% if instance.state_change_reason is not none %}
+ <Message>{{ instance.state_change_reason }}</Message>
+ {% endif %}
+ </StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ instance.instance_group.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if instance.instance_group.end_datetime is not none %}
+ <EndDateTime>{{ instance.instance_group.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if instance.instance_group.ready_datetime is not none %}
+ <ReadyDateTime>{{ instance.instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ </member>
+ {% endfor %}
+ </Instances>
+ </ListInstancesResult>
+ <ResponseMetadata>
+ <RequestId>4248c46c-71c0-4772-b155-0e992dc30027</RequestId>
+ </ResponseMetadata>
+</ListInstancesResponse>"""
+
+LIST_STEPS_TEMPLATE = """<ListStepsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ListStepsResult>
+ <Steps>
+ {% for step in steps %}
+ <member>
+ <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
+ <Config>
+ <Args>
+ {% for arg in step.args %}
+ <member>{{ arg | escape }}</member>
+ {% endfor %}
+ </Args>
+ <Jar>{{ step.jar | escape }}</Jar>
+ <MainClass/>
+ <Properties>
+ {% for key, val in step.properties.items() %}
+ <member>
+ <key>{{ key }}</key>
+ <value>{{ val | escape }}</value>
+ </member>
+ {% endfor %}
+ </Properties>
+ </Config>
+ <Id>{{ step.id }}</Id>
+ <Name>{{ step.name | escape }}</Name>
+ <Status>
+<!-- does not exist for botocore 1.4.28
+ <FailureDetails>
+ <Reason/>
+ <Message/>
+ <LogFile/>
+ </FailureDetails>
+-->
+ <State>{{ step.state }}</State>
+ <StateChangeReason>{{ step.state_change_reason }}</StateChangeReason>
+ <Timeline>
+ <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
+ {% if step.end_datetime is not none %}
+ <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
+ {% endif %}
+ {% if step.start_datetime is not none %}
+ <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
+ {% endif %}
+ </Timeline>
+ </Status>
+ </member>
+ {% endfor %}
+ </Steps>
+ {% if marker is not none %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </ListStepsResult>
+ <ResponseMetadata>
+ <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</ListStepsResponse>"""
+
+MODIFY_CLUSTER_TEMPLATE = """<ModifyClusterResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ModifyClusterResult>
+ <StepConcurrencyLevel>{{ cluster.step_concurrency_level }}</StepConcurrencyLevel>
+ </ModifyClusterResult>
+ <ResponseMetadata>
+ <RequestId>0751c837-e78d-4aef-95c9-9c4d29a092ff</RequestId>
+ </ResponseMetadata>
+</ModifyClusterResponse>
+"""
+
+MODIFY_INSTANCE_GROUPS_TEMPLATE = """<ModifyInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</ModifyInstanceGroupsResponse>"""
+
+REMOVE_TAGS_TEMPLATE = """<RemoveTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</RemoveTagsResponse>"""
+
+RUN_JOB_FLOW_TEMPLATE = """<RunJobFlowResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <RunJobFlowResult>
+ <JobFlowId>{{ cluster.id }}</JobFlowId>
+ <ClusterArn>{{ cluster.arn }}</ClusterArn>
+ </RunJobFlowResult>
+ <ResponseMetadata>
+ <RequestId>8296d8b8-ed85-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</RunJobFlowResponse>"""
+
+SET_TERMINATION_PROTECTION_TEMPLATE = """<SetTerminationProtection xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</SetTerminationProtection>"""
+
+SET_VISIBLE_TO_ALL_USERS_TEMPLATE = """<SetVisibleToAllUsersResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</SetVisibleToAllUsersResponse>"""
+
+TERMINATE_JOB_FLOWS_TEMPLATE = """<TerminateJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</TerminateJobFlowsResponse>"""
+
+PUT_AUTO_SCALING_POLICY = """<PutAutoScalingPolicyResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <PutAutoScalingPolicyResult>
+ <ClusterId>{{cluster_id}}</ClusterId>
+ <InstanceGroupId>{{instance_group.id}}</InstanceGroupId>
+ {% if instance_group.auto_scaling_policy is not none %}
+ <AutoScalingPolicy>
+ {% if instance_group.auto_scaling_policy.constraints is not none %}
+ <Constraints>
+ {% if instance_group.auto_scaling_policy.constraints.min_capacity is not none %}
+ <MinCapacity>{{instance_group.auto_scaling_policy.constraints.min_capacity}}</MinCapacity>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.constraints.max_capacity is not none %}
+ <MaxCapacity>{{instance_group.auto_scaling_policy.constraints.max_capacity}}</MaxCapacity>
+ {% endif %}
+ </Constraints>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.rules is not none %}
+ <Rules>
+ {% for rule in instance_group.auto_scaling_policy.rules %}
+ <member>
+ {% if 'name' in rule %}
+ <Name>{{rule['name']}}</Name>
+ {% endif %}
+ {% if 'description' in rule %}
+ <Description>{{rule['description']}}</Description>
+ {% endif %}
+ {% if 'action' in rule %}
+ <Action>
+ {% if 'market' in rule['action'] %}
+ <Market>{{rule['action']['market']}}</Market>
+ {% endif %}
+ {% if 'simple_scaling_policy_configuration' in rule['action'] %}
+ <SimpleScalingPolicyConfiguration>
+ {% if 'adjustment_type' in rule['action']['simple_scaling_policy_configuration'] %}
+ <AdjustmentType>{{rule['action']['simple_scaling_policy_configuration']['adjustment_type']}}</AdjustmentType>
+ {% endif %}
+ {% if 'scaling_adjustment' in rule['action']['simple_scaling_policy_configuration'] %}
+ <ScalingAdjustment>{{rule['action']['simple_scaling_policy_configuration']['scaling_adjustment']}}</ScalingAdjustment>
+ {% endif %}
+ {% if 'cool_down' in rule['action']['simple_scaling_policy_configuration'] %}
+ <CoolDown>{{rule['action']['simple_scaling_policy_configuration']['cool_down']}}</CoolDown>
+ {% endif %}
+ </SimpleScalingPolicyConfiguration>
+ {% endif %}
+ </Action>
+ {% endif %}
+ {% if 'trigger' in rule %}
+ <Trigger>
+ {% if 'cloud_watch_alarm_definition' in rule['trigger'] %}
+ <CloudWatchAlarmDefinition>
+ {% if 'comparison_operator' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <ComparisonOperator>{{rule['trigger']['cloud_watch_alarm_definition']['comparison_operator']}}</ComparisonOperator>
+ {% endif %}
+ {% if 'evaluation_periods' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <EvaluationPeriods>{{rule['trigger']['cloud_watch_alarm_definition']['evaluation_periods']}}</EvaluationPeriods>
+ {% endif %}
+ {% if 'metric_name' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <MetricName>{{rule['trigger']['cloud_watch_alarm_definition']['metric_name']}}</MetricName>
+ {% endif %}
+ {% if 'namespace' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Namespace>{{rule['trigger']['cloud_watch_alarm_definition']['namespace']}}</Namespace>
+ {% endif %}
+ {% if 'period' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Period>{{rule['trigger']['cloud_watch_alarm_definition']['period']}}</Period>
+ {% endif %}
+ {% if 'statistic' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Statistic>{{rule['trigger']['cloud_watch_alarm_definition']['statistic']}}</Statistic>
+ {% endif %}
+ {% if 'threshold' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Threshold>{{rule['trigger']['cloud_watch_alarm_definition']['threshold']}}</Threshold>
+ {% endif %}
+ {% if 'unit' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Unit>{{rule['trigger']['cloud_watch_alarm_definition']['unit']}}</Unit>
+ {% endif %}
+ {% if 'dimensions' in rule['trigger']['cloud_watch_alarm_definition'] %}
+ <Dimensions>
+ {% for dimension in rule['trigger']['cloud_watch_alarm_definition']['dimensions'] %}
+ <member>
+ {% if 'key' in dimension %}
+ <Key>{{dimension['key']}}</Key>
+ {% endif %}
+ {% if 'value' in dimension %}
+ <Value>{{dimension['value']}}</Value>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Dimensions>
+ {% endif %}
+ </CloudWatchAlarmDefinition>
+ {% endif %}
+ </Trigger>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Rules>
+ {% endif %}
+ {% if instance_group.auto_scaling_policy.status is not none %}
+ <Status>
+ {% if 'state' in instance_group.auto_scaling_policy.status %}
+ <State>{{instance_group.auto_scaling_policy.status['state']}}</State>
+ {% endif %}
+ </Status>
+ {% endif %}
+ </AutoScalingPolicy>
+ {% endif %}
+ <ClusterArn>{{ cluster.arn }}</ClusterArn>
+ </PutAutoScalingPolicyResult>
+ <ResponseMetadata>
+ <RequestId>d47379d9-b505-49af-9335-a68950d82535</RequestId>
+ </ResponseMetadata>
+</PutAutoScalingPolicyResponse>"""
+
+REMOVE_AUTO_SCALING_POLICY = """<RemoveAutoScalingPolicyResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>c04a1042-5340-4c0a-a7b5-7779725ce4f7</RequestId>
+ </ResponseMetadata>
+</RemoveAutoScalingPolicyResponse>"""
+
+CREATE_SECURITY_CONFIGURATION_TEMPLATE = """<CreateSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <CreateSecurityConfigurationResult>
+ <Name>{{name}}</Name>
+ <CreationDateTime>{{creation_date_time}}</CreationDateTime>
+ </CreateSecurityConfigurationResult>
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</CreateSecurityConfigurationResponse>"""
+
+DESCRIBE_SECURITY_CONFIGURATION_TEMPLATE = """<DescribeSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <DescribeSecurityConfigurationResult>
+ <Name>{{security_configuration['name']}}</Name>
+ <SecurityConfiguration>{{security_configuration['security_configuration']}}</SecurityConfiguration>
+ <CreationDateTime>{{security_configuration['creation_date_time']}}</CreationDateTime>
+ </DescribeSecurityConfigurationResult>
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</DescribeSecurityConfigurationResponse>"""
+
+DELETE_SECURITY_CONFIGURATION_TEMPLATE = """<DeleteSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
+ <ResponseMetadata>
+ <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
+ </ResponseMetadata>
+</DeleteSecurityConfigurationResponse>"""
diff --git a/contrib/python/moto/py3/moto/emr/urls.py b/contrib/python/moto/py3/moto/emr/urls.py
new file mode 100644
index 0000000000..fae124777e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/urls.py
@@ -0,0 +1,8 @@
+from .responses import ElasticMapReduceResponse
+
+url_bases = [
+ r"https?://(.+)\.elasticmapreduce\.amazonaws.com",
+ r"https?://elasticmapreduce\.(.+)\.amazonaws.com",
+]
+
+url_paths = {"{0}/$": ElasticMapReduceResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/emr/utils.py b/contrib/python/moto/py3/moto/emr/utils.py
new file mode 100644
index 0000000000..b0746ece5a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emr/utils.py
@@ -0,0 +1,458 @@
+import copy
+import datetime
+import random
+import re
+import string
+from moto.core.utils import (
+ camelcase_to_underscores,
+ iso_8601_datetime_with_milliseconds,
+)
+
+
+def random_id(size=13):
+ chars = list(range(10)) + list(string.ascii_uppercase)
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def random_cluster_id():
+ return "j-{0}".format(random_id())
+
+
+def random_step_id():
+ return "s-{0}".format(random_id())
+
+
+def random_instance_group_id():
+ return "i-{0}".format(random_id())
+
+
+def steps_from_query_string(querystring_dict):
+ steps = []
+ for step in querystring_dict:
+ step["jar"] = step.pop("hadoop_jar_step._jar")
+ step["properties"] = dict(
+ (o["Key"], o["Value"]) for o in step.get("properties", [])
+ )
+ step["args"] = []
+ idx = 1
+ keyfmt = "hadoop_jar_step._args.member.{0}"
+ while keyfmt.format(idx) in step:
+ step["args"].append(step.pop(keyfmt.format(idx)))
+ idx += 1
+ steps.append(step)
+ return steps
+
+
+class Unflattener:
+ @staticmethod
+ def unflatten_complex_params(input_dict, param_name):
+ """Function to unflatten (portions of) dicts with complex keys. The moto request parser flattens the incoming
+ request bodies, which is generally helpful, but for nested dicts/lists can result in a hard-to-manage
+ parameter exposion. This function allows one to selectively unflatten a set of dict keys, replacing them
+ with a deep dist/list structure named identically to the root component in the complex name.
+
+ Complex keys are composed of multiple components
+ separated by periods. Components may be prefixed with _, which is stripped. Lists indexes are represented
+ with two components, 'member' and the index number."""
+ items_to_process = {}
+ for k in input_dict.keys():
+ if k.startswith(param_name):
+ items_to_process[k] = input_dict[k]
+ if len(items_to_process) == 0:
+ return
+
+ for k in items_to_process.keys():
+ del input_dict[k]
+
+ for k in items_to_process.keys():
+ Unflattener._set_deep(k, input_dict, items_to_process[k])
+
+ @staticmethod
+ def _set_deep(complex_key, container, value):
+ keys = complex_key.split(".")
+ keys.reverse()
+
+ while len(keys) > 0:
+ if len(keys) == 1:
+ key = keys.pop().strip("_")
+ Unflattener._add_to_container(container, key, value)
+ else:
+ key = keys.pop().strip("_")
+ if keys[-1] == "member":
+ keys.pop()
+ if not Unflattener._key_in_container(container, key):
+ container = Unflattener._add_to_container(container, key, [])
+ else:
+ container = Unflattener._get_child(container, key)
+ else:
+ if not Unflattener._key_in_container(container, key):
+ container = Unflattener._add_to_container(container, key, {})
+ else:
+ container = Unflattener._get_child(container, key)
+
+ @staticmethod
+ def _add_to_container(container, key, value):
+ if type(container) is dict:
+ container[key] = value
+ elif type(container) is list:
+ i = int(key)
+ while len(container) < i:
+ container.append(None)
+ container[i - 1] = value
+ return value
+
+ @staticmethod
+ def _get_child(container, key):
+ if type(container) is dict:
+ return container[key]
+ elif type(container) is list:
+ i = int(key)
+ return container[i - 1]
+
+ @staticmethod
+ def _key_in_container(container, key):
+ if type(container) is dict:
+ return key in container
+ elif type(container) is list:
+ i = int(key)
+ return len(container) >= i
+
+
+class CamelToUnderscoresWalker:
+ """A class to convert the keys in dict/list hierarchical data structures from CamelCase to snake_case (underscores)"""
+
+ @staticmethod
+ def parse(x):
+ if isinstance(x, dict):
+ return CamelToUnderscoresWalker.parse_dict(x)
+ elif isinstance(x, list):
+ return CamelToUnderscoresWalker.parse_list(x)
+ else:
+ return CamelToUnderscoresWalker.parse_scalar(x)
+
+ @staticmethod
+ def parse_dict(x):
+ temp = {}
+ for key in x.keys():
+ temp[camelcase_to_underscores(key)] = CamelToUnderscoresWalker.parse(x[key])
+ return temp
+
+ @staticmethod
+ def parse_list(x):
+ temp = []
+ for i in x:
+ temp.append(CamelToUnderscoresWalker.parse(i))
+ return temp
+
+ @staticmethod
+ def parse_scalar(x):
+ return x
+
+
+class ReleaseLabel(object):
+
+ version_re = re.compile(r"^emr-(\d+)\.(\d+)\.(\d+)$")
+
+ def __init__(self, release_label):
+ major, minor, patch = self.parse(release_label)
+
+ self.major = major
+ self.minor = minor
+ self.patch = patch
+
+ @classmethod
+ def parse(cls, release_label):
+ if not release_label:
+ raise ValueError("Invalid empty ReleaseLabel: %r" % release_label)
+
+ match = cls.version_re.match(release_label)
+ if not match:
+ raise ValueError("Invalid ReleaseLabel: %r" % release_label)
+
+ major, minor, patch = match.groups()
+
+ major = int(major)
+ minor = int(minor)
+ patch = int(patch)
+
+ return major, minor, patch
+
+ def __str__(self):
+ version = "emr-%d.%d.%d" % (self.major, self.minor, self.patch)
+ return version
+
+ def __repr__(self):
+ return "%s(%r)" % (self.__class__.__name__, str(self))
+
+ def __iter__(self):
+ return iter((self.major, self.minor, self.patch))
+
+ def __eq__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return (
+ self.major == other.major
+ and self.minor == other.minor
+ and self.patch == other.patch
+ )
+
+ def __ne__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return tuple(self) != tuple(other)
+
+ def __lt__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return tuple(self) < tuple(other)
+
+ def __le__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return tuple(self) <= tuple(other)
+
+ def __gt__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return tuple(self) > tuple(other)
+
+ def __ge__(self, other):
+ if not isinstance(other, self.__class__):
+ return NotImplemented
+ return tuple(self) >= tuple(other)
+
+
+class EmrManagedSecurityGroup(object):
+ class Kind:
+ MASTER = "Master"
+ SLAVE = "Slave"
+ SERVICE = "Service"
+
+ kind = None
+
+ group_name = ""
+ short_name = ""
+ desc_fmt = "{short_name} for Elastic MapReduce created on {created}"
+
+ @classmethod
+ def description(cls):
+ created = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+ return cls.desc_fmt.format(short_name=cls.short_name, created=created)
+
+
+class EmrManagedMasterSecurityGroup(EmrManagedSecurityGroup):
+ kind = EmrManagedSecurityGroup.Kind.MASTER
+ group_name = "ElasticMapReduce-Master-Private"
+ short_name = "Master"
+
+
+class EmrManagedSlaveSecurityGroup(EmrManagedSecurityGroup):
+ kind = EmrManagedSecurityGroup.Kind.SLAVE
+ group_name = "ElasticMapReduce-Slave-Private"
+ short_name = "Slave"
+
+
+class EmrManagedServiceAccessSecurityGroup(EmrManagedSecurityGroup):
+ kind = EmrManagedSecurityGroup.Kind.SERVICE
+ group_name = "ElasticMapReduce-ServiceAccess"
+ short_name = "Service access"
+
+
+class EmrSecurityGroupManager(object):
+
+ MANAGED_RULES_EGRESS = [
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.MASTER,
+ "from_port": None,
+ "ip_protocol": "-1",
+ "ip_ranges": [{"CidrIp": "0.0.0.0/0"}],
+ "to_port": None,
+ "source_groups": [],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SLAVE,
+ "from_port": None,
+ "ip_protocol": "-1",
+ "ip_ranges": [{"CidrIp": "0.0.0.0/0"}],
+ "to_port": None,
+ "source_groups": [],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SERVICE,
+ "from_port": 8443,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 8443,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ ]
+
+ MANAGED_RULES_INGRESS = [
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.MASTER,
+ "from_port": 0,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 65535,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.MASTER,
+ "from_port": 8443,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 8443,
+ "source_groups": [{"GroupId": EmrManagedSecurityGroup.Kind.SERVICE}],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.MASTER,
+ "from_port": 0,
+ "ip_protocol": "udp",
+ "ip_ranges": [],
+ "to_port": 65535,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.MASTER,
+ "from_port": -1,
+ "ip_protocol": "icmp",
+ "ip_ranges": [],
+ "to_port": -1,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SLAVE,
+ "from_port": 0,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 65535,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SLAVE,
+ "from_port": 8443,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 8443,
+ "source_groups": [{"GroupId": EmrManagedSecurityGroup.Kind.SERVICE}],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SLAVE,
+ "from_port": 0,
+ "ip_protocol": "udp",
+ "ip_ranges": [],
+ "to_port": 65535,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SLAVE,
+ "from_port": -1,
+ "ip_protocol": "icmp",
+ "ip_ranges": [],
+ "to_port": -1,
+ "source_groups": [
+ {"GroupId": EmrManagedSecurityGroup.Kind.MASTER},
+ {"GroupId": EmrManagedSecurityGroup.Kind.SLAVE},
+ ],
+ },
+ {
+ "group_name_or_id": EmrManagedSecurityGroup.Kind.SERVICE,
+ "from_port": 9443,
+ "ip_protocol": "tcp",
+ "ip_ranges": [],
+ "to_port": 9443,
+ "source_groups": [{"GroupId": EmrManagedSecurityGroup.Kind.MASTER}],
+ },
+ ]
+
+ def __init__(self, ec2_backend, vpc_id):
+ self.ec2 = ec2_backend
+ self.vpc_id = vpc_id
+
+ def manage_security_groups(
+ self, master_security_group, slave_security_group, service_access_security_group
+ ):
+ group_metadata = [
+ (
+ master_security_group,
+ EmrManagedSecurityGroup.Kind.MASTER,
+ EmrManagedMasterSecurityGroup,
+ ),
+ (
+ slave_security_group,
+ EmrManagedSecurityGroup.Kind.SLAVE,
+ EmrManagedSlaveSecurityGroup,
+ ),
+ (
+ service_access_security_group,
+ EmrManagedSecurityGroup.Kind.SERVICE,
+ EmrManagedServiceAccessSecurityGroup,
+ ),
+ ]
+ managed_groups = {}
+ for name, kind, defaults in group_metadata:
+ managed_groups[kind] = self._get_or_create_sg(name, defaults)
+ self._add_rules_to(managed_groups)
+ return (
+ managed_groups[EmrManagedSecurityGroup.Kind.MASTER],
+ managed_groups[EmrManagedSecurityGroup.Kind.SLAVE],
+ managed_groups[EmrManagedSecurityGroup.Kind.SERVICE],
+ )
+
+ def _get_or_create_sg(self, sg_id, defaults):
+ find_sg = self.ec2.get_security_group_by_name_or_id
+ create_sg = self.ec2.create_security_group
+ group_id_or_name = sg_id or defaults.group_name
+ group = find_sg(group_id_or_name, self.vpc_id)
+ if group is None:
+ if group_id_or_name != defaults.group_name:
+ raise ValueError(
+ "The security group '{}' does not exist".format(group_id_or_name)
+ )
+ group = create_sg(defaults.group_name, defaults.description(), self.vpc_id)
+ return group
+
+ def _add_rules_to(self, managed_groups):
+ rules_metadata = [
+ (self.MANAGED_RULES_EGRESS, self.ec2.authorize_security_group_egress),
+ (self.MANAGED_RULES_INGRESS, self.ec2.authorize_security_group_ingress),
+ ]
+ for rules, add_rule in rules_metadata:
+ rendered_rules = self._render_rules(rules, managed_groups)
+ for rule in rendered_rules:
+ from moto.ec2.exceptions import InvalidPermissionDuplicateError
+
+ try:
+ add_rule(vpc_id=self.vpc_id, **rule)
+ except InvalidPermissionDuplicateError:
+ # If the rule already exists, we can just move on.
+ pass
+
+ @staticmethod
+ def _render_rules(rules, managed_groups):
+ rendered_rules = copy.deepcopy(rules)
+ for rule in rendered_rules:
+ rule["group_name_or_id"] = managed_groups[rule["group_name_or_id"]].id
+ rule["source_groups"] = [
+ {"GroupId": managed_groups[group.get("GroupId")].id}
+ for group in rule["source_groups"]
+ ]
+ return rendered_rules
diff --git a/contrib/python/moto/py3/moto/emrcontainers/__init__.py b/contrib/python/moto/py3/moto/emrcontainers/__init__.py
new file mode 100644
index 0000000000..3af933a85e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/__init__.py
@@ -0,0 +1,6 @@
+"""emrcontainers module initialization; sets value for base decorator."""
+from .models import emrcontainers_backends
+from ..core.models import base_decorator
+
+REGION = "us-east-1"
+mock_emrcontainers = base_decorator(emrcontainers_backends)
diff --git a/contrib/python/moto/py3/moto/emrcontainers/exceptions.py b/contrib/python/moto/py3/moto/emrcontainers/exceptions.py
new file mode 100644
index 0000000000..202541bb51
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/exceptions.py
@@ -0,0 +1,9 @@
+"""Exceptions raised by the emrcontainers service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, resource):
+ super().__init__("ResourceNotFoundException", resource)
diff --git a/contrib/python/moto/py3/moto/emrcontainers/models.py b/contrib/python/moto/py3/moto/emrcontainers/models.py
new file mode 100644
index 0000000000..e76646eb5a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/models.py
@@ -0,0 +1,369 @@
+"""EMRContainersBackend class with methods for supported APIs."""
+import re
+from datetime import datetime
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
+
+from .utils import random_cluster_id, random_job_id, get_partition, paginated_list
+from .exceptions import ResourceNotFoundException
+
+from ..config.exceptions import ValidationException
+
+VIRTUAL_CLUSTER_ARN_TEMPLATE = (
+ "arn:{partition}:emr-containers:{region}:"
+ + str(get_account_id())
+ + ":/virtualclusters/{virtual_cluster_id}"
+)
+
+JOB_ARN_TEMPLATE = (
+ "arn:{partition}:emr-containers:{region}:"
+ + str(get_account_id())
+ + ":/virtualclusters/{virtual_cluster_id}/jobruns/{job_id}"
+)
+
+# Defaults used for creating a Virtual cluster
+VIRTUAL_CLUSTER_STATUS = "RUNNING"
+JOB_STATUS = "RUNNING"
+
+
+class FakeCluster(BaseModel):
+ def __init__(
+ self,
+ name,
+ container_provider,
+ client_token,
+ region_name,
+ aws_partition,
+ tags=None,
+ virtual_cluster_id=None,
+ ):
+ self.id = virtual_cluster_id or random_cluster_id()
+
+ self.name = name
+ self.client_token = client_token
+ self.arn = VIRTUAL_CLUSTER_ARN_TEMPLATE.format(
+ partition=aws_partition, region=region_name, virtual_cluster_id=self.id
+ )
+ self.state = VIRTUAL_CLUSTER_STATUS
+ self.container_provider = container_provider
+ self.container_provider_id = container_provider["id"]
+ self.namespace = container_provider["info"]["eksInfo"]["namespace"]
+ self.creation_date = iso_8601_datetime_without_milliseconds(
+ datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
+ )
+ self.tags = tags
+
+ def __iter__(self):
+ yield "id", self.id
+ yield "name", self.name
+ yield "arn", self.arn
+ yield "state", self.state
+ yield "containerProvider", self.container_provider
+ yield "createdAt", self.creation_date
+ yield "tags", self.tags
+
+ def to_dict(self):
+ # Format for summary https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_DescribeVirtualCluster.html
+ # (response syntax section)
+ return {
+ "id": self.id,
+ "name": self.name,
+ "arn": self.arn,
+ "state": self.state,
+ "containerProvider": self.container_provider,
+ "createdAt": self.creation_date,
+ "tags": self.tags,
+ }
+
+
+class FakeJob(BaseModel):
+ def __init__(
+ self,
+ name,
+ virtual_cluster_id,
+ client_token,
+ execution_role_arn,
+ release_label,
+ job_driver,
+ configuration_overrides,
+ region_name,
+ aws_partition,
+ tags,
+ ):
+ self.id = random_job_id()
+ self.name = name
+ self.virtual_cluster_id = virtual_cluster_id
+ self.arn = JOB_ARN_TEMPLATE.format(
+ partition=aws_partition,
+ region=region_name,
+ virtual_cluster_id=self.virtual_cluster_id,
+ job_id=self.id,
+ )
+ self.state = JOB_STATUS
+ self.client_token = client_token
+ self.execution_role_arn = execution_role_arn
+ self.release_label = release_label
+ self.job_driver = job_driver
+ self.configuration_overrides = configuration_overrides
+ self.created_at = iso_8601_datetime_without_milliseconds(
+ datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
+ )
+ self.created_by = None
+ self.finished_at = None
+ self.state_details = None
+ self.failure_reason = None
+ self.tags = tags
+
+ def __iter__(self):
+ yield "id", self.id
+ yield "name", self.name
+ yield "virtualClusterId", self.virtual_cluster_id
+ yield "arn", self.arn
+ yield "state", self.state
+ yield "clientToken", self.client_token
+ yield "executionRoleArn", self.execution_role_arn
+ yield "releaseLabel", self.release_label
+ yield "configurationOverrides", self.release_label
+ yield "jobDriver", self.job_driver
+ yield "createdAt", self.created_at
+ yield "createdBy", self.created_by
+ yield "finishedAt", self.finished_at
+ yield "stateDetails", self.state_details
+ yield "failureReason", self.failure_reason
+ yield "tags", self.tags
+
+ def to_dict(self):
+ # Format for summary https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_DescribeJobRun.html
+ # (response syntax section)
+ return {
+ "id": self.id,
+ "name": self.name,
+ "virtualClusterId": self.virtual_cluster_id,
+ "arn": self.arn,
+ "state": self.state,
+ "clientToken": self.client_token,
+ "executionRoleArn": self.execution_role_arn,
+ "releaseLabel": self.release_label,
+ "configurationOverrides": self.configuration_overrides,
+ "jobDriver": self.job_driver,
+ "createdAt": self.created_at,
+ "createdBy": self.created_by,
+ "finishedAt": self.finished_at,
+ "stateDetails": self.state_details,
+ "failureReason": self.failure_reason,
+ "tags": self.tags,
+ }
+
+
+class EMRContainersBackend(BaseBackend):
+ """Implementation of EMRContainers APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.virtual_clusters = dict()
+ self.virtual_cluster_count = 0
+ self.jobs = dict()
+ self.job_count = 0
+ self.partition = get_partition(region_name)
+
+ def create_virtual_cluster(self, name, container_provider, client_token, tags=None):
+ occupied_namespaces = [
+ virtual_cluster.namespace
+ for virtual_cluster in self.virtual_clusters.values()
+ ]
+
+ if container_provider["info"]["eksInfo"]["namespace"] in occupied_namespaces:
+ raise ValidationException(
+ "A virtual cluster already exists in the given namespace"
+ )
+
+ virtual_cluster = FakeCluster(
+ name=name,
+ container_provider=container_provider,
+ client_token=client_token,
+ tags=tags,
+ region_name=self.region_name,
+ aws_partition=self.partition,
+ )
+
+ self.virtual_clusters[virtual_cluster.id] = virtual_cluster
+ self.virtual_cluster_count += 1
+ return virtual_cluster
+
+ def delete_virtual_cluster(self, cluster_id):
+ if cluster_id not in self.virtual_clusters:
+ raise ValidationException("VirtualCluster does not exist")
+
+ self.virtual_clusters[cluster_id].state = "TERMINATED"
+ return self.virtual_clusters[cluster_id]
+
+ def describe_virtual_cluster(self, cluster_id):
+ if cluster_id not in self.virtual_clusters:
+ raise ValidationException(f"Virtual cluster {cluster_id} doesn't exist.")
+
+ return self.virtual_clusters[cluster_id].to_dict()
+
+ def list_virtual_clusters(
+ self,
+ container_provider_id,
+ container_provider_type,
+ created_after,
+ created_before,
+ states,
+ max_results,
+ next_token,
+ ):
+ virtual_clusters = [
+ virtual_cluster.to_dict()
+ for virtual_cluster in self.virtual_clusters.values()
+ ]
+
+ if container_provider_id:
+ virtual_clusters = [
+ virtual_cluster
+ for virtual_cluster in virtual_clusters
+ if virtual_cluster["containerProvider"]["id"] == container_provider_id
+ ]
+
+ if container_provider_type:
+ virtual_clusters = [
+ virtual_cluster
+ for virtual_cluster in virtual_clusters
+ if virtual_cluster["containerProvider"]["type"]
+ == container_provider_type
+ ]
+
+ if created_after:
+ virtual_clusters = [
+ virtual_cluster
+ for virtual_cluster in virtual_clusters
+ if virtual_cluster["createdAt"] >= created_after
+ ]
+
+ if created_before:
+ virtual_clusters = [
+ virtual_cluster
+ for virtual_cluster in virtual_clusters
+ if virtual_cluster["createdAt"] <= created_before
+ ]
+
+ if states:
+ virtual_clusters = [
+ virtual_cluster
+ for virtual_cluster in virtual_clusters
+ if virtual_cluster["state"] in states
+ ]
+ sort_key = "name"
+ return paginated_list(virtual_clusters, sort_key, max_results, next_token)
+
+ def start_job_run(
+ self,
+ name,
+ virtual_cluster_id,
+ client_token,
+ execution_role_arn,
+ release_label,
+ job_driver,
+ configuration_overrides,
+ tags,
+ ):
+
+ if virtual_cluster_id not in self.virtual_clusters.keys():
+ raise ResourceNotFoundException(
+ f"Virtual cluster {virtual_cluster_id} doesn't exist."
+ )
+
+ if not re.match(
+ r"emr-[0-9]{1}\.[0-9]{1,2}\.0-(latest|[0-9]{8})", release_label
+ ):
+ raise ResourceNotFoundException(f"Release {release_label} doesn't exist.")
+
+ job = FakeJob(
+ name=name,
+ virtual_cluster_id=virtual_cluster_id,
+ client_token=client_token,
+ execution_role_arn=execution_role_arn,
+ release_label=release_label,
+ job_driver=job_driver,
+ configuration_overrides=configuration_overrides,
+ tags=tags,
+ region_name=self.region_name,
+ aws_partition=self.partition,
+ )
+
+ self.jobs[job.id] = job
+ self.job_count += 1
+ return job
+
+ def cancel_job_run(self, job_id, virtual_cluster_id):
+
+ if not re.match(r"[a-z,A-Z,0-9]{19}", job_id):
+ raise ValidationException("Invalid job run short id")
+
+ if job_id not in self.jobs.keys():
+ raise ResourceNotFoundException(f"Job run {job_id} doesn't exist.")
+
+ if virtual_cluster_id != self.jobs[job_id].virtual_cluster_id:
+ raise ResourceNotFoundException(f"Job run {job_id} doesn't exist.")
+
+ if self.jobs[job_id].state in [
+ "FAILED",
+ "CANCELLED",
+ "CANCEL_PENDING",
+ "COMPLETED",
+ ]:
+ raise ValidationException(f"Job run {job_id} is not in a cancellable state")
+
+ job = self.jobs[job_id]
+ job.state = "CANCELLED"
+ job.finished_at = iso_8601_datetime_without_milliseconds(
+ datetime.today().replace(hour=0, minute=1, second=0, microsecond=0)
+ )
+ job.state_details = "JobRun CANCELLED successfully."
+
+ return job
+
+ def list_job_runs(
+ self,
+ virtual_cluster_id,
+ created_before,
+ created_after,
+ name,
+ states,
+ max_results,
+ next_token,
+ ):
+ jobs = [job.to_dict() for job in self.jobs.values()]
+
+ jobs = [job for job in jobs if job["virtualClusterId"] == virtual_cluster_id]
+
+ if created_after:
+ jobs = [job for job in jobs if job["createdAt"] >= created_after]
+
+ if created_before:
+ jobs = [job for job in jobs if job["createdAt"] <= created_before]
+
+ if states:
+ jobs = [job for job in jobs if job["state"] in states]
+
+ if name:
+ jobs = [job for job in jobs if job["name"] in name]
+
+ sort_key = "id"
+ return paginated_list(jobs, sort_key, max_results, next_token)
+
+ def describe_job_run(self, job_id, virtual_cluster_id):
+ if not re.match(r"[a-z,A-Z,0-9]{19}", job_id):
+ raise ValidationException("Invalid job run short id")
+
+ if job_id not in self.jobs.keys():
+ raise ResourceNotFoundException(f"Job run {job_id} doesn't exist.")
+
+ if virtual_cluster_id != self.jobs[job_id].virtual_cluster_id:
+ raise ResourceNotFoundException(f"Job run {job_id} doesn't exist.")
+
+ return self.jobs[job_id].to_dict()
+
+
+emrcontainers_backends = BackendDict(EMRContainersBackend, "emr-containers")
diff --git a/contrib/python/moto/py3/moto/emrcontainers/responses.py b/contrib/python/moto/py3/moto/emrcontainers/responses.py
new file mode 100644
index 0000000000..084de2fce8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/responses.py
@@ -0,0 +1,139 @@
+"""Handles incoming emrcontainers requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import emrcontainers_backends
+
+DEFAULT_MAX_RESULTS = 100
+DEFAULT_NEXT_TOKEN = ""
+DEFAULT_CONTAINER_PROVIDER_TYPE = "EKS"
+
+
+class EMRContainersResponse(BaseResponse):
+ """Handler for EMRContainers requests and responses."""
+
+ SERVICE_NAME = "emr-containers"
+
+ @property
+ def emrcontainers_backend(self):
+ """Return backend instance specific for this region."""
+ return emrcontainers_backends[self.region]
+
+ def create_virtual_cluster(self):
+ name = self._get_param("name")
+ container_provider = self._get_param("containerProvider")
+ client_token = self._get_param("clientToken")
+ tags = self._get_param("tags")
+
+ virtual_cluster = self.emrcontainers_backend.create_virtual_cluster(
+ name=name,
+ container_provider=container_provider,
+ client_token=client_token,
+ tags=tags,
+ )
+ return 200, {}, json.dumps(dict(virtual_cluster))
+
+ def delete_virtual_cluster(self):
+ cluster_id = self._get_param("virtualClusterId")
+
+ virtual_cluster = self.emrcontainers_backend.delete_virtual_cluster(
+ cluster_id=cluster_id
+ )
+ return 200, {}, json.dumps(dict(virtual_cluster))
+
+ def describe_virtual_cluster(self):
+ cluster_id = self._get_param("virtualClusterId")
+
+ virtual_cluster = self.emrcontainers_backend.describe_virtual_cluster(
+ cluster_id=cluster_id
+ )
+ response = {"virtualCluster": virtual_cluster}
+ return 200, {}, json.dumps(response)
+
+ def list_virtual_clusters(self):
+ container_provider_id = self._get_param("containerProviderId")
+ container_provider_type = self._get_param(
+ "containerProviderType", DEFAULT_CONTAINER_PROVIDER_TYPE
+ )
+ created_after = self._get_param("createdAfter")
+ created_before = self._get_param("createdBefore")
+ states = self.querystring.get("states", [])
+ max_results = self._get_int_param("maxResults", DEFAULT_MAX_RESULTS)
+ next_token = self._get_param("nextToken", DEFAULT_NEXT_TOKEN)
+
+ virtual_clusters, next_token = self.emrcontainers_backend.list_virtual_clusters(
+ container_provider_id=container_provider_id,
+ container_provider_type=container_provider_type,
+ created_after=created_after,
+ created_before=created_before,
+ states=states,
+ max_results=max_results,
+ next_token=next_token,
+ )
+
+ response = {"virtualClusters": virtual_clusters, "nextToken": next_token}
+ return 200, {}, json.dumps(response)
+
+ def start_job_run(self):
+ name = self._get_param("name")
+ virtual_cluster_id = self._get_param("virtualClusterId")
+ client_token = self._get_param("clientToken")
+ execution_role_arn = self._get_param("executionRoleArn")
+ release_label = self._get_param("releaseLabel")
+ job_driver = self._get_param("jobDriver")
+ configuration_overrides = self._get_param("configurationOverrides")
+ tags = self._get_param("tags")
+
+ job = self.emrcontainers_backend.start_job_run(
+ name=name,
+ virtual_cluster_id=virtual_cluster_id,
+ client_token=client_token,
+ execution_role_arn=execution_role_arn,
+ release_label=release_label,
+ job_driver=job_driver,
+ configuration_overrides=configuration_overrides,
+ tags=tags,
+ )
+ return 200, {}, json.dumps(dict(job))
+
+ def cancel_job_run(self):
+ job_id = self._get_param("jobRunId")
+ virtual_cluster_id = self._get_param("virtualClusterId")
+
+ job = self.emrcontainers_backend.cancel_job_run(
+ job_id=job_id, virtual_cluster_id=virtual_cluster_id
+ )
+ return 200, {}, json.dumps(dict(job))
+
+ def list_job_runs(self):
+ virtual_cluster_id = self._get_param("virtualClusterId")
+ created_before = self._get_param("createdBefore")
+ created_after = self._get_param("createdAfter")
+ name = self._get_param("name")
+ states = self.querystring.get("states", [])
+ max_results = self._get_int_param("maxResults", DEFAULT_MAX_RESULTS)
+ next_token = self._get_param("nextToken", DEFAULT_NEXT_TOKEN)
+
+ job_runs, next_token = self.emrcontainers_backend.list_job_runs(
+ virtual_cluster_id=virtual_cluster_id,
+ created_before=created_before,
+ created_after=created_after,
+ name=name,
+ states=states,
+ max_results=max_results,
+ next_token=next_token,
+ )
+
+ response = {"jobRuns": job_runs, "nextToken": next_token}
+ return 200, {}, json.dumps(response)
+
+ def describe_job_run(self):
+ job_id = self._get_param("jobRunId")
+ virtual_cluster_id = self._get_param("virtualClusterId")
+
+ job_run = self.emrcontainers_backend.describe_job_run(
+ job_id=job_id, virtual_cluster_id=virtual_cluster_id
+ )
+
+ response = {"jobRun": job_run}
+ return 200, {}, json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/emrcontainers/urls.py b/contrib/python/moto/py3/moto/emrcontainers/urls.py
new file mode 100644
index 0000000000..ce5d974d8d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/urls.py
@@ -0,0 +1,14 @@
+"""emrcontainers base URL and path."""
+from .responses import EMRContainersResponse
+
+url_bases = [
+ r"https?://emr-containers\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/virtualclusters$": EMRContainersResponse.dispatch,
+ "{0}/virtualclusters/(?P<virtualClusterId>[^/]+)$": EMRContainersResponse.dispatch,
+ "{0}/virtualclusters/(?P<virtualClusterId>[^/]+)/jobruns$": EMRContainersResponse.dispatch,
+ "{0}/virtualclusters/(?P<virtualClusterId>[^/]+)/jobruns/(?P<jobRunId>[^/]+)$": EMRContainersResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/emrcontainers/utils.py b/contrib/python/moto/py3/moto/emrcontainers/utils.py
new file mode 100644
index 0000000000..07276318ab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/emrcontainers/utils.py
@@ -0,0 +1,50 @@
+# import json
+import string
+import random
+
+
+def get_partition(region):
+ valid_matches = [
+ # (region prefix, aws partition)
+ ("cn-", "aws-cn"),
+ ("us-gov-", "aws-us-gov"),
+ ("us-gov-iso-", "aws-iso"),
+ ("us-gov-iso-b-", "aws-iso-b"),
+ ]
+
+ for prefix, partition in valid_matches:
+ if region.startswith(prefix):
+ return partition
+ return "aws"
+
+
+def random_id(size=13):
+ chars = list(range(10)) + list(string.ascii_lowercase)
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def random_cluster_id():
+ return random_id(size=25)
+
+
+def random_job_id():
+ return random_id(size=19)
+
+
+def paginated_list(full_list, sort_key, max_results, next_token):
+ """
+ Returns a tuple containing a slice of the full list starting at next_token and ending with at most the max_results
+ number of elements, and the new next_token which can be passed back in for the next segment of the full list.
+ """
+ if next_token is None or not next_token:
+ next_token = 0
+ next_token = int(next_token)
+
+ sorted_list = sorted(full_list, key=lambda d: d[sort_key])
+
+ values = sorted_list[next_token : next_token + max_results]
+ if len(values) == max_results:
+ new_next_token = str(next_token + max_results)
+ else:
+ new_next_token = None
+ return values, new_next_token
diff --git a/contrib/python/moto/py3/moto/es/__init__.py b/contrib/python/moto/py3/moto/es/__init__.py
new file mode 100644
index 0000000000..c015d07da1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/es/__init__.py
@@ -0,0 +1,5 @@
+"""es module initialization; sets value for base decorator."""
+from .models import es_backends
+from ..core.models import base_decorator
+
+mock_es = base_decorator(es_backends)
diff --git a/contrib/python/moto/py3/moto/es/exceptions.py b/contrib/python/moto/py3/moto/es/exceptions.py
new file mode 100644
index 0000000000..31fb77c9e5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/es/exceptions.py
@@ -0,0 +1,25 @@
+"""Exceptions raised by the ElasticSearch service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ElasticSearchError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFound(ElasticSearchError):
+ code = 409
+
+ def __init__(self, resource_type, resource_name):
+ msg = f"{resource_type} not found: {resource_name}"
+ super().__init__("ResourceNotFoundException", msg)
+
+
+class InvalidDomainName(ElasticSearchError):
+ def __init__(self, domain_name):
+ msg = f"1 validation error detected: Value '{domain_name}' at 'domainName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-z][a-z0-9\\-]+"
+ super().__init__("ValidationException", msg)
+
+
+class DomainNotFound(ResourceNotFound):
+ def __init__(self, domain_name):
+ super().__init__("Domain", domain_name)
diff --git a/contrib/python/moto/py3/moto/es/models.py b/contrib/python/moto/py3/moto/es/models.py
new file mode 100644
index 0000000000..a790638a2e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/es/models.py
@@ -0,0 +1,141 @@
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import get_random_hex, BackendDict
+from .exceptions import DomainNotFound
+
+
+class Domain(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ domain_name,
+ es_version,
+ elasticsearch_cluster_config,
+ ebs_options,
+ access_policies,
+ snapshot_options,
+ vpc_options,
+ cognito_options,
+ encryption_at_rest_options,
+ node_to_node_encryption_options,
+ advanced_options,
+ log_publishing_options,
+ domain_endpoint_options,
+ advanced_security_options,
+ auto_tune_options,
+ ):
+ self.domain_id = get_random_hex(8)
+ self.region_name = region_name
+ self.domain_name = domain_name
+ self.es_version = es_version
+ self.elasticsearch_cluster_config = elasticsearch_cluster_config
+ self.ebs_options = ebs_options
+ self.access_policies = access_policies
+ self.snapshot_options = snapshot_options
+ self.vpc_options = vpc_options
+ self.cognito_options = cognito_options
+ self.encryption_at_rest_options = encryption_at_rest_options
+ self.node_to_node_encryption_options = node_to_node_encryption_options
+ self.advanced_options = advanced_options
+ self.log_publishing_options = log_publishing_options
+ self.domain_endpoint_options = domain_endpoint_options
+ self.advanced_security_options = advanced_security_options
+ self.auto_tune_options = auto_tune_options
+ if self.auto_tune_options:
+ self.auto_tune_options["State"] = "ENABLED"
+
+ @property
+ def arn(self):
+ return f"arn:aws:es:{self.region_name}:domain/{self.domain_id}"
+
+ def to_json(self):
+ return {
+ "DomainId": self.domain_id,
+ "DomainName": self.domain_name,
+ "ARN": self.arn,
+ "Created": True,
+ "Deleted": False,
+ "Processing": False,
+ "UpgradeProcessing": False,
+ "ElasticsearchVersion": self.es_version,
+ "ElasticsearchClusterConfig": self.elasticsearch_cluster_config,
+ "EBSOptions": self.ebs_options,
+ "AccessPolicies": self.access_policies,
+ "SnapshotOptions": self.snapshot_options,
+ "VPCOptions": self.vpc_options,
+ "CognitoOptions": self.cognito_options,
+ "EncryptionAtRestOptions": self.encryption_at_rest_options,
+ "NodeToNodeEncryptionOptions": self.node_to_node_encryption_options,
+ "AdvancedOptions": self.advanced_options,
+ "LogPublishingOptions": self.log_publishing_options,
+ "DomainEndpointOptions": self.domain_endpoint_options,
+ "AdvancedSecurityOptions": self.advanced_security_options,
+ "AutoTuneOptions": self.auto_tune_options,
+ }
+
+
+class ElasticsearchServiceBackend(BaseBackend):
+ """Implementation of ElasticsearchService APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.domains = dict()
+
+ def create_elasticsearch_domain(
+ self,
+ domain_name,
+ elasticsearch_version,
+ elasticsearch_cluster_config,
+ ebs_options,
+ access_policies,
+ snapshot_options,
+ vpc_options,
+ cognito_options,
+ encryption_at_rest_options,
+ node_to_node_encryption_options,
+ advanced_options,
+ log_publishing_options,
+ domain_endpoint_options,
+ advanced_security_options,
+ auto_tune_options,
+ ):
+ # TODO: Persist/Return other attributes
+ new_domain = Domain(
+ region_name=self.region_name,
+ domain_name=domain_name,
+ es_version=elasticsearch_version,
+ elasticsearch_cluster_config=elasticsearch_cluster_config,
+ ebs_options=ebs_options,
+ access_policies=access_policies,
+ snapshot_options=snapshot_options,
+ vpc_options=vpc_options,
+ cognito_options=cognito_options,
+ encryption_at_rest_options=encryption_at_rest_options,
+ node_to_node_encryption_options=node_to_node_encryption_options,
+ advanced_options=advanced_options,
+ log_publishing_options=log_publishing_options,
+ domain_endpoint_options=domain_endpoint_options,
+ advanced_security_options=advanced_security_options,
+ auto_tune_options=auto_tune_options,
+ )
+ self.domains[domain_name] = new_domain
+ return new_domain.to_json()
+
+ def delete_elasticsearch_domain(self, domain_name):
+ if domain_name not in self.domains:
+ raise DomainNotFound(domain_name)
+ del self.domains[domain_name]
+
+ def describe_elasticsearch_domain(self, domain_name):
+ if domain_name not in self.domains:
+ raise DomainNotFound(domain_name)
+ return self.domains[domain_name].to_json()
+
+ def list_domain_names(self):
+ """
+ The engine-type parameter is not yet supported.
+ Pagination is not yet implemented.
+ """
+ return [{"DomainName": domain.domain_name} for domain in self.domains.values()]
+
+
+es_backends = BackendDict(ElasticsearchServiceBackend, "es")
diff --git a/contrib/python/moto/py3/moto/es/responses.py b/contrib/python/moto/py3/moto/es/responses.py
new file mode 100644
index 0000000000..7aaa11ae49
--- /dev/null
+++ b/contrib/python/moto/py3/moto/es/responses.py
@@ -0,0 +1,94 @@
+import json
+import re
+
+from moto.core.responses import BaseResponse
+from .exceptions import InvalidDomainName
+from .models import es_backends
+
+
+class ElasticsearchServiceResponse(BaseResponse):
+ """Handler for ElasticsearchService requests and responses."""
+
+ @property
+ def es_backend(self):
+ """Return backend instance specific for this region."""
+ return es_backends[self.region]
+
+ @classmethod
+ def list_domains(cls, request, full_url, headers):
+ response = ElasticsearchServiceResponse()
+ response.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return response.list_domain_names()
+
+ @classmethod
+ def domains(cls, request, full_url, headers):
+ response = ElasticsearchServiceResponse()
+ response.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return response.create_elasticsearch_domain()
+
+ @classmethod
+ def domain(cls, request, full_url, headers):
+ response = ElasticsearchServiceResponse()
+ response.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return response.delete_elasticsearch_domain()
+ if request.method == "GET":
+ return response.describe_elasticsearch_domain()
+
+ def create_elasticsearch_domain(self):
+ params = json.loads(self.body)
+ domain_name = params.get("DomainName")
+ if not re.match(r"^[a-z][a-z0-9\-]+$", domain_name):
+ raise InvalidDomainName(domain_name)
+ elasticsearch_version = params.get("ElasticsearchVersion")
+ elasticsearch_cluster_config = params.get("ElasticsearchClusterConfig")
+ ebs_options = params.get("EBSOptions")
+ access_policies = params.get("AccessPolicies")
+ snapshot_options = params.get("SnapshotOptions")
+ vpc_options = params.get("VPCOptions")
+ cognito_options = params.get("CognitoOptions")
+ encryption_at_rest_options = params.get("EncryptionAtRestOptions")
+ node_to_node_encryption_options = params.get("NodeToNodeEncryptionOptions")
+ advanced_options = params.get("AdvancedOptions")
+ log_publishing_options = params.get("LogPublishingOptions")
+ domain_endpoint_options = params.get("DomainEndpointOptions")
+ advanced_security_options = params.get("AdvancedSecurityOptions")
+ auto_tune_options = params.get("AutoTuneOptions")
+ domain_status = self.es_backend.create_elasticsearch_domain(
+ domain_name=domain_name,
+ elasticsearch_version=elasticsearch_version,
+ elasticsearch_cluster_config=elasticsearch_cluster_config,
+ ebs_options=ebs_options,
+ access_policies=access_policies,
+ snapshot_options=snapshot_options,
+ vpc_options=vpc_options,
+ cognito_options=cognito_options,
+ encryption_at_rest_options=encryption_at_rest_options,
+ node_to_node_encryption_options=node_to_node_encryption_options,
+ advanced_options=advanced_options,
+ log_publishing_options=log_publishing_options,
+ domain_endpoint_options=domain_endpoint_options,
+ advanced_security_options=advanced_security_options,
+ auto_tune_options=auto_tune_options,
+ )
+ return 200, {}, json.dumps({"DomainStatus": domain_status})
+
+ def delete_elasticsearch_domain(self):
+ domain_name = self.path.split("/")[-1]
+ self.es_backend.delete_elasticsearch_domain(domain_name=domain_name)
+ return 200, {}, json.dumps(dict())
+
+ def describe_elasticsearch_domain(self):
+ domain_name = self.path.split("/")[-1]
+ if not re.match(r"^[a-z][a-z0-9\-]+$", domain_name):
+ raise InvalidDomainName(domain_name)
+ domain_status = self.es_backend.describe_elasticsearch_domain(
+ domain_name=domain_name
+ )
+ return 200, {}, json.dumps({"DomainStatus": domain_status})
+
+ def list_domain_names(self):
+ domain_names = self.es_backend.list_domain_names()
+ return 200, {}, json.dumps({"DomainNames": domain_names})
diff --git a/contrib/python/moto/py3/moto/es/urls.py b/contrib/python/moto/py3/moto/es/urls.py
new file mode 100644
index 0000000000..4c4675f290
--- /dev/null
+++ b/contrib/python/moto/py3/moto/es/urls.py
@@ -0,0 +1,12 @@
+from .responses import ElasticsearchServiceResponse
+
+url_bases = [
+ r"https?://es\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/2015-01-01/domain$": ElasticsearchServiceResponse.list_domains,
+ "{0}/2015-01-01/es/domain$": ElasticsearchServiceResponse.domains,
+ "{0}/2015-01-01/es/domain/(?P<domainname>[^/]+)": ElasticsearchServiceResponse.domain,
+}
diff --git a/contrib/python/moto/py3/moto/events/__init__.py b/contrib/python/moto/py3/moto/events/__init__.py
new file mode 100644
index 0000000000..ec0c24e4b2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/__init__.py
@@ -0,0 +1,5 @@
+from .models import events_backends
+from ..core.models import base_decorator
+
+events_backend = events_backends["us-east-1"]
+mock_events = base_decorator(events_backends)
diff --git a/contrib/python/moto/py3/moto/events/exceptions.py b/contrib/python/moto/py3/moto/events/exceptions.py
new file mode 100644
index 0000000000..2412dee087
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/exceptions.py
@@ -0,0 +1,40 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class IllegalStatusException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("IllegalStatusException", message)
+
+
+class InvalidEventPatternException(JsonRESTError):
+ code = 400
+
+ def __init__(self, reason=None):
+ msg = "Event pattern is not valid. "
+ if reason:
+ msg += f"Reason: {reason}"
+
+ super().__init__("InvalidEventPatternException", msg)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundException", message)
+
+
+class ResourceAlreadyExistsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceAlreadyExistsException", message)
+
+
+class ValidationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/events/models.py b/contrib/python/moto/py3/moto/events/models.py
new file mode 100644
index 0000000000..4a9a7a990c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/models.py
@@ -0,0 +1,1830 @@
+import copy
+import os
+import re
+import json
+import sys
+import warnings
+from collections import namedtuple
+from datetime import datetime
+from enum import Enum, unique
+from json import JSONDecodeError
+from operator import lt, le, eq, ge, gt
+
+from collections import OrderedDict
+from moto.core.exceptions import JsonRESTError
+from moto.core import get_account_id, BaseBackend, CloudFormationModel, BaseModel
+from moto.core.utils import (
+ unix_time,
+ unix_time_millis,
+ iso_8601_datetime_without_milliseconds,
+ BackendDict,
+)
+from moto.events.exceptions import (
+ ValidationException,
+ ResourceNotFoundException,
+ ResourceAlreadyExistsException,
+ InvalidEventPatternException,
+ IllegalStatusException,
+)
+from moto.utilities.paginator import paginate
+from moto.utilities.tagging_service import TaggingService
+
+from uuid import uuid4
+
+from .utils import PAGINATION_MODEL
+
+# Sentinel to signal the absence of a field for `Exists` pattern matching
+UNDEFINED = object()
+
+
+class Rule(CloudFormationModel):
+ Arn = namedtuple("Arn", ["service", "resource_type", "resource_id"])
+
+ def __init__(
+ self,
+ name,
+ region_name,
+ description,
+ event_pattern,
+ schedule_exp,
+ role_arn,
+ event_bus_name,
+ state,
+ managed_by=None,
+ targets=None,
+ ):
+ self.name = name
+ self.region_name = region_name
+ self.description = description
+ self.event_pattern = EventPattern.load(event_pattern)
+ self.scheduled_expression = schedule_exp
+ self.role_arn = role_arn
+ self.event_bus_name = event_bus_name
+ self.state = state or "ENABLED"
+ self.managed_by = managed_by # can only be set by AWS services
+ self.created_by = get_account_id()
+ self.targets = targets or []
+
+ @property
+ def arn(self):
+ event_bus_name = (
+ ""
+ if self.event_bus_name == "default"
+ else "{}/".format(self.event_bus_name)
+ )
+
+ return (
+ "arn:aws:events:{region}:{account_id}:rule/{event_bus_name}{name}".format(
+ region=self.region_name,
+ account_id=get_account_id(),
+ event_bus_name=event_bus_name,
+ name=self.name,
+ )
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ # This song and dance for targets is because we need order for Limits and NextTokens, but can't use OrderedDicts
+ # with Python 2.6, so tracking it with an array it is.
+ def _check_target_exists(self, target_id):
+ for i in range(0, len(self.targets)):
+ if target_id == self.targets[i]["Id"]:
+ return i
+ return None
+
+ def enable(self):
+ self.state = "ENABLED"
+
+ def disable(self):
+ self.state = "DISABLED"
+
+ def delete(self, region_name):
+ event_backend = events_backends[region_name]
+ event_backend.delete_rule(name=self.name)
+
+ def put_targets(self, targets):
+ # Not testing for valid ARNs.
+ for target in targets:
+ index = self._check_target_exists(target["Id"])
+ if index is not None:
+ self.targets[index] = target
+ else:
+ self.targets.append(target)
+
+ def remove_targets(self, ids):
+ for target_id in ids:
+ index = self._check_target_exists(target_id)
+ if index is not None:
+ self.targets.pop(index)
+
+ def send_to_targets(self, event_bus_name, event):
+ event_bus_name = event_bus_name.split("/")[-1]
+ if event_bus_name != self.event_bus_name.split("/")[-1]:
+ return
+
+ if not self.event_pattern.matches_event(event):
+ return
+
+ # supported targets
+ # - CloudWatch Log Group
+ # - EventBridge Archive
+ # - SQS Queue + FIFO Queue
+ for target in self.targets:
+ arn = self._parse_arn(target["Arn"])
+
+ if arn.service == "logs" and arn.resource_type == "log-group":
+ self._send_to_cw_log_group(arn.resource_id, event)
+ elif arn.service == "events" and not arn.resource_type:
+ input_template = json.loads(target["InputTransformer"]["InputTemplate"])
+ archive_arn = self._parse_arn(input_template["archive-arn"])
+
+ self._send_to_events_archive(archive_arn.resource_id, event)
+ elif arn.service == "sqs":
+ group_id = target.get("SqsParameters", {}).get("MessageGroupId")
+ self._send_to_sqs_queue(arn.resource_id, event, group_id)
+ else:
+ raise NotImplementedError("Expr not defined for {0}".format(type(self)))
+
+ def _parse_arn(self, arn):
+ # http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
+ # this method needs probably some more fine tuning,
+ # when also other targets are supported
+ elements = arn.split(":", 5)
+
+ service = elements[2]
+ resource = elements[5]
+
+ if ":" in resource and "/" in resource:
+ if resource.index(":") < resource.index("/"):
+ resource_type, resource_id = resource.split(":", 1)
+ else:
+ resource_type, resource_id = resource.split("/", 1)
+ elif ":" in resource:
+ resource_type, resource_id = resource.split(":", 1)
+ elif "/" in resource:
+ resource_type, resource_id = resource.split("/", 1)
+ else:
+ resource_type = None
+ resource_id = resource
+
+ return self.Arn(
+ service=service, resource_type=resource_type, resource_id=resource_id
+ )
+
+ def _send_to_cw_log_group(self, name, event):
+ from moto.logs import logs_backends
+
+ event_copy = copy.deepcopy(event)
+ event_copy["time"] = iso_8601_datetime_without_milliseconds(
+ datetime.utcfromtimestamp(event_copy["time"])
+ )
+
+ log_stream_name = str(uuid4())
+ log_events = [
+ {
+ "timestamp": unix_time_millis(datetime.utcnow()),
+ "message": json.dumps(event_copy),
+ }
+ ]
+
+ logs_backends[self.region_name].create_log_stream(name, log_stream_name)
+ logs_backends[self.region_name].put_log_events(
+ name, log_stream_name, log_events
+ )
+
+ def _send_to_events_archive(self, resource_id, event):
+ archive_name, archive_uuid = resource_id.split(":")
+ archive = events_backends[self.region_name].archives.get(archive_name)
+ if archive.uuid == archive_uuid:
+ archive.events.append(event)
+
+ def _send_to_sqs_queue(self, resource_id, event, group_id=None):
+ from moto.sqs import sqs_backends
+
+ event_copy = copy.deepcopy(event)
+ event_copy["time"] = iso_8601_datetime_without_milliseconds(
+ datetime.utcfromtimestamp(event_copy["time"])
+ )
+
+ if group_id:
+ queue_attr = sqs_backends[self.region_name].get_queue_attributes(
+ queue_name=resource_id, attribute_names=["ContentBasedDeduplication"]
+ )
+ if queue_attr["ContentBasedDeduplication"] == "false":
+ warnings.warn(
+ "To let EventBridge send messages to your SQS FIFO queue, "
+ "you must enable content-based deduplication."
+ )
+ return
+
+ sqs_backends[self.region_name].send_message(
+ queue_name=resource_id,
+ message_body=json.dumps(event_copy),
+ group_id=group_id,
+ )
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html
+ return "AWS::Events::Rule"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ properties.setdefault("EventBusName", "default")
+
+ if "EventPattern" in properties:
+ properties["EventPattern"] = json.dumps(properties["EventPattern"])
+
+ event_name = resource_name
+
+ event_pattern = properties.get("EventPattern")
+ scheduled_expression = properties.get("ScheduleExpression")
+ state = properties.get("State")
+ desc = properties.get("Description")
+ role_arn = properties.get("RoleArn")
+ event_bus_name = properties.get("EventBusName")
+ tags = properties.get("Tags")
+
+ backend = events_backends[region_name]
+ return backend.put_rule(
+ event_name,
+ scheduled_expression=scheduled_expression,
+ event_pattern=event_pattern,
+ state=state,
+ description=desc,
+ role_arn=role_arn,
+ event_bus_name=event_bus_name,
+ tags=tags,
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ original_resource.delete(region_name)
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ event_backend = events_backends[region_name]
+ event_backend.delete_rule(resource_name)
+
+ def describe(self):
+ attributes = {
+ "Arn": self.arn,
+ "CreatedBy": self.created_by,
+ "Description": self.description,
+ "EventBusName": self.event_bus_name,
+ "EventPattern": self.event_pattern.dump(),
+ "ManagedBy": self.managed_by,
+ "Name": self.name,
+ "RoleArn": self.role_arn,
+ "ScheduleExpression": self.scheduled_expression,
+ "State": self.state,
+ }
+ attributes = {
+ attr: value for attr, value in attributes.items() if value is not None
+ }
+ return attributes
+
+
+class EventBus(CloudFormationModel):
+ def __init__(self, region_name, name, tags=None):
+ self.region = region_name
+ self.name = name
+ self.tags = tags or []
+
+ self._statements = {}
+
+ @property
+ def arn(self):
+ return "arn:aws:events:{region}:{account_id}:event-bus/{name}".format(
+ region=self.region, account_id=get_account_id(), name=self.name
+ )
+
+ @property
+ def policy(self):
+ if self._statements:
+ policy = {
+ "Version": "2012-10-17",
+ "Statement": [stmt.describe() for stmt in self._statements.values()],
+ }
+ return json.dumps(policy)
+ return None
+
+ def has_permissions(self):
+ return len(self._statements) > 0
+
+ def delete(self, region_name):
+ event_backend = events_backends[region_name]
+ event_backend.delete_event_bus(name=self.name)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn", "Name", "Policy"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ elif attribute_name == "Name":
+ return self.name
+ elif attribute_name == "Policy":
+ return self.policy
+
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html
+ return "AWS::Events::EventBus"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ event_backend = events_backends[region_name]
+ event_name = resource_name
+ event_source_name = properties.get("EventSourceName")
+ return event_backend.create_event_bus(
+ name=event_name, event_source_name=event_source_name
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ original_resource.delete(region_name)
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ event_backend = events_backends[region_name]
+ event_bus_name = resource_name
+ event_backend.delete_event_bus(event_bus_name)
+
+ def _remove_principals_statements(self, *principals):
+ statements_to_delete = set()
+
+ for principal in principals:
+ for sid, statement in self._statements.items():
+ if statement.principal == principal:
+ statements_to_delete.add(sid)
+
+ # This is done separately to avoid:
+ # RuntimeError: dictionary changed size during iteration
+ for sid in statements_to_delete:
+ del self._statements[sid]
+
+ def add_permission(self, statement_id, action, principal, condition):
+ self._remove_principals_statements(principal)
+ statement = EventBusPolicyStatement(
+ sid=statement_id,
+ action=action,
+ principal=principal,
+ condition=condition,
+ resource=self.arn,
+ )
+ self._statements[statement_id] = statement
+
+ def add_policy(self, policy):
+ policy_statements = policy["Statement"]
+
+ principals = [stmt["Principal"] for stmt in policy_statements]
+ self._remove_principals_statements(*principals)
+
+ for new_statement in policy_statements:
+ sid = new_statement["Sid"]
+ self._statements[sid] = EventBusPolicyStatement.from_dict(new_statement)
+
+ def remove_statement(self, sid):
+ return self._statements.pop(sid, None)
+
+ def remove_statements(self):
+ self._statements.clear()
+
+
+class EventBusPolicyStatement:
+ def __init__(
+ self, sid, principal, action, resource, effect="Allow", condition=None
+ ):
+ self.sid = sid
+ self.principal = principal
+ self.action = action
+ self.resource = resource
+ self.effect = effect
+ self.condition = condition
+
+ def describe(self):
+ statement = dict(
+ Sid=self.sid,
+ Effect=self.effect,
+ Principal=self.principal,
+ Action=self.action,
+ Resource=self.resource,
+ )
+
+ if self.condition:
+ statement["Condition"] = self.condition
+ return statement
+
+ @classmethod
+ def from_dict(cls, statement_dict):
+ params = dict(
+ sid=statement_dict["Sid"],
+ effect=statement_dict["Effect"],
+ principal=statement_dict["Principal"],
+ action=statement_dict["Action"],
+ resource=statement_dict["Resource"],
+ )
+ condition = statement_dict.get("Condition")
+ if condition:
+ params["condition"] = condition
+
+ return cls(**params)
+
+
+class Archive(CloudFormationModel):
+ # https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_ListArchives.html#API_ListArchives_RequestParameters
+ VALID_STATES = [
+ "ENABLED",
+ "DISABLED",
+ "CREATING",
+ "UPDATING",
+ "CREATE_FAILED",
+ "UPDATE_FAILED",
+ ]
+
+ def __init__(
+ self, region_name, name, source_arn, description, event_pattern, retention
+ ):
+ self.region = region_name
+ self.name = name
+ self.source_arn = source_arn
+ self.description = description
+ self.event_pattern = EventPattern.load(event_pattern)
+ self.retention = retention if retention else 0
+
+ self.creation_time = unix_time(datetime.utcnow())
+ self.state = "ENABLED"
+ self.uuid = str(uuid4())
+
+ self.events = []
+ self.event_bus_name = source_arn.split("/")[-1]
+
+ @property
+ def arn(self):
+ return "arn:aws:events:{region}:{account_id}:archive/{name}".format(
+ region=self.region, account_id=get_account_id(), name=self.name
+ )
+
+ def describe_short(self):
+ return {
+ "ArchiveName": self.name,
+ "EventSourceArn": self.source_arn,
+ "State": self.state,
+ "RetentionDays": self.retention,
+ "SizeBytes": sys.getsizeof(self.events) if len(self.events) > 0 else 0,
+ "EventCount": len(self.events),
+ "CreationTime": self.creation_time,
+ }
+
+ def describe(self):
+ result = {
+ "ArchiveArn": self.arn,
+ "Description": self.description,
+ "EventPattern": self.event_pattern.dump(),
+ }
+ result.update(self.describe_short())
+
+ return result
+
+ def update(self, description, event_pattern, retention):
+ if description:
+ self.description = description
+ if event_pattern:
+ self.event_pattern = EventPattern.load(event_pattern)
+ if retention:
+ self.retention = retention
+
+ def delete(self, region_name):
+ event_backend = events_backends[region_name]
+ event_backend.archives.pop(self.name)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn", "ArchiveName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "ArchiveName":
+ return self.name
+ elif attribute_name == "Arn":
+ return self.arn
+
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "ArchiveName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html
+ return "AWS::Events::Archive"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ event_backend = events_backends[region_name]
+
+ source_arn = properties.get("SourceArn")
+ description = properties.get("Description")
+ event_pattern = properties.get("EventPattern")
+ retention = properties.get("RetentionDays")
+
+ return event_backend.create_archive(
+ resource_name, source_arn, description, event_pattern, retention
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ if new_resource_name == original_resource.name:
+ properties = cloudformation_json["Properties"]
+
+ original_resource.update(
+ properties.get("Description"),
+ properties.get("EventPattern"),
+ properties.get("Retention"),
+ )
+
+ return original_resource
+ else:
+ original_resource.delete(region_name)
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+
+@unique
+class ReplayState(Enum):
+ # https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_ListReplays.html#API_ListReplays_RequestParameters
+ STARTING = "STARTING"
+ RUNNING = "RUNNING"
+ CANCELLING = "CANCELLING"
+ COMPLETED = "COMPLETED"
+ CANCELLED = "CANCELLED"
+ FAILED = "FAILED"
+
+
+class Replay(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ name,
+ description,
+ source_arn,
+ start_time,
+ end_time,
+ destination,
+ ):
+ self.region = region_name
+ self.name = name
+ self.description = description
+ self.source_arn = source_arn
+ self.event_start_time = start_time
+ self.event_end_time = end_time
+ self.destination = destination
+
+ self.state = ReplayState.STARTING
+ self.start_time = unix_time(datetime.utcnow())
+ self.end_time = None
+
+ @property
+ def arn(self):
+ return "arn:aws:events:{region}:{account_id}:replay/{name}".format(
+ region=self.region, account_id=get_account_id(), name=self.name
+ )
+
+ def describe_short(self):
+ return {
+ "ReplayName": self.name,
+ "EventSourceArn": self.source_arn,
+ "State": self.state.value,
+ "EventStartTime": self.event_start_time,
+ "EventEndTime": self.event_end_time,
+ "ReplayStartTime": self.start_time,
+ "ReplayEndTime": self.end_time,
+ }
+
+ def describe(self):
+ result = {
+ "ReplayArn": self.arn,
+ "Description": self.description,
+ "Destination": self.destination,
+ }
+
+ result.update(self.describe_short())
+
+ return result
+
+ def replay_events(self, archive):
+ event_bus_name = self.destination["Arn"].split("/")[-1]
+
+ for event in archive.events:
+ for rule in events_backends[self.region].rules.values():
+ rule.send_to_targets(
+ event_bus_name,
+ dict(event, **{"id": str(uuid4()), "replay-name": self.name}),
+ )
+
+ self.state = ReplayState.COMPLETED
+ self.end_time = unix_time(datetime.utcnow())
+
+
+class Connection(BaseModel):
+ def __init__(
+ self, name, region_name, description, authorization_type, auth_parameters
+ ):
+ self.uuid = uuid4()
+ self.name = name
+ self.region = region_name
+ self.description = description
+ self.authorization_type = authorization_type
+ self.auth_parameters = auth_parameters
+ self.creation_time = unix_time(datetime.utcnow())
+ self.state = "AUTHORIZED"
+
+ @property
+ def arn(self):
+ return "arn:aws:events:{0}:{1}:connection/{2}/{3}".format(
+ self.region, get_account_id(), self.name, self.uuid
+ )
+
+ def describe_short(self):
+ """
+ Create the short description for the Connection object.
+
+ Taken our from the Response Syntax of this API doc:
+ - https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DeleteConnection.html
+
+ Something to consider:
+ - The original response also has
+ - LastAuthorizedTime (number)
+ - LastModifiedTime (number)
+ - At the time of implementing this, there was no place where to set/get
+ those attributes. That is why they are not in the response.
+
+ Returns:
+ dict
+ """
+ return {
+ "ConnectionArn": self.arn,
+ "ConnectionState": self.state,
+ "CreationTime": self.creation_time,
+ }
+
+ def describe(self):
+ """
+ Create a complete description for the Connection object.
+
+ Taken our from the Response Syntax of this API doc:
+ - https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DescribeConnection.html
+
+ Something to consider:
+ - The original response also has:
+ - LastAuthorizedTime (number)
+ - LastModifiedTime (number)
+ - SecretArn (string)
+ - StateReason (string)
+ - At the time of implementing this, there was no place where to set/get
+ those attributes. That is why they are not in the response.
+
+ Returns:
+ dict
+ """
+ return {
+ "AuthorizationType": self.authorization_type,
+ "AuthParameters": self.auth_parameters,
+ "ConnectionArn": self.arn,
+ "ConnectionState": self.state,
+ "CreationTime": self.creation_time,
+ "Description": self.description,
+ "Name": self.name,
+ }
+
+
+class Destination(BaseModel):
+ def __init__(
+ self,
+ name,
+ region_name,
+ description,
+ connection_arn,
+ invocation_endpoint,
+ invocation_rate_limit_per_second,
+ http_method,
+ ):
+ self.uuid = uuid4()
+ self.name = name
+ self.region = region_name
+ self.description = description
+ self.connection_arn = connection_arn
+ self.invocation_endpoint = invocation_endpoint
+ self.invocation_rate_limit_per_second = invocation_rate_limit_per_second
+ self.creation_time = unix_time(datetime.utcnow())
+ self.http_method = http_method
+ self.state = "ACTIVE"
+
+ @property
+ def arn(self):
+ return "arn:aws:events:{0}:{1}:api-destination/{2}/{3}".format(
+ self.region, get_account_id(), self.name, self.uuid
+ )
+
+ def describe(self):
+ """
+ Describes the Destination object as a dict
+
+ Docs:
+ Response Syntax in
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DescribeApiDestination.html
+
+ Something to consider:
+ - The response also has [InvocationRateLimitPerSecond] which was not
+ available when implementing this method
+
+ Returns:
+ dict
+ """
+ return {
+ "ApiDestinationArn": self.arn,
+ "ApiDestinationState": self.state,
+ "ConnectionArn": self.connection_arn,
+ "CreationTime": self.creation_time,
+ "Description": self.description,
+ "HttpMethod": self.http_method,
+ "InvocationEndpoint": self.invocation_endpoint,
+ "InvocationRateLimitPerSecond": self.invocation_rate_limit_per_second,
+ "LastModifiedTime": self.creation_time,
+ "Name": self.name,
+ }
+
+ def describe_short(self):
+ return {
+ "ApiDestinationArn": self.arn,
+ "ApiDestinationState": self.state,
+ "CreationTime": self.creation_time,
+ "LastModifiedTime": self.creation_time,
+ }
+
+
+class EventPattern:
+ def __init__(self, raw_pattern, pattern):
+ self._raw_pattern = raw_pattern
+ self._pattern = pattern
+
+ def get_pattern(self):
+ return self._pattern
+
+ def matches_event(self, event):
+ if not self._pattern:
+ return True
+ event = json.loads(json.dumps(event))
+ return self._does_event_match(event, self._pattern)
+
+ def _does_event_match(self, event, pattern):
+ items_and_filters = [(event.get(k, UNDEFINED), v) for k, v in pattern.items()]
+ nested_filter_matches = [
+ self._does_event_match(item, nested_filter)
+ for item, nested_filter in items_and_filters
+ if isinstance(nested_filter, dict)
+ ]
+ filter_list_matches = [
+ self._does_item_match_filters(item, filter_list)
+ for item, filter_list in items_and_filters
+ if isinstance(filter_list, list)
+ ]
+ return all(nested_filter_matches + filter_list_matches)
+
+ def _does_item_match_filters(self, item, filters):
+ allowed_values = [value for value in filters if isinstance(value, str)]
+ allowed_values_match = item in allowed_values if allowed_values else True
+ full_match = isinstance(item, list) and item == allowed_values
+ named_filter_matches = [
+ self._does_item_match_named_filter(item, pattern)
+ for pattern in filters
+ if isinstance(pattern, dict)
+ ]
+ return (full_match or allowed_values_match) and all(named_filter_matches)
+
+ @staticmethod
+ def _does_item_match_named_filter(item, pattern):
+ filter_name, filter_value = list(pattern.items())[0]
+ if filter_name == "exists":
+ is_leaf_node = not isinstance(item, dict)
+ leaf_exists = is_leaf_node and item is not UNDEFINED
+ should_exist = filter_value
+ return leaf_exists if should_exist else not leaf_exists
+ if filter_name == "prefix":
+ prefix = filter_value
+ return item.startswith(prefix)
+ if filter_name == "numeric":
+ as_function = {"<": lt, "<=": le, "=": eq, ">=": ge, ">": gt}
+ operators_and_values = zip(filter_value[::2], filter_value[1::2])
+ numeric_matches = [
+ as_function[operator](item, value)
+ for operator, value in operators_and_values
+ ]
+ return all(numeric_matches)
+ else:
+ warnings.warn(
+ "'{}' filter logic unimplemented. defaulting to True".format(
+ filter_name
+ )
+ )
+ return True
+
+ @classmethod
+ def load(cls, raw_pattern):
+ parser = EventPatternParser(raw_pattern)
+ pattern = parser.parse()
+ return cls(raw_pattern, pattern)
+
+ def dump(self):
+ return self._raw_pattern
+
+
+class EventPatternParser:
+ def __init__(self, pattern):
+ self.pattern = pattern
+
+ def _validate_event_pattern(self, pattern):
+ # values in the event pattern have to be either a dict or an array
+ for attr, value in pattern.items():
+ if isinstance(value, dict):
+ self._validate_event_pattern(value)
+ elif isinstance(value, list):
+ if len(value) == 0:
+ raise InvalidEventPatternException(
+ reason="Empty arrays are not allowed"
+ )
+ else:
+ raise InvalidEventPatternException(
+ reason=f"'{attr}' must be an object or an array"
+ )
+
+ def parse(self):
+ try:
+ parsed_pattern = json.loads(self.pattern) if self.pattern else dict()
+ self._validate_event_pattern(parsed_pattern)
+ return parsed_pattern
+ except JSONDecodeError:
+ raise InvalidEventPatternException(reason="Invalid JSON")
+
+
+class EventsBackend(BaseBackend):
+ """
+ When a event occurs, the appropriate targets are triggered for a subset of usecases.
+
+ Supported events: S3:CreateBucket
+
+ Supported targets: AWSLambda functions
+ """
+
+ ACCOUNT_ID = re.compile(r"^(\d{1,12}|\*)$")
+ STATEMENT_ID = re.compile(r"^[a-zA-Z0-9-_]{1,64}$")
+ _CRON_REGEX = re.compile(r"^cron\(.*\)")
+ _RATE_REGEX = re.compile(r"^rate\(\d*\s(minute|minutes|hour|hours|day|days)\)")
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.rules = OrderedDict()
+ self.next_tokens = {}
+ self.event_buses = {}
+ self.event_sources = {}
+ self.archives = {}
+ self.replays = {}
+ self.tagger = TaggingService()
+
+ self._add_default_event_bus()
+ self.connections = {}
+ self.destinations = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "events"
+ )
+
+ def _add_default_event_bus(self):
+ self.event_buses["default"] = EventBus(self.region_name, "default")
+
+ def _gen_next_token(self, index):
+ token = os.urandom(128).encode("base64")
+ self.next_tokens[token] = index
+ return token
+
+ def _process_token_and_limits(self, array_len, next_token=None, limit=None):
+ start_index = 0
+ end_index = array_len
+ new_next_token = None
+
+ if next_token:
+ start_index = self.next_tokens.pop(next_token, 0)
+
+ if limit is not None:
+ new_end_index = start_index + int(limit)
+ if new_end_index < end_index:
+ end_index = new_end_index
+ new_next_token = self._gen_next_token(end_index)
+
+ return start_index, end_index, new_next_token
+
+ def _get_event_bus(self, name):
+ event_bus_name = name.split("/")[-1]
+
+ event_bus = self.event_buses.get(event_bus_name)
+ if not event_bus:
+ raise ResourceNotFoundException(
+ "Event bus {} does not exist.".format(event_bus_name)
+ )
+
+ return event_bus
+
+ def _get_replay(self, name):
+ replay = self.replays.get(name)
+ if not replay:
+ raise ResourceNotFoundException("Replay {} does not exist.".format(name))
+
+ return replay
+
+ def put_rule(
+ self,
+ name,
+ *,
+ description=None,
+ event_bus_name=None,
+ event_pattern=None,
+ role_arn=None,
+ scheduled_expression=None,
+ state=None,
+ managed_by=None,
+ tags=None,
+ ):
+ event_bus_name = event_bus_name or "default"
+
+ if not event_pattern and not scheduled_expression:
+ raise JsonRESTError(
+ "ValidationException",
+ "Parameter(s) EventPattern or ScheduleExpression must be specified.",
+ )
+
+ if scheduled_expression:
+ if event_bus_name != "default":
+ raise ValidationException(
+ "ScheduleExpression is supported only on the default event bus."
+ )
+
+ if not (
+ self._CRON_REGEX.match(scheduled_expression)
+ or self._RATE_REGEX.match(scheduled_expression)
+ ):
+ raise ValidationException("Parameter ScheduleExpression is not valid.")
+
+ existing_rule = self.rules.get(name)
+ targets = existing_rule.targets if existing_rule else list()
+ rule = Rule(
+ name,
+ self.region_name,
+ description,
+ event_pattern,
+ scheduled_expression,
+ role_arn,
+ event_bus_name,
+ state,
+ managed_by,
+ targets=targets,
+ )
+ self.rules[name] = rule
+
+ if tags:
+ self.tagger.tag_resource(rule.arn, tags)
+
+ return rule
+
+ def delete_rule(self, name):
+ rule = self.rules.get(name)
+ if len(rule.targets) > 0:
+ raise ValidationException("Rule can't be deleted since it has targets.")
+
+ arn = rule.arn
+ if self.tagger.has_tags(arn):
+ self.tagger.delete_all_tags_for_resource(arn)
+ return self.rules.pop(name) is not None
+
+ def describe_rule(self, name):
+ rule = self.rules.get(name)
+ if not rule:
+ raise ResourceNotFoundException("Rule {} does not exist.".format(name))
+ return rule
+
+ def disable_rule(self, name):
+ if name in self.rules:
+ self.rules[name].disable()
+ return True
+
+ return False
+
+ def enable_rule(self, name):
+ if name in self.rules:
+ self.rules[name].enable()
+ return True
+
+ return False
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_rule_names_by_target(self, target_arn):
+ matching_rules = []
+
+ for _, rule in self.rules.items():
+ for target in rule.targets:
+ if target["Arn"] == target_arn:
+ matching_rules.append(rule)
+
+ return matching_rules
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_rules(self, prefix=None):
+ match_string = ".*"
+ if prefix is not None:
+ match_string = "^" + prefix + match_string
+
+ match_regex = re.compile(match_string)
+
+ matching_rules = []
+
+ for name, rule in self.rules.items():
+ if match_regex.match(name):
+ matching_rules.append(rule)
+
+ return matching_rules
+
+ def list_targets_by_rule(self, rule, next_token=None, limit=None):
+ # We'll let a KeyError exception be thrown for response to handle if
+ # rule doesn't exist.
+ rule = self.rules[rule]
+
+ start_index, end_index, new_next_token = self._process_token_and_limits(
+ len(rule.targets), next_token, limit
+ )
+
+ returned_targets = []
+ return_obj = {}
+
+ for i in range(start_index, end_index):
+ returned_targets.append(rule.targets[i])
+
+ return_obj["Targets"] = returned_targets
+ if new_next_token is not None:
+ return_obj["NextToken"] = new_next_token
+
+ return return_obj
+
+ def put_targets(self, name, event_bus_name, targets):
+ # super simple ARN check
+ invalid_arn = next(
+ (
+ target["Arn"]
+ for target in targets
+ if not re.match(r"arn:[\d\w:\-/]*", target["Arn"])
+ ),
+ None,
+ )
+ if invalid_arn:
+ raise ValidationException(
+ "Parameter {} is not valid. "
+ "Reason: Provided Arn is not in correct format.".format(invalid_arn)
+ )
+
+ for target in targets:
+ arn = target["Arn"]
+
+ if (
+ ":sqs:" in arn
+ and arn.endswith(".fifo")
+ and not target.get("SqsParameters")
+ ):
+ raise ValidationException(
+ "Parameter(s) SqsParameters must be specified for target: {}.".format(
+ target["Id"]
+ )
+ )
+
+ rule = self.rules.get(name)
+
+ if not rule:
+ raise ResourceNotFoundException(
+ "Rule {0} does not exist on EventBus {1}.".format(name, event_bus_name)
+ )
+
+ rule.put_targets(targets)
+
+ def put_events(self, events):
+ num_events = len(events)
+
+ if num_events > 10:
+ # the exact error text is longer, the Value list consists of all the put events
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '[PutEventsRequestEntry]' at 'entries' failed to satisfy constraint: "
+ "Member must have length less than or equal to 10"
+ )
+
+ entries = []
+ for event in events:
+ if "Source" not in event:
+ entries.append(
+ {
+ "ErrorCode": "InvalidArgument",
+ "ErrorMessage": "Parameter Source is not valid. Reason: Source is a required argument.",
+ }
+ )
+ elif "DetailType" not in event:
+ entries.append(
+ {
+ "ErrorCode": "InvalidArgument",
+ "ErrorMessage": "Parameter DetailType is not valid. Reason: DetailType is a required argument.",
+ }
+ )
+ elif "Detail" not in event:
+ entries.append(
+ {
+ "ErrorCode": "InvalidArgument",
+ "ErrorMessage": "Parameter Detail is not valid. Reason: Detail is a required argument.",
+ }
+ )
+ else:
+ try:
+ json.loads(event["Detail"])
+ except ValueError: # json.JSONDecodeError exists since Python 3.5
+ entries.append(
+ {
+ "ErrorCode": "MalformedDetail",
+ "ErrorMessage": "Detail is malformed.",
+ }
+ )
+ continue
+
+ event_id = str(uuid4())
+ entries.append({"EventId": event_id})
+
+ # if 'EventBusName' is not especially set, it will be sent to the default one
+ event_bus_name = event.get("EventBusName", "default")
+
+ for rule in self.rules.values():
+ rule.send_to_targets(
+ event_bus_name,
+ {
+ "version": "0",
+ "id": event_id,
+ "detail-type": event["DetailType"],
+ "source": event["Source"],
+ "account": get_account_id(),
+ "time": event.get("Time", unix_time(datetime.utcnow())),
+ "region": self.region_name,
+ "resources": event.get("Resources", []),
+ "detail": json.loads(event["Detail"]),
+ },
+ )
+
+ return entries
+
+ def remove_targets(self, name, event_bus_name, ids):
+ rule = self.rules.get(name)
+
+ if not rule:
+ raise ResourceNotFoundException(
+ "Rule {0} does not exist on EventBus {1}.".format(name, event_bus_name)
+ )
+
+ rule.remove_targets(ids)
+
+ def test_event_pattern(self):
+ raise NotImplementedError()
+
+ @staticmethod
+ def _put_permission_from_policy(event_bus, policy):
+ try:
+ policy_doc = json.loads(policy)
+ event_bus.add_policy(policy_doc)
+ except JSONDecodeError:
+ raise JsonRESTError(
+ "ValidationException", "This policy contains invalid Json"
+ )
+
+ @staticmethod
+ def _condition_param_to_stmt_condition(condition):
+ if condition:
+ key = condition["Key"]
+ value = condition["Value"]
+ condition_type = condition["Type"]
+ return {condition_type: {key: value}}
+ return None
+
+ def _put_permission_from_params(
+ self, event_bus, action, principal, statement_id, condition
+ ):
+ if principal is None:
+ raise JsonRESTError(
+ "ValidationException", "Parameter Principal must be specified."
+ )
+
+ if condition and principal != "*":
+ raise JsonRESTError(
+ "InvalidParameterValue",
+ "Value of the parameter 'principal' must be '*' when the parameter 'condition' is set.",
+ )
+
+ if not condition and self.ACCOUNT_ID.match(principal) is None:
+ raise JsonRESTError(
+ "InvalidParameterValue",
+ f"Value {principal} at 'principal' failed to satisfy constraint: "
+ r"Member must satisfy regular expression pattern: (\d{12}|\*)",
+ )
+
+ if action is None or action != "events:PutEvents":
+ raise JsonRESTError(
+ "ValidationException",
+ "Provided value in parameter 'action' is not supported.",
+ )
+
+ if statement_id is None or self.STATEMENT_ID.match(statement_id) is None:
+ raise JsonRESTError(
+ "InvalidParameterValue", r"StatementId must match ^[a-zA-Z0-9-_]{1,64}$"
+ )
+
+ principal = {"AWS": f"arn:aws:iam::{principal}:root"}
+ stmt_condition = self._condition_param_to_stmt_condition(condition)
+ event_bus.add_permission(statement_id, action, principal, stmt_condition)
+
+ def put_permission(
+ self, event_bus_name, action, principal, statement_id, condition, policy
+ ):
+ if not event_bus_name:
+ event_bus_name = "default"
+
+ event_bus = self.describe_event_bus(event_bus_name)
+
+ if policy:
+ self._put_permission_from_policy(event_bus, policy)
+ else:
+ self._put_permission_from_params(
+ event_bus, action, principal, statement_id, condition
+ )
+
+ def remove_permission(self, event_bus_name, statement_id, remove_all_permissions):
+ if not event_bus_name:
+ event_bus_name = "default"
+
+ event_bus = self.describe_event_bus(event_bus_name)
+
+ if remove_all_permissions:
+ event_bus.remove_statements()
+ else:
+ if not event_bus.has_permissions():
+ raise JsonRESTError(
+ "ResourceNotFoundException", "EventBus does not have a policy."
+ )
+
+ statement = event_bus.remove_statement(statement_id)
+ if not statement:
+ raise JsonRESTError(
+ "ResourceNotFoundException",
+ "Statement with the provided id does not exist.",
+ )
+
+ def describe_event_bus(self, name):
+ if not name:
+ name = "default"
+
+ event_bus = self._get_event_bus(name)
+
+ return event_bus
+
+ def create_event_bus(self, name, event_source_name=None, tags=None):
+ if name in self.event_buses:
+ raise JsonRESTError(
+ "ResourceAlreadyExistsException",
+ "Event bus {} already exists.".format(name),
+ )
+
+ if not event_source_name and "/" in name:
+ raise JsonRESTError(
+ "ValidationException", "Event bus name must not contain '/'."
+ )
+
+ if event_source_name and event_source_name not in self.event_sources:
+ raise JsonRESTError(
+ "ResourceNotFoundException",
+ "Event source {} does not exist.".format(event_source_name),
+ )
+
+ event_bus = EventBus(self.region_name, name, tags=tags)
+ self.event_buses[name] = event_bus
+ if tags:
+ self.tagger.tag_resource(event_bus.arn, tags)
+
+ return self.event_buses[name]
+
+ def list_event_buses(self, name_prefix):
+ if name_prefix:
+ return [
+ event_bus
+ for event_bus in self.event_buses.values()
+ if event_bus.name.startswith(name_prefix)
+ ]
+
+ return list(self.event_buses.values())
+
+ def delete_event_bus(self, name):
+ if name == "default":
+ raise JsonRESTError(
+ "ValidationException", "Cannot delete event bus default."
+ )
+ event_bus = self.event_buses.pop(name, None)
+ if event_bus:
+ self.tagger.delete_all_tags_for_resource(event_bus.arn)
+
+ def list_tags_for_resource(self, arn):
+ name = arn.split("/")[-1]
+ registries = [self.rules, self.event_buses]
+ for registry in registries:
+ if name in registry:
+ return self.tagger.list_tags_for_resource(registry[name].arn)
+ raise ResourceNotFoundException(
+ "Rule {0} does not exist on EventBus default.".format(name)
+ )
+
+ def tag_resource(self, arn, tags):
+ name = arn.split("/")[-1]
+ registries = [self.rules, self.event_buses]
+ for registry in registries:
+ if name in registry:
+ self.tagger.tag_resource(registry[name].arn, tags)
+ return {}
+ raise ResourceNotFoundException(
+ "Rule {0} does not exist on EventBus default.".format(name)
+ )
+
+ def untag_resource(self, arn, tag_names):
+ name = arn.split("/")[-1]
+ registries = [self.rules, self.event_buses]
+ for registry in registries:
+ if name in registry:
+ self.tagger.untag_resource_using_names(registry[name].arn, tag_names)
+ return {}
+ raise ResourceNotFoundException(
+ "Rule {0} does not exist on EventBus default.".format(name)
+ )
+
+ def create_archive(self, name, source_arn, description, event_pattern, retention):
+ if len(name) > 48:
+ raise ValidationException(
+ " 1 validation error detected: "
+ "Value '{}' at 'archiveName' failed to satisfy constraint: "
+ "Member must have length less than or equal to 48".format(name)
+ )
+
+ event_bus = self._get_event_bus(source_arn)
+
+ if name in self.archives:
+ raise ResourceAlreadyExistsException(
+ "Archive {} already exists.".format(name)
+ )
+
+ archive = Archive(
+ self.region_name, name, source_arn, description, event_pattern, retention
+ )
+
+ rule_event_pattern = json.loads(event_pattern or "{}")
+ rule_event_pattern["replay-name"] = [{"exists": False}]
+
+ rule_name = "Events-Archive-{}".format(name)
+ rule = self.put_rule(
+ rule_name,
+ event_pattern=json.dumps(rule_event_pattern),
+ event_bus_name=event_bus.name,
+ managed_by="prod.vhs.events.aws.internal",
+ )
+ self.put_targets(
+ rule.name,
+ rule.event_bus_name,
+ [
+ {
+ "Id": rule.name,
+ "Arn": "arn:aws:events:{}:::".format(self.region_name),
+ "InputTransformer": {
+ "InputPathsMap": {},
+ "InputTemplate": json.dumps(
+ {
+ "archive-arn": "{0}:{1}".format(
+ archive.arn, archive.uuid
+ ),
+ "event": "<aws.events.event.json>",
+ "ingestion-time": "<aws.events.event.ingestion-time>",
+ }
+ ),
+ },
+ }
+ ],
+ )
+
+ self.archives[name] = archive
+
+ return archive
+
+ def describe_archive(self, name):
+ archive = self.archives.get(name)
+
+ if not archive:
+ raise ResourceNotFoundException("Archive {} does not exist.".format(name))
+
+ return archive.describe()
+
+ def list_archives(self, name_prefix, source_arn, state):
+ if [name_prefix, source_arn, state].count(None) < 2:
+ raise ValidationException(
+ "At most one filter is allowed for ListArchives. "
+ "Use either : State, EventSourceArn, or NamePrefix."
+ )
+
+ if state and state not in Archive.VALID_STATES:
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '{0}' at 'state' failed to satisfy constraint: "
+ "Member must satisfy enum value set: "
+ "[{1}]".format(state, ", ".join(Archive.VALID_STATES))
+ )
+
+ if [name_prefix, source_arn, state].count(None) == 3:
+ return [archive.describe_short() for archive in self.archives.values()]
+
+ result = []
+
+ for archive in self.archives.values():
+ if name_prefix and archive.name.startswith(name_prefix):
+ result.append(archive.describe_short())
+ elif source_arn and archive.source_arn == source_arn:
+ result.append(archive.describe_short())
+ elif state and archive.state == state:
+ result.append(archive.describe_short())
+
+ return result
+
+ def update_archive(self, name, description, event_pattern, retention):
+ archive = self.archives.get(name)
+
+ if not archive:
+ raise ResourceNotFoundException("Archive {} does not exist.".format(name))
+
+ archive.update(description, event_pattern, retention)
+
+ return {
+ "ArchiveArn": archive.arn,
+ "CreationTime": archive.creation_time,
+ "State": archive.state,
+ }
+
+ def delete_archive(self, name):
+ archive = self.archives.get(name)
+
+ if not archive:
+ raise ResourceNotFoundException("Archive {} does not exist.".format(name))
+
+ archive.delete(self.region_name)
+
+ def start_replay(
+ self, name, description, source_arn, start_time, end_time, destination
+ ):
+ event_bus_arn = destination["Arn"]
+ event_bus_arn_pattern = r"^arn:aws:events:[a-zA-Z0-9-]+:\d{12}:event-bus/"
+ if not re.match(event_bus_arn_pattern, event_bus_arn):
+ raise ValidationException(
+ "Parameter Destination.Arn is not valid. "
+ "Reason: Must contain an event bus ARN."
+ )
+
+ self._get_event_bus(event_bus_arn)
+
+ archive_name = source_arn.split("/")[-1]
+ archive = self.archives.get(archive_name)
+ if not archive:
+ raise ValidationException(
+ "Parameter EventSourceArn is not valid. "
+ "Reason: Archive {} does not exist.".format(archive_name)
+ )
+
+ if event_bus_arn != archive.source_arn:
+ raise ValidationException(
+ "Parameter Destination.Arn is not valid. "
+ "Reason: Cross event bus replay is not permitted."
+ )
+
+ if start_time > end_time:
+ raise ValidationException(
+ "Parameter EventEndTime is not valid. "
+ "Reason: EventStartTime must be before EventEndTime."
+ )
+
+ if name in self.replays:
+ raise ResourceAlreadyExistsException(
+ "Replay {} already exists.".format(name)
+ )
+
+ replay = Replay(
+ self.region_name,
+ name,
+ description,
+ source_arn,
+ start_time,
+ end_time,
+ destination,
+ )
+
+ self.replays[name] = replay
+
+ replay.replay_events(archive)
+
+ return {
+ "ReplayArn": replay.arn,
+ "ReplayStartTime": replay.start_time,
+ "State": ReplayState.STARTING.value, # the replay will be done before returning the response
+ }
+
+ def describe_replay(self, name):
+ replay = self._get_replay(name)
+
+ return replay.describe()
+
+ def list_replays(self, name_prefix, source_arn, state):
+ if [name_prefix, source_arn, state].count(None) < 2:
+ raise ValidationException(
+ "At most one filter is allowed for ListReplays. "
+ "Use either : State, EventSourceArn, or NamePrefix."
+ )
+
+ valid_states = sorted([item.value for item in ReplayState])
+ if state and state not in valid_states:
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '{0}' at 'state' failed to satisfy constraint: "
+ "Member must satisfy enum value set: "
+ "[{1}]".format(state, ", ".join(valid_states))
+ )
+
+ if [name_prefix, source_arn, state].count(None) == 3:
+ return [replay.describe_short() for replay in self.replays.values()]
+
+ result = []
+
+ for replay in self.replays.values():
+ if name_prefix and replay.name.startswith(name_prefix):
+ result.append(replay.describe_short())
+ elif source_arn and replay.source_arn == source_arn:
+ result.append(replay.describe_short())
+ elif state and replay.state == state:
+ result.append(replay.describe_short())
+
+ return result
+
+ def cancel_replay(self, name):
+ replay = self._get_replay(name)
+
+ # replays in the state 'COMPLETED' can't be canceled,
+ # but the implementation is done synchronously,
+ # so they are done right after the start
+ if replay.state not in [
+ ReplayState.STARTING,
+ ReplayState.RUNNING,
+ ReplayState.COMPLETED,
+ ]:
+ raise IllegalStatusException(
+ "Replay {} is not in a valid state for this operation.".format(name)
+ )
+
+ replay.state = ReplayState.CANCELLED
+
+ return {"ReplayArn": replay.arn, "State": ReplayState.CANCELLING.value}
+
+ def create_connection(self, name, description, authorization_type, auth_parameters):
+ connection = Connection(
+ name, self.region_name, description, authorization_type, auth_parameters
+ )
+ self.connections[name] = connection
+ return connection
+
+ def update_connection(self, *, name, **kwargs):
+ connection = self.connections.get(name)
+ if not connection:
+ raise ResourceNotFoundException(
+ "Connection '{}' does not exist.".format(name)
+ )
+
+ for attr, value in kwargs.items():
+ if value is not None and hasattr(connection, attr):
+ setattr(connection, attr, value)
+ return connection.describe_short()
+
+ def list_connections(self):
+ return self.connections.values()
+
+ def describe_connection(self, name):
+ """
+ Retrieves details about a connection.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DescribeConnection.html
+
+ Args:
+ name: The name of the connection to retrieve.
+
+ Raises:
+ ResourceNotFoundException: When the connection is not present.
+
+ Returns:
+ dict
+ """
+ connection = self.connections.get(name)
+ if not connection:
+ raise ResourceNotFoundException(
+ "Connection '{}' does not exist.".format(name)
+ )
+
+ return connection.describe()
+
+ def delete_connection(self, name):
+ """
+ Deletes a connection.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DeleteConnection.html
+
+ Args:
+ name: The name of the connection to delete.
+
+ Raises:
+ ResourceNotFoundException: When the connection is not present.
+
+ Returns:
+ dict
+ """
+ connection = self.connections.pop(name, None)
+ if not connection:
+ raise ResourceNotFoundException(
+ "Connection '{}' does not exist.".format(name)
+ )
+
+ return connection.describe_short()
+
+ def create_api_destination(
+ self,
+ name,
+ description,
+ connection_arn,
+ invocation_endpoint,
+ invocation_rate_limit_per_second,
+ http_method,
+ ):
+ """
+ Creates an API destination, which is an HTTP invocation endpoint configured as a target for events.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_CreateApiDestination.html
+
+ Returns:
+ dict
+ """
+ destination = Destination(
+ name=name,
+ region_name=self.region_name,
+ description=description,
+ connection_arn=connection_arn,
+ invocation_endpoint=invocation_endpoint,
+ invocation_rate_limit_per_second=invocation_rate_limit_per_second,
+ http_method=http_method,
+ )
+
+ self.destinations[name] = destination
+ return destination.describe_short()
+
+ def list_api_destinations(self):
+ return self.destinations.values()
+
+ def describe_api_destination(self, name):
+ """
+ Retrieves details about an API destination.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DescribeApiDestination.html
+ Args:
+ name: The name of the API destination to retrieve.
+
+ Returns:
+ dict
+ """
+ destination = self.destinations.get(name)
+ if not destination:
+ raise ResourceNotFoundException(
+ "An api-destination '{}' does not exist.".format(name)
+ )
+ return destination.describe()
+
+ def update_api_destination(self, *, name, **kwargs):
+ """
+ Creates an API destination, which is an HTTP invocation endpoint configured as a target for events.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_UpdateApiDestination.html
+
+ Returns:
+ dict
+ """
+ destination = self.destinations.get(name)
+ if not destination:
+ raise ResourceNotFoundException(
+ "An api-destination '{}' does not exist.".format(name)
+ )
+
+ for attr, value in kwargs.items():
+ if value is not None and hasattr(destination, attr):
+ setattr(destination, attr, value)
+ return destination.describe_short()
+
+ def delete_api_destination(self, name):
+ """
+ Deletes the specified API destination.
+
+ Docs:
+ https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DeleteApiDestination.html
+
+ Args:
+ name: The name of the destination to delete.
+
+ Raises:
+ ResourceNotFoundException: When the destination is not present.
+
+ Returns:
+ dict
+
+ """
+ destination = self.destinations.pop(name, None)
+ if not destination:
+ raise ResourceNotFoundException(
+ "An api-destination '{}' does not exist.".format(name)
+ )
+ return {}
+
+
+events_backends = BackendDict(EventsBackend, "events")
diff --git a/contrib/python/moto/py3/moto/events/notifications.py b/contrib/python/moto/py3/moto/events/notifications.py
new file mode 100644
index 0000000000..b8a05e236f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/notifications.py
@@ -0,0 +1,67 @@
+import json
+from moto.core import get_account_id
+
+
+_EVENT_S3_OBJECT_CREATED = {
+ "version": "0",
+ "id": "17793124-05d4-b198-2fde-7ededc63b103",
+ "detail-type": "Object Created",
+ "source": "aws.s3",
+ "account": "123456789012",
+ "time": "2021-11-12T00:00:00Z",
+ "region": None,
+ "resources": [],
+ "detail": None,
+}
+
+
+def send_notification(source, event_name, region, resources, detail):
+ try:
+ _send_safe_notification(source, event_name, region, resources, detail)
+ except: # noqa
+ # If anything goes wrong, we should never fail
+ pass
+
+
+def _send_safe_notification(source, event_name, region, resources, detail):
+ from .models import events_backends
+
+ event = None
+ if source == "aws.s3" and event_name == "CreateBucket":
+ event = _EVENT_S3_OBJECT_CREATED.copy()
+ event["region"] = region
+ event["resources"] = resources
+ event["detail"] = detail
+
+ if event is None:
+ return
+
+ account = events_backends[get_account_id()]
+ for backend in account.values():
+ applicable_targets = []
+ for rule in backend.rules.values():
+ if rule.state != "ENABLED":
+ continue
+ pattern = rule.event_pattern.get_pattern()
+ if source in pattern.get("source", []):
+ if event_name in pattern.get("detail", {}).get("eventName", []):
+ applicable_targets.extend(rule.targets)
+
+ for target in applicable_targets:
+ if target.get("Arn", "").startswith("arn:aws:lambda"):
+ _invoke_lambda(target.get("Arn"), event=event)
+
+
+def _invoke_lambda(fn_arn, event):
+ from moto.awslambda import lambda_backends
+
+ lmbda_region = fn_arn.split(":")[3]
+
+ body = json.dumps(event)
+ lambda_backends[lmbda_region].invoke(
+ function_name=fn_arn,
+ qualifier=None,
+ body=body,
+ headers=dict(),
+ response_headers=dict(),
+ )
diff --git a/contrib/python/moto/py3/moto/events/responses.py b/contrib/python/moto/py3/moto/events/responses.py
new file mode 100644
index 0000000000..f79fbe8dab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/responses.py
@@ -0,0 +1,514 @@
+import json
+
+from moto.core.responses import BaseResponse
+from moto.events import events_backends
+
+
+class EventsHandler(BaseResponse):
+ @property
+ def events_backend(self):
+ """
+ Events Backend
+
+ :return: Events Backend object
+ :rtype: moto.events.models.EventsBackend
+ """
+ return events_backends[self.region]
+
+ @property
+ def request_params(self):
+ if not hasattr(self, "_json_body"):
+ try:
+ self._json_body = json.loads(self.body)
+ except ValueError:
+ self._json_body = {}
+ return self._json_body
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def _create_response(self, result):
+ """
+ Creates a proper response for the API.
+
+ It basically transforms a dict-like result from the backend
+ into a tuple (str, dict) properly formatted.
+ Args:
+ result (dict): result from backend
+
+ Returns:
+ (str, dict): dumped result and headers
+ """
+ return json.dumps(result), self.response_headers
+
+ def error(self, type_, message="", status=400):
+ headers = self.response_headers
+ headers["status"] = status
+ return json.dumps({"__type": type_, "message": message}), headers
+
+ def put_rule(self):
+ name = self._get_param("Name")
+ event_pattern = self._get_param("EventPattern")
+ scheduled_expression = self._get_param("ScheduleExpression")
+ state = self._get_param("State")
+ desc = self._get_param("Description")
+ role_arn = self._get_param("RoleArn")
+ event_bus_name = self._get_param("EventBusName")
+ tags = self._get_param("Tags")
+
+ rule = self.events_backend.put_rule(
+ name,
+ scheduled_expression=scheduled_expression,
+ event_pattern=event_pattern,
+ state=state,
+ description=desc,
+ role_arn=role_arn,
+ event_bus_name=event_bus_name,
+ tags=tags,
+ )
+ result = {"RuleArn": rule.arn}
+ return self._create_response(result)
+
+ def delete_rule(self):
+ name = self._get_param("Name")
+
+ if not name:
+ return self.error("ValidationException", "Parameter Name is required.")
+ self.events_backend.delete_rule(name)
+
+ return "", self.response_headers
+
+ def describe_rule(self):
+ name = self._get_param("Name")
+
+ if not name:
+ return self.error("ValidationException", "Parameter Name is required.")
+
+ rule = self.events_backend.describe_rule(name)
+
+ result = rule.describe()
+ return self._create_response(result)
+
+ def disable_rule(self):
+ name = self._get_param("Name")
+
+ if not name:
+ return self.error("ValidationException", "Parameter Name is required.")
+
+ if not self.events_backend.disable_rule(name):
+ return self.error(
+ "ResourceNotFoundException", "Rule " + name + " does not exist."
+ )
+
+ return "", self.response_headers
+
+ def enable_rule(self):
+ name = self._get_param("Name")
+
+ if not name:
+ return self.error("ValidationException", "Parameter Name is required.")
+
+ if not self.events_backend.enable_rule(name):
+ return self.error(
+ "ResourceNotFoundException", "Rule " + name + " does not exist."
+ )
+
+ return "", self.response_headers
+
+ def generate_presigned_url(self):
+ pass
+
+ def list_rule_names_by_target(self):
+ target_arn = self._get_param("TargetArn")
+ next_token = self._get_param("NextToken")
+ limit = self._get_param("Limit")
+
+ if not target_arn:
+ return self.error("ValidationException", "Parameter TargetArn is required.")
+
+ rules, token = self.events_backend.list_rule_names_by_target(
+ target_arn=target_arn, next_token=next_token, limit=limit
+ )
+
+ res = {"RuleNames": [rule.name for rule in rules], "NextToken": token}
+
+ return json.dumps(res), self.response_headers
+
+ def list_rules(self):
+ prefix = self._get_param("NamePrefix")
+ next_token = self._get_param("NextToken")
+ limit = self._get_param("Limit")
+
+ rules, token = self.events_backend.list_rules(
+ prefix=prefix, next_token=next_token, limit=limit
+ )
+ rules_obj = {
+ "Rules": [rule.describe() for rule in rules],
+ "NextToken": token,
+ }
+
+ return json.dumps(rules_obj), self.response_headers
+
+ def list_targets_by_rule(self):
+ rule_name = self._get_param("Rule")
+ next_token = self._get_param("NextToken")
+ limit = self._get_param("Limit")
+
+ if not rule_name:
+ return self.error("ValidationException", "Parameter Rule is required.")
+
+ try:
+ targets = self.events_backend.list_targets_by_rule(
+ rule_name, next_token, limit
+ )
+ except KeyError:
+ return self.error(
+ "ResourceNotFoundException", "Rule " + rule_name + " does not exist."
+ )
+
+ return json.dumps(targets), self.response_headers
+
+ def put_events(self):
+ events = self._get_param("Entries")
+
+ entries = self.events_backend.put_events(events)
+
+ failed_count = len([e for e in entries if "ErrorCode" in e])
+ response = {
+ "FailedEntryCount": failed_count,
+ "Entries": entries,
+ }
+
+ return json.dumps(response)
+
+ def put_targets(self):
+ rule_name = self._get_param("Rule")
+ event_bus_name = self._get_param("EventBusName", "default")
+ targets = self._get_param("Targets")
+
+ self.events_backend.put_targets(rule_name, event_bus_name, targets)
+
+ return (
+ json.dumps({"FailedEntryCount": 0, "FailedEntries": []}),
+ self.response_headers,
+ )
+
+ def remove_targets(self):
+ rule_name = self._get_param("Rule")
+ event_bus_name = self._get_param("EventBusName", "default")
+ ids = self._get_param("Ids")
+
+ self.events_backend.remove_targets(rule_name, event_bus_name, ids)
+
+ return (
+ json.dumps({"FailedEntryCount": 0, "FailedEntries": []}),
+ self.response_headers,
+ )
+
+ def test_event_pattern(self):
+ pass
+
+ def put_permission(self):
+ event_bus_name = self._get_param("EventBusName")
+ action = self._get_param("Action")
+ principal = self._get_param("Principal")
+ statement_id = self._get_param("StatementId")
+ policy = self._get_param("Policy")
+ condition = self._get_param("Condition")
+
+ self.events_backend.put_permission(
+ event_bus_name, action, principal, statement_id, condition, policy
+ )
+
+ return ""
+
+ def remove_permission(self):
+ event_bus_name = self._get_param("EventBusName")
+ statement_id = self._get_param("StatementId")
+ remove_all_permissions = self._get_param("RemoveAllPermissions")
+
+ self.events_backend.remove_permission(
+ event_bus_name, statement_id, remove_all_permissions
+ )
+
+ return ""
+
+ def describe_event_bus(self):
+ name = self._get_param("Name")
+
+ event_bus = self.events_backend.describe_event_bus(name)
+ response = {"Name": event_bus.name, "Arn": event_bus.arn}
+
+ if event_bus.policy:
+ response["Policy"] = event_bus.policy
+
+ return json.dumps(response), self.response_headers
+
+ def create_event_bus(self):
+ name = self._get_param("Name")
+ event_source_name = self._get_param("EventSourceName")
+ tags = self._get_param("Tags")
+
+ event_bus = self.events_backend.create_event_bus(name, event_source_name, tags)
+ return json.dumps({"EventBusArn": event_bus.arn}), self.response_headers
+
+ def list_event_buses(self):
+ name_prefix = self._get_param("NamePrefix")
+ # ToDo: add 'NextToken' & 'Limit' parameters
+
+ response = []
+ for event_bus in self.events_backend.list_event_buses(name_prefix):
+ event_bus_response = {"Name": event_bus.name, "Arn": event_bus.arn}
+
+ if event_bus.policy:
+ event_bus_response["Policy"] = event_bus.policy
+
+ response.append(event_bus_response)
+
+ return json.dumps({"EventBuses": response}), self.response_headers
+
+ def delete_event_bus(self):
+ name = self._get_param("Name")
+
+ self.events_backend.delete_event_bus(name)
+
+ return "", self.response_headers
+
+ def list_tags_for_resource(self):
+ arn = self._get_param("ResourceARN")
+
+ result = self.events_backend.list_tags_for_resource(arn)
+
+ return json.dumps(result), self.response_headers
+
+ def tag_resource(self):
+ arn = self._get_param("ResourceARN")
+ tags = self._get_param("Tags")
+
+ result = self.events_backend.tag_resource(arn, tags)
+
+ return json.dumps(result), self.response_headers
+
+ def untag_resource(self):
+ arn = self._get_param("ResourceARN")
+ tags = self._get_param("TagKeys")
+
+ result = self.events_backend.untag_resource(arn, tags)
+
+ return json.dumps(result), self.response_headers
+
+ def create_archive(self):
+ name = self._get_param("ArchiveName")
+ source_arn = self._get_param("EventSourceArn")
+ description = self._get_param("Description")
+ event_pattern = self._get_param("EventPattern")
+ retention = self._get_param("RetentionDays")
+
+ archive = self.events_backend.create_archive(
+ name, source_arn, description, event_pattern, retention
+ )
+
+ return (
+ json.dumps(
+ {
+ "ArchiveArn": archive.arn,
+ "CreationTime": archive.creation_time,
+ "State": archive.state,
+ }
+ ),
+ self.response_headers,
+ )
+
+ def describe_archive(self):
+ name = self._get_param("ArchiveName")
+
+ result = self.events_backend.describe_archive(name)
+
+ return json.dumps(result), self.response_headers
+
+ def list_archives(self):
+ name_prefix = self._get_param("NamePrefix")
+ source_arn = self._get_param("EventSourceArn")
+ state = self._get_param("State")
+
+ result = self.events_backend.list_archives(name_prefix, source_arn, state)
+
+ return json.dumps({"Archives": result}), self.response_headers
+
+ def update_archive(self):
+ name = self._get_param("ArchiveName")
+ description = self._get_param("Description")
+ event_pattern = self._get_param("EventPattern")
+ retention = self._get_param("RetentionDays")
+
+ result = self.events_backend.update_archive(
+ name, description, event_pattern, retention
+ )
+
+ return json.dumps(result), self.response_headers
+
+ def delete_archive(self):
+ name = self._get_param("ArchiveName")
+
+ self.events_backend.delete_archive(name)
+
+ return "", self.response_headers
+
+ def start_replay(self):
+ name = self._get_param("ReplayName")
+ description = self._get_param("Description")
+ source_arn = self._get_param("EventSourceArn")
+ start_time = self._get_param("EventStartTime")
+ end_time = self._get_param("EventEndTime")
+ destination = self._get_param("Destination")
+
+ result = self.events_backend.start_replay(
+ name, description, source_arn, start_time, end_time, destination
+ )
+
+ return json.dumps(result), self.response_headers
+
+ def describe_replay(self):
+ name = self._get_param("ReplayName")
+
+ result = self.events_backend.describe_replay(name)
+
+ return json.dumps(result), self.response_headers
+
+ def list_replays(self):
+ name_prefix = self._get_param("NamePrefix")
+ source_arn = self._get_param("EventSourceArn")
+ state = self._get_param("State")
+
+ result = self.events_backend.list_replays(name_prefix, source_arn, state)
+
+ return json.dumps({"Replays": result}), self.response_headers
+
+ def cancel_replay(self):
+ name = self._get_param("ReplayName")
+
+ result = self.events_backend.cancel_replay(name)
+
+ return json.dumps(result), self.response_headers
+
+ def create_connection(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ authorization_type = self._get_param("AuthorizationType")
+ auth_parameters = self._get_param("AuthParameters")
+
+ result = self.events_backend.create_connection(
+ name, description, authorization_type, auth_parameters
+ )
+
+ return (
+ json.dumps(
+ {
+ "ConnectionArn": result.arn,
+ "ConnectionState": "AUTHORIZED",
+ "CreationTime": result.creation_time,
+ "LastModifiedTime": result.creation_time,
+ }
+ ),
+ self.response_headers,
+ )
+
+ def list_connections(self):
+ connections = self.events_backend.list_connections()
+ result = []
+ for connection in connections:
+ result.append(
+ {
+ "ConnectionArn": connection.arn,
+ "ConnectionState": "AUTHORIZED",
+ "CreationTime": connection.creation_time,
+ "LastModifiedTime": connection.creation_time,
+ "AuthorizationType": connection.authorization_type,
+ }
+ )
+
+ return json.dumps({"Connections": result}), self.response_headers
+
+ def describe_connection(self):
+ name = self._get_param("Name")
+ result = self.events_backend.describe_connection(name)
+ return json.dumps(result), self.response_headers
+
+ def update_connection(self):
+ updates = dict(
+ name=self._get_param("Name"),
+ description=self._get_param("Description"),
+ authorization_type=self._get_param("AuthorizationType"),
+ auth_parameters=self._get_param("AuthParameters"),
+ )
+ result = self.events_backend.update_connection(**updates)
+ return self._create_response(result)
+
+ def delete_connection(self):
+ name = self._get_param("Name")
+ result = self.events_backend.delete_connection(name)
+ return json.dumps(result), self.response_headers
+
+ def create_api_destination(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ connection_arn = self._get_param("ConnectionArn")
+ invocation_endpoint = self._get_param("InvocationEndpoint")
+ invocation_rate_limit_per_second = self._get_param(
+ "InvocationRateLimitPerSecond"
+ )
+ http_method = self._get_param("HttpMethod")
+
+ result = self.events_backend.create_api_destination(
+ name,
+ description,
+ connection_arn,
+ invocation_endpoint,
+ invocation_rate_limit_per_second,
+ http_method,
+ )
+ return self._create_response(result)
+
+ def list_api_destinations(self):
+ destinations = self.events_backend.list_api_destinations()
+ result = []
+ for destination in destinations:
+ result.append(
+ {
+ "ApiDestinationArn": destination.arn,
+ "Name": destination.name,
+ "ApiDestinationState": destination.state,
+ "ConnectionArn": destination.connection_arn,
+ "InvocationEndpoint": destination.invocation_endpoint,
+ "HttpMethod": destination.http_method,
+ "CreationTime": destination.creation_time,
+ "LastModifiedTime": destination.creation_time,
+ }
+ )
+
+ return json.dumps({"ApiDestinations": result}), self.response_headers
+
+ def describe_api_destination(self):
+ name = self._get_param("Name")
+ result = self.events_backend.describe_api_destination(name)
+ return self._create_response(result)
+
+ def update_api_destination(self):
+ updates = dict(
+ connection_arn=self._get_param("ConnectionArn"),
+ description=self._get_param("Description"),
+ http_method=self._get_param("HttpMethod"),
+ invocation_endpoint=self._get_param("InvocationEndpoint"),
+ invocation_rate_limit_per_second=self._get_param(
+ "InvocationRateLimitPerSecond"
+ ),
+ name=self._get_param("Name"),
+ )
+
+ result = self.events_backend.update_api_destination(**updates)
+ return self._create_response(result)
+
+ def delete_api_destination(self):
+ name = self._get_param("Name")
+ result = self.events_backend.delete_api_destination(name)
+ return self._create_response(result)
diff --git a/contrib/python/moto/py3/moto/events/urls.py b/contrib/python/moto/py3/moto/events/urls.py
new file mode 100644
index 0000000000..a167793145
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/urls.py
@@ -0,0 +1,5 @@
+from .responses import EventsHandler
+
+url_bases = [r"https?://events\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/": EventsHandler.dispatch}
diff --git a/contrib/python/moto/py3/moto/events/utils.py b/contrib/python/moto/py3/moto/events/utils.py
new file mode 100644
index 0000000000..ad359ab6dc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/events/utils.py
@@ -0,0 +1,16 @@
+PAGINATION_MODEL = {
+ "list_rules": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 50,
+ "unique_attribute": "arn",
+ "fail_on_invalid_token": False,
+ },
+ "list_rule_names_by_target": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 50,
+ "unique_attribute": "arn",
+ "fail_on_invalid_token": False,
+ },
+}
diff --git a/contrib/python/moto/py3/moto/firehose/__init__.py b/contrib/python/moto/py3/moto/firehose/__init__.py
new file mode 100644
index 0000000000..06964e274b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/firehose/__init__.py
@@ -0,0 +1,5 @@
+"""Firehose module initialization; sets value for base decorator."""
+from .models import firehose_backends
+from ..core.models import base_decorator
+
+mock_firehose = base_decorator(firehose_backends)
diff --git a/contrib/python/moto/py3/moto/firehose/exceptions.py b/contrib/python/moto/py3/moto/firehose/exceptions.py
new file mode 100644
index 0000000000..a556965e2f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/firehose/exceptions.py
@@ -0,0 +1,56 @@
+"""Exceptions raised by the Firehose service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ConcurrentModificationException(JsonRESTError):
+ """Existing config has a version ID that does not match given ID."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ConcurrentModificationException", message)
+
+
+class InvalidArgumentException(JsonRESTError):
+ """The specified input parameter has a value that is not valid."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidArgumentException", message)
+
+
+class LimitExceededException(JsonRESTError):
+ """You have already reached the limit for a requested resource."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("LimitExceededException", message)
+
+
+class ResourceInUseException(JsonRESTError):
+ """The resource is already in use and not available for this operation."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceInUseException", message)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ """The specified resource could not be found."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundException", message)
+
+
+class ValidationException(JsonRESTError):
+ """The tag key or tag value is not valid."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/firehose/models.py b/contrib/python/moto/py3/moto/firehose/models.py
new file mode 100644
index 0000000000..86bfff24f5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/firehose/models.py
@@ -0,0 +1,668 @@
+"""FirehoseBackend class with methods for supported APIs.
+
+Incomplete list of unfinished items:
+ - The create_delivery_stream() argument
+ DeliveryStreamEncryptionConfigurationInput is not supported.
+ - The S3BackupMode argument is ignored as are most of the other
+ destination arguments.
+ - Data record size and number of transactions are ignored.
+ - Better validation of delivery destination parameters, e.g.,
+ validation of the url for an http endpoint (boto3 does this).
+ - Better handling of the put_record_batch() API. Not only is
+ the existing logic bare bones, but for the ElasticSearch and
+ RedShift destinations, the data is just ignored.
+ - put_record_batch() handling of errors is minimal and no errors
+ are reported back to the user. Instead an exception is raised.
+ - put_record(), put_record_batch() always set "Encrypted" to False.
+"""
+from base64 import b64decode, b64encode
+from datetime import datetime, timezone
+from gzip import GzipFile
+import io
+import json
+from time import time
+from uuid import uuid4
+import warnings
+
+import requests
+
+from moto.core import BaseBackend, BaseModel
+from moto.core import get_account_id
+from moto.core.utils import BackendDict
+from moto.firehose.exceptions import (
+ ConcurrentModificationException,
+ InvalidArgumentException,
+ LimitExceededException,
+ ResourceInUseException,
+ ResourceNotFoundException,
+ ValidationException,
+)
+from moto.s3.models import s3_backend
+from moto.utilities.tagging_service import TaggingService
+
+MAX_TAGS_PER_DELIVERY_STREAM = 50
+
+DESTINATION_TYPES_TO_NAMES = {
+ "s3": "S3",
+ "extended_s3": "ExtendedS3",
+ "http_endpoint": "HttpEndpoint",
+ "elasticsearch": "Elasticsearch",
+ "redshift": "Redshift",
+ "splunk": "Splunk", # Unimplemented
+}
+
+
+def find_destination_config_in_args(api_args):
+ """Return (config_arg, config_name) tuple for destination config.
+
+ Determines which destination config(s) have been specified. The
+ alternative is to use a bunch of 'if' statements to check each
+ destination configuration. If more than one destination config is
+ specified, than an exception is raised.
+
+ A logical name for the destination type is returned along with the
+ destination config as it's useful way to compare current and replacement
+ destinations.
+ """
+ destination_names = DESTINATION_TYPES_TO_NAMES.keys()
+ configs = []
+ for arg_name, arg_value in api_args.items():
+ # Ignore arguments that are not destination configs.
+ if "_destination" not in arg_name:
+ continue
+
+ # If the destination config value is non-null, save it.
+ name = arg_name.split("_destination")[0]
+ if name in destination_names and arg_value:
+ configs.append((DESTINATION_TYPES_TO_NAMES[name], arg_value))
+
+ # One and only one destination configuration is allowed.
+ if len(configs) != 1:
+ raise InvalidArgumentException(
+ "Exactly one destination configuration is supported for a Firehose"
+ )
+
+ return configs[0]
+
+
+def create_s3_destination_config(extended_s3_destination_config):
+ """Return dict with selected fields copied from ExtendedS3 config.
+
+ When an ExtendedS3 config is chosen, AWS tacks on a S3 config as
+ well. When the same field names for S3 and ExtendedS3 exists,
+ the ExtendedS3 fields are copied to the added S3 destination.
+ """
+ fields_not_needed = [
+ "S3BackupMode",
+ "S3Description",
+ "DataFormatconversionConfiguration",
+ "DynamicPartitionConfiguration",
+ ]
+ destination = {}
+ for field, value in extended_s3_destination_config.items():
+ if field in fields_not_needed:
+ continue
+ destination[field] = value
+ return destination
+
+
+class DeliveryStream(
+ BaseModel
+): # pylint: disable=too-few-public-methods,too-many-instance-attributes
+ """Represents a delivery stream, its source and destination configs."""
+
+ STATES = {"CREATING", "ACTIVE", "CREATING_FAILED"}
+
+ MAX_STREAMS_PER_REGION = 50
+
+ def __init__(
+ self,
+ region,
+ delivery_stream_name,
+ delivery_stream_type,
+ kinesis_stream_source_configuration,
+ destination_name,
+ destination_config,
+ ): # pylint: disable=too-many-arguments
+ self.delivery_stream_status = "CREATING"
+ self.delivery_stream_name = delivery_stream_name
+ self.delivery_stream_type = (
+ delivery_stream_type if delivery_stream_type else "DirectPut"
+ )
+
+ self.source = kinesis_stream_source_configuration
+ self.destinations = [
+ {
+ "destination_id": "destinationId-000000000001",
+ destination_name: destination_config,
+ }
+ ]
+ if destination_name == "ExtendedS3":
+ # Add a S3 destination as well, minus a few ExtendedS3 fields.
+ self.destinations[0]["S3"] = create_s3_destination_config(
+ destination_config
+ )
+ elif "S3Configuration" in destination_config:
+ # S3Configuration becomes S3DestinationDescription for the
+ # other destinations.
+ self.destinations[0][destination_name][
+ "S3DestinationDescription"
+ ] = destination_config["S3Configuration"]
+ del self.destinations[0][destination_name]["S3Configuration"]
+
+ self.delivery_stream_status = "ACTIVE"
+ self.delivery_stream_arn = f"arn:aws:firehose:{region}:{get_account_id()}:deliverystream/{delivery_stream_name}"
+
+ self.create_timestamp = datetime.now(timezone.utc).isoformat()
+ self.version_id = "1" # Used to track updates of destination configs
+
+ # I believe boto3 only adds this field after an update ...
+ self.last_update_timestamp = datetime.now(timezone.utc).isoformat()
+
+
+class FirehoseBackend(BaseBackend):
+ """Implementation of Firehose APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.delivery_streams = {}
+ self.tagger = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "firehose", special_service_name="kinesis-firehose"
+ )
+
+ def create_delivery_stream(
+ self,
+ region,
+ delivery_stream_name,
+ delivery_stream_type,
+ kinesis_stream_source_configuration,
+ delivery_stream_encryption_configuration_input,
+ s3_destination_configuration,
+ extended_s3_destination_configuration,
+ redshift_destination_configuration,
+ elasticsearch_destination_configuration,
+ splunk_destination_configuration,
+ http_endpoint_destination_configuration,
+ tags,
+ ): # pylint: disable=too-many-arguments,too-many-locals,unused-argument
+ """Create a Kinesis Data Firehose delivery stream."""
+ (destination_name, destination_config) = find_destination_config_in_args(
+ locals()
+ )
+
+ if delivery_stream_name in self.delivery_streams:
+ raise ResourceInUseException(
+ f"Firehose {delivery_stream_name} under accountId {get_account_id()} "
+ f"already exists"
+ )
+
+ if len(self.delivery_streams) == DeliveryStream.MAX_STREAMS_PER_REGION:
+ raise LimitExceededException(
+ f"You have already consumed your firehose quota of "
+ f"{DeliveryStream.MAX_STREAMS_PER_REGION} hoses. Firehose "
+ f"names: {list(self.delivery_streams.keys())}"
+ )
+
+ # Rule out situations that are not yet implemented.
+ if delivery_stream_encryption_configuration_input:
+ warnings.warn(
+ "A delivery stream with server-side encryption enabled is not "
+ "yet implemented"
+ )
+
+ if destination_name == "Splunk":
+ warnings.warn("A Splunk destination delivery stream is not yet implemented")
+
+ if (
+ kinesis_stream_source_configuration
+ and delivery_stream_type != "KinesisStreamAsSource"
+ ):
+ raise InvalidArgumentException(
+ "KinesisSourceStreamConfig is only applicable for "
+ "KinesisStreamAsSource stream type"
+ )
+
+ # Validate the tags before proceeding.
+ errmsg = self.tagger.validate_tags(tags or [])
+ if errmsg:
+ raise ValidationException(errmsg)
+
+ if tags and len(tags) > MAX_TAGS_PER_DELIVERY_STREAM:
+ raise ValidationException(
+ f"1 validation error detected: Value '{tags}' at 'tags' "
+ f"failed to satisify contstraint: Member must have length "
+ f"less than or equal to {MAX_TAGS_PER_DELIVERY_STREAM}"
+ )
+
+ # Create a DeliveryStream instance that will be stored and indexed
+ # by delivery stream name. This instance will update the state and
+ # create the ARN.
+ delivery_stream = DeliveryStream(
+ region,
+ delivery_stream_name,
+ delivery_stream_type,
+ kinesis_stream_source_configuration,
+ destination_name,
+ destination_config,
+ )
+ self.tagger.tag_resource(delivery_stream.delivery_stream_arn, tags or [])
+
+ self.delivery_streams[delivery_stream_name] = delivery_stream
+ return self.delivery_streams[delivery_stream_name].delivery_stream_arn
+
+ def delete_delivery_stream(
+ self, delivery_stream_name, allow_force_delete=False
+ ): # pylint: disable=unused-argument
+ """Delete a delivery stream and its data.
+
+ AllowForceDelete option is ignored as we only superficially
+ apply state.
+ """
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ self.tagger.delete_all_tags_for_resource(delivery_stream.delivery_stream_arn)
+
+ delivery_stream.delivery_stream_status = "DELETING"
+ self.delivery_streams.pop(delivery_stream_name)
+
+ def describe_delivery_stream(
+ self, delivery_stream_name, limit, exclusive_start_destination_id
+ ): # pylint: disable=unused-argument
+ """Return description of specified delivery stream and its status.
+
+ Note: the 'limit' and 'exclusive_start_destination_id' parameters
+ are not currently processed/implemented.
+ """
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ result = {"DeliveryStreamDescription": {"HasMoreDestinations": False}}
+ for attribute, attribute_value in vars(delivery_stream).items():
+ if not attribute_value:
+ continue
+
+ # Convert from attribute's snake case to camel case for outgoing
+ # JSON.
+ name = "".join([x.capitalize() for x in attribute.split("_")])
+
+ # Fooey ... always an exception to the rule:
+ if name == "DeliveryStreamArn":
+ name = "DeliveryStreamARN"
+
+ if name != "Destinations":
+ if name == "Source":
+ result["DeliveryStreamDescription"][name] = {
+ "KinesisStreamSourceDescription": attribute_value
+ }
+ else:
+ result["DeliveryStreamDescription"][name] = attribute_value
+ continue
+
+ result["DeliveryStreamDescription"]["Destinations"] = []
+ for destination in attribute_value:
+ description = {}
+ for key, value in destination.items():
+ if key == "destination_id":
+ description["DestinationId"] = value
+ else:
+ description[f"{key}DestinationDescription"] = value
+
+ result["DeliveryStreamDescription"]["Destinations"].append(description)
+
+ return result
+
+ def list_delivery_streams(
+ self, limit, delivery_stream_type, exclusive_start_delivery_stream_name
+ ):
+ """Return list of delivery streams in alphabetic order of names."""
+ result = {"DeliveryStreamNames": [], "HasMoreDeliveryStreams": False}
+ if not self.delivery_streams:
+ return result
+
+ # If delivery_stream_type is specified, filter out any stream that's
+ # not of that type.
+ stream_list = self.delivery_streams.keys()
+ if delivery_stream_type:
+ stream_list = [
+ x
+ for x in stream_list
+ if self.delivery_streams[x].delivery_stream_type == delivery_stream_type
+ ]
+
+ # The list is sorted alphabetically, not alphanumerically.
+ sorted_list = sorted(stream_list)
+
+ # Determine the limit or number of names to return in the list.
+ limit = limit or DeliveryStream.MAX_STREAMS_PER_REGION
+
+ # If a starting delivery stream name is given, find the index into
+ # the sorted list, then add one to get the name following it. If the
+ # exclusive_start_delivery_stream_name doesn't exist, it's ignored.
+ start = 0
+ if exclusive_start_delivery_stream_name:
+ if self.delivery_streams.get(exclusive_start_delivery_stream_name):
+ start = sorted_list.index(exclusive_start_delivery_stream_name) + 1
+
+ result["DeliveryStreamNames"] = sorted_list[start : start + limit]
+ if len(sorted_list) > (start + limit):
+ result["HasMoreDeliveryStreams"] = True
+ return result
+
+ def list_tags_for_delivery_stream(
+ self, delivery_stream_name, exclusive_start_tag_key, limit
+ ):
+ """Return list of tags."""
+ result = {"Tags": [], "HasMoreTags": False}
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ tags = self.tagger.list_tags_for_resource(delivery_stream.delivery_stream_arn)[
+ "Tags"
+ ]
+ keys = self.tagger.extract_tag_names(tags)
+
+ # If a starting tag is given and can be found, find the index into
+ # tags, then add one to get the tag following it.
+ start = 0
+ if exclusive_start_tag_key:
+ if exclusive_start_tag_key in keys:
+ start = keys.index(exclusive_start_tag_key) + 1
+
+ limit = limit or MAX_TAGS_PER_DELIVERY_STREAM
+ result["Tags"] = tags[start : start + limit]
+ if len(tags) > (start + limit):
+ result["HasMoreTags"] = True
+ return result
+
+ def put_record(self, delivery_stream_name, record):
+ """Write a single data record into a Kinesis Data firehose stream."""
+ result = self.put_record_batch(delivery_stream_name, [record])
+ return {
+ "RecordId": result["RequestResponses"][0]["RecordId"],
+ "Encrypted": False,
+ }
+
+ @staticmethod
+ def put_http_records(http_destination, records):
+ """Put records to a HTTP destination."""
+ # Mostly copied from localstack
+ url = http_destination["EndpointConfiguration"]["Url"]
+ headers = {"Content-Type": "application/json"}
+ record_to_send = {
+ "requestId": str(uuid4()),
+ "timestamp": int(time()),
+ "records": [{"data": record["Data"]} for record in records],
+ }
+ try:
+ requests.post(url, json=record_to_send, headers=headers)
+ except Exception as exc:
+ # This could be better ...
+ raise RuntimeError(
+ "Firehose PutRecord(Batch) to HTTP destination failed"
+ ) from exc
+ return [{"RecordId": str(uuid4())} for _ in range(len(records))]
+
+ @staticmethod
+ def _format_s3_object_path(delivery_stream_name, version_id, prefix):
+ """Return a S3 object path in the expected format."""
+ # Taken from LocalStack's firehose logic, with minor changes.
+ # See https://docs.aws.amazon.com/firehose/latest/dev/basic-deliver.html#s3-object-name
+ # Path prefix pattern: myApp/YYYY/MM/DD/HH/
+ # Object name pattern:
+ # DeliveryStreamName-DeliveryStreamVersion-YYYY-MM-DD-HH-MM-SS-RandomString
+ prefix = f"{prefix}{'' if prefix.endswith('/') else '/'}"
+ now = datetime.utcnow()
+ return (
+ f"{prefix}{now.strftime('%Y/%m/%d/%H')}/"
+ f"{delivery_stream_name}-{version_id}-"
+ f"{now.strftime('%Y-%m-%d-%H-%M-%S')}-{str(uuid4())}"
+ )
+
+ def put_s3_records(self, delivery_stream_name, version_id, s3_destination, records):
+ """Put records to a ExtendedS3 or S3 destination."""
+ # Taken from LocalStack's firehose logic, with minor changes.
+ bucket_name = s3_destination["BucketARN"].split(":")[-1]
+ prefix = s3_destination.get("Prefix", "")
+ object_path = self._format_s3_object_path(
+ delivery_stream_name, version_id, prefix
+ )
+
+ batched_data = b"".join([b64decode(r["Data"]) for r in records])
+ try:
+ s3_backend.put_object(bucket_name, object_path, batched_data)
+ except Exception as exc:
+ # This could be better ...
+ raise RuntimeError(
+ "Firehose PutRecord(Batch to S3 destination failed"
+ ) from exc
+ return [{"RecordId": str(uuid4())} for _ in range(len(records))]
+
+ def put_record_batch(self, delivery_stream_name, records):
+ """Write multiple data records into a Kinesis Data firehose stream."""
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ request_responses = []
+ for destination in delivery_stream.destinations:
+ if "ExtendedS3" in destination:
+ # ExtendedS3 will be handled like S3,but in the future
+ # this will probably need to be revisited. This destination
+ # must be listed before S3 otherwise both destinations will
+ # be processed instead of just ExtendedS3.
+ request_responses = self.put_s3_records(
+ delivery_stream_name,
+ delivery_stream.version_id,
+ destination["ExtendedS3"],
+ records,
+ )
+ elif "S3" in destination:
+ request_responses = self.put_s3_records(
+ delivery_stream_name,
+ delivery_stream.version_id,
+ destination["S3"],
+ records,
+ )
+ elif "HttpEndpoint" in destination:
+ request_responses = self.put_http_records(
+ destination["HttpEndpoint"], records
+ )
+ elif "Elasticsearch" in destination or "Redshift" in destination:
+ # This isn't implmented as these services aren't implemented,
+ # so ignore the data, but return a "proper" response.
+ request_responses = [
+ {"RecordId": str(uuid4())} for _ in range(len(records))
+ ]
+
+ return {
+ "FailedPutCount": 0,
+ "Encrypted": False,
+ "RequestResponses": request_responses,
+ }
+
+ def tag_delivery_stream(self, delivery_stream_name, tags):
+ """Add/update tags for specified delivery stream."""
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ if len(tags) > MAX_TAGS_PER_DELIVERY_STREAM:
+ raise ValidationException(
+ f"1 validation error detected: Value '{tags}' at 'tags' "
+ f"failed to satisify contstraint: Member must have length "
+ f"less than or equal to {MAX_TAGS_PER_DELIVERY_STREAM}"
+ )
+
+ errmsg = self.tagger.validate_tags(tags)
+ if errmsg:
+ raise ValidationException(errmsg)
+
+ self.tagger.tag_resource(delivery_stream.delivery_stream_arn, tags)
+
+ def untag_delivery_stream(self, delivery_stream_name, tag_keys):
+ """Removes tags from specified delivery stream."""
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under account {get_account_id()} "
+ f"not found."
+ )
+
+ # If a tag key doesn't exist for the stream, boto3 ignores it.
+ self.tagger.untag_resource_using_names(
+ delivery_stream.delivery_stream_arn, tag_keys
+ )
+
+ def update_destination(
+ self,
+ delivery_stream_name,
+ current_delivery_stream_version_id,
+ destination_id,
+ s3_destination_update,
+ extended_s3_destination_update,
+ s3_backup_mode,
+ redshift_destination_update,
+ elasticsearch_destination_update,
+ splunk_destination_update,
+ http_endpoint_destination_update,
+ ): # pylint: disable=unused-argument,too-many-arguments,too-many-locals
+ """Updates specified destination of specified delivery stream."""
+ (destination_name, destination_config) = find_destination_config_in_args(
+ locals()
+ )
+
+ delivery_stream = self.delivery_streams.get(delivery_stream_name)
+ if not delivery_stream:
+ raise ResourceNotFoundException(
+ f"Firehose {delivery_stream_name} under accountId "
+ f"{get_account_id()} not found."
+ )
+
+ if destination_name == "Splunk":
+ warnings.warn("A Splunk destination delivery stream is not yet implemented")
+
+ if delivery_stream.version_id != current_delivery_stream_version_id:
+ raise ConcurrentModificationException(
+ f"Cannot update firehose: {delivery_stream_name} since the "
+ f"current version id: {delivery_stream.version_id} and "
+ f"specified version id: {current_delivery_stream_version_id} "
+ f"do not match"
+ )
+
+ destination = {}
+ destination_idx = 0
+ for destination in delivery_stream.destinations:
+ if destination["destination_id"] == destination_id:
+ break
+ destination_idx += 1
+ else:
+ raise InvalidArgumentException("Destination Id {destination_id} not found")
+
+ # Switching between Amazon ES and other services is not supported.
+ # For an Amazon ES destination, you can only update to another Amazon
+ # ES destination. Same with HTTP. Didn't test Splunk.
+ if (
+ destination_name == "Elasticsearch" and "Elasticsearch" not in destination
+ ) or (destination_name == "HttpEndpoint" and "HttpEndpoint" not in destination):
+ raise InvalidArgumentException(
+ f"Changing the destination type to or from {destination_name} "
+ f"is not supported at this time."
+ )
+
+ # If this is a different type of destination configuration,
+ # the existing configuration is reset first.
+ if destination_name in destination:
+ delivery_stream.destinations[destination_idx][destination_name].update(
+ destination_config
+ )
+ else:
+ delivery_stream.destinations[destination_idx] = {
+ "destination_id": destination_id,
+ destination_name: destination_config,
+ }
+
+ # Once S3 is updated to an ExtendedS3 destination, both remain in
+ # the destination. That means when one is updated, the other needs
+ # to be updated as well. The problem is that they don't have the
+ # same fields.
+ if destination_name == "ExtendedS3":
+ delivery_stream.destinations[destination_idx][
+ "S3"
+ ] = create_s3_destination_config(destination_config)
+ elif destination_name == "S3" and "ExtendedS3" in destination:
+ destination["ExtendedS3"] = {
+ k: v
+ for k, v in destination["S3"].items()
+ if k in destination["ExtendedS3"]
+ }
+
+ # Increment version number and update the timestamp.
+ delivery_stream.version_id = str(int(current_delivery_stream_version_id) + 1)
+ delivery_stream.last_update_timestamp = datetime.now(timezone.utc).isoformat()
+
+ # Unimplemented: processing of the "S3BackupMode" parameter. Per the
+ # documentation: "You can update a delivery stream to enable Amazon
+ # S3 backup if it is disabled. If backup is enabled, you can't update
+ # the delivery stream to disable it."
+
+ def lookup_name_from_arn(self, arn):
+ """Given an ARN, return the associated delivery stream name."""
+ return self.delivery_streams.get(arn.split("/")[-1])
+
+ def send_log_event(
+ self,
+ delivery_stream_arn,
+ filter_name,
+ log_group_name,
+ log_stream_name,
+ log_events,
+ ): # pylint: disable=too-many-arguments
+ """Send log events to a S3 bucket after encoding and gzipping it."""
+ data = {
+ "logEvents": log_events,
+ "logGroup": log_group_name,
+ "logStream": log_stream_name,
+ "messageType": "DATA_MESSAGE",
+ "owner": get_account_id(),
+ "subscriptionFilters": [filter_name],
+ }
+
+ output = io.BytesIO()
+ with GzipFile(fileobj=output, mode="w") as fhandle:
+ fhandle.write(json.dumps(data, separators=(",", ":")).encode("utf-8"))
+ gzipped_payload = b64encode(output.getvalue()).decode("utf-8")
+
+ delivery_stream = self.lookup_name_from_arn(delivery_stream_arn)
+ self.put_s3_records(
+ delivery_stream.delivery_stream_name,
+ delivery_stream.version_id,
+ delivery_stream.destinations[0]["S3"],
+ [{"Data": gzipped_payload}],
+ )
+
+
+firehose_backends = BackendDict(FirehoseBackend, "firehose")
diff --git a/contrib/python/moto/py3/moto/firehose/responses.py b/contrib/python/moto/py3/moto/firehose/responses.py
new file mode 100644
index 0000000000..5b77836ab5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/firehose/responses.py
@@ -0,0 +1,110 @@
+"""Handles Firehose API requests, invokes method and returns response."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import firehose_backends
+
+
+class FirehoseResponse(BaseResponse):
+ """Handler for Firehose requests and responses."""
+
+ @property
+ def firehose_backend(self):
+ """Return backend instance specific to this region."""
+ return firehose_backends[self.region]
+
+ def create_delivery_stream(self):
+ """Prepare arguments and respond to CreateDeliveryStream request."""
+ delivery_stream_arn = self.firehose_backend.create_delivery_stream(
+ self.region,
+ self._get_param("DeliveryStreamName"),
+ self._get_param("DeliveryStreamType"),
+ self._get_param("KinesisStreamSourceConfiguration"),
+ self._get_param("DeliveryStreamEncryptionConfigurationInput"),
+ self._get_param("S3DestinationConfiguration"),
+ self._get_param("ExtendedS3DestinationConfiguration"),
+ self._get_param("RedshiftDestinationConfiguration"),
+ self._get_param("ElasticsearchDestinationConfiguration"),
+ self._get_param("SplunkDestinationConfiguration"),
+ self._get_param("HttpEndpointDestinationConfiguration"),
+ self._get_param("Tags"),
+ )
+ return json.dumps({"DeliveryStreamARN": delivery_stream_arn})
+
+ def delete_delivery_stream(self):
+ """Prepare arguments and respond to DeleteDeliveryStream request."""
+ self.firehose_backend.delete_delivery_stream(
+ self._get_param("DeliveryStreamName"), self._get_param("AllowForceDelete")
+ )
+ return json.dumps({})
+
+ def describe_delivery_stream(self):
+ """Prepare arguments and respond to DescribeDeliveryStream request."""
+ result = self.firehose_backend.describe_delivery_stream(
+ self._get_param("DeliveryStreamName"),
+ self._get_param("Limit"),
+ self._get_param("ExclusiveStartDestinationId"),
+ )
+ return json.dumps(result)
+
+ def list_delivery_streams(self):
+ """Prepare arguments and respond to ListDeliveryStreams request."""
+ stream_list = self.firehose_backend.list_delivery_streams(
+ self._get_param("Limit"),
+ self._get_param("DeliveryStreamType"),
+ self._get_param("ExclusiveStartDeliveryStreamName"),
+ )
+ return json.dumps(stream_list)
+
+ def list_tags_for_delivery_stream(self):
+ """Prepare arguments and respond to ListTagsForDeliveryStream()."""
+ result = self.firehose_backend.list_tags_for_delivery_stream(
+ self._get_param("DeliveryStreamName"),
+ self._get_param("ExclusiveStartTagKey"),
+ self._get_param("Limit"),
+ )
+ return json.dumps(result)
+
+ def put_record(self):
+ """Prepare arguments and response to PutRecord()."""
+ result = self.firehose_backend.put_record(
+ self._get_param("DeliveryStreamName"), self._get_param("Record")
+ )
+ return json.dumps(result)
+
+ def put_record_batch(self):
+ """Prepare arguments and response to PutRecordBatch()."""
+ result = self.firehose_backend.put_record_batch(
+ self._get_param("DeliveryStreamName"), self._get_param("Records")
+ )
+ return json.dumps(result)
+
+ def tag_delivery_stream(self):
+ """Prepare arguments and respond to TagDeliveryStream request."""
+ self.firehose_backend.tag_delivery_stream(
+ self._get_param("DeliveryStreamName"), self._get_param("Tags")
+ )
+ return json.dumps({})
+
+ def untag_delivery_stream(self):
+ """Prepare arguments and respond to UntagDeliveryStream()."""
+ self.firehose_backend.untag_delivery_stream(
+ self._get_param("DeliveryStreamName"), self._get_param("TagKeys")
+ )
+ return json.dumps({})
+
+ def update_destination(self):
+ """Prepare arguments and respond to UpdateDestination()."""
+ self.firehose_backend.update_destination(
+ self._get_param("DeliveryStreamName"),
+ self._get_param("CurrentDeliveryStreamVersionId"),
+ self._get_param("DestinationId"),
+ self._get_param("S3DestinationUpdate"),
+ self._get_param("ExtendedS3DestinationUpdate"),
+ self._get_param("S3BackupMode"),
+ self._get_param("RedshiftDestinationUpdate"),
+ self._get_param("ElasticsearchDestinationUpdate"),
+ self._get_param("SplunkDestinationUpdate"),
+ self._get_param("HttpEndpointDestinationUpdate"),
+ )
+ return json.dumps({})
diff --git a/contrib/python/moto/py3/moto/firehose/urls.py b/contrib/python/moto/py3/moto/firehose/urls.py
new file mode 100644
index 0000000000..f3d6f49b8b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/firehose/urls.py
@@ -0,0 +1,6 @@
+"""Firehose base URL and path."""
+from .responses import FirehoseResponse
+
+
+url_bases = [r"https?://firehose\.(.+)\.amazonaws\.com"]
+url_paths = {"{0}/$": FirehoseResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/forecast/__init__.py b/contrib/python/moto/py3/moto/forecast/__init__.py
new file mode 100644
index 0000000000..e8fb838b46
--- /dev/null
+++ b/contrib/python/moto/py3/moto/forecast/__init__.py
@@ -0,0 +1,5 @@
+from .models import forecast_backends
+from ..core.models import base_decorator
+
+forecast_backend = forecast_backends["us-east-1"]
+mock_forecast = base_decorator(forecast_backends)
diff --git a/contrib/python/moto/py3/moto/forecast/exceptions.py b/contrib/python/moto/py3/moto/forecast/exceptions.py
new file mode 100644
index 0000000000..dd347495da
--- /dev/null
+++ b/contrib/python/moto/py3/moto/forecast/exceptions.py
@@ -0,0 +1,25 @@
+from moto.core.exceptions import AWSError
+
+
+class InvalidInputException(AWSError):
+ TYPE = "InvalidInputException"
+
+
+class ResourceAlreadyExistsException(AWSError):
+ TYPE = "ResourceAlreadyExistsException"
+
+
+class ResourceNotFoundException(AWSError):
+ TYPE = "ResourceNotFoundException"
+
+
+class ResourceInUseException(AWSError):
+ TYPE = "ResourceInUseException"
+
+
+class LimitExceededException(AWSError):
+ TYPE = "LimitExceededException"
+
+
+class ValidationException(AWSError):
+ TYPE = "ValidationException"
diff --git a/contrib/python/moto/py3/moto/forecast/models.py b/contrib/python/moto/py3/moto/forecast/models.py
new file mode 100644
index 0000000000..2982c39762
--- /dev/null
+++ b/contrib/python/moto/py3/moto/forecast/models.py
@@ -0,0 +1,162 @@
+import re
+from datetime import datetime
+
+from moto.core import get_account_id, BaseBackend
+from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
+from .exceptions import (
+ InvalidInputException,
+ ResourceAlreadyExistsException,
+ ResourceNotFoundException,
+ ValidationException,
+)
+
+
+class DatasetGroup:
+ accepted_dataset_group_name_format = re.compile(r"^[a-zA-Z][a-z-A-Z0-9_]*")
+ accepted_dataset_group_arn_format = re.compile(r"^[a-zA-Z0-9\-\_\.\/\:]+$")
+ accepted_dataset_types = [
+ "INVENTORY_PLANNING",
+ "METRICS",
+ "RETAIL",
+ "EC2_CAPACITY",
+ "CUSTOM",
+ "WEB_TRAFFIC",
+ "WORK_FORCE",
+ ]
+
+ def __init__(
+ self, region_name, dataset_arns, dataset_group_name, domain, tags=None
+ ):
+ self.creation_date = iso_8601_datetime_without_milliseconds(datetime.now())
+ self.modified_date = self.creation_date
+
+ self.arn = (
+ "arn:aws:forecast:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":dataset-group/"
+ + dataset_group_name
+ )
+ self.dataset_arns = dataset_arns if dataset_arns else []
+ self.dataset_group_name = dataset_group_name
+ self.domain = domain
+ self.tags = tags
+ self._validate()
+
+ def update(self, dataset_arns):
+ self.dataset_arns = dataset_arns
+ self.last_modified_date = iso_8601_datetime_without_milliseconds(datetime.now())
+
+ def _validate(self):
+ errors = []
+
+ errors.extend(self._validate_dataset_group_name())
+ errors.extend(self._validate_dataset_group_name_len())
+ errors.extend(self._validate_dataset_group_domain())
+
+ if errors:
+ err_count = len(errors)
+ message = str(err_count) + " validation error"
+ message += "s" if err_count > 1 else ""
+ message += " detected: "
+ message += "; ".join(errors)
+ raise ValidationException(message)
+
+ def _validate_dataset_group_name(self):
+ errors = []
+ if not re.match(
+ self.accepted_dataset_group_name_format, self.dataset_group_name
+ ):
+ errors.append(
+ "Value '"
+ + self.dataset_group_name
+ + "' at 'datasetGroupName' failed to satisfy constraint: Member must satisfy regular expression pattern "
+ + self.accepted_dataset_group_name_format.pattern
+ )
+ return errors
+
+ def _validate_dataset_group_name_len(self):
+ errors = []
+ if len(self.dataset_group_name) >= 64:
+ errors.append(
+ "Value '"
+ + self.dataset_group_name
+ + "' at 'datasetGroupName' failed to satisfy constraint: Member must have length less than or equal to 63"
+ )
+ return errors
+
+ def _validate_dataset_group_domain(self):
+ errors = []
+ if self.domain not in self.accepted_dataset_types:
+ errors.append(
+ "Value '"
+ + self.domain
+ + "' at 'domain' failed to satisfy constraint: Member must satisfy enum value set "
+ + str(self.accepted_dataset_types)
+ )
+ return errors
+
+
+class ForecastBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.dataset_groups = {}
+ self.datasets = {}
+
+ def create_dataset_group(self, dataset_group_name, domain, dataset_arns, tags):
+ dataset_group = DatasetGroup(
+ region_name=self.region_name,
+ dataset_group_name=dataset_group_name,
+ domain=domain,
+ dataset_arns=dataset_arns,
+ tags=tags,
+ )
+
+ if dataset_arns:
+ for dataset_arn in dataset_arns:
+ if dataset_arn not in self.datasets:
+ raise InvalidInputException(
+ "Dataset arns: [" + dataset_arn + "] are not found"
+ )
+
+ if self.dataset_groups.get(dataset_group.arn):
+ raise ResourceAlreadyExistsException(
+ "A dataset group already exists with the arn: " + dataset_group.arn
+ )
+
+ self.dataset_groups[dataset_group.arn] = dataset_group
+ return dataset_group
+
+ def describe_dataset_group(self, dataset_group_arn):
+ try:
+ dataset_group = self.dataset_groups[dataset_group_arn]
+ except KeyError:
+ raise ResourceNotFoundException("No resource found " + dataset_group_arn)
+ return dataset_group
+
+ def delete_dataset_group(self, dataset_group_arn):
+ try:
+ del self.dataset_groups[dataset_group_arn]
+ except KeyError:
+ raise ResourceNotFoundException("No resource found " + dataset_group_arn)
+
+ def update_dataset_group(self, dataset_group_arn, dataset_arns):
+ try:
+ dsg = self.dataset_groups[dataset_group_arn]
+ except KeyError:
+ raise ResourceNotFoundException("No resource found " + dataset_group_arn)
+
+ for dataset_arn in dataset_arns:
+ if dataset_arn not in dsg.dataset_arns:
+ raise InvalidInputException(
+ "Dataset arns: [" + dataset_arn + "] are not found"
+ )
+
+ dsg.update(dataset_arns)
+
+ def list_dataset_groups(self):
+ return [v for (_, v) in self.dataset_groups.items()]
+
+
+forecast_backends = BackendDict(ForecastBackend, "forecast")
diff --git a/contrib/python/moto/py3/moto/forecast/responses.py b/contrib/python/moto/py3/moto/forecast/responses.py
new file mode 100644
index 0000000000..d5c277b9f2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/forecast/responses.py
@@ -0,0 +1,77 @@
+import json
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import forecast_backends
+
+
+class ForecastResponse(BaseResponse):
+ @property
+ def forecast_backend(self):
+ return forecast_backends[self.region]
+
+ @amzn_request_id
+ def create_dataset_group(self):
+ dataset_group_name = self._get_param("DatasetGroupName")
+ domain = self._get_param("Domain")
+ dataset_arns = self._get_param("DatasetArns")
+ tags = self._get_param("Tags")
+
+ dataset_group = self.forecast_backend.create_dataset_group(
+ dataset_group_name=dataset_group_name,
+ domain=domain,
+ dataset_arns=dataset_arns,
+ tags=tags,
+ )
+ response = {"DatasetGroupArn": dataset_group.arn}
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_dataset_group(self):
+ dataset_group_arn = self._get_param("DatasetGroupArn")
+
+ dataset_group = self.forecast_backend.describe_dataset_group(
+ dataset_group_arn=dataset_group_arn
+ )
+ response = {
+ "CreationTime": dataset_group.creation_date,
+ "DatasetArns": dataset_group.dataset_arns,
+ "DatasetGroupArn": dataset_group.arn,
+ "DatasetGroupName": dataset_group.dataset_group_name,
+ "Domain": dataset_group.domain,
+ "LastModificationTime": dataset_group.modified_date,
+ "Status": "ACTIVE",
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def delete_dataset_group(self):
+ dataset_group_arn = self._get_param("DatasetGroupArn")
+ self.forecast_backend.delete_dataset_group(dataset_group_arn)
+ return 200, {}, None
+
+ @amzn_request_id
+ def update_dataset_group(self):
+ dataset_group_arn = self._get_param("DatasetGroupArn")
+ dataset_arns = self._get_param("DatasetArns")
+ self.forecast_backend.update_dataset_group(dataset_group_arn, dataset_arns)
+ return 200, {}, None
+
+ @amzn_request_id
+ def list_dataset_groups(self):
+ list_all = self.forecast_backend.list_dataset_groups()
+ list_all = sorted(
+ [
+ {
+ "DatasetGroupArn": dsg.arn,
+ "DatasetGroupName": dsg.dataset_group_name,
+ "CreationTime": dsg.creation_date,
+ "LastModificationTime": dsg.creation_date,
+ }
+ for dsg in list_all
+ ],
+ key=lambda x: x["LastModificationTime"],
+ reverse=True,
+ )
+ response = {"DatasetGroups": list_all}
+ return 200, {}, json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/forecast/urls.py b/contrib/python/moto/py3/moto/forecast/urls.py
new file mode 100644
index 0000000000..706094c436
--- /dev/null
+++ b/contrib/python/moto/py3/moto/forecast/urls.py
@@ -0,0 +1,5 @@
+from .responses import ForecastResponse
+
+url_bases = [r"https?://forecast\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": ForecastResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/glacier/__init__.py b/contrib/python/moto/py3/moto/glacier/__init__.py
new file mode 100644
index 0000000000..4dec88933b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glacier/__init__.py
@@ -0,0 +1,5 @@
+from .models import glacier_backends
+from ..core.models import base_decorator
+
+glacier_backend = glacier_backends["us-east-1"]
+mock_glacier = base_decorator(glacier_backends)
diff --git a/contrib/python/moto/py3/moto/glacier/models.py b/contrib/python/moto/py3/moto/glacier/models.py
new file mode 100644
index 0000000000..d5b1389589
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glacier/models.py
@@ -0,0 +1,232 @@
+import hashlib
+
+import datetime
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.utilities.utils import md5_hash
+
+from .utils import get_job_id
+
+
+class Job(BaseModel):
+ def __init__(self, tier):
+ self.st = datetime.datetime.now()
+
+ if tier.lower() == "expedited":
+ self.et = self.st + datetime.timedelta(seconds=2)
+ elif tier.lower() == "bulk":
+ self.et = self.st + datetime.timedelta(seconds=10)
+ else:
+ # Standard
+ self.et = self.st + datetime.timedelta(seconds=5)
+
+
+class ArchiveJob(Job):
+ def __init__(self, job_id, tier, arn, archive_id):
+ self.job_id = job_id
+ self.tier = tier
+ self.arn = arn
+ self.archive_id = archive_id
+ Job.__init__(self, tier)
+
+ def to_dict(self):
+ d = {
+ "Action": "ArchiveRetrieval",
+ "ArchiveId": self.archive_id,
+ "ArchiveSizeInBytes": 0,
+ "ArchiveSHA256TreeHash": None,
+ "Completed": False,
+ "CreationDate": self.st.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
+ "InventorySizeInBytes": 0,
+ "JobDescription": None,
+ "JobId": self.job_id,
+ "RetrievalByteRange": None,
+ "SHA256TreeHash": None,
+ "SNSTopic": None,
+ "StatusCode": "InProgress",
+ "StatusMessage": None,
+ "VaultARN": self.arn,
+ "Tier": self.tier,
+ }
+ if datetime.datetime.now() > self.et:
+ d["Completed"] = True
+ d["CompletionDate"] = self.et.strftime("%Y-%m-%dT%H:%M:%S.000Z")
+ d["InventorySizeInBytes"] = 10000
+ d["StatusCode"] = "Succeeded"
+ return d
+
+
+class InventoryJob(Job):
+ def __init__(self, job_id, tier, arn):
+ self.job_id = job_id
+ self.tier = tier
+ self.arn = arn
+ Job.__init__(self, tier)
+
+ def to_dict(self):
+ d = {
+ "Action": "InventoryRetrieval",
+ "ArchiveSHA256TreeHash": None,
+ "Completed": False,
+ "CreationDate": self.st.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
+ "InventorySizeInBytes": 0,
+ "JobDescription": None,
+ "JobId": self.job_id,
+ "RetrievalByteRange": None,
+ "SHA256TreeHash": None,
+ "SNSTopic": None,
+ "StatusCode": "InProgress",
+ "StatusMessage": None,
+ "VaultARN": self.arn,
+ "Tier": self.tier,
+ }
+ if datetime.datetime.now() > self.et:
+ d["Completed"] = True
+ d["CompletionDate"] = self.et.strftime("%Y-%m-%dT%H:%M:%S.000Z")
+ d["InventorySizeInBytes"] = 10000
+ d["StatusCode"] = "Succeeded"
+ return d
+
+
+class Vault(BaseModel):
+ def __init__(self, vault_name, region):
+ self.st = datetime.datetime.now()
+ self.vault_name = vault_name
+ self.region = region
+ self.archives = {}
+ self.jobs = {}
+
+ @property
+ def arn(self):
+ return "arn:aws:glacier:{0}:{1}:vaults/{2}".format(
+ self.region, get_account_id(), self.vault_name
+ )
+
+ def to_dict(self):
+ archives_size = 0
+ for k in self.archives:
+ archives_size += self.archives[k]["size"]
+ d = {
+ "CreationDate": self.st.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
+ "LastInventoryDate": self.st.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
+ "NumberOfArchives": len(self.archives),
+ "SizeInBytes": archives_size,
+ "VaultARN": self.arn,
+ "VaultName": self.vault_name,
+ }
+ return d
+
+ def create_archive(self, body, description):
+ archive_id = md5_hash(body).hexdigest()
+ self.archives[archive_id] = {}
+ self.archives[archive_id]["archive_id"] = archive_id
+ self.archives[archive_id]["body"] = body
+ self.archives[archive_id]["size"] = len(body)
+ self.archives[archive_id]["sha256"] = hashlib.sha256(body).hexdigest()
+ self.archives[archive_id]["creation_date"] = datetime.datetime.now().strftime(
+ "%Y-%m-%dT%H:%M:%S.000Z"
+ )
+ self.archives[archive_id]["description"] = description
+ return self.archives[archive_id]
+
+ def get_archive_body(self, archive_id):
+ return self.archives[archive_id]["body"]
+
+ def get_archive_list(self):
+ archive_list = []
+ for a in self.archives:
+ archive = self.archives[a]
+ aobj = {
+ "ArchiveId": a,
+ "ArchiveDescription": archive["description"],
+ "CreationDate": archive["creation_date"],
+ "Size": archive["size"],
+ "SHA256TreeHash": archive["sha256"],
+ }
+ archive_list.append(aobj)
+ return archive_list
+
+ def delete_archive(self, archive_id):
+ return self.archives.pop(archive_id)
+
+ def initiate_job(self, job_type, tier, archive_id):
+ job_id = get_job_id()
+
+ if job_type == "inventory-retrieval":
+ job = InventoryJob(job_id, tier, self.arn)
+ elif job_type == "archive-retrieval":
+ job = ArchiveJob(job_id, tier, self.arn, archive_id)
+
+ self.jobs[job_id] = job
+ return job_id
+
+ def list_jobs(self):
+ return self.jobs.values()
+
+ def describe_job(self, job_id):
+ return self.jobs.get(job_id)
+
+ def job_ready(self, job_id):
+ job = self.describe_job(job_id)
+ jobj = job.to_dict()
+ return jobj["Completed"]
+
+ def get_job_output(self, job_id):
+ job = self.describe_job(job_id)
+ jobj = job.to_dict()
+ if jobj["Action"] == "InventoryRetrieval":
+ archives = self.get_archive_list()
+ return {
+ "VaultARN": self.arn,
+ "InventoryDate": jobj["CompletionDate"],
+ "ArchiveList": archives,
+ }
+ else:
+ archive_body = self.get_archive_body(job.archive_id)
+ return archive_body
+
+
+class GlacierBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.vaults = {}
+
+ def get_vault(self, vault_name):
+ return self.vaults[vault_name]
+
+ def create_vault(self, vault_name):
+ self.vaults[vault_name] = Vault(vault_name, self.region_name)
+
+ def list_vaults(self):
+ return self.vaults.values()
+
+ def delete_vault(self, vault_name):
+ self.vaults.pop(vault_name)
+
+ def initiate_job(self, vault_name, job_type, tier, archive_id):
+ vault = self.get_vault(vault_name)
+ job_id = vault.initiate_job(job_type, tier, archive_id)
+ return job_id
+
+ def describe_job(self, vault_name, archive_id):
+ vault = self.get_vault(vault_name)
+ return vault.describe_job(archive_id)
+
+ def list_jobs(self, vault_name):
+ vault = self.get_vault(vault_name)
+ return vault.list_jobs()
+
+ def get_job_output(self, vault_name, job_id):
+ vault = self.get_vault(vault_name)
+ if vault.job_ready(job_id):
+ return vault.get_job_output(job_id)
+ else:
+ return None
+
+ def upload_archive(self, vault_name, body, description):
+ vault = self.get_vault(vault_name)
+ return vault.create_archive(body, description)
+
+
+glacier_backends = BackendDict(GlacierBackend, "glacier")
diff --git a/contrib/python/moto/py3/moto/glacier/responses.py b/contrib/python/moto/py3/moto/glacier/responses.py
new file mode 100644
index 0000000000..334e737bdb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glacier/responses.py
@@ -0,0 +1,163 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import glacier_backends
+from .utils import vault_from_glacier_url
+
+
+class GlacierResponse(BaseResponse):
+ @property
+ def glacier_backend(self):
+ return glacier_backends[self.region]
+
+ def all_vault_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._all_vault_response(headers)
+
+ def _all_vault_response(self, headers):
+ vaults = self.glacier_backend.list_vaults()
+ response = json.dumps(
+ {"Marker": None, "VaultList": [vault.to_dict() for vault in vaults]}
+ )
+
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def vault_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._vault_response(request, full_url, headers)
+
+ def _vault_response(self, request, full_url, headers):
+ method = request.method
+ vault_name = vault_from_glacier_url(full_url)
+
+ if method == "GET":
+ return self._vault_response_get(vault_name, headers)
+ elif method == "PUT":
+ return self._vault_response_put(vault_name, headers)
+ elif method == "DELETE":
+ return self._vault_response_delete(vault_name, headers)
+
+ def _vault_response_get(self, vault_name, headers):
+ vault = self.glacier_backend.get_vault(vault_name)
+ headers["content-type"] = "application/json"
+ return 200, headers, json.dumps(vault.to_dict())
+
+ def _vault_response_put(self, vault_name, headers):
+ self.glacier_backend.create_vault(vault_name)
+ return 201, headers, ""
+
+ def _vault_response_delete(self, vault_name, headers):
+ self.glacier_backend.delete_vault(vault_name)
+ return 204, headers, ""
+
+ def vault_archive_response(self, request, full_url, headers):
+ return self._vault_archive_response(request, full_url, headers)
+
+ def _vault_archive_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ description = ""
+ if "x-amz-archive-description" in request.headers:
+ description = request.headers["x-amz-archive-description"]
+ vault_name = full_url.split("/")[-2]
+
+ if method == "POST":
+ return self._vault_archive_response_post(
+ vault_name, body, description, headers
+ )
+ else:
+ return 400, headers, "400 Bad Request"
+
+ def _vault_archive_response_post(self, vault_name, body, description, headers):
+ vault = self.glacier_backend.upload_archive(vault_name, body, description)
+ headers["x-amz-archive-id"] = vault["archive_id"]
+ headers["x-amz-sha256-tree-hash"] = vault["sha256"]
+ return 201, headers, ""
+
+ def vault_archive_individual_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._vault_archive_individual_response(request, full_url, headers)
+
+ def _vault_archive_individual_response(self, request, full_url, headers):
+ method = request.method
+ vault_name = full_url.split("/")[-3]
+ archive_id = full_url.split("/")[-1]
+
+ if method == "DELETE":
+ vault = self.glacier_backend.get_vault(vault_name)
+ vault.delete_archive(archive_id)
+ return 204, headers, ""
+
+ def vault_jobs_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._vault_jobs_response(request, full_url, headers)
+
+ def _vault_jobs_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ account_id = full_url.split("/")[1]
+ vault_name = full_url.split("/")[-2]
+
+ if method == "GET":
+ jobs = self.glacier_backend.list_jobs(vault_name)
+ headers["content-type"] = "application/json"
+ return (
+ 200,
+ headers,
+ json.dumps(
+ {"JobList": [job.to_dict() for job in jobs], "Marker": None}
+ ),
+ )
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ job_type = json_body["Type"]
+ archive_id = None
+ if "ArchiveId" in json_body:
+ archive_id = json_body["ArchiveId"]
+ if "Tier" in json_body:
+ tier = json_body["Tier"]
+ else:
+ tier = "Standard"
+ job_id = self.glacier_backend.initiate_job(
+ vault_name, job_type, tier, archive_id
+ )
+ headers["x-amz-job-id"] = job_id
+ headers["Location"] = "/{0}/vaults/{1}/jobs/{2}".format(
+ account_id, vault_name, job_id
+ )
+ return 202, headers, ""
+
+ def vault_jobs_individual_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._vault_jobs_individual_response(full_url, headers)
+
+ def _vault_jobs_individual_response(self, full_url, headers):
+ vault_name = full_url.split("/")[-3]
+ archive_id = full_url.split("/")[-1]
+
+ job = self.glacier_backend.describe_job(vault_name, archive_id)
+ return 200, headers, json.dumps(job.to_dict())
+
+ def vault_jobs_output_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ return self._vault_jobs_output_response(full_url, headers)
+
+ def _vault_jobs_output_response(self, full_url, headers):
+ vault_name = full_url.split("/")[-4]
+ job_id = full_url.split("/")[-2]
+ output = self.glacier_backend.get_job_output(vault_name, job_id)
+ if output is None:
+ return 404, headers, "404 Not Found"
+ if isinstance(output, dict):
+ headers["content-type"] = "application/json"
+ return 200, headers, json.dumps(output)
+ else:
+ headers["content-type"] = "application/octet-stream"
+ return 200, headers, output
diff --git a/contrib/python/moto/py3/moto/glacier/urls.py b/contrib/python/moto/py3/moto/glacier/urls.py
new file mode 100644
index 0000000000..1c35c11409
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glacier/urls.py
@@ -0,0 +1,15 @@
+from .responses import GlacierResponse
+
+url_bases = [r"https?://glacier\.(.+)\.amazonaws.com"]
+
+response = GlacierResponse()
+
+url_paths = {
+ "{0}/(?P<account_number>.+)/vaults$": response.all_vault_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>[^/]+)$": response.vault_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>.+)/archives$": response.vault_archive_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>.+)/archives/(?P<archive_id>.+)$": response.vault_archive_individual_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>.+)/jobs$": response.vault_jobs_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>.+)/jobs/(?P<job_id>[^/.]+)$": response.vault_jobs_individual_response,
+ "{0}/(?P<account_number>.+)/vaults/(?P<vault_name>.+)/jobs/(?P<job_id>.+)/output$": response.vault_jobs_output_response,
+}
diff --git a/contrib/python/moto/py3/moto/glacier/utils.py b/contrib/python/moto/py3/moto/glacier/utils.py
new file mode 100644
index 0000000000..8c1ec9db37
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glacier/utils.py
@@ -0,0 +1,12 @@
+import random
+import string
+
+
+def vault_from_glacier_url(full_url):
+ return full_url.split("/")[-1]
+
+
+def get_job_id():
+ return "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(92)
+ )
diff --git a/contrib/python/moto/py3/moto/glue/__init__.py b/contrib/python/moto/py3/moto/glue/__init__.py
new file mode 100644
index 0000000000..ec47f973c8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/__init__.py
@@ -0,0 +1,4 @@
+from .models import glue_backends
+from ..core.models import base_decorator
+
+mock_glue = base_decorator(glue_backends)
diff --git a/contrib/python/moto/py3/moto/glue/exceptions.py b/contrib/python/moto/py3/moto/glue/exceptions.py
new file mode 100644
index 0000000000..003734b11b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/exceptions.py
@@ -0,0 +1,99 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class GlueClientError(JsonRESTError):
+ code = 400
+
+
+class AlreadyExistsException(GlueClientError):
+ def __init__(self, typ):
+ super().__init__("AlreadyExistsException", "%s already exists." % (typ))
+
+
+class DatabaseAlreadyExistsException(AlreadyExistsException):
+ def __init__(self):
+ super().__init__("Database")
+
+
+class TableAlreadyExistsException(AlreadyExistsException):
+ def __init__(self):
+ super().__init__("Table")
+
+
+class PartitionAlreadyExistsException(AlreadyExistsException):
+ def __init__(self):
+ super().__init__("Partition")
+
+
+class CrawlerAlreadyExistsException(AlreadyExistsException):
+ def __init__(self):
+ super().__init__("Crawler")
+
+
+class EntityNotFoundException(GlueClientError):
+ def __init__(self, msg):
+ super().__init__("EntityNotFoundException", msg)
+
+
+class DatabaseNotFoundException(EntityNotFoundException):
+ def __init__(self, db):
+ super().__init__("Database %s not found." % db)
+
+
+class TableNotFoundException(EntityNotFoundException):
+ def __init__(self, tbl):
+ super().__init__("Table %s not found." % tbl)
+
+
+class PartitionNotFoundException(EntityNotFoundException):
+ def __init__(self):
+ super().__init__("Cannot find partition.")
+
+
+class CrawlerNotFoundException(EntityNotFoundException):
+ def __init__(self, crawler):
+ super().__init__("Crawler %s not found." % crawler)
+
+
+class JobNotFoundException(EntityNotFoundException):
+ def __init__(self, job):
+ super().__init__("Job %s not found." % job)
+
+
+class VersionNotFoundException(EntityNotFoundException):
+ def __init__(self):
+ super().__init__("Version not found.")
+
+
+class CrawlerRunningException(GlueClientError):
+ def __init__(self, msg):
+ super().__init__("CrawlerRunningException", msg)
+
+
+class CrawlerNotRunningException(GlueClientError):
+ def __init__(self, msg):
+ super().__init__("CrawlerNotRunningException", msg)
+
+
+class ConcurrentRunsExceededException(GlueClientError):
+ def __init__(self, msg):
+ super().__init__("ConcurrentRunsExceededException", msg)
+
+
+class _InvalidOperationException(GlueClientError):
+ def __init__(self, error_type, op, msg):
+ super().__init__(
+ error_type,
+ "An error occurred (%s) when calling the %s operation: %s"
+ % (error_type, op, msg),
+ )
+
+
+class InvalidInputException(_InvalidOperationException):
+ def __init__(self, op, msg):
+ super().__init__("InvalidInputException", op, msg)
+
+
+class InvalidStateException(_InvalidOperationException):
+ def __init__(self, op, msg):
+ super().__init__("InvalidStateException", op, msg)
diff --git a/contrib/python/moto/py3/moto/glue/models.py b/contrib/python/moto/py3/moto/glue/models.py
new file mode 100644
index 0000000000..0f14670724
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/models.py
@@ -0,0 +1,632 @@
+import time
+from collections import OrderedDict
+from datetime import datetime
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.models import get_account_id
+from moto.core.utils import BackendDict
+from moto.glue.exceptions import CrawlerRunningException, CrawlerNotRunningException
+from .exceptions import (
+ JsonRESTError,
+ CrawlerAlreadyExistsException,
+ CrawlerNotFoundException,
+ DatabaseAlreadyExistsException,
+ DatabaseNotFoundException,
+ TableAlreadyExistsException,
+ TableNotFoundException,
+ PartitionAlreadyExistsException,
+ PartitionNotFoundException,
+ VersionNotFoundException,
+ JobNotFoundException,
+ ConcurrentRunsExceededException,
+)
+from .utils import PartitionFilter
+from ..utilities.paginator import paginate
+from ..utilities.tagging_service import TaggingService
+
+
+class GlueBackend(BaseBackend):
+ PAGINATION_MODEL = {
+ "list_crawlers": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ "list_jobs": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "name",
+ },
+ }
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.databases = OrderedDict()
+ self.crawlers = OrderedDict()
+ self.jobs = OrderedDict()
+ self.job_runs = OrderedDict()
+ self.tagger = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "glue"
+ )
+
+ def create_database(self, database_name, database_input):
+ if database_name in self.databases:
+ raise DatabaseAlreadyExistsException()
+
+ database = FakeDatabase(database_name, database_input)
+ self.databases[database_name] = database
+ return database
+
+ def get_database(self, database_name):
+ try:
+ return self.databases[database_name]
+ except KeyError:
+ raise DatabaseNotFoundException(database_name)
+
+ def get_databases(self):
+ return [self.databases[key] for key in self.databases] if self.databases else []
+
+ def delete_database(self, database_name):
+ if database_name not in self.databases:
+ raise DatabaseNotFoundException(database_name)
+ del self.databases[database_name]
+
+ def create_table(self, database_name, table_name, table_input):
+ database = self.get_database(database_name)
+
+ if table_name in database.tables:
+ raise TableAlreadyExistsException()
+
+ table = FakeTable(database_name, table_name, table_input)
+ database.tables[table_name] = table
+ return table
+
+ def get_table(self, database_name, table_name):
+ database = self.get_database(database_name)
+ try:
+ return database.tables[table_name]
+ except KeyError:
+ raise TableNotFoundException(table_name)
+
+ def get_tables(self, database_name):
+ database = self.get_database(database_name)
+ return [table for table_name, table in database.tables.items()]
+
+ def delete_table(self, database_name, table_name):
+ database = self.get_database(database_name)
+ try:
+ del database.tables[table_name]
+ except KeyError:
+ raise TableNotFoundException(table_name)
+ return {}
+
+ def create_crawler(
+ self,
+ name,
+ role,
+ database_name,
+ description,
+ targets,
+ schedule,
+ classifiers,
+ table_prefix,
+ schema_change_policy,
+ recrawl_policy,
+ lineage_configuration,
+ configuration,
+ crawler_security_configuration,
+ tags,
+ ):
+ if name in self.crawlers:
+ raise CrawlerAlreadyExistsException()
+
+ crawler = FakeCrawler(
+ name=name,
+ role=role,
+ database_name=database_name,
+ description=description,
+ targets=targets,
+ schedule=schedule,
+ classifiers=classifiers,
+ table_prefix=table_prefix,
+ schema_change_policy=schema_change_policy,
+ recrawl_policy=recrawl_policy,
+ lineage_configuration=lineage_configuration,
+ configuration=configuration,
+ crawler_security_configuration=crawler_security_configuration,
+ tags=tags,
+ backend=self,
+ )
+ self.crawlers[name] = crawler
+
+ def get_crawler(self, name):
+ try:
+ return self.crawlers[name]
+ except KeyError:
+ raise CrawlerNotFoundException(name)
+
+ def get_crawlers(self):
+ return [self.crawlers[key] for key in self.crawlers] if self.crawlers else []
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_crawlers(self):
+ return [crawler for _, crawler in self.crawlers.items()]
+
+ def start_crawler(self, name):
+ crawler = self.get_crawler(name)
+ crawler.start_crawler()
+
+ def stop_crawler(self, name):
+ crawler = self.get_crawler(name)
+ crawler.stop_crawler()
+
+ def delete_crawler(self, name):
+ try:
+ del self.crawlers[name]
+ except KeyError:
+ raise CrawlerNotFoundException(name)
+
+ def create_job(
+ self,
+ name,
+ role,
+ command,
+ description,
+ log_uri,
+ execution_property,
+ default_arguments,
+ non_overridable_arguments,
+ connections,
+ max_retries,
+ allocated_capacity,
+ timeout,
+ max_capacity,
+ security_configuration,
+ tags,
+ notification_property,
+ glue_version,
+ number_of_workers,
+ worker_type,
+ ):
+ self.jobs[name] = FakeJob(
+ name,
+ role,
+ command,
+ description,
+ log_uri,
+ execution_property,
+ default_arguments,
+ non_overridable_arguments,
+ connections,
+ max_retries,
+ allocated_capacity,
+ timeout,
+ max_capacity,
+ security_configuration,
+ tags,
+ notification_property,
+ glue_version,
+ number_of_workers,
+ worker_type,
+ backend=self,
+ )
+ return name
+
+ def get_job(self, name):
+ try:
+ return self.jobs[name]
+ except KeyError:
+ raise JobNotFoundException(name)
+
+ def start_job_run(self, name):
+ job = self.get_job(name)
+ return job.start_job_run()
+
+ def get_job_run(self, name, run_id):
+ job = self.get_job(name)
+ return job.get_job_run(run_id)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_jobs(self):
+ return [job for _, job in self.jobs.items()]
+
+ def get_tags(self, resource_id):
+ return self.tagger.get_tag_dict_for_resource(resource_id)
+
+ def tag_resource(self, resource_arn, tags):
+ tags = TaggingService.convert_dict_to_tags_input(tags or {})
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+
+class FakeDatabase(BaseModel):
+ def __init__(self, database_name, database_input):
+ self.name = database_name
+ self.input = database_input
+ self.created_time = datetime.utcnow()
+ self.tables = OrderedDict()
+
+ def as_dict(self):
+ return {
+ "Name": self.name,
+ "Description": self.input.get("Description"),
+ "LocationUri": self.input.get("LocationUri"),
+ "Parameters": self.input.get("Parameters"),
+ "CreateTime": self.created_time.isoformat(),
+ "CreateTableDefaultPermissions": self.input.get(
+ "CreateTableDefaultPermissions"
+ ),
+ "TargetDatabase": self.input.get("TargetDatabase"),
+ "CatalogId": self.input.get("CatalogId"),
+ }
+
+
+class FakeTable(BaseModel):
+ def __init__(self, database_name, table_name, table_input):
+ self.database_name = database_name
+ self.name = table_name
+ self.partitions = OrderedDict()
+ self.versions = []
+ self.update(table_input)
+
+ def update(self, table_input):
+ self.versions.append(table_input)
+
+ def get_version(self, ver):
+ try:
+ if not isinstance(ver, int):
+ # "1" goes to [0]
+ ver = int(ver) - 1
+ except ValueError as e:
+ raise JsonRESTError("InvalidInputException", str(e))
+
+ try:
+ return self.versions[ver]
+ except IndexError:
+ raise VersionNotFoundException()
+
+ def as_dict(self, version=-1):
+ obj = {"DatabaseName": self.database_name, "Name": self.name}
+ obj.update(self.get_version(version))
+ return obj
+
+ def create_partition(self, partiton_input):
+ partition = FakePartition(self.database_name, self.name, partiton_input)
+ key = str(partition.values)
+ if key in self.partitions:
+ raise PartitionAlreadyExistsException()
+ self.partitions[str(partition.values)] = partition
+
+ def get_partitions(self, expression):
+ """See https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html
+ for supported expressions.
+
+ Expression caveats:
+
+ - Column names must consist of UPPERCASE, lowercase, dots and underscores only.
+ - Nanosecond expressions on timestamp columns are rounded to microseconds.
+ - Literal dates and timestamps must be valid, i.e. no support for February 31st.
+ - LIKE expressions are converted to Python regexes, escaping special characters.
+ Only % and _ wildcards are supported, and SQL escaping using [] does not work.
+ """
+ return list(filter(PartitionFilter(expression, self), self.partitions.values()))
+
+ def get_partition(self, values):
+ try:
+ return self.partitions[str(values)]
+ except KeyError:
+ raise PartitionNotFoundException()
+
+ def update_partition(self, old_values, partiton_input):
+ partition = FakePartition(self.database_name, self.name, partiton_input)
+ key = str(partition.values)
+ if old_values == partiton_input["Values"]:
+ # Altering a partition in place. Don't remove it so the order of
+ # returned partitions doesn't change
+ if key not in self.partitions:
+ raise PartitionNotFoundException()
+ else:
+ removed = self.partitions.pop(str(old_values), None)
+ if removed is None:
+ raise PartitionNotFoundException()
+ if key in self.partitions:
+ # Trying to update to overwrite a partition that exists
+ raise PartitionAlreadyExistsException()
+ self.partitions[key] = partition
+
+ def delete_partition(self, values):
+ try:
+ del self.partitions[str(values)]
+ except KeyError:
+ raise PartitionNotFoundException()
+
+
+class FakePartition(BaseModel):
+ def __init__(self, database_name, table_name, partiton_input):
+ self.creation_time = time.time()
+ self.database_name = database_name
+ self.table_name = table_name
+ self.partition_input = partiton_input
+ self.values = self.partition_input.get("Values", [])
+
+ def as_dict(self):
+ obj = {
+ "DatabaseName": self.database_name,
+ "TableName": self.table_name,
+ "CreationTime": self.creation_time,
+ }
+ obj.update(self.partition_input)
+ return obj
+
+
+class FakeCrawler(BaseModel):
+ def __init__(
+ self,
+ name,
+ role,
+ database_name,
+ description,
+ targets,
+ schedule,
+ classifiers,
+ table_prefix,
+ schema_change_policy,
+ recrawl_policy,
+ lineage_configuration,
+ configuration,
+ crawler_security_configuration,
+ tags,
+ backend,
+ ):
+ self.name = name
+ self.role = role
+ self.database_name = database_name
+ self.description = description
+ self.targets = targets
+ self.schedule = schedule
+ self.classifiers = classifiers
+ self.table_prefix = table_prefix
+ self.schema_change_policy = schema_change_policy
+ self.recrawl_policy = recrawl_policy
+ self.lineage_configuration = lineage_configuration
+ self.configuration = configuration
+ self.crawler_security_configuration = crawler_security_configuration
+ self.state = "READY"
+ self.creation_time = datetime.utcnow()
+ self.last_updated = self.creation_time
+ self.version = 1
+ self.crawl_elapsed_time = 0
+ self.last_crawl_info = None
+ self.arn = f"arn:aws:glue:us-east-1:{get_account_id()}:crawler/{self.name}"
+ self.backend = backend
+ self.backend.tag_resource(self.arn, tags)
+
+ def get_name(self):
+ return self.name
+
+ def as_dict(self):
+ last_crawl = self.last_crawl_info.as_dict() if self.last_crawl_info else None
+ data = {
+ "Name": self.name,
+ "Role": self.role,
+ "Targets": self.targets,
+ "DatabaseName": self.database_name,
+ "Description": self.description,
+ "Classifiers": self.classifiers,
+ "RecrawlPolicy": self.recrawl_policy,
+ "SchemaChangePolicy": self.schema_change_policy,
+ "LineageConfiguration": self.lineage_configuration,
+ "State": self.state,
+ "TablePrefix": self.table_prefix,
+ "CrawlElapsedTime": self.crawl_elapsed_time,
+ "CreationTime": self.creation_time.isoformat(),
+ "LastUpdated": self.last_updated.isoformat(),
+ "LastCrawl": last_crawl,
+ "Version": self.version,
+ "Configuration": self.configuration,
+ "CrawlerSecurityConfiguration": self.crawler_security_configuration,
+ }
+
+ if self.schedule:
+ data["Schedule"] = {
+ "ScheduleExpression": self.schedule,
+ "State": "SCHEDULED",
+ }
+
+ if self.last_crawl_info:
+ data["LastCrawl"] = self.last_crawl_info.as_dict()
+
+ return data
+
+ def start_crawler(self):
+ if self.state == "RUNNING":
+ raise CrawlerRunningException(
+ f"Crawler with name {self.name} has already started"
+ )
+ self.state = "RUNNING"
+
+ def stop_crawler(self):
+ if self.state != "RUNNING":
+ raise CrawlerNotRunningException(
+ f"Crawler with name {self.name} isn't running"
+ )
+ self.state = "STOPPING"
+
+
+class LastCrawlInfo(BaseModel):
+ def __init__(
+ self, error_message, log_group, log_stream, message_prefix, start_time, status
+ ):
+ self.error_message = error_message
+ self.log_group = log_group
+ self.log_stream = log_stream
+ self.message_prefix = message_prefix
+ self.start_time = start_time
+ self.status = status
+
+ def as_dict(self):
+ return {
+ "ErrorMessage": self.error_message,
+ "LogGroup": self.log_group,
+ "LogStream": self.log_stream,
+ "MessagePrefix": self.message_prefix,
+ "StartTime": self.start_time,
+ "Status": self.status,
+ }
+
+
+class FakeJob:
+ def __init__(
+ self,
+ name,
+ role,
+ command,
+ description=None,
+ log_uri=None,
+ execution_property=None,
+ default_arguments=None,
+ non_overridable_arguments=None,
+ connections=None,
+ max_retries=None,
+ allocated_capacity=None,
+ timeout=None,
+ max_capacity=None,
+ security_configuration=None,
+ tags=None,
+ notification_property=None,
+ glue_version=None,
+ number_of_workers=None,
+ worker_type=None,
+ backend=None,
+ ):
+ self.name = name
+ self.description = description
+ self.log_uri = log_uri
+ self.role = role
+ self.execution_property = execution_property
+ self.command = command
+ self.default_arguments = default_arguments
+ self.non_overridable_arguments = non_overridable_arguments
+ self.connections = connections
+ self.max_retries = max_retries
+ self.allocated_capacity = allocated_capacity
+ self.timeout = timeout
+ self.state = "READY"
+ self.max_capacity = max_capacity
+ self.security_configuration = security_configuration
+ self.notification_property = notification_property
+ self.glue_version = glue_version
+ self.number_of_workers = number_of_workers
+ self.worker_type = worker_type
+ self.created_on = datetime.utcnow()
+ self.last_modified_on = datetime.utcnow()
+ self.arn = f"arn:aws:glue:us-east-1:{get_account_id()}:job/{self.name}"
+ self.backend = backend
+ self.backend.tag_resource(self.arn, tags)
+
+ def get_name(self):
+ return self.name
+
+ def as_dict(self):
+ return {
+ "Name": self.name,
+ "Description": self.description,
+ "LogUri": self.log_uri,
+ "Role": self.role,
+ "CreatedOn": self.created_on.isoformat(),
+ "LastModifiedOn": self.last_modified_on.isoformat(),
+ "ExecutionProperty": self.execution_property,
+ "Command": self.command,
+ "DefaultArguments": self.default_arguments,
+ "NonOverridableArguments": self.non_overridable_arguments,
+ "Connections": self.connections,
+ "MaxRetries": self.max_retries,
+ "AllocatedCapacity": self.allocated_capacity,
+ "Timeout": self.timeout,
+ "MaxCapacity": self.max_capacity,
+ "WorkerType": self.worker_type,
+ "NumberOfWorkers": self.number_of_workers,
+ "SecurityConfiguration": self.security_configuration,
+ "NotificationProperty": self.notification_property,
+ "GlueVersion": self.glue_version,
+ }
+
+ def start_job_run(self):
+ if self.state == "RUNNING":
+ raise ConcurrentRunsExceededException(
+ f"Job with name {self.name} already running"
+ )
+ fake_job_run = FakeJobRun(job_name=self.name)
+ self.state = "RUNNING"
+ return fake_job_run.job_run_id
+
+ def get_job_run(self, run_id):
+ fake_job_run = FakeJobRun(job_name=self.name, job_run_id=run_id)
+ return fake_job_run
+
+
+class FakeJobRun:
+ def __init__(
+ self,
+ job_name: int,
+ job_run_id: str = "01",
+ arguments: dict = None,
+ allocated_capacity: int = None,
+ timeout: int = None,
+ worker_type: str = "Standard",
+ ):
+ self.job_name = job_name
+ self.job_run_id = job_run_id
+ self.arguments = arguments
+ self.allocated_capacity = allocated_capacity
+ self.timeout = timeout
+ self.worker_type = worker_type
+ self.started_on = datetime.utcnow()
+ self.modified_on = datetime.utcnow()
+ self.completed_on = datetime.utcnow()
+
+ def get_name(self):
+ return self.job_name
+
+ def as_dict(self):
+ return {
+ "Id": self.job_run_id,
+ "Attempt": 1,
+ "PreviousRunId": "01",
+ "TriggerName": "test_trigger",
+ "JobName": self.job_name,
+ "StartedOn": self.started_on.isoformat(),
+ "LastModifiedOn": self.modified_on.isoformat(),
+ "CompletedOn": self.completed_on.isoformat(),
+ "JobRunState": "SUCCEEDED",
+ "Arguments": self.arguments or {"runSpark": "spark -f test_file.py"},
+ "ErrorMessage": "",
+ "PredecessorRuns": [
+ {"JobName": "string", "RunId": "string"},
+ ],
+ "AllocatedCapacity": self.allocated_capacity or 123,
+ "ExecutionTime": 123,
+ "Timeout": self.timeout or 123,
+ "MaxCapacity": 123.0,
+ "WorkerType": self.worker_type,
+ "NumberOfWorkers": 123,
+ "SecurityConfiguration": "string",
+ "LogGroupName": "test/log",
+ "NotificationProperty": {"NotifyDelayAfter": 123},
+ "GlueVersion": "0.9",
+ }
+
+
+glue_backends = BackendDict(
+ GlueBackend, "glue", use_boto3_regions=False, additional_regions=["global"]
+)
+glue_backend = glue_backends["global"]
diff --git a/contrib/python/moto/py3/moto/glue/responses.py b/contrib/python/moto/py3/moto/glue/responses.py
new file mode 100644
index 0000000000..4c6b86fd45
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/responses.py
@@ -0,0 +1,454 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .exceptions import (
+ PartitionAlreadyExistsException,
+ PartitionNotFoundException,
+ TableNotFoundException,
+)
+from .models import glue_backend
+
+
+class GlueResponse(BaseResponse):
+ @property
+ def glue_backend(self):
+ return glue_backend
+
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ def create_database(self):
+ database_input = self.parameters.get("DatabaseInput")
+ database_name = database_input.get("Name")
+ self.glue_backend.create_database(database_name, database_input)
+ return ""
+
+ def get_database(self):
+ database_name = self.parameters.get("Name")
+ database = self.glue_backend.get_database(database_name)
+ return json.dumps({"Database": database.as_dict()})
+
+ def get_databases(self):
+ database_list = self.glue_backend.get_databases()
+ return json.dumps(
+ {"DatabaseList": [database.as_dict() for database in database_list]}
+ )
+
+ def delete_database(self):
+ name = self.parameters.get("Name")
+ self.glue_backend.delete_database(name)
+ return json.dumps({})
+
+ def create_table(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_input = self.parameters.get("TableInput")
+ table_name = table_input.get("Name")
+ self.glue_backend.create_table(database_name, table_name, table_input)
+ return ""
+
+ def get_table(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("Name")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ return json.dumps({"Table": table.as_dict()})
+
+ def update_table(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_input = self.parameters.get("TableInput")
+ table_name = table_input.get("Name")
+ table = self.glue_backend.get_table(database_name, table_name)
+ table.update(table_input)
+ return ""
+
+ def get_table_versions(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ return json.dumps(
+ {
+ "TableVersions": [
+ {"Table": table.as_dict(version=n), "VersionId": str(n + 1)}
+ for n in range(len(table.versions))
+ ]
+ }
+ )
+
+ def get_table_version(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ table = self.glue_backend.get_table(database_name, table_name)
+ ver_id = self.parameters.get("VersionId")
+
+ return json.dumps(
+ {
+ "TableVersion": {
+ "Table": table.as_dict(version=ver_id),
+ "VersionId": ver_id,
+ }
+ }
+ )
+
+ def get_tables(self):
+ database_name = self.parameters.get("DatabaseName")
+ tables = self.glue_backend.get_tables(database_name)
+ return json.dumps({"TableList": [table.as_dict() for table in tables]})
+
+ def delete_table(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("Name")
+ resp = self.glue_backend.delete_table(database_name, table_name)
+ return json.dumps(resp)
+
+ def batch_delete_table(self):
+ database_name = self.parameters.get("DatabaseName")
+
+ errors = []
+ for table_name in self.parameters.get("TablesToDelete"):
+ try:
+ self.glue_backend.delete_table(database_name, table_name)
+ except TableNotFoundException:
+ errors.append(
+ {
+ "TableName": table_name,
+ "ErrorDetail": {
+ "ErrorCode": "EntityNotFoundException",
+ "ErrorMessage": "Table not found",
+ },
+ }
+ )
+
+ out = {}
+ if errors:
+ out["Errors"] = errors
+
+ return json.dumps(out)
+
+ def get_partitions(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ expression = self.parameters.get("Expression")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ return json.dumps(
+ {"Partitions": [p.as_dict() for p in table.get_partitions(expression)]}
+ )
+
+ def get_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ values = self.parameters.get("PartitionValues")
+
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ p = table.get_partition(values)
+
+ return json.dumps({"Partition": p.as_dict()})
+
+ def batch_get_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ partitions_to_get = self.parameters.get("PartitionsToGet")
+
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ partitions = []
+ for values in partitions_to_get:
+ try:
+ p = table.get_partition(values=values["Values"])
+ partitions.append(p.as_dict())
+ except PartitionNotFoundException:
+ continue
+
+ return json.dumps({"Partitions": partitions})
+
+ def create_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ part_input = self.parameters.get("PartitionInput")
+
+ table = self.glue_backend.get_table(database_name, table_name)
+ table.create_partition(part_input)
+
+ return ""
+
+ def batch_create_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ errors_output = []
+ for part_input in self.parameters.get("PartitionInputList"):
+ try:
+ table.create_partition(part_input)
+ except PartitionAlreadyExistsException:
+ errors_output.append(
+ {
+ "PartitionValues": part_input["Values"],
+ "ErrorDetail": {
+ "ErrorCode": "AlreadyExistsException",
+ "ErrorMessage": "Partition already exists.",
+ },
+ }
+ )
+
+ out = {}
+ if errors_output:
+ out["Errors"] = errors_output
+
+ return json.dumps(out)
+
+ def update_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ part_input = self.parameters.get("PartitionInput")
+ part_to_update = self.parameters.get("PartitionValueList")
+
+ table = self.glue_backend.get_table(database_name, table_name)
+ table.update_partition(part_to_update, part_input)
+
+ return ""
+
+ def batch_update_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ errors_output = []
+ for entry in self.parameters.get("Entries"):
+ part_to_update = entry["PartitionValueList"]
+ part_input = entry["PartitionInput"]
+
+ try:
+ table.update_partition(part_to_update, part_input)
+ except PartitionNotFoundException:
+ errors_output.append(
+ {
+ "PartitionValueList": part_to_update,
+ "ErrorDetail": {
+ "ErrorCode": "EntityNotFoundException",
+ "ErrorMessage": "Partition not found.",
+ },
+ }
+ )
+
+ out = {}
+ if errors_output:
+ out["Errors"] = errors_output
+
+ return json.dumps(out)
+
+ def delete_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ part_to_delete = self.parameters.get("PartitionValues")
+
+ table = self.glue_backend.get_table(database_name, table_name)
+ table.delete_partition(part_to_delete)
+
+ return ""
+
+ def batch_delete_partition(self):
+ database_name = self.parameters.get("DatabaseName")
+ table_name = self.parameters.get("TableName")
+ table = self.glue_backend.get_table(database_name, table_name)
+
+ errors_output = []
+ for part_input in self.parameters.get("PartitionsToDelete"):
+ values = part_input.get("Values")
+ try:
+ table.delete_partition(values)
+ except PartitionNotFoundException:
+ errors_output.append(
+ {
+ "PartitionValues": values,
+ "ErrorDetail": {
+ "ErrorCode": "EntityNotFoundException",
+ "ErrorMessage": "Partition not found",
+ },
+ }
+ )
+
+ out = {}
+ if errors_output:
+ out["Errors"] = errors_output
+
+ return json.dumps(out)
+
+ def create_crawler(self):
+ self.glue_backend.create_crawler(
+ name=self.parameters.get("Name"),
+ role=self.parameters.get("Role"),
+ database_name=self.parameters.get("DatabaseName"),
+ description=self.parameters.get("Description"),
+ targets=self.parameters.get("Targets"),
+ schedule=self.parameters.get("Schedule"),
+ classifiers=self.parameters.get("Classifiers"),
+ table_prefix=self.parameters.get("TablePrefix"),
+ schema_change_policy=self.parameters.get("SchemaChangePolicy"),
+ recrawl_policy=self.parameters.get("RecrawlPolicy"),
+ lineage_configuration=self.parameters.get("LineageConfiguration"),
+ configuration=self.parameters.get("Configuration"),
+ crawler_security_configuration=self.parameters.get(
+ "CrawlerSecurityConfiguration"
+ ),
+ tags=self.parameters.get("Tags"),
+ )
+ return ""
+
+ def get_crawler(self):
+ name = self.parameters.get("Name")
+ crawler = self.glue_backend.get_crawler(name)
+ return json.dumps({"Crawler": crawler.as_dict()})
+
+ def get_crawlers(self):
+ crawlers = self.glue_backend.get_crawlers()
+ return json.dumps({"Crawlers": [crawler.as_dict() for crawler in crawlers]})
+
+ def list_crawlers(self):
+ next_token = self._get_param("NextToken")
+ max_results = self._get_int_param("MaxResults")
+ tags = self._get_param("Tags")
+ crawlers, next_token = self.glue_backend.list_crawlers(
+ next_token=next_token, max_results=max_results
+ )
+ filtered_crawler_names = self.filter_crawlers_by_tags(crawlers, tags)
+ return json.dumps(
+ dict(
+ CrawlerNames=[crawler_name for crawler_name in filtered_crawler_names],
+ NextToken=next_token,
+ )
+ )
+
+ def filter_crawlers_by_tags(self, crawlers, tags):
+ if not tags:
+ return [crawler.get_name() for crawler in crawlers]
+ return [
+ crawler.get_name()
+ for crawler in crawlers
+ if self.is_tags_match(self, crawler.arn, tags)
+ ]
+
+ def start_crawler(self):
+ name = self.parameters.get("Name")
+ self.glue_backend.start_crawler(name)
+ return ""
+
+ def stop_crawler(self):
+ name = self.parameters.get("Name")
+ self.glue_backend.stop_crawler(name)
+ return ""
+
+ def delete_crawler(self):
+ name = self.parameters.get("Name")
+ self.glue_backend.delete_crawler(name)
+ return ""
+
+ def create_job(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ log_uri = self._get_param("LogUri")
+ role = self._get_param("Role")
+ execution_property = self._get_param("ExecutionProperty")
+ command = self._get_param("Command")
+ default_arguments = self._get_param("DefaultArguments")
+ non_overridable_arguments = self._get_param("NonOverridableArguments")
+ connections = self._get_param("Connections")
+ max_retries = self._get_int_param("MaxRetries")
+ allocated_capacity = self._get_int_param("AllocatedCapacity")
+ timeout = self._get_int_param("Timeout")
+ max_capacity = self._get_param("MaxCapacity")
+ security_configuration = self._get_param("SecurityConfiguration")
+ tags = self._get_param("Tags")
+ notification_property = self._get_param("NotificationProperty")
+ glue_version = self._get_param("GlueVersion")
+ number_of_workers = self._get_int_param("NumberOfWorkers")
+ worker_type = self._get_param("WorkerType")
+ name = self.glue_backend.create_job(
+ name=name,
+ description=description,
+ log_uri=log_uri,
+ role=role,
+ execution_property=execution_property,
+ command=command,
+ default_arguments=default_arguments,
+ non_overridable_arguments=non_overridable_arguments,
+ connections=connections,
+ max_retries=max_retries,
+ allocated_capacity=allocated_capacity,
+ timeout=timeout,
+ max_capacity=max_capacity,
+ security_configuration=security_configuration,
+ tags=tags,
+ notification_property=notification_property,
+ glue_version=glue_version,
+ number_of_workers=number_of_workers,
+ worker_type=worker_type,
+ )
+ return json.dumps(dict(Name=name))
+
+ def get_job(self):
+ name = self.parameters.get("JobName")
+ job = self.glue_backend.get_job(name)
+ return json.dumps({"Job": job.as_dict()})
+
+ def start_job_run(self):
+ name = self.parameters.get("JobName")
+ job_run_id = self.glue_backend.start_job_run(name)
+ return json.dumps(dict(JobRunId=job_run_id))
+
+ def get_job_run(self):
+ name = self.parameters.get("JobName")
+ run_id = self.parameters.get("RunId")
+ job_run = self.glue_backend.get_job_run(name, run_id)
+ return json.dumps({"JobRun": job_run.as_dict()})
+
+ def list_jobs(self):
+ next_token = self._get_param("NextToken")
+ max_results = self._get_int_param("MaxResults")
+ tags = self._get_param("Tags")
+ jobs, next_token = self.glue_backend.list_jobs(
+ next_token=next_token, max_results=max_results
+ )
+ filtered_job_names = self.filter_jobs_by_tags(jobs, tags)
+ return json.dumps(
+ dict(
+ JobNames=[job_name for job_name in filtered_job_names],
+ NextToken=next_token,
+ )
+ )
+
+ def get_tags(self):
+ resource_arn = self.parameters.get("ResourceArn")
+ tags = self.glue_backend.get_tags(resource_arn)
+ return 200, {}, json.dumps({"Tags": tags})
+
+ def tag_resource(self):
+ resource_arn = self.parameters.get("ResourceArn")
+ tags = self.parameters.get("TagsToAdd", {})
+ self.glue_backend.tag_resource(resource_arn, tags)
+ return 201, {}, "{}"
+
+ def untag_resource(self):
+ resource_arn = self._get_param("ResourceArn")
+ tag_keys = self.parameters.get("TagsToRemove")
+ self.glue_backend.untag_resource(resource_arn, tag_keys)
+ return 200, {}, "{}"
+
+ def filter_jobs_by_tags(self, jobs, tags):
+ if not tags:
+ return [job.get_name() for job in jobs]
+ return [
+ job.get_name() for job in jobs if self.is_tags_match(self, job.arn, tags)
+ ]
+
+ @staticmethod
+ def is_tags_match(self, resource_arn, tags):
+ glue_resource_tags = self.glue_backend.get_tags(resource_arn)
+ mutual_keys = set(glue_resource_tags).intersection(tags)
+ for key in mutual_keys:
+ if glue_resource_tags[key] == tags[key]:
+ return True
+ return False
diff --git a/contrib/python/moto/py3/moto/glue/urls.py b/contrib/python/moto/py3/moto/glue/urls.py
new file mode 100644
index 0000000000..8e038f9635
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/urls.py
@@ -0,0 +1,5 @@
+from .responses import GlueResponse
+
+url_bases = [r"https?://glue\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": GlueResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/glue/utils.py b/contrib/python/moto/py3/moto/glue/utils.py
new file mode 100644
index 0000000000..99f0394050
--- /dev/null
+++ b/contrib/python/moto/py3/moto/glue/utils.py
@@ -0,0 +1,354 @@
+import abc
+import operator
+import re
+import warnings
+from datetime import date, datetime, timedelta
+from itertools import repeat
+from typing import Any, Dict, List, Optional, Union
+
+from pyparsing import (
+ CaselessKeyword,
+ Forward,
+ OpAssoc,
+ ParserElement,
+ ParseResults,
+ QuotedString,
+ Suppress,
+ Word,
+ alphanums,
+ delimited_list,
+ exceptions,
+ infix_notation,
+ one_of,
+ pyparsing_common,
+)
+
+from .exceptions import InvalidInputException, InvalidStateException
+
+
+def _cast(type_: str, value: Any) -> Union[date, datetime, float, int, str]:
+ # values are always cast from string to target type
+ value = str(value)
+
+ if type_ in ("bigint", "int", "smallint", "tinyint"):
+ try:
+ return int(value) # no size is enforced
+ except ValueError:
+ raise ValueError(f'"{value}" is not an integer.')
+
+ if type_ == "decimal":
+ try:
+ return float(value)
+ except ValueError:
+ raise ValueError(f"{value} is not a decimal.")
+
+ if type_ in ("char", "string", "varchar"):
+ return value # no length is enforced
+
+ if type_ == "date":
+ try:
+ return datetime.strptime(value, "%Y-%m-%d").date()
+ except ValueError:
+ raise ValueError(f"{value} is not a date.")
+
+ if type_ == "timestamp":
+ match = re.search(
+ r"^(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})"
+ r"(?P<nanos>\.\d{1,9})?$",
+ value,
+ )
+ if match is None:
+ raise ValueError(
+ "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]"
+ f" {value} is not a timestamp."
+ )
+
+ try:
+ timestamp = datetime.strptime(match.group("timestamp"), "%Y-%m-%d %H:%M:%S")
+ except ValueError:
+ raise ValueError(
+ "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]"
+ f" {value} is not a timestamp."
+ )
+
+ nanos = match.group("nanos")
+ if nanos is not None:
+ # strip leading dot, reverse and left pad with zeros to nanoseconds
+ nanos = "".join(reversed(nanos[1:])).zfill(9)
+ for i, nanoseconds in enumerate(nanos):
+ microseconds = (int(nanoseconds) * 10**i) / 1000
+ timestamp += timedelta(microseconds=round(microseconds))
+
+ return timestamp
+
+ raise InvalidInputException("GetPartitions", f"Unknown type : '{type_}'")
+
+
+def _escape_regex(pattern: str) -> str:
+ """Taken from Python 3.7 to avoid escaping '%'."""
+ _special_chars_map = {i: "\\" + chr(i) for i in b"()[]{}?*+-|^$\\.&~# \t\n\r\v\f"}
+ return pattern.translate(_special_chars_map)
+
+
+class _Expr(abc.ABC):
+ @abc.abstractmethod
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> Any:
+ raise NotImplementedError()
+
+
+class _Ident(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: str = tokens[0]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> Any:
+ try:
+ return self._eval(part_keys, part_input)
+ except ValueError as e:
+ # existing partition values cannot be cast to current schema
+ raise InvalidStateException("GetPartitions", str(e))
+
+ def leval(self, part_keys: List[Dict[str, str]], literal: Any) -> Any:
+ # evaluate literal by simulating partition input
+ try:
+ return self._eval(part_keys, part_input={"Values": repeat(literal)})
+ except ValueError as e:
+ # expression literal cannot be cast to current schema
+ raise InvalidInputException("GetPartitions", str(e))
+
+ def type_(self, part_keys: List[Dict[str, str]]) -> str:
+ for key in part_keys:
+ if self.ident == key["Name"]:
+ return key["Type"]
+
+ raise InvalidInputException("GetPartitions", f"Unknown column '{self.ident}'")
+
+ def _eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> Any:
+ for key, value in zip(part_keys, part_input["Values"]):
+ if self.ident == key["Name"]:
+ return _cast(key["Type"], value)
+
+ # also raised for unpartitioned tables
+ raise InvalidInputException("GetPartitions", f"Unknown column '{self.ident}'")
+
+
+class _IsNull(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: _Ident = tokens[0]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return self.ident.eval(part_keys, part_input) is None
+
+
+class _IsNotNull(_IsNull):
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return not super().eval(part_keys, part_input)
+
+
+class _BinOp(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: _Ident = tokens[0]
+ self.bin_op: str = tokens[1]
+ self.literal: Any = tokens[2]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ ident = self.ident.eval(part_keys, part_input)
+
+ # simulate partition input for the lateral
+ rhs = self.ident.leval(part_keys, self.literal)
+
+ return {
+ "<>": operator.ne,
+ ">=": operator.ge,
+ "<=": operator.le,
+ ">": operator.gt,
+ "<": operator.lt,
+ "=": operator.eq,
+ }[self.bin_op](ident, rhs)
+
+
+class _Like(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: _Ident = tokens[0]
+ self.literal: str = tokens[2]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ type_ = self.ident.type_(part_keys)
+ if type_ in ("bigint", "int", "smallint", "tinyint"):
+ raise InvalidInputException(
+ "GetPartitions", "Integral data type doesn't support operation 'LIKE'"
+ )
+
+ if type_ in ("date", "decimal", "timestamp"):
+ raise InvalidInputException(
+ "GetPartitions",
+ f"{type_[0].upper()}{type_[1:]} data type"
+ " doesn't support operation 'LIKE'",
+ )
+
+ ident = self.ident.eval(part_keys, part_input)
+ assert isinstance(ident, str)
+
+ pattern = _cast("string", self.literal)
+
+ # prepare SQL pattern for conversion to regex pattern
+ pattern = _escape_regex(pattern)
+
+ # NOTE convert SQL wildcards to regex, no literal matches possible
+ pattern = pattern.replace("_", ".").replace("%", ".*")
+
+ # LIKE clauses always start at the beginning
+ pattern = "^" + pattern + "$"
+
+ return re.search(pattern, ident) is not None
+
+
+class _NotLike(_Like):
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return not super().eval(part_keys, part_input)
+
+
+class _In(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: _Ident = tokens[0]
+ self.values: List[Any] = tokens[2:]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ ident = self.ident.eval(part_keys, part_input)
+ values = (self.ident.leval(part_keys, value) for value in self.values)
+
+ return ident in values
+
+
+class _NotIn(_In):
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return not super().eval(part_keys, part_input)
+
+
+class _Between(_Expr):
+ def __init__(self, tokens: ParseResults):
+ self.ident: _Ident = tokens[0]
+ self.left: Any = tokens[2]
+ self.right: Any = tokens[4]
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ ident = self.ident.eval(part_keys, part_input)
+ left = self.ident.leval(part_keys, self.left)
+ right = self.ident.leval(part_keys, self.right)
+
+ return left <= ident <= right or left > ident > right
+
+
+class _NotBetween(_Between):
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return not super().eval(part_keys, part_input)
+
+
+class _BoolAnd(_Expr):
+ def __init__(self, tokens: ParseResults) -> None:
+ self.operands: List[_Expr] = tokens[0][0::2] # skip 'and' between tokens
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return all(operand.eval(part_keys, part_input) for operand in self.operands)
+
+
+class _BoolOr(_Expr):
+ def __init__(self, tokens: ParseResults) -> None:
+ self.operands: List[_Expr] = tokens[0][0::2] # skip 'or' between tokens
+
+ def eval(self, part_keys: List[Dict[str, str]], part_input: Dict[str, Any]) -> bool:
+ return any(operand.eval(part_keys, part_input) for operand in self.operands)
+
+
+class _PartitionFilterExpressionCache:
+ def __init__(self):
+ # build grammar according to Glue.Client.get_partitions(Expression)
+ lpar, rpar = map(Suppress, "()")
+
+ # NOTE these are AWS Athena column name best practices
+ ident = Forward().set_name("ident")
+ ident <<= Word(alphanums + "._").set_parse_action(_Ident) | lpar + ident + rpar
+
+ number = Forward().set_name("number")
+ number <<= pyparsing_common.number | lpar + number + rpar
+
+ string = Forward().set_name("string")
+ string <<= QuotedString(quote_char="'", esc_quote="''") | lpar + string + rpar
+
+ literal = (number | string).set_name("literal")
+ literal_list = delimited_list(literal, min=1).set_name("list")
+
+ bin_op = one_of("<> >= <= > < =").set_name("binary op")
+
+ and_ = Forward()
+ and_ <<= CaselessKeyword("and") | lpar + and_ + rpar
+
+ or_ = Forward()
+ or_ <<= CaselessKeyword("or") | lpar + or_ + rpar
+
+ in_, between, like, not_, is_, null = map(
+ CaselessKeyword, "in between like not is null".split()
+ )
+ not_ = Suppress(not_) # only needed for matching
+
+ cond = (
+ (ident + is_ + null).set_parse_action(_IsNull)
+ | (ident + is_ + not_ + null).set_parse_action(_IsNotNull)
+ | (ident + bin_op + literal).set_parse_action(_BinOp)
+ | (ident + like + string).set_parse_action(_Like)
+ | (ident + not_ + like + string).set_parse_action(_NotLike)
+ | (ident + in_ + lpar + literal_list + rpar).set_parse_action(_In)
+ | (ident + not_ + in_ + lpar + literal_list + rpar).set_parse_action(_NotIn)
+ | (ident + between + literal + and_ + literal).set_parse_action(_Between)
+ | (ident + not_ + between + literal + and_ + literal).set_parse_action(
+ _NotBetween
+ )
+ ).set_name("cond")
+
+ # conditions can be joined using 2-ary AND and/or OR
+ expr = infix_notation(
+ cond,
+ [
+ (and_, 2, OpAssoc.LEFT, _BoolAnd),
+ (or_, 2, OpAssoc.LEFT, _BoolOr),
+ ],
+ )
+ self._expr = expr.set_name("expr")
+
+ self._cache: Dict[str, _Expr] = {}
+
+ def get(self, expression: Optional[str]) -> Optional[_Expr]:
+ if expression is None:
+ return None
+
+ if expression not in self._cache:
+ ParserElement.enable_packrat()
+
+ try:
+ expr: ParseResults = self._expr.parse_string(expression, parse_all=True)
+ self._cache[expression] = expr[0]
+ except exceptions.ParseException:
+ raise InvalidInputException(
+ "GetPartitions", f"Unsupported expression '{expression}'"
+ )
+
+ return self._cache[expression]
+
+
+_PARTITION_FILTER_EXPRESSION_CACHE = _PartitionFilterExpressionCache()
+
+
+class PartitionFilter:
+ def __init__(self, expression: Optional[str], fake_table):
+ self.expression = expression
+ self.fake_table = fake_table
+
+ def __call__(self, fake_partition) -> bool:
+ expression = _PARTITION_FILTER_EXPRESSION_CACHE.get(self.expression)
+ if expression is None:
+ return True
+
+ warnings.warn("Expression filtering is experimental")
+ return expression.eval(
+ part_keys=self.fake_table.versions[-1].get("PartitionKeys", []),
+ part_input=fake_partition.partition_input,
+ )
diff --git a/contrib/python/moto/py3/moto/greengrass/__init__.py b/contrib/python/moto/py3/moto/greengrass/__init__.py
new file mode 100644
index 0000000000..d6dd58b5b1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/greengrass/__init__.py
@@ -0,0 +1,4 @@
+from .models import greengrass_backends
+from ..core.models import base_decorator
+
+mock_greengrass = base_decorator(greengrass_backends)
diff --git a/contrib/python/moto/py3/moto/greengrass/models.py b/contrib/python/moto/py3/moto/greengrass/models.py
new file mode 100644
index 0000000000..9f03b257e0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/greengrass/models.py
@@ -0,0 +1,99 @@
+import uuid
+from collections import OrderedDict
+from datetime import datetime
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import BackendDict, iso_8601_datetime_with_milliseconds
+
+
+class FakeCoreDefinition(BaseModel):
+ def __init__(self, region_name, name):
+ self.region_name = region_name
+ self.name = name
+ self.id = str(uuid.uuid4())
+ self.arn = f"arn:aws:greengrass:{region_name}:{get_account_id()}:greengrass/definition/cores/{self.id}"
+ self.created_at_datetime = datetime.utcnow()
+ self.latest_version = ""
+ self.latest_version_arn = ""
+
+ def to_dict(self):
+ return {
+ "Arn": self.arn,
+ "CreationTimestamp": iso_8601_datetime_with_milliseconds(
+ self.created_at_datetime
+ ),
+ "Id": self.id,
+ "LastUpdatedTimestamp": iso_8601_datetime_with_milliseconds(
+ self.created_at_datetime
+ ),
+ "LatestVersion": self.latest_version,
+ "LatestVersionArn": self.latest_version_arn,
+ "Name": self.name,
+ }
+
+
+class FakeCoreDefinitionVersion(BaseModel):
+ def __init__(self, region_name, core_definition_id, definition):
+ self.region_name = region_name
+ self.core_definition_id = core_definition_id
+ self.definition = definition
+ self.version = str(uuid.uuid4())
+ self.arn = f"arn:aws:greengrass:{region_name}:{get_account_id()}:greengrass/definition/cores/{self.core_definition_id}/versions/{self.version}"
+ self.created_at_datetime = datetime.utcnow()
+
+ def to_dict(self):
+ return {
+ "Arn": self.arn,
+ "CreationTimestamp": iso_8601_datetime_with_milliseconds(
+ self.created_at_datetime
+ ),
+ "Id": self.core_definition_id,
+ "Version": self.version,
+ }
+
+
+class GreengrassBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.groups = OrderedDict()
+ self.group_versions = OrderedDict()
+ self.core_definitions = OrderedDict()
+ self.core_definition_versions = OrderedDict()
+ self.device_definitions = OrderedDict()
+ self.device_definition_versions = OrderedDict()
+ self.function_definitions = OrderedDict()
+ self.function_definition_versions = OrderedDict()
+ self.resource_definitions = OrderedDict()
+ self.resource_definition_versions = OrderedDict()
+ self.subscription_definitions = OrderedDict()
+ self.subscription_definition_versions = OrderedDict()
+ self.deployments = OrderedDict()
+
+ def create_core_definition(self, name, initial_version):
+
+ core_definition = FakeCoreDefinition(self.region_name, name)
+ self.core_definitions[core_definition.id] = core_definition
+ self.create_core_definition_version(
+ core_definition.id, initial_version["Cores"]
+ )
+ return core_definition
+
+ def create_core_definition_version(self, core_definition_id, cores):
+
+ definition = {"Cores": cores}
+ core_def_ver = FakeCoreDefinitionVersion(
+ self.region_name, core_definition_id, definition
+ )
+ core_def_vers = self.core_definition_versions.get(
+ core_def_ver.core_definition_id, {}
+ )
+ core_def_vers[core_def_ver.version] = core_def_ver
+ self.core_definition_versions[core_def_ver.core_definition_id] = core_def_vers
+
+ self.core_definitions[core_definition_id].latest_version = core_def_ver.version
+ self.core_definitions[core_definition_id].latest_version_arn = core_def_ver.arn
+
+ return core_def_ver
+
+
+greengrass_backends = BackendDict(GreengrassBackend, "greengrass")
diff --git a/contrib/python/moto/py3/moto/greengrass/responses.py b/contrib/python/moto/py3/moto/greengrass/responses.py
new file mode 100644
index 0000000000..3110066a70
--- /dev/null
+++ b/contrib/python/moto/py3/moto/greengrass/responses.py
@@ -0,0 +1,31 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import greengrass_backends
+
+
+class GreengrassResponse(BaseResponse):
+ SERVICE_NAME = "greengrass"
+
+ @property
+ def greengrass_backend(self):
+ return greengrass_backends[self.region]
+
+ def create_core_definition(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ name = self._get_param("Name")
+ initial_version = self._get_param("InitialVersion")
+ res = self.greengrass_backend.create_core_definition(
+ name=name, initial_version=initial_version
+ )
+ return 201, {"status": 201}, json.dumps(res.to_dict())
+
+ def create_core_definition_version(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ core_definition_id = self.path.split("/")[-2]
+ cores = self._get_param("Cores")
+
+ res = self.greengrass_backend.create_core_definition_version(
+ core_definition_id=core_definition_id, cores=cores
+ )
+ return 201, {"status": 201}, json.dumps(res.to_dict())
diff --git a/contrib/python/moto/py3/moto/greengrass/urls.py b/contrib/python/moto/py3/moto/greengrass/urls.py
new file mode 100644
index 0000000000..f27bea333d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/greengrass/urls.py
@@ -0,0 +1,14 @@
+from .responses import GreengrassResponse
+
+url_bases = [
+ r"https?://greengrass\.(.+)\.amazonaws.com",
+]
+
+
+response = GreengrassResponse()
+
+
+url_paths = {
+ "{0}/greengrass/definition/cores$": response.create_core_definition,
+ "{0}/greengrass/definition/cores/(?P<definition_id>[^/]+)/versions$": response.create_core_definition_version,
+}
diff --git a/contrib/python/moto/py3/moto/guardduty/__init__.py b/contrib/python/moto/py3/moto/guardduty/__init__.py
new file mode 100644
index 0000000000..68e09deddb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/guardduty/__init__.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+
+from .models import guardduty_backends
+from ..core.models import base_decorator
+
+guardduty_backend = guardduty_backends["us-east-1"]
+mock_guardduty = base_decorator(guardduty_backends)
diff --git a/contrib/python/moto/py3/moto/guardduty/exceptions.py b/contrib/python/moto/py3/moto/guardduty/exceptions.py
new file mode 100644
index 0000000000..d61b9aa173
--- /dev/null
+++ b/contrib/python/moto/py3/moto/guardduty/exceptions.py
@@ -0,0 +1,31 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class GuardDutyException(JsonRESTError):
+ pass
+
+
+class DetectorNotFoundException(GuardDutyException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidInputException",
+ "The request is rejected because the input detectorId is not owned by the current account.",
+ )
+
+ def get_headers(self, *args, **kwargs): # pylint: disable=unused-argument
+ return {"X-Amzn-ErrorType": "BadRequestException"}
+
+
+class FilterNotFoundException(GuardDutyException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidInputException",
+ "The request is rejected since no such resource found.",
+ )
+
+ def get_headers(self, *args, **kwargs): # pylint: disable=unused-argument
+ return {"X-Amzn-ErrorType": "BadRequestException"}
diff --git a/contrib/python/moto/py3/moto/guardduty/models.py b/contrib/python/moto/py3/moto/guardduty/models.py
new file mode 100644
index 0000000000..ad12b20986
--- /dev/null
+++ b/contrib/python/moto/py3/moto/guardduty/models.py
@@ -0,0 +1,200 @@
+from __future__ import unicode_literals
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import BackendDict, get_random_hex
+from datetime import datetime
+
+from .exceptions import DetectorNotFoundException, FilterNotFoundException
+
+
+class GuardDutyBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.admin_account_ids = []
+ self.detectors = {}
+
+ def create_detector(self, enable, finding_publishing_frequency, data_sources, tags):
+ if finding_publishing_frequency not in [
+ "FIFTEEN_MINUTES",
+ "ONE_HOUR",
+ "SIX_HOURS",
+ ]:
+ finding_publishing_frequency = "SIX_HOURS"
+
+ detector = Detector(
+ created_at=datetime.now(),
+ finding_publish_freq=finding_publishing_frequency,
+ enabled=enable,
+ datasources=data_sources,
+ tags=tags,
+ )
+ self.detectors[detector.id] = detector
+ return detector.id
+
+ def create_filter(
+ self, detector_id, name, action, description, finding_criteria, rank
+ ):
+ detector = self.get_detector(detector_id)
+ _filter = Filter(name, action, description, finding_criteria, rank)
+ detector.add_filter(_filter)
+
+ def delete_detector(self, detector_id):
+ self.detectors.pop(detector_id, None)
+
+ def delete_filter(self, detector_id, filter_name):
+ detector = self.get_detector(detector_id)
+ detector.delete_filter(filter_name)
+
+ def enable_organization_admin_account(self, admin_account_id):
+ self.admin_account_ids.append(admin_account_id)
+
+ def list_organization_admin_accounts(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.admin_account_ids
+
+ def list_detectors(self):
+ """
+ The MaxResults and NextToken-parameter have not yet been implemented.
+ """
+ detectorids = []
+ for detector in self.detectors:
+ detectorids.append(self.detectors[detector].id)
+ return detectorids
+
+ def get_detector(self, detector_id):
+ if detector_id not in self.detectors:
+ raise DetectorNotFoundException
+ return self.detectors[detector_id]
+
+ def get_filter(self, detector_id, filter_name):
+ detector = self.get_detector(detector_id)
+ return detector.get_filter(filter_name)
+
+ def update_detector(
+ self, detector_id, enable, finding_publishing_frequency, data_sources
+ ):
+ detector = self.get_detector(detector_id)
+ detector.update(enable, finding_publishing_frequency, data_sources)
+
+ def update_filter(
+ self, detector_id, filter_name, action, description, finding_criteria, rank
+ ):
+ detector = self.get_detector(detector_id)
+ detector.update_filter(
+ filter_name,
+ action=action,
+ description=description,
+ finding_criteria=finding_criteria,
+ rank=rank,
+ )
+
+
+class Filter(BaseModel):
+ def __init__(self, name, action, description, finding_criteria, rank):
+ self.name = name
+ self.action = action
+ self.description = description
+ self.finding_criteria = finding_criteria
+ self.rank = rank or 1
+
+ def update(self, action, description, finding_criteria, rank):
+ if action is not None:
+ self.action = action
+ if description is not None:
+ self.description = description
+ if finding_criteria is not None:
+ self.finding_criteria = finding_criteria
+ if rank is not None:
+ self.rank = rank
+
+ def to_json(self):
+ return {
+ "name": self.name,
+ "action": self.action,
+ "description": self.description,
+ "findingCriteria": self.finding_criteria,
+ "rank": self.rank,
+ }
+
+
+class Detector(BaseModel):
+ def __init__(
+ self,
+ created_at,
+ finding_publish_freq,
+ enabled,
+ datasources,
+ tags,
+ ):
+ self.id = get_random_hex(length=32)
+ self.created_at = created_at
+ self.finding_publish_freq = finding_publish_freq
+ self.service_role = f"arn:aws:iam::{get_account_id()}:role/aws-service-role/guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDuty"
+ self.enabled = enabled
+ self.updated_at = created_at
+ self.datasources = datasources or {}
+ self.tags = tags or {}
+
+ self.filters = dict()
+
+ def add_filter(self, _filter: Filter):
+ self.filters[_filter.name] = _filter
+
+ def delete_filter(self, filter_name):
+ self.filters.pop(filter_name, None)
+
+ def get_filter(self, filter_name: str):
+ if filter_name not in self.filters:
+ raise FilterNotFoundException
+ return self.filters[filter_name]
+
+ def update_filter(self, filter_name, action, description, finding_criteria, rank):
+ _filter = self.get_filter(filter_name)
+ _filter.update(
+ action=action,
+ description=description,
+ finding_criteria=finding_criteria,
+ rank=rank,
+ )
+
+ def update(self, enable, finding_publishing_frequency, data_sources):
+ if enable is not None:
+ self.enabled = enable
+ if finding_publishing_frequency is not None:
+ self.finding_publish_freq = finding_publishing_frequency
+ if data_sources is not None:
+ self.datasources = data_sources
+
+ def to_json(self):
+ data_sources = {
+ "cloudTrail": {"status": "DISABLED"},
+ "dnsLogs": {"status": "DISABLED"},
+ "flowLogs": {"status": "DISABLED"},
+ "s3Logs": {
+ "status": "ENABLED"
+ if (self.datasources.get("s3Logs") or {}).get("enable")
+ else "DISABLED"
+ },
+ "kubernetes": {
+ "auditLogs": {
+ "status": "ENABLED"
+ if self.datasources.get("kubernetes", {})
+ .get("auditLogs", {})
+ .get("enable")
+ else "DISABLED"
+ }
+ },
+ }
+ return {
+ "createdAt": self.created_at.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
+ "findingPublishingFrequency": self.finding_publish_freq,
+ "serviceRole": self.service_role,
+ "status": "ENABLED" if self.enabled else "DISABLED",
+ "updatedAt": self.updated_at.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
+ "dataSources": data_sources,
+ "tags": self.tags,
+ }
+
+
+guardduty_backends = BackendDict(GuardDutyBackend, "guardduty")
diff --git a/contrib/python/moto/py3/moto/guardduty/responses.py b/contrib/python/moto/py3/moto/guardduty/responses.py
new file mode 100644
index 0000000000..104ed745d8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/guardduty/responses.py
@@ -0,0 +1,156 @@
+from __future__ import unicode_literals
+from moto.core.responses import BaseResponse
+from .models import guardduty_backends
+import json
+from urllib.parse import unquote
+
+
+class GuardDutyResponse(BaseResponse):
+ SERVICE_NAME = "guardduty"
+
+ @property
+ def guardduty_backend(self):
+ return guardduty_backends[self.region]
+
+ def filter(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_filter()
+ elif request.method == "DELETE":
+ return self.delete_filter()
+ elif request.method == "POST":
+ return self.update_filter()
+
+ def filters(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_filter()
+
+ def detectors(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_detector()
+ elif request.method == "GET":
+ return self.list_detectors()
+ else:
+ return 404, {}, ""
+
+ def detector(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_detector()
+ elif request.method == "DELETE":
+ return self.delete_detector()
+ elif request.method == "POST":
+ return self.update_detector()
+
+ def create_filter(self):
+ detector_id = self.path.split("/")[-2]
+ name = self._get_param("name")
+ action = self._get_param("action")
+ description = self._get_param("description")
+ finding_criteria = self._get_param("findingCriteria")
+ rank = self._get_param("rank")
+
+ self.guardduty_backend.create_filter(
+ detector_id, name, action, description, finding_criteria, rank
+ )
+ return 200, {}, json.dumps({"name": name})
+
+ def create_detector(self):
+ enable = self._get_param("enable")
+ finding_publishing_frequency = self._get_param("findingPublishingFrequency")
+ data_sources = self._get_param("dataSources")
+ tags = self._get_param("tags")
+
+ detector_id = self.guardduty_backend.create_detector(
+ enable, finding_publishing_frequency, data_sources, tags
+ )
+
+ return 200, {}, json.dumps(dict(detectorId=detector_id))
+
+ def delete_detector(self):
+ detector_id = self.path.split("/")[-1]
+
+ self.guardduty_backend.delete_detector(detector_id)
+ return 200, {}, "{}"
+
+ def delete_filter(self):
+ detector_id = self.path.split("/")[-3]
+ filter_name = unquote(self.path.split("/")[-1])
+
+ self.guardduty_backend.delete_filter(detector_id, filter_name)
+ return 200, {}, "{}"
+
+ def enable_organization_admin_account(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ admin_account = self._get_param("adminAccountId")
+ self.guardduty_backend.enable_organization_admin_account(admin_account)
+
+ return 200, {}, "{}"
+
+ def list_organization_admin_accounts(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ account_ids = self.guardduty_backend.list_organization_admin_accounts()
+
+ return (
+ 200,
+ {},
+ json.dumps(
+ {
+ "adminAccounts": [
+ {"adminAccountId": account_id, "adminStatus": "ENABLED"}
+ for account_id in account_ids
+ ]
+ }
+ ),
+ )
+
+ def list_detectors(self):
+ detector_ids = self.guardduty_backend.list_detectors()
+
+ return 200, {}, json.dumps({"detectorIds": detector_ids})
+
+ def get_detector(self):
+ detector_id = self.path.split("/")[-1]
+
+ detector = self.guardduty_backend.get_detector(detector_id)
+ return 200, {}, json.dumps(detector.to_json())
+
+ def get_filter(self):
+ detector_id = self.path.split("/")[-3]
+ filter_name = unquote(self.path.split("/")[-1])
+
+ _filter = self.guardduty_backend.get_filter(detector_id, filter_name)
+ return 200, {}, json.dumps(_filter.to_json())
+
+ def update_detector(self):
+ detector_id = self.path.split("/")[-1]
+ enable = self._get_param("enable")
+ finding_publishing_frequency = self._get_param("findingPublishingFrequency")
+ data_sources = self._get_param("dataSources")
+
+ self.guardduty_backend.update_detector(
+ detector_id, enable, finding_publishing_frequency, data_sources
+ )
+ return 200, {}, "{}"
+
+ def update_filter(self):
+ detector_id = self.path.split("/")[-3]
+ filter_name = unquote(self.path.split("/")[-1])
+ action = self._get_param("action")
+ description = self._get_param("description")
+ finding_criteria = self._get_param("findingCriteria")
+ rank = self._get_param("rank")
+
+ self.guardduty_backend.update_filter(
+ detector_id,
+ filter_name,
+ action=action,
+ description=description,
+ finding_criteria=finding_criteria,
+ rank=rank,
+ )
+ return 200, {}, json.dumps({"name": filter_name})
diff --git a/contrib/python/moto/py3/moto/guardduty/urls.py b/contrib/python/moto/py3/moto/guardduty/urls.py
new file mode 100644
index 0000000000..3ce2153ca7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/guardduty/urls.py
@@ -0,0 +1,18 @@
+from __future__ import unicode_literals
+from .responses import GuardDutyResponse
+
+response = GuardDutyResponse()
+
+url_bases = [
+ "https?://guardduty\\.(.+)\\.amazonaws\\.com",
+]
+
+
+url_paths = {
+ "{0}/detector$": response.detectors,
+ "{0}/detector/(?P<detector_id>[^/]+)$": response.detector,
+ "{0}/detector/(?P<detector_id>[^/]+)/filter$": response.filters,
+ "{0}/detector/(?P<detector_id>[^/]+)/filter/(?P<filter_name>[^/]+)$": response.filter,
+ "{0}/admin/enable$": response.enable_organization_admin_account,
+ "{0}/admin$": response.list_organization_admin_accounts,
+}
diff --git a/contrib/python/moto/py3/moto/iam/__init__.py b/contrib/python/moto/py3/moto/iam/__init__.py
new file mode 100644
index 0000000000..7131d1370d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/__init__.py
@@ -0,0 +1,5 @@
+from .models import iam_backend
+from ..core.models import base_decorator
+
+iam_backends = {"global": iam_backend}
+mock_iam = base_decorator(iam_backends)
diff --git a/contrib/python/moto/py3/moto/iam/access_control.py b/contrib/python/moto/py3/moto/iam/access_control.py
new file mode 100644
index 0000000000..58d87303c6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/access_control.py
@@ -0,0 +1,402 @@
+"""
+This implementation is NOT complete, there are many things to improve.
+The following is a list of the most important missing features and inaccuracies.
+
+TODO add support for more principals, apart from IAM users and assumed IAM roles
+TODO add support for the Resource and Condition parts of IAM policies
+TODO add support and create tests for all services in moto (for example, API Gateway is probably not supported currently)
+TODO implement service specific error messages (currently, EC2 and S3 are supported separately, everything else defaults to the errors IAM returns)
+TODO include information about the action's resource in error messages (once the Resource element in IAM policies is supported)
+TODO check all other actions that are performed by the action called by the user (for example, autoscaling:CreateAutoScalingGroup requires permission for iam:CreateServiceLinkedRole too - see https://docs.aws.amazon.com/autoscaling/ec2/userguide/control-access-using-iam.html)
+TODO add support for resource-based policies
+
+"""
+
+import json
+import logging
+import re
+from abc import abstractmethod, ABCMeta
+from enum import Enum
+
+from botocore.auth import SigV4Auth, S3SigV4Auth
+from botocore.awsrequest import AWSRequest
+from botocore.credentials import Credentials
+
+from moto.core import get_account_id
+from moto.core.exceptions import (
+ SignatureDoesNotMatchError,
+ AccessDeniedError,
+ InvalidClientTokenIdError,
+ AuthFailureError,
+)
+from moto.s3.exceptions import (
+ BucketAccessDeniedError,
+ S3AccessDeniedError,
+ BucketInvalidTokenError,
+ S3InvalidTokenError,
+ S3InvalidAccessKeyIdError,
+ BucketInvalidAccessKeyIdError,
+ BucketSignatureDoesNotMatchError,
+ S3SignatureDoesNotMatchError,
+)
+from moto.sts.models import sts_backend
+from .models import iam_backend, Policy
+
+log = logging.getLogger(__name__)
+
+
+def create_access_key(access_key_id, headers):
+ if access_key_id.startswith("AKIA") or "X-Amz-Security-Token" not in headers:
+ return IAMUserAccessKey(access_key_id, headers)
+ else:
+ return AssumedRoleAccessKey(access_key_id, headers)
+
+
+class IAMUserAccessKey(object):
+ def __init__(self, access_key_id, headers):
+ iam_users = iam_backend.list_users("/", None, None)
+ for iam_user in iam_users:
+ for access_key in iam_user.access_keys:
+ if access_key.access_key_id == access_key_id:
+ self._owner_user_name = iam_user.name
+ self._access_key_id = access_key_id
+ self._secret_access_key = access_key.secret_access_key
+ if "X-Amz-Security-Token" in headers:
+ raise CreateAccessKeyFailure(reason="InvalidToken")
+ return
+ raise CreateAccessKeyFailure(reason="InvalidId")
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{account_id}:user/{iam_user_name}".format(
+ account_id=get_account_id(), iam_user_name=self._owner_user_name
+ )
+
+ def create_credentials(self):
+ return Credentials(self._access_key_id, self._secret_access_key)
+
+ def collect_policies(self):
+ user_policies = []
+
+ inline_policy_names = iam_backend.list_user_policies(self._owner_user_name)
+ for inline_policy_name in inline_policy_names:
+ inline_policy = iam_backend.get_user_policy(
+ self._owner_user_name, inline_policy_name
+ )
+ user_policies.append(inline_policy)
+
+ attached_policies, _ = iam_backend.list_attached_user_policies(
+ self._owner_user_name
+ )
+ user_policies += attached_policies
+
+ user_groups = iam_backend.get_groups_for_user(self._owner_user_name)
+ for user_group in user_groups:
+ inline_group_policy_names = iam_backend.list_group_policies(user_group.name)
+ for inline_group_policy_name in inline_group_policy_names:
+ inline_user_group_policy = iam_backend.get_group_policy(
+ user_group.name, inline_group_policy_name
+ )
+ user_policies.append(inline_user_group_policy)
+
+ attached_group_policies, _ = iam_backend.list_attached_group_policies(
+ user_group.name
+ )
+ user_policies += attached_group_policies
+
+ return user_policies
+
+
+class AssumedRoleAccessKey(object):
+ def __init__(self, access_key_id, headers):
+ for assumed_role in sts_backend.assumed_roles:
+ if assumed_role.access_key_id == access_key_id:
+ self._access_key_id = access_key_id
+ self._secret_access_key = assumed_role.secret_access_key
+ self._session_token = assumed_role.session_token
+ self._owner_role_name = assumed_role.role_arn.split("/")[-1]
+ self._session_name = assumed_role.session_name
+ if headers["X-Amz-Security-Token"] != self._session_token:
+ raise CreateAccessKeyFailure(reason="InvalidToken")
+ return
+ raise CreateAccessKeyFailure(reason="InvalidId")
+
+ @property
+ def arn(self):
+ return (
+ "arn:aws:sts::{account_id}:assumed-role/{role_name}/{session_name}".format(
+ account_id=get_account_id(),
+ role_name=self._owner_role_name,
+ session_name=self._session_name,
+ )
+ )
+
+ def create_credentials(self):
+ return Credentials(
+ self._access_key_id, self._secret_access_key, self._session_token
+ )
+
+ def collect_policies(self):
+ role_policies = []
+
+ inline_policy_names = iam_backend.list_role_policies(self._owner_role_name)
+ for inline_policy_name in inline_policy_names:
+ _, inline_policy = iam_backend.get_role_policy(
+ self._owner_role_name, inline_policy_name
+ )
+ role_policies.append(inline_policy)
+
+ attached_policies, _ = iam_backend.list_attached_role_policies(
+ self._owner_role_name
+ )
+ role_policies += attached_policies
+
+ return role_policies
+
+
+class CreateAccessKeyFailure(Exception):
+ def __init__(self, reason, *args):
+ super().__init__(*args)
+ self.reason = reason
+
+
+class IAMRequestBase(object, metaclass=ABCMeta):
+ def __init__(self, method, path, data, headers):
+ log.debug(
+ "Creating {class_name} with method={method}, path={path}, data={data}, headers={headers}".format(
+ class_name=self.__class__.__name__,
+ method=method,
+ path=path,
+ data=data,
+ headers=headers,
+ )
+ )
+ self._method = method
+ self._path = path
+ self._data = data
+ self._headers = headers
+ credential_scope = self._get_string_between(
+ "Credential=", ",", self._headers["Authorization"]
+ )
+ credential_data = credential_scope.split("/")
+ self._region = credential_data[2]
+ self._service = credential_data[3]
+ self._action = (
+ self._service
+ + ":"
+ + (
+ self._data["Action"][0]
+ if isinstance(self._data["Action"], list)
+ else self._data["Action"]
+ )
+ )
+ try:
+ self._access_key = create_access_key(
+ access_key_id=credential_data[0], headers=headers
+ )
+ except CreateAccessKeyFailure as e:
+ self._raise_invalid_access_key(e.reason)
+
+ def check_signature(self):
+ original_signature = self._get_string_between(
+ "Signature=", ",", self._headers["Authorization"]
+ )
+ calculated_signature = self._calculate_signature()
+ if original_signature != calculated_signature:
+ self._raise_signature_does_not_match()
+
+ def check_action_permitted(self):
+ if (
+ self._action == "sts:GetCallerIdentity"
+ ): # always allowed, even if there's an explicit Deny for it
+ return True
+ policies = self._access_key.collect_policies()
+
+ permitted = False
+ for policy in policies:
+ iam_policy = IAMPolicy(policy)
+ permission_result = iam_policy.is_action_permitted(self._action)
+ if permission_result == PermissionResult.DENIED:
+ self._raise_access_denied()
+ elif permission_result == PermissionResult.PERMITTED:
+ permitted = True
+
+ if not permitted:
+ self._raise_access_denied()
+
+ @abstractmethod
+ def _raise_signature_does_not_match(self):
+ raise NotImplementedError()
+
+ @abstractmethod
+ def _raise_access_denied(self):
+ raise NotImplementedError()
+
+ @abstractmethod
+ def _raise_invalid_access_key(self, reason):
+ raise NotImplementedError()
+
+ @abstractmethod
+ def _create_auth(self, credentials):
+ raise NotImplementedError()
+
+ @staticmethod
+ def _create_headers_for_aws_request(signed_headers, original_headers):
+ headers = {}
+ for key, value in original_headers.items():
+ if key.lower() in signed_headers:
+ headers[key] = value
+ return headers
+
+ def _create_aws_request(self):
+ signed_headers = self._get_string_between(
+ "SignedHeaders=", ",", self._headers["Authorization"]
+ ).split(";")
+ headers = self._create_headers_for_aws_request(signed_headers, self._headers)
+ request = AWSRequest(
+ method=self._method, url=self._path, data=self._data, headers=headers
+ )
+ request.context["timestamp"] = headers["X-Amz-Date"]
+
+ return request
+
+ def _calculate_signature(self):
+ credentials = self._access_key.create_credentials()
+ auth = self._create_auth(credentials)
+ request = self._create_aws_request()
+ canonical_request = auth.canonical_request(request)
+ string_to_sign = auth.string_to_sign(request, canonical_request)
+ return auth.signature(string_to_sign, request)
+
+ @staticmethod
+ def _get_string_between(first_separator, second_separator, string):
+ return string.partition(first_separator)[2].partition(second_separator)[0]
+
+
+class IAMRequest(IAMRequestBase):
+ def _raise_signature_does_not_match(self):
+ if self._service == "ec2":
+ raise AuthFailureError()
+ else:
+ raise SignatureDoesNotMatchError()
+
+ def _raise_invalid_access_key(self, _):
+ if self._service == "ec2":
+ raise AuthFailureError()
+ else:
+ raise InvalidClientTokenIdError()
+
+ def _create_auth(self, credentials):
+ return SigV4Auth(credentials, self._service, self._region)
+
+ def _raise_access_denied(self):
+ raise AccessDeniedError(user_arn=self._access_key.arn, action=self._action)
+
+
+class S3IAMRequest(IAMRequestBase):
+ def _raise_signature_does_not_match(self):
+ if "BucketName" in self._data:
+ raise BucketSignatureDoesNotMatchError(bucket=self._data["BucketName"])
+ else:
+ raise S3SignatureDoesNotMatchError()
+
+ def _raise_invalid_access_key(self, reason):
+ if reason == "InvalidToken":
+ if "BucketName" in self._data:
+ raise BucketInvalidTokenError(bucket=self._data["BucketName"])
+ else:
+ raise S3InvalidTokenError()
+ else:
+ if "BucketName" in self._data:
+ raise BucketInvalidAccessKeyIdError(bucket=self._data["BucketName"])
+ else:
+ raise S3InvalidAccessKeyIdError()
+
+ def _create_auth(self, credentials):
+ return S3SigV4Auth(credentials, self._service, self._region)
+
+ def _raise_access_denied(self):
+ if "BucketName" in self._data:
+ raise BucketAccessDeniedError(bucket=self._data["BucketName"])
+ else:
+ raise S3AccessDeniedError()
+
+
+class IAMPolicy(object):
+ def __init__(self, policy):
+ if isinstance(policy, Policy):
+ default_version = next(
+ policy_version
+ for policy_version in policy.versions
+ if policy_version.is_default
+ )
+ policy_document = default_version.document
+ elif isinstance(policy, str):
+ policy_document = policy
+ else:
+ policy_document = policy["policy_document"]
+
+ self._policy_json = json.loads(policy_document)
+
+ def is_action_permitted(self, action):
+ permitted = False
+ if isinstance(self._policy_json["Statement"], list):
+ for policy_statement in self._policy_json["Statement"]:
+ iam_policy_statement = IAMPolicyStatement(policy_statement)
+ permission_result = iam_policy_statement.is_action_permitted(action)
+ if permission_result == PermissionResult.DENIED:
+ return permission_result
+ elif permission_result == PermissionResult.PERMITTED:
+ permitted = True
+ else: # dict
+ iam_policy_statement = IAMPolicyStatement(self._policy_json["Statement"])
+ return iam_policy_statement.is_action_permitted(action)
+
+ if permitted:
+ return PermissionResult.PERMITTED
+ else:
+ return PermissionResult.NEUTRAL
+
+
+class IAMPolicyStatement(object):
+ def __init__(self, statement):
+ self._statement = statement
+
+ def is_action_permitted(self, action):
+ is_action_concerned = False
+
+ if "NotAction" in self._statement:
+ if not self._check_element_matches("NotAction", action):
+ is_action_concerned = True
+ else: # Action is present
+ if self._check_element_matches("Action", action):
+ is_action_concerned = True
+
+ if is_action_concerned:
+ if self._statement["Effect"] == "Allow":
+ return PermissionResult.PERMITTED
+ else: # Deny
+ return PermissionResult.DENIED
+ else:
+ return PermissionResult.NEUTRAL
+
+ def _check_element_matches(self, statement_element, value):
+ if isinstance(self._statement[statement_element], list):
+ for statement_element_value in self._statement[statement_element]:
+ if self._match(statement_element_value, value):
+ return True
+ return False
+ else: # string
+ return self._match(self._statement[statement_element], value)
+
+ @staticmethod
+ def _match(pattern, string):
+ pattern = pattern.replace("*", ".*")
+ pattern = "^{pattern}$".format(pattern=pattern)
+ return re.match(pattern, string)
+
+
+class PermissionResult(Enum):
+ PERMITTED = 1
+ DENIED = 2
+ NEUTRAL = 3
diff --git a/contrib/python/moto/py3/moto/iam/aws_managed_policies.py b/contrib/python/moto/py3/moto/iam/aws_managed_policies.py
new file mode 100644
index 0000000000..ef6475a51b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/aws_managed_policies.py
@@ -0,0 +1,65212 @@
+# Imported via `make aws_managed_policies`
+aws_managed_policies_data = """
+{
+ "APIGatewayServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/APIGatewayServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-10-20T17:23:10+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticloadbalancing:AddListenerCertificates",
+ "elasticloadbalancing:RemoveListenerCertificates",
+ "elasticloadbalancing:ModifyListener",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingRules",
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:ListLogDeliveries",
+ "servicediscovery:DiscoverInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:firehose:*:*:deliverystream/amazon-apigateway-*"
+ },
+ {
+ "Action": [
+ "acm:DescribeCertificate",
+ "acm:GetCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm:*:*:certificate/*"
+ },
+ {
+ "Action": "ec2:CreateNetworkInterfacePermission",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Owner",
+ "VpcLinkId"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "servicediscovery:GetNamespace",
+ "Effect": "Allow",
+ "Resource": "arn:aws:servicediscovery:*:*:namespace/*"
+ },
+ {
+ "Action": "servicediscovery:GetService",
+ "Effect": "Allow",
+ "Resource": "arn:aws:servicediscovery:*:*:service/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQQDZNLDBF2ULTWK6",
+ "PolicyName": "APIGatewayServiceRolePolicy",
+ "UpdateDate": "2021-07-12T22:24:40+00:00",
+ "VersionId": "v9"
+ },
+ "AWSAccountActivityAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountActivityAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewBilling"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQRYCWMFX5J3E333K",
+ "PolicyName": "AWSAccountActivityAccess",
+ "UpdateDate": "2015-02-06T18:41:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAccountManagementFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountManagementFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-30T23:20:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "account:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NJRKI5OH5",
+ "PolicyName": "AWSAccountManagementFullAccess",
+ "UpdateDate": "2021-09-30T23:20:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAccountManagementReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountManagementReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-30T23:29:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "account:Get*",
+ "account:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FJMX42HLT",
+ "PolicyName": "AWSAccountManagementReadOnlyAccess",
+ "UpdateDate": "2021-09-30T23:29:53+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAccountUsageReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAccountUsageReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewUsage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLIB4VSBVO47ZSBB6",
+ "PolicyName": "AWSAccountUsageReportAccess",
+ "UpdateDate": "2015-02-06T18:41:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAgentlessDiscoveryService": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAgentlessDiscoveryService",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-02T01:35:11+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "awsconnector:RegisterConnector",
+ "awsconnector:GetConnectorHealth"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::connector-platform-upgrade-info/*",
+ "arn:aws:s3:::connector-platform-upgrade-info",
+ "arn:aws:s3:::connector-platform-upgrade-bundles/*",
+ "arn:aws:s3:::connector-platform-upgrade-bundles",
+ "arn:aws:s3:::connector-platform-release-notes/*",
+ "arn:aws:s3:::connector-platform-release-notes",
+ "arn:aws:s3:::prod.agentless.discovery.connector.upgrade/*",
+ "arn:aws:s3:::prod.agentless.discovery.connector.upgrade"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::import-to-ec2-connector-debug-logs/*"
+ ]
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ },
+ {
+ "Action": [
+ "Discovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Discovery"
+ },
+ {
+ "Action": [
+ "arsenal:RegisterOnPremisesAgent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "arsenal"
+ },
+ {
+ "Action": [
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIA3DIL7BYQ35ISM4K",
+ "PolicyName": "AWSAgentlessDiscoveryService",
+ "UpdateDate": "2020-02-24T23:08:23+00:00",
+ "VersionId": "v2"
+ },
+ "AWSAppMeshEnvoyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppMeshEnvoyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-03T21:29:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appmesh:StreamAggregatedResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PMG6ZGSZZ",
+ "PolicyName": "AWSAppMeshEnvoyAccess",
+ "UpdateDate": "2019-07-03T21:29:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppMeshFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppMeshFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-16T17:50:40+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appmesh:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "appmesh.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/appmesh.amazonaws.com/AWSServiceRoleForAppMesh"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStack*",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/AWSAppMesh-GettingStarted-*"
+ },
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "acm:DescribeCertificate",
+ "acm-pca:DescribeCertificateAuthority",
+ "acm-pca:ListCertificateAuthorities"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicediscovery:ListNamespaces",
+ "servicediscovery:ListServices",
+ "servicediscovery:ListInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ILVZ5BWFU",
+ "PolicyName": "AWSAppMeshFullAccess",
+ "UpdateDate": "2021-01-07T19:54:08+00:00",
+ "VersionId": "v6"
+ },
+ "AWSAppMeshPreviewEnvoyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppMeshPreviewEnvoyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-05T23:32:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appmesh-preview:StreamAggregatedResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NKURE3R2M",
+ "PolicyName": "AWSAppMeshPreviewEnvoyAccess",
+ "UpdateDate": "2019-08-05T23:32:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppMeshPreviewServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSAppMeshPreviewServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-19T19:07:00+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicediscovery:DiscoverInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudMapServiceDiscovery"
+ },
+ {
+ "Action": [
+ "acm:DescribeCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ACMCertificateVerification"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FAQWKJYPJ",
+ "PolicyName": "AWSAppMeshPreviewServiceRolePolicy",
+ "UpdateDate": "2019-08-21T21:06:29+00:00",
+ "VersionId": "v3"
+ },
+ "AWSAppMeshReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppMeshReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-16T17:51:11+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appmesh:Describe*",
+ "appmesh:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStack*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/AWSAppMesh-GettingStarted-*"
+ },
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "acm:DescribeCertificate",
+ "acm-pca:DescribeCertificateAuthority",
+ "acm-pca:ListCertificateAuthorities"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicediscovery:ListNamespaces",
+ "servicediscovery:ListServices",
+ "servicediscovery:ListInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HOPFCIWXP",
+ "PolicyName": "AWSAppMeshReadOnly",
+ "UpdateDate": "2021-01-07T19:53:16+00:00",
+ "VersionId": "v5"
+ },
+ "AWSAppMeshServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSAppMeshServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-03T18:30:51+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicediscovery:DiscoverInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudMapServiceDiscovery"
+ },
+ {
+ "Action": [
+ "acm:DescribeCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ACMCertificateVerification"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4B5IHMMEND",
+ "PolicyName": "AWSAppMeshServiceRolePolicy",
+ "UpdateDate": "2019-09-10T22:44:43+00:00",
+ "VersionId": "v2"
+ },
+ "AWSAppRunnerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppRunnerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-01-11T04:02:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "apprunner.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/apprunner.amazonaws.com/AWSServiceRoleForAppRunner"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "apprunner.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "apprunner:*",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AppRunnerAdminAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CI7E7OMBX",
+ "PolicyName": "AWSAppRunnerFullAccess",
+ "UpdateDate": "2022-01-11T04:02:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppRunnerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppRunnerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-24T21:24:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apprunner:List*",
+ "apprunner:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PMYP6C5TR",
+ "PolicyName": "AWSAppRunnerReadOnlyAccess",
+ "UpdateDate": "2022-02-24T21:24:15+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppRunnerServicePolicyForECRAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSAppRunnerServicePolicyForECRAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-14T19:17:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "ecr:DescribeImages",
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LYM3IT6IY",
+ "PolicyName": "AWSAppRunnerServicePolicyForECRAccess",
+ "UpdateDate": "2021-05-14T19:17:21+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppSyncAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppSyncAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-20T21:20:28+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appsync:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "appsync.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "appsync.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/appsync.amazonaws.com/AWSServiceRoleForAppSync*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBYY36AJPXTTWIXCY",
+ "PolicyName": "AWSAppSyncAdministrator",
+ "UpdateDate": "2019-11-04T19:23:49+00:00",
+ "VersionId": "v2"
+ },
+ "AWSAppSyncInvokeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppSyncInvokeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-20T21:21:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appsync:GraphQL",
+ "appsync:GetGraphqlApi",
+ "appsync:ListGraphqlApis",
+ "appsync:ListApiKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILMPWRRZN27MPE3VM",
+ "PolicyName": "AWSAppSyncInvokeFullAccess",
+ "UpdateDate": "2018-03-20T21:21:20+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppSyncPushToCloudWatchLogs": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSAppSyncPushToCloudWatchLogs",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-09T19:38:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWN7WNO34HLMJPUQS",
+ "PolicyName": "AWSAppSyncPushToCloudWatchLogs",
+ "UpdateDate": "2018-04-09T19:38:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppSyncSchemaAuthor": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAppSyncSchemaAuthor",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-20T21:21:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appsync:GraphQL",
+ "appsync:CreateResolver",
+ "appsync:CreateType",
+ "appsync:DeleteResolver",
+ "appsync:DeleteType",
+ "appsync:GetResolver",
+ "appsync:GetType",
+ "appsync:GetDataSource",
+ "appsync:GetSchemaCreationStatus",
+ "appsync:GetIntrospectionSchema",
+ "appsync:GetGraphqlApi",
+ "appsync:ListTypes",
+ "appsync:ListApiKeys",
+ "appsync:ListResolvers",
+ "appsync:ListDataSources",
+ "appsync:ListGraphqlApis",
+ "appsync:StartSchemaCreation",
+ "appsync:UpdateResolver",
+ "appsync:UpdateType"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUCF5WVTOFQXFKY5E",
+ "PolicyName": "AWSAppSyncSchemaAuthor",
+ "UpdateDate": "2018-03-20T21:21:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAppSyncServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSAppSyncServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-21T19:56:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingStatisticSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IKBIQXBOO",
+ "PolicyName": "AWSAppSyncServiceRolePolicy",
+ "UpdateDate": "2020-01-21T19:56:53+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoScalingCustomResourcePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoScalingCustomResourcePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-04T23:22:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "execute-api:Invoke",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYTKXPX6DO32Z4XXA",
+ "PolicyName": "AWSApplicationAutoScalingCustomResourcePolicy",
+ "UpdateDate": "2018-06-04T23:22:44+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingAppStreamFleetPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingAppStreamFleetPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-20T19:04:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:UpdateFleet",
+ "appstream:DescribeFleets",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIRI724OWKP56ZG62M",
+ "PolicyName": "AWSApplicationAutoscalingAppStreamFleetPolicy",
+ "UpdateDate": "2017-10-20T19:04:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingCassandraTablePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingCassandraTablePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-03-18T22:49:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "cassandra:Select",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:cassandra:*:*:/keyspace/system/table/*",
+ "arn:*:cassandra:*:*:/keyspace/system_schema/table/*",
+ "arn:*:cassandra:*:*:/keyspace/system_schema_mcs/table/*"
+ ]
+ },
+ {
+ "Action": [
+ "cassandra:Alter",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BOOOZAOTV",
+ "PolicyName": "AWSApplicationAutoscalingCassandraTablePolicy",
+ "UpdateDate": "2020-03-18T22:49:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingComprehendEndpointPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingComprehendEndpointPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-14T18:39:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "comprehend:UpdateEndpoint",
+ "comprehend:DescribeEndpoint",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HD4ODS6K6",
+ "PolicyName": "AWSApplicationAutoscalingComprehendEndpointPolicy",
+ "UpdateDate": "2019-11-14T18:39:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingDynamoDBTablePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingDynamoDBTablePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-10-20T21:34:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeTable",
+ "dynamodb:UpdateTable",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJOVQMDI3JFCBW4LFO",
+ "PolicyName": "AWSApplicationAutoscalingDynamoDBTablePolicy",
+ "UpdateDate": "2017-10-20T21:34:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingEC2SpotFleetRequestPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingEC2SpotFleetRequestPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-25T18:23:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNRH3VE3WW4Q4RDTU",
+ "PolicyName": "AWSApplicationAutoscalingEC2SpotFleetRequestPolicy",
+ "UpdateDate": "2017-10-25T18:23:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingECSServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingECSServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-25T23:53:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:DescribeServices",
+ "ecs:UpdateService",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFXLLV7AKH5PSFOYG",
+ "PolicyName": "AWSApplicationAutoscalingECSServicePolicy",
+ "UpdateDate": "2017-10-25T23:53:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingEMRInstanceGroupPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingEMRInstanceGroupPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-26T00:57:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ModifyInstanceGroups",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQ6M5Z7LQY2YSG2JS",
+ "PolicyName": "AWSApplicationAutoscalingEMRInstanceGroupPolicy",
+ "UpdateDate": "2017-10-26T00:57:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingElastiCacheRGPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingElastiCacheRGPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-17T23:41:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticache:DescribeReplicationGroups",
+ "elasticache:ModifyReplicationGroupShardConfiguration",
+ "elasticache:IncreaseReplicaCount",
+ "elasticache:DecreaseReplicaCount",
+ "elasticache:DescribeCacheClusters",
+ "elasticache:DescribeCacheParameters",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:TargetTracking*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4A7HPQJPZ7",
+ "PolicyName": "AWSApplicationAutoscalingElastiCacheRGPolicy",
+ "UpdateDate": "2021-08-17T23:41:42+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingKafkaClusterPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingKafkaClusterPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-24T18:36:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kafka:DescribeCluster",
+ "kafka:DescribeClusterOperation",
+ "kafka:UpdateBrokerStorage",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FTCIZBJA2",
+ "PolicyName": "AWSApplicationAutoscalingKafkaClusterPolicy",
+ "UpdateDate": "2020-08-24T18:36:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingLambdaConcurrencyPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingLambdaConcurrencyPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-21T20:04:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:PutProvisionedConcurrencyConfig",
+ "lambda:GetProvisionedConcurrencyConfig",
+ "lambda:DeleteProvisionedConcurrencyConfig",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KIR2KPJCU",
+ "PolicyName": "AWSApplicationAutoscalingLambdaConcurrencyPolicy",
+ "UpdateDate": "2019-10-21T20:04:17+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingNeptuneClusterPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingNeptuneClusterPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-02T21:14:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:ListTagsForResource",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBClusterParameters",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "rds:AddTagsToResource",
+ "Condition": {
+ "StringEquals": {
+ "rds:DatabaseEngine": "neptune"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:db:autoscaled-reader*"
+ ]
+ },
+ {
+ "Action": "rds:CreateDBInstance",
+ "Condition": {
+ "StringEquals": {
+ "rds:DatabaseEngine": "neptune"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:db:autoscaled-reader*",
+ "arn:aws:rds:*:*:cluster:*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:DeleteDBInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:db:autoscaled-reader*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:TargetTracking*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LJVNMME6T",
+ "PolicyName": "AWSApplicationAutoscalingNeptuneClusterPolicy",
+ "UpdateDate": "2021-09-02T21:14:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationAutoscalingRDSClusterPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingRDSClusterPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-17T17:46:56+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:AddTagsToResource",
+ "rds:CreateDBInstance",
+ "rds:DeleteDBInstance",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBInstances",
+ "rds:ModifyDBCluster",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7XS52I27Q2JVKALU",
+ "PolicyName": "AWSApplicationAutoscalingRDSClusterPolicy",
+ "UpdateDate": "2018-08-07T19:14:24+00:00",
+ "VersionId": "v3"
+ },
+ "AWSApplicationAutoscalingSageMakerEndpointPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationAutoscalingSageMakerEndpointPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-02-06T19:58:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:DescribeEndpointConfig",
+ "sagemaker:UpdateEndpointWeightsAndCapacities",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI5DBEBNRZQ4SXYTAW",
+ "PolicyName": "AWSApplicationAutoscalingSageMakerEndpointPolicy",
+ "UpdateDate": "2018-02-06T19:58:21+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationDiscoveryAgentAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationDiscoveryAgentAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-11T21:38:47+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "arsenal:RegisterOnPremisesAgent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICZIOVAGC6JPF3WHC",
+ "PolicyName": "AWSApplicationDiscoveryAgentAccess",
+ "UpdateDate": "2020-02-24T22:26:45+00:00",
+ "VersionId": "v2"
+ },
+ "AWSApplicationDiscoveryServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationDiscoveryServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-11T21:30:50+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:*",
+ "discovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "continuousexport.discovery.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/continuousexport.discovery.amazonaws.com/AWSServiceRoleForApplicationDiscoveryServiceContinuousExport*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/continuousexport.discovery.amazonaws.com/AWSServiceRoleForApplicationDiscoveryServiceContinuousExport*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "migrationhub.amazonaws.com",
+ "dmsintegration.migrationhub.amazonaws.com",
+ "smsintegration.migrationhub.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBNJEA6ZXM2SBOPDU",
+ "PolicyName": "AWSApplicationDiscoveryServiceFullAccess",
+ "UpdateDate": "2019-06-19T21:21:26+00:00",
+ "VersionId": "v4"
+ },
+ "AWSApplicationMigrationAgentPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationMigrationAgentPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T07:00:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:SendAgentMetricsForMgn",
+ "mgn:SendAgentLogsForMgn",
+ "mgn:SendClientLogsForMgn"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "mgn:RegisterAgentForMgn",
+ "mgn:UpdateAgentSourcePropertiesForMgn",
+ "mgn:UpdateAgentReplicationInfoForMgn",
+ "mgn:UpdateAgentConversionInfoForMgn",
+ "mgn:GetAgentInstallationAssetsForMgn",
+ "mgn:GetAgentCommandForMgn",
+ "mgn:GetAgentConfirmedResumeInfoForMgn",
+ "mgn:GetAgentRuntimeConfigurationForMgn",
+ "mgn:UpdateAgentBacklogForMgn",
+ "mgn:GetAgentReplicationInfoForMgn"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "mgn:TagResource",
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgn:*:*:source-server/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4D2GD5QYXR",
+ "PolicyName": "AWSApplicationMigrationAgentPolicy",
+ "UpdateDate": "2021-04-07T07:00:21+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationMigrationConversionServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSApplicationMigrationConversionServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T06:48:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:SendClientMetricsForMgn",
+ "mgn:SendClientLogsForMgn",
+ "mgn:GetChannelCommandsForMgn",
+ "mgn:SendChannelCommandResultForMgn"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OPUSQRTYL",
+ "PolicyName": "AWSApplicationMigrationConversionServerPolicy",
+ "UpdateDate": "2021-04-07T06:48:58+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationMigrationEC2Access": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationMigrationEC2Access",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T07:05:22+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSApplicationMigrationConversionServerRole"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:ModifyLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:GetConsoleOutput",
+ "ec2:GetConsoleScreenshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": "ec2:CreateSecurityGroup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateSecurityGroup",
+ "CreateVolume",
+ "CreateSnapshot",
+ "RunInstances"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:ModifyVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OBKWG2D2O",
+ "PolicyName": "AWSApplicationMigrationEC2Access",
+ "UpdateDate": "2022-03-02T08:49:20+00:00",
+ "VersionId": "v2"
+ },
+ "AWSApplicationMigrationFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationMigrationFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T06:56:05+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeTags",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsEncryptionByDefault",
+ "ec2:GetEbsDefaultKmsKeyId"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "license-manager:ListLicenseConfigurations",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:DescribeLoadBalancers",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListInstanceProfiles",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HPQNMM2HL",
+ "PolicyName": "AWSApplicationMigrationFullAccess",
+ "UpdateDate": "2022-02-22T11:16:56+00:00",
+ "VersionId": "v2"
+ },
+ "AWSApplicationMigrationMGHAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSApplicationMigrationMGHAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T07:10:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:CreateProgressUpdateStream",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:GetHomeRegion",
+ "mgh:ImportMigrationTask",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KOE4CJMGD",
+ "PolicyName": "AWSApplicationMigrationMGHAccess",
+ "UpdateDate": "2021-04-07T07:10:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationMigrationReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationMigrationReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T07:15:26+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:DescribeJobLogItems",
+ "mgn:DescribeJobs",
+ "mgn:DescribeSourceServers",
+ "mgn:DescribeReplicationConfigurationTemplates",
+ "mgn:GetLaunchConfiguration",
+ "mgn:DescribeVcenterClients",
+ "mgn:GetReplicationConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M2IUSVNLL",
+ "PolicyName": "AWSApplicationMigrationReadOnlyAccess",
+ "UpdateDate": "2021-11-08T12:54:08+00:00",
+ "VersionId": "v2"
+ },
+ "AWSApplicationMigrationReplicationServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSApplicationMigrationReplicationServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T07:21:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:SendClientMetricsForMgn",
+ "mgn:SendClientLogsForMgn",
+ "mgn:GetChannelCommandsForMgn",
+ "mgn:SendChannelCommandResultForMgn",
+ "mgn:GetAgentSnapshotCreditsForMgn",
+ "mgn:DescribeReplicationServerAssociationsForMgn",
+ "mgn:DescribeSnapshotRequestsForMgn",
+ "mgn:BatchDeleteSnapshotRequestForMgn",
+ "mgn:NotifyAgentAuthenticationForMgn",
+ "mgn:BatchCreateVolumeSnapshotGroupForMgn",
+ "mgn:UpdateAgentReplicationProcessStateForMgn",
+ "mgn:NotifyAgentReplicationProgressForMgn",
+ "mgn:NotifyAgentConnectedForMgn",
+ "mgn:NotifyAgentDisconnectedForMgn"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateSnapshot"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PXFWAA3SE",
+ "PolicyName": "AWSApplicationMigrationReplicationServerPolicy",
+ "UpdateDate": "2021-04-07T07:21:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationMigrationServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSApplicationMigrationServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-07T06:43:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mgn:ListTagsForResource",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:ListRetirableGrants",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:CreateProgressUpdateStream",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:GetHomeRegion",
+ "mgh:ImportMigrationTask",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsDefaultKmsKeyId",
+ "ec2:GetEbsEncryptionByDefault"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:RegisterImage",
+ "ec2:DeregisterImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:ModifyLaunchTemplate",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:GetConsoleOutput",
+ "ec2:GetConsoleScreenshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplate"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSApplicationMigrationServiceManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSApplicationMigrationReplicationServerRole",
+ "arn:aws:iam::*:role/service-role/AWSApplicationMigrationConversionServerRole"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateLaunchTemplate",
+ "CreateSecurityGroup",
+ "CreateVolume",
+ "CreateSnapshot",
+ "RunInstances"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:launch-template/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LGJRHTEPG",
+ "PolicyName": "AWSApplicationMigrationServiceRolePolicy",
+ "UpdateDate": "2021-04-07T06:43:20+00:00",
+ "VersionId": "v1"
+ },
+ "AWSApplicationMigrationVCenterClientPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSApplicationMigrationVCenterClientPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-08T12:53:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgn:CreateVcenterClientForMgn",
+ "mgn:DescribeVcenterClients"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "mgn:GetVcenterClientCommandsForMgn",
+ "mgn:SendVcenterClientCommandResultForMgn",
+ "mgn:SendVcenterClientLogsForMgn",
+ "mgn:SendVcenterClientMetricsForMgn",
+ "mgn:DeleteVcenterClient",
+ "mgn:TagResource",
+ "mgn:NotifyVcenterClientStartedForMgn"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgn:*:*:vcenter-client/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EZSWKZUGJ",
+ "PolicyName": "AWSApplicationMigrationVCenterClientPolicy",
+ "UpdateDate": "2021-11-08T12:53:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSArtifactAccountSync": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSArtifactAccountSync",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-10T23:04:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMVPXRWZJZWDTYDNC",
+ "PolicyName": "AWSArtifactAccountSync",
+ "UpdateDate": "2018-04-10T23:04:33+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAuditManagerAdministratorAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSAuditManagerAdministratorAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-11T20:02:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "auditmanager:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AuditManagerAccess"
+ },
+ {
+ "Action": [
+ "organizations:ListAccountsForParent",
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount",
+ "organizations:ListParents",
+ "organizations:ListChildren"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "OrganizationsAccess"
+ },
+ {
+ "Action": [
+ "organizations:RegisterDelegatedAdministrator",
+ "organizations:DeregisterDelegatedAdministrator",
+ "organizations:EnableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "organizations:ServicePrincipal": [
+ "auditmanager.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowOnlyAuditManagerIntegration"
+ },
+ {
+ "Action": [
+ "iam:GetUser",
+ "iam:ListUsers",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "auditmanager.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/auditmanager.amazonaws.com/AWSServiceRoleForAuditManager*",
+ "Sid": "IAMAccessCreateSLR"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:UpdateRoleDescription",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/auditmanager.amazonaws.com/AWSServiceRoleForAuditManager*",
+ "Sid": "IAMAccessManageSLR"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "S3Access"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListKeys",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KmsAccess"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": "true"
+ },
+ "StringLike": {
+ "kms:ViaService": "auditmanager.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KmsCreateGrantAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSAccess"
+ },
+ {
+ "Action": [
+ "events:PutRule"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:detail-type": "Security Hub Findings - Imported",
+ "events:source": "aws.securityhub"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CreateEventsAccess"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:ListTargetsByRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/AuditManagerSecurityHubFindingsReceiver",
+ "Sid": "EventsAccess"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "TagAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EBAFCQQJX",
+ "PolicyName": "AWSAuditManagerAdministratorAccess",
+ "UpdateDate": "2020-12-11T20:02:42+00:00",
+ "VersionId": "v1"
+ },
+ "AWSAuditManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSAuditManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-08T15:12:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "license-manager:ListLicenseConfigurations",
+ "license-manager:ListAssociationsForLicenseConfiguration",
+ "license-manager:ListUsageForLicenseConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LicenseManagerAccess"
+ },
+ {
+ "Action": [
+ "iam:GenerateCredentialReport",
+ "iam:GetAccountSummary",
+ "iam:ListPolicies",
+ "iam:GetAccountPasswordPolicy",
+ "iam:ListUsers",
+ "iam:ListUserPolicies",
+ "iam:ListRoles",
+ "iam:ListRolePolicies",
+ "iam:ListGroups",
+ "iam:ListGroupPolicies",
+ "iam:ListEntitiesForPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMAccess"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2Access"
+ },
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudtrailAccess"
+ },
+ {
+ "Action": [
+ "config:DescribeDeliveryChannels",
+ "config:ListDiscoveredResources",
+ "config:DescribeConfigRules"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ConfigAccess"
+ },
+ {
+ "Action": [
+ "securityhub:DescribeStandards"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecurityHubAccess"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:DescribeKey",
+ "kms:ListGrants"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KMSAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudwatchAccess"
+ },
+ {
+ "Action": [
+ "s3:GetLifecycleConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "S3Access"
+ },
+ {
+ "Action": [
+ "events:DescribeRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EventBridgeAccess"
+ },
+ {
+ "Action": [
+ "waf:ListActivatedRulesInRuleGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "WAFAccess"
+ },
+ {
+ "Action": [
+ "guardduty:ListDetectors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "GuardDutyAccess"
+ },
+ {
+ "Action": [
+ "route53:GetQueryLoggingConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Route53Access"
+ },
+ {
+ "Action": [
+ "organizations:DescribePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "OrganizationsAccess"
+ },
+ {
+ "Action": [
+ "cognito-idp:DescribeUserPool"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CognitoAccess"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeFileSystems"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EFSAccess"
+ },
+ {
+ "Action": [
+ "events:PutRule"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "events:source": [
+ "aws.securityhub"
+ ]
+ },
+ "StringEquals": {
+ "events:detail-type": "Security Hub Findings - Imported"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CreateEventsAccess"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:ListTargetsByRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/AuditManagerSecurityHubFindingsReceiver",
+ "Sid": "EventsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4C5N52UWST",
+ "PolicyName": "AWSAuditManagerServiceRolePolicy",
+ "UpdateDate": "2021-11-22T19:36:39+00:00",
+ "VersionId": "v2"
+ },
+ "AWSAutoScalingPlansEC2AutoScalingPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSAutoScalingPlansEC2AutoScalingPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-23T22:46:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:BatchPutScheduledUpdateGroupAction",
+ "autoscaling:BatchDeleteScheduledAction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXWLPZPD4RYBM3JSU",
+ "PolicyName": "AWSAutoScalingPlansEC2AutoScalingPolicy",
+ "UpdateDate": "2018-08-23T22:46:59+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBackupAuditAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupAuditAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-24T01:02:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "backup:CreateFramework",
+ "backup:UpdateFramework",
+ "backup:ListFrameworks",
+ "backup:DescribeFramework",
+ "backup:DeleteFramework",
+ "backup:ListBackupPlans",
+ "backup:ListBackupVaults",
+ "backup:CreateReportPlan",
+ "backup:UpdateReportPlan",
+ "backup:ListReportPlans",
+ "backup:DescribeReportPlan",
+ "backup:DeleteReportPlan",
+ "backup:StartReportJob",
+ "backup:ListReportJobs",
+ "backup:DescribeReportJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:DescribeComplianceByConfigRule",
+ "config:GetComplianceDetailsByConfigRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4C7QUTQXCL",
+ "PolicyName": "AWSBackupAuditAccess",
+ "UpdateDate": "2021-08-24T01:02:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBackupFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-18T22:21:52+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "backup:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "backup-storage:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBSnapshots",
+ "rds:ListTagsForResource",
+ "rds:DescribeDBInstances",
+ "rds:describeDBEngineVersions",
+ "rds:describeOptionGroups",
+ "rds:describeOrderableDBInstanceOptions",
+ "rds:describeDBSubnetGroups",
+ "rds:describeDBClusterSnapshots",
+ "rds:describeDBClusters",
+ "rds:describeDBParameterGroups",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBInstanceAutomatedBackups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rds:DeleteDBSnapshot",
+ "rds:DeleteDBClusterSnapshot"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:ListBackups",
+ "dynamodb:ListTables"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:DeleteBackup"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeFilesystems"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVolumes",
+ "ec2:describeAvailabilityZones",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot",
+ "ec2:DeregisterImage"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "tag:GetTagKeys",
+ "tag:GetTagValues",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeCachediSCSIVolumes",
+ "storagegateway:DescribeStorediSCSIVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
+ },
+ {
+ "Action": [
+ "storagegateway:ListGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeGatewayInformation",
+ "storagegateway:ListVolumes",
+ "storagegateway:ListLocalDisks"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "backup.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*AwsBackup*",
+ "arn:aws:iam::*:role/*AWSBackup*"
+ ]
+ },
+ {
+ "Action": "organizations:DescribeOrganization",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:DescribeKey",
+ "kms:GenerateDataKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": true
+ },
+ "ForAnyValue:StringEquals": {
+ "kms:EncryptionContextKeys": "aws:backup:backup-vault"
+ },
+ "StringLike": {
+ "kms:ViaService": "backup.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWSEC2-CreateVssSnapshot",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "fsx:DescribeFileSystems",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "fsx:DescribeBackups",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "fsx:DeleteBackup",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": "ds:DescribeDirectories",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "backup.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "backup-gateway:AssociateGatewayToServer",
+ "backup-gateway:CreateGateway",
+ "backup-gateway:DeleteGateway",
+ "backup-gateway:DeleteHypervisor",
+ "backup-gateway:DisassociateGatewayFromServer",
+ "backup-gateway:ImportHypervisorConfiguration",
+ "backup-gateway:ListGateways",
+ "backup-gateway:ListHypervisors",
+ "backup-gateway:ListTagsForResource",
+ "backup-gateway:ListVirtualMachines",
+ "backup-gateway:PutMaintenanceStartTime",
+ "backup-gateway:TagResource",
+ "backup-gateway:TestHypervisorConfiguration",
+ "backup-gateway:UntagResource",
+ "backup-gateway:UpdateGatewayInformation",
+ "backup-gateway:UpdateHypervisor"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LL52EIPJX",
+ "PolicyName": "AWSBackupFullAccess",
+ "UpdateDate": "2021-11-23T22:00:22+00:00",
+ "VersionId": "v9"
+ },
+ "AWSBackupOperatorAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupOperatorAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-18T22:23:17+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "backup:Get*",
+ "backup:List*",
+ "backup:Describe*",
+ "backup:CreateBackupSelection",
+ "backup:DeleteBackupSelection",
+ "backup:StartBackupJob",
+ "backup:StartRestoreJob",
+ "backup:StartCopyJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBSnapshots",
+ "rds:ListTagsForResource",
+ "rds:DescribeDBInstances",
+ "rds:describeDBEngineVersions",
+ "rds:describeOptionGroups",
+ "rds:describeOrderableDBInstanceOptions",
+ "rds:describeDBSubnetGroups",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBInstanceAutomatedBackups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:ListBackups",
+ "dynamodb:ListTables"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeFilesystems"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVolumes",
+ "ec2:describeAvailabilityZones",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "tag:GetTagKeys",
+ "tag:GetTagValues",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeCachediSCSIVolumes",
+ "storagegateway:DescribeStorediSCSIVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
+ },
+ {
+ "Action": [
+ "storagegateway:ListGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeGatewayInformation",
+ "storagegateway:ListVolumes",
+ "storagegateway:ListLocalDisks"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "backup.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*AwsBackup*",
+ "arn:aws:iam::*:role/*AWSBackup*"
+ ]
+ },
+ {
+ "Action": "organizations:DescribeOrganization",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWSEC2-CreateVssSnapshot",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "fsx:DescribeBackups",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": "fsx:DescribeFileSystems",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:file-system/*"
+ },
+ {
+ "Action": "ds:DescribeDirectories",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "backup-gateway:ListGateways",
+ "backup-gateway:ListHypervisors",
+ "backup-gateway:ListTagsForResource",
+ "backup-gateway:ListVirtualMachines"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KHXVYMY4O",
+ "PolicyName": "AWSBackupOperatorAccess",
+ "UpdateDate": "2021-11-23T22:00:28+00:00",
+ "VersionId": "v8"
+ },
+ "AWSBackupOrganizationAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupOrganizationAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T16:23:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DisableAWSServiceAccess",
+ "organizations:EnableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:AttachPolicy",
+ "organizations:ListPoliciesForTarget",
+ "organizations:ListTargetsForPolicy",
+ "organizations:DetachPolicy",
+ "organizations:DisablePolicyType",
+ "organizations:DescribePolicy",
+ "organizations:DescribeEffectivePolicy",
+ "organizations:ListPolicies",
+ "organizations:EnablePolicyType",
+ "organizations:CreatePolicy",
+ "organizations:UpdatePolicy",
+ "organizations:DeletePolicy"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "organizations:PolicyType": [
+ "BACKUP_POLICY"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:ListRoots",
+ "organizations:ListParents",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListAccountsForParent",
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListChildren",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganizationalUnit"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4E5BC3XLFS",
+ "PolicyName": "AWSBackupOrganizationAdminAccess",
+ "UpdateDate": "2020-11-24T22:09:43+00:00",
+ "VersionId": "v2"
+ },
+ "AWSBackupServiceLinkedRolePolicyForBackup": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSBackupServiceLinkedRolePolicyForBackup",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-02T23:08:40+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticfilesystem:Backup",
+ "elasticfilesystem:DescribeTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws:elasticfilesystem:default-backup": "enabled"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": [
+ "tag:GetResources",
+ "elasticfilesystem:DescribeFileSystems",
+ "dynamodb:ListTables",
+ "storagegateway:ListVolumes",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeInstances",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters",
+ "fsx:DescribeFileSystems",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CopySnapshot"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "AWSBackupManagedResource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*::snapshot/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSBackupManagedResource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*::snapshot/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeImages",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBClusterSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CopySnapshot",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": "ec2:CopyImage",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeregisterImage",
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSBackupManagedResource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rds:AddTagsToResource",
+ "rds:CopyDBSnapshot",
+ "rds:DeleteDBSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:rds:*:*:snapshot:awsbackup:*"
+ },
+ {
+ "Action": [
+ "rds:AddTagsToResource",
+ "rds:CopyDBClusterSnapshot",
+ "rds:DeleteDBClusterSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:rds:*:*:cluster-snapshot:awsbackup:*"
+ },
+ {
+ "Action": "kms:DescribeKey",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListGrants",
+ "kms:ReEncryptFrom",
+ "kms:GenerateDataKeyWithoutPlaintext"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com",
+ "rds.*.amazonaws.com",
+ "fsx.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:CreateGrant",
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": "true"
+ },
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com",
+ "rds.*.amazonaws.com",
+ "fsx.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "fsx:CopyBackup",
+ "fsx:TagResource",
+ "fsx:DescribeBackups",
+ "fsx:DeleteBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": "dynamodb:DeleteBackup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*/backup/*"
+ },
+ {
+ "Action": [
+ "backup-gateway:ListVirtualMachines"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "BackupGateway"
+ },
+ {
+ "Action": [
+ "backup-gateway:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:backup-gateway:*:*:vm/*",
+ "Sid": "ListTagsForBackupGateway"
+ },
+ {
+ "Action": [
+ "dynamodb:ListTagsOfResource",
+ "dynamodb:DescribeTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeCachediSCSIVolumes",
+ "storagegateway:DescribeStorediSCSIVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ONJBD4ZY2",
+ "PolicyName": "AWSBackupServiceLinkedRolePolicyForBackup",
+ "UpdateDate": "2022-02-18T17:38:21+00:00",
+ "VersionId": "v8"
+ },
+ "AWSBackupServiceLinkedRolePolicyForBackupTest": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSBackupServiceLinkedRolePolicyForBackupTest",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-12T17:37:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticfilesystem:Backup",
+ "elasticfilesystem:DescribeTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws:elasticfilesystem:default-backup": "enabled"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KMHRZD5LV",
+ "PolicyName": "AWSBackupServiceLinkedRolePolicyForBackupTest",
+ "UpdateDate": "2020-05-12T17:37:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBackupServiceRolePolicyForBackup": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-10T21:01:28+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeTable",
+ "dynamodb:CreateBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*"
+ },
+ {
+ "Action": [
+ "dynamodb:DescribeBackup",
+ "dynamodb:DeleteBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*/backup/*"
+ },
+ {
+ "Action": [
+ "rds:AddTagsToResource",
+ "rds:ListTagsForResource",
+ "rds:DescribeDBSnapshots",
+ "rds:CreateDBSnapshot",
+ "rds:CopyDBSnapshot",
+ "rds:DescribeDBInstances",
+ "rds:CreateDBClusterSnapshot",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:CopyDBClusterSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rds:ModifyDBInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:db:*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:DeleteDBSnapshot",
+ "rds:ModifyDBSnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:snapshot:awsbackup:*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:DeleteDBClusterSnapshot",
+ "rds:ModifyDBClusterSnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:cluster-snapshot:awsbackup:*"
+ ]
+ },
+ {
+ "Action": [
+ "storagegateway:CreateSnapshot",
+ "storagegateway:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CopySnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CopyImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateImage",
+ "ec2:DeregisterImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:image/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeTags",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceCreditSpecifications",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeElasticGpus",
+ "ec2:DescribeSpotInstanceRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:ModifyImageAttribute"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/aws:backup:source-resource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "backup:DescribeBackupVault",
+ "backup:CopyIntoBackupVault"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:backup:*:*:backup-vault:*"
+ },
+ {
+ "Action": [
+ "backup:CopyFromBackupVault"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:Backup",
+ "elasticfilesystem:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot",
+ "ec2:DeleteSnapshot",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "kms:Decrypt",
+ "kms:GenerateDataKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "dynamodb.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:DescribeKey",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:CreateGrant",
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:GenerateDataKeyWithoutPlaintext"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:kms:*:*:key/*"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWSEC2-CreateVssSnapshot",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "fsx:DescribeBackups",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": "fsx:CreateBackup",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:fsx:*:*:file-system/*",
+ "arn:aws:fsx:*:*:backup/*"
+ ]
+ },
+ {
+ "Action": "fsx:DescribeFileSystems",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:file-system/*"
+ },
+ {
+ "Action": "fsx:ListTagsForResource",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:file-system/*"
+ },
+ {
+ "Action": "fsx:DeleteBackup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": [
+ "fsx:ListTagsForResource",
+ "fsx:ManageBackupPrincipalAssociations",
+ "fsx:CopyBackup",
+ "fsx:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": [
+ "dynamodb:StartAwsBackupJob",
+ "dynamodb:ListTagsOfResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*",
+ "Sid": "DynamodbBackupPermissions"
+ },
+ {
+ "Action": [
+ "backup-gateway:Backup",
+ "backup-gateway:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:backup-gateway:*:*:vm/*",
+ "Sid": "BackupGatewayBackupPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOOYZSLZZXWFJJ5N2",
+ "PolicyName": "AWSBackupServiceRolePolicyForBackup",
+ "UpdateDate": "2021-11-23T22:00:34+00:00",
+ "VersionId": "v11"
+ },
+ "AWSBackupServiceRolePolicyForRestores": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-12T00:23:54+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:Scan",
+ "dynamodb:Query",
+ "dynamodb:UpdateItem",
+ "dynamodb:PutItem",
+ "dynamodb:GetItem",
+ "dynamodb:DeleteItem",
+ "dynamodb:BatchWriteItem",
+ "dynamodb:DescribeTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*"
+ },
+ {
+ "Action": [
+ "dynamodb:RestoreTableFromBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*/backup/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume",
+ "ec2:DeleteVolume"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "storagegateway:DeleteVolume",
+ "storagegateway:DescribeCachediSCSIVolumes",
+ "storagegateway:DescribeStorediSCSIVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
+ },
+ {
+ "Action": [
+ "storagegateway:DescribeGatewayInformation",
+ "storagegateway:CreateStorediSCSIVolume",
+ "storagegateway:CreateCachediSCSIVolume"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:gateway/*"
+ },
+ {
+ "Action": [
+ "storagegateway:ListVolumes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:storagegateway:*:*:*"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSnapshots",
+ "rds:ListTagsForResource",
+ "rds:RestoreDBInstanceFromDBSnapshot",
+ "rds:DeleteDBInstance",
+ "rds:AddTagsToResource",
+ "rds:DescribeDBClusters",
+ "rds:RestoreDBClusterFromSnapshot",
+ "rds:DeleteDBCluster",
+ "rds:RestoreDBInstanceToPointInTime"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:Restore",
+ "elasticfilesystem:CreateFilesystem",
+ "elasticfilesystem:DescribeFilesystems",
+ "elasticfilesystem:DeleteFilesystem"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
+ },
+ {
+ "Action": "kms:DescribeKey",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:Decrypt",
+ "kms:Encrypt",
+ "kms:GenerateDataKey",
+ "kms:ReEncryptTo",
+ "kms:ReEncryptFrom"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "dynamodb.*.amazonaws.com",
+ "ec2.*.amazonaws.com",
+ "elasticfilesystem.*.amazonaws.com",
+ "rds.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:CreateGrant",
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "fsx:CreateFileSystemFromBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:fsx:*:*:file-system/*",
+ "arn:aws:fsx:*:*:backup/*"
+ ]
+ },
+ {
+ "Action": [
+ "fsx:DescribeFileSystems",
+ "fsx:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:file-system/*"
+ },
+ {
+ "Action": "fsx:DescribeBackups",
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ },
+ {
+ "Action": [
+ "fsx:DeleteFileSystem",
+ "fsx:UntagResource"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/aws:backup:source-resource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:file-system/*"
+ },
+ {
+ "Action": "ds:DescribeDirectories",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:RestoreTableFromAwsBackup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*",
+ "Sid": "DynamoDBRestorePermissions"
+ },
+ {
+ "Action": [
+ "backup-gateway:Restore"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:backup-gateway:*:*:hypervisor/*",
+ "Sid": "GatewayRestorePermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZCCL6F2WPVOUXZKI",
+ "PolicyName": "AWSBackupServiceRolePolicyForRestores",
+ "UpdateDate": "2021-11-23T22:00:41+00:00",
+ "VersionId": "v10"
+ },
+ "AWSBackupServiceRolePolicyForS3Backup": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupServiceRolePolicyForS3Backup",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-18T17:40:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "cloudwatch:GetMetricData",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:PutTargets",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:PutRule",
+ "events:RemoveTargets",
+ "events:ListTargetsByRule",
+ "events:DisableRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/AwsBackupManagedRule*"
+ ]
+ },
+ {
+ "Action": "events:ListRules",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:Decrypt",
+ "kms:DescribeKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "s3.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketTagging",
+ "s3:GetInventoryConfiguration",
+ "s3:ListBucketVersions",
+ "s3:ListBucket",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketLocation",
+ "s3:PutInventoryConfiguration",
+ "s3:GetBucketNotification",
+ "s3:PutBucketNotification"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "s3:GetObjectAcl",
+ "s3:GetObject",
+ "s3:GetObjectVersionTagging",
+ "s3:GetObjectVersionAcl",
+ "s3:GetObjectTagging",
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/*"
+ },
+ {
+ "Action": "s3:ListAllMyBuckets",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CGZAHUZ2D",
+ "PolicyName": "AWSBackupServiceRolePolicyForS3Backup",
+ "UpdateDate": "2022-02-26T00:01:09+00:00",
+ "VersionId": "v2"
+ },
+ "AWSBackupServiceRolePolicyForS3Restore": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBackupServiceRolePolicyForS3Restore",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-18T17:39:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucketVersions",
+ "s3:ListBucket",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketLocation",
+ "s3:PutBucketVersioning"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:DeleteObject",
+ "s3:PutObjectVersionAcl",
+ "s3:GetObjectVersionAcl",
+ "s3:GetObjectTagging",
+ "s3:PutObjectTagging",
+ "s3:GetObjectAcl",
+ "s3:PutObjectAcl",
+ "s3:ListMultipartUploadParts",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*/*"
+ ]
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:GenerateDataKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "s3.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KPHGRYXGS",
+ "PolicyName": "AWSBackupServiceRolePolicyForS3Restore",
+ "UpdateDate": "2022-02-18T17:39:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBatchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBatchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T19:35:42+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "batch:*",
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeImages",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ecs:DescribeClusters",
+ "ecs:Describe*",
+ "ecs:List*",
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSBatchServiceRole",
+ "arn:aws:iam::*:role/service-role/AWSBatchServiceRole",
+ "arn:aws:iam::*:role/ecsInstanceRole",
+ "arn:aws:iam::*:instance-profile/ecsInstanceRole",
+ "arn:aws:iam::*:role/iaws-ec2-spot-fleet-role",
+ "arn:aws:iam::*:role/aws-ec2-spot-fleet-role",
+ "arn:aws:iam::*:role/AWSBatchJobRole*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "batch.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*Batch*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7K2KIWB3HZVK3CUO",
+ "PolicyName": "AWSBatchFullAccess",
+ "UpdateDate": "2021-03-10T07:02:45+00:00",
+ "VersionId": "v6"
+ },
+ "AWSBatchServiceEventTargetRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSBatchServiceEventTargetRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-02-28T22:31:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "batch:SubmitJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICVHHZ6XHNMA6VE3Q",
+ "PolicyName": "AWSBatchServiceEventTargetRole",
+ "UpdateDate": "2018-02-28T22:31:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBatchServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T19:36:24+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeImages",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:CreateLaunchTemplate",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:RequestSpotFleet",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:TerminateInstances",
+ "ec2:RunInstances",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:CreateOrUpdateTags",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "ecs:DescribeClusters",
+ "ecs:DescribeContainerInstances",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTasks",
+ "ecs:ListAccountSettings",
+ "ecs:ListClusters",
+ "ecs:ListContainerInstances",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "ecs:ListTasks",
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:RegisterTaskDefinition",
+ "ecs:DeregisterTaskDefinition",
+ "ecs:RunTask",
+ "ecs:StartTask",
+ "ecs:StopTask",
+ "ecs:UpdateContainerAgent",
+ "ecs:DeregisterContainerInstance",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogGroups",
+ "iam:GetInstanceProfile",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ecs:TagResource",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ecs:*:*:task/*_Batch_*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn",
+ "ecs-tasks.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com",
+ "autoscaling.amazonaws.com",
+ "ecs.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUETIXPCKASQJURFE",
+ "PolicyName": "AWSBatchServiceRole",
+ "UpdateDate": "2021-12-07T02:22:29+00:00",
+ "VersionId": "v12"
+ },
+ "AWSBillingReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBillingReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-27T20:08:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewBilling"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LJ3OSZ5SX",
+ "PolicyName": "AWSBillingReadOnlyAccess",
+ "UpdateDate": "2020-08-27T20:08:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBudgetsActionsRolePolicyForResourceAdministrationWithSSM": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBudgetsActionsRolePolicyForResourceAdministrationWithSSM",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-15T17:20:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstanceStatus",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "rds:DescribeDBInstances",
+ "rds:StartDBInstance",
+ "rds:StopDBInstance"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KIUIYBT2X",
+ "PolicyName": "AWSBudgetsActionsRolePolicyForResourceAdministrationWithSSM",
+ "UpdateDate": "2020-10-15T17:20:48+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBudgetsActionsWithAWSResourceControlAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBudgetsActionsWithAWSResourceControlAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-15T17:19:12+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "budgets:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-portal:ViewBilling"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "budgets.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-portal:ModifyBilling",
+ "ec2:DescribeInstances",
+ "iam:ListGroups",
+ "iam:ListPolicies",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "organizations:ListAccounts",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListPolicies",
+ "organizations:ListRoots",
+ "rds:DescribeDBInstances",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AHTKKGHHS",
+ "PolicyName": "AWSBudgetsActionsWithAWSResourceControlAccess",
+ "UpdateDate": "2020-10-15T17:19:12+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBudgetsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBudgetsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-15T17:18:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:ViewBilling",
+ "budgets:ViewBudget",
+ "budgets:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EZCFS6BHW",
+ "PolicyName": "AWSBudgetsReadOnlyAccess",
+ "UpdateDate": "2020-10-15T17:18:28+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBugBustFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBugBustFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-06-24T07:03:26+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-reviewer:DescribeCodeReview",
+ "codeguru-reviewer:ListRecommendations",
+ "codeguru-reviewer:ListCodeReviews"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeGuruReviewerPermission"
+ },
+ {
+ "Action": [
+ "codeguru-profiler:ListProfilingGroups",
+ "codeguru-profiler:DescribeProfilingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeGuruProfilerPermission"
+ },
+ {
+ "Action": [
+ "bugbust:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSBugBustFullAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "bugbust.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/bugbust.amazonaws.com/AWSServiceRoleForBugBust",
+ "Sid": "AWSBugBustSLRCreation"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MQU5DXLFC",
+ "PolicyName": "AWSBugBustFullAccess",
+ "UpdateDate": "2021-07-22T20:04:29+00:00",
+ "VersionId": "v2"
+ },
+ "AWSBugBustPlayerAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSBugBustPlayerAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-06-24T07:15:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-reviewer:DescribeCodeReview",
+ "codeguru-reviewer:ListRecommendations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeGuruReviewerPermission"
+ },
+ {
+ "Action": [
+ "codeguru-profiler:DescribeProfilingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeGuruProfilerPermission"
+ },
+ {
+ "Action": [
+ "bugbust:ListBugs",
+ "bugbust:ListProfilingGroups",
+ "bugbust:JoinEvent",
+ "bugbust:GetEvent",
+ "bugbust:ListEvents",
+ "bugbust:GetJoinEventStatus",
+ "bugbust:ListEventScores",
+ "bugbust:ListEventParticipants",
+ "bugbust:UpdateWorkItem",
+ "bugbust:ListPullRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSBugBustPlayerAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CPEJPLKKR",
+ "PolicyName": "AWSBugBustPlayerAccess",
+ "UpdateDate": "2021-06-24T07:15:00+00:00",
+ "VersionId": "v1"
+ },
+ "AWSBugBustServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSBugBustServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-06-24T06:59:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-reviewer:ListRecommendations",
+ "codeguru-reviewer:UntagResource",
+ "codeguru-reviewer:DescribeCodeReview"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/bugbust": "enabled"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LXHZTN64K",
+ "PolicyName": "AWSBugBustServiceRolePolicy",
+ "UpdateDate": "2021-06-24T06:59:05+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCertificateManagerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-21T17:02:36+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "acm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/acm.amazonaws.com/AWSServiceRoleForCertificateManager*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/acm.amazonaws.com/AWSServiceRoleForCertificateManager*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYCHABBP6VQIVBCBQ",
+ "PolicyName": "AWSCertificateManagerFullAccess",
+ "UpdateDate": "2020-08-17T22:18:28+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCertificateManagerPrivateCAAuditor": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerPrivateCAAuditor",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-23T16:51:08+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:CreateCertificateAuthorityAuditReport",
+ "acm-pca:DescribeCertificateAuthority",
+ "acm-pca:DescribeCertificateAuthorityAuditReport",
+ "acm-pca:GetCertificateAuthorityCsr",
+ "acm-pca:GetCertificateAuthorityCertificate",
+ "acm-pca:GetCertificate",
+ "acm-pca:GetPolicy",
+ "acm-pca:ListPermissions",
+ "acm-pca:ListTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:ListCertificateAuthorities"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJW77VE4UEBJ4PEXEY",
+ "PolicyName": "AWSCertificateManagerPrivateCAAuditor",
+ "UpdateDate": "2020-08-17T22:54:12+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCertificateManagerPrivateCAFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerPrivateCAFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-23T16:54:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIRTQUC55CREAWFLBG",
+ "PolicyName": "AWSCertificateManagerPrivateCAFullAccess",
+ "UpdateDate": "2018-10-23T16:54:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCertificateManagerPrivateCAPrivilegedUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerPrivateCAPrivilegedUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-20T17:43:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:IssueCertificate"
+ ],
+ "Condition": {
+ "StringLike": {
+ "acm-pca:TemplateArn": [
+ "arn:aws:acm-pca:::template/*CACertificate*/V*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:IssueCertificate"
+ ],
+ "Condition": {
+ "StringNotLike": {
+ "acm-pca:TemplateArn": [
+ "arn:aws:acm-pca:::template/*CACertificate*/V*"
+ ]
+ }
+ },
+ "Effect": "Deny",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:RevokeCertificate",
+ "acm-pca:GetCertificate",
+ "acm-pca:ListPermissions"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:ListCertificateAuthorities"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EQ6CWU5X5",
+ "PolicyName": "AWSCertificateManagerPrivateCAPrivilegedUser",
+ "UpdateDate": "2019-06-20T17:43:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCertificateManagerPrivateCAReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerPrivateCAReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-23T16:57:04+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "acm-pca:DescribeCertificateAuthority",
+ "acm-pca:DescribeCertificateAuthorityAuditReport",
+ "acm-pca:ListCertificateAuthorities",
+ "acm-pca:GetCertificateAuthorityCsr",
+ "acm-pca:GetCertificateAuthorityCertificate",
+ "acm-pca:GetCertificate",
+ "acm-pca:GetPolicy",
+ "acm-pca:ListPermissions",
+ "acm-pca:ListTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQAQT3WIXOXY7TD4A",
+ "PolicyName": "AWSCertificateManagerPrivateCAReadOnly",
+ "UpdateDate": "2020-08-17T22:54:22+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCertificateManagerPrivateCAUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerPrivateCAUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-23T16:53:33+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:IssueCertificate"
+ ],
+ "Condition": {
+ "StringLike": {
+ "acm-pca:TemplateArn": [
+ "arn:aws:acm-pca:::template/EndEntityCertificate/V*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:IssueCertificate"
+ ],
+ "Condition": {
+ "StringNotLike": {
+ "acm-pca:TemplateArn": [
+ "arn:aws:acm-pca:::template/EndEntityCertificate/V*"
+ ]
+ }
+ },
+ "Effect": "Deny",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:RevokeCertificate",
+ "acm-pca:GetCertificate",
+ "acm-pca:ListPermissions"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:acm-pca:*:*:certificate-authority/*"
+ },
+ {
+ "Action": [
+ "acm-pca:ListCertificateAuthorities"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBXCSJJULLMRWSNII",
+ "PolicyName": "AWSCertificateManagerPrivateCAUser",
+ "UpdateDate": "2019-06-20T17:42:37+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCertificateManagerReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCertificateManagerReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-21T17:07:33+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:GetCertificate",
+ "acm:ListTagsForCertificate",
+ "acm:GetAccountConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4GSWX6S4MESJ3EWC",
+ "PolicyName": "AWSCertificateManagerReadOnly",
+ "UpdateDate": "2021-03-15T16:25:21+00:00",
+ "VersionId": "v4"
+ },
+ "AWSChatbotServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSChatbotServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-18T16:39:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Unsubscribe",
+ "sns:Subscribe",
+ "sns:ListSubscriptions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/chatbot/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ID4WRYKST",
+ "PolicyName": "AWSChatbotServiceLinkedRolePolicy",
+ "UpdateDate": "2019-11-18T16:39:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloud9Administrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloud9Administrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:17:28+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloud9:*",
+ "iam:GetUser",
+ "iam:ListUsers",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "cloud9.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:StartSession",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "cloud9.amazonaws.com"
+ },
+ "StringLike": {
+ "ssm:resourceTag/aws:cloud9:environment": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQ4KWP455WDTCBGWK",
+ "PolicyName": "AWSCloud9Administrator",
+ "UpdateDate": "2020-07-29T06:28:54+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloud9EnvironmentMember": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloud9EnvironmentMember",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:18:28+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloud9:GetUserSettings",
+ "cloud9:UpdateUserSettings",
+ "iam:GetUser",
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloud9:DescribeEnvironmentMemberships"
+ ],
+ "Condition": {
+ "Null": {
+ "cloud9:EnvironmentId": "true",
+ "cloud9:UserArn": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "ssm:StartSession",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "cloud9.amazonaws.com"
+ },
+ "StringLike": {
+ "ssm:resourceTag/aws:cloud9:environment": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI54ULAIPVT5HFTYGK",
+ "PolicyName": "AWSCloud9EnvironmentMember",
+ "UpdateDate": "2020-07-29T06:29:08+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloud9SSMInstanceProfile": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-14T11:40:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssmmessages:CreateControlChannel",
+ "ssmmessages:CreateDataChannel",
+ "ssmmessages:OpenControlChannel",
+ "ssmmessages:OpenDataChannel",
+ "ssm:UpdateInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IQOSNAKW6",
+ "PolicyName": "AWSCloud9SSMInstanceProfile",
+ "UpdateDate": "2020-05-14T11:40:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloud9ServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSCloud9ServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T13:44:08+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:DeleteSecurityGroup",
+ "ec2:AuthorizeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/aws-cloud9-*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/Name": "aws-cloud9-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-name": "aws-cloud9-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:license-manager:*:*:license-configuration:*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:ListInstanceProfiles",
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:instance-profile/cloud9/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSCloud9SSMAccessRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFXGCBXQIZATFZ4YG",
+ "PolicyName": "AWSCloud9ServiceRolePolicy",
+ "UpdateDate": "2022-01-17T14:06:15+00:00",
+ "VersionId": "v8"
+ },
+ "AWSCloud9User": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloud9User",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:16:17+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloud9:ValidateEnvironmentName",
+ "cloud9:UpdateUserSettings",
+ "cloud9:GetUserSettings",
+ "iam:GetUser",
+ "iam:ListUsers",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloud9:CreateEnvironmentEC2",
+ "cloud9:CreateEnvironmentSSH"
+ ],
+ "Condition": {
+ "Null": {
+ "cloud9:OwnerArn": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloud9:GetUserPublicKey"
+ ],
+ "Condition": {
+ "Null": {
+ "cloud9:UserArn": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloud9:DescribeEnvironmentMemberships"
+ ],
+ "Condition": {
+ "Null": {
+ "cloud9:EnvironmentId": "true",
+ "cloud9:UserArn": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "cloud9.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:StartSession",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "cloud9.amazonaws.com"
+ },
+ "StringLike": {
+ "ssm:resourceTag/aws:cloud9:environment": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPFGFWQF67QVARP6U",
+ "PolicyName": "AWSCloud9User",
+ "UpdateDate": "2020-07-29T06:26:43+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCloudFormationFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudFormationFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-26T21:50:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CRR3ZS723",
+ "PolicyName": "AWSCloudFormationFullAccess",
+ "UpdateDate": "2019-07-26T21:50:35+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudFormationReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudFormationReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:49+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:Describe*",
+ "cloudformation:EstimateTemplateCost",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:ValidateTemplate",
+ "cloudformation:Detect*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWVBEE4I2POWLODLW",
+ "PolicyName": "AWSCloudFormationReadOnlyAccess",
+ "UpdateDate": "2019-11-13T17:40:07+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCloudFrontLogger": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSCloudFrontLogger",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-12T20:15:23+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/cloudfront/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOI7RPKLCNINBTRP4",
+ "PolicyName": "AWSCloudFrontLogger",
+ "UpdateDate": "2019-11-22T19:33:51+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloudHSMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudHSMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "cloudhsm:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMBQYQZM7F63DA2UU",
+ "PolicyName": "AWSCloudHSMFullAccess",
+ "UpdateDate": "2015-02-06T18:39:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudHSMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudHSMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudhsm:Get*",
+ "cloudhsm:List*",
+ "cloudhsm:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAISVCBSY7YDBOT67KE",
+ "PolicyName": "AWSCloudHSMReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudHSMRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCloudHSMRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateTags",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DetachNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI7QIUU4GC66SF26WE",
+ "PolicyName": "AWSCloudHSMRole",
+ "UpdateDate": "2015-02-06T18:41:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudMapDiscoverInstanceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudMapDiscoverInstanceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-29T00:02:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicediscovery:DiscoverInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPRD7PYYQVYPDME4K",
+ "PolicyName": "AWSCloudMapDiscoverInstanceAccess",
+ "UpdateDate": "2018-11-29T00:02:42+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudMapFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudMapFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T23:57:31+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:GetHostedZone",
+ "route53:ListHostedZonesByName",
+ "route53:CreateHostedZone",
+ "route53:DeleteHostedZone",
+ "route53:ChangeResourceRecordSets",
+ "route53:CreateHealthCheck",
+ "route53:GetHealthCheck",
+ "route53:DeleteHealthCheck",
+ "route53:UpdateHealthCheck",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRegions",
+ "ec2:DescribeInstances",
+ "servicediscovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZPIMAQZJS3WUXUJM",
+ "PolicyName": "AWSCloudMapFullAccess",
+ "UpdateDate": "2020-07-29T19:15:35+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloudMapReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudMapReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T23:45:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicediscovery:Get*",
+ "servicediscovery:List*",
+ "servicediscovery:DiscoverInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOHISHKLCJTVQQL5E",
+ "PolicyName": "AWSCloudMapReadOnlyAccess",
+ "UpdateDate": "2018-11-28T23:45:26+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudMapRegisterInstanceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudMapRegisterInstanceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-29T00:04:57+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:GetHostedZone",
+ "route53:ListHostedZonesByName",
+ "route53:ChangeResourceRecordSets",
+ "route53:CreateHealthCheck",
+ "route53:GetHealthCheck",
+ "route53:DeleteHealthCheck",
+ "route53:UpdateHealthCheck",
+ "servicediscovery:Get*",
+ "servicediscovery:List*",
+ "servicediscovery:RegisterInstance",
+ "servicediscovery:DeregisterInstance",
+ "servicediscovery:DiscoverInstances",
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4P5Z5HXVWJ75WQBC",
+ "PolicyName": "AWSCloudMapRegisterInstanceAccess",
+ "UpdateDate": "2020-07-29T17:57:24+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCloudShellFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudShellFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T18:07:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudshell:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HEDUXFSA3",
+ "PolicyName": "AWSCloudShellFullAccess",
+ "UpdateDate": "2020-12-15T18:07:44+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCloudTrailReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudTrailReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:59+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudtrail:GetTrail",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:ListTrails",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:ListTags",
+ "cloudtrail:ListPublicKeys",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetInsightSelectors",
+ "s3:ListAllMyBuckets",
+ "kms:ListAliases",
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDU7KJADWBSEQ3E7S",
+ "PolicyName": "AWSCloudTrailReadOnlyAccess",
+ "UpdateDate": "2019-11-20T21:06:49+00:00",
+ "VersionId": "v9"
+ },
+ "AWSCloudTrail_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCloudTrail_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-08T23:41:15+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:AddPermission",
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:aws-cloudtrail-logs*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:PutBucketPolicy",
+ "s3:PutBucketPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-cloudtrail-logs*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudtrail:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:aws-cloudtrail-logs*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetUser"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "cloudtrail.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateKey",
+ "kms:CreateAlias",
+ "kms:ListKeys",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:ListGlobalTables",
+ "dynamodb:ListTables"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CA4SIJQAM",
+ "PolicyName": "AWSCloudTrail_FullAccess",
+ "UpdateDate": "2021-02-22T19:01:00+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCloudWatchAlarms_ActionSSMIncidentsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSCloudWatchAlarms_ActionSSMIncidentsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-27T13:30:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ssm-incidents:StartIncident",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "StartIncidentPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JS7SI2RZY",
+ "PolicyName": "AWSCloudWatchAlarms_ActionSSMIncidentsServiceRolePolicy",
+ "UpdateDate": "2021-04-27T13:30:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeArtifactAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeArtifactAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-16T23:53:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeartifact:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "sts:GetServiceBearerToken",
+ "Condition": {
+ "StringEquals": {
+ "sts:AWSServiceName": "codeartifact.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MBONPJNI5",
+ "PolicyName": "AWSCodeArtifactAdminAccess",
+ "UpdateDate": "2020-06-16T23:53:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeArtifactReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeArtifactReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-25T21:23:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeartifact:Describe*",
+ "codeartifact:Get*",
+ "codeartifact:List*",
+ "codeartifact:ReadFromRepository"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "sts:GetServiceBearerToken",
+ "Condition": {
+ "StringEquals": {
+ "sts:AWSServiceName": "codeartifact.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PVTKOJHFB",
+ "PolicyName": "AWSCodeArtifactReadOnlyAccess",
+ "UpdateDate": "2020-06-25T21:23:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeBuildAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:04:44+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:*",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "elasticfilesystem:DescribeFileSystems",
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:DisableRule",
+ "events:EnableRule",
+ "events:ListTargetsByRule",
+ "events:ListRuleNamesByTarget",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "logs:GetLogEvents",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DeleteLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/*:log-stream:*"
+ },
+ {
+ "Action": [
+ "ssm:PutParameter"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/CodeBuild/*"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:task/*/*"
+ },
+ {
+ "Action": [
+ "codestar-connections:CreateConnection",
+ "codestar-connections:DeleteConnection",
+ "codestar-connections:UpdateConnectionInstallation",
+ "codestar-connections:TagResource",
+ "codestar-connections:UntagResource",
+ "codestar-connections:ListConnections",
+ "codestar-connections:ListInstallationTargets",
+ "codestar-connections:ListTagsForResource",
+ "codestar-connections:GetConnection",
+ "codestar-connections:GetIndividualAccessToken",
+ "codestar-connections:GetInstallationUrl",
+ "codestar-connections:PassConnection",
+ "codestar-connections:StartOAuthHandshake",
+ "codestar-connections:UseConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:DeleteNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codebuild:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codestar-notifications*",
+ "Sid": "CodeStarNotificationsSNSTopicCreateAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicListAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQJGIOIE3CD2TQXDS",
+ "PolicyName": "AWSCodeBuildAdminAccess",
+ "UpdateDate": "2020-09-14T16:03:39+00:00",
+ "VersionId": "v12"
+ },
+ "AWSCodeBuildDeveloperAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildDeveloperAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:02:32+00:00",
+ "DefaultVersionId": "v13",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:StartBuild",
+ "codebuild:StopBuild",
+ "codebuild:StartBuildBatch",
+ "codebuild:StopBuildBatch",
+ "codebuild:RetryBuild",
+ "codebuild:RetryBuildBatch",
+ "codebuild:BatchGet*",
+ "codebuild:GetResourcePolicy",
+ "codebuild:DescribeTestCases",
+ "codebuild:DescribeCodeCoverages",
+ "codebuild:List*",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository",
+ "codecommit:ListBranches",
+ "cloudwatch:GetMetricStatistics",
+ "events:DescribeRule",
+ "events:ListTargetsByRule",
+ "events:ListRuleNamesByTarget",
+ "logs:GetLogEvents",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:PutParameter"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/CodeBuild/*"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:task/*/*"
+ },
+ {
+ "Action": [
+ "codestar-connections:ListConnections",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsUserAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codebuild:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicListAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMKTMR34XSBQW45HS",
+ "PolicyName": "AWSCodeBuildDeveloperAccess",
+ "UpdateDate": "2020-09-14T16:03:44+00:00",
+ "VersionId": "v13"
+ },
+ "AWSCodeBuildReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeBuildReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T19:03:41+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codebuild:BatchGet*",
+ "codebuild:GetResourcePolicy",
+ "codebuild:List*",
+ "codebuild:DescribeTestCases",
+ "codebuild:DescribeCodeCoverages",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetRepository",
+ "cloudwatch:GetMetricStatistics",
+ "events:DescribeRule",
+ "events:ListTargetsByRule",
+ "events:ListRuleNamesByTarget",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-connections:ListConnections",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsUserAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:DescribeNotificationRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codebuild:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsPowerUserAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJIZZWN6557F5HVP2K",
+ "PolicyName": "AWSCodeBuildReadOnlyAccess",
+ "UpdateDate": "2020-09-14T16:04:04+00:00",
+ "VersionId": "v11"
+ },
+ "AWSCodeCommitFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:02:19+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:DisableRule",
+ "events:EnableRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/codecommit*",
+ "Sid": "CloudWatchEventsCodeCommitRulesAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codecommit*",
+ "Sid": "SNSTopicAndSubscriptionAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicAndSubscriptionReadAccess"
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LambdaReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListAccessKeys",
+ "iam:ListSSHPublicKeys",
+ "iam:ListServiceSpecificCredentials"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMReadOnlyConsoleAccess"
+ },
+ {
+ "Action": [
+ "iam:DeleteSSHPublicKey",
+ "iam:GetSSHPublicKey",
+ "iam:ListSSHPublicKeys",
+ "iam:UpdateSSHPublicKey",
+ "iam:UploadSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMUserSSHKeys"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceSpecificCredential",
+ "iam:UpdateServiceSpecificCredential",
+ "iam:DeleteServiceSpecificCredential",
+ "iam:ResetServiceSpecificCredential"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMSelfManageServiceSpecificCredentials"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:DeleteNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codecommit:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codestar-notifications*",
+ "Sid": "CodeStarNotificationsSNSTopicCreateAccess"
+ },
+ {
+ "Action": [
+ "codeguru-reviewer:AssociateRepository",
+ "codeguru-reviewer:DescribeRepositoryAssociation",
+ "codeguru-reviewer:ListRepositoryAssociations",
+ "codeguru-reviewer:DisassociateRepository",
+ "codeguru-reviewer:DescribeCodeReview",
+ "codeguru-reviewer:ListCodeReviews"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonCodeGuruReviewerFullAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/codeguru-reviewer.amazonaws.com/AWSServiceRoleForAmazonCodeGuruReviewer",
+ "Sid": "AmazonCodeGuruReviewerSLRCreation"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsManagedRules"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ },
+ {
+ "Action": [
+ "codestar-connections:ListConnections",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4VCZ3XPIZLQ5NZV2",
+ "PolicyName": "AWSCodeCommitFullAccess",
+ "UpdateDate": "2020-07-30T23:17:35+00:00",
+ "VersionId": "v9"
+ },
+ "AWSCodeCommitPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:06:49+00:00",
+ "DefaultVersionId": "v14",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:AssociateApprovalRuleTemplateWithRepository",
+ "codecommit:BatchAssociateApprovalRuleTemplateWithRepositories",
+ "codecommit:BatchDisassociateApprovalRuleTemplateFromRepositories",
+ "codecommit:BatchGet*",
+ "codecommit:BatchDescribe*",
+ "codecommit:Create*",
+ "codecommit:DeleteBranch",
+ "codecommit:DeleteFile",
+ "codecommit:Describe*",
+ "codecommit:DisassociateApprovalRuleTemplateFromRepository",
+ "codecommit:EvaluatePullRequestApprovalRules",
+ "codecommit:Get*",
+ "codecommit:List*",
+ "codecommit:Merge*",
+ "codecommit:OverridePullRequestApprovalRules",
+ "codecommit:Put*",
+ "codecommit:Post*",
+ "codecommit:TagResource",
+ "codecommit:Test*",
+ "codecommit:UntagResource",
+ "codecommit:Update*",
+ "codecommit:GitPull",
+ "codecommit:GitPush"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:DisableRule",
+ "events:EnableRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/codecommit*",
+ "Sid": "CloudWatchEventsCodeCommitRulesAccess"
+ },
+ {
+ "Action": [
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codecommit*",
+ "Sid": "SNSTopicAndSubscriptionAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicAndSubscriptionReadAccess"
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LambdaReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListAccessKeys",
+ "iam:ListSSHPublicKeys",
+ "iam:ListServiceSpecificCredentials"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMReadOnlyConsoleAccess"
+ },
+ {
+ "Action": [
+ "iam:DeleteSSHPublicKey",
+ "iam:GetSSHPublicKey",
+ "iam:ListSSHPublicKeys",
+ "iam:UpdateSSHPublicKey",
+ "iam:UploadSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMUserSSHKeys"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceSpecificCredential",
+ "iam:UpdateServiceSpecificCredential",
+ "iam:DeleteServiceSpecificCredential",
+ "iam:ResetServiceSpecificCredential"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMSelfManageServiceSpecificCredentials"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codecommit:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "codeguru-reviewer:AssociateRepository",
+ "codeguru-reviewer:DescribeRepositoryAssociation",
+ "codeguru-reviewer:ListRepositoryAssociations",
+ "codeguru-reviewer:DisassociateRepository",
+ "codeguru-reviewer:DescribeCodeReview",
+ "codeguru-reviewer:ListCodeReviews"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonCodeGuruReviewerFullAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/codeguru-reviewer.amazonaws.com/AWSServiceRoleForAmazonCodeGuruReviewer",
+ "Sid": "AmazonCodeGuruReviewerSLRCreation"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsManagedRules"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ },
+ {
+ "Action": [
+ "codestar-connections:ListConnections",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4UIINUVGB5SEC57G",
+ "PolicyName": "AWSCodeCommitPowerUser",
+ "UpdateDate": "2020-07-30T23:12:48+00:00",
+ "VersionId": "v14"
+ },
+ "AWSCodeCommitReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeCommitReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:05:06+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:BatchGet*",
+ "codecommit:BatchDescribe*",
+ "codecommit:Describe*",
+ "codecommit:EvaluatePullRequestApprovalRules",
+ "codecommit:Get*",
+ "codecommit:List*",
+ "codecommit:GitPull"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/codecommit*",
+ "Sid": "CloudWatchEventsCodeCommitRulesReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSSubscriptionAccess"
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LambdaReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMReadOnlyListAccess"
+ },
+ {
+ "Action": [
+ "iam:ListSSHPublicKeys",
+ "iam:ListServiceSpecificCredentials",
+ "iam:ListAccessKeys",
+ "iam:GetSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}",
+ "Sid": "IAMReadOnlyConsoleAccess"
+ },
+ {
+ "Action": [
+ "codestar-connections:ListConnections",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "CodeStarConnectionsReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:DescribeNotificationRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codecommit:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "codeguru-reviewer:DescribeRepositoryAssociation",
+ "codeguru-reviewer:ListRepositoryAssociations",
+ "codeguru-reviewer:DescribeCodeReview",
+ "codeguru-reviewer:ListCodeReviews"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonCodeGuruReviewerReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJACNSXR7Z2VLJW3D6",
+ "PolicyName": "AWSCodeCommitReadOnly",
+ "UpdateDate": "2021-08-18T18:18:01+00:00",
+ "VersionId": "v11"
+ },
+ "AWSCodeDeployDeployerAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployDeployerAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:18:43+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codedeploy:Batch*",
+ "codedeploy:CreateDeployment",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codedeploy:RegisterApplicationRevision"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codedeploy:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicListAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUWEPOMGLMVXJAPUI",
+ "PolicyName": "AWSCodeDeployDeployerAccess",
+ "UpdateDate": "2020-04-02T16:16:11+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:13:23+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "codedeploy:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:DeleteNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codedeploy:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codestar-notifications*",
+ "Sid": "CodeStarNotificationsSNSTopicCreateAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSTopicListAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIONKN3TJZUKXCHXWC",
+ "PolicyName": "AWSCodeDeployFullAccess",
+ "UpdateDate": "2020-04-02T16:14:47+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:21:32+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-notifications:DescribeNotificationRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codedeploy:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsPowerUserAccess"
+ },
+ {
+ "Action": [
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsListAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILZHHKCKB4NE7XOIQ",
+ "PolicyName": "AWSCodeDeployReadOnlyAccess",
+ "UpdateDate": "2020-04-02T16:20:09+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-04T18:05:37+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:CompleteLifecycleAction",
+ "autoscaling:DeleteLifecycleHook",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:PutLifecycleHook",
+ "autoscaling:RecordLifecycleActionHeartbeat",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:EnableMetricsCollection",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:AttachLoadBalancers",
+ "autoscaling:AttachLoadBalancerTargetGroups",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:PutWarmPool",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DeleteAutoScalingGroup",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:TerminateInstances",
+ "tag:GetResources",
+ "sns:Publish",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeregisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ2NKMKD73QS5NBFLA",
+ "PolicyName": "AWSCodeDeployRole",
+ "UpdateDate": "2021-05-19T00:42:51+00:00",
+ "VersionId": "v9"
+ },
+ "AWSCodeDeployRoleForCloudFormation": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForCloudFormation",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-19T17:12:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:CodeDeployHook_*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CO24UTMFH",
+ "PolicyName": "AWSCodeDeployRoleForCloudFormation",
+ "UpdateDate": "2020-05-19T17:12:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeDeployRoleForECS": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployRoleForECS",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T20:40:57+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:DescribeServices",
+ "ecs:CreateTaskSet",
+ "ecs:UpdateServicePrimaryTaskSet",
+ "ecs:DeleteTaskSet",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:ModifyListener",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:ModifyRule",
+ "lambda:InvokeFunction",
+ "cloudwatch:DescribeAlarms",
+ "sns:Publish",
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ecs-tasks.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIIL3KXEKRGEN2HFIO",
+ "PolicyName": "AWSCodeDeployRoleForECS",
+ "UpdateDate": "2019-09-23T22:37:46+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployRoleForECSLimited": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeDeployRoleForECSLimited",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T20:42:42+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:DescribeServices",
+ "ecs:CreateTaskSet",
+ "ecs:UpdateServicePrimaryTaskSet",
+ "ecs:DeleteTaskSet",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:CodeDeployTopic_*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:ModifyListener",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:ModifyRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:CodeDeployHook_*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/UseWithCodeDeploy": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ecs-tasks.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/ecsTaskExecutionRole",
+ "arn:aws:iam::*:role/ECSTaskExecution*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6Z7L2IOXEFFOGD2M",
+ "PolicyName": "AWSCodeDeployRoleForECSLimited",
+ "UpdateDate": "2019-09-23T22:10:29+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployRoleForLambda": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForLambda",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-28T14:05:44+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "lambda:UpdateAlias",
+ "lambda:GetAlias",
+ "lambda:GetProvisionedConcurrencyConfig",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/CodeDeploy/*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/UseWithCodeDeploy": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:CodeDeployHook_*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJA3RQZIKNOSJ4ZQSA",
+ "PolicyName": "AWSCodeDeployRoleForLambda",
+ "UpdateDate": "2019-12-03T19:53:10+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodeDeployRoleForLambdaLimited": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForLambdaLimited",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-17T17:14:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "lambda:UpdateAlias",
+ "lambda:GetAlias",
+ "lambda:GetProvisionedConcurrencyConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/CodeDeploy/*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/UseWithCodeDeploy": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:CodeDeployHook_*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4C55RUFGEB",
+ "PolicyName": "AWSCodeDeployRoleForLambdaLimited",
+ "UpdateDate": "2020-08-17T17:14:14+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodePipelineApproverAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineApproverAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-07-28T18:59:17+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:ListPipelineExecutions",
+ "codepipeline:ListPipelines",
+ "codepipeline:PutApprovalResult"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICXNWK42SQ6LMDXM2",
+ "PolicyName": "AWSCodePipelineApproverAccess",
+ "UpdateDate": "2017-08-02T17:24:58+00:00",
+ "VersionId": "v3"
+ },
+ "AWSCodePipelineCustomActionAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineCustomActionAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:02:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:AcknowledgeJob",
+ "codepipeline:GetJobDetails",
+ "codepipeline:PollForJobs",
+ "codepipeline:PutJobFailureResult",
+ "codepipeline:PutJobSuccessResult"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFW5Z32BTVF76VCYC",
+ "PolicyName": "AWSCodePipelineCustomActionAccess",
+ "UpdateDate": "2015-07-09T17:02:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodePipelineFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T16:58:07+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:*",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListChangeSets",
+ "cloudtrail:CreateTrail",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:PutEventSelectors",
+ "cloudtrail:StartLogging",
+ "codebuild:BatchGetProjects",
+ "codebuild:CreateProject",
+ "codebuild:ListCuratedEnvironmentImages",
+ "codebuild:ListProjects",
+ "codecommit:GetBranch",
+ "codecommit:GetRepositoryTriggers",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "codecommit:PutRepositoryTriggers",
+ "codecommit:GetReferences",
+ "codedeploy:GetApplication",
+ "codedeploy:BatchGetApplications",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:BatchGetDeploymentGroups",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentGroups",
+ "devicefarm:GetDevicePool",
+ "devicefarm:GetProject",
+ "devicefarm:ListDevicePools",
+ "devicefarm:ListProjects",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:ListClusters",
+ "ecs:ListServices",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "iam:ListRoles",
+ "iam:GetRole",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "events:DescribeRule",
+ "opsworks:DescribeApps",
+ "opsworks:DescribeLayers",
+ "opsworks:DescribeStacks",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketVersioning",
+ "s3:GetObjectVersion",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sns:ListTopics",
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes",
+ "states:ListStateMachines"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:CreateBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3::*:codepipeline-*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "events.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/cwe-role-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "codepipeline.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:DisableRule",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/codepipeline-*"
+ ]
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:DeleteNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codepipeline:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codestar-notifications*",
+ "Sid": "CodeStarNotificationsSNSTopicCreateAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJP5LH77KSAT2KHQGG",
+ "PolicyName": "AWSCodePipelineFullAccess",
+ "UpdateDate": "2020-05-21T22:03:13+00:00",
+ "VersionId": "v10"
+ },
+ "AWSCodePipelineReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipelineReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T16:43:57+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:ListPipelineExecutions",
+ "codepipeline:ListActionExecutions",
+ "codepipeline:ListActionTypes",
+ "codepipeline:ListPipelines",
+ "codepipeline:ListTagsForResource",
+ "iam:ListRoles",
+ "s3:GetBucketPolicy",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "codecommit:ListBranches",
+ "codecommit:ListRepositories",
+ "codedeploy:GetApplication",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentGroups",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "opsworks:DescribeApps",
+ "opsworks:DescribeLayers",
+ "opsworks:DescribeStacks",
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-notifications:DescribeNotificationRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codepipeline:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILFKZXIBOTNC5TO2Q",
+ "PolicyName": "AWSCodePipelineReadOnlyAccess",
+ "UpdateDate": "2020-03-26T16:07:17+00:00",
+ "VersionId": "v9"
+ },
+ "AWSCodePipeline_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipeline_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-03T22:38:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:*",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListChangeSets",
+ "cloudtrail:DescribeTrails",
+ "codebuild:BatchGetProjects",
+ "codebuild:CreateProject",
+ "codebuild:ListCuratedEnvironmentImages",
+ "codebuild:ListProjects",
+ "codecommit:ListBranches",
+ "codecommit:GetReferences",
+ "codecommit:ListRepositories",
+ "codedeploy:BatchGetDeploymentGroups",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentGroups",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:ListClusters",
+ "ecs:ListServices",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "iam:ListRoles",
+ "iam:GetRole",
+ "lambda:ListFunctions",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "events:DescribeRule",
+ "opsworks:DescribeApps",
+ "opsworks:DescribeLayers",
+ "opsworks:DescribeStacks",
+ "s3:ListAllMyBuckets",
+ "sns:ListTopics",
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListTargets",
+ "codestar-notifications:ListTagsforResource",
+ "codestar-notifications:ListEventTypes",
+ "states:ListStateMachines"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketVersioning",
+ "s3:GetObjectVersion",
+ "s3:CreateBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3::*:codepipeline-*"
+ },
+ {
+ "Action": [
+ "cloudtrail:PutEventSelectors",
+ "cloudtrail:CreateTrail",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:StartLogging"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/codepipeline-source-trail"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "events.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/cwe-role-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "codepipeline.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:DisableRule",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/codepipeline-*"
+ ]
+ },
+ {
+ "Action": [
+ "codestar-notifications:CreateNotificationRule",
+ "codestar-notifications:DescribeNotificationRule",
+ "codestar-notifications:UpdateNotificationRule",
+ "codestar-notifications:DeleteNotificationRule",
+ "codestar-notifications:Subscribe",
+ "codestar-notifications:Unsubscribe"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codepipeline:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadWriteAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:codestar-notifications*",
+ "Sid": "CodeStarNotificationsSNSTopicCreateAccess"
+ },
+ {
+ "Action": [
+ "chatbot:DescribeSlackChannelConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsChatbotAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4A6ZKP3LKA",
+ "PolicyName": "AWSCodePipeline_FullAccess",
+ "UpdateDate": "2020-08-03T22:38:28+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodePipeline_ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodePipeline_ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-03T22:25:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:ListPipelineExecutions",
+ "codepipeline:ListActionExecutions",
+ "codepipeline:ListActionTypes",
+ "codepipeline:ListPipelines",
+ "codepipeline:ListTagsForResource",
+ "s3:ListAllMyBuckets",
+ "codestar-notifications:ListNotificationRules",
+ "codestar-notifications:ListEventTypes",
+ "codestar-notifications:ListTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3::*:codepipeline-*"
+ },
+ {
+ "Action": [
+ "codestar-notifications:DescribeNotificationRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "codestar-notifications:NotificationsForResource": "arn:aws:codepipeline:*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarNotificationsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IGBTPGT6W",
+ "PolicyName": "AWSCodePipeline_ReadOnlyAccess",
+ "UpdateDate": "2020-08-03T22:25:17+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCodeStarFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCodeStarFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-19T16:23:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codestar:*",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "cloud9:DescribeEnvironment*",
+ "cloud9:ValidateEnvironmentName"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeStarEC2"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStack*",
+ "cloudformation:GetTemplateSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awscodestar-*"
+ ],
+ "Sid": "CodeStarCF"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXI233TFUGLZOJBEC",
+ "PolicyName": "AWSCodeStarFullAccess",
+ "UpdateDate": "2018-01-10T21:54:06+00:00",
+ "VersionId": "v2"
+ },
+ "AWSCodeStarNotificationsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSCodeStarNotificationsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-05T16:10:21+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:PutTargets",
+ "events:PutRule",
+ "events:DescribeRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/awscodestarnotifications-*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:CodeStarNotifications-*"
+ },
+ {
+ "Action": [
+ "codecommit:GetCommentsForPullRequest",
+ "codecommit:GetCommentsForComparedCommit",
+ "chatbot:DescribeSlackChannelConfigurations",
+ "chatbot:UpdateSlackChannelConfiguration",
+ "codecommit:GetDifferences",
+ "codepipeline:ListActionExecutions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codecommit:GetFile"
+ ],
+ "Condition": {
+ "StringNotEquals": {
+ "aws:ResourceTag/ExcludeFileContentFromNotifications": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BGRXOB2GH",
+ "PolicyName": "AWSCodeStarNotificationsServiceRolePolicy",
+ "UpdateDate": "2020-03-19T16:01:55+00:00",
+ "VersionId": "v4"
+ },
+ "AWSCodeStarServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCodeStarServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-19T15:20:50+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "events:PutRule",
+ "events:DeleteRule",
+ "events:DescribeRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/awscodestar-*"
+ ],
+ "Sid": "ProjectEventRules"
+ },
+ {
+ "Action": [
+ "cloudformation:*Stack*",
+ "cloudformation:CreateChangeSet",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:GetTemplate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awscodestar-*",
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/aws-cloud9-*",
+ "arn:aws:cloudformation:*:aws:transform/CodeStar*"
+ ],
+ "Sid": "ProjectStack"
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:DescribeChangeSet"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectStackTemplate"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awscodestar-*/*"
+ ],
+ "Sid": "ProjectQuickstarts"
+ },
+ {
+ "Action": [
+ "s3:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-codestar-*",
+ "arn:aws:s3:::elasticbeanstalk-*"
+ ],
+ "Sid": "ProjectS3Buckets"
+ },
+ {
+ "Action": [
+ "codestar:*",
+ "codecommit:*",
+ "codepipeline:*",
+ "codedeploy:*",
+ "codebuild:*",
+ "autoscaling:*",
+ "cloudwatch:Put*",
+ "ec2:*",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:*",
+ "iam:ListRoles",
+ "logs:*",
+ "sns:*",
+ "cloud9:CreateEnvironmentEC2",
+ "cloud9:DeleteEnvironment",
+ "cloud9:DescribeEnvironment*",
+ "cloud9:ListEnvironments"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectServices"
+ },
+ {
+ "Action": [
+ "iam:AttachRolePolicy",
+ "iam:CreateRole",
+ "iam:DeleteRole",
+ "iam:DeleteRolePolicy",
+ "iam:DetachRolePolicy",
+ "iam:GetRole",
+ "iam:PassRole",
+ "iam:GetRolePolicy",
+ "iam:PutRolePolicy",
+ "iam:SetDefaultPolicyVersion",
+ "iam:CreatePolicy",
+ "iam:DeletePolicy",
+ "iam:AddRoleToInstanceProfile",
+ "iam:CreateInstanceProfile",
+ "iam:DeleteInstanceProfile",
+ "iam:RemoveRoleFromInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/CodeStarWorker*",
+ "arn:aws:iam::*:policy/CodeStarWorker*",
+ "arn:aws:iam::*:instance-profile/awscodestar-*"
+ ],
+ "Sid": "ProjectWorkerRoles"
+ },
+ {
+ "Action": [
+ "iam:AttachUserPolicy",
+ "iam:DetachUserPolicy"
+ ],
+ "Condition": {
+ "ArnEquals": {
+ "iam:PolicyArn": [
+ "arn:aws:iam::*:policy/CodeStar_*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectTeamMembers"
+ },
+ {
+ "Action": [
+ "iam:CreatePolicy",
+ "iam:DeletePolicy",
+ "iam:CreatePolicyVersion",
+ "iam:DeletePolicyVersion",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListPolicyVersions",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:policy/CodeStar_*"
+ ],
+ "Sid": "ProjectRoles"
+ },
+ {
+ "Action": [
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-codestar-service-role",
+ "arn:aws:iam::*:role/service-role/aws-codestar-service-role"
+ ],
+ "Sid": "InspectServiceRole"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "cloud9.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IAMLinkRole"
+ },
+ {
+ "Action": [
+ "config:DescribeConfigRules"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DescribeConfigRuleForARN"
+ },
+ {
+ "Action": [
+ "codestar-connections:UseConnection",
+ "codestar-connections:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectCodeStarConnections"
+ },
+ {
+ "Action": "codestar-connections:PassConnection",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "codestar-connections:PassedToService": "codepipeline.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ProjectCodeStarConnectionsPassConnections"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIN6D4M2KD3NBOC4M4",
+ "PolicyName": "AWSCodeStarServiceRole",
+ "UpdateDate": "2021-09-20T19:11:03+00:00",
+ "VersionId": "v11"
+ },
+ "AWSCompromisedKeyQuarantine": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCompromisedKeyQuarantine",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-11T18:04:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:AttachGroupPolicy",
+ "iam:AttachRolePolicy",
+ "iam:AttachUserPolicy",
+ "iam:ChangePassword",
+ "iam:CreateAccessKey",
+ "iam:CreateInstanceProfile",
+ "iam:CreateLoginProfile",
+ "iam:CreateRole",
+ "iam:CreateUser",
+ "iam:DetachUserPolicy",
+ "iam:PutUserPermissionsBoundary",
+ "iam:PutUserPolicy",
+ "iam:UpdateAccessKey",
+ "iam:UpdateAccountPasswordPolicy",
+ "iam:UpdateUser",
+ "ec2:RequestSpotInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "organizations:CreateAccount",
+ "organizations:CreateOrganization",
+ "organizations:InviteAccountToOrganization",
+ "lambda:CreateFunction",
+ "lightsail:Create*",
+ "lightsail:Start*",
+ "lightsail:Delete*",
+ "lightsail:Update*",
+ "lightsail:GetInstanceAccessDetails",
+ "lightsail:DownloadDefaultKeyPair"
+ ],
+ "Effect": "Deny",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PLD3NKX4L",
+ "PolicyName": "AWSCompromisedKeyQuarantine",
+ "UpdateDate": "2020-08-11T18:04:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSCompromisedKeyQuarantineV2": {
+ "Arn": "arn:aws:iam::aws:policy/AWSCompromisedKeyQuarantineV2",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-21T22:30:59+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:RequestSpotInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "iam:AddUserToGroup",
+ "iam:AttachGroupPolicy",
+ "iam:AttachRolePolicy",
+ "iam:AttachUserPolicy",
+ "iam:ChangePassword",
+ "iam:CreateAccessKey",
+ "iam:CreateInstanceProfile",
+ "iam:CreateLoginProfile",
+ "iam:CreatePolicyVersion",
+ "iam:CreateRole",
+ "iam:CreateUser",
+ "iam:DetachUserPolicy",
+ "iam:PassRole",
+ "iam:PutGroupPolicy",
+ "iam:PutRolePolicy",
+ "iam:PutUserPermissionsBoundary",
+ "iam:PutUserPolicy",
+ "iam:SetDefaultPolicyVersion",
+ "iam:UpdateAccessKey",
+ "iam:UpdateAccountPasswordPolicy",
+ "iam:UpdateAssumeRolePolicy",
+ "iam:UpdateLoginProfile",
+ "iam:UpdateUser",
+ "lambda:AddLayerVersionPermission",
+ "lambda:AddPermission",
+ "lambda:CreateFunction",
+ "lambda:GetPolicy",
+ "lambda:ListTags",
+ "lambda:PutProvisionedConcurrencyConfig",
+ "lambda:TagResource",
+ "lambda:UntagResource",
+ "lambda:UpdateFunctionCode",
+ "lightsail:Create*",
+ "lightsail:Delete*",
+ "lightsail:DownloadDefaultKeyPair",
+ "lightsail:GetInstanceAccessDetails",
+ "lightsail:Start*",
+ "lightsail:Update*",
+ "organizations:CreateAccount",
+ "organizations:CreateOrganization",
+ "organizations:InviteAccountToOrganization",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:DeleteObjectVersion",
+ "s3:PutLifecycleConfiguration",
+ "s3:PutBucketAcl",
+ "s3:PutBucketOwnershipControls",
+ "s3:DeleteBucketPolicy",
+ "s3:ObjectOwnerOverrideToBucketOwner",
+ "s3:PutAccountPublicAccessBlock",
+ "s3:PutBucketPolicy",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Deny",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PFYMROIMI",
+ "PolicyName": "AWSCompromisedKeyQuarantineV2",
+ "UpdateDate": "2021-11-11T21:32:48+00:00",
+ "VersionId": "v2"
+ },
+ "AWSConfigMultiAccountSetupPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSConfigMultiAccountSetupPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-17T18:03:16+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "config:PutConfigRule",
+ "config:DeleteConfigRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/*"
+ },
+ {
+ "Action": [
+ "config:DescribeConfigurationRecorders"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeAccount"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:PutConformancePack",
+ "config:DeleteConformancePack",
+ "config:DescribeConformancePackStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:conformance-pack/aws-service-conformance-pack/config-multiaccountsetup.amazonaws.com/*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "config-conforms.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ssm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4L5NAGNGTD",
+ "PolicyName": "AWSConfigMultiAccountSetupPolicy",
+ "UpdateDate": "2020-05-21T22:59:26+00:00",
+ "VersionId": "v4"
+ },
+ "AWSConfigRemediationServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSConfigRemediationServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-18T21:21:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:GetDocument",
+ "ssm:DescribeDocument",
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ssm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BC7ZOM6NP",
+ "PolicyName": "AWSConfigRemediationServiceRolePolicy",
+ "UpdateDate": "2019-06-18T21:21:35+00:00",
+ "VersionId": "v1"
+ },
+ "AWSConfigRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSConfigRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-02T17:36:23+00:00",
+ "DefaultVersionId": "v42",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:GetAnalyzer",
+ "access-analyzer:GetArchiveRule",
+ "access-analyzer:ListAnalyzers",
+ "access-analyzer:ListArchiveRules",
+ "access-analyzer:ListTagsForResource",
+ "account:GetAlternateContact",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:ListTagsForCertificate",
+ "apigateway:GET",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeTags",
+ "backup:DescribeBackupVault",
+ "backup:DescribeRecoveryPoint",
+ "backup:GetBackupPlan",
+ "backup:GetBackupSelection",
+ "backup:GetBackupVaultAccessPolicy",
+ "backup:GetBackupVaultNotifications",
+ "backup:ListBackupPlans",
+ "backup:ListBackupSelections",
+ "backup:ListBackupVaults",
+ "backup:ListRecoveryPointsByBackupVault",
+ "backup:ListTags",
+ "cloudformation:DescribeType",
+ "cloudformation:ListTypes",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListTagsForResource",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudwatch:DescribeAlarms",
+ "codedeploy:GetDeploymentConfig",
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:ListPipelines",
+ "config:BatchGet*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "config:Put*",
+ "config:Select*",
+ "dax:DescribeClusters",
+ "dms:DescribeEventSubscriptions",
+ "dms:DescribeReplicationInstances",
+ "dms:DescribeReplicationSubnetGroups",
+ "dms:ListTagsForResource",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "ec2:Describe*",
+ "ec2:GetEbsEncryptionByDefault",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:ListTagsForResource",
+ "ecr:DescribeRepositories",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetRepositoryPolicy",
+ "ecr:ListTagsForResource",
+ "ecs:DescribeClusters",
+ "ecs:DescribeServices",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTaskSets",
+ "ecs:ListClusters",
+ "ecs:ListServices",
+ "ecs:ListTagsForResource",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "eks:DescribeCluster",
+ "eks:DescribeNodegroup",
+ "eks:ListClusters",
+ "eks:ListNodegroups",
+ "elasticache:DescribeCacheClusters",
+ "elasticache:DescribeCacheParameterGroups",
+ "elasticache:DescribeCacheSubnetGroups",
+ "elasticache:DescribeReplicationGroups",
+ "elasticache:DescribeSnapshots",
+ "elasticache:ListTagsForResource",
+ "elasticbeanstalk:DescribeConfigurationSettings",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeBackupPolicy",
+ "elasticfilesystem:DescribeFileSystemPolicy",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeLifecycleConfiguration",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTags",
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:DescribeSecurityConfiguration",
+ "elasticmapreduce:DescribeStep",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:GetManagedScalingPolicy",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstanceFleets",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "elasticmapreduce:ListSteps",
+ "es:DescribeDomain",
+ "es:DescribeDomains",
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeElasticsearchDomains",
+ "es:GetCompatibleElasticsearchVersions",
+ "es:GetCompatibleVersions",
+ "es:ListDomainNames",
+ "es:ListTags",
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams",
+ "firehose:ListTagsForDeliveryStream",
+ "fsx:DescribeFileSystems",
+ "globalaccelerator:DescribeAccelerator",
+ "globalaccelerator:DescribeEndpointGroup",
+ "globalaccelerator:DescribeListener",
+ "globalaccelerator:ListAccelerators",
+ "globalaccelerator:ListEndpointGroups",
+ "globalaccelerator:ListListeners",
+ "globalaccelerator:ListTagsForResource",
+ "guardduty:GetDetector",
+ "guardduty:GetFindings",
+ "guardduty:GetMasterAccount",
+ "guardduty:ListDetectors",
+ "guardduty:ListFindings",
+ "iam:GenerateCredentialReport",
+ "iam:GetAccountAuthorizationDetails",
+ "iam:GetAccountPasswordPolicy",
+ "iam:GetAccountSummary",
+ "iam:GetCredentialReport",
+ "iam:GetGroup",
+ "iam:GetGroupPolicy",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:GetUser",
+ "iam:GetUserPolicy",
+ "iam:ListAttachedGroupPolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListAttachedUserPolicies",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfilesForRole",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListUserPolicies",
+ "iam:ListVirtualMFADevices",
+ "kafka:DescribeCluster",
+ "kafka:ListClusters",
+ "kinesis:DescribeStreamConsumer",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListStreamConsumers",
+ "kinesis:ListStreams",
+ "kinesis:ListTagsForStream",
+ "kms:DescribeKey",
+ "kms:GetKeyPolicy",
+ "kms:GetKeyRotationStatus",
+ "kms:ListKeys",
+ "kms:ListResourceTags",
+ "lambda:GetAlias",
+ "lambda:GetFunction",
+ "lambda:GetFunctionCodeSigningConfig",
+ "lambda:GetPolicy",
+ "lambda:ListAliases",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction",
+ "logs:DescribeLogGroups",
+ "logs:ListTagsLogGroup",
+ "network-firewall:DescribeLoggingConfiguration",
+ "network-firewall:ListFirewalls",
+ "organizations:DescribeOrganization",
+ "organizations:DescribePolicy",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSnapshotAttributes",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeOptionGroups",
+ "rds:ListTagsForResource",
+ "redshift:DescribeClusterParameterGroups",
+ "redshift:DescribeClusterParameters",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:DescribeClusterSnapshots",
+ "redshift:DescribeClusterSubnetGroups",
+ "redshift:DescribeEventSubscriptions",
+ "redshift:DescribeLoggingStatus",
+ "route53:GetHealthCheck",
+ "route53:GetHostedZone",
+ "route53:ListHealthChecks",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName",
+ "route53:ListQueryLoggingConfigs",
+ "route53:ListResourceRecordSets",
+ "route53:ListTagsForResource",
+ "route53resolver:GetResolverEndpoint",
+ "route53resolver:GetResolverRule",
+ "route53resolver:GetResolverRuleAssociation",
+ "route53resolver:ListResolverEndpointIpAddresses",
+ "route53resolver:ListResolverEndpoints",
+ "route53resolver:ListResolverRuleAssociations",
+ "route53resolver:ListResolverRules",
+ "route53resolver:ListTagsForResource",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetAccessPoint",
+ "s3:GetAccessPointPolicy",
+ "s3:GetAccessPointPolicyStatus",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCORS",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketNotification",
+ "s3:GetBucketObjectLockConfiguration",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetBucketRequestPayment",
+ "s3:GetBucketTagging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetObject",
+ "s3:GetReplicationConfiguration",
+ "s3:ListAccessPoints",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sagemaker:DescribeCodeRepository",
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:DescribeEndpointConfig",
+ "sagemaker:DescribeModel",
+ "sagemaker:DescribeMonitoringSchedule",
+ "sagemaker:DescribeNotebookInstance",
+ "sagemaker:DescribeNotebookInstanceLifecycleConfig",
+ "sagemaker:DescribeWorkteam",
+ "sagemaker:ListCodeRepositories",
+ "sagemaker:ListEndpointConfigs",
+ "sagemaker:ListEndpoints",
+ "sagemaker:ListModels",
+ "sagemaker:ListMonitoringSchedules",
+ "sagemaker:ListNotebookInstanceLifecycleConfigs",
+ "sagemaker:ListNotebookInstances",
+ "sagemaker:ListTags",
+ "sagemaker:ListWorkteams",
+ "secretsmanager:ListSecrets",
+ "secretsmanager:ListSecretVersionIds",
+ "securityhub:DescribeHub",
+ "shield:DescribeDRTAccess",
+ "shield:DescribeProtection",
+ "shield:DescribeSubscription",
+ "sns:GetSubscriptionAttributes",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTagsForResource",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues",
+ "sqs:ListQueueTags",
+ "ssm:DescribeAutomationExecutions",
+ "ssm:DescribeDocument",
+ "ssm:DescribeDocumentPermission",
+ "ssm:GetAutomationExecution",
+ "ssm:GetDocument",
+ "ssm:ListDocuments",
+ "states:DescribeStateMachine",
+ "states:ListStateMachines",
+ "states:ListTagsForResource",
+ "storagegateway:ListGateways",
+ "storagegateway:ListTagsForResource",
+ "storagegateway:ListVolumes",
+ "support:DescribeCases",
+ "tag:GetResources",
+ "waf-regional:GetLoggingConfiguration",
+ "waf-regional:GetWebACL",
+ "waf-regional:GetWebACLForResource",
+ "waf:GetLoggingConfiguration",
+ "waf:GetWebACL",
+ "wafv2:GetLoggingConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQRXRDRGJUA33ELIO",
+ "PolicyName": "AWSConfigRole",
+ "UpdateDate": "2022-02-10T18:33:55+00:00",
+ "VersionId": "v42"
+ },
+ "AWSConfigRoleForOrganizations": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSConfigRoleForOrganizations",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-19T22:53:01+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIEHGYAUTHXSXZAW2E",
+ "PolicyName": "AWSConfigRoleForOrganizations",
+ "UpdateDate": "2020-11-24T20:19:13+00:00",
+ "VersionId": "v2"
+ },
+ "AWSConfigRulesExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSConfigRulesExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-03-25T17:59:36+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/AWSLogs/*/Config/*"
+ },
+ {
+ "Action": [
+ "config:Put*",
+ "config:Get*",
+ "config:List*",
+ "config:Describe*",
+ "config:BatchGet*",
+ "config:Select*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUB3KIKTA4PU4OYAA",
+ "PolicyName": "AWSConfigRulesExecutionRole",
+ "UpdateDate": "2019-05-13T21:33:30+00:00",
+ "VersionId": "v3"
+ },
+ "AWSConfigServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSConfigServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-30T23:31:46+00:00",
+ "DefaultVersionId": "v30",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:GetAnalyzer",
+ "access-analyzer:GetArchiveRule",
+ "access-analyzer:ListAnalyzers",
+ "access-analyzer:ListArchiveRules",
+ "access-analyzer:ListTagsForResource",
+ "account:GetAlternateContact",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:ListTagsForCertificate",
+ "apigateway:GET",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeTags",
+ "backup-gateway:ListTagsForResource",
+ "backup-gateway:ListVirtualMachines",
+ "backup:DescribeBackupVault",
+ "backup:DescribeRecoveryPoint",
+ "backup:GetBackupPlan",
+ "backup:GetBackupSelection",
+ "backup:GetBackupVaultAccessPolicy",
+ "backup:GetBackupVaultNotifications",
+ "backup:ListBackupPlans",
+ "backup:ListBackupSelections",
+ "backup:ListBackupVaults",
+ "backup:ListRecoveryPointsByBackupVault",
+ "backup:ListTags",
+ "batch:DescribeComputeEnvironments",
+ "batch:DescribeJobQueues",
+ "batch:ListTagsForResource",
+ "cloudformation:DescribeType",
+ "cloudformation:ListTypes",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListTagsForResource",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudwatch:DescribeAlarms",
+ "codedeploy:GetDeploymentConfig",
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:ListPipelines",
+ "config:BatchGet*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "config:Put*",
+ "config:Select*",
+ "dax:DescribeClusters",
+ "dax:ListTags",
+ "dms:DescribeCertificates",
+ "dms:DescribeEventSubscriptions",
+ "dms:DescribeReplicationInstances",
+ "dms:DescribeReplicationSubnetGroups",
+ "dms:ListTagsForResource",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeGlobalTable",
+ "dynamodb:DescribeGlobalTableSettings",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "ec2:Describe*",
+ "ec2:DescribeClientVpnAuthorizationRules",
+ "ec2:DescribeClientVpnEndpoints",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeFleets",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeVolumeAttribute",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsEncryptionByDefault",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:ListTagsForResource",
+ "ecr:DescribeRepositories",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetRepositoryPolicy",
+ "ecr:ListTagsForResource",
+ "ecs:DescribeClusters",
+ "ecs:DescribeServices",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTaskSets",
+ "ecs:ListClusters",
+ "ecs:ListServices",
+ "ecs:ListTagsForResource",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "eks:DescribeCluster",
+ "eks:DescribeFargateProfile",
+ "eks:DescribeNodegroup",
+ "eks:ListClusters",
+ "eks:ListFargateProfiles",
+ "eks:ListNodegroups",
+ "eks:ListTagsForResource",
+ "elasticache:DescribeCacheClusters",
+ "elasticache:DescribeCacheParameterGroups",
+ "elasticache:DescribeCacheSubnetGroups",
+ "elasticache:DescribeReplicationGroups",
+ "elasticache:DescribeSnapshots",
+ "elasticache:ListTagsForResource",
+ "elasticbeanstalk:DescribeConfigurationSettings",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeBackupPolicy",
+ "elasticfilesystem:DescribeFileSystemPolicy",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeLifecycleConfiguration",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTags",
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:DescribeSecurityConfiguration",
+ "elasticmapreduce:DescribeStep",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:GetManagedScalingPolicy",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstanceFleets",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "elasticmapreduce:ListSteps",
+ "es:DescribeDomain",
+ "es:DescribeDomains",
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeElasticsearchDomains",
+ "es:GetCompatibleElasticsearchVersions",
+ "es:GetCompatibleVersions",
+ "es:ListDomainNames",
+ "es:ListTags",
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams",
+ "firehose:ListTagsForDeliveryStream",
+ "fsx:DescribeFileSystems",
+ "fsx:ListTagsForResource",
+ "globalaccelerator:DescribeAccelerator",
+ "globalaccelerator:DescribeEndpointGroup",
+ "globalaccelerator:DescribeListener",
+ "globalaccelerator:ListAccelerators",
+ "globalaccelerator:ListEndpointGroups",
+ "globalaccelerator:ListListeners",
+ "globalaccelerator:ListTagsForResource",
+ "guardduty:GetDetector",
+ "guardduty:GetFindings",
+ "guardduty:GetMasterAccount",
+ "guardduty:ListDetectors",
+ "guardduty:ListFindings",
+ "guardduty:ListOrganizationAdminAccounts",
+ "iam:GenerateCredentialReport",
+ "iam:GetAccountAuthorizationDetails",
+ "iam:GetAccountPasswordPolicy",
+ "iam:GetAccountSummary",
+ "iam:GetCredentialReport",
+ "iam:GetGroup",
+ "iam:GetGroupPolicy",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:GetUser",
+ "iam:GetUserPolicy",
+ "iam:ListAttachedGroupPolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListAttachedUserPolicies",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfilesForRole",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListUserPolicies",
+ "iam:ListVirtualMFADevices",
+ "kafka:DescribeCluster",
+ "kafka:ListClusters",
+ "kinesis:DescribeStreamConsumer",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListStreamConsumers",
+ "kinesis:ListStreams",
+ "kinesis:ListTagsForStream",
+ "kms:DescribeKey",
+ "kms:GetKeyPolicy",
+ "kms:GetKeyRotationStatus",
+ "kms:ListAliases",
+ "kms:ListKeys",
+ "kms:ListResourceTags",
+ "lambda:GetAlias",
+ "lambda:GetFunction",
+ "lambda:GetFunctionCodeSigningConfig",
+ "lambda:GetPolicy",
+ "lambda:ListAliases",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction",
+ "logs:DescribeLogGroups",
+ "logs:ListTagsLogGroup",
+ "network-firewall:DescribeLoggingConfiguration",
+ "network-firewall:ListFirewalls",
+ "opsworks:DescribeLayers",
+ "opsworks:ListTags",
+ "organizations:DescribeOrganization",
+ "organizations:DescribePolicy",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSnapshotAttributes",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeOptionGroups",
+ "rds:ListTagsForResource",
+ "redshift:DescribeClusterParameterGroups",
+ "redshift:DescribeClusterParameters",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:DescribeClusterSnapshots",
+ "redshift:DescribeClusterSubnetGroups",
+ "redshift:DescribeEventSubscriptions",
+ "redshift:DescribeLoggingStatus",
+ "route53:GetHealthCheck",
+ "route53:GetHostedZone",
+ "route53:ListHealthChecks",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName",
+ "route53:ListQueryLoggingConfigs",
+ "route53:ListResourceRecordSets",
+ "route53:ListTagsForResource",
+ "route53resolver:GetResolverEndpoint",
+ "route53resolver:GetResolverRule",
+ "route53resolver:GetResolverRuleAssociation",
+ "route53resolver:ListResolverEndpointIpAddresses",
+ "route53resolver:ListResolverEndpoints",
+ "route53resolver:ListResolverRuleAssociations",
+ "route53resolver:ListResolverRules",
+ "route53resolver:ListTagsForResource",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetAccessPoint",
+ "s3:GetAccessPointPolicy",
+ "s3:GetAccessPointPolicyStatus",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCORS",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketNotification",
+ "s3:GetBucketObjectLockConfiguration",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetBucketRequestPayment",
+ "s3:GetBucketTagging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetReplicationConfiguration",
+ "s3:ListAccessPoints",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sagemaker:DescribeCodeRepository",
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:DescribeEndpointConfig",
+ "sagemaker:DescribeModel",
+ "sagemaker:DescribeMonitoringSchedule",
+ "sagemaker:DescribeNotebookInstance",
+ "sagemaker:DescribeNotebookInstanceLifecycleConfig",
+ "sagemaker:DescribeWorkteam",
+ "sagemaker:ListCodeRepositories",
+ "sagemaker:ListEndpointConfigs",
+ "sagemaker:ListEndpoints",
+ "sagemaker:ListModels",
+ "sagemaker:ListMonitoringSchedules",
+ "sagemaker:ListNotebookInstanceLifecycleConfigs",
+ "sagemaker:ListNotebookInstances",
+ "sagemaker:ListTags",
+ "sagemaker:ListWorkteams",
+ "secretsmanager:ListSecrets",
+ "secretsmanager:ListSecretVersionIds",
+ "securityhub:DescribeHub",
+ "shield:DescribeDRTAccess",
+ "shield:DescribeProtection",
+ "shield:DescribeSubscription",
+ "sns:GetSubscriptionAttributes",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTagsForResource",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues",
+ "sqs:ListQueueTags",
+ "ssm:DescribeAutomationExecutions",
+ "ssm:DescribeDocument",
+ "ssm:DescribeDocumentPermission",
+ "ssm:GetAutomationExecution",
+ "ssm:GetDocument",
+ "ssm:ListDocuments",
+ "states:DescribeActivity",
+ "states:DescribeStateMachine",
+ "states:ListActivities",
+ "states:ListStateMachines",
+ "states:ListTagsForResource",
+ "storagegateway:ListGateways",
+ "storagegateway:ListTagsForResource",
+ "storagegateway:ListVolumes",
+ "support:DescribeCases",
+ "tag:GetResources",
+ "waf-regional:GetLoggingConfiguration",
+ "waf-regional:GetWebACL",
+ "waf-regional:GetWebACLForResource",
+ "waf:GetLoggingConfiguration",
+ "waf:GetWebACL",
+ "wafv2:GetLoggingConfiguration",
+ "wafv2:GetRuleGroup",
+ "wafv2:ListRuleGroups",
+ "wafv2:ListTagsForResource",
+ "workspaces:DescribeConnectionAliases",
+ "workspaces:DescribeTags",
+ "workspaces:DescribeWorkspaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/config/*"
+ },
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/config/*:log-stream:config-rule-evaluation/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUCWFHNZER665LLQQ",
+ "PolicyName": "AWSConfigServiceRolePolicy",
+ "UpdateDate": "2022-03-11T21:29:26+00:00",
+ "VersionId": "v30"
+ },
+ "AWSConfigUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSConfigUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-18T19:38:41+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "config:Get*",
+ "config:Describe*",
+ "config:Deliver*",
+ "config:List*",
+ "config:Select*",
+ "tag:GetResources",
+ "tag:GetTagKeys",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:LookupEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWTTSFJ7KKJE3MWGA",
+ "PolicyName": "AWSConfigUserAccess",
+ "UpdateDate": "2019-03-18T20:27:47+00:00",
+ "VersionId": "v4"
+ },
+ "AWSConnector": {
+ "Arn": "arn:aws:iam::aws:policy/AWSConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-11T17:14:31+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:AbortMultipartUpload",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::import-to-ec2-*"
+ },
+ {
+ "Action": [
+ "ec2:CancelConversionTask",
+ "ec2:CancelExportTask",
+ "ec2:CreateImage",
+ "ec2:CreateInstanceExportTask",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:DeleteTags",
+ "ec2:DeleteVolume",
+ "ec2:DescribeConversionTasks",
+ "ec2:DescribeExportTasks",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeRegions",
+ "ec2:DescribeTags",
+ "ec2:DetachVolume",
+ "ec2:ImportInstance",
+ "ec2:ImportVolume",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ImportImage",
+ "ec2:DescribeImportImageTasks",
+ "ec2:DeregisterImage",
+ "ec2:DescribeSnapshots",
+ "ec2:DeleteSnapshot",
+ "ec2:CancelImportTask",
+ "ec2:ImportSnapshot",
+ "ec2:DescribeImportSnapshotTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6YATONJHICG3DJ3U",
+ "PolicyName": "AWSConnector",
+ "UpdateDate": "2015-09-28T19:50:38+00:00",
+ "VersionId": "v3"
+ },
+ "AWSControlTowerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSControlTowerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-03T18:19:11+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:CreateStackInstances",
+ "cloudformation:CreateStackSet",
+ "cloudformation:DeleteStack",
+ "cloudformation:DeleteStackInstances",
+ "cloudformation:DeleteStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:ListStackInstances",
+ "cloudformation:UpdateStack",
+ "cloudformation:UpdateStackInstances",
+ "cloudformation:UpdateStackSet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:type/resource/AWS-IAM-Role"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:CreateStackInstances",
+ "cloudformation:CreateStackSet",
+ "cloudformation:DeleteStack",
+ "cloudformation:DeleteStackInstances",
+ "cloudformation:DeleteStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStackInstances",
+ "cloudformation:UpdateStack",
+ "cloudformation:UpdateStackInstances",
+ "cloudformation:UpdateStackSet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/AWSControlTower*/*",
+ "arn:aws:cloudformation:*:*:stack/StackSet-AWSControlTower*/*",
+ "arn:aws:cloudformation:*:*:stackset/AWSControlTower*:*",
+ "arn:aws:cloudformation:*:*:stackset-target/AWSControlTower*/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudtrail:CreateTrail",
+ "cloudtrail:DeleteTrail",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudtrail:UpdateTrail",
+ "cloudtrail:PutEventSelectors",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:aws-controltower/CloudTrailLogs:*",
+ "arn:aws:cloudtrail:*:*:trail/aws-controltower*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-controltower*/*"
+ ]
+ },
+ {
+ "Action": [
+ "sts:AssumeRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSControlTowerExecution"
+ ]
+ },
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "ec2:DescribeAvailabilityZones",
+ "iam:ListRoles",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "organizations:CreateAccount",
+ "organizations:DescribeAccount",
+ "organizations:DescribeCreateAccountStatus",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribePolicy",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListChildren",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "organizations:ListTargetsForPolicy",
+ "organizations:ListRoots",
+ "organizations:MoveAccount",
+ "servicecatalog:AssociatePrincipalWithPortfolio"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:GetUser",
+ "iam:ListAttachedRolePolicies",
+ "iam:GetRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSControlTowerStackSetRole",
+ "arn:aws:iam::*:role/service-role/AWSControlTowerCloudTrailRole",
+ "arn:aws:iam::*:role/service-role/AWSControlTowerConfigAggregatorRoleForOrganizations"
+ ]
+ },
+ {
+ "Action": [
+ "config:DeleteConfigurationAggregator",
+ "config:PutConfigurationAggregator",
+ "config:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/aws-control-tower": "managed-by-control-tower"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "organizations:EnableAWSServiceAccess",
+ "Condition": {
+ "StringLike": {
+ "organizations:ServicePrincipal": "config.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MW35THVLF",
+ "PolicyName": "AWSControlTowerServiceRolePolicy",
+ "UpdateDate": "2021-06-04T23:00:46+00:00",
+ "VersionId": "v7"
+ },
+ "AWSCostAndUsageReportAutomationPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSCostAndUsageReportAutomationPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-01T21:27:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketTagging",
+ "s3:PutBucketTagging",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy",
+ "s3:ListBucket",
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-map-cur-bucket-*"
+ },
+ {
+ "Action": [
+ "cur:PutReportDefinition",
+ "cur:DeleteReportDefinition",
+ "cur:DescribeReportDefinitions"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cur:*:*:definition/map-migrated-report"
+ },
+ {
+ "Action": "cur:DescribeReportDefinitions",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KVW6KKXOP",
+ "PolicyName": "AWSCostAndUsageReportAutomationPolicy",
+ "UpdateDate": "2021-11-01T21:27:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDataExchangeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataExchangeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-13T19:27:59+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dataexchange:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*aws-data-exchange*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ },
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/AWSDataExchange": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*aws-data-exchange*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:StartChangeSet",
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:CancelChangeSet",
+ "aws-marketplace:GetAgreementApprovalRequest",
+ "aws-marketplace:ListAgreementApprovalRequests",
+ "aws-marketplace:AcceptAgreementApprovalRequest",
+ "aws-marketplace:RejectAgreementApprovalRequest",
+ "aws-marketplace:UpdateAgreementApprovalRequest",
+ "aws-marketplace:SearchAgreements",
+ "aws-marketplace:GetAgreementTerms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:Subscribe",
+ "aws-marketplace:Unsubscribe",
+ "aws-marketplace:ViewSubscriptions",
+ "aws-marketplace:GetAgreementRequest",
+ "aws-marketplace:ListAgreementRequests",
+ "aws-marketplace:CancelAgreementRequest"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "kms:ListKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift:AuthorizeDataShare"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "redshift:ConsumerIdentifier": "ADX"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift:DescribeDataSharesForProducer",
+ "redshift:DescribeDataShares"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MPDTDB3FH",
+ "PolicyName": "AWSDataExchangeFullAccess",
+ "UpdateDate": "2021-12-02T16:14:27+00:00",
+ "VersionId": "v6"
+ },
+ "AWSDataExchangeProviderFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataExchangeProviderFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-13T19:27:55+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dataexchange:CreateDataSet",
+ "dataexchange:CreateRevision",
+ "dataexchange:CreateAsset",
+ "dataexchange:Get*",
+ "dataexchange:Update*",
+ "dataexchange:List*",
+ "dataexchange:Delete*",
+ "dataexchange:TagResource",
+ "dataexchange:UntagResource",
+ "dataexchange:PublishDataSet",
+ "dataexchange:SendApiAsset",
+ "tag:GetTagKeys",
+ "tag:GetTagValues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dataexchange:CreateJob",
+ "dataexchange:StartJob",
+ "dataexchange:CancelJob"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "dataexchange:JobType": [
+ "IMPORT_ASSETS_FROM_S3",
+ "IMPORT_ASSET_FROM_SIGNED_URL",
+ "EXPORT_ASSETS_TO_S3",
+ "EXPORT_ASSET_TO_SIGNED_URL",
+ "IMPORT_ASSET_FROM_API_GATEWAY_API",
+ "IMPORT_ASSETS_FROM_REDSHIFT_DATA_SHARES"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*aws-data-exchange*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ },
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/AWSDataExchange": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*aws-data-exchange*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:StartChangeSet",
+ "aws-marketplace:CancelChangeSet",
+ "aws-marketplace:GetAgreementApprovalRequest",
+ "aws-marketplace:ListAgreementApprovalRequests",
+ "aws-marketplace:AcceptAgreementApprovalRequest",
+ "aws-marketplace:RejectAgreementApprovalRequest",
+ "aws-marketplace:UpdateAgreementApprovalRequest",
+ "aws-marketplace:SearchAgreements",
+ "aws-marketplace:GetAgreementTerms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "kms:ListKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift:AuthorizeDataShare"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "redshift:ConsumerIdentifier": "ADX"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift:DescribeDataSharesForProducer",
+ "redshift:DescribeDataShares"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MQSUGZZPZ",
+ "PolicyName": "AWSDataExchangeProviderFullAccess",
+ "UpdateDate": "2021-12-02T16:12:19+00:00",
+ "VersionId": "v10"
+ },
+ "AWSDataExchangeReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataExchangeReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-13T19:27:37+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dataexchange:Get*",
+ "dataexchange:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:ViewSubscriptions",
+ "aws-marketplace:GetAgreementRequest",
+ "aws-marketplace:ListAgreementRequests",
+ "aws-marketplace:GetAgreementApprovalRequest",
+ "aws-marketplace:ListAgreementApprovalRequests",
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:SearchAgreements",
+ "aws-marketplace:GetAgreementTerms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DQNFEZURI",
+ "PolicyName": "AWSDataExchangeReadOnly",
+ "UpdateDate": "2021-05-10T21:15:26+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDataExchangeSubscriberFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataExchangeSubscriberFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-13T19:27:52+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dataexchange:Get*",
+ "dataexchange:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dataexchange:CreateJob",
+ "dataexchange:StartJob",
+ "dataexchange:CancelJob"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "dataexchange:JobType": [
+ "EXPORT_ASSETS_TO_S3",
+ "EXPORT_ASSET_TO_SIGNED_URL",
+ "EXPORT_REVISIONS_TO_S3"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dataexchange:CreateEventAction",
+ "dataexchange:UpdateEventAction",
+ "dataexchange:DeleteEventAction",
+ "dataexchange:SendApiAsset"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "dataexchange.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*aws-data-exchange*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:Subscribe",
+ "aws-marketplace:Unsubscribe",
+ "aws-marketplace:ViewSubscriptions",
+ "aws-marketplace:GetAgreementRequest",
+ "aws-marketplace:ListAgreementRequests",
+ "aws-marketplace:CancelAgreementRequest"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "kms:ListKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MAWRW4GF7",
+ "PolicyName": "AWSDataExchangeSubscriberFullAccess",
+ "UpdateDate": "2021-11-29T23:00:06+00:00",
+ "VersionId": "v6"
+ },
+ "AWSDataLifecycleManagerServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDataLifecycleManagerServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-07-06T19:34:16+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateSnapshot",
+ "ec2:CreateSnapshots",
+ "ec2:DeleteSnapshot",
+ "ec2:DescribeInstances",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeSnapshots",
+ "ec2:EnableFastSnapshotRestores",
+ "ec2:DescribeFastSnapshotRestores",
+ "ec2:DisableFastSnapshotRestores",
+ "ec2:CopySnapshot",
+ "ec2:ModifySnapshotAttribute",
+ "ec2:DescribeSnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:ListTargetsByRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/AwsDataLifecycleRule.managed-cwe.*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZRLOKFUFE7YXQOJS",
+ "PolicyName": "AWSDataLifecycleManagerServiceRole",
+ "UpdateDate": "2020-12-11T18:15:06+00:00",
+ "VersionId": "v6"
+ },
+ "AWSDataLifecycleManagerServiceRoleForAMIManagement": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDataLifecycleManagerServiceRoleForAMIManagement",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-21T19:39:41+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:CreateTags",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*::image/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:DeleteSnapshot",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:ResetImageAttribute",
+ "ec2:DeregisterImage",
+ "ec2:CreateImage",
+ "ec2:CopyImage",
+ "ec2:ModifyImageAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:EnableImageDeprecation",
+ "ec2:DisableImageDeprecation"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::image/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MG6O7FWSP",
+ "PolicyName": "AWSDataLifecycleManagerServiceRoleForAMIManagement",
+ "UpdateDate": "2021-08-19T17:03:44+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDataPipelineRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDataPipelineRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:24+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "datapipeline:DescribeObjects",
+ "datapipeline:EvaluateExpression",
+ "dynamodb:BatchGetItem",
+ "dynamodb:DescribeTable",
+ "dynamodb:GetItem",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:UpdateTable",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "elasticmapreduce:*",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:PassRole",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "s3:CreateBucket",
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:Put*",
+ "sdb:BatchPutAttributes",
+ "sdb:Select*",
+ "sns:GetTopicAttributes",
+ "sns:ListTopics",
+ "sns:Publish",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sqs:CreateQueue",
+ "sqs:Delete*",
+ "sqs:GetQueue*",
+ "sqs:PurgeQueue",
+ "sqs:ReceiveMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "elasticmapreduce.amazonaws.com",
+ "spot.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIKCP6XS3ESGF4GLO2",
+ "PolicyName": "AWSDataPipelineRole",
+ "UpdateDate": "2017-12-22T23:43:28+00:00",
+ "VersionId": "v6"
+ },
+ "AWSDataPipeline_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataPipeline_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-19T23:14:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:List*",
+ "dynamodb:DescribeTable",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetInstanceProfile",
+ "iam:ListInstanceProfiles",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXOFIG7RSBMRPHXJ4",
+ "PolicyName": "AWSDataPipeline_FullAccess",
+ "UpdateDate": "2017-08-17T18:48:39+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDataPipeline_PowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataPipeline_PowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-19T23:16:46+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:List*",
+ "dynamodb:DescribeTable",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSecurityGroups",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "sns:ListTopics",
+ "iam:ListRoles",
+ "iam:GetRolePolicy",
+ "iam:GetInstanceProfile",
+ "iam:ListInstanceProfiles",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMXGLVY6DVR24VTYS",
+ "PolicyName": "AWSDataPipeline_PowerUser",
+ "UpdateDate": "2017-08-17T18:49:42+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDataSyncFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataSyncFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-18T19:40:36+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "datasync:*",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "fsx:DescribeFileSystems",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeMountTargets",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "logs:DescribeResourcePolicies",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "datasync.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGOHCDUQULZJKDGT4",
+ "PolicyName": "AWSDataSyncFullAccess",
+ "UpdateDate": "2020-06-30T17:58:58+00:00",
+ "VersionId": "v3"
+ },
+ "AWSDataSyncReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDataSyncReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-18T19:18:44+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "datasync:Describe*",
+ "datasync:List*",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeMountTargets",
+ "fsx:DescribeFileSystems",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "logs:DescribeLogGroups",
+ "logs:DescribeResourcePolicies",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJRYVEZEDR7ZEAGYLY",
+ "PolicyName": "AWSDataSyncReadOnlyAccess",
+ "UpdateDate": "2020-06-30T17:59:22+00:00",
+ "VersionId": "v3"
+ },
+ "AWSDeepLensLambdaFunctionAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepLensLambdaFunctionAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T15:47:18+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::deeplens*/*",
+ "arn:aws:s3:::deeplens*"
+ ],
+ "Sid": "DeepLensS3ObjectAccess"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/greengrass/*",
+ "Sid": "DeepLensGreenGrassCloudWatchAccess"
+ },
+ {
+ "Action": [
+ "deeplens:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensAccess"
+ },
+ {
+ "Action": [
+ "kinesisvideo:DescribeStream",
+ "kinesisvideo:CreateStream",
+ "kinesisvideo:GetDataEndpoint",
+ "kinesisvideo:PutMedia"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensKinesisVideoAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIKIEE4PRM54V4G3ZG",
+ "PolicyName": "AWSDeepLensLambdaFunctionAccessPolicy",
+ "UpdateDate": "2019-06-11T23:11:55+00:00",
+ "VersionId": "v4"
+ },
+ "AWSDeepLensServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDeepLensServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T15:46:36+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:CreateThing",
+ "iot:DeleteThing",
+ "iot:DeleteThingShadow",
+ "iot:DescribeThing",
+ "iot:GetThingShadow",
+ "iot:UpdateThing",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/deeplens*"
+ ],
+ "Sid": "DeepLensIoTThingAccess"
+ },
+ {
+ "Action": [
+ "iot:AttachThingPrincipal",
+ "iot:DetachThingPrincipal",
+ "iot:UpdateCertificate",
+ "iot:DeleteCertificate",
+ "iot:DetachPrincipalPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/deeplens*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "DeepLensIoTCertificateAccess"
+ },
+ {
+ "Action": [
+ "iot:CreateKeysAndCertificate",
+ "iot:CreatePolicy",
+ "iot:CreatePolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensIoTCreateCertificateAndPolicyAccess"
+ },
+ {
+ "Action": [
+ "iot:AttachPrincipalPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:policy/deeplens*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "DeepLensIoTAttachCertificatePolicyAccess"
+ },
+ {
+ "Action": [
+ "iot:GetThingShadow",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/deeplens*"
+ ],
+ "Sid": "DeepLensIoTDataAccess"
+ },
+ {
+ "Action": [
+ "iot:DescribeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensIoTEndpointAccess"
+ },
+ {
+ "Action": [
+ "deeplens:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensAccess"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::deeplens*"
+ ],
+ "Sid": "DeepLensS3ObjectAccess"
+ },
+ {
+ "Action": [
+ "s3:DeleteBucket",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::deeplens*"
+ ],
+ "Sid": "DeepLensS3Buckets"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensCreateS3Buckets"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "greengrass.amazonaws.com",
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensIAMPassRoleAccess"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": "lambda.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSDeepLens*",
+ "arn:aws:iam::*:role/service-role/AWSDeepLens*"
+ ],
+ "Sid": "DeepLensIAMLambdaPassRoleAccess"
+ },
+ {
+ "Action": [
+ "greengrass:AssociateRoleToGroup",
+ "greengrass:AssociateServiceRoleToAccount",
+ "greengrass:CreateResourceDefinition",
+ "greengrass:CreateResourceDefinitionVersion",
+ "greengrass:CreateCoreDefinition",
+ "greengrass:CreateCoreDefinitionVersion",
+ "greengrass:CreateDeployment",
+ "greengrass:CreateFunctionDefinition",
+ "greengrass:CreateFunctionDefinitionVersion",
+ "greengrass:CreateGroup",
+ "greengrass:CreateGroupCertificateAuthority",
+ "greengrass:CreateGroupVersion",
+ "greengrass:CreateLoggerDefinition",
+ "greengrass:CreateLoggerDefinitionVersion",
+ "greengrass:CreateSubscriptionDefinition",
+ "greengrass:CreateSubscriptionDefinitionVersion",
+ "greengrass:DeleteCoreDefinition",
+ "greengrass:DeleteFunctionDefinition",
+ "greengrass:DeleteGroup",
+ "greengrass:DeleteLoggerDefinition",
+ "greengrass:DeleteSubscriptionDefinition",
+ "greengrass:DisassociateRoleFromGroup",
+ "greengrass:DisassociateServiceRoleFromAccount",
+ "greengrass:GetAssociatedRole",
+ "greengrass:GetConnectivityInfo",
+ "greengrass:GetCoreDefinition",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:GetDeploymentStatus",
+ "greengrass:GetDeviceDefinition",
+ "greengrass:GetDeviceDefinitionVersion",
+ "greengrass:GetFunctionDefinition",
+ "greengrass:GetFunctionDefinitionVersion",
+ "greengrass:GetGroup",
+ "greengrass:GetGroupCertificateAuthority",
+ "greengrass:GetGroupCertificateConfiguration",
+ "greengrass:GetGroupVersion",
+ "greengrass:GetLoggerDefinition",
+ "greengrass:GetLoggerDefinitionVersion",
+ "greengrass:GetResourceDefinition",
+ "greengrass:GetServiceRoleForAccount",
+ "greengrass:GetSubscriptionDefinition",
+ "greengrass:GetSubscriptionDefinitionVersion",
+ "greengrass:ListCoreDefinitionVersions",
+ "greengrass:ListCoreDefinitions",
+ "greengrass:ListDeployments",
+ "greengrass:ListDeviceDefinitionVersions",
+ "greengrass:ListDeviceDefinitions",
+ "greengrass:ListFunctionDefinitionVersions",
+ "greengrass:ListFunctionDefinitions",
+ "greengrass:ListGroupCertificateAuthorities",
+ "greengrass:ListGroupVersions",
+ "greengrass:ListGroups",
+ "greengrass:ListLoggerDefinitionVersions",
+ "greengrass:ListLoggerDefinitions",
+ "greengrass:ListSubscriptionDefinitionVersions",
+ "greengrass:ListSubscriptionDefinitions",
+ "greengrass:ResetDeployments",
+ "greengrass:UpdateConnectivityInfo",
+ "greengrass:UpdateCoreDefinition",
+ "greengrass:UpdateDeviceDefinition",
+ "greengrass:UpdateFunctionDefinition",
+ "greengrass:UpdateGroup",
+ "greengrass:UpdateGroupCertificateConfiguration",
+ "greengrass:UpdateLoggerDefinition",
+ "greengrass:UpdateSubscriptionDefinition",
+ "greengrass:UpdateResourceDefinition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensGreenGrassAccess"
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction",
+ "lambda:PublishVersion",
+ "lambda:UpdateFunctionCode",
+ "lambda:UpdateFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:deeplens*"
+ ],
+ "Sid": "DeepLensLambdaAdminFunctionAccess"
+ },
+ {
+ "Action": [
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*"
+ ],
+ "Sid": "DeepLensLambdaUsersFunctionAccess"
+ },
+ {
+ "Action": [
+ "sagemaker:CreateTrainingJob",
+ "sagemaker:DescribeTrainingJob",
+ "sagemaker:StopTrainingJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:training-job/deeplens*"
+ ],
+ "Sid": "DeepLensSageMakerWriteAccess"
+ },
+ {
+ "Action": [
+ "sagemaker:DescribeTrainingJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:training-job/*"
+ ],
+ "Sid": "DeepLensSageMakerReadAccess"
+ },
+ {
+ "Action": [
+ "kinesisvideo:CreateStream",
+ "kinesisvideo:DescribeStream",
+ "kinesisvideo:DeleteStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesisvideo:*:*:stream/deeplens*/*"
+ ],
+ "Sid": "DeepLensKinesisVideoStreamAccess"
+ },
+ {
+ "Action": [
+ "kinesisvideo:GetDataEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepLensKinesisVideoEndpointAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJK2Z2S7FPJFCYGR72",
+ "PolicyName": "AWSDeepLensServiceRolePolicy",
+ "UpdateDate": "2019-09-25T19:25:06+00:00",
+ "VersionId": "v6"
+ },
+ "AWSDeepRacerAccountAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepRacerAccountAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-28T01:27:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "deepracer:*"
+ ],
+ "Condition": {
+ "Null": {
+ "deepracer:UserToken": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "DeepRacerAdminAccessStatement"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HKQKG3YSU",
+ "PolicyName": "AWSDeepRacerAccountAdminAccess",
+ "UpdateDate": "2021-10-28T01:27:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeepRacerCloudFormationAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepRacerCloudFormationAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-02-28T21:59:49+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AttachInternetGateway",
+ "ec2:AssociateRouteTable",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAclEntry",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkAclEntry",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "ec2:DetachInternetGateway",
+ "ec2:DisassociateRouteTable",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceNetworkAclAssociation",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "iam:PassedToService": "lambda.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/AWSDeepRacerLambdaAccessRole"
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:GetFunction",
+ "lambda:DeleteFunction",
+ "lambda:TagResource",
+ "lambda:UpdateFunctionCode"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*DeepRacer*",
+ "arn:aws:lambda:*:*:function:*Deepracer*",
+ "arn:aws:lambda:*:*:function:*deepracer*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutBucketPolicy",
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:DeleteBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*DeepRacer*",
+ "arn:aws:s3:::*Deepracer*",
+ "arn:aws:s3:::*deepracer*"
+ ]
+ },
+ {
+ "Action": [
+ "robomaker:CreateSimulationApplication",
+ "robomaker:CreateSimulationApplicationVersion",
+ "robomaker:DeleteSimulationApplication",
+ "robomaker:DescribeSimulationApplication",
+ "robomaker:ListSimulationApplications",
+ "robomaker:TagResource",
+ "robomaker:UpdateSimulationApplication"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:robomaker:*:*:/createSimulationApplication",
+ "arn:aws:robomaker:*:*:simulation-application/deepracer*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYG7FM75UF5CW5ICS",
+ "PolicyName": "AWSDeepRacerCloudFormationAccessPolicy",
+ "UpdateDate": "2019-06-14T17:02:04+00:00",
+ "VersionId": "v2"
+ },
+ "AWSDeepRacerDefaultMultiUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepRacerDefaultMultiUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-28T01:27:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "deepracer:Add*",
+ "deepracer:Remove*",
+ "deepracer:Create*",
+ "deepracer:Perform*",
+ "deepracer:Clone*",
+ "deepracer:Get*",
+ "deepracer:List*",
+ "deepracer:Edit*",
+ "deepracer:Start*",
+ "deepracer:Set*",
+ "deepracer:Update*",
+ "deepracer:Delete*",
+ "deepracer:Stop*",
+ "deepracer:Import*",
+ "deepracer:Tag*",
+ "deepracer:Untag*"
+ ],
+ "Condition": {
+ "Bool": {
+ "deepracer:MultiUser": "true"
+ },
+ "Null": {
+ "deepracer:UserToken": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "deepracer:GetAccountConfig",
+ "deepracer:GetTrack",
+ "deepracer:ListTracks",
+ "deepracer:TestRewardFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "deepracer:Admin*"
+ ],
+ "Effect": "Deny",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IDMSNDQGW",
+ "PolicyName": "AWSDeepRacerDefaultMultiUserAccess",
+ "UpdateDate": "2021-10-28T01:27:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeepRacerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepRacerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-05T22:03:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:DeleteObjectVersion",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy",
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:GetObjectAcl",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*DeepRacer*",
+ "arn:aws:s3:::*Deepracer*",
+ "arn:aws:s3:::*deepracer*",
+ "arn:aws:s3:::dr-*",
+ "arn:aws:s3:::*DeepRacer*/*",
+ "arn:aws:s3:::*Deepracer*/*",
+ "arn:aws:s3:::*deepracer*/*",
+ "arn:aws:s3:::dr-*/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JFTOPTVBM",
+ "PolicyName": "AWSDeepRacerFullAccess",
+ "UpdateDate": "2020-10-05T22:03:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeepRacerRoboMakerAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeepRacerRoboMakerAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-02-28T21:59:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "robomaker:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/robomaker/SimulationJobs",
+ "arn:aws:logs:*:*:log-group:/aws/robomaker/SimulationJobs:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*DeepRacer*",
+ "arn:aws:s3:::*Deepracer*",
+ "arn:aws:s3:::*deepracer*",
+ "arn:aws:s3:::dr-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/DeepRacer": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesisvideo:CreateStream",
+ "kinesisvideo:DescribeStream",
+ "kinesisvideo:GetDataEndpoint",
+ "kinesisvideo:PutMedia",
+ "kinesisvideo:TagStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesisvideo:*:*:stream/dr-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUKGYRTDCUFOMRGAM",
+ "PolicyName": "AWSDeepRacerRoboMakerAccessPolicy",
+ "UpdateDate": "2019-02-28T21:59:58+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeepRacerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSDeepRacerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-02-28T21:58:09+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "deepracer:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "robomaker:*",
+ "sagemaker:*",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:ListStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DetectStackDrift",
+ "cloudformation:DescribeStackDriftDetectionStatus",
+ "cloudformation:DescribeStackResourceDrifts"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSDeepRacer*",
+ "arn:aws:iam::*:role/service-role/AWSDeepRacer*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:InvokeFunction",
+ "lambda:UpdateFunctionCode"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*DeepRacer*",
+ "arn:aws:lambda:*:*:function:*Deepracer*",
+ "arn:aws:lambda:*:*:function:*deepracer*",
+ "arn:aws:lambda:*:*:function:*dr-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetBucketLocation",
+ "s3:DeleteObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutBucketPolicy",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*DeepRacer*",
+ "arn:aws:s3:::*Deepracer*",
+ "arn:aws:s3:::*deepracer*",
+ "arn:aws:s3:::dr-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/DeepRacer": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesisvideo:CreateStream",
+ "kinesisvideo:DeleteStream",
+ "kinesisvideo:DescribeStream",
+ "kinesisvideo:GetDataEndpoint",
+ "kinesisvideo:GetHLSStreamingSessionURL",
+ "kinesisvideo:GetMedia",
+ "kinesisvideo:PutMedia",
+ "kinesisvideo:TagStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesisvideo:*:*:stream/dr-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJTUAQLIAVBJ7LZ32S",
+ "PolicyName": "AWSDeepRacerServiceRolePolicy",
+ "UpdateDate": "2019-06-12T20:55:34+00:00",
+ "VersionId": "v3"
+ },
+ "AWSDenyAll": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDenyAll",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-01T22:36:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "*"
+ ],
+ "Effect": "Deny",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P43IUQ5E5",
+ "PolicyName": "AWSDenyAll",
+ "UpdateDate": "2019-05-01T22:36:14+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeviceFarmFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDeviceFarmFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-13T16:37:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devicefarm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJO7KEDP4VYJPNT5UW",
+ "PolicyName": "AWSDeviceFarmFullAccess",
+ "UpdateDate": "2015-07-13T16:37:38+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDeviceFarmTestGridServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSDeviceFarmTestGridServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-26T22:01:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/AWSDeviceFarmManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateNetworkInterface"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/AWSDeviceFarmManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/AWSDeviceFarmManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KOLIVAOCV",
+ "PolicyName": "AWSDeviceFarmTestGridServiceRolePolicy",
+ "UpdateDate": "2021-05-26T22:01:35+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDirectConnectFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectConnectFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:07+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:*",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribeTransitGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQF2QKZSK74KTIHOW",
+ "PolicyName": "AWSDirectConnectFullAccess",
+ "UpdateDate": "2019-04-30T15:29:29+00:00",
+ "VersionId": "v3"
+ },
+ "AWSDirectConnectReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectConnectReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:08+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:Describe*",
+ "directconnect:List*",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribeTransitGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI23HZ27SI6FQMGNQ2",
+ "PolicyName": "AWSDirectConnectReadOnlyAccess",
+ "UpdateDate": "2020-05-18T18:48:22+00:00",
+ "VersionId": "v4"
+ },
+ "AWSDirectConnectServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSDirectConnectServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-14T18:35:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:ListSecretVersionIds",
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:*directconnect*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4O7743JCTQ",
+ "PolicyName": "AWSDirectConnectServiceRolePolicy",
+ "UpdateDate": "2021-01-14T18:35:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSDirectoryServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectoryServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:11+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DescribeSecurityGroups",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "iam:ListRoles",
+ "organizations:ListAccountsForParent",
+ "organizations:ListRoots",
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeAccount",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:DirectoryMonitoring*"
+ },
+ {
+ "Action": [
+ "organizations:EnableAWSServiceAccess",
+ "organizations:DisableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": "ds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINAW5ANUWTH3R4ANI",
+ "PolicyName": "AWSDirectoryServiceFullAccess",
+ "UpdateDate": "2020-11-24T23:24:10+00:00",
+ "VersionId": "v5"
+ },
+ "AWSDirectoryServiceReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDirectoryServiceReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:12+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:Check*",
+ "ds:Describe*",
+ "ds:Get*",
+ "ds:List*",
+ "ds:Verify*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "sns:ListTopics",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIHWYO6WSDNCG64M2W",
+ "PolicyName": "AWSDirectoryServiceReadOnlyAccess",
+ "UpdateDate": "2018-09-25T21:54:01+00:00",
+ "VersionId": "v4"
+ },
+ "AWSDiscoveryContinuousExportFirehosePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSDiscoveryContinuousExportFirehosePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-09T18:29:39+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:GetTableVersions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-application-discovery-service-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/application-discovery-service/firehose:log-stream:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIX6FHUTEUNXYDFZ7C",
+ "PolicyName": "AWSDiscoveryContinuousExportFirehosePolicy",
+ "UpdateDate": "2021-06-08T17:32:46+00:00",
+ "VersionId": "v2"
+ },
+ "AWSEC2CapacityReservationFleetRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEC2CapacityReservationFleetRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-29T14:43:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeCapacityReservations",
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateCapacityReservation",
+ "ec2:CancelCapacityReservation",
+ "ec2:ModifyCapacityReservation"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:CapacityReservationFleet": "arn:aws:ec2:*:*:capacity-reservation-fleet/crf-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:capacity-reservation/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateCapacityReservation"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:capacity-reservation/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HMH3YJXLU",
+ "PolicyName": "AWSEC2CapacityReservationFleetRolePolicy",
+ "UpdateDate": "2021-09-29T14:43:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSEC2FleetServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEC2FleetServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-21T00:08:55+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:RequestSpotInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "spot.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2SpotManagement"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:spot-instances-request/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2:fleet-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJCL355O4TC27CPKVC",
+ "PolicyName": "AWSEC2FleetServiceRolePolicy",
+ "UpdateDate": "2020-05-04T20:10:31+00:00",
+ "VersionId": "v3"
+ },
+ "AWSEC2SpotFleetServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEC2SpotFleetServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-23T19:13:06+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:RequestSpotInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:spot-instances-request/*",
+ "arn:aws:ec2:*:*:spot-fleet-request/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2spot:fleet-request-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:*/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILWCVTZD57EMYWMBO",
+ "PolicyName": "AWSEC2SpotFleetServiceRolePolicy",
+ "UpdateDate": "2020-03-16T19:16:21+00:00",
+ "VersionId": "v4"
+ },
+ "AWSEC2SpotServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEC2SpotServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-09-18T18:51:54+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "StringNotEquals": {
+ "ec2:InstanceMarketType": "spot"
+ }
+ },
+ "Effect": "Deny",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZJJBQNXQYVKTEXGM",
+ "PolicyName": "AWSEC2SpotServiceRolePolicy",
+ "UpdateDate": "2018-12-12T00:13:51+00:00",
+ "VersionId": "v4"
+ },
+ "AWSECRPullThroughCache_ServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSECRPullThroughCache_ServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-26T21:51:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:InitiateLayerUpload",
+ "ecr:UploadLayerPart",
+ "ecr:CompleteLayerUpload",
+ "ecr:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G6RNU4BVN",
+ "PolicyName": "AWSECRPullThroughCache_ServiceRolePolicy",
+ "UpdateDate": "2021-11-26T21:51:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkCustomPlatformforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkCustomPlatformforEC2Role",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-21T22:50:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachVolume",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CopyImage",
+ "ec2:CreateImage",
+ "ec2:CreateKeypair",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:DeleteKeypair",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeleteVolume",
+ "ec2:DeregisterImage",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVolumes",
+ "ec2:DetachVolume",
+ "ec2:GetPasswordData",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifySnapshotAttribute",
+ "ec2:RegisterImage",
+ "ec2:RunInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2Access"
+ },
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/platform/*",
+ "Sid": "CloudWatchLogsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJRVFXSS6LEIQGBKDY",
+ "PolicyName": "AWSElasticBeanstalkCustomPlatformforEC2Role",
+ "UpdateDate": "2017-02-21T22:50:30+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkEnhancedHealth": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-08T23:17:27+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:GetConsoleOutput",
+ "ec2:AssociateAddress",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeSecurityGroups",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeNotificationConfigurations",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*:log-stream:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIH5EFJNMOGUUTKLFE",
+ "PolicyName": "AWSElasticBeanstalkEnhancedHealth",
+ "UpdateDate": "2018-04-09T22:12:53+00:00",
+ "VersionId": "v4"
+ },
+ "AWSElasticBeanstalkMaintenance": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticBeanstalkMaintenance",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-11T23:22:52+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:ListChangeSets",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "AllowCloudformationChangeSetOperationsOnElasticBeanstalkStacks"
+ },
+ {
+ "Action": "elasticloadbalancing:DescribeLoadBalancers",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowElasticBeanstalkStacksUpdateExecuteSuccessfully"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQPH22XGBH2VV2LSW",
+ "PolicyName": "AWSElasticBeanstalkMaintenance",
+ "UpdateDate": "2019-06-04T17:48:27+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-03T22:18:00+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticbeanstalk:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ElasticBeanstalkPermissions"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "elasticbeanstalk.amazonaws.com",
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn",
+ "autoscaling.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "ecs.amazonaws.com",
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*",
+ "Sid": "AllowPassRoleToElasticBeanstalkAndDownstreamServices"
+ },
+ {
+ "Action": [
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeScheduledActions",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcs",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "logs:DescribeLogGroups",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ReadOnlyPermissions"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2BroadOperationPermissions"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "ArnLike": {
+ "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2RunInstancesOperationPermissions"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": [
+ "arn:aws:cloudformation:*:*:stack/awseb-e-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "EC2TerminateInstancesOperationPermissions"
+ },
+ {
+ "Action": [
+ "ecs:CreateCluster",
+ "ecs:DescribeClusters",
+ "ecs:RegisterTaskDefinition"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ECSBroadOperationPermissions"
+ },
+ {
+ "Action": "ecs:DeleteCluster",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:cluster/awseb-*",
+ "Sid": "ECSDeleteClusterOperationPermissions"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DetachInstances",
+ "autoscaling:DeletePolicy",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/eb-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/eb-*"
+ ],
+ "Sid": "ASGOperationPermissions"
+ },
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "CFNOperationPermissions"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DeregisterTargets",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/awseb-*/*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/eb-*/*"
+ ],
+ "Sid": "ELBOperationPermissions"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DeleteLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*",
+ "Sid": "CWLogsOperationPermissions"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectVersion",
+ "s3:GetObjectVersionAcl",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutObjectVersionAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*/*",
+ "Sid": "S3ObjectOperationPermissions"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*",
+ "Sid": "S3BucketOperationPermissions"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:ElasticBeanstalkNotifications-*",
+ "Sid": "SNSOperationPermissions"
+ },
+ {
+ "Action": [
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:awseb-e-*",
+ "arn:aws:sqs:*:*:eb-*"
+ ],
+ "Sid": "SQSOperationPermissions"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:awseb-*",
+ "arn:aws:cloudwatch:*:*:alarm:eb-*"
+ ],
+ "Sid": "CWPutMetricAlarmOperationPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AKB7QD2CZ",
+ "PolicyName": "AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy",
+ "UpdateDate": "2021-06-16T22:40:31+00:00",
+ "VersionId": "v3"
+ },
+ "AWSElasticBeanstalkManagedUpdatesServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticBeanstalkManagedUpdatesServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-21T22:35:06+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLikeIfExists": {
+ "iam:PassedToService": [
+ "elasticbeanstalk.amazonaws.com",
+ "ec2.amazonaws.com",
+ "autoscaling.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "ecs.amazonaws.com",
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowPassRoleToElasticBeanstalkAndDownstreamServices"
+ },
+ {
+ "Action": [
+ "ec2:releaseAddress",
+ "ec2:allocateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AssociateAddress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SingleInstanceAPIs"
+ },
+ {
+ "Action": [
+ "ecs:RegisterTaskDefinition",
+ "ecs:DeRegisterTaskDefinition",
+ "ecs:List*",
+ "ecs:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ECS"
+ },
+ {
+ "Action": [
+ "elasticbeanstalk:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ElasticBeanstalkAPIs"
+ },
+ {
+ "Action": [
+ "cloudformation:Describe*",
+ "cloudformation:List*",
+ "ec2:Describe*",
+ "autoscaling:Describe*",
+ "elasticloadbalancing:Describe*",
+ "logs:DescribeLogGroups",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ReadOnlyAPIs"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DetachInstances",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/eb-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/eb-*"
+ ],
+ "Sid": "ASG"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:CancelUpdateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:GetTemplate",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-e-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "CFN"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": [
+ "arn:aws:cloudformation:*:*:stack/awseb-e-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "EC2"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectVersion",
+ "s3:GetObjectVersionAcl",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutObjectVersionAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*/*",
+ "Sid": "S3Obj"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*",
+ "Sid": "S3Bucket"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DeleteLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*",
+ "Sid": "CWL"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeRegisterTargets",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-e-*",
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/eb-*"
+ ],
+ "Sid": "ELB"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:ElasticBeanstalkNotifications-Environment-*",
+ "Sid": "SNS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HVFNJB4NR",
+ "PolicyName": "AWSElasticBeanstalkManagedUpdatesServiceRolePolicy",
+ "UpdateDate": "2020-12-11T18:21:32+00:00",
+ "VersionId": "v5"
+ },
+ "AWSElasticBeanstalkMulticontainerDocker": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-08T23:15:29+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:Poll",
+ "ecs:StartTask",
+ "ecs:StopTask",
+ "ecs:DiscoverPollEndpoint",
+ "ecs:StartTelemetrySession",
+ "ecs:RegisterContainerInstance",
+ "ecs:DeregisterContainerInstance",
+ "ecs:DescribeContainerInstances",
+ "ecs:Submit*",
+ "ecs:DescribeTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ECSAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ45SBYG72SD6SHJEY",
+ "PolicyName": "AWSElasticBeanstalkMulticontainerDocker",
+ "UpdateDate": "2016-06-06T23:45:37+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticBeanstalkReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-22T19:02:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeScheduledActions",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStackResources",
+ "cloudformation:ListStacks",
+ "cloudformation:ValidateTemplate",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeSSLPolicies",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "iam:GetRole",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "iam:ListServerCertificates",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribeDBSnapshots",
+ "s3:ListAllMyBuckets",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowAPIs"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectVersion",
+ "s3:GetObjectVersionAcl",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*",
+ "Sid": "AllowS3"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BYFSOYIWH",
+ "PolicyName": "AWSElasticBeanstalkReadOnly",
+ "UpdateDate": "2021-01-22T19:02:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkRoleCWL": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleCWL",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:49:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DeleteLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*",
+ "Sid": "AllowCWL"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G4S2QMTW3",
+ "PolicyName": "AWSElasticBeanstalkRoleCWL",
+ "UpdateDate": "2020-06-05T21:49:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkRoleCore": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleCore",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:48:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/awseb-e-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "TerminateInstances"
+ },
+ {
+ "Action": [
+ "ec2:ReleaseAddress",
+ "ec2:AllocateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AssociateAddress",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteSecurityGroup",
+ "ec2:AuthorizeSecurityGroup*",
+ "ec2:RevokeSecurityGroup*",
+ "ec2:CreateLaunchTemplate*",
+ "ec2:DeleteLaunchTemplate*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "ArnLike": {
+ "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LTRunInstances"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:*LoadBalancer*",
+ "autoscaling:*AutoScalingGroup",
+ "autoscaling:*LaunchConfiguration",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DetachInstances",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:*Tags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*"
+ ],
+ "Sid": "ASG"
+ },
+ {
+ "Action": [
+ "autoscaling:DeletePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ASGPolicy"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "elasticbeanstalk.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*"
+ ],
+ "Sid": "EBSLR"
+ },
+ {
+ "Action": [
+ "s3:Delete*",
+ "s3:Get*",
+ "s3:Put*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*/*",
+ "arn:aws:s3:::elasticbeanstalk-env-resources-*/*"
+ ],
+ "Sid": "S3Obj"
+ },
+ {
+ "Action": [
+ "s3:GetBucket*",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*",
+ "Sid": "S3Bucket"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStackResources",
+ "cloudformation:UpdateStack",
+ "cloudformation:ContinueUpdateRollback",
+ "cloudformation:CancelUpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/awseb-e-*",
+ "Sid": "CFN"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:awseb-*",
+ "Sid": "CloudWatch"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:Create*",
+ "elasticloadbalancing:Delete*",
+ "elasticloadbalancing:Modify*",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeRegisterTargets",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:*Tags",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:SetRulePriorities",
+ "elasticloadbalancing:SetLoadBalancerPoliciesOfListener"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/awseb-*/*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/awseb-*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:listener/app/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:listener/net/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/awseb-*/*/*/*"
+ ],
+ "Sid": "ELB"
+ },
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudformation:Describe*",
+ "logs:Describe*",
+ "ec2:Describe*",
+ "ecs:Describe*",
+ "ecs:List*",
+ "elasticloadbalancing:Describe*",
+ "rds:Describe*",
+ "sns:List*",
+ "iam:List*",
+ "acm:Describe*",
+ "acm:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ListAPIs"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "elasticbeanstalk.amazonaws.com",
+ "ec2.amazonaws.com",
+ "autoscaling.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "ecs.amazonaws.com",
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-elasticbeanstalk-*",
+ "Sid": "AllowPassRole"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OXQ5DMW6K",
+ "PolicyName": "AWSElasticBeanstalkRoleCore",
+ "UpdateDate": "2020-09-09T20:31:14+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticBeanstalkRoleECS": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleECS",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:47:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:RegisterTaskDefinition",
+ "ecs:DeRegisterTaskDefinition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowECS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ORP4E3ZEZ",
+ "PolicyName": "AWSElasticBeanstalkRoleECS",
+ "UpdateDate": "2020-06-05T21:47:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkRoleRDS": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleRDS",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:46:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:CreateDBSecurityGroup",
+ "rds:DeleteDBSecurityGroup",
+ "rds:AuthorizeDBSecurityGroupIngress",
+ "rds:CreateDBInstance",
+ "rds:ModifyDBInstance",
+ "rds:DeleteDBInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:secgrp:awseb-e-*",
+ "arn:aws:rds:*:*:db:*"
+ ],
+ "Sid": "AllowRDS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G5JWEESE4",
+ "PolicyName": "AWSElasticBeanstalkRoleRDS",
+ "UpdateDate": "2020-06-05T21:46:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkRoleSNS": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleSNS",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:46:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:SetTopicAttributes",
+ "sns:DeleteTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:ElasticBeanstalkNotifications-*"
+ ],
+ "Sid": "AllowBeanstalkManageSNS"
+ },
+ {
+ "Action": [
+ "sns:GetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowSNSPublish"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PARPZJ2UZ",
+ "PolicyName": "AWSElasticBeanstalkRoleSNS",
+ "UpdateDate": "2020-06-05T21:46:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkRoleWorkerTier": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkRoleWorkerTier",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-05T21:43:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:TagQueue",
+ "sqs:DeleteQueue",
+ "sqs:GetQueueAttributes",
+ "sqs:CreateQueue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sqs:*:*:awseb-e-*",
+ "Sid": "AllowSQS"
+ },
+ {
+ "Action": [
+ "dynamodb:CreateTable",
+ "dynamodb:TagResource",
+ "dynamodb:DescribeTable",
+ "dynamodb:DeleteTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/awseb-e-*",
+ "Sid": "AllowDDB"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LTO4NS2Z5",
+ "PolicyName": "AWSElasticBeanstalkRoleWorkerTier",
+ "UpdateDate": "2020-06-05T21:43:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticBeanstalkService": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkService",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-04-11T20:27:23+00:00",
+ "DefaultVersionId": "v16",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "AllowCloudformationOperationsOnElasticBeanstalkStacks"
+ },
+ {
+ "Action": [
+ "logs:DeleteLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "AllowDeleteCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "s3:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "AllowS3OperationsOnElasticBeanstalkBuckets"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "ArnLike": {
+ "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowLaunchTemplateRunInstances"
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteScheduledAction",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DetachInstances",
+ "autoscaling:DeletePolicy",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:PutScheduledUpdateGroupAction",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "cloudwatch:PutMetricAlarm",
+ "ec2:AssociateAddress",
+ "ec2:AllocateAddress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:TerminateInstances",
+ "ecs:CreateCluster",
+ "ecs:DeleteCluster",
+ "ecs:DescribeClusters",
+ "ecs:RegisterTaskDefinition",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:DeregisterTargets",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy",
+ "logs:DescribeLogGroups",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:ListBucket",
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic",
+ "sns:Subscribe",
+ "sns:SetTopicAttributes",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowOperations"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKQ5SN74ZQ4WASXBM",
+ "PolicyName": "AWSElasticBeanstalkService",
+ "UpdateDate": "2019-06-14T23:18:46+00:00",
+ "VersionId": "v16"
+ },
+ "AWSElasticBeanstalkServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticBeanstalkServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-13T23:46:37+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ],
+ "Sid": "AllowCloudformationReadOperationsOnElasticBeanstalkStacks"
+ },
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribeScalingActivities",
+ "autoscaling:PutNotificationConfiguration",
+ "ec2:DescribeInstanceStatus",
+ "ec2:AssociateAddress",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "lambda:GetFunction",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowOperations"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:DeleteLogGroup",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*",
+ "Sid": "AllowOperationsOnHealthStreamingLogs"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIID62QSI3OSIPQXTM",
+ "PolicyName": "AWSElasticBeanstalkServiceRolePolicy",
+ "UpdateDate": "2019-06-06T21:59:51+00:00",
+ "VersionId": "v6"
+ },
+ "AWSElasticBeanstalkWebTier": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-08T23:08:54+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingStatisticSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "XRayAccess"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "CloudWatchLogsAccess"
+ },
+ {
+ "Action": [
+ "elasticbeanstalk:PutInstanceStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticbeanstalk:*:*:application/*",
+ "arn:aws:elasticbeanstalk:*:*:environment/*"
+ ],
+ "Sid": "ElasticBeanstalkHealthAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUF4325SJYOREKW3A",
+ "PolicyName": "AWSElasticBeanstalkWebTier",
+ "UpdateDate": "2020-09-09T19:38:36+00:00",
+ "VersionId": "v7"
+ },
+ "AWSElasticBeanstalkWorkerTier": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-08T23:12:02+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "MetricsAccess"
+ },
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingStatisticSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "XRayAccess"
+ },
+ {
+ "Action": [
+ "sqs:ChangeMessageVisibility",
+ "sqs:DeleteMessage",
+ "sqs:ReceiveMessage",
+ "sqs:SendMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "QueueAccess"
+ },
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::elasticbeanstalk-*",
+ "arn:aws:s3:::elasticbeanstalk-*/*"
+ ],
+ "Sid": "BucketAccess"
+ },
+ {
+ "Action": [
+ "dynamodb:BatchGetItem",
+ "dynamodb:BatchWriteItem",
+ "dynamodb:DeleteItem",
+ "dynamodb:GetItem",
+ "dynamodb:PutItem",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:UpdateItem"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/*-stack-AWSEBWorkerCronLeaderRegistry*"
+ ],
+ "Sid": "DynamoPeriodicTasks"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
+ ],
+ "Sid": "CloudWatchLogsAccess"
+ },
+ {
+ "Action": [
+ "elasticbeanstalk:PutInstanceStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticbeanstalk:*:*:application/*",
+ "arn:aws:elasticbeanstalk:*:*:environment/*"
+ ],
+ "Sid": "ElasticBeanstalkHealthAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQDLBRSJVKVF4JMSK",
+ "PolicyName": "AWSElasticBeanstalkWorkerTier",
+ "UpdateDate": "2020-09-09T19:53:40+00:00",
+ "VersionId": "v6"
+ },
+ "AWSElasticDisasterRecoveryAgentInstallationPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryAgentInstallationPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:37:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:GetAgentInstallationAssetsForDrs",
+ "drs:SendClientLogsForDrs",
+ "drs:CreateSourceServerForDrs",
+ "drs:CreateRecoveryInstanceForDrs",
+ "drs:DescribeRecoveryInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:TagResource",
+ "drs:IssueAgentCertificateForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:source-server/*"
+ },
+ {
+ "Action": [
+ "drs:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:recovery-instance/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LHPRHPQKB",
+ "PolicyName": "AWSElasticDisasterRecoveryAgentInstallationPolicy",
+ "UpdateDate": "2021-11-17T10:37:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryAgentPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryAgentPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:32:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendAgentMetricsForDrs",
+ "drs:SendAgentLogsForDrs",
+ "drs:UpdateAgentSourcePropertiesForDrs",
+ "drs:UpdateAgentReplicationInfoForDrs",
+ "drs:UpdateAgentConversionInfoForDrs",
+ "drs:GetAgentCommandForDrs",
+ "drs:GetAgentConfirmedResumeInfoForDrs",
+ "drs:GetAgentRuntimeConfigurationForDrs",
+ "drs:UpdateAgentBacklogForDrs",
+ "drs:GetAgentReplicationInfoForDrs",
+ "drs:IssueAgentCertificateForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:source-server/${aws:SourceIdentity}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IPFHAAF4L",
+ "PolicyName": "AWSElasticDisasterRecoveryAgentPolicy",
+ "UpdateDate": "2021-11-17T10:32:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:46:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsEncryptionByDefault",
+ "ec2:GetEbsDefaultKmsKeyId"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "license-manager:ListLicenseConfigurations",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "resource-groups:ListGroups",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:DescribeLoadBalancers",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListInstanceProfiles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSElasticDisasterRecoveryConversionServerRole",
+ "arn:aws:iam::*:role/service-role/AWSElasticDisasterRecoveryRecoveryInstanceRole"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:ModifyLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:GetConsoleOutput",
+ "ec2:GetConsoleScreenshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": "ec2:CreateSecurityGroup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "ec2:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "Bool": {
+ "aws:ViaAWSService": "true"
+ },
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateSecurityGroup",
+ "CreateVolume",
+ "CreateSnapshot",
+ "RunInstances"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LCQTK3F7W",
+ "PolicyName": "AWSElasticDisasterRecoveryConsoleFullAccess",
+ "UpdateDate": "2021-11-17T10:46:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryConversionServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryConversionServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T13:42:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendClientMetricsForDrs",
+ "drs:SendClientLogsForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:GetChannelCommandsForDrs",
+ "drs:SendChannelCommandResultForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G7IPHJVFX",
+ "PolicyName": "AWSElasticDisasterRecoveryConversionServerPolicy",
+ "UpdateDate": "2021-11-17T13:42:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryFailbackInstallationPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryFailbackInstallationPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T11:02:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendClientLogsForDrs",
+ "drs:SendClientMetricsForDrs",
+ "drs:DescribeRecoveryInstances",
+ "drs:DescribeSourceServers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:TagResource",
+ "drs:IssueAgentCertificateForDrs",
+ "drs:AssociateFailbackClientToRecoveryInstanceForDrs",
+ "drs:GetSuggestedFailbackClientDeviceMappingForDrs",
+ "drs:UpdateFailbackClientDeviceMappingForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:recovery-instance/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JWDYEAMTS",
+ "PolicyName": "AWSElasticDisasterRecoveryFailbackInstallationPolicy",
+ "UpdateDate": "2021-11-17T11:02:03+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryFailbackPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryFailbackPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:41:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendClientMetricsForDrs",
+ "drs:SendClientLogsForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:GetChannelCommandsForDrs",
+ "drs:SendChannelCommandResultForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:DescribeReplicationServerAssociationsForDrs",
+ "drs:DescribeRecoveryInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:GetFailbackCommandForDrs",
+ "drs:UpdateFailbackClientLastSeenForDrs",
+ "drs:NotifyAgentAuthenticationForDrs",
+ "drs:UpdateAgentReplicationProcessStateForDrs",
+ "drs:NotifyAgentReplicationProgressForDrs",
+ "drs:NotifyAgentConnectedForDrs",
+ "drs:NotifyAgentDisconnectedForDrs",
+ "drs:NotifyConsistencyAttainedForDrs",
+ "drs:GetFailbackLaunchRequestedForDrs",
+ "drs:IssueAgentCertificateForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:recovery-instance/${aws:SourceIdentity}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FSEIUN7KZ",
+ "PolicyName": "AWSElasticDisasterRecoveryFailbackPolicy",
+ "UpdateDate": "2021-11-17T10:41:40+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:50:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:DescribeJobLogItems",
+ "drs:DescribeJobs",
+ "drs:DescribeRecoveryInstances",
+ "drs:DescribeRecoverySnapshots",
+ "drs:DescribeReplicationConfigurationTemplates",
+ "drs:DescribeSourceServers",
+ "drs:GetFailbackReplicationConfiguration",
+ "drs:GetLaunchConfiguration",
+ "drs:GetReplicationConfiguration",
+ "drs:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AACAUJE3T",
+ "PolicyName": "AWSElasticDisasterRecoveryReadOnlyAccess",
+ "UpdateDate": "2021-11-17T10:50:05+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryRecoveryInstancePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryRecoveryInstancePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:20:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendAgentMetricsForDrs",
+ "drs:SendAgentLogsForDrs",
+ "drs:UpdateAgentSourcePropertiesForDrs",
+ "drs:UpdateAgentReplicationInfoForDrs",
+ "drs:UpdateAgentConversionInfoForDrs",
+ "drs:GetAgentCommandForDrs",
+ "drs:GetAgentConfirmedResumeInfoForDrs",
+ "drs:GetAgentRuntimeConfigurationForDrs",
+ "drs:UpdateAgentBacklogForDrs",
+ "drs:GetAgentReplicationInfoForDrs",
+ "drs:UpdateReplicationCertificateForDrs",
+ "drs:NotifyReplicationServerAuthenticationForDrs"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "drs:EC2InstanceARN": "${ec2:SourceInstanceARN}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:recovery-instance/*"
+ },
+ {
+ "Action": [
+ "drs:DescribeRecoveryInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NGCMXUFTL",
+ "PolicyName": "AWSElasticDisasterRecoveryRecoveryInstancePolicy",
+ "UpdateDate": "2021-11-17T10:20:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryReplicationServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryReplicationServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T13:34:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:SendClientMetricsForDrs",
+ "drs:SendClientLogsForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:GetChannelCommandsForDrs",
+ "drs:SendChannelCommandResultForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:GetAgentSnapshotCreditsForDrs",
+ "drs:DescribeReplicationServerAssociationsForDrs",
+ "drs:DescribeSnapshotRequestsForDrs",
+ "drs:BatchDeleteSnapshotRequestForDrs",
+ "drs:NotifyAgentAuthenticationForDrs",
+ "drs:BatchCreateVolumeSnapshotGroupForDrs",
+ "drs:UpdateAgentReplicationProcessStateForDrs",
+ "drs:NotifyAgentReplicationProgressForDrs",
+ "drs:NotifyAgentConnectedForDrs",
+ "drs:NotifyAgentDisconnectedForDrs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateSnapshot"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PHOT5QARB",
+ "PolicyName": "AWSElasticDisasterRecoveryReplicationServerPolicy",
+ "UpdateDate": "2021-11-17T13:34:00+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticDisasterRecoveryServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticDisasterRecoveryServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T10:56:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "drs:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "drs:CreateRecoveryInstanceForDrs",
+ "drs:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:drs:*:*:recovery-instance/*"
+ },
+ {
+ "Action": "iam:GetInstanceProfile",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:ListRetirableGrants",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsDefaultKmsKeyId",
+ "ec2:GetEbsEncryptionByDefault"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:RegisterImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeregisterImage"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:ModifyLaunchTemplate",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:GetConsoleOutput",
+ "ec2:GetConsoleScreenshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplate"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSnapshot"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSElasticDisasterRecoveryReplicationServerRole",
+ "arn:aws:iam::*:role/service-role/AWSElasticDisasterRecoveryConversionServerRole",
+ "arn:aws:iam::*:role/service-role/AWSElasticDisasterRecoveryRecoveryInstanceRole"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateLaunchTemplate",
+ "CreateSecurityGroup",
+ "CreateVolume",
+ "CreateSnapshot",
+ "RunInstances"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:launch-template/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSElasticDisasterRecoveryManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:image/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HALZVJBJX",
+ "PolicyName": "AWSElasticDisasterRecoveryServiceRolePolicy",
+ "UpdateDate": "2021-11-17T10:56:17+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElasticLoadBalancingClassicServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticLoadBalancingClassicServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-19T22:36:18+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AttachNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssignIpv6Addresses",
+ "ec2:UnassignIpv6Addresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUMWW3QP7DPZPNVU4",
+ "PolicyName": "AWSElasticLoadBalancingClassicServiceRolePolicy",
+ "UpdateDate": "2019-10-07T23:04:27+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElasticLoadBalancingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSElasticLoadBalancingServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-09-19T22:19:04+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeCoipPools",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:GetCoipPoolUsage",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:AllocateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:AttachNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssignIpv6Addresses",
+ "ec2:ReleaseAddress",
+ "ec2:UnassignIpv6Addresses",
+ "ec2:DescribeVpcPeeringConnections",
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:ListLogDeliveries",
+ "outposts:GetOutpostInstanceTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMHWGGSRHLOQUICJQ",
+ "PolicyName": "AWSElasticLoadBalancingServiceRolePolicy",
+ "UpdateDate": "2021-08-26T19:01:48+00:00",
+ "VersionId": "v7"
+ },
+ "AWSElementalMediaConvertFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaConvertFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-25T19:25:35+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mediaconvert:*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "mediaconvert.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXDREOCL6LV7RBJWC",
+ "PolicyName": "AWSElementalMediaConvertFullAccess",
+ "UpdateDate": "2019-06-10T22:52:25+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElementalMediaConvertReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaConvertReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-25T19:25:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mediaconvert:Get*",
+ "mediaconvert:List*",
+ "mediaconvert:DescribeEndpoints",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJSXYOBSLJN3JEDO42",
+ "PolicyName": "AWSElementalMediaConvertReadOnly",
+ "UpdateDate": "2019-06-10T22:52:18+00:00",
+ "VersionId": "v2"
+ },
+ "AWSElementalMediaLiveFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaLiveFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-07-08T17:07:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": "medialive:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4K5KSJBKUE",
+ "PolicyName": "AWSElementalMediaLiveFullAccess",
+ "UpdateDate": "2020-07-08T17:07:14+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaLiveReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaLiveReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-07-08T16:38:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "medialive:List*",
+ "medialive:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4L7DTGZPRO",
+ "PolicyName": "AWSElementalMediaLiveReadOnly",
+ "UpdateDate": "2020-07-08T16:38:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaPackageFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaPackageFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-29T23:39:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": "mediapackage:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIYI6IYR3JRFAVNQHC",
+ "PolicyName": "AWSElementalMediaPackageFullAccess",
+ "UpdateDate": "2017-12-29T23:39:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaPackageReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaPackageReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-30T00:04:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "mediapackage:List*",
+ "mediapackage:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ42DVTPUHKXNYZQCO",
+ "PolicyName": "AWSElementalMediaPackageReadOnly",
+ "UpdateDate": "2017-12-30T00:04:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaStoreFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaStoreFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-05T23:15:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mediastore:*"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:SecureTransport": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZFYFW2QXSNK7OH6Y",
+ "PolicyName": "AWSElementalMediaStoreFullAccess",
+ "UpdateDate": "2018-03-05T23:15:31+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaStoreReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaStoreReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-08T19:48:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mediastore:Get*",
+ "mediastore:List*",
+ "mediastore:Describe*"
+ ],
+ "Condition": {
+ "Bool": {
+ "aws:SecureTransport": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4EFXRATQYOFTAEFM",
+ "PolicyName": "AWSElementalMediaStoreReadOnly",
+ "UpdateDate": "2018-03-08T19:48:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaTailorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaTailorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-23T00:04:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": "mediatailor:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NNHQVB6BS",
+ "PolicyName": "AWSElementalMediaTailorFullAccess",
+ "UpdateDate": "2021-11-23T00:04:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSElementalMediaTailorReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSElementalMediaTailorReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-23T00:05:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "mediatailor:List*",
+ "mediatailor:Describe*",
+ "mediatailor:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BINASLBHU",
+ "PolicyName": "AWSElementalMediaTailorReadOnly",
+ "UpdateDate": "2021-11-23T00:05:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSEnhancedClassicNetworkingMangementPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSEnhancedClassicNetworkingMangementPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-09-20T17:29:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI7T4V2HZTS72QVO52",
+ "PolicyName": "AWSEnhancedClassicNetworkingMangementPolicy",
+ "UpdateDate": "2017-09-20T17:29:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSFMAdminFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSFMAdminFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-09T18:06:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "fms:*",
+ "waf:*",
+ "waf-regional:*",
+ "elasticloadbalancing:SetWebACL",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLAGM5X6WSNPF4EAQ",
+ "PolicyName": "AWSFMAdminFullAccess",
+ "UpdateDate": "2018-05-09T18:06:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSFMAdminReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSFMAdminReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-09T20:07:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "fms:Get*",
+ "fms:List*",
+ "waf:Get*",
+ "waf:List*",
+ "waf-regional:Get*",
+ "waf-regional:List*",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJA3UKVVBN62QFIKLW",
+ "PolicyName": "AWSFMAdminReadOnlyAccess",
+ "UpdateDate": "2018-05-09T20:07:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSFMMemberReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSFMMemberReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-09T21:05:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "fms:GetAdminAccount",
+ "waf:Get*",
+ "waf:List*",
+ "waf-regional:Get*",
+ "waf-regional:List*",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIB2IVAQ4XXNHHA3DW",
+ "PolicyName": "AWSFMMemberReadOnlyAccess",
+ "UpdateDate": "2018-05-09T21:05:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSForWordPressPluginPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSForWordPressPluginPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-30T00:27:46+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:SynthesizeSpeech",
+ "polly:DescribeVoices",
+ "translate:TranslateText"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Permissions1"
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:GetBucketPolicy",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:CreateBucket",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::audio_for_wordpress*",
+ "arn:aws:s3:::audio-for-wordpress*"
+ ],
+ "Sid": "Permissions2"
+ },
+ {
+ "Action": [
+ "acm:AddTagsToCertificate",
+ "acm:DescribeCertificate",
+ "acm:RequestCertificate",
+ "cloudformation:CreateStack",
+ "cloudfront:ListDistributions"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestedRegion": "us-east-1"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Permissions3"
+ },
+ {
+ "Action": [
+ "acm:DeleteCertificate",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:UpdateStack",
+ "cloudfront:CreateDistribution",
+ "cloudfront:CreateInvalidation",
+ "cloudfront:DeleteDistribution",
+ "cloudfront:GetDistribution",
+ "cloudfront:GetInvalidation",
+ "cloudfront:TagResource",
+ "cloudfront:UpdateDistribution"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/createdBy": "AWSForWordPressPlugin"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Permissions4"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KEKYXDWNJ",
+ "PolicyName": "AWSForWordPressPluginPolicy",
+ "UpdateDate": "2020-01-20T23:20:47+00:00",
+ "VersionId": "v2"
+ },
+ "AWSGlobalAcceleratorSLRPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSGlobalAcceleratorSLRPolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2019-04-05T19:39:13+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeRegions",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteSecurityGroup",
+ "ec2:AssignIpv6Addresses",
+ "ec2:UnassignIpv6Addresses"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/AWSServiceName": "GlobalAccelerator"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:DescribeLoadBalancers",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:network-interface/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EJ5ZEQR2C",
+ "PolicyName": "AWSGlobalAcceleratorSLRPolicy",
+ "UpdateDate": "2021-11-02T18:33:56+00:00",
+ "VersionId": "v6"
+ },
+ "AWSGlueConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:37:39+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSubnetGroups",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "iam:ListGroups",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeImages",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBSubnetGroups",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary",
+ "dynamodb:ListTables",
+ "kms:ListAliases",
+ "kms:DescribeKey",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListDashboards"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*/*",
+ "arn:aws:s3:::*/*aws-glue-*/*",
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:/aws-glue/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/aws-glue*/*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/aws:cloudformation:logical-id": "ZeppelinInstance"
+ },
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/aws-glue-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceNotebookRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSGlueServiceRole*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNZGDEOD7MISOVSVI",
+ "PolicyName": "AWSGlueConsoleFullAccess",
+ "UpdateDate": "2019-02-11T19:49:01+00:00",
+ "VersionId": "v12"
+ },
+ "AWSGlueConsoleSageMakerNotebookFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGlueConsoleSageMakerNotebookFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-05T17:52:35+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSubnetGroups",
+ "iam:ListRoles",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeImages",
+ "ec2:CreateNetworkInterface",
+ "ec2:AttachNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeNetworkInterfaces",
+ "rds:DescribeDBInstances",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetTemplateSummary",
+ "dynamodb:ListTables",
+ "kms:ListAliases",
+ "kms:DescribeKey",
+ "sagemaker:ListNotebookInstances",
+ "cloudformation:ListStacks",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListDashboards"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*/*aws-glue-*/*",
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:/aws-glue/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/aws-glue*/*"
+ },
+ {
+ "Action": [
+ "sagemaker:CreatePresignedNotebookInstanceUrl",
+ "sagemaker:CreateNotebookInstance",
+ "sagemaker:DeleteNotebookInstance",
+ "sagemaker:DescribeNotebookInstance",
+ "sagemaker:StartNotebookInstance",
+ "sagemaker:StopNotebookInstance",
+ "sagemaker:UpdateNotebookInstance",
+ "sagemaker:ListTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sagemaker:*:*:notebook-instance/aws-glue-*"
+ },
+ {
+ "Action": [
+ "sagemaker:DescribeNotebookInstanceLifecycleConfig",
+ "sagemaker:CreateNotebookInstanceLifecycleConfig",
+ "sagemaker:DeleteNotebookInstanceLifecycleConfig",
+ "sagemaker:ListNotebookInstanceLifecycleConfigs"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sagemaker:*:*:notebook-instance-lifecycle-config/aws-glue-*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/aws:cloudformation:logical-id": "ZeppelinInstance"
+ },
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/aws-glue-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Condition": {
+ "ForAllValues:StringLike": {
+ "aws:TagKeys": [
+ "aws-glue-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceNotebookRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSGlueServiceSageMakerNotebookRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AWSGlueServiceRole*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJELFOHJC42QS3ZSYY",
+ "PolicyName": "AWSGlueConsoleSageMakerNotebookFullAccess",
+ "UpdateDate": "2021-07-15T15:24:19+00:00",
+ "VersionId": "v3"
+ },
+ "AWSGlueDataBrewServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueDataBrewServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-04T21:26:50+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:GetDatabases",
+ "glue:GetPartitions",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::databrew-public-datasets-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:CreateNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "ec2:DeleteNetworkInterface",
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws-glue-service-resource": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-service-resource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws-glue-databrew/*"
+ ]
+ },
+ {
+ "Action": [
+ "lakeformation:GetDataAccess"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:databrew!default-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HSXDEANHC",
+ "PolicyName": "AWSGlueDataBrewServiceRole",
+ "UpdateDate": "2021-11-18T19:44:16+00:00",
+ "VersionId": "v2"
+ },
+ "AWSGlueSchemaRegistryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGlueSchemaRegistryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-20T00:19:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:CreateRegistry",
+ "glue:UpdateRegistry",
+ "glue:DeleteRegistry",
+ "glue:GetRegistry",
+ "glue:ListRegistries",
+ "glue:CreateSchema",
+ "glue:UpdateSchema",
+ "glue:DeleteSchema",
+ "glue:GetSchema",
+ "glue:ListSchemas",
+ "glue:RegisterSchemaVersion",
+ "glue:DeleteSchemaVersions",
+ "glue:GetSchemaByDefinition",
+ "glue:GetSchemaVersion",
+ "glue:GetSchemaVersionsDiff",
+ "glue:ListSchemaVersions",
+ "glue:CheckSchemaVersionValidity",
+ "glue:PutSchemaVersionMetadata",
+ "glue:RemoveSchemaVersionMetadata",
+ "glue:QuerySchemaVersionMetadata"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AWSGlueSchemaRegistryFullAccess"
+ },
+ {
+ "Action": [
+ "glue:GetTags",
+ "glue:TagResource",
+ "glue:UnTagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:schema/*",
+ "arn:aws:glue:*:*:registry/*"
+ ],
+ "Sid": "AWSGlueSchemaRegistryTagsFullAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H2OHGXA4A",
+ "PolicyName": "AWSGlueSchemaRegistryFullAccess",
+ "UpdateDate": "2020-11-20T00:19:00+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGlueSchemaRegistryReadonlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGlueSchemaRegistryReadonlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-20T00:20:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:GetRegistry",
+ "glue:ListRegistries",
+ "glue:GetSchema",
+ "glue:ListSchemas",
+ "glue:GetSchemaByDefinition",
+ "glue:GetSchemaVersion",
+ "glue:ListSchemaVersions",
+ "glue:GetSchemaVersionsDiff",
+ "glue:CheckSchemaVersionValidity",
+ "glue:QuerySchemaVersionMetadata",
+ "glue:GetTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AWSGlueSchemaRegistryReadonlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4B2SFYL4LZ",
+ "PolicyName": "AWSGlueSchemaRegistryReadonlyAccess",
+ "UpdateDate": "2020-11-20T00:20:06+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGlueServiceNotebookRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:37:42+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:CreatePartition",
+ "glue:CreateTable",
+ "glue:DeleteDatabase",
+ "glue:DeletePartition",
+ "glue:DeleteTable",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:GetTable",
+ "glue:GetTableVersions",
+ "glue:GetTables",
+ "glue:UpdateDatabase",
+ "glue:UpdatePartition",
+ "glue:UpdateTable",
+ "glue:CreateConnection",
+ "glue:CreateJob",
+ "glue:DeleteConnection",
+ "glue:DeleteJob",
+ "glue:GetConnection",
+ "glue:GetConnections",
+ "glue:GetDevEndpoint",
+ "glue:GetDevEndpoints",
+ "glue:GetJob",
+ "glue:GetJobs",
+ "glue:UpdateJob",
+ "glue:BatchDeleteConnection",
+ "glue:UpdateConnection",
+ "glue:GetUserDefinedFunction",
+ "glue:UpdateUserDefinedFunction",
+ "glue:GetUserDefinedFunctions",
+ "glue:DeleteUserDefinedFunction",
+ "glue:CreateUserDefinedFunction",
+ "glue:BatchGetPartition",
+ "glue:BatchDeletePartition",
+ "glue:BatchCreatePartition",
+ "glue:BatchDeleteTable",
+ "glue:UpdateDevEndpoint",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::crawler-public*",
+ "arn:aws:s3:::aws-glue*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-service-resource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMRC6VZUHJYCTKWFI",
+ "PolicyName": "AWSGlueServiceNotebookRole",
+ "UpdateDate": "2019-10-07T18:05:54+00:00",
+ "VersionId": "v3"
+ },
+ "AWSGlueServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:37:21+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:*",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRouteTables",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "cloudwatch:PutMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*/*",
+ "arn:aws:s3:::*/*aws-glue-*/*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::crawler-public*",
+ "arn:aws:s3:::aws-glue-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:/aws-glue/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws-glue-service-resource"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIRUJCPEBPMEZFAS32",
+ "PolicyName": "AWSGlueServiceRole",
+ "UpdateDate": "2018-06-25T18:23:09+00:00",
+ "VersionId": "v4"
+ },
+ "AWSGrafanaAccountAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGrafanaAccountAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-23T00:20:38+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSGrafanaOrganizationAdmin"
+ },
+ {
+ "Action": "iam:GetRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*",
+ "Sid": "GrafanaIAMGetRolePermission"
+ },
+ {
+ "Action": [
+ "grafana:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSGrafanaPermissions"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "grafana.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*",
+ "Sid": "GrafanaIAMPassRolePermission"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KHVCM25DH",
+ "PolicyName": "AWSGrafanaAccountAdministrator",
+ "UpdateDate": "2022-02-15T22:36:18+00:00",
+ "VersionId": "v3"
+ },
+ "AWSGrafanaConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGrafanaConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-23T00:10:40+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "grafana:Describe*",
+ "grafana:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSGrafanaConsoleReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OHSWBMKNF",
+ "PolicyName": "AWSGrafanaConsoleReadOnlyAccess",
+ "UpdateDate": "2022-02-15T22:30:54+00:00",
+ "VersionId": "v3"
+ },
+ "AWSGrafanaWorkspacePermissionManagement": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGrafanaWorkspacePermissionManagement",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-23T00:15:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "grafana:DescribeWorkspace",
+ "grafana:DescribeWorkspaceAuthentication",
+ "grafana:UpdatePermissions",
+ "grafana:ListPermissions",
+ "grafana:ListWorkspaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:grafana:*:*:/workspaces*",
+ "Sid": "AWSGrafanaPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G37QQNGZW",
+ "PolicyName": "AWSGrafanaWorkspacePermissionManagement",
+ "UpdateDate": "2021-09-21T20:30:06+00:00",
+ "VersionId": "v2"
+ },
+ "AWSGreengrassFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGreengrassFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-03T00:47:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "greengrass:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWPV6OBK4QONH4J3O",
+ "PolicyName": "AWSGreengrassFullAccess",
+ "UpdateDate": "2017-05-03T00:47:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGreengrassReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSGreengrassReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-30T16:01:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "greengrass:List*",
+ "greengrass:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLSKLXFVTQTZ5GY3I",
+ "PolicyName": "AWSGreengrassReadOnlyAccess",
+ "UpdateDate": "2018-10-30T16:01:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSGreengrassResourceAccessRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-14T21:17:24+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DeleteThingShadow",
+ "iot:GetThingShadow",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/GG_*",
+ "arn:aws:iot:*:*:thing/*-gcm",
+ "arn:aws:iot:*:*:thing/*-gda",
+ "arn:aws:iot:*:*:thing/*-gci"
+ ],
+ "Sid": "AllowGreengrassAccessToShadows"
+ },
+ {
+ "Action": [
+ "iot:DescribeThing"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:thing/*",
+ "Sid": "AllowGreengrassToDescribeThings"
+ },
+ {
+ "Action": [
+ "iot:DescribeCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:cert/*",
+ "Sid": "AllowGreengrassToDescribeCertificates"
+ },
+ {
+ "Action": [
+ "greengrass:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowGreengrassToCallGreengrassServices"
+ },
+ {
+ "Action": [
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowGreengrassToGetLambdaFunctions"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:greengrass-*",
+ "Sid": "AllowGreengrassToGetGreengrassSecrets"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*Greengrass*",
+ "arn:aws:s3:::*GreenGrass*",
+ "arn:aws:s3:::*greengrass*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*sagemaker*"
+ ],
+ "Sid": "AllowGreengrassAccessToS3Objects"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowGreengrassAccessToS3BucketLocation"
+ },
+ {
+ "Action": [
+ "sagemaker:DescribeTrainingJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:training-job/*"
+ ],
+ "Sid": "AllowGreengrassAccessToSageMakerTrainingJobs"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPKEIMB6YMXDEVRTM",
+ "PolicyName": "AWSGreengrassResourceAccessRolePolicy",
+ "UpdateDate": "2018-11-14T00:35:02+00:00",
+ "VersionId": "v5"
+ },
+ "AWSHealthFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSHealthFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T12:30:31+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:EnableAWSServiceAccess",
+ "organizations:DisableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": "health.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "health:*",
+ "organizations:ListAccounts",
+ "organizations:ListParents",
+ "organizations:DescribeAccount",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "health.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3CUMPCPEUPCSXC4Y",
+ "PolicyName": "AWSHealthFullAccess",
+ "UpdateDate": "2020-11-16T18:11:34+00:00",
+ "VersionId": "v3"
+ },
+ "AWSIPAMServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSIPAMServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-30T19:08:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeByoipCidrs",
+ "ec2:DescribeIpv6Pools",
+ "ec2:DescribePublicIpv4Pools",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/IPAM"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JEQHJ6QN6",
+ "PolicyName": "AWSIPAMServiceRolePolicy",
+ "UpdateDate": "2021-11-30T19:08:11+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIQContractServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSIQContractServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-22T19:28:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:Subscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4E26ATDUIP",
+ "PolicyName": "AWSIQContractServiceRolePolicy",
+ "UpdateDate": "2019-08-22T19:28:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIQFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIQFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-04T23:13:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iq:*",
+ "iq-permission:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "permission.iq.amazonaws.com",
+ "contract.iq.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P4TAHETXT",
+ "PolicyName": "AWSIQFullAccess",
+ "UpdateDate": "2019-09-25T20:22:34+00:00",
+ "VersionId": "v2"
+ },
+ "AWSIQPermissionServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSIQPermissionServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-22T19:36:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteRole",
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSIQPermission-*"
+ },
+ {
+ "Action": [
+ "iam:AttachRolePolicy"
+ ],
+ "Condition": {
+ "ArnEquals": {
+ "iam:PolicyARN": "arn:aws:iam::aws:policy/AWSDenyAll"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSIQPermission-*"
+ },
+ {
+ "Action": [
+ "iam:DetachRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSIQPermission-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4J77DMGFZ5",
+ "PolicyName": "AWSIQPermissionServiceRolePolicy",
+ "UpdateDate": "2019-08-22T19:36:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSImageBuilderFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImageBuilderFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-20T18:25:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "imagebuilder:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:*imagebuilder*"
+ },
+ {
+ "Action": [
+ "license-manager:ListLicenseConfigurations",
+ "license-manager:ListLicenseSpecificationsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/imagebuilder.amazonaws.com/AWSServiceRoleForImageBuilder"
+ },
+ {
+ "Action": [
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:instance-profile/*imagebuilder*"
+ },
+ {
+ "Action": [
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:instance-profile/*imagebuilder*",
+ "arn:aws:iam::*:role/*imagebuilder*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3::*:*imagebuilder*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "imagebuilder.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/imagebuilder.amazonaws.com/AWSServiceRoleForImageBuilder"
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRegions",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeLaunchTemplates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EO4HCSNZH",
+ "PolicyName": "AWSImageBuilderFullAccess",
+ "UpdateDate": "2021-04-13T17:33:42+00:00",
+ "VersionId": "v2"
+ },
+ "AWSImageBuilderReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImageBuilderReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-19T22:29:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "imagebuilder:Get*",
+ "imagebuilder:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/imagebuilder.amazonaws.com/AWSServiceRoleForImageBuilder"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OD5TC5BXP",
+ "PolicyName": "AWSImageBuilderReadOnlyAccess",
+ "UpdateDate": "2019-12-19T22:29:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSImportExportFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImportExportFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "importexport:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJCQCT4JGTLC6722MQ",
+ "PolicyName": "AWSImportExportFullAccess",
+ "UpdateDate": "2015-02-06T18:40:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSImportExportReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSImportExportReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "importexport:ListJobs",
+ "importexport:GetStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNTV4OG52ESYZHCNK",
+ "PolicyName": "AWSImportExportReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:42+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIncidentManagerResolverAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIncidentManagerResolverAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-10T06:12:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm-incidents:StartIncident"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "StartIncidentPermissions"
+ },
+ {
+ "Action": [
+ "ssm-incidents:ListResponsePlans",
+ "ssm-incidents:GetResponsePlan"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResponsePlanReadOnlyPermissions"
+ },
+ {
+ "Action": [
+ "ssm-incidents:ListIncidentRecords",
+ "ssm-incidents:GetIncidentRecord",
+ "ssm-incidents:UpdateIncidentRecord",
+ "ssm-incidents:ListTimelineEvents",
+ "ssm-incidents:CreateTimelineEvent",
+ "ssm-incidents:GetTimelineEvent",
+ "ssm-incidents:UpdateTimelineEvent",
+ "ssm-incidents:DeleteTimelineEvent",
+ "ssm-incidents:ListRelatedItems",
+ "ssm-incidents:UpdateRelatedItems"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IncidentRecordResolverPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EQ4SDPENY",
+ "PolicyName": "AWSIncidentManagerResolverAccess",
+ "UpdateDate": "2021-05-10T06:12:34+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIncidentManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSIncidentManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-10T03:34:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm-incidents:ListIncidentRecords",
+ "ssm-incidents:CreateTimelineEvent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "UpdateIncidentRecordPermissions"
+ },
+ {
+ "Action": [
+ "ssm:CreateOpsItem",
+ "ssm:AssociateOpsItemRelatedItem"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RelatedOpsItemPermissions"
+ },
+ {
+ "Action": "ssm-contacts:StartEngagement",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IncidentEngagementPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4INCMTEIEV",
+ "PolicyName": "AWSIncidentManagerServiceRolePolicy",
+ "UpdateDate": "2021-05-10T03:34:45+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoT1ClickFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoT1ClickFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-11T22:10:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot1click:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPQNJPDUDESCCAMIA",
+ "PolicyName": "AWSIoT1ClickFullAccess",
+ "UpdateDate": "2018-05-11T22:10:14+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoT1ClickReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoT1ClickReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-11T21:49:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot1click:Describe*",
+ "iot1click:Get*",
+ "iot1click:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI35VTLD3EBNY2JGXS",
+ "PolicyName": "AWSIoT1ClickReadOnlyAccess",
+ "UpdateDate": "2018-05-11T21:49:24+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTAnalyticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTAnalyticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-18T23:02:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotanalytics:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7FB5ZEKQN445QGKY",
+ "PolicyName": "AWSIoTAnalyticsFullAccess",
+ "UpdateDate": "2018-06-18T23:02:45+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTAnalyticsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTAnalyticsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-18T21:37:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotanalytics:Describe*",
+ "iotanalytics:List*",
+ "iotanalytics:Get*",
+ "iotanalytics:SampleChannelData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ3Z4LYBELMXGFLGMI",
+ "PolicyName": "AWSIoTAnalyticsReadOnlyAccess",
+ "UpdateDate": "2018-06-18T21:37:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTConfigAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTConfigAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-27T21:52:07+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:AcceptCertificateTransfer",
+ "iot:AddThingToThingGroup",
+ "iot:AssociateTargetsWithJob",
+ "iot:AttachPolicy",
+ "iot:AttachPrincipalPolicy",
+ "iot:AttachThingPrincipal",
+ "iot:CancelCertificateTransfer",
+ "iot:CancelJob",
+ "iot:CancelJobExecution",
+ "iot:ClearDefaultAuthorizer",
+ "iot:CreateAuthorizer",
+ "iot:CreateCertificateFromCsr",
+ "iot:CreateJob",
+ "iot:CreateKeysAndCertificate",
+ "iot:CreateOTAUpdate",
+ "iot:CreatePolicy",
+ "iot:CreatePolicyVersion",
+ "iot:CreateRoleAlias",
+ "iot:CreateStream",
+ "iot:CreateThing",
+ "iot:CreateThingGroup",
+ "iot:CreateThingType",
+ "iot:CreateTopicRule",
+ "iot:DeleteAuthorizer",
+ "iot:DeleteCACertificate",
+ "iot:DeleteCertificate",
+ "iot:DeleteJob",
+ "iot:DeleteJobExecution",
+ "iot:DeleteOTAUpdate",
+ "iot:DeletePolicy",
+ "iot:DeletePolicyVersion",
+ "iot:DeleteRegistrationCode",
+ "iot:DeleteRoleAlias",
+ "iot:DeleteStream",
+ "iot:DeleteThing",
+ "iot:DeleteThingGroup",
+ "iot:DeleteThingType",
+ "iot:DeleteTopicRule",
+ "iot:DeleteV2LoggingLevel",
+ "iot:DeprecateThingType",
+ "iot:DescribeAuthorizer",
+ "iot:DescribeCACertificate",
+ "iot:DescribeCertificate",
+ "iot:DescribeDefaultAuthorizer",
+ "iot:DescribeEndpoint",
+ "iot:DescribeEventConfigurations",
+ "iot:DescribeIndex",
+ "iot:DescribeJob",
+ "iot:DescribeJobExecution",
+ "iot:DescribeRoleAlias",
+ "iot:DescribeStream",
+ "iot:DescribeThing",
+ "iot:DescribeThingGroup",
+ "iot:DescribeThingRegistrationTask",
+ "iot:DescribeThingType",
+ "iot:DetachPolicy",
+ "iot:DetachPrincipalPolicy",
+ "iot:DetachThingPrincipal",
+ "iot:DisableTopicRule",
+ "iot:EnableTopicRule",
+ "iot:GetEffectivePolicies",
+ "iot:GetIndexingConfiguration",
+ "iot:GetJobDocument",
+ "iot:GetLoggingOptions",
+ "iot:GetOTAUpdate",
+ "iot:GetPolicy",
+ "iot:GetPolicyVersion",
+ "iot:GetRegistrationCode",
+ "iot:GetTopicRule",
+ "iot:GetV2LoggingOptions",
+ "iot:ListAttachedPolicies",
+ "iot:ListAuthorizers",
+ "iot:ListCACertificates",
+ "iot:ListCertificates",
+ "iot:ListCertificatesByCA",
+ "iot:ListIndices",
+ "iot:ListJobExecutionsForJob",
+ "iot:ListJobExecutionsForThing",
+ "iot:ListJobs",
+ "iot:ListOTAUpdates",
+ "iot:ListOutgoingCertificates",
+ "iot:ListPolicies",
+ "iot:ListPolicyPrincipals",
+ "iot:ListPolicyVersions",
+ "iot:ListPrincipalPolicies",
+ "iot:ListPrincipalThings",
+ "iot:ListRoleAliases",
+ "iot:ListStreams",
+ "iot:ListTargetsForPolicy",
+ "iot:ListThingGroups",
+ "iot:ListThingGroupsForThing",
+ "iot:ListThingPrincipals",
+ "iot:ListThingRegistrationTaskReports",
+ "iot:ListThingRegistrationTasks",
+ "iot:ListThings",
+ "iot:ListThingsInThingGroup",
+ "iot:ListThingTypes",
+ "iot:ListTopicRules",
+ "iot:ListV2LoggingLevels",
+ "iot:RegisterCACertificate",
+ "iot:RegisterCertificate",
+ "iot:RegisterThing",
+ "iot:RejectCertificateTransfer",
+ "iot:RemoveThingFromThingGroup",
+ "iot:ReplaceTopicRule",
+ "iot:SearchIndex",
+ "iot:SetDefaultAuthorizer",
+ "iot:SetDefaultPolicyVersion",
+ "iot:SetLoggingOptions",
+ "iot:SetV2LoggingLevel",
+ "iot:SetV2LoggingOptions",
+ "iot:StartThingRegistrationTask",
+ "iot:StopThingRegistrationTask",
+ "iot:TestAuthorization",
+ "iot:TestInvokeAuthorizer",
+ "iot:TransferCertificate",
+ "iot:UpdateAuthorizer",
+ "iot:UpdateCACertificate",
+ "iot:UpdateCertificate",
+ "iot:UpdateEventConfigurations",
+ "iot:UpdateIndexingConfiguration",
+ "iot:UpdateRoleAlias",
+ "iot:UpdateStream",
+ "iot:UpdateThing",
+ "iot:UpdateThingGroup",
+ "iot:UpdateThingGroupsForThing",
+ "iot:UpdateAccountAuditConfiguration",
+ "iot:DescribeAccountAuditConfiguration",
+ "iot:DeleteAccountAuditConfiguration",
+ "iot:StartOnDemandAuditTask",
+ "iot:CancelAuditTask",
+ "iot:DescribeAuditTask",
+ "iot:ListAuditTasks",
+ "iot:CreateScheduledAudit",
+ "iot:UpdateScheduledAudit",
+ "iot:DeleteScheduledAudit",
+ "iot:DescribeScheduledAudit",
+ "iot:ListScheduledAudits",
+ "iot:ListAuditFindings",
+ "iot:CreateSecurityProfile",
+ "iot:DescribeSecurityProfile",
+ "iot:UpdateSecurityProfile",
+ "iot:DeleteSecurityProfile",
+ "iot:AttachSecurityProfile",
+ "iot:DetachSecurityProfile",
+ "iot:ListSecurityProfiles",
+ "iot:ListSecurityProfilesForTarget",
+ "iot:ListTargetsForSecurityProfile",
+ "iot:ListActiveViolations",
+ "iot:ListViolationEvents",
+ "iot:ValidateSecurityProfileBehaviors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWWGD4LM4EMXNRL7I",
+ "PolicyName": "AWSIoTConfigAccess",
+ "UpdateDate": "2019-09-27T20:48:00+00:00",
+ "VersionId": "v9"
+ },
+ "AWSIoTConfigReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTConfigReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-27T21:52:31+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DescribeAuthorizer",
+ "iot:DescribeCACertificate",
+ "iot:DescribeCertificate",
+ "iot:DescribeDefaultAuthorizer",
+ "iot:DescribeEndpoint",
+ "iot:DescribeEventConfigurations",
+ "iot:DescribeIndex",
+ "iot:DescribeJob",
+ "iot:DescribeJobExecution",
+ "iot:DescribeRoleAlias",
+ "iot:DescribeStream",
+ "iot:DescribeThing",
+ "iot:DescribeThingGroup",
+ "iot:DescribeThingRegistrationTask",
+ "iot:DescribeThingType",
+ "iot:GetEffectivePolicies",
+ "iot:GetIndexingConfiguration",
+ "iot:GetJobDocument",
+ "iot:GetLoggingOptions",
+ "iot:GetOTAUpdate",
+ "iot:GetPolicy",
+ "iot:GetPolicyVersion",
+ "iot:GetRegistrationCode",
+ "iot:GetTopicRule",
+ "iot:GetV2LoggingOptions",
+ "iot:ListAttachedPolicies",
+ "iot:ListAuthorizers",
+ "iot:ListCACertificates",
+ "iot:ListCertificates",
+ "iot:ListCertificatesByCA",
+ "iot:ListIndices",
+ "iot:ListJobExecutionsForJob",
+ "iot:ListJobExecutionsForThing",
+ "iot:ListJobs",
+ "iot:ListOTAUpdates",
+ "iot:ListOutgoingCertificates",
+ "iot:ListPolicies",
+ "iot:ListPolicyPrincipals",
+ "iot:ListPolicyVersions",
+ "iot:ListPrincipalPolicies",
+ "iot:ListPrincipalThings",
+ "iot:ListRoleAliases",
+ "iot:ListStreams",
+ "iot:ListTargetsForPolicy",
+ "iot:ListThingGroups",
+ "iot:ListThingGroupsForThing",
+ "iot:ListThingPrincipals",
+ "iot:ListThingRegistrationTaskReports",
+ "iot:ListThingRegistrationTasks",
+ "iot:ListThings",
+ "iot:ListThingsInThingGroup",
+ "iot:ListThingTypes",
+ "iot:ListTopicRules",
+ "iot:ListV2LoggingLevels",
+ "iot:SearchIndex",
+ "iot:TestAuthorization",
+ "iot:TestInvokeAuthorizer",
+ "iot:DescribeAccountAuditConfiguration",
+ "iot:DescribeAuditTask",
+ "iot:ListAuditTasks",
+ "iot:DescribeScheduledAudit",
+ "iot:ListScheduledAudits",
+ "iot:ListAuditFindings",
+ "iot:DescribeSecurityProfile",
+ "iot:ListSecurityProfiles",
+ "iot:ListSecurityProfilesForTarget",
+ "iot:ListTargetsForSecurityProfile",
+ "iot:ListActiveViolations",
+ "iot:ListViolationEvents",
+ "iot:ValidateSecurityProfileBehaviors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHENEMXGX4XMFOIOI",
+ "PolicyName": "AWSIoTConfigReadOnlyAccess",
+ "UpdateDate": "2019-09-27T20:52:40+00:00",
+ "VersionId": "v8"
+ },
+ "AWSIoTDataAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTDataAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-27T21:51:18+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:Connect",
+ "iot:Publish",
+ "iot:Subscribe",
+ "iot:Receive",
+ "iot:GetThingShadow",
+ "iot:UpdateThingShadow",
+ "iot:DeleteThingShadow",
+ "iot:ListNamedShadowsForThing"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJM2KI2UJDR24XPS2K",
+ "PolicyName": "AWSIoTDataAccess",
+ "UpdateDate": "2021-06-23T21:34:47+00:00",
+ "VersionId": "v3"
+ },
+ "AWSIoTDeviceDefenderAddThingsToThingGroupMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderAddThingsToThingGroupMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:55:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:ListPrincipalThings",
+ "iot:AddThingToThingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HEHG3RV6B",
+ "PolicyName": "AWSIoTDeviceDefenderAddThingsToThingGroupMitigationAction",
+ "UpdateDate": "2019-08-07T17:55:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceDefenderAudit": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderAudit",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-07-18T21:17:40+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:GetLoggingOptions",
+ "iot:GetV2LoggingOptions",
+ "iot:ListCACertificates",
+ "iot:ListCertificates",
+ "iot:DescribeCACertificate",
+ "iot:DescribeCertificate",
+ "iot:ListPolicies",
+ "iot:GetPolicy",
+ "iot:GetEffectivePolicies",
+ "iot:ListRoleAliases",
+ "iot:DescribeRoleAlias",
+ "cognito-identity:GetIdentityPoolRoles",
+ "iam:ListRolePolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:GetRole",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRolePolicy",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:GetServiceLastAccessedDetails"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKUN6OAGIHZ66TRKO",
+ "PolicyName": "AWSIoTDeviceDefenderAudit",
+ "UpdateDate": "2019-11-25T23:52:43+00:00",
+ "VersionId": "v3"
+ },
+ "AWSIoTDeviceDefenderEnableIoTLoggingMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderEnableIoTLoggingMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:04:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:SetV2LoggingOptions"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "iot.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G34KP2NLZ",
+ "PolicyName": "AWSIoTDeviceDefenderEnableIoTLoggingMitigationAction",
+ "UpdateDate": "2019-08-07T17:04:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceDefenderPublishFindingsToSNSMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderPublishFindingsToSNSMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:04:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GZL2FL6JV",
+ "PolicyName": "AWSIoTDeviceDefenderPublishFindingsToSNSMitigationAction",
+ "UpdateDate": "2019-08-07T17:04:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceDefenderReplaceDefaultPolicyMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderReplaceDefaultPolicyMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:04:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:CreatePolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HN4VCIBCR",
+ "PolicyName": "AWSIoTDeviceDefenderReplaceDefaultPolicyMitigationAction",
+ "UpdateDate": "2019-08-07T17:04:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceDefenderUpdateCACertMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderUpdateCACertMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:05:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:UpdateCACertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KLBGET6KX",
+ "PolicyName": "AWSIoTDeviceDefenderUpdateCACertMitigationAction",
+ "UpdateDate": "2019-08-07T17:05:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceDefenderUpdateDeviceCertMitigationAction": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderUpdateDeviceCertMitigationAction",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-07T17:06:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:UpdateCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KB4AHFGEB",
+ "PolicyName": "AWSIoTDeviceDefenderUpdateDeviceCertMitigationAction",
+ "UpdateDate": "2019-08-07T17:06:00+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTDeviceTesterForFreeRTOSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTDeviceTesterForFreeRTOSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-02-12T20:33:53+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "iot.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/idt-*",
+ "Sid": "VisualEditor0"
+ },
+ {
+ "Action": [
+ "iot:DeleteThing",
+ "iot:AttachThingPrincipal",
+ "iot:DeleteCertificate",
+ "iot:GetRegistrationCode",
+ "iot:CreatePolicy",
+ "iot:UpdateCACertificate",
+ "s3:ListBucket",
+ "iot:DescribeEndpoint",
+ "iot:CreateOTAUpdate",
+ "iot:CreateStream",
+ "signer:ListSigningJobs",
+ "acm:ListCertificates",
+ "iot:CreateKeysAndCertificate",
+ "iot:UpdateCertificate",
+ "iot:CreateCertificateFromCsr",
+ "iot:DetachThingPrincipal",
+ "iot:RegisterCACertificate",
+ "iot:CreateThing",
+ "freertos:ListHardwarePlatforms",
+ "iam:ListRoles",
+ "iot:RegisterCertificate",
+ "iot:DeleteCACertificate",
+ "signer:PutSigningProfile",
+ "s3:ListAllMyBuckets",
+ "signer:ListSigningPlatforms",
+ "iot-device-tester:SendMetrics",
+ "iot-device-tester:SupportedVersion",
+ "iot-device-tester:LatestIdt",
+ "iot-device-tester:CheckVersion",
+ "iot-device-tester:DownloadTestSuite"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "VisualEditor1"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "signer:StartSigningJob",
+ "acm:GetCertificate",
+ "signer:DescribeSigningJob",
+ "s3:CreateBucket",
+ "execute-api:Invoke",
+ "s3:DeleteBucket",
+ "s3:PutBucketVersioning",
+ "signer:CancelSigningProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:execute-api:us-east-1:098862408343:9xpmnvs5h4/prod/POST/metrics",
+ "arn:aws:signer:*:*:/signing-profiles/*",
+ "arn:aws:signer:*:*:/signing-jobs/*",
+ "arn:aws:iam::*:role/idt-*",
+ "arn:aws:acm:*:*:certificate/*",
+ "arn:aws:s3:::idt-*",
+ "arn:aws:s3:::afr-ota*"
+ ],
+ "Sid": "VisualEditor2"
+ },
+ {
+ "Action": [
+ "iot:DeleteStream",
+ "iot:DeleteCertificate",
+ "iot:AttachPolicy",
+ "iot:DetachPolicy",
+ "iot:DeletePolicy",
+ "s3:ListBucketVersions",
+ "iot:UpdateCertificate",
+ "iot:GetOTAUpdate",
+ "iot:DeleteOTAUpdate",
+ "iot:DescribeJobExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::afr-ota*",
+ "arn:aws:iot:*:*:thinggroup/idt*",
+ "arn:aws:iam::*:role/idt-*"
+ ],
+ "Sid": "VisualEditor3"
+ },
+ {
+ "Action": [
+ "iot:DeleteCertificate",
+ "iot:AttachPolicy",
+ "iot:DetachPolicy",
+ "s3:DeleteObjectVersion",
+ "iot:DeleteOTAUpdate",
+ "s3:PutObject",
+ "s3:GetObject",
+ "iot:DeleteStream",
+ "iot:DeletePolicy",
+ "s3:DeleteObject",
+ "iot:UpdateCertificate",
+ "iot:GetOTAUpdate",
+ "s3:GetObjectVersion",
+ "iot:DescribeJobExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::afr-ota*/*",
+ "arn:aws:s3:::idt-*/*",
+ "arn:aws:iot:*:*:policy/idt*",
+ "arn:aws:iam::*:role/idt-*",
+ "arn:aws:iot:*:*:otaupdate/idt*",
+ "arn:aws:iot:*:*:thing/idt*",
+ "arn:aws:iot:*:*:cert/*",
+ "arn:aws:iot:*:*:job/*",
+ "arn:aws:iot:*:*:stream/*"
+ ],
+ "Sid": "VisualEditor4"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::afr-ota*/*",
+ "arn:aws:s3:::idt-*/*"
+ ],
+ "Sid": "VisualEditor5"
+ },
+ {
+ "Action": [
+ "iot:CancelJobExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:job/*",
+ "arn:aws:iot:*:*:thing/idt*"
+ ],
+ "Sid": "VisualEditor6"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/Owner": "IoTDeviceTester"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ],
+ "Sid": "VisualEditor7"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:DeleteSecurityGroup"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/Owner": "IoTDeviceTester"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "VisualEditor8"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/Owner": "IoTDeviceTester"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ],
+ "Sid": "VisualEditor9"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:placement-group/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:subnet/*"
+ ],
+ "Sid": "VisualEditor10"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/Owner": "IoTDeviceTester"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "VisualEditor11"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups",
+ "ssm:DescribeParameters",
+ "ssm:GetParameters"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "VisualEditor12"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:TagKeys": [
+ "Owner"
+ ],
+ "ec2:CreateAction": [
+ "RunInstances",
+ "CreateSecurityGroup"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ],
+ "Sid": "VisualEditor13"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ADNJ2YUUH",
+ "PolicyName": "AWSIoTDeviceTesterForFreeRTOSFullAccess",
+ "UpdateDate": "2020-12-15T18:03:46+00:00",
+ "VersionId": "v5"
+ },
+ "AWSIoTDeviceTesterForGreengrassFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTDeviceTesterForGreengrassFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-02-20T21:21:27+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "iot.amazonaws.com",
+ "lambda.amazonaws.com",
+ "greengrass.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/idt-*",
+ "Sid": "VisualEditor1"
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "iot:DeleteCertificate",
+ "lambda:DeleteFunction",
+ "execute-api:Invoke",
+ "iot:UpdateCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:execute-api:us-east-1:098862408343:9xpmnvs5h4/prod/POST/metrics",
+ "arn:aws:lambda:*:*:function:idt-*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "VisualEditor2"
+ },
+ {
+ "Action": [
+ "iot:CreateThing",
+ "iot:DeleteThing"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/idt-*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "VisualEditor3"
+ },
+ {
+ "Action": [
+ "iot:AttachPolicy",
+ "iot:DetachPolicy",
+ "iot:DeletePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:policy/idt-*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "VisualEditor4"
+ },
+ {
+ "Action": [
+ "iot:CreateJob",
+ "iot:DescribeJob",
+ "iot:DescribeJobExecution",
+ "iot:DeleteJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/idt-*",
+ "arn:aws:iot:*:*:job/*"
+ ],
+ "Sid": "VisualEditor5"
+ },
+ {
+ "Action": [
+ "iot:DescribeEndpoint",
+ "greengrass:*",
+ "iam:ListAttachedRolePolicies",
+ "iot:CreatePolicy",
+ "iot:GetThingShadow",
+ "iot:CreateKeysAndCertificate",
+ "iot:ListThings",
+ "iot:UpdateThingShadow",
+ "iot:CreateCertificateFromCsr",
+ "iot-device-tester:SendMetrics",
+ "iot-device-tester:SupportedVersion",
+ "iot-device-tester:LatestIdt",
+ "iot-device-tester:CheckVersion",
+ "iot-device-tester:DownloadTestSuite"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "VisualEditor6"
+ },
+ {
+ "Action": [
+ "iot:DetachThingPrincipal",
+ "iot:AttachThingPrincipal"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/idt-*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "VisualEditor7"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:DeleteObjectVersion",
+ "s3:ListBucketVersions",
+ "s3:CreateBucket",
+ "s3:DeleteObject",
+ "s3:DeleteBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::idt*",
+ "Sid": "VisualEditor8"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ORKVZSPY7",
+ "PolicyName": "AWSIoTDeviceTesterForGreengrassFullAccess",
+ "UpdateDate": "2020-06-25T17:01:56+00:00",
+ "VersionId": "v4"
+ },
+ "AWSIoTEventsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTEventsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-10T22:51:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotevents:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGA726P7LVUWJZ2LM",
+ "PolicyName": "AWSIoTEventsFullAccess",
+ "UpdateDate": "2019-01-10T22:51:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTEventsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTEventsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-10T22:50:08+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotevents:Describe*",
+ "iotevents:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYJFNAR7CN5JW52PG",
+ "PolicyName": "AWSIoTEventsReadOnlyAccess",
+ "UpdateDate": "2019-09-23T17:22:04+00:00",
+ "VersionId": "v2"
+ },
+ "AWSIoTFleetHubFederationAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTFleetHubFederationAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T08:08:05+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DescribeIndex",
+ "iot:DescribeThingGroup",
+ "iot:GetBucketsAggregation",
+ "iot:GetCardinality",
+ "iot:GetIndexingConfiguration",
+ "iot:GetPercentiles",
+ "iot:GetStatistics",
+ "iot:SearchIndex",
+ "iot:CreateFleetMetric",
+ "iot:ListFleetMetrics",
+ "iot:DeleteFleetMetric",
+ "iot:DescribeFleetMetric",
+ "iot:UpdateFleetMetric",
+ "iot:ListThingGroups",
+ "iot:ListThingsInThingGroup",
+ "iot:ListJobTemplates",
+ "iot:DescribeJobTemplate",
+ "iot:ListJobs",
+ "iot:CreateJob",
+ "iot:CancelJob",
+ "iot:DescribeJob",
+ "iot:ListJobExecutionsForJob",
+ "iot:ListJobExecutionsForThing",
+ "iot:DescribeJobExecution",
+ "iot:ListSecurityProfiles",
+ "iot:DescribeSecurityProfile",
+ "iot:ListActiveViolations",
+ "iot:GetThingShadow",
+ "iot:ListNamedShadowsForThing",
+ "iot:CancelJobExecution",
+ "iot:DescribeEndpoint",
+ "iotfleethub:DescribeApplication",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListMetrics",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListSubscriptionsByTopic",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:iotfleethub*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarmHistory"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:iotfleethub*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H4EGQA254",
+ "PolicyName": "AWSIoTFleetHubFederationAccess",
+ "UpdateDate": "2021-11-15T23:28:19+00:00",
+ "VersionId": "v4"
+ },
+ "AWSIoTFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:19:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJU2FPGG6PQWN72V2G",
+ "PolicyName": "AWSIoTFullAccess",
+ "UpdateDate": "2015-10-08T15:19:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTLogging": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTLogging",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:17:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "logs:PutRetentionPolicy",
+ "logs:GetLogEvents",
+ "logs:DeleteLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI6R6Z2FHHGS454W7W",
+ "PolicyName": "AWSIoTLogging",
+ "UpdateDate": "2015-10-08T15:17:25+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTOTAUpdate": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTOTAUpdate",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-20T20:36:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "iot:CreateJob",
+ "signer:DescribeSigningJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLJYWX53STBZFPUEY",
+ "PolicyName": "AWSIoTOTAUpdate",
+ "UpdateDate": "2017-12-20T20:36:53+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTRuleActions": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTRuleActions",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-08T15:14:51+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "dynamodb:PutItem",
+ "kinesis:PutRecord",
+ "iot:Publish",
+ "s3:PutObject",
+ "sns:Publish",
+ "sqs:SendMessage*",
+ "cloudwatch:SetAlarmState",
+ "cloudwatch:PutMetricData",
+ "es:ESHttpPut",
+ "firehose:PutRecord"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJEZ6FS7BUZVUHMOKY",
+ "PolicyName": "AWSIoTRuleActions",
+ "UpdateDate": "2018-01-16T19:28:19+00:00",
+ "VersionId": "v2"
+ },
+ "AWSIoTSiteWiseConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTSiteWiseConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-31T21:37:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iotsitewise:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iotanalytics:List*",
+ "iotanalytics:Describe*",
+ "iotanalytics:Create*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iot:DescribeEndpoint",
+ "iot:GetThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "greengrass:GetGroup",
+ "greengrass:GetGroupVersion",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:ListGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:ListSecrets",
+ "secretsmanager:CreateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:UpdateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:greengrass-*"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "iotsitewise.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/iotsitewise.amazonaws.com/AWSServiceRoleForIoTSiteWise*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "iotsitewise.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/iotsitewise.amazonaws.com/AWSServiceRoleForIoTSiteWise*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4K7KP5VA7F",
+ "PolicyName": "AWSIoTSiteWiseConsoleFullAccess",
+ "UpdateDate": "2019-05-31T21:37:49+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTSiteWiseFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTSiteWiseFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-04T20:53:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotsitewise:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILUK3XBM6TZ5Q3PX2",
+ "PolicyName": "AWSIoTSiteWiseFullAccess",
+ "UpdateDate": "2018-12-04T20:53:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTSiteWiseMonitorPortalAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTSiteWiseMonitorPortalAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-19T20:01:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotsitewise:CreateProject",
+ "iotsitewise:DescribeProject",
+ "iotsitewise:UpdateProject",
+ "iotsitewise:DeleteProject",
+ "iotsitewise:ListProjects",
+ "iotsitewise:BatchAssociateProjectAssets",
+ "iotsitewise:BatchDisassociateProjectAssets",
+ "iotsitewise:ListProjectAssets",
+ "iotsitewise:CreateDashboard",
+ "iotsitewise:DescribeDashboard",
+ "iotsitewise:UpdateDashboard",
+ "iotsitewise:DeleteDashboard",
+ "iotsitewise:ListDashboards",
+ "iotsitewise:CreateAccessPolicy",
+ "iotsitewise:DescribeAccessPolicy",
+ "iotsitewise:UpdateAccessPolicy",
+ "iotsitewise:DeleteAccessPolicy",
+ "iotsitewise:ListAccessPolicies",
+ "iotsitewise:DescribeAsset",
+ "iotsitewise:ListAssets",
+ "iotsitewise:ListAssociatedAssets",
+ "iotsitewise:DescribeAssetProperty",
+ "iotsitewise:GetAssetPropertyValue",
+ "iotsitewise:GetAssetPropertyValueHistory",
+ "iotsitewise:GetAssetPropertyAggregates",
+ "sso-directory:DescribeUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4E6CZDALWJ",
+ "PolicyName": "AWSIoTSiteWiseMonitorPortalAccess",
+ "UpdateDate": "2020-05-19T20:01:21+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTSiteWiseMonitorServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSIoTSiteWiseMonitorServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-14T00:59:10+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotsitewise:CreateProject",
+ "iotsitewise:DescribeProject",
+ "iotsitewise:UpdateProject",
+ "iotsitewise:DeleteProject",
+ "iotsitewise:ListProjects",
+ "iotsitewise:BatchAssociateProjectAssets",
+ "iotsitewise:BatchDisassociateProjectAssets",
+ "iotsitewise:ListProjectAssets",
+ "iotsitewise:CreateDashboard",
+ "iotsitewise:DescribeDashboard",
+ "iotsitewise:UpdateDashboard",
+ "iotsitewise:DeleteDashboard",
+ "iotsitewise:ListDashboards",
+ "iotsitewise:CreateAccessPolicy",
+ "iotsitewise:DescribeAccessPolicy",
+ "iotsitewise:UpdateAccessPolicy",
+ "iotsitewise:DeleteAccessPolicy",
+ "iotsitewise:ListAccessPolicies",
+ "iotsitewise:DescribeAsset",
+ "iotsitewise:ListAssets",
+ "iotsitewise:ListAssociatedAssets",
+ "iotsitewise:DescribeAssetProperty",
+ "iotsitewise:GetAssetPropertyValue",
+ "iotsitewise:GetAssetPropertyValueHistory",
+ "iotsitewise:GetAssetPropertyAggregates",
+ "sso-directory:DescribeUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CR556M6Y5",
+ "PolicyName": "AWSIoTSiteWiseMonitorServiceRolePolicy",
+ "UpdateDate": "2019-12-13T22:19:25+00:00",
+ "VersionId": "v2"
+ },
+ "AWSIoTSiteWiseReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTSiteWiseReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-04T20:55:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotsitewise:Describe*",
+ "iotsitewise:List*",
+ "iotsitewise:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLHEAFKME2QL64WKK",
+ "PolicyName": "AWSIoTSiteWiseReadOnlyAccess",
+ "UpdateDate": "2018-12-04T20:55:11+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTThingsRegistration": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSIoTThingsRegistration",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-01T20:21:52+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:AddThingToThingGroup",
+ "iot:AttachPolicy",
+ "iot:AttachPrincipalPolicy",
+ "iot:AttachThingPrincipal",
+ "iot:CreateCertificateFromCsr",
+ "iot:CreatePolicy",
+ "iot:CreateThing",
+ "iot:DescribeCertificate",
+ "iot:DescribeThing",
+ "iot:DescribeThingGroup",
+ "iot:DescribeThingType",
+ "iot:DetachPolicy",
+ "iot:DetachThingPrincipal",
+ "iot:GetPolicy",
+ "iot:ListAttachedPolicies",
+ "iot:ListPolicyPrincipals",
+ "iot:ListPrincipalPolicies",
+ "iot:ListPrincipalThings",
+ "iot:ListTargetsForPolicy",
+ "iot:ListThingGroupsForThing",
+ "iot:ListThingPrincipals",
+ "iot:RegisterCertificate",
+ "iot:RegisterThing",
+ "iot:RemoveThingFromThingGroup",
+ "iot:UpdateCertificate",
+ "iot:UpdateThing",
+ "iot:UpdateThingGroupsForThing",
+ "iot:AddThingToBillingGroup",
+ "iot:DescribeBillingGroup",
+ "iot:RemoveThingFromBillingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3YQXTC5XAEVTJNEU",
+ "PolicyName": "AWSIoTThingsRegistration",
+ "UpdateDate": "2020-10-05T19:20:12+00:00",
+ "VersionId": "v3"
+ },
+ "AWSIoTWirelessDataAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessDataAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:31:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotwireless:SendDataToWirelessDevice"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HH6GBXNUO",
+ "PolicyName": "AWSIoTWirelessDataAccess",
+ "UpdateDate": "2020-12-15T15:31:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTWirelessFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:27:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotwireless:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4L5RZVVSRQ",
+ "PolicyName": "AWSIoTWirelessFullAccess",
+ "UpdateDate": "2020-12-15T15:27:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTWirelessFullPublishAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessFullPublishAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:29:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:DescribeEndpoint",
+ "iot:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JSRC2FZ22",
+ "PolicyName": "AWSIoTWirelessFullPublishAccess",
+ "UpdateDate": "2020-12-15T15:29:59+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTWirelessGatewayCertManager": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessGatewayCertManager",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:30:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:CreateKeysAndCertificate",
+ "iot:DescribeCertificate",
+ "iot:ListCertificates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "IoTWirelessGatewayCertManager"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4O6BH33Y6U",
+ "PolicyName": "AWSIoTWirelessGatewayCertManager",
+ "UpdateDate": "2020-12-15T15:30:48+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTWirelessLogging": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessLogging",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:32:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/iotwireless*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4L3X44AIHR",
+ "PolicyName": "AWSIoTWirelessLogging",
+ "UpdateDate": "2020-12-15T15:32:40+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIoTWirelessReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIoTWirelessReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T15:28:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotwireless:List*",
+ "iotwireless:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FJYYSL3ZA",
+ "PolicyName": "AWSIoTWirelessReadOnlyAccess",
+ "UpdateDate": "2020-12-15T15:28:56+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIotRoboRunnerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIotRoboRunnerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T03:54:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iotroborunner:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IYUQ2ND5E",
+ "PolicyName": "AWSIotRoboRunnerFullAccess",
+ "UpdateDate": "2021-11-29T03:54:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSIotRoboRunnerReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSIotRoboRunnerReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T03:43:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotroborunner:GetTask",
+ "iotroborunner:ListActivities",
+ "iotroborunner:GetSite",
+ "iotroborunner:GetDestinationRelationship",
+ "iotroborunner:GetWorker",
+ "iotroborunner:ListTasks",
+ "iotroborunner:GetAction",
+ "iotroborunner:GetActivity",
+ "iotroborunner:ListDestinationRelationships",
+ "iotroborunner:ListActionTemplates",
+ "iotroborunner:ListWorkerFleets",
+ "iotroborunner:ListSites",
+ "iotroborunner:ListActions",
+ "iotroborunner:ListWorkers",
+ "iotroborunner:GetDestination",
+ "iotroborunner:GetActionTemplate",
+ "iotroborunner:GetWorkerFleet",
+ "iotroborunner:ListDestinations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NPMSUTQWF",
+ "PolicyName": "AWSIotRoboRunnerReadOnly",
+ "UpdateDate": "2021-11-29T03:43:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSKeyManagementServiceCustomKeyStoresServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSKeyManagementServiceCustomKeyStoresServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-14T20:10:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudhsm:Describe*",
+ "ec2:CreateNetworkInterface",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeSecurityGroups",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:DeleteSecurityGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIADMJEHVVYK5AUQOO",
+ "PolicyName": "AWSKeyManagementServiceCustomKeyStoresServiceRolePolicy",
+ "UpdateDate": "2018-11-14T20:10:53+00:00",
+ "VersionId": "v1"
+ },
+ "AWSKeyManagementServiceMultiRegionKeysServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSKeyManagementServiceMultiRegionKeysServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-06-16T15:37:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kms:SynchronizeMultiRegionKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P3NRAIDRH",
+ "PolicyName": "AWSKeyManagementServiceMultiRegionKeysServiceRolePolicy",
+ "UpdateDate": "2021-06-16T15:37:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSKeyManagementServicePowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:40+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kms:CreateAlias",
+ "kms:CreateKey",
+ "kms:DeleteAlias",
+ "kms:Describe*",
+ "kms:GenerateRandom",
+ "kms:Get*",
+ "kms:List*",
+ "kms:TagResource",
+ "kms:UntagResource",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNPP7PPPPMJRV2SA4",
+ "PolicyName": "AWSKeyManagementServicePowerUser",
+ "UpdateDate": "2017-03-07T00:55:11+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLakeFormationCrossAccountManager": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLakeFormationCrossAccountManager",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-04T20:59:46+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ram:CreateResourceShare"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "ram:RequestedResourceType": [
+ "glue:Table",
+ "glue:Database",
+ "glue:Catalog"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ram:UpdateResourceShare",
+ "ram:DeleteResourceShare"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ram:ResourceShareName": [
+ "LakeFormation*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "glue:PutResourcePolicy",
+ "glue:DeleteResourcePolicy",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeAccount",
+ "ram:Get*",
+ "ram:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:ListRoots",
+ "organizations:ListAccountsForParent",
+ "organizations:ListOrganizationalUnitsForParent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HPT7Y7QL3",
+ "PolicyName": "AWSLakeFormationCrossAccountManager",
+ "UpdateDate": "2020-12-07T23:11:36+00:00",
+ "VersionId": "v3"
+ },
+ "AWSLakeFormationDataAdmin": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLakeFormationDataAdmin",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-08T17:33:44+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lakeformation:*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:LookupEvents",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:CreateDatabase",
+ "glue:UpdateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetConnections",
+ "glue:SearchTables",
+ "glue:GetTable",
+ "glue:CreateTable",
+ "glue:UpdateTable",
+ "glue:DeleteTable",
+ "glue:GetTableVersions",
+ "glue:GetPartitions",
+ "glue:GetTables",
+ "glue:GetWorkflow",
+ "glue:ListWorkflows",
+ "glue:BatchGetWorkflows",
+ "glue:DeleteWorkflow",
+ "glue:GetWorkflowRuns",
+ "glue:StartWorkflowRun",
+ "glue:GetWorkflow",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "iam:ListUsers",
+ "iam:ListRoles",
+ "iam:GetRole",
+ "iam:GetRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lakeformation:PutDataLakeSettings"
+ ],
+ "Effect": "Deny",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OWCH3ENIA",
+ "PolicyName": "AWSLakeFormationDataAdmin",
+ "UpdateDate": "2019-12-16T22:41:40+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLambdaBasicExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:03:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNCQGXC42545SKXIK",
+ "PolicyName": "AWSLambdaBasicExecutionRole",
+ "UpdateDate": "2015-04-09T15:03:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaDynamoDBExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:09:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeStream",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:ListStreams",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIP7WNAGMIPYNW4WQG",
+ "PolicyName": "AWSLambdaDynamoDBExecutionRole",
+ "UpdateDate": "2015-04-09T15:09:29+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaENIManagementAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaENIManagementAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-06T00:37:27+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXAW2Q3KPTURUT2QC",
+ "PolicyName": "AWSLambdaENIManagementAccess",
+ "UpdateDate": "2020-10-01T20:07:26+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLambdaExecute": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaExecute",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJE5FX7FQZSU5XAKGO",
+ "PolicyName": "AWSLambdaExecute",
+ "UpdateDate": "2015-02-06T18:40:46+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaInvocation-DynamoDB": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambdaInvocation-DynamoDB",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:DescribeStream",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJTHQ3EKCQALQDYG5G",
+ "PolicyName": "AWSLambdaInvocation-DynamoDB",
+ "UpdateDate": "2015-02-06T18:40:47+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaKinesisExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T15:14:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:GetRecords",
+ "kinesis:GetShardIterator",
+ "kinesis:ListShards",
+ "kinesis:ListStreams",
+ "kinesis:SubscribeToShard",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHOLKJPXV4GBRMJUQ",
+ "PolicyName": "AWSLambdaKinesisExecutionRole",
+ "UpdateDate": "2018-11-19T20:09:24+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLambdaMSKExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-11T17:35:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kafka:DescribeCluster",
+ "kafka:GetBootstrapBrokers",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FHMXOHIS5",
+ "PolicyName": "AWSLambdaMSKExecutionRole",
+ "UpdateDate": "2020-08-11T17:35:05+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaReplicator": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSLambdaReplicator",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-23T17:53:03+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:DisableReplication"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*"
+ ],
+ "Sid": "LambdaCreateDeletePermission"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLikeIfExists": {
+ "iam:PassedToService": "lambda.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "IamPassRolePermission"
+ },
+ {
+ "Action": [
+ "cloudfront:ListDistributionsByLambdaFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "CloudFrontListDistributions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIIQFXZNNLL3E2HKTG",
+ "PolicyName": "AWSLambdaReplicator",
+ "UpdateDate": "2017-12-08T00:17:54+00:00",
+ "VersionId": "v3"
+ },
+ "AWSLambdaRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:41:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJX4DPCRGTC4NFDUXI",
+ "PolicyName": "AWSLambdaRole",
+ "UpdateDate": "2015-02-06T18:41:28+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaSQSQueueExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-14T21:50:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:ReceiveMessage",
+ "sqs:DeleteMessage",
+ "sqs:GetQueueAttributes",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFWJZI6JNND4TSELK",
+ "PolicyName": "AWSLambdaSQSQueueExecutionRole",
+ "UpdateDate": "2018-06-14T21:50:45+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambdaVPCAccessExecutionRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-11T23:15:26+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJVTME3YLVNL72YR2K",
+ "PolicyName": "AWSLambdaVPCAccessExecutionRole",
+ "UpdateDate": "2020-10-15T22:53:03+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLambda_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambda_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-17T21:14:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricData",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "kms:ListAliases",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "lambda:*",
+ "logs:DescribeLogGroups",
+ "states:DescribeStateMachine",
+ "states:ListStateMachines",
+ "tag:GetResources",
+ "xray:GetTraceSummaries",
+ "xray:BatchGetTraces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "lambda.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OXQPYWZ5D",
+ "PolicyName": "AWSLambda_FullAccess",
+ "UpdateDate": "2020-11-17T21:14:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLambda_ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSLambda_ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-17T21:10:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "kms:ListAliases",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "logs:DescribeLogGroups",
+ "lambda:Get*",
+ "lambda:List*",
+ "states:DescribeStateMachine",
+ "states:ListStateMachines",
+ "tag:GetResources",
+ "xray:GetTraceSummaries",
+ "xray:BatchGetTraces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IERNVMNPE",
+ "PolicyName": "AWSLambda_ReadOnlyAccess",
+ "UpdateDate": "2020-11-17T21:10:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLicenseManagerConsumptionPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSLicenseManagerConsumptionPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-11T23:18:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "license-manager:CheckoutLicense",
+ "license-manager:CheckInLicense",
+ "license-manager:ExtendLicenseConsumption",
+ "license-manager:GetLicense"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KWNLLSDDM",
+ "PolicyName": "AWSLicenseManagerConsumptionPolicy",
+ "UpdateDate": "2021-08-11T23:18:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSLicenseManagerMasterAccountRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSLicenseManagerMasterAccountRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T19:03:51+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:GetLifecycleConfiguration",
+ "s3:PutLifecycleConfiguration",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-license-manager-service-*"
+ ],
+ "Sid": "S3BucketPermissions"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-license-manager-service-*"
+ ],
+ "Sid": "S3ObjectPermissions1"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-license-manager-service-*/resource_sync/*"
+ ],
+ "Sid": "S3ObjectPermissions2"
+ },
+ {
+ "Action": [
+ "athena:GetQueryExecution",
+ "athena:GetQueryResults",
+ "athena:StartQueryExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AthenaPermissions"
+ },
+ {
+ "Action": [
+ "glue:GetTable",
+ "glue:GetPartition",
+ "glue:GetPartitions"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "GluePermissions"
+ },
+ {
+ "Action": [
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:DescribeAccount",
+ "organizations:ListChildren",
+ "organizations:ListParents",
+ "organizations:ListAccountsForParent",
+ "organizations:ListRoots",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "OrganizationPermissions"
+ },
+ {
+ "Action": [
+ "ram:GetResourceShares",
+ "ram:GetResourceShareAssociations",
+ "ram:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "RAMPermissions1"
+ },
+ {
+ "Action": [
+ "ram:CreateResourceShare"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/Service": "LicenseManager"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "RAMPermissions2"
+ },
+ {
+ "Action": [
+ "ram:AssociateResourceShare",
+ "ram:DisassociateResourceShare",
+ "ram:UpdateResourceShare",
+ "ram:DeleteResourceShare"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/Service": "LicenseManager"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "RAMPermissions3"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "IAMGetRoles"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "cloudformation.amazonaws.com",
+ "glue.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/LicenseManagerServiceResourceDataSyncRole*"
+ ],
+ "Sid": "IAMPassRoles"
+ },
+ {
+ "Action": [
+ "cloudformation:UpdateStack",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/LicenseManagerCrossAccountCloudDiscoveryStack/*"
+ ],
+ "Sid": "CloudformationPermission"
+ },
+ {
+ "Action": [
+ "glue:CreateTable",
+ "glue:UpdateTable",
+ "glue:DeleteTable",
+ "glue:UpdateJob",
+ "glue:UpdateCrawler"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:crawler/LicenseManagerResourceSynDataCrawler",
+ "arn:aws:glue:*:*:job/LicenseManagerResourceSynDataProcessJob",
+ "arn:aws:glue:*:*:table/license_manager_resource_inventory_db/*",
+ "arn:aws:glue:*:*:table/license_manager_resource_sync/*",
+ "arn:aws:glue:*:*:database/license_manager_resource_inventory_db",
+ "arn:aws:glue:*:*:database/license_manager_resource_sync"
+ ],
+ "Sid": "GlueUpdatePermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIJE2NOZW2BDEHYUH2",
+ "PolicyName": "AWSLicenseManagerMasterAccountRolePolicy",
+ "UpdateDate": "2021-11-18T02:02:15+00:00",
+ "VersionId": "v4"
+ },
+ "AWSLicenseManagerMemberAccountRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSLicenseManagerMemberAccountRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T19:04:32+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "license-manager:UpdateLicenseSpecificationsForResource",
+ "license-manager:GetLicenseConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "LicenseManagerPermissions"
+ },
+ {
+ "Action": [
+ "ssm:ListInventoryEntries",
+ "ssm:GetInventory",
+ "ssm:CreateAssociation",
+ "ssm:CreateResourceDataSync",
+ "ssm:DeleteResourceDataSync",
+ "ssm:ListResourceDataSync",
+ "ssm:ListAssociations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "SSMPermissions"
+ },
+ {
+ "Action": [
+ "ram:AcceptResourceShareInvitation",
+ "ram:GetResourceShareInvitations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "RAMPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZTYEY2LEGBYAVUY4",
+ "PolicyName": "AWSLicenseManagerMemberAccountRolePolicy",
+ "UpdateDate": "2019-11-15T22:09:32+00:00",
+ "VersionId": "v2"
+ },
+ "AWSLicenseManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSLicenseManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T19:02:53+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "license-management.marketplace.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/license-management.marketplace.amazonaws.com/AWSServiceRoleForMarketplaceLicenseManagement"
+ ],
+ "Sid": "IAMPermissions"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "license-manager.member-account.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:iam::*:role/aws-service-role/license-manager.member-account.amazonaws.com/AWSServiceRoleForAWSLicenseManagerMemberAccountRole"
+ ],
+ "Sid": "IAMPermissionsForCreatingMemberSLR"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-license-manager-service-*"
+ ],
+ "Sid": "S3BucketPermissions1"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "S3BucketPermissions2"
+ },
+ {
+ "Action": [
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-license-manager-service-*"
+ ],
+ "Sid": "S3ObjectPermissions"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:aws-license-manager-service-*"
+ ],
+ "Sid": "SNSAccountPermissions"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "SNSTopicPermissions"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeImages",
+ "ec2:DescribeHosts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "EC2Permissions"
+ },
+ {
+ "Action": [
+ "ssm:ListInventoryEntries",
+ "ssm:GetInventory",
+ "ssm:CreateAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "SSMPermissions"
+ },
+ {
+ "Action": [
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeOrganization",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "OrganizationPermissions"
+ },
+ {
+ "Action": [
+ "license-manager:GetServiceSettings",
+ "license-manager:GetLicense*",
+ "license-manager:UpdateLicenseSpecificationsForResource",
+ "license-manager:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "LicenseManagerPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIM7JPETWHTYNBQSZE",
+ "PolicyName": "AWSLicenseManagerServiceRolePolicy",
+ "UpdateDate": "2021-07-30T01:43:19+00:00",
+ "VersionId": "v7"
+ },
+ "AWSMarketplaceAmiIngestion": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceAmiIngestion",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-25T20:55:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:us-east-1::snapshot/snap-*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshotAttribute",
+ "ec2:ModifyImageAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AV3OZYWEM",
+ "PolicyName": "AWSMarketplaceAmiIngestion",
+ "UpdateDate": "2020-09-25T20:55:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-11T17:21:45+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:List*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcs",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CopyImage",
+ "ec2:DeregisterImage",
+ "ec2:DescribeSnapshots",
+ "ec2:DeleteSnapshot",
+ "ec2:CreateImage",
+ "ec2:DescribeInstanceStatus",
+ "ssm:GetAutomationExecution",
+ "ssm:ListDocuments",
+ "ssm:DescribeDocument",
+ "sns:ListTopics",
+ "sns:GetTopicAttributes",
+ "sns:CreateTopic",
+ "iam:GetRole",
+ "iam:GetInstanceProfile",
+ "iam:ListRoles",
+ "iam:ListInstanceProfiles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*image-build*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:Publish",
+ "sns:setTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:*image-build*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:eu-central-1:906690553262:automation-definition/*",
+ "arn:aws:ssm:us-east-1:058657716661:automation-definition/*",
+ "arn:aws:ssm:ap-northeast-1:340648487307:automation-definition/*",
+ "arn:aws:ssm:eu-west-1:564714592864:automation-definition/*",
+ "arn:aws:ssm:us-west-2:243045473901:automation-definition/*",
+ "arn:aws:ssm:ap-southeast-2:362149219987:automation-definition/*",
+ "arn:aws:ssm:eu-west-2:587945719687:automation-definition/*",
+ "arn:aws:ssm:us-east-2:134937423163:automation-definition/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AssociatedResourceARN": [
+ "arn:aws:ssm:eu-central-1:906690553262:automation-definition/*",
+ "arn:aws:ssm:us-east-1:058657716661:automation-definition/*",
+ "arn:aws:ssm:ap-northeast-1:340648487307:automation-definition/*",
+ "arn:aws:ssm:eu-west-1:564714592864:automation-definition/*",
+ "arn:aws:ssm:us-west-2:243045473901:automation-definition/*",
+ "arn:aws:ssm:ap-southeast-2:362149219987:automation-definition/*",
+ "arn:aws:ssm:eu-west-2:587945719687:automation-definition/*",
+ "arn:aws:ssm:us-east-2:134937423163:automation-definition/*"
+ ],
+ "iam:PassedToService": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI2DV5ULJSO2FYVPYG",
+ "PolicyName": "AWSMarketplaceFullAccess",
+ "UpdateDate": "2022-03-04T17:04:00+00:00",
+ "VersionId": "v4"
+ },
+ "AWSMarketplaceGetEntitlements": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceGetEntitlements",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-27T19:37:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:GetEntitlements"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLPIMQE4WMHDC2K7C",
+ "PolicyName": "AWSMarketplaceGetEntitlements",
+ "UpdateDate": "2017-03-27T19:37:24+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceImageBuildFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceImageBuildFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-07-31T23:29:49+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ListBuilds",
+ "aws-marketplace:StartBuild",
+ "aws-marketplace:DescribeBuilds"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:TerminateInstances",
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/marketplace-image-build:build-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*Automation*",
+ "arn:aws:iam::*:role/*Instance*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:GetAutomationExecution",
+ "ssm:ListDocuments",
+ "ssm:DescribeDocument",
+ "ec2:DeregisterImage",
+ "ec2:CopyImage",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:DeleteSnapshot",
+ "ec2:CreateImage",
+ "ec2:RunInstances",
+ "ec2:DescribeInstanceStatus",
+ "sns:GetTopicAttributes",
+ "iam:GetRole",
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*image-build*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:*image-build*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:eu-central-1:906690553262:automation-definition/*",
+ "arn:aws:ssm:us-east-1:058657716661:automation-definition/*",
+ "arn:aws:ssm:ap-northeast-1:340648487307:automation-definition/*",
+ "arn:aws:ssm:eu-west-1:564714592864:automation-definition/*",
+ "arn:aws:ssm:us-west-2:243045473901:automation-definition/*",
+ "arn:aws:ssm:ap-southeast-2:362149219987:automation-definition/*",
+ "arn:aws:ssm:eu-west-2:587945719687:automation-definition/*",
+ "arn:aws:ssm:us-east-2:134937423163:automation-definition/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AssociatedResourceARN": [
+ "arn:aws:ssm:eu-central-1:906690553262:automation-definition/*",
+ "arn:aws:ssm:us-east-1:058657716661:automation-definition/*",
+ "arn:aws:ssm:ap-northeast-1:340648487307:automation-definition/*",
+ "arn:aws:ssm:eu-west-1:564714592864:automation-definition/*",
+ "arn:aws:ssm:us-west-2:243045473901:automation-definition/*",
+ "arn:aws:ssm:ap-southeast-2:362149219987:automation-definition/*",
+ "arn:aws:ssm:eu-west-2:587945719687:automation-definition/*",
+ "arn:aws:ssm:us-east-2:134937423163:automation-definition/*"
+ ],
+ "iam:PassedToService": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/marketplace-image-build:build-id": "*"
+ },
+ "StringNotEquals": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Deny",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4QBMJWC3BNHBHN6I",
+ "PolicyName": "AWSMarketplaceImageBuildFullAccess",
+ "UpdateDate": "2022-03-04T17:05:09+00:00",
+ "VersionId": "v3"
+ },
+ "AWSMarketplaceLicenseManagementServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSMarketplaceLicenseManagementServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-03T08:33:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeOrganization",
+ "license-manager:ListReceivedGrants",
+ "license-manager:ListDistributedGrants",
+ "license-manager:GetGrant",
+ "license-manager:CreateGrant",
+ "license-manager:CreateGrantVersion",
+ "license-manager:DeleteGrant",
+ "license-manager:AcceptGrant"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowLicenseManagerActions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DTCV6FSO7",
+ "PolicyName": "AWSMarketplaceLicenseManagementServiceRolePolicy",
+ "UpdateDate": "2020-12-03T08:33:40+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceManageSubscriptions": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceManageSubscriptions",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:32+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ViewSubscriptions",
+ "aws-marketplace:Subscribe",
+ "aws-marketplace:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:CreatePrivateMarketplaceRequests",
+ "aws-marketplace:ListPrivateMarketplaceRequests",
+ "aws-marketplace:DescribePrivateMarketplaceRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJRDW2WIFN7QLUAKBQ",
+ "PolicyName": "AWSMarketplaceManageSubscriptions",
+ "UpdateDate": "2019-10-28T21:49:43+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMarketplaceMeteringFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceMeteringFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-03-17T22:39:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:MeterUsage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ65YJPG7CC7LDXNA6",
+ "PolicyName": "AWSMarketplaceMeteringFullAccess",
+ "UpdateDate": "2016-03-17T22:39:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceMeteringRegisterUsage": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceMeteringRegisterUsage",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-21T01:17:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:RegisterUsage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OIHJX73MZ",
+ "PolicyName": "AWSMarketplaceMeteringRegisterUsage",
+ "UpdateDate": "2019-11-21T01:17:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceProcurementSystemAdminFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceProcurementSystemAdminFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-25T13:07:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:PutProcurementSystemConfiguration",
+ "aws-marketplace:DescribeProcurementSystemConfiguration",
+ "organizations:Describe*",
+ "organizations:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FIYNR3TC4",
+ "PolicyName": "AWSMarketplaceProcurementSystemAdminFullAccess",
+ "UpdateDate": "2019-06-25T13:07:47+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplacePurchaseOrdersServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSMarketplacePurchaseOrdersServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-27T15:12:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "purchase-orders:ViewPurchaseOrders",
+ "purchase-orders:ModifyPurchaseOrders"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowPurchaseOrderActions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BHDLJGTI4",
+ "PolicyName": "AWSMarketplacePurchaseOrdersServiceRolePolicy",
+ "UpdateDate": "2021-10-27T15:12:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMarketplaceRead-only": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceRead-only",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:31+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ViewSubscriptions",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:ListBuilds",
+ "aws-marketplace:DescribeBuilds",
+ "iam:ListRoles",
+ "iam:ListInstanceProfiles",
+ "sns:GetTopicAttributes",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:ListPrivateMarketplaceRequests",
+ "aws-marketplace:DescribePrivateMarketplaceRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJOOM6LETKURTJ3XZ2",
+ "PolicyName": "AWSMarketplaceRead-only",
+ "UpdateDate": "2019-10-28T21:51:31+00:00",
+ "VersionId": "v3"
+ },
+ "AWSMarketplaceSellerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceSellerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-02T20:40:09+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace-management:uploadFiles",
+ "aws-marketplace-management:viewMarketing",
+ "aws-marketplace-management:viewReports",
+ "aws-marketplace-management:viewSupport",
+ "aws-marketplace-management:viewSettings",
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:StartChangeSet",
+ "aws-marketplace:CancelChangeSet",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListTasks",
+ "aws-marketplace:DescribeTask",
+ "aws-marketplace:UpdateTask",
+ "aws-marketplace:CompleteTask",
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshots",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifySnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aws-marketplace:SearchAgreements",
+ "aws-marketplace:DescribeAgreement",
+ "aws-marketplace:GetAgreementTerms"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws-marketplace:AgreementType": [
+ "PurchaseAgreement"
+ ]
+ },
+ "StringEquals": {
+ "aws-marketplace:PartyType": "Proposer"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "assets.marketplace.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JF7OFUANW",
+ "PolicyName": "AWSMarketplaceSellerFullAccess",
+ "UpdateDate": "2021-11-30T19:26:49+00:00",
+ "VersionId": "v5"
+ },
+ "AWSMarketplaceSellerProductsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceSellerProductsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-02T21:06:25+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:StartChangeSet",
+ "aws-marketplace:CancelChangeSet",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListTasks",
+ "aws-marketplace:DescribeTask",
+ "aws-marketplace:UpdateTask",
+ "aws-marketplace:CompleteTask",
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshots",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifySnapshotAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "assets.marketplace.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DS2YFEG4N",
+ "PolicyName": "AWSMarketplaceSellerProductsFullAccess",
+ "UpdateDate": "2021-11-26T18:50:50+00:00",
+ "VersionId": "v4"
+ },
+ "AWSMarketplaceSellerProductsReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMarketplaceSellerProductsReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-02T21:40:47+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:ListTasks",
+ "aws-marketplace:DescribeTask",
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4K5Y2Q5F7D",
+ "PolicyName": "AWSMarketplaceSellerProductsReadOnly",
+ "UpdateDate": "2020-03-05T23:11:53+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMediaTailorServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSMediaTailorServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-17T22:27:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:MediaTailor/*:log-stream:*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:MediaTailor/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4N46XCSH76",
+ "PolicyName": "AWSMediaTailorServiceRolePolicy",
+ "UpdateDate": "2021-09-17T22:27:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubDMSAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubDMSAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:00:06+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:CreateProgressUpdateStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS"
+ },
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:DescribeMigrationTask",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:ListDiscoveredResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks",
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUQB56VA4JHLN7G2W",
+ "PolicyName": "AWSMigrationHubDMSAccess",
+ "UpdateDate": "2019-10-07T17:51:53+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMigrationHubDiscoveryAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubDiscoveryAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:30:51+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "discovery:ListConfigurations",
+ "discovery:DescribeConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "aws:migrationhub:source-id"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": "dms:AddTagsToResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "aws:migrationhub:source-id"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dms:*:*:endpoint:*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITRMRLSV7JAL6YIGG",
+ "PolicyName": "AWSMigrationHubDiscoveryAccess",
+ "UpdateDate": "2020-08-06T17:34:42+00:00",
+ "VersionId": "v3"
+ },
+ "AWSMigrationHubFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMigrationHubFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:02:54+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:*",
+ "discovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "continuousexport.discovery.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/continuousexport.discovery.amazonaws.com/AWSServiceRoleForApplicationDiscoveryServiceContinuousExport*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/continuousexport.discovery.amazonaws.com/AWSServiceRoleForApplicationDiscoveryServiceContinuousExport*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "migrationhub.amazonaws.com",
+ "dmsintegration.migrationhub.amazonaws.com",
+ "smsintegration.migrationhub.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4A2SZKHUYHDYIGOK",
+ "PolicyName": "AWSMigrationHubFullAccess",
+ "UpdateDate": "2019-06-19T21:14:41+00:00",
+ "VersionId": "v4"
+ },
+ "AWSMigrationHubRefactorSpacesFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMigrationHubRefactorSpacesFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T07:12:55+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "refactor-spaces:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RefactorSpaces"
+ },
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "ec2:DescribeTransitGateways",
+ "ec2:DescribeTags",
+ "ec2:DescribeTransitGateways",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInternetGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTransitGateway",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTransitGatewayVpcAttachment"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:environment-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTransitGateway",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTransitGatewayVpcAttachment"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:environment-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpointServiceConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteTransitGateway",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteTransitGatewayVpcAttachment",
+ "ec2:CreateRoute",
+ "ec2:DeleteRoute",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:environment-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:DeleteVpcEndpointServiceConfigurations",
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:application-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:CreateLoadBalancer"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:application-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTags",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeListeners"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:CreateLoadBalancerListeners",
+ "elasticloadbalancing:CreateListener",
+ "elasticloadbalancing:DeleteListener",
+ "elasticloadbalancing:DeleteTargetGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/refactor-spaces:route-id": [
+ "*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:DeleteLoadBalancer",
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:loadbalancer/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:AddTags",
+ "elasticloadbalancing:CreateListener"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:route-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:loadbalancer/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": "elasticloadbalancing:DeleteListener",
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:listener/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DeleteTargetGroup",
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:targetgroup/refactor-spaces-tg-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:AddTags",
+ "elasticloadbalancing:CreateTargetGroup"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:route-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:targetgroup/refactor-spaces-tg-*"
+ },
+ {
+ "Action": [
+ "apigateway:GET",
+ "apigateway:DELETE",
+ "apigateway:PATCH",
+ "apigateway:POST",
+ "apigateway:PUT",
+ "apigateway:UpdateRestApiPolicy"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:application-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/restapis",
+ "arn:aws:apigateway:*::/restapis/*",
+ "arn:aws:apigateway:*::/vpclinks",
+ "arn:aws:apigateway:*::/vpclinks/*",
+ "arn:aws:apigateway:*::/tags",
+ "arn:aws:apigateway:*::/tags/*"
+ ]
+ },
+ {
+ "Action": "apigateway:GET",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/vpclinks",
+ "arn:aws:apigateway:*::/vpclinks/*"
+ ]
+ },
+ {
+ "Action": [
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "refactor-spaces.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OQKCEGRMK",
+ "PolicyName": "AWSMigrationHubRefactorSpacesFullAccess",
+ "UpdateDate": "2021-11-29T14:07:52+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMigrationHubRefactorSpacesServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSMigrationHubRefactorSpacesServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T06:50:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "ram:GetResourceShareAssociations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteTransitGatewayVpcAttachment",
+ "ec2:CreateRoute",
+ "ec2:DeleteRoute",
+ "ec2:DeleteTags",
+ "ram:DeleteResourceShare",
+ "ram:AssociateResourceShare",
+ "ram:DisassociateResourceShare"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:environment-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:DeleteVpcEndpointServiceConfigurations",
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:application-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:CreateLoadBalancerListeners",
+ "elasticloadbalancing:CreateListener",
+ "elasticloadbalancing:DeleteListener",
+ "elasticloadbalancing:DeleteTargetGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/refactor-spaces:route-id": [
+ "*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:PUT",
+ "apigateway:POST",
+ "apigateway:GET",
+ "apigateway:PATCH",
+ "apigateway:DELETE"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/refactor-spaces:application-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/restapis",
+ "arn:aws:apigateway:*::/restapis/*",
+ "arn:aws:apigateway:*::/vpclinks/*",
+ "arn:aws:apigateway:*::/tags",
+ "arn:aws:apigateway:*::/tags/*"
+ ]
+ },
+ {
+ "Action": "apigateway:GET",
+ "Effect": "Allow",
+ "Resource": "arn:aws:apigateway:*::/vpclinks/*"
+ },
+ {
+ "Action": "elasticloadbalancing:DeleteLoadBalancer",
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:loadbalancer/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:AddTags",
+ "elasticloadbalancing:CreateListener"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:route-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:loadbalancer/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": "elasticloadbalancing:DeleteListener",
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:listener/net/refactor-spaces-nlb-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DeleteTargetGroup",
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:targetgroup/refactor-spaces-tg-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:AddTags",
+ "elasticloadbalancing:CreateTargetGroup"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/refactor-spaces:route-id": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:elasticloadbalancing:*:*:targetgroup/refactor-spaces-tg-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KIIHJIPXW",
+ "PolicyName": "AWSMigrationHubRefactorSpacesServiceRolePolicy",
+ "UpdateDate": "2021-11-29T06:50:15+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubSMSAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSMigrationHubSMSAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T13:57:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mgh:CreateProgressUpdateStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS"
+ },
+ {
+ "Action": [
+ "mgh:AssociateCreatedArtifact",
+ "mgh:DescribeMigrationTask",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:PutResourceAttributes",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:ListDiscoveredResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks",
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWQYYT6TSVIRJO4TY",
+ "PolicyName": "AWSMigrationHubSMSAccess",
+ "UpdateDate": "2019-10-07T18:01:22+00:00",
+ "VersionId": "v2"
+ },
+ "AWSMigrationHubStrategyCollector": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMigrationHubStrategyCollector",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-19T20:15:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::migrationhub-strategy-*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "execute-api:Invoke",
+ "execute-api:ManageConnections"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:execute-api:*:*:*/prod/*/put-log-data",
+ "arn:aws:execute-api:*:*:*/prod/*/put-metric-data"
+ ]
+ },
+ {
+ "Action": [
+ "migrationhub-strategy:RegisterCollector",
+ "migrationhub-strategy:GetAntiPattern",
+ "migrationhub-strategy:GetMessage",
+ "migrationhub-strategy:SendMessage",
+ "migrationhub-strategy:ListAntiPatterns",
+ "migrationhub-strategy:ListJarArtifacts"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:migrationhub-strategy:*:*:*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:migrationhub-strategy-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LHUI3MFF6",
+ "PolicyName": "AWSMigrationHubStrategyCollector",
+ "UpdateDate": "2021-10-19T20:15:15+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubStrategyConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMigrationHubStrategyConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-19T20:13:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "migrationhub-strategy:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:CreateBucket",
+ "s3:PutEncryptionConfiguration",
+ "s3:PutBucketPublicAccessBlock",
+ "s3:PutBucketPolicy",
+ "s3:PutBucketVersioning",
+ "s3:PutLifecycleConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::migrationhub-strategy-*"
+ },
+ {
+ "Action": [
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "discovery:GetDiscoverySummary"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "migrationhub-strategy.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/migrationhub-strategy.amazonaws.com/AWSMigrationHubStrategyServiceRolePolicy*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NOFRRYUC5",
+ "PolicyName": "AWSMigrationHubStrategyConsoleFullAccess",
+ "UpdateDate": "2021-10-19T20:13:26+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMigrationHubStrategyServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSMigrationHubStrategyServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-19T20:02:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "discovery:ListConfigurations",
+ "discovery:DescribeConfigurations",
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "permissionsForAds"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::migrationhub-strategy-*",
+ "Sid": "permissionsForS3"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EZOM3LHDI",
+ "PolicyName": "AWSMigrationHubStrategyServiceRolePolicy",
+ "UpdateDate": "2021-10-19T20:02:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSMobileHub_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMobileHub_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-05T19:56:01+00:00",
+ "DefaultVersionId": "v14",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET",
+ "apigateway:POST",
+ "cloudfront:GetDistribution",
+ "devicefarm:CreateProject",
+ "devicefarm:ListJobs",
+ "devicefarm:ListRuns",
+ "devicefarm:GetProject",
+ "devicefarm:GetRun",
+ "devicefarm:ListArtifacts",
+ "devicefarm:ListProjects",
+ "devicefarm:ScheduleRun",
+ "dynamodb:DescribeTable",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "iam:ListSAMLProviders",
+ "lambda:ListFunctions",
+ "sns:ListTopics",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetBot",
+ "lex:GetBots",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "mobilehub:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/aws-my-sample-app*.zip"
+ },
+ {
+ "Action": [
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*-mobilehub-*/*"
+ },
+ {
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*-mobilehub-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIJLU43R6AGRBK76DM",
+ "PolicyName": "AWSMobileHub_FullAccess",
+ "UpdateDate": "2019-12-19T23:15:52+00:00",
+ "VersionId": "v14"
+ },
+ "AWSMobileHub_ReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSMobileHub_ReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-05T19:55:48+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeTable",
+ "iam:ListSAMLProviders",
+ "lambda:ListFunctions",
+ "sns:ListTopics",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetBot",
+ "lex:GetBots",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "mobilehub:ExportProject",
+ "mobilehub:GenerateProjectParameters",
+ "mobilehub:GetProject",
+ "mobilehub:SynchronizeProject",
+ "mobilehub:GetProjectSnapshot",
+ "mobilehub:ListProjectSnapshots",
+ "mobilehub:ListAvailableConnectors",
+ "mobilehub:ListAvailableFeatures",
+ "mobilehub:ListAvailableRegions",
+ "mobilehub:ListProjects",
+ "mobilehub:ValidateProject",
+ "mobilehub:VerifyServiceRole",
+ "mobilehub:DescribeBundle",
+ "mobilehub:ExportBundle",
+ "mobilehub:ListBundles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/aws-my-sample-app*.zip"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIBXVYVL3PWQFBZFGW",
+ "PolicyName": "AWSMobileHub_ReadOnly",
+ "UpdateDate": "2018-07-23T21:59:05+00:00",
+ "VersionId": "v10"
+ },
+ "AWSNetworkFirewallServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSNetworkFirewallServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-17T17:17:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/AWSNetworkFirewallManaged": "true",
+ "ec2:CreateAction": "CreateVpcEndpoint"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVpcEndpoints"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/AWSNetworkFirewallManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DF6QQZAL3",
+ "PolicyName": "AWSNetworkFirewallServiceRolePolicy",
+ "UpdateDate": "2020-11-17T17:17:26+00:00",
+ "VersionId": "v1"
+ },
+ "AWSNetworkManagerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSNetworkManagerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T17:37:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "networkmanager:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "networkmanager.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ARXJ4NU7I",
+ "PolicyName": "AWSNetworkManagerFullAccess",
+ "UpdateDate": "2019-12-03T17:37:58+00:00",
+ "VersionId": "v1"
+ },
+ "AWSNetworkManagerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSNetworkManagerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T17:35:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "networkmanager:Describe*",
+ "networkmanager:Get*",
+ "networkmanager:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LZFJOS62Z",
+ "PolicyName": "AWSNetworkManagerReadOnlyAccess",
+ "UpdateDate": "2019-12-03T17:35:05+00:00",
+ "VersionId": "v1"
+ },
+ "AWSNetworkManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSNetworkManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T14:03:35+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:DescribeDirectConnectGateways",
+ "directconnect:DescribeConnections",
+ "directconnect:DescribeDirectConnectGatewayAttachments",
+ "directconnect:DescribeLocations",
+ "directconnect:DescribeVirtualInterfaces",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeTransitGatewayAttachments",
+ "ec2:DescribeTransitGatewayRouteTables",
+ "ec2:DescribeTransitGateways",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpcs",
+ "ec2:GetTransitGatewayRouteTableAssociations",
+ "ec2:SearchTransitGatewayRoutes",
+ "ec2:DescribeTransitGatewayPeeringAttachments",
+ "ec2:DescribeTransitGatewayConnects",
+ "ec2:DescribeTransitGatewayConnectPeers",
+ "ec2:DescribeRegions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4B346KOB7I",
+ "PolicyName": "AWSNetworkManagerServiceRolePolicy",
+ "UpdateDate": "2021-11-23T21:38:47+00:00",
+ "VersionId": "v5"
+ },
+ "AWSOpsWorksCMInstanceProfileRole": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksCMInstanceProfileRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-24T09:48:22+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStackResource",
+ "cloudformation:SignalResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:ListMultipartUploadParts",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-opsworks-cm-*"
+ },
+ {
+ "Action": "acm:GetCertificate",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "secretsmanager:GetSecretValue",
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:opsworks-cm!aws-opsworks-cm-secrets-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICSU3OSHCURP2WIZW",
+ "PolicyName": "AWSOpsWorksCMInstanceProfileRole",
+ "UpdateDate": "2021-04-23T17:34:03+00:00",
+ "VersionId": "v5"
+ },
+ "AWSOpsWorksCMServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSOpsWorksCMServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-24T09:49:46+00:00",
+ "DefaultVersionId": "v14",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteObject",
+ "s3:DeleteBucket",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy",
+ "s3:PutObject",
+ "s3:GetBucketTagging",
+ "s3:PutBucketTagging"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:UntagResources",
+ "tag:TagResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:DescribeInstanceInformation",
+ "ssm:GetCommandInvocation",
+ "ssm:ListCommandInvocations",
+ "ssm:ListCommands"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ssm:resourceTag/aws:cloudformation:stack-name": "aws-opsworks-cm-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*::document/*",
+ "arn:aws:s3:::aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateImage",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateTags",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeregisterImage",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RunInstances",
+ "ec2:StopInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:RebootInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-name": "aws-opsworks-cm-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "opsworks-cm:DeleteServer",
+ "opsworks-cm:StartMaintenance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:opsworks-cm:*:*:server/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-opsworks-cm-*",
+ "arn:aws:iam::*:role/service-role/aws-opsworks-cm-*"
+ ]
+ },
+ {
+ "Action": [
+ "acm:DeleteCertificate",
+ "acm:ImportCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:UpdateSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource",
+ "secretsmanager:UntagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:opsworks-cm!aws-opsworks-cm-secrets-*"
+ },
+ {
+ "Action": "ec2:DeleteTags",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:elastic-ip/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6I6MPGJE62URSHCO",
+ "PolicyName": "AWSOpsWorksCMServiceRole",
+ "UpdateDate": "2021-04-23T17:32:13+00:00",
+ "VersionId": "v14"
+ },
+ "AWSOpsWorksCloudWatchLogs": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksCloudWatchLogs",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-03-30T17:47:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXFIK7WABAY5CPXM4",
+ "PolicyName": "AWSOpsWorksCloudWatchLogs",
+ "UpdateDate": "2017-03-30T17:47:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksInstanceRegistration": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksInstanceRegistration",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-06-03T14:23:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:DescribeStackProvisioningParameters",
+ "opsworks:DescribeStacks",
+ "opsworks:RegisterInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJG3LCPVNI4WDZCIMU",
+ "PolicyName": "AWSOpsWorksInstanceRegistration",
+ "UpdateDate": "2016-06-03T14:23:15+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksRegisterCLI_EC2": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksRegisterCLI_EC2",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-18T15:56:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:AssignInstance",
+ "opsworks:CreateLayer",
+ "opsworks:DeregisterInstance",
+ "opsworks:DescribeInstances",
+ "opsworks:DescribeStackProvisioningParameters",
+ "opsworks:DescribeStacks",
+ "opsworks:UnassignInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NCE3CMCRC",
+ "PolicyName": "AWSOpsWorksRegisterCLI_EC2",
+ "UpdateDate": "2019-06-18T15:56:17+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorksRegisterCLI_OnPremises": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorksRegisterCLI_OnPremises",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-18T15:33:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "opsworks:AssignInstance",
+ "opsworks:CreateLayer",
+ "opsworks:DeregisterInstance",
+ "opsworks:DescribeInstances",
+ "opsworks:DescribeStackProvisioningParameters",
+ "opsworks:DescribeStacks",
+ "opsworks:UnassignInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateGroup",
+ "iam:AddUserToGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:group/AWS/OpsWorks/OpsWorks-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateUser",
+ "iam:CreateAccessKey"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:user/AWS/OpsWorks/OpsWorks-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:AttachUserPolicy"
+ ],
+ "Condition": {
+ "ArnEquals": {
+ "iam:PolicyARN": "arn:aws:iam::aws:policy/AWSOpsWorksInstanceRegistration"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:user/AWS/OpsWorks/OpsWorks-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EZJ5DYEPG",
+ "PolicyName": "AWSOpsWorksRegisterCLI_OnPremises",
+ "UpdateDate": "2019-06-18T15:33:16+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOpsWorks_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOpsWorks_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-22T16:29:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "iam:GetRolePolicy",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "opsworks:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "opsworks.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4D626GOURR",
+ "PolicyName": "AWSOpsWorks_FullAccess",
+ "UpdateDate": "2021-01-22T16:29:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSOrganizationsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOrganizationsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-06T20:31:57+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "organizations:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "account:PutAlternateContact",
+ "account:DeleteAlternateContact",
+ "account:GetAlternateContact"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZXBNRCJKNLQHSB5M",
+ "PolicyName": "AWSOrganizationsFullAccess",
+ "UpdateDate": "2022-02-07T18:26:04+00:00",
+ "VersionId": "v2"
+ },
+ "AWSOrganizationsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSOrganizationsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-06T20:32:38+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:Describe*",
+ "organizations:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "account:GetAlternateContact"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJY5RQATUV77PEPVOM",
+ "PolicyName": "AWSOrganizationsReadOnlyAccess",
+ "UpdateDate": "2022-02-07T18:17:19+00:00",
+ "VersionId": "v2"
+ },
+ "AWSOrganizationsServiceTrustPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSOrganizationsServiceTrustPolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-10-10T23:04:07+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/organizations.amazonaws.com/*"
+ ],
+ "Sid": "AllowDeletionOfServiceLinkedRoleForOrganizations"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowCreationOfServiceLinkedRoles"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQH6ROMVVECFVRJPK",
+ "PolicyName": "AWSOrganizationsServiceTrustPolicy",
+ "UpdateDate": "2017-11-01T06:01:18+00:00",
+ "VersionId": "v2"
+ },
+ "AWSOutpostsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSOutpostsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-09T22:55:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NM7FW2RO7",
+ "PolicyName": "AWSOutpostsServiceRolePolicy",
+ "UpdateDate": "2020-11-09T22:55:56+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPanoramaApplianceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSPanoramaApplianceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T13:13:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/panorama_device*:log-stream:*",
+ "Sid": "PanoramaDeviceCreateLogStream"
+ },
+ {
+ "Action": "logs:CreateLogGroup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/panorama_device*",
+ "Sid": "PanoramaDeviceCreateLogGroup"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CWIHTBB4Y",
+ "PolicyName": "AWSPanoramaApplianceRolePolicy",
+ "UpdateDate": "2020-12-01T13:13:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPanoramaApplianceServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSPanoramaApplianceServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-20T12:14:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/panorama_device*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/panorama/devices/*"
+ ],
+ "Sid": "PanoramaDeviceCreateLogStream"
+ },
+ {
+ "Action": "logs:CreateLogGroup",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/panorama_device*",
+ "arn:aws:logs:*:*:log-group:/aws/panorama/devices/*"
+ ],
+ "Sid": "PanoramaDeviceCreateLogGroup"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "PanoramaDeviceMetrics"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PanoramaDevicePutMetric"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Condition": {
+ "StringLike": {
+ "s3:DataAccessPointArn": "arn:aws:s3:*:*:accesspoint/panorama*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PanoramaDeviceS3Access"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4O5K6UVMRK",
+ "PolicyName": "AWSPanoramaApplianceServiceRolePolicy",
+ "UpdateDate": "2021-10-20T12:14:03+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPanoramaFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSPanoramaFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T13:12:47+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "panorama:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Condition": {
+ "StringLike": {
+ "s3:DataAccessPointArn": "arn:aws:s3:*:*:accesspoint/panorama*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:ListSecretVersionIds",
+ "secretsmanager:PutSecretValue",
+ "secretsmanager:UpdateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:panorama*",
+ "arn:aws:secretsmanager:*:*:secret:Panorama*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "panorama.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:List*",
+ "logs:StartQuery",
+ "logs:StopQuery",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/panorama_device*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/panorama/devices/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "panorama.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IAPULBSWQ",
+ "PolicyName": "AWSPanoramaFullAccess",
+ "UpdateDate": "2022-01-12T21:21:04+00:00",
+ "VersionId": "v4"
+ },
+ "AWSPanoramaGreengrassGroupRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSPanoramaGreengrassGroupRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T13:10:22+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucket*",
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*aws-panorama*"
+ ],
+ "Sid": "PanoramaS3Access"
+ },
+ {
+ "Action": "cloudwatch:PutDashboard",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch::*:dashboard/panorama*"
+ ],
+ "Sid": "PanoramaCLoudWatchPutDashboard"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PanoramaCloudWatchPutMetricData"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/greengrass/*",
+ "Sid": "PanoramaGreenGrassCloudWatchAccess"
+ },
+ {
+ "Action": [
+ "panorama:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IRCPXKCEG",
+ "PolicyName": "AWSPanoramaGreengrassGroupRolePolicy",
+ "UpdateDate": "2021-01-06T19:30:35+00:00",
+ "VersionId": "v2"
+ },
+ "AWSPanoramaSageMakerRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSPanoramaSageMakerRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T13:13:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:GetBucket*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*aws-panorama*"
+ ],
+ "Sid": "PanoramaSageMakerS3Access"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4O23KYQMI2",
+ "PolicyName": "AWSPanoramaSageMakerRolePolicy",
+ "UpdateDate": "2020-12-01T13:13:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPanoramaServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSPanoramaServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-20T12:12:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:CreateThing",
+ "iot:DeleteThing",
+ "iot:DeleteThingShadow",
+ "iot:DescribeThing",
+ "iot:GetThingShadow",
+ "iot:UpdateThing",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/panorama*"
+ ],
+ "Sid": "PanoramaIoTThingAccess"
+ },
+ {
+ "Action": [
+ "iot:AttachThingPrincipal",
+ "iot:DetachThingPrincipal",
+ "iot:UpdateCertificate",
+ "iot:DeleteCertificate",
+ "iot:AttachPrincipalPolicy",
+ "iot:DetachPrincipalPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/panorama*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "PanoramaIoTCertificateAccess"
+ },
+ {
+ "Action": [
+ "iot:CreateKeysAndCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaIoTCreateCertificateAccess"
+ },
+ {
+ "Action": [
+ "iot:CreatePolicy",
+ "iot:CreatePolicyVersion",
+ "iot:AttachPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:policy/panorama*"
+ ],
+ "Sid": "PanoramaIoTCreatePolicyAndVersionAccess"
+ },
+ {
+ "Action": [
+ "iot:DescribeJobExecution",
+ "iot:CreateJob",
+ "iot:DeleteJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:job/panorama*",
+ "arn:aws:iot:*:*:thing/panorama*"
+ ],
+ "Sid": "PanoramaIoTJobAccess"
+ },
+ {
+ "Action": [
+ "iot:DescribeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaIoTEndpointAccess"
+ },
+ {
+ "Action": [
+ "panorama:Describe*",
+ "panorama:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:CreateSecret",
+ "secretsmanager:ListSecretVersionIds",
+ "secretsmanager:DeleteSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:panorama*",
+ "arn:aws:secretsmanager:*:*:secret:Panorama*"
+ ],
+ "Sid": "SecretsManagerPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BQE5OFSDO",
+ "PolicyName": "AWSPanoramaServiceLinkedRolePolicy",
+ "UpdateDate": "2021-10-20T12:12:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPanoramaServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSPanoramaServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T13:14:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iot:CreateThing",
+ "iot:DeleteThing",
+ "iot:DeleteThingShadow",
+ "iot:DescribeThing",
+ "iot:GetThingShadow",
+ "iot:UpdateThing",
+ "iot:UpdateThingShadow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/panorama*"
+ ],
+ "Sid": "PanoramaIoTThingAccess"
+ },
+ {
+ "Action": [
+ "iot:AttachThingPrincipal",
+ "iot:DetachThingPrincipal",
+ "iot:UpdateCertificate",
+ "iot:DeleteCertificate",
+ "iot:AttachPrincipalPolicy",
+ "iot:DetachPrincipalPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:thing/panorama*",
+ "arn:aws:iot:*:*:cert/*"
+ ],
+ "Sid": "PanoramaIoTCertificateAccess"
+ },
+ {
+ "Action": [
+ "iot:CreateKeysAndCertificate",
+ "iot:CreatePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaIoTCreateCertificateAndPolicyAccess"
+ },
+ {
+ "Action": [
+ "iot:CreatePolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:policy/panorama*"
+ ],
+ "Sid": "PanoramaIoTCreatePolicyVersionAccess"
+ },
+ {
+ "Action": [
+ "iot:DescribeJobExecution",
+ "iot:CreateJob",
+ "iot:DeleteJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:job/panorama*",
+ "arn:aws:iot:*:*:thing/panorama*"
+ ],
+ "Sid": "PanoramaIoTJobAccess"
+ },
+ {
+ "Action": [
+ "iot:DescribeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaIoTEndpointAccess"
+ },
+ {
+ "Action": [
+ "panorama:Describe*",
+ "panorama:List*",
+ "panorama:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaAccess"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:DeleteBucket",
+ "s3:ListBucket",
+ "s3:GetBucket*",
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*aws-panorama*"
+ ],
+ "Sid": "PanoramaS3Access"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSPanoramaSageMakerRole",
+ "arn:aws:iam::*:role/service-role/AWSPanoramaSageMakerRole"
+ ],
+ "Sid": "PanoramaIAMPassSageMakerRoleAccess"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "greengrass.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSPanoramaGreengrassGroupRole",
+ "arn:aws:iam::*:role/service-role/AWSPanoramaGreengrassGroupRole",
+ "arn:aws:iam::*:role/AWSPanoramaGreengrassRole",
+ "arn:aws:iam::*:role/service-role/AWSPanoramaGreengrassRole"
+ ],
+ "Sid": "PanoramaIAMPassGreengrassRoleAccess"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": "iot.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSPanoramaApplianceRole",
+ "arn:aws:iam::*:role/service-role/AWSPanoramaApplianceRole"
+ ],
+ "Sid": "PanoramaIAMPassIoTRoleAccess"
+ },
+ {
+ "Action": [
+ "greengrass:AssociateRoleToGroup",
+ "greengrass:AssociateServiceRoleToAccount",
+ "greengrass:CreateResourceDefinition",
+ "greengrass:CreateResourceDefinitionVersion",
+ "greengrass:CreateCoreDefinition",
+ "greengrass:CreateCoreDefinitionVersion",
+ "greengrass:CreateDeployment",
+ "greengrass:CreateFunctionDefinition",
+ "greengrass:CreateFunctionDefinitionVersion",
+ "greengrass:CreateGroup",
+ "greengrass:CreateGroupCertificateAuthority",
+ "greengrass:CreateGroupVersion",
+ "greengrass:CreateLoggerDefinition",
+ "greengrass:CreateLoggerDefinitionVersion",
+ "greengrass:CreateSubscriptionDefinition",
+ "greengrass:CreateSubscriptionDefinitionVersion",
+ "greengrass:DeleteCoreDefinition",
+ "greengrass:DeleteFunctionDefinition",
+ "greengrass:DeleteResourceDefinition",
+ "greengrass:DeleteGroup",
+ "greengrass:DeleteLoggerDefinition",
+ "greengrass:DeleteSubscriptionDefinition",
+ "greengrass:DisassociateRoleFromGroup",
+ "greengrass:DisassociateServiceRoleFromAccount",
+ "greengrass:GetAssociatedRole",
+ "greengrass:GetConnectivityInfo",
+ "greengrass:GetCoreDefinition",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:GetDeploymentStatus",
+ "greengrass:GetDeviceDefinition",
+ "greengrass:GetDeviceDefinitionVersion",
+ "greengrass:GetFunctionDefinition",
+ "greengrass:GetFunctionDefinitionVersion",
+ "greengrass:GetGroup",
+ "greengrass:GetGroupCertificateAuthority",
+ "greengrass:GetGroupCertificateConfiguration",
+ "greengrass:GetGroupVersion",
+ "greengrass:GetLoggerDefinition",
+ "greengrass:GetLoggerDefinitionVersion",
+ "greengrass:GetResourceDefinition",
+ "greengrass:GetServiceRoleForAccount",
+ "greengrass:GetSubscriptionDefinition",
+ "greengrass:GetSubscriptionDefinitionVersion",
+ "greengrass:ListCoreDefinitionVersions",
+ "greengrass:ListCoreDefinitions",
+ "greengrass:ListDeployments",
+ "greengrass:ListDeviceDefinitionVersions",
+ "greengrass:ListDeviceDefinitions",
+ "greengrass:ListFunctionDefinitionVersions",
+ "greengrass:ListFunctionDefinitions",
+ "greengrass:ListGroupCertificateAuthorities",
+ "greengrass:ListGroupVersions",
+ "greengrass:ListGroups",
+ "greengrass:ListLoggerDefinitionVersions",
+ "greengrass:ListLoggerDefinitions",
+ "greengrass:ListSubscriptionDefinitionVersions",
+ "greengrass:ListSubscriptionDefinitions",
+ "greengrass:ResetDeployments",
+ "greengrass:UpdateConnectivityInfo",
+ "greengrass:UpdateCoreDefinition",
+ "greengrass:UpdateDeviceDefinition",
+ "greengrass:UpdateFunctionDefinition",
+ "greengrass:UpdateGroup",
+ "greengrass:UpdateGroupCertificateConfiguration",
+ "greengrass:UpdateLoggerDefinition",
+ "greengrass:UpdateSubscriptionDefinition",
+ "greengrass:UpdateResourceDefinition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaGreenGrassAccess"
+ },
+ {
+ "Action": [
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*"
+ ],
+ "Sid": "PanoramaLambdaUsersFunctionAccess"
+ },
+ {
+ "Action": [
+ "sagemaker:CreateTrainingJob",
+ "sagemaker:StopTrainingJob",
+ "sagemaker:CreateCompilationJob",
+ "sagemaker:DescribeCompilationJob",
+ "sagemaker:StopCompilationJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:training-job/panorama*",
+ "arn:aws:sagemaker:*:*:compilation-job/panorama*"
+ ],
+ "Sid": "PanoramaSageMakerWriteAccess"
+ },
+ {
+ "Action": [
+ "sagemaker:ListCompilationJobs"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "PanoramaSageMakerListAccess"
+ },
+ {
+ "Action": [
+ "sagemaker:DescribeTrainingJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:training-job/*"
+ ],
+ "Sid": "PanoramaSageMakerReadAccess"
+ },
+ {
+ "Action": [
+ "iot:AttachPolicy",
+ "iot:CreateRoleAlias"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:policy/panorama*",
+ "arn:aws:iot:*:*:rolealias/panorama*"
+ ],
+ "Sid": "PanoramaCWLogsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G7G35B6C5",
+ "PolicyName": "AWSPanoramaServiceRolePolicy",
+ "UpdateDate": "2020-12-01T13:14:43+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPriceListServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSPriceListServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-22T00:36:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "pricing:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIADJ4GBYNHKABML3Q",
+ "PolicyName": "AWSPriceListServiceFullAccess",
+ "UpdateDate": "2017-11-22T00:36:27+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPrivateMarketplaceAdminFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSPrivateMarketplaceAdminFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T16:32:32+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:AssociateProductsWithPrivateMarketplace",
+ "aws-marketplace:DisassociateProductsFromPrivateMarketplace",
+ "aws-marketplace:ListPrivateMarketplaceRequests",
+ "aws-marketplace:DescribePrivateMarketplaceRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "aws-marketplace:ListEntities",
+ "aws-marketplace:DescribeEntity",
+ "aws-marketplace:StartChangeSet",
+ "aws-marketplace:ListChangeSets",
+ "aws-marketplace:DescribeChangeSet",
+ "aws-marketplace:CancelChangeSet"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6VRZDDCYDOVCOCEI",
+ "PolicyName": "AWSPrivateMarketplaceAdminFullAccess",
+ "UpdateDate": "2021-08-27T15:34:07+00:00",
+ "VersionId": "v4"
+ },
+ "AWSPrivateMarketplaceRequests": {
+ "Arn": "arn:aws:iam::aws:policy/AWSPrivateMarketplaceRequests",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-28T21:44:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-marketplace:CreatePrivateMarketplaceRequests",
+ "aws-marketplace:ListPrivateMarketplaceRequests",
+ "aws-marketplace:DescribePrivateMarketplaceRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AV6W3DAIW",
+ "PolicyName": "AWSPrivateMarketplaceRequests",
+ "UpdateDate": "2019-10-28T21:44:03+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPrivateNetworksServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSPrivateNetworksServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-12-16T23:17:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/Private5G"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IGXMJRAAS",
+ "PolicyName": "AWSPrivateNetworksServiceRolePolicy",
+ "UpdateDate": "2021-12-16T23:17:46+00:00",
+ "VersionId": "v1"
+ },
+ "AWSProtonDeveloperAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSProtonDeveloperAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T19:02:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "proton:ListServiceTemplates",
+ "proton:ListServiceTemplateMajorVersions",
+ "proton:ListServiceTemplateMinorVersions",
+ "proton:ListServices",
+ "proton:ListServiceInstances",
+ "proton:ListEnvironments",
+ "proton:GetServiceTemplate",
+ "proton:GetServiceTemplateMajorVersion",
+ "proton:GetServiceTemplateMinorVersion",
+ "proton:GetService",
+ "proton:GetServiceInstance",
+ "proton:GetEnvironment",
+ "proton:CreateService",
+ "proton:UpdateService",
+ "proton:UpdateServiceInstance",
+ "proton:UpdateServicePipeline",
+ "proton:DeleteService",
+ "codestar-connections:ListConnections"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-connections:PassConnection"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "codestar-connections:PassedToService": "proton.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FWOFPRNSU",
+ "PolicyName": "AWSProtonDeveloperAccess",
+ "UpdateDate": "2021-02-17T19:02:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSProtonFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSProtonFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T19:07:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "proton:*",
+ "codestar-connections:ListConnections",
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "proton.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "proton.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codestar-connections:PassConnection"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "codestar-connections:PassedToService": "proton.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IOK6P734E",
+ "PolicyName": "AWSProtonFullAccess",
+ "UpdateDate": "2021-02-17T19:07:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSProtonReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSProtonReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T19:09:12+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "proton:List*",
+ "proton:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DW2EHEZB3",
+ "PolicyName": "AWSProtonReadOnlyAccess",
+ "UpdateDate": "2021-02-17T19:09:12+00:00",
+ "VersionId": "v1"
+ },
+ "AWSProtonSyncServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSProtonSyncServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-23T21:14:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "proton:UpdateServiceTemplateVersion",
+ "proton:UpdateServiceTemplate",
+ "proton:UpdateEnvironmentTemplateVersion",
+ "proton:UpdateEnvironmentTemplate",
+ "proton:GetServiceTemplateVersion",
+ "proton:GetServiceTemplate",
+ "proton:GetEnvironmentTemplateVersion",
+ "proton:GetEnvironmentTemplate",
+ "proton:DeleteServiceTemplateVersion",
+ "proton:DeleteEnvironmentTemplateVersion",
+ "proton:CreateServiceTemplateVersion",
+ "proton:CreateServiceTemplate",
+ "proton:CreateEnvironmentTemplateVersion",
+ "proton:CreateEnvironmentTemplate",
+ "proton:ListEnvironmentTemplateVersions",
+ "proton:ListServiceTemplateVersions",
+ "proton:CreateEnvironmentTemplateMajorVersion",
+ "proton:CreateServiceTemplateMajorVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SyncToProton"
+ },
+ {
+ "Action": [
+ "codestar-connections:UseConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*",
+ "Sid": "AccessGitRepos"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H6XP2ZY2O",
+ "PolicyName": "AWSProtonSyncServiceRolePolicy",
+ "UpdateDate": "2021-11-23T21:14:36+00:00",
+ "VersionId": "v1"
+ },
+ "AWSPurchaseOrdersServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSPurchaseOrdersServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-06T18:15:47+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:*Billing",
+ "purchase-orders:*PurchaseOrders"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KQXTYO5FP",
+ "PolicyName": "AWSPurchaseOrdersServiceRolePolicy",
+ "UpdateDate": "2021-11-22T20:06:47+00:00",
+ "VersionId": "v2"
+ },
+ "AWSQuickSightDescribeRDS": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightDescribeRDS",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:24:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJU5J6OAMCJD3OO76O",
+ "PolicyName": "AWSQuickSightDescribeRDS",
+ "UpdateDate": "2015-11-10T23:24:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightDescribeRedshift": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightDescribeRedshift",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:25:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFEM6MLSLTW4ZNBW2",
+ "PolicyName": "AWSQuickSightDescribeRedshift",
+ "UpdateDate": "2015-11-10T23:25:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightElasticsearchPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightElasticsearchPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-09T17:27:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:ESHttpGet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*/",
+ "arn:aws:es:*:*:domain/*/_cluster/settings",
+ "arn:aws:es:*:*:domain/*/_cat/indices"
+ ]
+ },
+ {
+ "Action": "es:ListDomainNames",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeDomain"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*"
+ ]
+ },
+ {
+ "Action": [
+ "es:ESHttpPost",
+ "es:ESHttpGet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*/_opendistro/_sql",
+ "arn:aws:es:*:*:domain/*/_plugin/_sql"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BLUM3JVIN",
+ "PolicyName": "AWSQuickSightElasticsearchPolicy",
+ "UpdateDate": "2021-09-07T23:25:55+00:00",
+ "VersionId": "v3"
+ },
+ "AWSQuickSightIoTAnalyticsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSQuickSightIoTAnalyticsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T17:00:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iotanalytics:ListDatasets",
+ "iotanalytics:DescribeDataset",
+ "iotanalytics:GetDatasetContent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJIZNDRUTKCN5HLZOE",
+ "PolicyName": "AWSQuickSightIoTAnalyticsAccess",
+ "UpdateDate": "2017-11-29T17:00:54+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightListIAM": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightListIAM",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-10T23:25:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3CH5UUWZN4EKGILO",
+ "PolicyName": "AWSQuickSightListIAM",
+ "UpdateDate": "2015-11-10T23:25:07+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightSageMakerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightSageMakerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-17T17:18:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:DescribeTransformJob",
+ "sagemaker:StopTransformJob",
+ "sagemaker:CreateTransformJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sagemaker:*:*:transform-job/quicksight-auto-generated-*"
+ },
+ {
+ "Action": "sagemaker:ListModels",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::quicksight-ml.*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MCLBVDT2I",
+ "PolicyName": "AWSQuickSightSageMakerPolicy",
+ "UpdateDate": "2020-01-17T17:18:13+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuickSightTimestreamPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuickSightTimestreamPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-30T21:47:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "timestream:Select",
+ "timestream:CancelQuery",
+ "timestream:ListTables",
+ "timestream:ListDatabases",
+ "timestream:ListMeasures",
+ "timestream:DescribeTable",
+ "timestream:DescribeDatabase",
+ "timestream:SelectValues",
+ "timestream:DescribeEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CFKVDHQJH",
+ "PolicyName": "AWSQuickSightTimestreamPolicy",
+ "UpdateDate": "2020-09-30T21:47:03+00:00",
+ "VersionId": "v1"
+ },
+ "AWSQuicksightAthenaAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuicksightAthenaAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-09T02:31:03+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "athena:BatchGetQueryExecution",
+ "athena:CancelQueryExecution",
+ "athena:GetCatalogs",
+ "athena:GetExecutionEngine",
+ "athena:GetExecutionEngines",
+ "athena:GetNamespace",
+ "athena:GetNamespaces",
+ "athena:GetQueryExecution",
+ "athena:GetQueryExecutions",
+ "athena:GetQueryResults",
+ "athena:GetQueryResultsStream",
+ "athena:GetTable",
+ "athena:GetTables",
+ "athena:ListQueryExecutions",
+ "athena:RunQuery",
+ "athena:StartQueryExecution",
+ "athena:StopQueryExecution",
+ "athena:ListWorkGroups",
+ "athena:ListEngineVersions",
+ "athena:GetWorkGroup",
+ "athena:GetDataCatalog",
+ "athena:GetDatabase",
+ "athena:GetTableMetadata",
+ "athena:ListDataCatalogs",
+ "athena:ListDatabases",
+ "athena:ListTableMetadata"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:DeleteTable",
+ "glue:BatchDeleteTable",
+ "glue:UpdateTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:BatchCreatePartition",
+ "glue:CreatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:UpdatePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket",
+ "s3:PutObject",
+ "s3:PutBucketPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-athena-query-results-*"
+ ]
+ },
+ {
+ "Action": [
+ "lakeformation:GetDataAccess"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4JB77JXFQXDWNRPM",
+ "PolicyName": "AWSQuicksightAthenaAccess",
+ "UpdateDate": "2021-07-07T20:09:06+00:00",
+ "VersionId": "v10"
+ },
+ "AWSQuicksightOpenSearchPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSQuicksightOpenSearchPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-07T23:26:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:ESHttpGet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*/",
+ "arn:aws:es:*:*:domain/*/_cluster/settings",
+ "arn:aws:es:*:*:domain/*/_cat/indices"
+ ]
+ },
+ {
+ "Action": "es:ListDomainNames",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "es:DescribeDomain"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*"
+ ]
+ },
+ {
+ "Action": [
+ "es:ESHttpPost",
+ "es:ESHttpGet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:es:*:*:domain/*/_opendistro/_sql",
+ "arn:aws:es:*:*:domain/*/_plugin/_sql"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JW5IRBCM3",
+ "PolicyName": "AWSQuicksightOpenSearchPolicy",
+ "UpdateDate": "2021-09-07T23:26:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSResourceAccessManagerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSResourceAccessManagerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-04T17:28:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ram:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FYRGF63DP",
+ "PolicyName": "AWSResourceAccessManagerFullAccess",
+ "UpdateDate": "2019-06-04T17:28:22+00:00",
+ "VersionId": "v1"
+ },
+ "AWSResourceAccessManagerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSResourceAccessManagerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-09T20:58:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ram:Get*",
+ "ram:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BQV2LHYJY",
+ "PolicyName": "AWSResourceAccessManagerReadOnlyAccess",
+ "UpdateDate": "2019-12-09T20:58:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSResourceAccessManagerResourceShareParticipantAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSResourceAccessManagerResourceShareParticipantAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-09T20:41:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ram:AcceptResourceShareInvitation",
+ "ram:GetResourcePolicies",
+ "ram:GetResourceShareInvitations",
+ "ram:GetResourceShares",
+ "ram:ListPendingInvitationResources",
+ "ram:ListPrincipals",
+ "ram:ListResources",
+ "ram:RejectResourceShareInvitation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LIFEGGUIU",
+ "PolicyName": "AWSResourceAccessManagerResourceShareParticipantAccess",
+ "UpdateDate": "2019-12-09T20:41:37+00:00",
+ "VersionId": "v1"
+ },
+ "AWSResourceAccessManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSResourceAccessManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-14T19:28:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListChildren",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListParents",
+ "organizations:ListRoots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/ram.amazonaws.com/*"
+ ],
+ "Sid": "AllowDeletionOfServiceLinkedRoleForResourceAccessManager"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJU667A3V5UAXC4YNE",
+ "PolicyName": "AWSResourceAccessManagerServiceRolePolicy",
+ "UpdateDate": "2018-11-14T19:28:28+00:00",
+ "VersionId": "v1"
+ },
+ "AWSResourceGroupsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSResourceGroupsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-07T10:27:04+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "resource-groups:Get*",
+ "resource-groups:List*",
+ "resource-groups:Search*",
+ "tag:Get*",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVpcs",
+ "elasticache:DescribeCacheClusters",
+ "elasticache:DescribeSnapshots",
+ "elasticache:ListTagsForResource",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:ListClusters",
+ "glacier:ListVaults",
+ "glacier:DescribeVault",
+ "glacier:ListTagsForVault",
+ "kinesis:ListStreams",
+ "kinesis:DescribeStream",
+ "kinesis:ListTagsForStream",
+ "opsworks:DescribeStacks",
+ "opsworks:ListTags",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBSnapshots",
+ "rds:ListTagsForResource",
+ "redshift:DescribeClusters",
+ "redshift:DescribeTags",
+ "route53domains:ListDomains",
+ "route53:ListHealthChecks",
+ "route53:GetHealthCheck",
+ "route53:ListHostedZones",
+ "route53:GetHostedZone",
+ "route53:ListTagsForResource",
+ "storagegateway:ListGateways",
+ "storagegateway:DescribeGatewayInformation",
+ "storagegateway:ListTagsForResource",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketTagging",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTags",
+ "ssm:ListDocuments"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXFKM2WGBJAEWMFEG",
+ "PolicyName": "AWSResourceGroupsReadOnlyAccess",
+ "UpdateDate": "2019-02-05T17:56:25+00:00",
+ "VersionId": "v2"
+ },
+ "AWSRoboMakerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSRoboMakerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T05:30:50+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "robomaker:List*",
+ "robomaker:BatchDescribe*",
+ "robomaker:Describe*",
+ "robomaker:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "VisualEditor0"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXFHP2ALXXGGECYJI",
+ "PolicyName": "AWSRoboMakerReadOnlyAccess",
+ "UpdateDate": "2020-08-28T23:10:18+00:00",
+ "VersionId": "v2"
+ },
+ "AWSRoboMakerServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSRoboMakerServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T06:30:08+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSecurityGroups",
+ "greengrass:CreateDeployment",
+ "greengrass:CreateGroupVersion",
+ "greengrass:CreateFunctionDefinition",
+ "greengrass:CreateFunctionDefinitionVersion",
+ "greengrass:GetDeploymentStatus",
+ "greengrass:GetGroup",
+ "greengrass:GetGroupVersion",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:GetFunctionDefinitionVersion",
+ "greengrass:GetAssociatedRole",
+ "lambda:CreateFunction",
+ "robomaker:CreateSimulationJob",
+ "robomaker:CancelSimulationJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "robomaker:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:robomaker:*:*:simulation-job/*"
+ },
+ {
+ "Action": [
+ "lambda:UpdateFunctionCode",
+ "lambda:GetFunction",
+ "lambda:UpdateFunctionConfiguration",
+ "lambda:DeleteFunction",
+ "lambda:ListVersionsByFunction",
+ "lambda:GetAlias",
+ "lambda:UpdateAlias",
+ "lambda:CreateAlias",
+ "lambda:DeleteAlias"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:aws-robomaker-*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lambda.amazonaws.com",
+ "robomaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYLVVUUQMAEEZ3ZNY",
+ "PolicyName": "AWSRoboMakerServicePolicy",
+ "UpdateDate": "2021-11-11T22:23:45+00:00",
+ "VersionId": "v6"
+ },
+ "AWSRoboMakerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSRoboMakerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T05:33:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSecurityGroups",
+ "greengrass:CreateDeployment",
+ "greengrass:CreateGroupVersion",
+ "greengrass:CreateFunctionDefinition",
+ "greengrass:CreateFunctionDefinitionVersion",
+ "greengrass:GetDeploymentStatus",
+ "greengrass:GetGroup",
+ "greengrass:GetGroupVersion",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:GetFunctionDefinitionVersion",
+ "greengrass:GetAssociatedRole",
+ "lambda:CreateFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:UpdateFunctionCode",
+ "lambda:GetFunction",
+ "lambda:UpdateFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:aws-robomaker-*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": "lambda.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOSFFLBBLCTKS3ATC",
+ "PolicyName": "AWSRoboMakerServiceRolePolicy",
+ "UpdateDate": "2018-11-26T05:33:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSRoboMaker_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSRoboMaker_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-10T18:34:18+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "robomaker:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ecr:BatchGetImage",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ecr-public:DescribeImages",
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaFirst": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FACURHLCA",
+ "PolicyName": "AWSRoboMaker_FullAccess",
+ "UpdateDate": "2021-09-16T21:06:10+00:00",
+ "VersionId": "v2"
+ },
+ "AWSSSMOpsInsightsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSSMOpsInsightsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-06-16T20:12:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:CreateOpsItem",
+ "ssm:AddTagsToResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowCreateOpsItem"
+ },
+ {
+ "Action": [
+ "ssm:UpdateOpsItem",
+ "ssm:GetOpsItem"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/SsmOperationalInsight": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowAccessOpsItem"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ITJH2GWAW",
+ "PolicyName": "AWSSSMOpsInsightsServiceRolePolicy",
+ "UpdateDate": "2021-06-16T20:12:52+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSSODirectoryAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSSODirectoryAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-31T23:54:00+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sso-directory:*",
+ "sso:ListDirectoryAssociations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSODirectoryAdministrator"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI2TCZRD7WRD5D2E2Q",
+ "PolicyName": "AWSSSODirectoryAdministrator",
+ "UpdateDate": "2020-08-18T17:17:40+00:00",
+ "VersionId": "v2"
+ },
+ "AWSSSODirectoryReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSSODirectoryReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-31T23:49:32+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sso-directory:Search*",
+ "sso-directory:Describe*",
+ "sso-directory:List*",
+ "sso-directory:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSODirectoryReadOnly"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDPMQELJXZD2NC6JG",
+ "PolicyName": "AWSSSODirectoryReadOnly",
+ "UpdateDate": "2019-11-26T22:37:16+00:00",
+ "VersionId": "v2"
+ },
+ "AWSSSOMasterAccountAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSSOMasterAccountAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-27T20:36:51+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "sso.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/sso.amazonaws.com/AWSServiceRoleForSSO",
+ "Sid": "AWSSSOCreateSLR"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "sso.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/sso.amazonaws.com/AWSServiceRoleForSSO",
+ "Sid": "AWSSSOMasterAccountAdministrator"
+ },
+ {
+ "Action": [
+ "ds:DescribeTrusts",
+ "ds:UnauthorizeApplication",
+ "ds:DescribeDirectories",
+ "ds:AuthorizeApplication",
+ "iam:ListPolicies",
+ "organizations:EnableAWSServiceAccess",
+ "organizations:ListRoots",
+ "organizations:ListAccounts",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListAccountsForParent",
+ "organizations:DescribeOrganization",
+ "organizations:ListChildren",
+ "organizations:DescribeAccount",
+ "organizations:ListParents",
+ "sso:*",
+ "sso-directory:*",
+ "ds:CreateAlias"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSOMemberAccountAdministrator"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIHXAQZIS3GOYIETUC",
+ "PolicyName": "AWSSSOMasterAccountAdministrator",
+ "UpdateDate": "2021-08-04T21:10:42+00:00",
+ "VersionId": "v4"
+ },
+ "AWSSSOMemberAccountAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSSOMemberAccountAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-27T20:45:42+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "ds:AuthorizeApplication",
+ "ds:UnauthorizeApplication",
+ "ds:DescribeTrusts",
+ "iam:ListPolicies",
+ "organizations:EnableAWSServiceAccess",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeAccount",
+ "organizations:ListRoots",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListParents",
+ "organizations:ListChildren",
+ "organizations:ListOrganizationalUnitsForParent",
+ "sso:*",
+ "sso-directory:*",
+ "ds:CreateAlias"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSOMemberAccountAdministrator"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQYHEY7KJWXZFNDPY",
+ "PolicyName": "AWSSSOMemberAccountAdministrator",
+ "UpdateDate": "2021-08-04T20:13:14+00:00",
+ "VersionId": "v3"
+ },
+ "AWSSSOReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSSOReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-27T20:24:34+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "ds:DescribeTrusts",
+ "iam:ListPolicies",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeAccount",
+ "organizations:ListParents",
+ "organizations:ListChildren",
+ "organizations:ListAccounts",
+ "organizations:ListRoots",
+ "organizations:ListAccountsForParent",
+ "organizations:ListOrganizationalUnitsForParent",
+ "sso:Describe*",
+ "sso:Get*",
+ "sso:List*",
+ "sso:Search*",
+ "sso-directory:DescribeDirectory"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSOReadOnly"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBSMEEZXFDMKMY43I",
+ "PolicyName": "AWSSSOReadOnly",
+ "UpdateDate": "2020-09-10T21:26:29+00:00",
+ "VersionId": "v6"
+ },
+ "AWSSSOServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSSOServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-05T18:36:15+00:00",
+ "DefaultVersionId": "v13",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:AttachRolePolicy",
+ "iam:CreateRole",
+ "iam:PutRolePolicy",
+ "iam:UpdateRole",
+ "iam:UpdateRoleDescription",
+ "iam:UpdateAssumeRolePolicy"
+ ],
+ "Condition": {
+ "StringNotEquals": {
+ "aws:PrincipalOrgMasterAccountId": "${aws:PrincipalAccount}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*"
+ ],
+ "Sid": "IAMRoleProvisioningActions"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "IAMRoleReadActions"
+ },
+ {
+ "Action": [
+ "iam:DeleteRole",
+ "iam:DeleteRolePolicy",
+ "iam:DetachRolePolicy",
+ "iam:ListRolePolicies",
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*"
+ ],
+ "Sid": "IAMRoleCleanupActions"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus",
+ "iam:DeleteRole",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/sso.amazonaws.com/AWSServiceRoleForSSO"
+ ],
+ "Sid": "IAMSLRCleanupActions"
+ },
+ {
+ "Action": [
+ "iam:CreateSAMLProvider",
+ "iam:UpdateSAMLProvider"
+ ],
+ "Condition": {
+ "StringNotEquals": {
+ "aws:PrincipalOrgMasterAccountId": "${aws:PrincipalAccount}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:saml-provider/AWSSSO_*"
+ ],
+ "Sid": "IAMSAMLProviderProvisioningActions"
+ },
+ {
+ "Action": [
+ "iam:DeleteSAMLProvider",
+ "iam:GetSAMLProvider"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:saml-provider/AWSSSO_*"
+ ],
+ "Sid": "IAMSAMLProviderCleanupActions"
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ds:UnauthorizeApplication"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowUnauthAppForDirectory"
+ },
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "ds:DescribeTrusts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowDescribeForDirectory"
+ },
+ {
+ "Action": [
+ "identitystore:DescribeUser",
+ "identitystore:DescribeGroup",
+ "identitystore:ListGroups",
+ "identitystore:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowDescribeAndListOperationsOnIdentitySource"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIJ52KSWOD4GI54XP2",
+ "PolicyName": "AWSSSOServiceRolePolicy",
+ "UpdateDate": "2020-11-19T00:02:00+00:00",
+ "VersionId": "v13"
+ },
+ "AWSSavingsPlansFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSavingsPlansFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-06T22:45:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "savingsplans:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NDDOS76AO",
+ "PolicyName": "AWSSavingsPlansFullAccess",
+ "UpdateDate": "2019-11-06T22:45:18+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSavingsPlansReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSavingsPlansReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-06T22:45:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "savingsplans:Describe*",
+ "savingsplans:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OQ26WIHJ5",
+ "PolicyName": "AWSSavingsPlansReadOnlyAccess",
+ "UpdateDate": "2019-11-06T22:45:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSecurityHubFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSecurityHubFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T23:54:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "securityhub:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "securityhub.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4262VZCA4HPBZSO6",
+ "PolicyName": "AWSSecurityHubFullAccess",
+ "UpdateDate": "2018-11-27T23:54:34+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSecurityHubOrganizationsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSecurityHubOrganizationsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-15T20:53:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "organizations:EnableAWSServiceAccess",
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": "securityhub.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:RegisterDelegatedAdministrator",
+ "organizations:DeregisterDelegatedAdministrator"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": "securityhub.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:organizations::*:account/o-*/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KVIUTRVOZ",
+ "PolicyName": "AWSSecurityHubOrganizationsAccess",
+ "UpdateDate": "2021-03-15T20:53:03+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSecurityHubReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSecurityHubReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T01:34:29+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "securityhub:Get*",
+ "securityhub:List*",
+ "securityhub:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIEBAQNOFUCLFJ3UHG",
+ "PolicyName": "AWSSecurityHubReadOnlyAccess",
+ "UpdateDate": "2019-06-25T22:45:52+00:00",
+ "VersionId": "v2"
+ },
+ "AWSSecurityHubServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSecurityHubServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T23:47:51+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:GetEventSelectors",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "logs:DescribeMetricFilters",
+ "sns:ListSubscriptionsByTopic",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:DescribeConfigRules",
+ "config:BatchGetResourceConfig",
+ "config:SelectResourceConfig",
+ "iam:GenerateCredentialReport",
+ "iam:GetCredentialReport",
+ "organizations:ListAccounts",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "config:PutEvaluations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:PutConfigRule",
+ "config:DeleteConfigRule",
+ "config:GetComplianceDetailsByConfigRule",
+ "config:DescribeConfigRuleEvaluationStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/aws-service-rule/*securityhub*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQPCESDDYDLLSOGYO",
+ "PolicyName": "AWSSecurityHubServiceRolePolicy",
+ "UpdateDate": "2021-07-14T20:32:48+00:00",
+ "VersionId": "v9"
+ },
+ "AWSServiceCatalogAdminFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogAdminFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-02-15T17:19:40+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:UpdateStack",
+ "cloudformation:CreateChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:ListChangeSets",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:ListStackResources",
+ "cloudformation:TagResource",
+ "cloudformation:CreateStackSet",
+ "cloudformation:CreateStackInstances",
+ "cloudformation:UpdateStackSet",
+ "cloudformation:UpdateStackInstances",
+ "cloudformation:DeleteStackSet",
+ "cloudformation:DeleteStackInstances",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:ListStackInstances",
+ "cloudformation:ListStackSetOperations",
+ "cloudformation:ListStackSetOperationResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/SC-*",
+ "arn:aws:cloudformation:*:*:stack/StackSet-SC-*",
+ "arn:aws:cloudformation:*:*:changeSet/SC-*",
+ "arn:aws:cloudformation:*:*:stackset/SC-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateUploadBucket",
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:ValidateTemplate",
+ "iam:GetGroup",
+ "iam:GetRole",
+ "iam:GetUser",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "servicecatalog:*",
+ "ssm:DescribeDocument",
+ "ssm:GetAutomationExecution",
+ "ssm:ListDocuments",
+ "ssm:ListDocumentVersions",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "servicecatalog.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWLJU4BZ7AQUJSBVM",
+ "PolicyName": "AWSServiceCatalogAdminFullAccess",
+ "UpdateDate": "2019-02-06T01:57:54+00:00",
+ "VersionId": "v5"
+ },
+ "AWSServiceCatalogAdminReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogAdminReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-25T18:53:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ListChangeSets",
+ "cloudformation:ListStackResources",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:ListStackInstances",
+ "cloudformation:ListStackSetOperations",
+ "cloudformation:ListStackSetOperationResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/SC-*",
+ "arn:aws:cloudformation:*:*:stack/StackSet-SC-*",
+ "arn:aws:cloudformation:*:*:changeSet/SC-*",
+ "arn:aws:cloudformation:*:*:stackset/SC-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "iam:GetGroup",
+ "iam:GetRole",
+ "iam:GetUser",
+ "iam:ListGroups",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "servicecatalog:Get*",
+ "servicecatalog:List*",
+ "servicecatalog:Describe*",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:Search*",
+ "ssm:DescribeDocument",
+ "ssm:GetAutomationExecution",
+ "ssm:ListDocuments",
+ "ssm:ListDocumentVersions",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MC6ZR7YFX",
+ "PolicyName": "AWSServiceCatalogAdminReadOnlyAccess",
+ "UpdateDate": "2019-10-25T18:53:38+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceCatalogAppRegistryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogAppRegistryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-12T22:25:58+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:UpdateStack"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": "servicecatalog-appregistry.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "servicecatalog-appregistry.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/servicecatalog-appregistry.amazonaws.com/AWSServiceRoleForAWSServiceCatalogAppRegistry*"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "servicecatalog:CreateApplication",
+ "servicecatalog:GetApplication",
+ "servicecatalog:UpdateApplication",
+ "servicecatalog:DeleteApplication",
+ "servicecatalog:ListApplications",
+ "servicecatalog:AssociateResource",
+ "servicecatalog:DisassociateResource",
+ "servicecatalog:GetAssociatedResource",
+ "servicecatalog:ListAssociatedResources",
+ "servicecatalog:AssociateAttributeGroup",
+ "servicecatalog:DisassociateAttributeGroup",
+ "servicecatalog:ListAssociatedAttributeGroups",
+ "servicecatalog:CreateAttributeGroup",
+ "servicecatalog:UpdateAttributeGroup",
+ "servicecatalog:DeleteAttributeGroup",
+ "servicecatalog:GetAttributeGroup",
+ "servicecatalog:ListAttributeGroups",
+ "servicecatalog:SyncResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:ListTagsForResource",
+ "servicecatalog:UntagResource",
+ "servicecatalog:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:servicecatalog:*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4N2G3EPAYN",
+ "PolicyName": "AWSServiceCatalogAppRegistryFullAccess",
+ "UpdateDate": "2021-08-24T17:06:03+00:00",
+ "VersionId": "v2"
+ },
+ "AWSServiceCatalogAppRegistryReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogAppRegistryReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-12T22:34:32+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicecatalog:GetApplication",
+ "servicecatalog:ListApplications",
+ "servicecatalog:GetAssociatedResource",
+ "servicecatalog:ListAssociatedResources",
+ "servicecatalog:ListAssociatedAttributeGroups",
+ "servicecatalog:GetAttributeGroup",
+ "servicecatalog:ListAttributeGroups",
+ "servicecatalog:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M3SSCJCST",
+ "PolicyName": "AWSServiceCatalogAppRegistryReadOnlyAccess",
+ "UpdateDate": "2021-08-24T17:03:28+00:00",
+ "VersionId": "v2"
+ },
+ "AWSServiceCatalogAppRegistryServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceCatalogAppRegistryServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-18T22:18:55+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "cloudformation:DescribeStacks",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "resource-groups:CreateGroup",
+ "resource-groups:Tag"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/EnableAWSServiceCatalogAppRegistry": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "resource-groups:DeleteGroup",
+ "resource-groups:UpdateGroup",
+ "resource-groups:GetGroup",
+ "resource-groups:GetTags",
+ "resource-groups:Tag",
+ "resource-groups:Untag",
+ "resource-groups:GetGroupConfiguration"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/EnableAWSServiceCatalogAppRegistry": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H3V4QGJFH",
+ "PolicyName": "AWSServiceCatalogAppRegistryServiceRolePolicy",
+ "UpdateDate": "2022-03-04T21:06:44+00:00",
+ "VersionId": "v3"
+ },
+ "AWSServiceCatalogEndUserFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogEndUserFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-02-15T17:22:32+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:ValidateTemplate",
+ "cloudformation:UpdateStack",
+ "cloudformation:CreateChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:ListChangeSets",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:TagResource",
+ "cloudformation:CreateStackSet",
+ "cloudformation:CreateStackInstances",
+ "cloudformation:UpdateStackSet",
+ "cloudformation:UpdateStackInstances",
+ "cloudformation:DeleteStackSet",
+ "cloudformation:DeleteStackInstances",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:ListStackInstances",
+ "cloudformation:ListStackResources",
+ "cloudformation:ListStackSetOperations",
+ "cloudformation:ListStackSetOperationResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/SC-*",
+ "arn:aws:cloudformation:*:*:stack/StackSet-SC-*",
+ "arn:aws:cloudformation:*:*:changeSet/SC-*",
+ "arn:aws:cloudformation:*:*:stackset/SC-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:ProvisionProduct",
+ "servicecatalog:SearchProducts",
+ "ssm:DescribeDocument",
+ "ssm:GetAutomationExecution",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:DescribeProvisionedProduct",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:ListStackInstancesForProvisionedProduct",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:TerminateProvisionedProduct",
+ "servicecatalog:UpdateProvisionedProduct",
+ "servicecatalog:SearchProvisionedProducts",
+ "servicecatalog:CreateProvisionedProductPlan",
+ "servicecatalog:DescribeProvisionedProductPlan",
+ "servicecatalog:ExecuteProvisionedProductPlan",
+ "servicecatalog:DeleteProvisionedProductPlan",
+ "servicecatalog:ListProvisionedProductPlans",
+ "servicecatalog:ListServiceActionsForProvisioningArtifact",
+ "servicecatalog:ExecuteProvisionedProductServiceAction",
+ "servicecatalog:DescribeServiceActionExecutionParameters"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "servicecatalog:userLevel": "self"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJTLLC4DGDMTZB54M4",
+ "PolicyName": "AWSServiceCatalogEndUserFullAccess",
+ "UpdateDate": "2019-07-10T20:30:52+00:00",
+ "VersionId": "v7"
+ },
+ "AWSServiceCatalogEndUserReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSServiceCatalogEndUserReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-25T18:49:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ListChangeSets",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:DescribeStackInstance",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:ListStackInstances",
+ "cloudformation:ListStackResources",
+ "cloudformation:ListStackSetOperations",
+ "cloudformation:ListStackSetOperationResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/SC-*",
+ "arn:aws:cloudformation:*:*:stack/StackSet-SC-*",
+ "arn:aws:cloudformation:*:*:changeSet/SC-*",
+ "arn:aws:cloudformation:*:*:stackset/SC-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:SearchProducts",
+ "ssm:DescribeDocument",
+ "ssm:GetAutomationExecution",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:DescribeProvisionedProduct",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:ListStackInstancesForProvisionedProduct",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:SearchProvisionedProducts",
+ "servicecatalog:DescribeProvisionedProductPlan",
+ "servicecatalog:ListProvisionedProductPlans",
+ "servicecatalog:ListServiceActionsForProvisioningArtifact",
+ "servicecatalog:DescribeServiceActionExecutionParameters"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "servicecatalog:userLevel": "self"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IWYKXJJED",
+ "PolicyName": "AWSServiceCatalogEndUserReadOnlyAccess",
+ "UpdateDate": "2019-10-25T18:49:34+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceRoleForAmazonEKSNodegroup": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForAmazonEKSNodegroup",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-07T01:34:26+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:DescribeInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:DeleteSecurityGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/eks": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SharedSecurityGroupRelatedPermissions"
+ },
+ {
+ "Action": [
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:DescribeInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:DeleteSecurityGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/eks:nodegroup-name": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EKSCreatedSecurityGroupRelatedPermissions"
+ },
+ {
+ "Action": [
+ "ec2:DeleteLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/eks:nodegroup-name": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LaunchTemplateRelatedPermissions"
+ },
+ {
+ "Action": [
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:TerminateInstanceInAutoScalingGroup",
+ "autoscaling:CompleteLifecycleAction",
+ "autoscaling:PutLifecycleHook",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:EnableMetricsCollection"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:autoscaling:*:*:*:autoScalingGroupName/eks-*",
+ "Sid": "AutoscalingRelatedPermissions"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowAutoscalingToCreateSLR"
+ },
+ {
+ "Action": [
+ "autoscaling:CreateOrUpdateTags",
+ "autoscaling:CreateAutoScalingGroup"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:TagKeys": [
+ "eks",
+ "eks:cluster-name",
+ "eks:nodegroup-name"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowASGCreationByEKS"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowPassRoleToAutoscaling"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowPassRoleToEC2"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "ec2:CreateLaunchTemplate",
+ "ec2:DescribeInstances",
+ "iam:GetInstanceProfile",
+ "ec2:DescribeLaunchTemplates",
+ "autoscaling:DescribeAutoScalingGroups",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:RunInstances",
+ "ec2:DescribeSecurityGroups",
+ "ec2:GetConsoleOutput",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PermissionsToManageResourcesForNodegroups"
+ },
+ {
+ "Action": [
+ "iam:CreateInstanceProfile",
+ "iam:DeleteInstanceProfile",
+ "iam:RemoveRoleFromInstanceProfile",
+ "iam:AddRoleToInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:instance-profile/eks-*",
+ "Sid": "PermissionsToCreateAndManageInstanceProfiles"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "aws:TagKeys": [
+ "eks",
+ "eks:cluster-name",
+ "eks:nodegroup-name",
+ "kubernetes.io/cluster/*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PermissionsToManageEKSAndKubernetesTags"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KH2AAMJJG",
+ "PolicyName": "AWSServiceRoleForAmazonEKSNodegroup",
+ "UpdateDate": "2022-01-14T00:33:26+00:00",
+ "VersionId": "v6"
+ },
+ "AWSServiceRoleForCloudWatchAlarmsActionSSMServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForCloudWatchAlarmsActionSSMServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-01T09:49:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:CreateOpsItem"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M4BX2KX5V",
+ "PolicyName": "AWSServiceRoleForCloudWatchAlarmsActionSSMServiceRolePolicy",
+ "UpdateDate": "2020-10-01T09:49:01+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceRoleForCodeGuru-Profiler": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForCodeGuru-Profiler",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-26T22:04:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowSNSPublishToSendNotifications"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GNVXVLNQT",
+ "PolicyName": "AWSServiceRoleForCodeGuru-Profiler",
+ "UpdateDate": "2020-06-26T22:04:26+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceRoleForEC2ScheduledInstances": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForEC2ScheduledInstances",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-10-12T18:31:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws:ec2sri:scheduledInstanceId"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2sri:scheduledInstanceId": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7Y4TT63D6QBKCY4O",
+ "PolicyName": "AWSServiceRoleForEC2ScheduledInstances",
+ "UpdateDate": "2017-10-12T18:31:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceRoleForImageBuilder": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForImageBuilder",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-29T22:02:13+00:00",
+ "DefaultVersionId": "v16",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": [
+ "EC2 Image Builder",
+ "EC2 Fast Launch"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn",
+ "vmie.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:StopInstances",
+ "ec2:StartInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/CreatedBy": "EC2 Image Builder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CopyImage",
+ "ec2:CreateImage",
+ "ec2:CreateLaunchTemplate",
+ "ec2:DeregisterImage",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:ModifyImageAttribute",
+ "ec2:DescribeImportImageTasks",
+ "ec2:DescribeExportImageTasks",
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/CreatedBy": "EC2 Image Builder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": [
+ "EC2 Image Builder",
+ "EC2 Fast Launch"
+ ],
+ "ec2:CreateAction": [
+ "RunInstances",
+ "CreateImage"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:export-image-task/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": [
+ "EC2 Image Builder",
+ "EC2 Fast Launch"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": [
+ "license-manager:UpdateLicenseSpecificationsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:ListCommands",
+ "ssm:ListCommandInvocations",
+ "ssm:AddTagsToResource",
+ "ssm:DescribeInstanceInformation",
+ "ssm:GetAutomationExecution",
+ "ssm:StopAutomationExecution",
+ "ssm:ListInventoryEntries",
+ "ssm:SendAutomationSignal",
+ "ssm:DescribeInstanceAssociationsStatus",
+ "ssm:DescribeAssociationExecutions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWS-RunPowerShellScript",
+ "arn:aws:ssm:*:*:document/AWS-RunShellScript",
+ "arn:aws:ssm:*:*:document/AWSEC2-RunSysprep",
+ "arn:aws:s3:::*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ssm:resourceTag/CreatedBy": [
+ "EC2 Image Builder"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "ssm:StartAutomationExecution",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:automation-definition/ImageBuilder*"
+ },
+ {
+ "Action": [
+ "ssm:CreateAssociation",
+ "ssm:DeleteAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWS-GatherSoftwareInventory",
+ "arn:aws:ssm:*:*:association/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "kms:Encrypt",
+ "kms:Decrypt",
+ "kms:ReEncryptFrom",
+ "kms:ReEncryptTo",
+ "kms:GenerateDataKeyWithoutPlaintext"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "kms:EncryptionContextKeys": [
+ "aws:ebs:id"
+ ]
+ },
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:CreateGrant",
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": true
+ },
+ "StringLike": {
+ "kms:ViaService": [
+ "ec2.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EC2ImageBuilderDistributionCrossAccountRole"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/imagebuilder/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:ModifyLaunchTemplate",
+ "ec2:DescribeLaunchTemplateVersions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:ExportImage"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/CreatedBy": "EC2 Image Builder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::image/*"
+ },
+ {
+ "Action": [
+ "ec2:ExportImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:export-image-task/*"
+ },
+ {
+ "Action": [
+ "ec2:CancelExportTask"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/CreatedBy": "EC2 Image Builder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:export-image-task/*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "ssm.amazonaws.com",
+ "ec2fastlaunch.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:EnableFastLaunch"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/CreatedBy": "EC2 Image Builder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NE22WISEW",
+ "PolicyName": "AWSServiceRoleForImageBuilder",
+ "UpdateDate": "2022-02-17T00:01:44+00:00",
+ "VersionId": "v16"
+ },
+ "AWSServiceRoleForIoTSiteWise": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForIoTSiteWise",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-14T19:19:17+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "greengrass:GetAssociatedRole",
+ "greengrass:GetCoreDefinition",
+ "greengrass:GetCoreDefinitionVersion",
+ "greengrass:GetGroup",
+ "greengrass:GetGroupVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/iotsitewise*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/iotsitewise*:log-stream:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGQU4DZIQP6HLYQPE",
+ "PolicyName": "AWSServiceRoleForIoTSiteWise",
+ "UpdateDate": "2020-04-25T02:15:01+00:00",
+ "VersionId": "v7"
+ },
+ "AWSServiceRoleForLogDeliveryPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForLogDeliveryPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-04T17:31:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch",
+ "firehose:ListTagsForDeliveryStream"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/LogDeliveryEnabled": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EMA7ANTDG",
+ "PolicyName": "AWSServiceRoleForLogDeliveryPolicy",
+ "UpdateDate": "2021-07-15T20:07:44+00:00",
+ "VersionId": "v3"
+ },
+ "AWSServiceRoleForMonitronPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForMonitronPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-02T19:06:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sso:GetManagedApplicationInstance",
+ "sso:GetProfile",
+ "sso:ListProfiles",
+ "sso:AssociateProfile",
+ "sso:ListDirectoryAssociations",
+ "sso-directory:DescribeUsers",
+ "sso-directory:SearchUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NYRIH2RCH",
+ "PolicyName": "AWSServiceRoleForMonitronPolicy",
+ "UpdateDate": "2020-12-02T19:06:08+00:00",
+ "VersionId": "v1"
+ },
+ "AWSServiceRoleForSMS": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRoleForSMS",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-06T18:39:29+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateChangeSet",
+ "cloudformation:CreateStack"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "cloudformation:ResourceTypes": [
+ "AWS::EC2::Instance",
+ "AWS::ApplicationInsights::Application",
+ "AWS::ResourceGroups::Group"
+ ]
+ },
+ "Null": {
+ "cloudformation:ResourceTypes": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ },
+ {
+ "Action": [
+ "cloudformation:DeleteStack",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:GetTemplate"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ },
+ {
+ "Action": [
+ "cloudformation:ValidateTemplate",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutLifecycleConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::sms-app-*"
+ },
+ {
+ "Action": [
+ "sms:CreateReplicationJob",
+ "sms:DeleteReplicationJob",
+ "sms:GetReplicationJobs",
+ "sms:GetReplicationRuns",
+ "sms:GetServers",
+ "sms:ImportServerCatalog",
+ "sms:StartOnDemandReplicationRun",
+ "sms:UpdateReplicationJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*::document/AWS-RunRemoteScript",
+ "arn:aws:s3:::sms-app-*"
+ ]
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Condition": {
+ "StringEquals": {
+ "ssm:resourceTag/UseForSMSApplicationValidation": [
+ "true"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CopySnapshot"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": "ec2:CopySnapshot",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/SMSJobId": [
+ "sms-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/SMSJobId": [
+ "sms-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CopyImage",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSnapshotAttribute",
+ "ec2:DeregisterImage",
+ "ec2:ImportImage",
+ "ec2:DescribeImportImageTasks",
+ "ec2:GetEbsEncryptionByDefault"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:AssociateIamInstanceProfile",
+ "ec2:ReplaceIamInstanceProfileAssociation"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": "cloudformation.amazonaws.com"
+ },
+ "StringLike": {
+ "iam:AssociatedResourceArn": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifyInstanceAttribute",
+ "ec2:StopInstances",
+ "ec2:StartInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "applicationinsights:Describe*",
+ "applicationinsights:List*",
+ "cloudformation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "applicationinsights:CreateApplication",
+ "applicationinsights:CreateComponent",
+ "applicationinsights:UpdateApplication",
+ "applicationinsights:DeleteApplication",
+ "applicationinsights:UpdateComponentConfiguration",
+ "applicationinsights:DeleteComponent"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:applicationinsights:*:*:application/resource-group/sms-app-*"
+ },
+ {
+ "Action": [
+ "resource-groups:CreateGroup",
+ "resource-groups:GetGroup",
+ "resource-groups:UpdateGroup",
+ "resource-groups:DeleteGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:resource-groups:*:*:group/sms-app-*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "application-insights.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/application-insights.amazonaws.com/AWSServiceRoleForApplicationInsights"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OSYRD2VJZ",
+ "PolicyName": "AWSServiceRoleForSMS",
+ "UpdateDate": "2020-10-15T17:28:13+00:00",
+ "VersionId": "v10"
+ },
+ "AWSServiceRolePolicyForBackupReports": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSServiceRolePolicyForBackupReports",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-19T21:16:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "backup:DescribeFramework",
+ "backup:ListBackupJobs",
+ "backup:ListRestoreJobs",
+ "backup:ListCopyJobs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:BatchGetResourceConfig",
+ "config:SelectResourceConfig",
+ "config:DescribeConfigurationAggregators",
+ "config:SelectAggregateResourceConfig",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:GetComplianceDetailsByConfigRule",
+ "config:DescribeConfigRuleEvaluationStatus",
+ "config:DescribeConfigRules",
+ "config:PutConfigRule",
+ "config:DeleteConfigRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/aws-service-rule/backup.amazonaws.com*"
+ },
+ {
+ "Action": [
+ "config:DeleteConfigurationAggregator",
+ "config:PutConfigurationAggregator"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-aggregator/aws-service-config-aggregator/backup.amazonaws.com*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MSKXNYMTU",
+ "PolicyName": "AWSServiceRolePolicyForBackupReports",
+ "UpdateDate": "2021-08-19T21:16:45+00:00",
+ "VersionId": "v1"
+ },
+ "AWSShieldDRTAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSShieldDRTAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-05T22:29:39+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudfront:List*",
+ "route53:List*",
+ "elasticloadbalancing:Describe*",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cloudfront:GetDistribution*",
+ "globalaccelerator:ListAccelerators",
+ "globalaccelerator:DescribeAccelerator",
+ "ec2:DescribeRegions",
+ "ec2:DescribeAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SRTAccessProtectedResources"
+ },
+ {
+ "Action": [
+ "shield:*",
+ "waf:*",
+ "wafv2:*",
+ "waf-regional:*",
+ "elasticloadbalancing:SetWebACL",
+ "cloudfront:UpdateDistribution",
+ "apigateway:SetWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SRTManageProtections"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWNCSZ4PARLO37VVY",
+ "PolicyName": "AWSShieldDRTAccessPolicy",
+ "UpdateDate": "2020-12-15T17:28:15+00:00",
+ "VersionId": "v6"
+ },
+ "AWSShieldServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSShieldServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T19:17:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "wafv2:GetWebACL",
+ "wafv2:UpdateWebACL",
+ "wafv2:GetWebACLForResource",
+ "wafv2:ListResourcesForWebACL",
+ "cloudfront:ListDistributions",
+ "cloudfront:GetDistribution"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSShield"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LW6EWPBMS",
+ "PolicyName": "AWSShieldServiceRolePolicy",
+ "UpdateDate": "2021-11-17T19:17:46+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStepFunctionsConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-11T21:54:31+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "states:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/StatesExecutionRole*"
+ },
+ {
+ "Action": "lambda:ListFunctions",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJIYC52YWRX6OSMJWK",
+ "PolicyName": "AWSStepFunctionsConsoleFullAccess",
+ "UpdateDate": "2017-01-12T00:19:34+00:00",
+ "VersionId": "v2"
+ },
+ "AWSStepFunctionsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-11T21:51:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "states:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXKA6VP3UFBVHDPPA",
+ "PolicyName": "AWSStepFunctionsFullAccess",
+ "UpdateDate": "2017-01-11T21:51:32+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStepFunctionsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-11T21:46:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "states:ListStateMachines",
+ "states:ListActivities",
+ "states:DescribeStateMachine",
+ "states:DescribeStateMachineForExecution",
+ "states:ListExecutions",
+ "states:DescribeExecution",
+ "states:GetExecutionHistory",
+ "states:DescribeActivity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJONHB2TJQDJPFW5TM",
+ "PolicyName": "AWSStepFunctionsReadOnlyAccess",
+ "UpdateDate": "2017-11-10T22:03:49+00:00",
+ "VersionId": "v2"
+ },
+ "AWSStorageGatewayFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStorageGatewayFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "storagegateway:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots",
+ "ec2:DeleteSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJG5SSPAVOGK3SIDGU",
+ "PolicyName": "AWSStorageGatewayFullAccess",
+ "UpdateDate": "2015-02-06T18:41:09+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStorageGatewayReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSStorageGatewayReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "storagegateway:List*",
+ "storagegateway:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSnapshots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFKCTUVOPD5NICXJK",
+ "PolicyName": "AWSStorageGatewayReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:10+00:00",
+ "VersionId": "v1"
+ },
+ "AWSStorageGatewayServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSStorageGatewayServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T19:03:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "fsx:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:fsx:*:*:backup/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4E4ZEKWU2U",
+ "PolicyName": "AWSStorageGatewayServiceRolePolicy",
+ "UpdateDate": "2021-02-17T19:03:19+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSupportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSSupportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "support:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJSNKQX2OW67GF4S7E",
+ "PolicyName": "AWSSupportAccess",
+ "UpdateDate": "2015-02-06T18:41:11+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSupportServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSupportServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-04-19T18:04:44+00:00",
+ "DefaultVersionId": "v21",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/account",
+ "arn:aws:apigateway:*::/apis",
+ "arn:aws:apigateway:*::/apis/*",
+ "arn:aws:apigateway:*::/apis/*/authorizers",
+ "arn:aws:apigateway:*::/apis/*/authorizers/*",
+ "arn:aws:apigateway:*::/apis/*/deployments",
+ "arn:aws:apigateway:*::/apis/*/deployments/*",
+ "arn:aws:apigateway:*::/apis/*/integrations",
+ "arn:aws:apigateway:*::/apis/*/integrations/*",
+ "arn:aws:apigateway:*::/apis/*/integrations/*/integrationresponses",
+ "arn:aws:apigateway:*::/apis/*/integrations/*/integrationresponses/*",
+ "arn:aws:apigateway:*::/apis/*/models",
+ "arn:aws:apigateway:*::/apis/*/models/*",
+ "arn:aws:apigateway:*::/apis/*/routes",
+ "arn:aws:apigateway:*::/apis/*/routes/*",
+ "arn:aws:apigateway:*::/apis/*/routes/*/routeresponses",
+ "arn:aws:apigateway:*::/apis/*/routes/*/routeresponses/*",
+ "arn:aws:apigateway:*::/apis/*/stages",
+ "arn:aws:apigateway:*::/apis/*/stages/*",
+ "arn:aws:apigateway:*::/clientcertificates",
+ "arn:aws:apigateway:*::/clientcertificates/*",
+ "arn:aws:apigateway:*::/domainnames",
+ "arn:aws:apigateway:*::/domainnames/*",
+ "arn:aws:apigateway:*::/domainnames/*/apimappings",
+ "arn:aws:apigateway:*::/domainnames/*/apimappings/*",
+ "arn:aws:apigateway:*::/domainnames/*/basepathmappings",
+ "arn:aws:apigateway:*::/domainnames/*/basepathmappings/*",
+ "arn:aws:apigateway:*::/restapis",
+ "arn:aws:apigateway:*::/restapis/*",
+ "arn:aws:apigateway:*::/restapis/*/authorizers",
+ "arn:aws:apigateway:*::/restapis/*/authorizers/*",
+ "arn:aws:apigateway:*::/restapis/*/deployments",
+ "arn:aws:apigateway:*::/restapis/*/deployments/*",
+ "arn:aws:apigateway:*::/restapis/*/models",
+ "arn:aws:apigateway:*::/restapis/*/models/*",
+ "arn:aws:apigateway:*::/restapis/*/models/*/default_template",
+ "arn:aws:apigateway:*::/restapis/*/resources",
+ "arn:aws:apigateway:*::/restapis/*/resources/*",
+ "arn:aws:apigateway:*::/restapis/*/resources/*/methods/*/integration/responses/*",
+ "arn:aws:apigateway:*::/restapis/*/resources/*/methods/*/responses/*",
+ "arn:aws:apigateway:*::/restapis/*/stages/*/sdks/*",
+ "arn:aws:apigateway:*::/restapis/*/resources/*/methods/*",
+ "arn:aws:apigateway:*::/restapis/*/resources/*/methods/*/integration",
+ "arn:aws:apigateway:*::/restapis/*/stages",
+ "arn:aws:apigateway:*::/restapis/*/stages/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DeleteRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/support.amazonaws.com/AWSServiceRoleForSupport"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:getDevice",
+ "a4b:getProfile",
+ "a4b:getRoom",
+ "a4b:getRoomSkillParameter",
+ "a4b:getSkillGroup",
+ "a4b:searchDevices",
+ "a4b:searchProfiles",
+ "a4b:searchRooms",
+ "a4b:searchSkillGroups",
+ "access-analyzer:getFinding",
+ "access-analyzer:listAnalyzers",
+ "access-analyzer:listArchiveRules",
+ "access-analyzer:listFindings",
+ "acm-pca:describeCertificateAuthority",
+ "acm-pca:describeCertificateAuthorityAuditReport",
+ "acm-pca:getCertificate",
+ "acm-pca:getCertificateAuthorityCertificate",
+ "acm-pca:getCertificateAuthorityCsr",
+ "acm-pca:listCertificateAuthorities",
+ "acm-pca:listTags",
+ "acm:describeCertificate",
+ "acm:getCertificate",
+ "acm:listCertificates",
+ "acm:listTagsForCertificate",
+ "airflow:getEnvironment",
+ "airflow:listEnvironments",
+ "airflow:listTagsForResource",
+ "amplify:getApp",
+ "amplify:getBranch",
+ "amplify:getDomainAssociation",
+ "amplify:getJob",
+ "amplify:getWebhook",
+ "amplify:listApps",
+ "amplify:listWebhooks",
+ "appflow:describeConnectorEntity",
+ "appflow:describeConnectorProfiles",
+ "appflow:describeConnectors",
+ "appflow:describeFlow",
+ "appflow:describeFlowExecutionRecords",
+ "appflow:listConnectorEntities",
+ "appflow:listFlows",
+ "application-autoscaling:describeScalableTargets",
+ "application-autoscaling:describeScalingActivities",
+ "application-autoscaling:describeScalingPolicies",
+ "application-autoscaling:describeScheduledActions",
+ "applicationinsights:describeComponentConfiguration",
+ "applicationinsights:describeComponentConfigurationRecommendation",
+ "applicationinsights:listApplications",
+ "applicationinsights:listComponents",
+ "applicationinsights:listConfigurationHistory",
+ "applicationinsights:listLogPatterns",
+ "applicationinsights:listLogPatternSets",
+ "appmesh:describeGatewayRoute",
+ "appmesh:describeMesh",
+ "appmesh:describeRoute",
+ "appmesh:describeVirtualGateway",
+ "appmesh:describeVirtualNode",
+ "appmesh:describeVirtualRouter",
+ "appmesh:describeVirtualService",
+ "appmesh:listGatewayRoutes",
+ "appmesh:listMeshes",
+ "appmesh:listRoutes",
+ "appmesh:listTagsForResource",
+ "appmesh:listVirtualGateways",
+ "appmesh:listVirtualNodes",
+ "appmesh:listVirtualRouters",
+ "appmesh:listVirtualServices",
+ "apprunner:describeAutoScalingConfiguration",
+ "apprunner:describeCustomDomains",
+ "apprunner:describeOperation",
+ "apprunner:describeService",
+ "apprunner:listAutoScalingConfigurations",
+ "apprunner:listConnections",
+ "apprunner:listOperations",
+ "apprunner:listServices",
+ "apprunner:listTagsForResource",
+ "appstream:describeDirectoryConfigs",
+ "appstream:describeFleets",
+ "appstream:describeImageBuilders",
+ "appstream:describeImages",
+ "appstream:describeSessions",
+ "appstream:describeStacks",
+ "appstream:listAssociatedFleets",
+ "appstream:listAssociatedStacks",
+ "appstream:listTagsForResource",
+ "appsync:getFunction",
+ "appsync:getGraphqlApi",
+ "appsync:getIntrospectionSchema",
+ "appsync:getResolver",
+ "appsync:getSchemaCreationStatus",
+ "appsync:getType",
+ "appsync:listDataSources",
+ "appsync:listFunctions",
+ "appsync:listGraphqlApis",
+ "appsync:listResolvers",
+ "appsync:listTypes",
+ "athena:batchGetNamedQuery",
+ "athena:batchGetQueryExecution",
+ "athena:getNamedQuery",
+ "athena:getQueryExecution",
+ "athena:getWorkGroup",
+ "athena:listNamedQueries",
+ "athena:listQueryExecutions",
+ "athena:listTagsForResource",
+ "athena:listWorkGroups",
+ "auditmanager:getAccountStatus",
+ "auditmanager:getDelegations",
+ "auditmanager:listAssessmentFrameworks",
+ "auditmanager:listAssessmentReports",
+ "auditmanager:listAssessments",
+ "auditmanager:listControls",
+ "auditmanager:listKeywordsForDataSource",
+ "auditmanager:listNotifications",
+ "autoscaling-plans:describeScalingPlanResources",
+ "autoscaling-plans:describeScalingPlans",
+ "autoscaling-plans:getScalingPlanResourceForecastData",
+ "autoscaling:describeAccountLimits",
+ "autoscaling:describeAdjustmentTypes",
+ "autoscaling:describeAutoScalingGroups",
+ "autoscaling:describeAutoScalingInstances",
+ "autoscaling:describeAutoScalingNotificationTypes",
+ "autoscaling:describeInstanceRefreshes",
+ "autoscaling:describeLaunchConfigurations",
+ "autoscaling:describeLifecycleHooks",
+ "autoscaling:describeLifecycleHookTypes",
+ "autoscaling:describeLoadBalancers",
+ "autoscaling:describeLoadBalancerTargetGroups",
+ "autoscaling:describeMetricCollectionTypes",
+ "autoscaling:describeNotificationConfigurations",
+ "autoscaling:describePolicies",
+ "autoscaling:describeScalingActivities",
+ "autoscaling:describeScalingProcessTypes",
+ "autoscaling:describeScheduledActions",
+ "autoscaling:describeTags",
+ "autoscaling:describeTerminationPolicyTypes",
+ "backup:describeBackupJob",
+ "backup:describeBackupVault",
+ "backup:describeProtectedResource",
+ "backup:describeRecoveryPoint",
+ "backup:describeRestoreJob",
+ "backup:getBackupPlan",
+ "backup:getBackupPlanFromJSON",
+ "backup:getBackupPlanFromTemplate",
+ "backup:getBackupSelection",
+ "backup:getBackupVaultAccessPolicy",
+ "backup:getBackupVaultNotifications",
+ "backup:getRecoveryPointRestoreMetadata",
+ "backup:getSupportedResourceTypes",
+ "backup:listBackupJobs",
+ "backup:listBackupPlans",
+ "backup:listBackupPlanTemplates",
+ "backup:listBackupPlanVersions",
+ "backup:listBackupSelections",
+ "backup:listBackupVaults",
+ "backup:listProtectedResources",
+ "backup:listRecoveryPointsByBackupVault",
+ "backup:listRecoveryPointsByResource",
+ "backup:listRestoreJobs",
+ "backup:listTags",
+ "batch:describeComputeEnvironments",
+ "batch:describeJobDefinitions",
+ "batch:describeJobQueues",
+ "batch:describeJobs",
+ "batch:listJobs",
+ "braket:getDevice",
+ "braket:getQuantumTask",
+ "braket:searchDevices",
+ "braket:searchQuantumTasks",
+ "budgets:viewBudget",
+ "ce:getCostAndUsage",
+ "ce:getCostAndUsageWithResources",
+ "ce:getCostForecast",
+ "ce:getDimensionValues",
+ "ce:getReservationCoverage",
+ "ce:getReservationPurchaseRecommendation",
+ "ce:getReservationUtilization",
+ "ce:getRightsizingRecommendation",
+ "ce:getSavingsPlansCoverage",
+ "ce:getSavingsPlansPurchaseRecommendation",
+ "ce:getSavingsPlansUtilization",
+ "ce:getSavingsPlansUtilizationDetails",
+ "ce:getTags",
+ "cloud9:describeEnvironmentMemberships",
+ "cloud9:describeEnvironments",
+ "cloud9:listEnvironments",
+ "clouddirectory:getDirectory",
+ "clouddirectory:listDirectories",
+ "cloudformation:batchDescribeTypeConfigurations",
+ "cloudformation:describeAccountLimits",
+ "cloudformation:describeChangeSet",
+ "cloudformation:describePublisher",
+ "cloudformation:describeStackEvents",
+ "cloudformation:describeStackInstance",
+ "cloudformation:describeStackResource",
+ "cloudformation:describeStackResources",
+ "cloudformation:describeStacks",
+ "cloudformation:describeStackSet",
+ "cloudformation:describeStackSetOperation",
+ "cloudformation:describeTypeRegistration",
+ "cloudformation:estimateTemplateCost",
+ "cloudformation:getStackPolicy",
+ "cloudformation:getTemplate",
+ "cloudformation:getTemplateSummary",
+ "cloudformation:listChangeSets",
+ "cloudformation:listExports",
+ "cloudformation:listImports",
+ "cloudformation:listStackInstances",
+ "cloudformation:listStackResources",
+ "cloudformation:listStacks",
+ "cloudformation:listStackSetOperationResults",
+ "cloudformation:listStackSetOperations",
+ "cloudformation:listStackSets",
+ "cloudformation:listTypeRegistrations",
+ "cloudformation:listTypes",
+ "cloudformation:listTypeVersions",
+ "cloudfront:getCloudFrontOriginAccessIdentity",
+ "cloudfront:getCloudFrontOriginAccessIdentityConfig",
+ "cloudfront:getDistribution",
+ "cloudfront:getDistributionConfig",
+ "cloudfront:getInvalidation",
+ "cloudfront:getStreamingDistribution",
+ "cloudfront:getStreamingDistributionConfig",
+ "cloudfront:listCloudFrontOriginAccessIdentities",
+ "cloudfront:listDistributions",
+ "cloudfront:listDistributionsByWebACLId",
+ "cloudfront:listInvalidations",
+ "cloudfront:listStreamingDistributions",
+ "cloudhsm:describeBackups",
+ "cloudhsm:describeClusters",
+ "cloudsearch:describeAnalysisSchemes",
+ "cloudsearch:describeAvailabilityOptions",
+ "cloudsearch:describeDomains",
+ "cloudsearch:describeExpressions",
+ "cloudsearch:describeIndexFields",
+ "cloudsearch:describeScalingParameters",
+ "cloudsearch:describeServiceAccessPolicies",
+ "cloudsearch:describeSuggesters",
+ "cloudsearch:listDomainNames",
+ "cloudtrail:describeTrails",
+ "cloudtrail:getEventSelectors",
+ "cloudtrail:getInsightSelectors",
+ "cloudtrail:getTrail",
+ "cloudtrail:getTrailStatus",
+ "cloudtrail:listPublicKeys",
+ "cloudtrail:listTags",
+ "cloudtrail:listTrails",
+ "cloudtrail:lookupEvents",
+ "cloudwatch:describeAlarmHistory",
+ "cloudwatch:describeAlarms",
+ "cloudwatch:describeAlarmsForMetric",
+ "cloudwatch:describeAnomalyDetectors",
+ "cloudwatch:describeInsightRules",
+ "cloudwatch:getDashboard",
+ "cloudwatch:getInsightRuleReport",
+ "cloudwatch:getMetricData",
+ "cloudwatch:getMetricStatistics",
+ "cloudwatch:listDashboards",
+ "cloudwatch:listMetrics",
+ "codeartifact:describeDomain",
+ "codeartifact:describePackageVersion",
+ "codeartifact:describeRepository",
+ "codeartifact:getDomainPermissionsPolicy",
+ "codeartifact:getRepositoryEndpoint",
+ "codeartifact:getRepositoryPermissionsPolicy",
+ "codeartifact:listDomains",
+ "codeartifact:listPackages",
+ "codeartifact:listPackageVersionAssets",
+ "codeartifact:listPackageVersions",
+ "codeartifact:listRepositories",
+ "codeartifact:listRepositoriesInDomain",
+ "codebuild:batchGetBuildBatches",
+ "codebuild:batchGetBuilds",
+ "codebuild:batchGetProjects",
+ "codebuild:listBuildBatches",
+ "codebuild:listBuildBatchesForProject",
+ "codebuild:listBuilds",
+ "codebuild:listBuildsForProject",
+ "codebuild:listCuratedEnvironmentImages",
+ "codebuild:listProjects",
+ "codebuild:listSourceCredentials",
+ "codecommit:batchGetRepositories",
+ "codecommit:getBranch",
+ "codecommit:getRepository",
+ "codecommit:getRepositoryTriggers",
+ "codecommit:listBranches",
+ "codecommit:listRepositories",
+ "codedeploy:batchGetApplicationRevisions",
+ "codedeploy:batchGetApplications",
+ "codedeploy:batchGetDeploymentGroups",
+ "codedeploy:batchGetDeploymentInstances",
+ "codedeploy:batchGetDeployments",
+ "codedeploy:batchGetDeploymentTargets",
+ "codedeploy:batchGetOnPremisesInstances",
+ "codedeploy:getApplication",
+ "codedeploy:getApplicationRevision",
+ "codedeploy:getDeployment",
+ "codedeploy:getDeploymentConfig",
+ "codedeploy:getDeploymentGroup",
+ "codedeploy:getDeploymentInstance",
+ "codedeploy:getDeploymentTarget",
+ "codedeploy:getOnPremisesInstance",
+ "codedeploy:listApplicationRevisions",
+ "codedeploy:listApplications",
+ "codedeploy:listDeploymentConfigs",
+ "codedeploy:listDeploymentGroups",
+ "codedeploy:listDeploymentInstances",
+ "codedeploy:listDeployments",
+ "codedeploy:listDeploymentTargets",
+ "codedeploy:listGitHubAccountTokenNames",
+ "codedeploy:listOnPremisesInstances",
+ "codepipeline:getJobDetails",
+ "codepipeline:getPipeline",
+ "codepipeline:getPipelineExecution",
+ "codepipeline:getPipelineState",
+ "codepipeline:listActionExecutions",
+ "codepipeline:listActionTypes",
+ "codepipeline:listPipelineExecutions",
+ "codepipeline:listPipelines",
+ "codepipeline:listWebhooks",
+ "codestar:describeProject",
+ "codestar:listProjects",
+ "codestar:listResources",
+ "codestar:listTeamMembers",
+ "codestar:listUserProfiles",
+ "cognito-identity:describeIdentityPool",
+ "cognito-identity:getIdentityPoolRoles",
+ "cognito-identity:listIdentities",
+ "cognito-identity:listIdentityPools",
+ "cognito-idp:describeIdentityProvider",
+ "cognito-idp:describeResourceServer",
+ "cognito-idp:describeRiskConfiguration",
+ "cognito-idp:describeUserImportJob",
+ "cognito-idp:describeUserPool",
+ "cognito-idp:describeUserPoolClient",
+ "cognito-idp:describeUserPoolDomain",
+ "cognito-idp:getGroup",
+ "cognito-idp:getUICustomization",
+ "cognito-idp:getUserPoolMfaConfig",
+ "cognito-idp:listGroups",
+ "cognito-idp:listIdentityProviders",
+ "cognito-idp:listResourceServers",
+ "cognito-idp:listUserImportJobs",
+ "cognito-idp:listUserPoolClients",
+ "cognito-idp:listUserPools",
+ "cognito-sync:describeDataset",
+ "cognito-sync:describeIdentityPoolUsage",
+ "cognito-sync:describeIdentityUsage",
+ "cognito-sync:getCognitoEvents",
+ "cognito-sync:getIdentityPoolConfiguration",
+ "cognito-sync:listDatasets",
+ "cognito-sync:listIdentityPoolUsage",
+ "compute-optimizer:getAutoScalingGroupRecommendations",
+ "compute-optimizer:getEBSVolumeRecommendations",
+ "compute-optimizer:getEC2InstanceRecommendations",
+ "compute-optimizer:getEC2RecommendationProjectedMetrics",
+ "compute-optimizer:getEnrollmentStatus",
+ "compute-optimizer:getRecommendationSummaries",
+ "config:batchGetAggregateResourceConfig",
+ "config:batchGetResourceConfig",
+ "config:describeAggregateComplianceByConfigRules",
+ "config:describeAggregationAuthorizations",
+ "config:describeComplianceByConfigRule",
+ "config:describeComplianceByResource",
+ "config:describeConfigRuleEvaluationStatus",
+ "config:describeConfigRules",
+ "config:describeConfigurationAggregators",
+ "config:describeConfigurationAggregatorSourcesStatus",
+ "config:describeConfigurationRecorders",
+ "config:describeConfigurationRecorderStatus",
+ "config:describeConformancePackCompliance",
+ "config:describeConformancePacks",
+ "config:describeConformancePackStatus",
+ "config:describeDeliveryChannels",
+ "config:describeDeliveryChannelStatus",
+ "config:describeOrganizationConfigRules",
+ "config:describeOrganizationConfigRuleStatuses",
+ "config:describeOrganizationConformancePacks",
+ "config:describeOrganizationConformancePackStatuses",
+ "config:describePendingAggregationRequests",
+ "config:describeRemediationConfigurations",
+ "config:describeRemediationExceptions",
+ "config:describeRemediationExecutionStatus",
+ "config:describeRetentionConfigurations",
+ "config:getAggregateComplianceDetailsByConfigRule",
+ "config:getAggregateConfigRuleComplianceSummary",
+ "config:getAggregateDiscoveredResourceCounts",
+ "config:getAggregateResourceConfig",
+ "config:getComplianceDetailsByConfigRule",
+ "config:getComplianceDetailsByResource",
+ "config:getComplianceSummaryByConfigRule",
+ "config:getComplianceSummaryByResourceType",
+ "config:getConformancePackComplianceDetails",
+ "config:getConformancePackComplianceSummary",
+ "config:getDiscoveredResourceCounts",
+ "config:getOrganizationConfigRuleDetailedStatus",
+ "config:getOrganizationConformancePackDetailedStatus",
+ "config:getResourceConfigHistory",
+ "config:listAggregateDiscoveredResources",
+ "config:listDiscoveredResources",
+ "config:listTagsForResource",
+ "connect:describeUser",
+ "connect:getCurrentMetricData",
+ "connect:getMetricData",
+ "connect:listRoutingProfiles",
+ "connect:listSecurityProfiles",
+ "connect:listUsers",
+ "controltower:describeAccountFactoryConfig",
+ "controltower:describeCoreService",
+ "controltower:describeGuardrail",
+ "controltower:describeGuardrailForTarget",
+ "controltower:describeManagedAccount",
+ "controltower:describeSingleSignOn",
+ "controltower:getAvailableUpdates",
+ "controltower:getHomeRegion",
+ "controltower:getLandingZoneStatus",
+ "controltower:listDirectoryGroups",
+ "controltower:listGuardrailsForTarget",
+ "controltower:listGuardrailViolations",
+ "controltower:listManagedAccounts",
+ "controltower:listManagedAccountsForGuardrail",
+ "controltower:listManagedAccountsForParent",
+ "controltower:listManagedOrganizationalUnits",
+ "controltower:listManagedOrganizationalUnitsForGuardrail",
+ "databrew:describeDataset",
+ "databrew:describeJob",
+ "databrew:describeProject",
+ "databrew:describeRecipe",
+ "databrew:listDatasets",
+ "databrew:listJobRuns",
+ "databrew:listJobs",
+ "databrew:listProjects",
+ "databrew:listRecipes",
+ "databrew:listRecipeVersions",
+ "databrew:listTagsForResource",
+ "datapipeline:describeObjects",
+ "datapipeline:describePipelines",
+ "datapipeline:getPipelineDefinition",
+ "datapipeline:listPipelines",
+ "datapipeline:queryObjects",
+ "datasync:describeAgent",
+ "datasync:describeLocationEfs",
+ "datasync:describeLocationFsxWindows",
+ "datasync:describeLocationNfs",
+ "datasync:describeLocationObjectStorage",
+ "datasync:describeLocationS3",
+ "datasync:describeLocationSmb",
+ "datasync:describeTask",
+ "datasync:describeTaskExecution",
+ "datasync:listAgents",
+ "datasync:listLocations",
+ "datasync:listTaskExecutions",
+ "datasync:listTasks",
+ "dax:describeClusters",
+ "dax:describeDefaultParameters",
+ "dax:describeEvents",
+ "dax:describeParameterGroups",
+ "dax:describeParameters",
+ "dax:describeSubnetGroups",
+ "detective:getMembers",
+ "detective:listGraphs",
+ "detective:listInvitations",
+ "detective:listMembers",
+ "devicefarm:getAccountSettings",
+ "devicefarm:getDevice",
+ "devicefarm:getDevicePool",
+ "devicefarm:getDevicePoolCompatibility",
+ "devicefarm:getJob",
+ "devicefarm:getProject",
+ "devicefarm:getRemoteAccessSession",
+ "devicefarm:getRun",
+ "devicefarm:getSuite",
+ "devicefarm:getTest",
+ "devicefarm:getTestGridProject",
+ "devicefarm:getTestGridSession",
+ "devicefarm:getUpload",
+ "devicefarm:listArtifacts",
+ "devicefarm:listDevicePools",
+ "devicefarm:listDevices",
+ "devicefarm:listJobs",
+ "devicefarm:listProjects",
+ "devicefarm:listRemoteAccessSessions",
+ "devicefarm:listRuns",
+ "devicefarm:listSamples",
+ "devicefarm:listSuites",
+ "devicefarm:listTestGridProjects",
+ "devicefarm:listTestGridSessionActions",
+ "devicefarm:listTestGridSessionArtifacts",
+ "devicefarm:listTestGridSessions",
+ "devicefarm:listTests",
+ "devicefarm:listUniqueProblems",
+ "devicefarm:listUploads",
+ "directconnect:describeConnections",
+ "directconnect:describeConnectionsOnInterconnect",
+ "directconnect:describeInterconnects",
+ "directconnect:describeLocations",
+ "directconnect:describeVirtualGateways",
+ "directconnect:describeVirtualInterfaces",
+ "dlm:getLifecyclePolicies",
+ "dlm:getLifecyclePolicy",
+ "dms:describeAccountAttributes",
+ "dms:describeConnections",
+ "dms:describeEndpoints",
+ "dms:describeEndpointTypes",
+ "dms:describeOrderableReplicationInstances",
+ "dms:describeRefreshSchemasStatus",
+ "dms:describeReplicationInstances",
+ "dms:describeReplicationSubnetGroups",
+ "drs:describeJobLogItems",
+ "drs:describeJobs",
+ "drs:describeRecoveryInstances",
+ "drs:describeRecoverySnapshots",
+ "drs:describeReplicationConfigurationTemplates",
+ "drs:describeSourceServers",
+ "drs:getLaunchConfiguration",
+ "drs:getReplicationConfiguration",
+ "ds:describeConditionalForwarders",
+ "ds:describeDirectories",
+ "ds:describeEventTopics",
+ "ds:describeSnapshots",
+ "ds:describeTrusts",
+ "ds:getDirectoryLimits",
+ "ds:getSnapshotLimits",
+ "ds:listIpRoutes",
+ "ds:listSchemaExtensions",
+ "ds:listTagsForResource",
+ "dynamodb:describeBackup",
+ "dynamodb:describeContinuousBackups",
+ "dynamodb:describeGlobalTable",
+ "dynamodb:describeLimits",
+ "dynamodb:describeStream",
+ "dynamodb:describeTable",
+ "dynamodb:describeTimeToLive",
+ "dynamodb:listBackups",
+ "dynamodb:listGlobalTables",
+ "dynamodb:listStreams",
+ "dynamodb:listTables",
+ "dynamodb:listTagsOfResource",
+ "ec2:describeAccountAttributes",
+ "ec2:describeAddresses",
+ "ec2:describeAvailabilityZones",
+ "ec2:describeBundleTasks",
+ "ec2:describeByoipCidrs",
+ "ec2:describeCapacityReservations",
+ "ec2:describeClassicLinkInstances",
+ "ec2:describeClientVpnAuthorizationRules",
+ "ec2:describeClientVpnConnections",
+ "ec2:describeClientVpnEndpoints",
+ "ec2:describeClientVpnRoutes",
+ "ec2:describeClientVpnTargetNetworks",
+ "ec2:describeCoipPools",
+ "ec2:describeConversionTasks",
+ "ec2:describeCustomerGateways",
+ "ec2:describeDhcpOptions",
+ "ec2:describeElasticGpus",
+ "ec2:describeExportImageTasks",
+ "ec2:describeExportTasks",
+ "ec2:describeFastSnapshotRestores",
+ "ec2:describeFleetHistory",
+ "ec2:describeFleetInstances",
+ "ec2:describeFleets",
+ "ec2:describeFlowLogs",
+ "ec2:describeHostReservationOfferings",
+ "ec2:describeHostReservations",
+ "ec2:describeHosts",
+ "ec2:describeIdentityIdFormat",
+ "ec2:describeIdFormat",
+ "ec2:describeImageAttribute",
+ "ec2:describeImages",
+ "ec2:describeImportImageTasks",
+ "ec2:describeImportSnapshotTasks",
+ "ec2:describeInstanceAttribute",
+ "ec2:describeInstances",
+ "ec2:describeInstanceStatus",
+ "ec2:describeInternetGateways",
+ "ec2:describeKeyPairs",
+ "ec2:describeLaunchTemplates",
+ "ec2:describeLaunchTemplateVersions",
+ "ec2:describeLocalGatewayRouteTables",
+ "ec2:describeLocalGatewayRouteTableVirtualInterfaceGroupAssociations",
+ "ec2:describeLocalGatewayRouteTableVpcAssociations",
+ "ec2:describeLocalGateways",
+ "ec2:describeLocalGatewayVirtualInterfaceGroups",
+ "ec2:describeLocalGatewayVirtualInterfaces",
+ "ec2:describeMovingAddresses",
+ "ec2:describeNatGateways",
+ "ec2:describeNetworkAcls",
+ "ec2:describeNetworkInterfaceAttribute",
+ "ec2:describeNetworkInterfaces",
+ "ec2:describePlacementGroups",
+ "ec2:describePrefixLists",
+ "ec2:describePublicIpv4Pools",
+ "ec2:describeRegions",
+ "ec2:describeReservedInstances",
+ "ec2:describeReservedInstancesListings",
+ "ec2:describeReservedInstancesModifications",
+ "ec2:describeReservedInstancesOfferings",
+ "ec2:describeRouteTables",
+ "ec2:describeScheduledInstances",
+ "ec2:describeSecurityGroups",
+ "ec2:describeSnapshotAttribute",
+ "ec2:describeSnapshots",
+ "ec2:describeSpotDatafeedSubscription",
+ "ec2:describeSpotFleetInstances",
+ "ec2:describeSpotFleetRequestHistory",
+ "ec2:describeSpotFleetRequests",
+ "ec2:describeSpotInstanceRequests",
+ "ec2:describeSpotPriceHistory",
+ "ec2:describeSubnets",
+ "ec2:describeTags",
+ "ec2:describeTrafficMirrorFilters",
+ "ec2:describeTrafficMirrorSessions",
+ "ec2:describeTrafficMirrorTargets",
+ "ec2:describeTransitGatewayAttachments",
+ "ec2:describeTransitGatewayRouteTables",
+ "ec2:describeTransitGateways",
+ "ec2:describeTransitGatewayVpcAttachments",
+ "ec2:describeVolumeAttribute",
+ "ec2:describeVolumes",
+ "ec2:describeVolumesModifications",
+ "ec2:describeVolumeStatus",
+ "ec2:describeVpcAttribute",
+ "ec2:describeVpcClassicLink",
+ "ec2:describeVpcClassicLinkDnsSupport",
+ "ec2:describeVpcEndpointConnectionNotifications",
+ "ec2:describeVpcEndpointConnections",
+ "ec2:describeVpcEndpoints",
+ "ec2:describeVpcEndpointServiceConfigurations",
+ "ec2:describeVpcEndpointServicePermissions",
+ "ec2:describeVpcEndpointServices",
+ "ec2:describeVpcPeeringConnections",
+ "ec2:describeVpcs",
+ "ec2:describeVpnConnections",
+ "ec2:describeVpnGateways",
+ "ec2:getCoipPoolUsage",
+ "ec2:getConsoleScreenshot",
+ "ec2:getReservedInstancesExchangeQuote",
+ "ec2:searchLocalGatewayRoutes",
+ "ecr-public:describeImages",
+ "ecr-public:describeImageTags",
+ "ecr-public:describeRegistries",
+ "ecr-public:describeRepositories",
+ "ecr-public:getRegistryCatalogData",
+ "ecr-public:getRepositoryCatalogData",
+ "ecr-public:getRepositoryPolicy",
+ "ecr-public:listTagsForResource",
+ "ecr:batchCheckLayerAvailability",
+ "ecr:describeImages",
+ "ecr:describeImageScanFindings",
+ "ecr:describeRegistry",
+ "ecr:describeRepositories",
+ "ecr:getLifecyclePolicy",
+ "ecr:getRegistryPolicy",
+ "ecr:getRepositoryPolicy",
+ "ecr:listImages",
+ "ecr:listTagsForResource",
+ "ecs:describeCapacityProviders",
+ "ecs:describeClusters",
+ "ecs:describeContainerInstances",
+ "ecs:describeServices",
+ "ecs:describeTaskDefinition",
+ "ecs:describeTasks",
+ "ecs:describeTaskSets",
+ "ecs:listAccountSettings",
+ "ecs:listAttributes",
+ "ecs:listClusters",
+ "ecs:listContainerInstances",
+ "ecs:listServices",
+ "ecs:listTagsForResource",
+ "ecs:listTaskDefinitionFamilies",
+ "ecs:listTaskDefinitions",
+ "ecs:listTasks",
+ "eks:describeCluster",
+ "eks:describeFargateProfile",
+ "eks:describeNodegroup",
+ "eks:describeUpdate",
+ "eks:listClusters",
+ "eks:listFargateProfiles",
+ "eks:listNodegroups",
+ "eks:listUpdates",
+ "elasticache:describeCacheClusters",
+ "elasticache:describeCacheEngineVersions",
+ "elasticache:describeCacheParameterGroups",
+ "elasticache:describeCacheParameters",
+ "elasticache:describeCacheSecurityGroups",
+ "elasticache:describeCacheSubnetGroups",
+ "elasticache:describeEngineDefaultParameters",
+ "elasticache:describeEvents",
+ "elasticache:describeReplicationGroups",
+ "elasticache:describeReservedCacheNodes",
+ "elasticache:describeReservedCacheNodesOfferings",
+ "elasticache:describeSnapshots",
+ "elasticache:listAllowedNodeTypeModifications",
+ "elasticache:listTagsForResource",
+ "elasticbeanstalk:checkDNSAvailability",
+ "elasticbeanstalk:describeApplicationVersions",
+ "elasticbeanstalk:describeConfigurationOptions",
+ "elasticbeanstalk:describeEnvironmentHealth",
+ "elasticbeanstalk:describeEnvironmentManagedActionHistory",
+ "elasticbeanstalk:describeEnvironmentManagedActions",
+ "elasticbeanstalk:describeEnvironmentResources",
+ "elasticbeanstalk:describeEnvironments",
+ "elasticbeanstalk:describeEvents",
+ "elasticbeanstalk:describeInstancesHealth",
+ "elasticbeanstalk:describePlatformVersion",
+ "elasticbeanstalk:listAvailableSolutionStacks",
+ "elasticbeanstalk:listPlatformVersions",
+ "elasticbeanstalk:validateConfigurationSettings",
+ "elasticfilesystem:describeAccessPoints",
+ "elasticfilesystem:describeFileSystemPolicy",
+ "elasticfilesystem:describeFileSystems",
+ "elasticfilesystem:describeLifecycleConfiguration",
+ "elasticfilesystem:describeMountTargets",
+ "elasticfilesystem:describeMountTargetSecurityGroups",
+ "elasticfilesystem:describeTags",
+ "elasticfilesystem:listTagsForResource",
+ "elasticloadbalancing:describeAccountLimits",
+ "elasticloadbalancing:describeInstanceHealth",
+ "elasticloadbalancing:describeListenerCertificates",
+ "elasticloadbalancing:describeListeners",
+ "elasticloadbalancing:describeLoadBalancerAttributes",
+ "elasticloadbalancing:describeLoadBalancerPolicies",
+ "elasticloadbalancing:describeLoadBalancerPolicyTypes",
+ "elasticloadbalancing:describeLoadBalancers",
+ "elasticloadbalancing:describeRules",
+ "elasticloadbalancing:describeSSLPolicies",
+ "elasticloadbalancing:describeTags",
+ "elasticloadbalancing:describeTargetGroupAttributes",
+ "elasticloadbalancing:describeTargetGroups",
+ "elasticloadbalancing:describeTargetHealth",
+ "elasticmapreduce:describeCluster",
+ "elasticmapreduce:describeSecurityConfiguration",
+ "elasticmapreduce:describeStep",
+ "elasticmapreduce:listBootstrapActions",
+ "elasticmapreduce:listClusters",
+ "elasticmapreduce:listInstanceGroups",
+ "elasticmapreduce:listInstances",
+ "elasticmapreduce:listSecurityConfigurations",
+ "elasticmapreduce:listSteps",
+ "elastictranscoder:listJobsByPipeline",
+ "elastictranscoder:listJobsByStatus",
+ "elastictranscoder:listPipelines",
+ "elastictranscoder:listPresets",
+ "elastictranscoder:readPipeline",
+ "elastictranscoder:readPreset",
+ "es:describeElasticsearchDomain",
+ "es:describeElasticsearchDomainConfig",
+ "es:describeElasticsearchDomains",
+ "es:listDomainNames",
+ "events:describeApiDestination",
+ "events:describeEventBus",
+ "events:describeEventSource",
+ "events:describePartnerEventSource",
+ "events:describeRule",
+ "events:listApiDestinations",
+ "events:listConnections",
+ "events:listEventBuses",
+ "events:listEventSources",
+ "events:listPartnerEventSourceAccounts",
+ "events:listPartnerEventSources",
+ "events:listRuleNamesByTarget",
+ "events:listRules",
+ "events:listTargetsByRule",
+ "events:testEventPattern",
+ "firehose:describeDeliveryStream",
+ "firehose:listDeliveryStreams",
+ "fms:getAdminAccount",
+ "fms:getComplianceDetail",
+ "fms:getNotificationChannel",
+ "fms:getPolicy",
+ "fms:getProtectionStatus",
+ "fms:listComplianceStatus",
+ "fms:listMemberAccounts",
+ "fms:listPolicies",
+ "forecast:describeDataset",
+ "forecast:describeDatasetGroup",
+ "forecast:describeDatasetImportJob",
+ "forecast:describeForecast",
+ "forecast:describeForecastExportJob",
+ "forecast:describePredictor",
+ "forecast:getAccuracyMetrics",
+ "forecast:listDatasetGroups",
+ "forecast:listDatasetImportJobs",
+ "forecast:listDatasets",
+ "forecast:listForecastExportJobs",
+ "forecast:listForecasts",
+ "forecast:listPredictors",
+ "fsx:describeBackups",
+ "fsx:describeDataRepositoryTasks",
+ "fsx:describeFileSystems",
+ "fsx:describeSnapshots",
+ "fsx:describeStorageVirtualMachines",
+ "fsx:describeVolumes",
+ "fsx:listTagsForResource",
+ "glacier:describeJob",
+ "glacier:describeVault",
+ "glacier:getDataRetrievalPolicy",
+ "glacier:getVaultAccessPolicy",
+ "glacier:getVaultLock",
+ "glacier:getVaultNotifications",
+ "glacier:listJobs",
+ "glacier:listTagsForVault",
+ "glacier:listVaults",
+ "globalaccelerator:describeAccelerator",
+ "globalaccelerator:describeAcceleratorAttributes",
+ "globalaccelerator:describeEndpointGroup",
+ "globalaccelerator:describeListener",
+ "globalaccelerator:listAccelerators",
+ "globalaccelerator:listEndpointGroups",
+ "globalaccelerator:listListeners",
+ "glue:batchGetPartition",
+ "glue:checkSchemaVersionValidity",
+ "glue:getCatalogImportStatus",
+ "glue:getClassifier",
+ "glue:getClassifiers",
+ "glue:getCrawler",
+ "glue:getCrawlerMetrics",
+ "glue:getCrawlers",
+ "glue:getDatabase",
+ "glue:getDatabases",
+ "glue:getDataflowGraph",
+ "glue:getDevEndpoint",
+ "glue:getDevEndpoints",
+ "glue:getJob",
+ "glue:getJobRun",
+ "glue:getJobRuns",
+ "glue:getJobs",
+ "glue:getMapping",
+ "glue:getPartition",
+ "glue:getPartitions",
+ "glue:getRegistry",
+ "glue:getSchema",
+ "glue:getSchemaByDefinition",
+ "glue:getSchemaVersion",
+ "glue:getSchemaVersionsDiff",
+ "glue:getTable",
+ "glue:getTables",
+ "glue:getTableVersions",
+ "glue:getTrigger",
+ "glue:getTriggers",
+ "glue:getUserDefinedFunction",
+ "glue:getUserDefinedFunctions",
+ "glue:listRegistries",
+ "glue:listSchemas",
+ "glue:listSchemaVersions",
+ "glue:querySchemaVersionMetadata",
+ "greengrass:getConnectivityInfo",
+ "greengrass:getCoreDefinition",
+ "greengrass:getCoreDefinitionVersion",
+ "greengrass:getDeploymentStatus",
+ "greengrass:getDeviceDefinition",
+ "greengrass:getDeviceDefinitionVersion",
+ "greengrass:getFunctionDefinition",
+ "greengrass:getFunctionDefinitionVersion",
+ "greengrass:getGroup",
+ "greengrass:getGroupCertificateAuthority",
+ "greengrass:getGroupVersion",
+ "greengrass:getLoggerDefinition",
+ "greengrass:getLoggerDefinitionVersion",
+ "greengrass:getResourceDefinitionVersion",
+ "greengrass:getServiceRoleForAccount",
+ "greengrass:getSubscriptionDefinition",
+ "greengrass:getSubscriptionDefinitionVersion",
+ "greengrass:listCoreDefinitions",
+ "greengrass:listCoreDefinitionVersions",
+ "greengrass:listDeployments",
+ "greengrass:listDeviceDefinitions",
+ "greengrass:listDeviceDefinitionVersions",
+ "greengrass:listFunctionDefinitions",
+ "greengrass:listFunctionDefinitionVersions",
+ "greengrass:listGroups",
+ "greengrass:listGroupVersions",
+ "greengrass:listLoggerDefinitions",
+ "greengrass:listLoggerDefinitionVersions",
+ "greengrass:listResourceDefinitions",
+ "greengrass:listResourceDefinitionVersions",
+ "greengrass:listSubscriptionDefinitions",
+ "greengrass:listSubscriptionDefinitionVersions",
+ "guardduty:getDetector",
+ "guardduty:getFindings",
+ "guardduty:getFindingsStatistics",
+ "guardduty:getInvitationsCount",
+ "guardduty:getIPSet",
+ "guardduty:getMasterAccount",
+ "guardduty:getMembers",
+ "guardduty:getThreatIntelSet",
+ "guardduty:listDetectors",
+ "guardduty:listFindings",
+ "guardduty:listInvitations",
+ "guardduty:listIPSets",
+ "guardduty:listMembers",
+ "guardduty:listThreatIntelSets",
+ "health:describeAffectedAccountsForOrganization",
+ "health:describeAffectedEntities",
+ "health:describeAffectedEntitiesForOrganization",
+ "health:describeEntityAggregates",
+ "health:describeEventAggregates",
+ "health:describeEventDetails",
+ "health:describeEventDetailsForOrganization",
+ "health:describeEvents",
+ "health:describeEventsForOrganization",
+ "health:describeEventTypes",
+ "health:describeHealthServiceStatusForOrganization",
+ "iam:getAccessKeyLastUsed",
+ "iam:getAccountAuthorizationDetails",
+ "iam:getAccountPasswordPolicy",
+ "iam:getAccountSummary",
+ "iam:getContextKeysForCustomPolicy",
+ "iam:getContextKeysForPrincipalPolicy",
+ "iam:getCredentialReport",
+ "iam:getGroup",
+ "iam:getGroupPolicy",
+ "iam:getInstanceProfile",
+ "iam:getLoginProfile",
+ "iam:getOpenIDConnectProvider",
+ "iam:getPolicy",
+ "iam:getPolicyVersion",
+ "iam:getRole",
+ "iam:getRolePolicy",
+ "iam:getSAMLProvider",
+ "iam:getServerCertificate",
+ "iam:getSSHPublicKey",
+ "iam:getUser",
+ "iam:getUserPolicy",
+ "iam:listAccessKeys",
+ "iam:listAccountAliases",
+ "iam:listAttachedGroupPolicies",
+ "iam:listAttachedRolePolicies",
+ "iam:listAttachedUserPolicies",
+ "iam:listEntitiesForPolicy",
+ "iam:listGroupPolicies",
+ "iam:listGroups",
+ "iam:listGroupsForUser",
+ "iam:listInstanceProfiles",
+ "iam:listInstanceProfilesForRole",
+ "iam:listMFADevices",
+ "iam:listOpenIDConnectProviders",
+ "iam:listPolicies",
+ "iam:listPolicyVersions",
+ "iam:listRolePolicies",
+ "iam:listRoles",
+ "iam:listSAMLProviders",
+ "iam:listServerCertificates",
+ "iam:listSigningCertificates",
+ "iam:listSSHPublicKeys",
+ "iam:listUserPolicies",
+ "iam:listUsers",
+ "iam:listVirtualMFADevices",
+ "iam:simulateCustomPolicy",
+ "iam:simulatePrincipalPolicy",
+ "imagebuilder:getComponent",
+ "imagebuilder:getComponentPolicy",
+ "imagebuilder:getContainerRecipe",
+ "imagebuilder:getDistributionConfiguration",
+ "imagebuilder:getImage",
+ "imagebuilder:getImagePipeline",
+ "imagebuilder:getImagePolicy",
+ "imagebuilder:getImageRecipe",
+ "imagebuilder:getImageRecipePolicy",
+ "imagebuilder:getInfrastructureConfiguration",
+ "imagebuilder:listComponentBuildVersions",
+ "imagebuilder:listComponents",
+ "imagebuilder:listContainerRecipes",
+ "imagebuilder:listDistributionConfigurations",
+ "imagebuilder:listImageBuildVersions",
+ "imagebuilder:listImagePipelineImages",
+ "imagebuilder:listImagePipelines",
+ "imagebuilder:listImageRecipes",
+ "imagebuilder:listImages",
+ "imagebuilder:listInfrastructureConfigurations",
+ "imagebuilder:listTagsForResource",
+ "inspector:describeAssessmentRuns",
+ "inspector:describeAssessmentTargets",
+ "inspector:describeAssessmentTemplates",
+ "inspector:describeCrossAccountAccessRole",
+ "inspector:describeResourceGroups",
+ "inspector:describeRulesPackages",
+ "inspector:getTelemetryMetadata",
+ "inspector:listAssessmentRunAgents",
+ "inspector:listAssessmentRuns",
+ "inspector:listAssessmentTargets",
+ "inspector:listAssessmentTemplates",
+ "inspector:listEventSubscriptions",
+ "inspector:listRulesPackages",
+ "inspector:listTagsForResource",
+ "iot:describeAuthorizer",
+ "iot:describeCACertificate",
+ "iot:describeCertificate",
+ "iot:describeDefaultAuthorizer",
+ "iot:describeEndpoint",
+ "iot:describeIndex",
+ "iot:describeJobExecution",
+ "iot:describeThing",
+ "iot:describeThingGroup",
+ "iot:describeTunnel",
+ "iot:getEffectivePolicies",
+ "iot:getIndexingConfiguration",
+ "iot:getLoggingOptions",
+ "iot:getPolicy",
+ "iot:getPolicyVersion",
+ "iot:getTopicRule",
+ "iot:getV2LoggingOptions",
+ "iot:listAttachedPolicies",
+ "iot:listAuthorizers",
+ "iot:listCACertificates",
+ "iot:listCertificates",
+ "iot:listCertificatesByCA",
+ "iot:listJobExecutionsForJob",
+ "iot:listJobExecutionsForThing",
+ "iot:listJobs",
+ "iot:listOutgoingCertificates",
+ "iot:listPolicies",
+ "iot:listPolicyPrincipals",
+ "iot:listPolicyVersions",
+ "iot:listPrincipalPolicies",
+ "iot:listPrincipalThings",
+ "iot:listRoleAliases",
+ "iot:listTargetsForPolicy",
+ "iot:listThingGroups",
+ "iot:listThingGroupsForThing",
+ "iot:listThingPrincipals",
+ "iot:listThingRegistrationTasks",
+ "iot:listThings",
+ "iot:listThingTypes",
+ "iot:listTopicRules",
+ "iot:listTunnels",
+ "iot:listV2LoggingLevels",
+ "iotevents:describeDetector",
+ "iotevents:describeDetectorModel",
+ "iotevents:describeInput",
+ "iotevents:describeLoggingOptions",
+ "iotevents:listDetectorModels",
+ "iotevents:listDetectorModelVersions",
+ "iotevents:listDetectors",
+ "iotevents:listInputs",
+ "iotsitewise:describeAccessPolicy",
+ "iotsitewise:describeAsset",
+ "iotsitewise:describeAssetModel",
+ "iotsitewise:describeAssetProperty",
+ "iotsitewise:describeDashboard",
+ "iotsitewise:describeGateway",
+ "iotsitewise:describeGatewayCapabilityConfiguration",
+ "iotsitewise:describeLoggingOptions",
+ "iotsitewise:describePortal",
+ "iotsitewise:describeProject",
+ "iotsitewise:listAccessPolicies",
+ "iotsitewise:listAssetModels",
+ "iotsitewise:listAssets",
+ "iotsitewise:listAssociatedAssets",
+ "iotsitewise:listDashboards",
+ "iotsitewise:listGateways",
+ "iotsitewise:listPortals",
+ "iotsitewise:listProjectAssets",
+ "iotsitewise:listProjects",
+ "iotwireless:getDestination",
+ "iotwireless:getDeviceProfile",
+ "iotwireless:getPartnerAccount",
+ "iotwireless:getServiceEndpoint",
+ "iotwireless:getServiceProfile",
+ "iotwireless:getWirelessDevice",
+ "iotwireless:getWirelessDeviceStatistics",
+ "iotwireless:getWirelessGateway",
+ "iotwireless:getWirelessGatewayCertificate",
+ "iotwireless:getWirelessGatewayFirmwareInformation",
+ "iotwireless:getWirelessGatewayStatistics",
+ "iotwireless:getWirelessGatewayTask",
+ "iotwireless:getWirelessGatewayTaskDefinition",
+ "iotwireless:listDestinations",
+ "iotwireless:listDeviceProfiles",
+ "iotwireless:listPartnerAccounts",
+ "iotwireless:listServiceProfiles",
+ "iotwireless:listTagsForResource",
+ "iotwireless:listWirelessDevices",
+ "iotwireless:listWirelessGateways",
+ "iotwireless:listWirelessGatewayTaskDefinitions",
+ "kafka:describeCluster",
+ "kafka:getBootstrapBrokers",
+ "kafka:listClusters",
+ "kafka:listNodes",
+ "kendra:describeDataSource",
+ "kendra:describeFaq",
+ "kendra:describeIndex",
+ "kendra:listDataSources",
+ "kendra:listFaqs",
+ "kendra:listIndices",
+ "kinesis:describeStream",
+ "kinesis:listStreams",
+ "kinesis:listTagsForStream",
+ "kinesisanalytics:describeApplication",
+ "kinesisanalytics:describeApplicationSnapshot",
+ "kinesisanalytics:listApplications",
+ "kinesisanalytics:listApplicationSnapshots",
+ "kms:describeKey",
+ "kms:getKeyPolicy",
+ "kms:getKeyRotationStatus",
+ "kms:listAliases",
+ "kms:listGrants",
+ "kms:listKeyPolicies",
+ "kms:listKeys",
+ "kms:listResourceTags",
+ "kms:listRetirableGrants",
+ "lambda:getAccountSettings",
+ "lambda:getAlias",
+ "lambda:getCodeSigningConfig",
+ "lambda:getEventSourceMapping",
+ "lambda:getFunction",
+ "lambda:getFunctionCodeSigningConfig",
+ "lambda:getFunctionConcurrency",
+ "lambda:getFunctionConfiguration",
+ "lambda:getFunctionEventInvokeConfig",
+ "lambda:getLayerVersion",
+ "lambda:getLayerVersionPolicy",
+ "lambda:getPolicy",
+ "lambda:getProvisionedConcurrencyConfig",
+ "lambda:listAliases",
+ "lambda:listCodeSigningConfigs",
+ "lambda:listEventSourceMappings",
+ "lambda:listFunctionEventInvokeConfigs",
+ "lambda:listFunctions",
+ "lambda:listFunctionsByCodeSigningConfig",
+ "lambda:listLayers",
+ "lambda:listLayerVersions",
+ "lambda:listProvisionedConcurrencyConfigs",
+ "lambda:listVersionsByFunction",
+ "launchwizard:describeProvisionedApp",
+ "launchwizard:describeProvisioningEvents",
+ "launchwizard:listProvisionedApps",
+ "lex:getBot",
+ "lex:getBotAlias",
+ "lex:getBotAliases",
+ "lex:getBotChannelAssociation",
+ "lex:getBotChannelAssociations",
+ "lex:getBots",
+ "lex:getBotVersions",
+ "lex:getBuiltinIntent",
+ "lex:getBuiltinIntents",
+ "lex:getBuiltinSlotTypes",
+ "lex:getIntent",
+ "lex:getIntents",
+ "lex:getIntentVersions",
+ "lex:getSlotType",
+ "lex:getSlotTypes",
+ "lex:getSlotTypeVersions",
+ "license-manager:getLicenseConfiguration",
+ "license-manager:getServiceSettings",
+ "license-manager:listAssociationsForLicenseConfiguration",
+ "license-manager:listFailuresForLicenseConfigurationOperations",
+ "license-manager:listLicenseConfigurations",
+ "license-manager:listLicenseSpecificationsForResource",
+ "license-manager:listResourceInventory",
+ "license-manager:listUsageForLicenseConfiguration",
+ "lightsail:getActiveNames",
+ "lightsail:getAlarms",
+ "lightsail:getAutoSnapshots",
+ "lightsail:getBlueprints",
+ "lightsail:getBucketBundles",
+ "lightsail:getBucketMetricData",
+ "lightsail:getBuckets",
+ "lightsail:getBundles",
+ "lightsail:getCertificates",
+ "lightsail:getContainerImages",
+ "lightsail:getContainerServiceDeployments",
+ "lightsail:getContainerServiceMetricData",
+ "lightsail:getContainerServicePowers",
+ "lightsail:getContainerServices",
+ "lightsail:getDisk",
+ "lightsail:getDisks",
+ "lightsail:getDiskSnapshot",
+ "lightsail:getDiskSnapshots",
+ "lightsail:getDistributionBundles",
+ "lightsail:getDistributionMetricData",
+ "lightsail:getDistributions",
+ "lightsail:getDomain",
+ "lightsail:getDomains",
+ "lightsail:getExportSnapshotRecords",
+ "lightsail:getInstance",
+ "lightsail:getInstanceMetricData",
+ "lightsail:getInstancePortStates",
+ "lightsail:getInstances",
+ "lightsail:getInstanceSnapshot",
+ "lightsail:getInstanceSnapshots",
+ "lightsail:getInstanceState",
+ "lightsail:getKeyPair",
+ "lightsail:getKeyPairs",
+ "lightsail:getLoadBalancer",
+ "lightsail:getLoadBalancerMetricData",
+ "lightsail:getLoadBalancers",
+ "lightsail:getLoadBalancerTlsCertificates",
+ "lightsail:getOperation",
+ "lightsail:getOperations",
+ "lightsail:getOperationsForResource",
+ "lightsail:getRegions",
+ "lightsail:getRelationalDatabase",
+ "lightsail:getRelationalDatabaseMetricData",
+ "lightsail:getRelationalDatabases",
+ "lightsail:getRelationalDatabaseSnapshot",
+ "lightsail:getRelationalDatabaseSnapshots",
+ "lightsail:getStaticIp",
+ "lightsail:getStaticIps",
+ "lightsail:isVpcPeered",
+ "logs:describeDestinations",
+ "logs:describeExportTasks",
+ "logs:describeLogGroups",
+ "logs:describeLogStreams",
+ "logs:describeMetricFilters",
+ "logs:describeQueries",
+ "logs:describeResourcePolicies",
+ "logs:describeSubscriptionFilters",
+ "logs:testMetricFilter",
+ "lookoutmetrics:describeAlert",
+ "lookoutmetrics:describeAnomalyDetectionExecutions",
+ "lookoutmetrics:describeAnomalyDetector",
+ "lookoutmetrics:describeMetricSet",
+ "lookoutmetrics:getAnomalyGroup",
+ "lookoutmetrics:getDataQualityMetrics",
+ "lookoutmetrics:getFeedback",
+ "lookoutmetrics:getSampleData",
+ "lookoutmetrics:listAlerts",
+ "lookoutmetrics:listAnomalyDetectors",
+ "lookoutmetrics:listAnomalyGroupSummaries",
+ "lookoutmetrics:listAnomalyGroupTimeSeries",
+ "lookoutmetrics:listMetricSets",
+ "lookoutmetrics:listTagsForResource",
+ "machinelearning:describeBatchPredictions",
+ "machinelearning:describeDataSources",
+ "machinelearning:describeEvaluations",
+ "machinelearning:describeMLModels",
+ "machinelearning:getBatchPrediction",
+ "machinelearning:getDataSource",
+ "machinelearning:getEvaluation",
+ "machinelearning:getMLModel",
+ "macie2:getClassificationExportConfiguration",
+ "macie2:getCustomDataIdentifier",
+ "macie2:getFindings",
+ "macie2:getFindingStatistics",
+ "macie2:listClassificationJobs",
+ "macie2:listCustomDataIdentifiers",
+ "macie2:listFindings",
+ "managedblockchain:getMember",
+ "managedblockchain:getNetwork",
+ "managedblockchain:getNode",
+ "managedblockchain:listMembers",
+ "managedblockchain:listNetworks",
+ "managedblockchain:listNodes",
+ "mediaconnect:describeFlow",
+ "mediaconnect:listEntitlements",
+ "mediaconnect:listFlows",
+ "mediaconvert:describeEndpoints",
+ "mediaconvert:getJob",
+ "mediaconvert:getJobTemplate",
+ "mediaconvert:getPreset",
+ "mediaconvert:getQueue",
+ "mediaconvert:listJobs",
+ "mediaconvert:listJobTemplates",
+ "medialive:describeChannel",
+ "medialive:describeInput",
+ "medialive:describeInputDevice",
+ "medialive:describeInputSecurityGroup",
+ "medialive:describeMultiplex",
+ "medialive:describeOffering",
+ "medialive:describeReservation",
+ "medialive:describeSchedule",
+ "medialive:listChannels",
+ "medialive:listInputDevices",
+ "medialive:listInputs",
+ "medialive:listInputSecurityGroups",
+ "medialive:listMultiplexes",
+ "medialive:listOfferings",
+ "medialive:listReservations",
+ "mediapackage:describeChannel",
+ "mediapackage:describeOriginEndpoint",
+ "mediapackage:listChannels",
+ "mediapackage:listOriginEndpoints",
+ "mediastore:describeContainer",
+ "mediastore:getContainerPolicy",
+ "mediastore:getCorsPolicy",
+ "mediastore:listContainers",
+ "mediatailor:getPlaybackConfiguration",
+ "mediatailor:listPlaybackConfigurations",
+ "mgn:describeJobLogItems",
+ "mgn:describeJobs",
+ "mgn:describeReplicationConfigurationTemplates",
+ "mgn:describeSourceServers",
+ "mgn:describeVcenterClients",
+ "mgn:getLaunchConfiguration",
+ "mgn:getReplicationConfiguration",
+ "mobiletargeting:getAdmChannel",
+ "mobiletargeting:getApnsChannel",
+ "mobiletargeting:getApnsSandboxChannel",
+ "mobiletargeting:getApnsVoipChannel",
+ "mobiletargeting:getApnsVoipSandboxChannel",
+ "mobiletargeting:getApp",
+ "mobiletargeting:getApplicationSettings",
+ "mobiletargeting:getApps",
+ "mobiletargeting:getBaiduChannel",
+ "mobiletargeting:getCampaign",
+ "mobiletargeting:getCampaignActivities",
+ "mobiletargeting:getCampaigns",
+ "mobiletargeting:getCampaignVersion",
+ "mobiletargeting:getCampaignVersions",
+ "mobiletargeting:getEmailChannel",
+ "mobiletargeting:getEndpoint",
+ "mobiletargeting:getEventStream",
+ "mobiletargeting:getExportJob",
+ "mobiletargeting:getExportJobs",
+ "mobiletargeting:getGcmChannel",
+ "mobiletargeting:getImportJob",
+ "mobiletargeting:getImportJobs",
+ "mobiletargeting:getSegment",
+ "mobiletargeting:getSegmentImportJobs",
+ "mobiletargeting:getSegments",
+ "mobiletargeting:getSegmentVersion",
+ "mobiletargeting:getSegmentVersions",
+ "mobiletargeting:getSmsChannel",
+ "mq:describeBroker",
+ "mq:describeConfiguration",
+ "mq:describeConfigurationRevision",
+ "mq:describeUser",
+ "mq:listBrokers",
+ "mq:listConfigurationRevisions",
+ "mq:listConfigurations",
+ "mq:listUsers",
+ "network-firewall:describeFirewall",
+ "network-firewall:describeFirewallPolicy",
+ "network-firewall:describeLoggingConfiguration",
+ "network-firewall:describeRuleGroup",
+ "network-firewall:listFirewallPolicies",
+ "network-firewall:listFirewalls",
+ "network-firewall:listRuleGroups",
+ "networkmanager:describeGlobalNetworks",
+ "networkmanager:getCustomerGatewayAssociations",
+ "networkmanager:getDevices",
+ "networkmanager:getLinkAssociations",
+ "networkmanager:getLinks",
+ "networkmanager:getSites",
+ "networkmanager:getTransitGatewayRegistrations",
+ "opsworks-cm:describeAccountAttributes",
+ "opsworks-cm:describeBackups",
+ "opsworks-cm:describeEvents",
+ "opsworks-cm:describeNodeAssociationStatus",
+ "opsworks-cm:describeServers",
+ "opsworks:describeAgentVersions",
+ "opsworks:describeApps",
+ "opsworks:describeCommands",
+ "opsworks:describeDeployments",
+ "opsworks:describeEcsClusters",
+ "opsworks:describeElasticIps",
+ "opsworks:describeElasticLoadBalancers",
+ "opsworks:describeInstances",
+ "opsworks:describeLayers",
+ "opsworks:describeLoadBasedAutoScaling",
+ "opsworks:describeMyUserProfile",
+ "opsworks:describePermissions",
+ "opsworks:describeRaidArrays",
+ "opsworks:describeRdsDbInstances",
+ "opsworks:describeServiceErrors",
+ "opsworks:describeStackProvisioningParameters",
+ "opsworks:describeStacks",
+ "opsworks:describeStackSummary",
+ "opsworks:describeTimeBasedAutoScaling",
+ "opsworks:describeUserProfiles",
+ "opsworks:describeVolumes",
+ "opsworks:getHostnameSuggestion",
+ "organizations:listAccounts",
+ "organizations:listTagsForResource",
+ "outposts:getOutpost",
+ "outposts:getOutpostInstanceTypes",
+ "outposts:listOutposts",
+ "outposts:listSites",
+ "personalize:describeAlgorithm",
+ "personalize:describeCampaign",
+ "personalize:describeDataset",
+ "personalize:describeDatasetGroup",
+ "personalize:describeDatasetImportJob",
+ "personalize:describeEventTracker",
+ "personalize:describeFeatureTransformation",
+ "personalize:describeRecipe",
+ "personalize:describeSchema",
+ "personalize:describeSolution",
+ "personalize:describeSolutionVersion",
+ "personalize:listCampaigns",
+ "personalize:listDatasetGroups",
+ "personalize:listDatasetImportJobs",
+ "personalize:listDatasets",
+ "personalize:listEventTrackers",
+ "personalize:listRecipes",
+ "personalize:listSchemas",
+ "personalize:listSolutions",
+ "personalize:listSolutionVersions",
+ "polly:describeVoices",
+ "polly:getLexicon",
+ "polly:listLexicons",
+ "pricing:describeServices",
+ "pricing:getAttributeValues",
+ "pricing:getProducts",
+ "quicksight:describeDashboard",
+ "quicksight:describeDashboardPermissions",
+ "quicksight:describeGroup",
+ "quicksight:describeIAMPolicyAssignment",
+ "quicksight:describeTemplate",
+ "quicksight:describeTemplateAlias",
+ "quicksight:describeTemplatePermissions",
+ "quicksight:describeUser",
+ "quicksight:listDashboards",
+ "quicksight:listGroupMemberships",
+ "quicksight:listGroups",
+ "quicksight:listIAMPolicyAssignments",
+ "quicksight:listIAMPolicyAssignmentsForUser",
+ "quicksight:listTemplateAliases",
+ "quicksight:listTemplates",
+ "quicksight:listTemplateVersions",
+ "quicksight:listUserGroups",
+ "quicksight:listUsers",
+ "ram:getPermission",
+ "ram:getResourceShareAssociations",
+ "ram:getResourceShareInvitations",
+ "ram:getResourceShares",
+ "ram:listPendingInvitationResources",
+ "ram:listPrincipals",
+ "ram:listResources",
+ "ram:listResourceSharePermissions",
+ "rbin:getRule",
+ "rbin:listRules",
+ "rds:describeAccountAttributes",
+ "rds:describeCertificates",
+ "rds:describeDBClusterParameterGroups",
+ "rds:describeDBClusterParameters",
+ "rds:describeDBClusters",
+ "rds:describeDBClusterSnapshots",
+ "rds:describeDBEngineVersions",
+ "rds:describeDBInstances",
+ "rds:describeDBParameterGroups",
+ "rds:describeDBParameters",
+ "rds:describeDBSecurityGroups",
+ "rds:describeDBSnapshotAttributes",
+ "rds:describeDBSnapshots",
+ "rds:describeDBSubnetGroups",
+ "rds:describeEngineDefaultClusterParameters",
+ "rds:describeEngineDefaultParameters",
+ "rds:describeEventCategories",
+ "rds:describeEvents",
+ "rds:describeEventSubscriptions",
+ "rds:describeExportTasks",
+ "rds:describeOptionGroupOptions",
+ "rds:describeOptionGroups",
+ "rds:describeOrderableDBInstanceOptions",
+ "rds:describePendingMaintenanceActions",
+ "rds:describeReservedDBInstances",
+ "rds:describeReservedDBInstancesOfferings",
+ "rds:listTagsForResource",
+ "redshift-data:describeStatement",
+ "redshift-data:listStatements",
+ "redshift:describeClusterParameterGroups",
+ "redshift:describeClusterParameters",
+ "redshift:describeClusters",
+ "redshift:describeClusterSecurityGroups",
+ "redshift:describeClusterSnapshots",
+ "redshift:describeClusterSubnetGroups",
+ "redshift:describeClusterVersions",
+ "redshift:describeDefaultClusterParameters",
+ "redshift:describeEventCategories",
+ "redshift:describeEvents",
+ "redshift:describeEventSubscriptions",
+ "redshift:describeHsmClientCertificates",
+ "redshift:describeHsmConfigurations",
+ "redshift:describeLoggingStatus",
+ "redshift:describeOrderableClusterOptions",
+ "redshift:describeReservedNodeOfferings",
+ "redshift:describeReservedNodes",
+ "redshift:describeResize",
+ "redshift:describeSnapshotCopyGrants",
+ "redshift:describeStorage",
+ "redshift:describeTableRestoreStatus",
+ "redshift:describeTags",
+ "rekognition:listCollections",
+ "rekognition:listFaces",
+ "resource-groups:getGroup",
+ "resource-groups:getGroupQuery",
+ "resource-groups:getTags",
+ "resource-groups:listGroupResources",
+ "resource-groups:listGroups",
+ "resource-groups:searchResources",
+ "robomaker:batchDescribeSimulationJob",
+ "robomaker:describeDeploymentJob",
+ "robomaker:describeFleet",
+ "robomaker:describeRobot",
+ "robomaker:describeRobotApplication",
+ "robomaker:describeSimulationApplication",
+ "robomaker:describeSimulationJob",
+ "robomaker:listDeploymentJobs",
+ "robomaker:listFleets",
+ "robomaker:listRobotApplications",
+ "robomaker:listRobots",
+ "robomaker:listSimulationApplications",
+ "robomaker:listSimulationJobs",
+ "route53-recovery-readiness:getCell",
+ "route53-recovery-readiness:getCellReadinessSummary",
+ "route53-recovery-readiness:getReadinessCheck",
+ "route53-recovery-readiness:getReadinessCheckResourceStatus",
+ "route53-recovery-readiness:getReadinessCheckStatus",
+ "route53-recovery-readiness:getRecoveryGroup",
+ "route53-recovery-readiness:getRecoveryGroupReadinessSummary",
+ "route53-recovery-readiness:listCells",
+ "route53-recovery-readiness:listReadinessChecks",
+ "route53-recovery-readiness:listRecoveryGroups",
+ "route53-recovery-readiness:listResourceSets",
+ "route53:getChange",
+ "route53:getCheckerIpRanges",
+ "route53:getGeoLocation",
+ "route53:getHealthCheck",
+ "route53:getHealthCheckCount",
+ "route53:getHealthCheckLastFailureReason",
+ "route53:getHealthCheckStatus",
+ "route53:getHostedZone",
+ "route53:getHostedZoneCount",
+ "route53:getReusableDelegationSet",
+ "route53:getTrafficPolicy",
+ "route53:getTrafficPolicyInstance",
+ "route53:getTrafficPolicyInstanceCount",
+ "route53:listGeoLocations",
+ "route53:listHealthChecks",
+ "route53:listHostedZones",
+ "route53:listHostedZonesByName",
+ "route53:listResourceRecordSets",
+ "route53:listReusableDelegationSets",
+ "route53:listTrafficPolicies",
+ "route53:listTrafficPolicyInstances",
+ "route53:listTrafficPolicyInstancesByHostedZone",
+ "route53:listTrafficPolicyInstancesByPolicy",
+ "route53:listTrafficPolicyVersions",
+ "route53domains:checkDomainAvailability",
+ "route53domains:getContactReachabilityStatus",
+ "route53domains:getDomainDetail",
+ "route53domains:getOperationDetail",
+ "route53domains:listDomains",
+ "route53domains:listOperations",
+ "route53domains:listTagsForDomain",
+ "route53domains:viewBilling",
+ "route53resolver:getFirewallConfig",
+ "route53resolver:getFirewallDomainList",
+ "route53resolver:getFirewallRuleGroup",
+ "route53resolver:getFirewallRuleGroupAssociation",
+ "route53resolver:getResolverDnssecConfig",
+ "route53resolver:getResolverRulePolicy",
+ "route53resolver:listFirewallConfigs",
+ "route53resolver:listFirewallDomainLists",
+ "route53resolver:listFirewallDomains",
+ "route53resolver:listFirewallRuleGroupAssociations",
+ "route53resolver:listFirewallRuleGroups",
+ "route53resolver:listFirewallRules",
+ "route53resolver:listResolverDnssecConfigs",
+ "route53resolver:listResolverEndpointIpAddresses",
+ "route53resolver:listResolverEndpoints",
+ "route53resolver:listResolverRuleAssociations",
+ "route53resolver:listResolverRules",
+ "route53resolver:listTagsForResource",
+ "s3:describeJob",
+ "s3:describeMultiRegionAccessPointOperation",
+ "s3:getAccelerateConfiguration",
+ "s3:getAccessPoint",
+ "s3:getAccessPointConfigurationForObjectLambda",
+ "s3:getAccessPointForObjectLambda",
+ "s3:getAccessPointPolicy",
+ "s3:getAccessPointPolicyForObjectLambda",
+ "s3:getAccessPointPolicyStatus",
+ "s3:getAccessPointPolicyStatusForObjectLambda",
+ "s3:getAccountPublicAccessBlock",
+ "s3:getAnalyticsConfiguration",
+ "s3:getBucketAcl",
+ "s3:getBucketCORS",
+ "s3:getBucketLocation",
+ "s3:getBucketLogging",
+ "s3:getBucketNotification",
+ "s3:getBucketObjectLockConfiguration",
+ "s3:getBucketOwnershipControls",
+ "s3:getBucketPolicy",
+ "s3:getBucketPolicyStatus",
+ "s3:getBucketPublicAccessBlock",
+ "s3:getBucketRequestPayment",
+ "s3:getBucketVersioning",
+ "s3:getBucketWebsite",
+ "s3:getEncryptionConfiguration",
+ "s3:getIntelligentTieringConfiguration",
+ "s3:getInventoryConfiguration",
+ "s3:getLifecycleConfiguration",
+ "s3:getMetricsConfiguration",
+ "s3:getMultiRegionAccessPoint",
+ "s3:getMultiRegionAccessPointPolicy",
+ "s3:getMultiRegionAccessPointPolicyStatus",
+ "s3:getObjectLegalHold",
+ "s3:getObjectRetention",
+ "s3:getReplicationConfiguration",
+ "s3:getStorageLensConfiguration",
+ "s3:listAccessPoints",
+ "s3:listAccessPointsForObjectLambda",
+ "s3:listAllMyBuckets",
+ "s3:listBucket",
+ "s3:listBucketMultipartUploads",
+ "s3:listBucketVersions",
+ "s3:listJobs",
+ "s3:listMultipartUploadParts",
+ "s3:listMultiRegionAccessPoints",
+ "s3:listStorageLensConfigurations",
+ "sagemaker:describeAction",
+ "sagemaker:describeAlgorithm",
+ "sagemaker:describeApp",
+ "sagemaker:describeArtifact",
+ "sagemaker:describeAutoMLJob",
+ "sagemaker:describeCompilationJob",
+ "sagemaker:describeContext",
+ "sagemaker:describeDataQualityJobDefinition",
+ "sagemaker:describeDevice",
+ "sagemaker:describeDeviceFleet",
+ "sagemaker:describeDomain",
+ "sagemaker:describeEdgePackagingJob",
+ "sagemaker:describeEndpoint",
+ "sagemaker:describeEndpointConfig",
+ "sagemaker:describeExperiment",
+ "sagemaker:describeFeatureGroup",
+ "sagemaker:describeHumanTaskUi",
+ "sagemaker:describeHyperParameterTuningJob",
+ "sagemaker:describeImage",
+ "sagemaker:describeImageVersion",
+ "sagemaker:describeLabelingJob",
+ "sagemaker:describeModel",
+ "sagemaker:describeModelBiasJobDefinition",
+ "sagemaker:describeModelExplainabilityJobDefinition",
+ "sagemaker:describeModelPackage",
+ "sagemaker:describeModelPackageGroup",
+ "sagemaker:describeModelQualityJobDefinition",
+ "sagemaker:describeMonitoringSchedule",
+ "sagemaker:describeNotebookInstance",
+ "sagemaker:describeNotebookInstanceLifecycleConfig",
+ "sagemaker:describePipeline",
+ "sagemaker:describePipelineDefinitionForExecution",
+ "sagemaker:describePipelineExecution",
+ "sagemaker:describeProcessingJob",
+ "sagemaker:describeProject",
+ "sagemaker:describeSubscribedWorkteam",
+ "sagemaker:describeTrainingJob",
+ "sagemaker:describeTransformJob",
+ "sagemaker:describeTrial",
+ "sagemaker:describeTrialComponent",
+ "sagemaker:describeUserProfile",
+ "sagemaker:describeWorkteam",
+ "sagemaker:listActions",
+ "sagemaker:listAlgorithms",
+ "sagemaker:listApps",
+ "sagemaker:listArtifacts",
+ "sagemaker:listAssociations",
+ "sagemaker:listAutoMLJobs",
+ "sagemaker:listCandidatesForAutoMLJob",
+ "sagemaker:listCodeRepositories",
+ "sagemaker:listCompilationJobs",
+ "sagemaker:listContexts",
+ "sagemaker:listDataQualityJobDefinitions",
+ "sagemaker:listDeviceFleets",
+ "sagemaker:listDevices",
+ "sagemaker:listDomains",
+ "sagemaker:listEdgePackagingJobs",
+ "sagemaker:listEndpointConfigs",
+ "sagemaker:listEndpoints",
+ "sagemaker:listExperiments",
+ "sagemaker:listFeatureGroups",
+ "sagemaker:listFlowDefinitions",
+ "sagemaker:listHumanTaskUis",
+ "sagemaker:listHyperParameterTuningJobs",
+ "sagemaker:listImages",
+ "sagemaker:listImageVersions",
+ "sagemaker:listLabelingJobs",
+ "sagemaker:listLabelingJobsForWorkteam",
+ "sagemaker:listModelBiasJobDefinitions",
+ "sagemaker:listModelExplainabilityJobDefinitions",
+ "sagemaker:listModelPackageGroups",
+ "sagemaker:listModelPackages",
+ "sagemaker:listModelQualityJobDefinitions",
+ "sagemaker:listModels",
+ "sagemaker:listMonitoringExecutions",
+ "sagemaker:listMonitoringSchedules",
+ "sagemaker:listNotebookInstanceLifecycleConfigs",
+ "sagemaker:listNotebookInstances",
+ "sagemaker:listPipelineExecutions",
+ "sagemaker:listPipelineExecutionSteps",
+ "sagemaker:listPipelineParametersForExecution",
+ "sagemaker:listPipelines",
+ "sagemaker:listProcessingJobs",
+ "sagemaker:listProjects",
+ "sagemaker:listSubscribedWorkteams",
+ "sagemaker:listTags",
+ "sagemaker:listTrainingJobs",
+ "sagemaker:listTrainingJobsForHyperParameterTuningJob",
+ "sagemaker:listTransformJobs",
+ "sagemaker:listTrialComponents",
+ "sagemaker:listTrials",
+ "sagemaker:listUserProfiles",
+ "sagemaker:listWorkteams",
+ "sdb:domainMetadata",
+ "sdb:listDomains",
+ "secretsmanager:describeSecret",
+ "secretsmanager:getResourcePolicy",
+ "secretsmanager:listSecrets",
+ "secretsmanager:listSecretVersionIds",
+ "securityhub:getEnabledStandards",
+ "securityhub:getFindings",
+ "securityhub:getInsightResults",
+ "securityhub:getInsights",
+ "securityhub:getMasterAccount",
+ "securityhub:getMembers",
+ "securityhub:listEnabledProductsForImport",
+ "securityhub:listInvitations",
+ "securityhub:listMembers",
+ "servicecatalog:describeConstraint",
+ "servicecatalog:describePortfolio",
+ "servicecatalog:describeProduct",
+ "servicecatalog:describeProductAsAdmin",
+ "servicecatalog:describeProductView",
+ "servicecatalog:describeProvisioningArtifact",
+ "servicecatalog:describeProvisioningParameters",
+ "servicecatalog:describeRecord",
+ "servicecatalog:listAcceptedPortfolioShares",
+ "servicecatalog:listConstraintsForPortfolio",
+ "servicecatalog:listLaunchPaths",
+ "servicecatalog:listPortfolioAccess",
+ "servicecatalog:listPortfolios",
+ "servicecatalog:listPortfoliosForProduct",
+ "servicecatalog:listPrincipalsForPortfolio",
+ "servicecatalog:listProvisioningArtifacts",
+ "servicecatalog:listRecordHistory",
+ "servicecatalog:scanProvisionedProducts",
+ "servicecatalog:searchProducts",
+ "servicequotas:getAssociationForServiceQuotaTemplate",
+ "servicequotas:getAWSDefaultServiceQuota",
+ "servicequotas:getRequestedServiceQuotaChange",
+ "servicequotas:getServiceQuota",
+ "servicequotas:getServiceQuotaIncreaseRequestFromTemplate",
+ "servicequotas:listAWSDefaultServiceQuotas",
+ "servicequotas:listRequestedServiceQuotaChangeHistory",
+ "servicequotas:listRequestedServiceQuotaChangeHistoryByQuota",
+ "servicequotas:listServiceQuotaIncreaseRequestsInTemplate",
+ "servicequotas:listServiceQuotas",
+ "servicequotas:listServices",
+ "ses:describeActiveReceiptRuleSet",
+ "ses:describeReceiptRule",
+ "ses:describeReceiptRuleSet",
+ "ses:getAccount",
+ "ses:getBlacklistReports",
+ "ses:getConfigurationSet",
+ "ses:getConfigurationSetEventDestinations",
+ "ses:getDedicatedIp",
+ "ses:getDedicatedIps",
+ "ses:getDeliverabilityDashboardOptions",
+ "ses:getDeliverabilityTestReport",
+ "ses:getDomainDeliverabilityCampaign",
+ "ses:getDomainStatisticsReport",
+ "ses:getEmailIdentity",
+ "ses:getIdentityDkimAttributes",
+ "ses:getIdentityMailFromDomainAttributes",
+ "ses:getIdentityNotificationAttributes",
+ "ses:getIdentityPolicies",
+ "ses:getIdentityVerificationAttributes",
+ "ses:getSendQuota",
+ "ses:getSendStatistics",
+ "ses:listConfigurationSets",
+ "ses:listDedicatedIpPools",
+ "ses:listDeliverabilityTestReports",
+ "ses:listDomainDeliverabilityCampaigns",
+ "ses:listEmailIdentities",
+ "ses:listIdentities",
+ "ses:listIdentityPolicies",
+ "ses:listReceiptFilters",
+ "ses:listReceiptRuleSets",
+ "ses:listTagsForResource",
+ "ses:listVerifiedEmailAddresses",
+ "shield:describeAttack",
+ "shield:describeProtection",
+ "shield:describeSubscription",
+ "shield:listAttacks",
+ "shield:listProtections",
+ "sms-voice:getConfigurationSetEventDestinations",
+ "sms:getConnectors",
+ "sms:getReplicationJobs",
+ "sms:getReplicationRuns",
+ "sms:getServers",
+ "snowball:describeAddress",
+ "snowball:describeAddresses",
+ "snowball:describeJob",
+ "snowball:getSnowballUsage",
+ "snowball:listJobs",
+ "sns:checkIfPhoneNumberIsOptedOut",
+ "sns:getEndpointAttributes",
+ "sns:getPlatformApplicationAttributes",
+ "sns:getSMSAttributes",
+ "sns:getSubscriptionAttributes",
+ "sns:getTopicAttributes",
+ "sns:listEndpointsByPlatformApplication",
+ "sns:listPhoneNumbersOptedOut",
+ "sns:listPlatformApplications",
+ "sns:listSubscriptions",
+ "sns:listSubscriptionsByTopic",
+ "sns:listTopics",
+ "sqs:getQueueAttributes",
+ "sqs:getQueueUrl",
+ "sqs:listDeadLetterSourceQueues",
+ "sqs:listQueues",
+ "ssm-contacts:describeEngagement",
+ "ssm-contacts:describePage",
+ "ssm-contacts:getContact",
+ "ssm-contacts:getContactChannel",
+ "ssm-contacts:listContactChannels",
+ "ssm-contacts:listContacts",
+ "ssm-contacts:listEngagements",
+ "ssm-contacts:listPageReceipts",
+ "ssm-contacts:listPagesByContact",
+ "ssm-contacts:listPagesByEngagement",
+ "ssm-incidents:getIncidentRecord",
+ "ssm-incidents:getReplicationSet",
+ "ssm-incidents:getResponsePlan",
+ "ssm-incidents:listIncidentRecords",
+ "ssm-incidents:listReplicationSets",
+ "ssm-incidents:listResponsePlans",
+ "ssm-incidents:listTimelineEvents",
+ "ssm:describeActivations",
+ "ssm:describeAssociation",
+ "ssm:describeAssociationExecutions",
+ "ssm:describeAssociationExecutionTargets",
+ "ssm:describeAutomationExecutions",
+ "ssm:describeAutomationStepExecutions",
+ "ssm:describeAvailablePatches",
+ "ssm:describeDocument",
+ "ssm:describeDocumentPermission",
+ "ssm:describeEffectiveInstanceAssociations",
+ "ssm:describeEffectivePatchesForPatchBaseline",
+ "ssm:describeInstanceAssociationsStatus",
+ "ssm:describeInstanceInformation",
+ "ssm:describeInstancePatches",
+ "ssm:describeInstancePatchStates",
+ "ssm:describeInstancePatchStatesForPatchGroup",
+ "ssm:describeInventoryDeletions",
+ "ssm:describeMaintenanceWindowExecutions",
+ "ssm:describeMaintenanceWindowExecutionTaskInvocations",
+ "ssm:describeMaintenanceWindowExecutionTasks",
+ "ssm:describeMaintenanceWindows",
+ "ssm:describeMaintenanceWindowSchedule",
+ "ssm:describeMaintenanceWindowsForTarget",
+ "ssm:describeMaintenanceWindowTargets",
+ "ssm:describeMaintenanceWindowTasks",
+ "ssm:describeOpsItems",
+ "ssm:describeParameters",
+ "ssm:describePatchBaselines",
+ "ssm:describePatchGroups",
+ "ssm:describePatchGroupState",
+ "ssm:describePatchProperties",
+ "ssm:describeSessions",
+ "ssm:getAutomationExecution",
+ "ssm:getCommandInvocation",
+ "ssm:getConnectionStatus",
+ "ssm:getDefaultPatchBaseline",
+ "ssm:getDeployablePatchSnapshotForInstance",
+ "ssm:getInventorySchema",
+ "ssm:getMaintenanceWindow",
+ "ssm:getMaintenanceWindowExecution",
+ "ssm:getMaintenanceWindowExecutionTask",
+ "ssm:getMaintenanceWindowExecutionTaskInvocation",
+ "ssm:getMaintenanceWindowTask",
+ "ssm:getOpsItem",
+ "ssm:getPatchBaseline",
+ "ssm:getPatchBaselineForPatchGroup",
+ "ssm:getServiceSetting",
+ "ssm:labelParameterVersion",
+ "ssm:listAssociations",
+ "ssm:listAssociationVersions",
+ "ssm:listCommandInvocations",
+ "ssm:listCommands",
+ "ssm:listComplianceItems",
+ "ssm:listComplianceSummaries",
+ "ssm:listDocuments",
+ "ssm:listDocumentVersions",
+ "ssm:listOpsItemEvents",
+ "ssm:listResourceComplianceSummaries",
+ "ssm:listResourceDataSync",
+ "ssm:listTagsForResource",
+ "states:describeActivity",
+ "states:describeExecution",
+ "states:describeStateMachine",
+ "states:describeStateMachineForExecution",
+ "states:getExecutionHistory",
+ "states:listActivities",
+ "states:listExecutions",
+ "states:listStateMachines",
+ "storagegateway:describeBandwidthRateLimit",
+ "storagegateway:describeCache",
+ "storagegateway:describeCachediSCSIVolumes",
+ "storagegateway:describeFileSystemAssociations",
+ "storagegateway:describeGatewayInformation",
+ "storagegateway:describeMaintenanceStartTime",
+ "storagegateway:describeNFSFileShares",
+ "storagegateway:describeSMBFileShares",
+ "storagegateway:describeSMBSettings",
+ "storagegateway:describeSnapshotSchedule",
+ "storagegateway:describeStorediSCSIVolumes",
+ "storagegateway:describeTapeArchives",
+ "storagegateway:describeTapeRecoveryPoints",
+ "storagegateway:describeTapes",
+ "storagegateway:describeUploadBuffer",
+ "storagegateway:describeVTLDevices",
+ "storagegateway:describeWorkingStorage",
+ "storagegateway:listAutomaticTapeCreationPolicies",
+ "storagegateway:listFileShares",
+ "storagegateway:listFileSystemAssociations",
+ "storagegateway:listGateways",
+ "storagegateway:listLocalDisks",
+ "storagegateway:listTagsForResource",
+ "storagegateway:listTapes",
+ "storagegateway:listVolumeInitiators",
+ "storagegateway:listVolumeRecoveryPoints",
+ "storagegateway:listVolumes",
+ "swf:countClosedWorkflowExecutions",
+ "swf:countOpenWorkflowExecutions",
+ "swf:countPendingActivityTasks",
+ "swf:countPendingDecisionTasks",
+ "swf:describeActivityType",
+ "swf:describeDomain",
+ "swf:describeWorkflowExecution",
+ "swf:describeWorkflowType",
+ "swf:getWorkflowExecutionHistory",
+ "swf:listActivityTypes",
+ "swf:listClosedWorkflowExecutions",
+ "swf:listDomains",
+ "swf:listOpenWorkflowExecutions",
+ "swf:listWorkflowTypes",
+ "synthetics:describeCanaries",
+ "synthetics:describeCanariesLastRun",
+ "synthetics:describeRuntimeVersions",
+ "synthetics:getCanary",
+ "synthetics:getCanaryRuns",
+ "transfer:describeServer",
+ "transfer:describeUser",
+ "transfer:listServers",
+ "transfer:listTagsForResource",
+ "transfer:listUsers",
+ "waf-regional:getByteMatchSet",
+ "waf-regional:getChangeTokenStatus",
+ "waf-regional:getIPSet",
+ "waf-regional:getRule",
+ "waf-regional:getSqlInjectionMatchSet",
+ "waf-regional:getWebACL",
+ "waf-regional:getWebACLForResource",
+ "waf-regional:listByteMatchSets",
+ "waf-regional:listIPSets",
+ "waf-regional:listResourcesForWebACL",
+ "waf-regional:listRules",
+ "waf-regional:listSqlInjectionMatchSets",
+ "waf-regional:listWebACLs",
+ "waf:getByteMatchSet",
+ "waf:getChangeTokenStatus",
+ "waf:getIPSet",
+ "waf:getRule",
+ "waf:getSampledRequests",
+ "waf:getSizeConstraintSet",
+ "waf:getSqlInjectionMatchSet",
+ "waf:getWebACL",
+ "waf:getXssMatchSet",
+ "waf:listByteMatchSets",
+ "waf:listIPSets",
+ "waf:listRules",
+ "waf:listSizeConstraintSets",
+ "waf:listSqlInjectionMatchSets",
+ "waf:listWebACLs",
+ "waf:listXssMatchSets",
+ "wafv2:checkCapacity",
+ "wafv2:describeManagedRuleGroup",
+ "wafv2:getIPSet",
+ "wafv2:getLoggingConfiguration",
+ "wafv2:getPermissionPolicy",
+ "wafv2:getRateBasedStatementManagedKeys",
+ "wafv2:getRegexPatternSet",
+ "wafv2:getRuleGroup",
+ "wafv2:getSampledRequests",
+ "wafv2:getWebACL",
+ "wafv2:getWebACLForResource",
+ "wafv2:listAvailableManagedRuleGroups",
+ "wafv2:listIPSets",
+ "wafv2:listLoggingConfigurations",
+ "wafv2:listRegexPatternSets",
+ "wafv2:listResourcesForWebACL",
+ "wafv2:listRuleGroups",
+ "wafv2:listTagsForResource",
+ "wafv2:listWebACLs",
+ "workdocs:checkAlias",
+ "workdocs:describeAvailableDirectories",
+ "workdocs:describeInstances",
+ "worklink:describeAuditStreamConfiguration",
+ "worklink:describeCompanyNetworkConfiguration",
+ "worklink:describeDevice",
+ "worklink:describeDevicePolicyConfiguration",
+ "worklink:describeDomain",
+ "worklink:describeFleetMetadata",
+ "worklink:describeIdentityProviderConfiguration",
+ "worklink:describeWebsiteCertificateAuthority",
+ "worklink:listDevices",
+ "worklink:listDomains",
+ "worklink:listFleets",
+ "worklink:listWebsiteAuthorizationProviders",
+ "worklink:listWebsiteCertificateAuthorities",
+ "workmail:describeGroup",
+ "workmail:describeOrganization",
+ "workmail:describeResource",
+ "workmail:describeUser",
+ "workmail:listAliases",
+ "workmail:listGroupMembers",
+ "workmail:listGroups",
+ "workmail:listMailboxPermissions",
+ "workmail:listOrganizations",
+ "workmail:listResourceDelegates",
+ "workmail:listResources",
+ "workmail:listUsers",
+ "workspaces:describeAccount",
+ "workspaces:describeAccountModifications",
+ "workspaces:describeIpGroups",
+ "workspaces:describeTags",
+ "workspaces:describeWorkspaceBundles",
+ "workspaces:describeWorkspaceDirectories",
+ "workspaces:describeWorkspaceImages",
+ "workspaces:describeWorkspaces",
+ "workspaces:describeWorkspacesConnectionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7W6266ELXF5MISDS",
+ "PolicyName": "AWSSupportServiceRolePolicy",
+ "UpdateDate": "2022-02-18T00:53:34+00:00",
+ "VersionId": "v21"
+ },
+ "AWSSystemsManagerAccountDiscoveryServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSystemsManagerAccountDiscoveryServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-24T17:21:05+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListChildren",
+ "organizations:ListParents",
+ "organizations:ListDelegatedServicesForAccount",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BPDSHIWK5",
+ "PolicyName": "AWSSystemsManagerAccountDiscoveryServicePolicy",
+ "UpdateDate": "2020-05-27T18:04:51+00:00",
+ "VersionId": "v2"
+ },
+ "AWSSystemsManagerChangeManagementServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSystemsManagerChangeManagementServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-07T22:21:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:CreateAssociation",
+ "ssm:DeleteAssociation",
+ "ssm:CreateOpsItem",
+ "ssm:GetOpsItem",
+ "ssm:UpdateOpsItem",
+ "ssm:StartAutomationExecution",
+ "ssm:StopAutomationExecution",
+ "ssm:GetAutomationExecution",
+ "ssm:GetCalendarState",
+ "ssm:GetDocument"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sso:ListDirectoryAssociations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sso-directory:DescribeUsers",
+ "sso-directory:IsMemberInGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:GetGroup",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MZTL6DXTC",
+ "PolicyName": "AWSSystemsManagerChangeManagementServicePolicy",
+ "UpdateDate": "2020-12-07T22:21:57+00:00",
+ "VersionId": "v1"
+ },
+ "AWSSystemsManagerOpsDataSyncServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSSystemsManagerOpsDataSyncServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-26T20:42:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:GetOpsItem",
+ "ssm:UpdateOpsItem"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/ExplorerSecurityHubOpsItem": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:CreateOpsItem"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:AddTagsToResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:opsitem/*"
+ },
+ {
+ "Action": [
+ "ssm:UpdateServiceSetting",
+ "ssm:GetServiceSetting"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:servicesetting/ssm/opsitem/*",
+ "arn:aws:ssm:*:*:servicesetting/ssm/opsdata/*"
+ ]
+ },
+ {
+ "Action": [
+ "securityhub:GetFindings",
+ "securityhub:BatchUpdateFindings"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "securityhub:BatchUpdateFindings",
+ "Condition": {
+ "Null": {
+ "securityhub:ASFFSyntaxPath/Confidence": false,
+ "securityhub:ASFFSyntaxPath/Criticality": false,
+ "securityhub:ASFFSyntaxPath/Note": false,
+ "securityhub:ASFFSyntaxPath/RelatedFindings": false,
+ "securityhub:ASFFSyntaxPath/Types": false,
+ "securityhub:ASFFSyntaxPath/UserDefinedFields": false,
+ "securityhub:ASFFSyntaxPath/VerificationState": false
+ },
+ "StringEquals": {
+ "securityhub:ASFFSyntaxPath/Workflow.Status": "SUPPRESSED"
+ }
+ },
+ "Effect": "Deny",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FUXS4O2QJ",
+ "PolicyName": "AWSSystemsManagerOpsDataSyncServiceRolePolicy",
+ "UpdateDate": "2021-04-26T20:42:39+00:00",
+ "VersionId": "v1"
+ },
+ "AWSThinkboxAWSPortalAdminPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxAWSPortalAdminPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:41:02+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachInternetGateway",
+ "ec2:AssociateAddress",
+ "ec2:AssociateRouteTable",
+ "ec2:AllocateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateFleet",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreatePlacementGroup",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeFleets",
+ "ec2:DescribeFleetHistory",
+ "ec2:DescribeFleetInstances",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeTags",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSpotFleetRequestHistory",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:GetConsoleOutput",
+ "ec2:ImportKeyPair",
+ "ec2:ReleaseAddress",
+ "ec2:RequestSpotFleet",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:DisassociateAddress",
+ "ec2:DeleteFleets",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteVpc",
+ "ec2:DeletePlacementGroup",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DisassociateRouteTable",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteNatGateway",
+ "ec2:DetachInternetGateway",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifyFleet",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:ModifyVpcAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:launch-template/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:placement-group/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*::image/*"
+ ]
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "StringLike": {
+ "ec2:InstanceProfile": "arn:aws:iam::*:instance-profile/AWSPortal*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": "ec2:TerminateInstances",
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/aws:cloudformation:logical-id": "ReverseForwarder"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:TerminateInstances",
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2spot:fleet-request-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:TerminateInstances",
+ "Condition": {
+ "StringLike": {
+ "ec2:PlacementGroup": "*DeadlinePlacementGroup*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:PlacementGroup": "*DeadlinePlacementGroup*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:internet-gateway/*",
+ "arn:aws:ec2:*:*:route-table/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:natgateway/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetUser"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:instance-profile/AWSPortal*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetPolicy",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListPolicyVersions"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:policy/AWSPortal*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:GetRolePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSPortal*",
+ "arn:aws:iam::*:role/DeadlineSpot*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2fleet.amazonaws.com",
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com",
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/AWSPortal*",
+ "arn:aws:iam::*:role/DeadlineSpot*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "ec2fleet.amazonaws.com",
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketVersioning",
+ "s3:PutBucketAcl",
+ "s3:PutBucketCORS",
+ "s3:PutBucketVersioning",
+ "s3:GetBucketAcl",
+ "s3:GetObject",
+ "s3:PutBucketLogging",
+ "s3:PutBucketTagging",
+ "s3:PutObject",
+ "s3:ListBucket",
+ "s3:ListBucketVersions",
+ "s3:PutEncryptionConfiguration",
+ "s3:PutLifecycleConfiguration",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3::*:awsportal*",
+ "arn:aws:s3::*:stack*",
+ "arn:aws:s3::*:aws-portal-cache*",
+ "arn:aws:s3::*:logs-for-aws-portal-cache*",
+ "arn:aws:s3::*:logs-for-stack*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:Scan"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/DeadlineFleetHealth*"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DeleteStack",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:ListStackResources",
+ "cloudformation:CreateChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:UpdateTerminationProtection"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/stack*/*",
+ "arn:aws:cloudformation:*:*:stack/Deadline*/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:EstimateTemplateCost",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "logs:PutRetentionPolicy",
+ "logs:DeleteRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/thinkbox*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogGroups",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:Encrypt",
+ "kms:GenerateDataKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "s3.*.amazonaws.com",
+ "secretsmanager.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret"
+ ],
+ "Condition": {
+ "StringLike": {
+ "secretsmanager:Name": [
+ "rcs-tls-pw*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:UpdateSecret",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:rcs-tls-pw*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BVM3T5TP2",
+ "PolicyName": "AWSThinkboxAWSPortalAdminPolicy",
+ "UpdateDate": "2020-08-20T17:16:03+00:00",
+ "VersionId": "v4"
+ },
+ "AWSThinkboxAWSPortalGatewayPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxAWSPortalGatewayPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:05:00+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/thinkbox*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-portal-cache*"
+ ]
+ },
+ {
+ "Action": "dynamodb:Scan",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/DeadlineFleetHealth*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::stack*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::stack*/gateway_certs/*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:rcs-tls-pw-stack*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FP27FM4BH",
+ "PolicyName": "AWSThinkboxAWSPortalGatewayPolicy",
+ "UpdateDate": "2020-06-30T16:02:07+00:00",
+ "VersionId": "v2"
+ },
+ "AWSThinkboxAWSPortalWorkerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxAWSPortalWorkerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:15:05+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/DeadlineRole": "DeadlineRenderNode"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-portal-cache*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::stack*/gateway_certs/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/thinkbox*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:SendMessage",
+ "sqs:GetQueueUrl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:DeadlineAWS*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PI3G53MMS",
+ "PolicyName": "AWSThinkboxAWSPortalWorkerPolicy",
+ "UpdateDate": "2020-12-07T23:27:47+00:00",
+ "VersionId": "v4"
+ },
+ "AWSThinkboxAssetServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxAssetServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:18:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/thinkbox*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-portal-cache*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KDWZE3HCT",
+ "PolicyName": "AWSThinkboxAssetServerPolicy",
+ "UpdateDate": "2020-05-27T19:18:53+00:00",
+ "VersionId": "v1"
+ },
+ "AWSThinkboxDeadlineResourceTrackerAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxDeadlineResourceTrackerAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:25:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "dynamodb:BatchWriteItem",
+ "dynamodb:DeleteItem",
+ "dynamodb:DescribeStream",
+ "dynamodb:DescribeTable",
+ "dynamodb:GetItem",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:PutItem",
+ "dynamodb:Scan",
+ "dynamodb:UpdateItem",
+ "dynamodb:UpdateTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/DeadlineEC2ComputeNodeHealth*",
+ "arn:aws:dynamodb:*:*:table/DeadlineEC2ComputeNodeInfo*",
+ "arn:aws:dynamodb:*:*:table/DeadlineFleetHealth*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CancelSpotFleetRequests",
+ "ec2:DeleteFleets",
+ "ec2:DescribeFleetInstances",
+ "ec2:DescribeFleets",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RebootInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/DeadlineTrackedAWSResource": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "events:PutEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:event-bus/default"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/lambda/DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:DeleteMessage",
+ "sqs:GetQueueAttributes",
+ "sqs:ReceiveMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:DeadlineAWSComputeNodeStateMessageQueue*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OUKJ73IOS",
+ "PolicyName": "AWSThinkboxDeadlineResourceTrackerAccessPolicy",
+ "UpdateDate": "2020-05-27T19:25:05+00:00",
+ "VersionId": "v1"
+ },
+ "AWSThinkboxDeadlineResourceTrackerAdminPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxDeadlineResourceTrackerAdminPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:29:09+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:ListStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:UpdateStack",
+ "cloudformation:DescribeStacks",
+ "cloudformation:UpdateTerminationProtection"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "dynamodb:CreateTable",
+ "dynamodb:DeleteTable",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTagsOfResource",
+ "dynamodb:TagResource",
+ "dynamodb:UntagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/DeadlineEC2ComputeNodeHealth*",
+ "arn:aws:dynamodb:*:*:table/DeadlineEC2ComputeNodeInfo*",
+ "arn:aws:dynamodb:*:*:table/DeadlineFleetHealth*"
+ ]
+ },
+ {
+ "Action": [
+ "dynamodb:BatchWriteItem",
+ "dynamodb:Scan"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/DeadlineFleetHealth*"
+ ]
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetUser"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "dynamodb.application-autoscaling.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lambda.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DeadlineResourceTrackerAccess*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "application-autoscaling.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:GetEventSourceMapping"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:CreateEventSourceMapping",
+ "lambda:DeleteEventSourceMapping"
+ ],
+ "Condition": {
+ "StringLike": {
+ "lambda:FunctionArn": [
+ "arn:aws:lambda:*:*:function:DeadlineResourceTracker*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:RemovePermission"
+ ],
+ "Condition": {
+ "StringLike": {
+ "lambda:Principal": "events.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:DeleteFunctionConcurrency",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListTags",
+ "lambda:PutFunctionConcurrency",
+ "lambda:TagResource",
+ "lambda:UntagResource",
+ "lambda:UpdateFunctionCode"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:DeadlineResourceTracker*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*/deadline_aws_resource_tracker-*.zip",
+ "arn:aws:s3:::*/DeadlineAWSResourceTrackerTemplate-*.yaml"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:CreateQueue",
+ "sqs:DeleteQueue",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueueTags",
+ "sqs:TagQueue",
+ "sqs:UntagQueue"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:DeadlineAWSComputeNodeState*",
+ "arn:aws:sqs:*:*:DeadlineResourceTracker*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FKWWNUOP2",
+ "PolicyName": "AWSThinkboxDeadlineResourceTrackerAdminPolicy",
+ "UpdateDate": "2021-12-23T01:01:48+00:00",
+ "VersionId": "v5"
+ },
+ "AWSThinkboxDeadlineSpotEventPluginAdminPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxDeadlineSpotEventPluginAdminPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:38:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CancelSpotFleetRequests",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:RequestSpotFleet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "RunInstances"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2spot:fleet-request-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:instance-profile/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role",
+ "arn:aws:iam::*:role/DeadlineSpot*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetUser"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role",
+ "arn:aws:iam::*:role/DeadlineSpot*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MNSGMZZZZ",
+ "PolicyName": "AWSThinkboxDeadlineSpotEventPluginAdminPolicy",
+ "UpdateDate": "2020-05-27T19:38:34+00:00",
+ "VersionId": "v1"
+ },
+ "AWSThinkboxDeadlineSpotEventPluginWorkerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AWSThinkboxDeadlineSpotEventPluginWorkerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-27T19:35:00+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/DeadlineTrackedAWSResource": "SpotEventPlugin"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/DeadlineResourceTracker": "SpotEventPlugin"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:GetQueueUrl",
+ "sqs:SendMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:DeadlineAWSComputeNodeState*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JS2KSV4B2",
+ "PolicyName": "AWSThinkboxDeadlineSpotEventPluginWorkerPolicy",
+ "UpdateDate": "2020-12-07T23:31:31+00:00",
+ "VersionId": "v2"
+ },
+ "AWSTransferConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSTransferConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-14T19:33:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "transfer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "health:DescribeEventAggregates",
+ "iam:GetPolicyVersion",
+ "iam:ListPolicies",
+ "iam:ListRoles",
+ "route53:ListHostedZones",
+ "s3:ListAllMyBuckets",
+ "transfer:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KYSTLCO3J",
+ "PolicyName": "AWSTransferConsoleFullAccess",
+ "UpdateDate": "2020-12-14T19:33:25+00:00",
+ "VersionId": "v1"
+ },
+ "AWSTransferFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSTransferFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-14T19:37:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "transfer:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "transfer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KGELFKPYK",
+ "PolicyName": "AWSTransferFullAccess",
+ "UpdateDate": "2020-12-14T19:37:23+00:00",
+ "VersionId": "v1"
+ },
+ "AWSTransferLoggingAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWSTransferLoggingAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-14T15:32:50+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:CreateLogGroup",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAISIP5WGJX7VKXRQZO",
+ "PolicyName": "AWSTransferLoggingAccess",
+ "UpdateDate": "2019-01-14T15:32:50+00:00",
+ "VersionId": "v1"
+ },
+ "AWSTransferReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSTransferReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-27T17:54:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "transfer:DescribeUser",
+ "transfer:DescribeServer",
+ "transfer:ListUsers",
+ "transfer:ListServers",
+ "transfer:TestIdentityProvider",
+ "transfer:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ITRAALBSI",
+ "PolicyName": "AWSTransferReadOnlyAccess",
+ "UpdateDate": "2020-08-27T17:54:51+00:00",
+ "VersionId": "v1"
+ },
+ "AWSTrustedAdvisorReportingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSTrustedAdvisorReportingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-19T17:41:13+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListChildren",
+ "organizations:ListParents",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NCBYW5OGK",
+ "PolicyName": "AWSTrustedAdvisorReportingServiceRolePolicy",
+ "UpdateDate": "2020-09-11T21:36:48+00:00",
+ "VersionId": "v2"
+ },
+ "AWSTrustedAdvisorServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSTrustedAdvisorServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-02-22T21:24:25+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "cloudformation:DescribeAccountLimits",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStacks",
+ "cloudfront:ListDistributions",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeReservedInstances",
+ "ec2:DescribeInstances",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeImages",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeReservedInstancesOfferings",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribeLaunchTemplateVersions",
+ "elasticloadbalancing:DescribeAccountLimits",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeLoadBalancerPolicyTypes",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "iam:GenerateCredentialReport",
+ "iam:GetAccountPasswordPolicy",
+ "iam:GetAccountSummary",
+ "iam:GetCredentialReport",
+ "iam:GetServerCertificate",
+ "iam:ListServerCertificates",
+ "kinesis:DescribeLimits",
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEngineDefaultParameters",
+ "rds:DescribeEvents",
+ "rds:DescribeOptionGroupOptions",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribeReservedDBInstances",
+ "rds:DescribeReservedDBInstancesOfferings",
+ "rds:ListTagsForResource",
+ "redshift:DescribeClusters",
+ "redshift:DescribeReservedNodeOfferings",
+ "redshift:DescribeReservedNodes",
+ "route53:GetAccountLimit",
+ "route53:GetHealthCheck",
+ "route53:GetHostedZone",
+ "route53:ListHealthChecks",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName",
+ "route53:ListResourceRecordSets",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetBucketAcl",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPolicyStatus",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "ses:GetSendQuota",
+ "sqs:ListQueues",
+ "cloudwatch:GetMetricStatistics",
+ "ce:GetReservationPurchaseRecommendation",
+ "ce:GetSavingsPlansPurchaseRecommendation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJH4QJ2WMHBOB47BUE",
+ "PolicyName": "AWSTrustedAdvisorServiceRolePolicy",
+ "UpdateDate": "2021-08-10T22:41:30+00:00",
+ "VersionId": "v9"
+ },
+ "AWSVPCS2SVpnServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSVPCS2SVpnServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-08-06T14:13:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ExportCertificate",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm-pca:DescribeCertificateAuthority"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "0"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ENV7ZVNT6",
+ "PolicyName": "AWSVPCS2SVpnServiceRolePolicy",
+ "UpdateDate": "2019-08-06T14:13:58+00:00",
+ "VersionId": "v1"
+ },
+ "AWSVPCTransitGatewayServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AWSVPCTransitGatewayServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-11-26T16:21:17+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:AssignIpv6Addresses",
+ "ec2:UnAssignIpv6Addresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "0"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJS2PBJSYV2EZW3MIQ",
+ "PolicyName": "AWSVPCTransitGatewayServiceRolePolicy",
+ "UpdateDate": "2021-04-15T16:31:44+00:00",
+ "VersionId": "v2"
+ },
+ "AWSWAFConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-06T18:38:38+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET",
+ "apigateway:SetWebACL",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListDistributionsByWebACLId",
+ "cloudfront:UpdateDistribution",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeRegions",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:SetWebACL",
+ "appsync:ListGraphqlApis",
+ "appsync:SetWebACL",
+ "waf-regional:*",
+ "waf:*",
+ "wafv2:*",
+ "s3:ListAllMyBuckets",
+ "logs:DescribeResourcePolicies",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowUseOfAWSWAF"
+ },
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:DeleteLogDelivery"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowLogDeliverySubscription"
+ },
+ {
+ "Action": [
+ "s3:PutBucketPolicy",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-waf-logs-*"
+ ],
+ "Sid": "GrantLogDeliveryPermissionForS3Bucket"
+ },
+ {
+ "Action": [
+ "logs:PutResourcePolicy"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "wafv2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "GrantLogDeliveryPermissionForCloudWatchLogGroup"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AZOTQ7KAT",
+ "PolicyName": "AWSWAFConsoleFullAccess",
+ "UpdateDate": "2022-01-11T19:34:04+00:00",
+ "VersionId": "v4"
+ },
+ "AWSWAFConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-06T18:43:24+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListDistributionsByWebACLId",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeRegions",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "appsync:ListGraphqlApis",
+ "waf-regional:Get*",
+ "waf-regional:List*",
+ "waf:Get*",
+ "waf:List*",
+ "wafv2:Describe*",
+ "wafv2:Get*",
+ "wafv2:List*",
+ "wafv2:CheckCapacity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NCJLTIT64",
+ "PolicyName": "AWSWAFConsoleReadOnlyAccess",
+ "UpdateDate": "2020-10-01T20:13:54+00:00",
+ "VersionId": "v3"
+ },
+ "AWSWAFFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-06T20:44:00+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "waf:*",
+ "waf-regional:*",
+ "wafv2:*",
+ "elasticloadbalancing:SetWebACL",
+ "apigateway:SetWebACL",
+ "appsync:SetWebACL",
+ "logs:DescribeResourcePolicies",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowUseOfAWSWAF"
+ },
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:DeleteLogDelivery"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowLogDeliverySubscription"
+ },
+ {
+ "Action": [
+ "s3:PutBucketPolicy",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-waf-logs-*"
+ ],
+ "Sid": "GrantLogDeliveryPermissionForS3Bucket"
+ },
+ {
+ "Action": [
+ "logs:PutResourcePolicy"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "wafv2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "GrantLogDeliveryPermissionForCloudWatchLogGroup"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMIKIAFXZEGOLRH7C",
+ "PolicyName": "AWSWAFFullAccess",
+ "UpdateDate": "2022-01-11T19:33:38+00:00",
+ "VersionId": "v7"
+ },
+ "AWSWAFReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSWAFReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-06T20:43:45+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "waf:Get*",
+ "waf:List*",
+ "waf-regional:Get*",
+ "waf-regional:List*",
+ "wafv2:Get*",
+ "wafv2:List*",
+ "wafv2:Describe*",
+ "wafv2:CheckCapacity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINZVDMX2SBF7EU2OC",
+ "PolicyName": "AWSWAFReadOnlyAccess",
+ "UpdateDate": "2020-06-22T22:38:54+00:00",
+ "VersionId": "v4"
+ },
+ "AWSXRayDaemonWriteAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-28T23:00:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingStatisticSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOE47HSUE5AVBNEDM",
+ "PolicyName": "AWSXRayDaemonWriteAccess",
+ "UpdateDate": "2018-08-28T23:00:33+00:00",
+ "VersionId": "v1"
+ },
+ "AWSXrayFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:30:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQBYG45NSJMVQDB2K",
+ "PolicyName": "AWSXrayFullAccess",
+ "UpdateDate": "2016-12-01T18:30:55+00:00",
+ "VersionId": "v1"
+ },
+ "AWSXrayReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:27:02+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingStatisticSummaries",
+ "xray:BatchGetTraces",
+ "xray:GetServiceGraph",
+ "xray:GetTraceGraph",
+ "xray:GetTraceSummaries",
+ "xray:GetGroups",
+ "xray:GetGroup",
+ "xray:ListTagsForResource",
+ "xray:GetTimeSeriesServiceStatistics",
+ "xray:GetInsightSummaries",
+ "xray:GetInsight",
+ "xray:GetInsightEvents",
+ "xray:GetInsightImpactGraph"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIH4OFXWPS6ZX6OPGQ",
+ "PolicyName": "AWSXrayReadOnlyAccess",
+ "UpdateDate": "2020-09-03T22:19:40+00:00",
+ "VersionId": "v5"
+ },
+ "AWSXrayWriteOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T18:19:53+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:PutTraceSegments",
+ "xray:PutTelemetryRecords",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:GetSamplingStatisticSummaries"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAACM4LMYSRGBCTM6",
+ "PolicyName": "AWSXrayWriteOnlyAccess",
+ "UpdateDate": "2018-08-28T23:03:04+00:00",
+ "VersionId": "v2"
+ },
+ "AWS_ConfigRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AWS_ConfigRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-15T20:30:30+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:GetAnalyzer",
+ "access-analyzer:GetArchiveRule",
+ "access-analyzer:ListAnalyzers",
+ "access-analyzer:ListArchiveRules",
+ "access-analyzer:ListTagsForResource",
+ "account:GetAlternateContact",
+ "acm:DescribeCertificate",
+ "acm:ListCertificates",
+ "acm:ListTagsForCertificate",
+ "apigateway:GET",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:DescribePolicies",
+ "autoscaling:DescribeScheduledActions",
+ "autoscaling:DescribeTags",
+ "backup-gateway:ListTagsForResource",
+ "backup-gateway:ListVirtualMachines",
+ "backup:DescribeBackupVault",
+ "backup:DescribeRecoveryPoint",
+ "backup:GetBackupPlan",
+ "backup:GetBackupSelection",
+ "backup:GetBackupVaultAccessPolicy",
+ "backup:GetBackupVaultNotifications",
+ "backup:ListBackupPlans",
+ "backup:ListBackupSelections",
+ "backup:ListBackupVaults",
+ "backup:ListRecoveryPointsByBackupVault",
+ "backup:ListTags",
+ "batch:DescribeComputeEnvironments",
+ "batch:DescribeJobQueues",
+ "batch:ListTagsForResource",
+ "cloudformation:DescribeType",
+ "cloudformation:ListTypes",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListTagsForResource",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudwatch:DescribeAlarms",
+ "codedeploy:GetDeploymentConfig",
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:ListPipelines",
+ "config:BatchGet*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "config:Put*",
+ "config:Select*",
+ "dax:DescribeClusters",
+ "dax:ListTags",
+ "dms:DescribeCertificates",
+ "dms:DescribeEventSubscriptions",
+ "dms:DescribeReplicationInstances",
+ "dms:DescribeReplicationSubnetGroups",
+ "dms:ListTagsForResource",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeGlobalTable",
+ "dynamodb:DescribeGlobalTableSettings",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "ec2:Describe*",
+ "ec2:DescribeClientVpnAuthorizationRules",
+ "ec2:DescribeClientVpnEndpoints",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeFleets",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeVolumeAttribute",
+ "ec2:DescribeVolumes",
+ "ec2:GetEbsEncryptionByDefault",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:ListTagsForResource",
+ "ecr:DescribeRepositories",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetRepositoryPolicy",
+ "ecr:ListTagsForResource",
+ "ecs:DescribeClusters",
+ "ecs:DescribeServices",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTaskSets",
+ "ecs:ListClusters",
+ "ecs:ListServices",
+ "ecs:ListTagsForResource",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "eks:DescribeCluster",
+ "eks:DescribeFargateProfile",
+ "eks:DescribeNodegroup",
+ "eks:ListClusters",
+ "eks:ListFargateProfiles",
+ "eks:ListNodegroups",
+ "eks:ListTagsForResource",
+ "elasticache:DescribeCacheClusters",
+ "elasticache:DescribeCacheParameterGroups",
+ "elasticache:DescribeCacheSubnetGroups",
+ "elasticache:DescribeReplicationGroups",
+ "elasticache:DescribeSnapshots",
+ "elasticache:ListTagsForResource",
+ "elasticbeanstalk:DescribeConfigurationSettings",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeBackupPolicy",
+ "elasticfilesystem:DescribeFileSystemPolicy",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeLifecycleConfiguration",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTags",
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:DescribeSecurityConfiguration",
+ "elasticmapreduce:DescribeStep",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:GetManagedScalingPolicy",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstanceFleets",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "elasticmapreduce:ListSteps",
+ "es:DescribeDomain",
+ "es:DescribeDomains",
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeElasticsearchDomains",
+ "es:GetCompatibleElasticsearchVersions",
+ "es:GetCompatibleVersions",
+ "es:ListDomainNames",
+ "es:ListTags",
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams",
+ "firehose:ListTagsForDeliveryStream",
+ "fsx:DescribeFileSystems",
+ "fsx:ListTagsForResource",
+ "globalaccelerator:DescribeAccelerator",
+ "globalaccelerator:DescribeEndpointGroup",
+ "globalaccelerator:DescribeListener",
+ "globalaccelerator:ListAccelerators",
+ "globalaccelerator:ListEndpointGroups",
+ "globalaccelerator:ListListeners",
+ "globalaccelerator:ListTagsForResource",
+ "guardduty:GetDetector",
+ "guardduty:GetFindings",
+ "guardduty:GetMasterAccount",
+ "guardduty:ListDetectors",
+ "guardduty:ListFindings",
+ "guardduty:ListOrganizationAdminAccounts",
+ "iam:GenerateCredentialReport",
+ "iam:GetAccountAuthorizationDetails",
+ "iam:GetAccountPasswordPolicy",
+ "iam:GetAccountSummary",
+ "iam:GetCredentialReport",
+ "iam:GetGroup",
+ "iam:GetGroupPolicy",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:GetUser",
+ "iam:GetUserPolicy",
+ "iam:ListAttachedGroupPolicies",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListAttachedUserPolicies",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfilesForRole",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListUserPolicies",
+ "iam:ListVirtualMFADevices",
+ "kafka:DescribeCluster",
+ "kafka:ListClusters",
+ "kinesis:DescribeStreamConsumer",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListStreamConsumers",
+ "kinesis:ListStreams",
+ "kinesis:ListTagsForStream",
+ "kms:DescribeKey",
+ "kms:GetKeyPolicy",
+ "kms:GetKeyRotationStatus",
+ "kms:ListAliases",
+ "kms:ListKeys",
+ "kms:ListResourceTags",
+ "lambda:GetAlias",
+ "lambda:GetFunction",
+ "lambda:GetFunctionCodeSigningConfig",
+ "lambda:GetPolicy",
+ "lambda:ListAliases",
+ "lambda:ListFunctions",
+ "lambda:ListVersionsByFunction",
+ "logs:DescribeLogGroups",
+ "logs:ListTagsLogGroup",
+ "network-firewall:DescribeLoggingConfiguration",
+ "network-firewall:ListFirewalls",
+ "opsworks:DescribeLayers",
+ "opsworks:ListTags",
+ "organizations:DescribeOrganization",
+ "organizations:DescribePolicy",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSnapshotAttributes",
+ "rds:DescribeDBSnapshots",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeOptionGroups",
+ "rds:ListTagsForResource",
+ "redshift:DescribeClusterParameterGroups",
+ "redshift:DescribeClusterParameters",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:DescribeClusterSnapshots",
+ "redshift:DescribeClusterSubnetGroups",
+ "redshift:DescribeEventSubscriptions",
+ "redshift:DescribeLoggingStatus",
+ "route53:GetHealthCheck",
+ "route53:GetHostedZone",
+ "route53:ListHealthChecks",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName",
+ "route53:ListQueryLoggingConfigs",
+ "route53:ListResourceRecordSets",
+ "route53:ListTagsForResource",
+ "route53resolver:GetResolverEndpoint",
+ "route53resolver:GetResolverRule",
+ "route53resolver:GetResolverRuleAssociation",
+ "route53resolver:ListResolverEndpointIpAddresses",
+ "route53resolver:ListResolverEndpoints",
+ "route53resolver:ListResolverRuleAssociations",
+ "route53resolver:ListResolverRules",
+ "route53resolver:ListTagsForResource",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetAccessPoint",
+ "s3:GetAccessPointPolicy",
+ "s3:GetAccessPointPolicyStatus",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCORS",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketNotification",
+ "s3:GetBucketObjectLockConfiguration",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetBucketRequestPayment",
+ "s3:GetBucketTagging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetReplicationConfiguration",
+ "s3:ListAccessPoints",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sagemaker:DescribeCodeRepository",
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:DescribeEndpointConfig",
+ "sagemaker:DescribeModel",
+ "sagemaker:DescribeMonitoringSchedule",
+ "sagemaker:DescribeNotebookInstance",
+ "sagemaker:DescribeNotebookInstanceLifecycleConfig",
+ "sagemaker:DescribeWorkteam",
+ "sagemaker:ListCodeRepositories",
+ "sagemaker:ListEndpointConfigs",
+ "sagemaker:ListEndpoints",
+ "sagemaker:ListModels",
+ "sagemaker:ListMonitoringSchedules",
+ "sagemaker:ListNotebookInstanceLifecycleConfigs",
+ "sagemaker:ListNotebookInstances",
+ "sagemaker:ListTags",
+ "sagemaker:ListWorkteams",
+ "secretsmanager:ListSecrets",
+ "secretsmanager:ListSecretVersionIds",
+ "securityhub:DescribeHub",
+ "shield:DescribeDRTAccess",
+ "shield:DescribeProtection",
+ "shield:DescribeSubscription",
+ "sns:GetSubscriptionAttributes",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTagsForResource",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues",
+ "sqs:ListQueueTags",
+ "ssm:DescribeAutomationExecutions",
+ "ssm:DescribeDocument",
+ "ssm:DescribeDocumentPermission",
+ "ssm:GetAutomationExecution",
+ "ssm:GetDocument",
+ "ssm:ListDocuments",
+ "states:DescribeActivity",
+ "states:DescribeStateMachine",
+ "states:ListActivities",
+ "states:ListStateMachines",
+ "states:ListTagsForResource",
+ "storagegateway:ListGateways",
+ "storagegateway:ListTagsForResource",
+ "storagegateway:ListVolumes",
+ "support:DescribeCases",
+ "tag:GetResources",
+ "waf-regional:GetLoggingConfiguration",
+ "waf-regional:GetWebACL",
+ "waf-regional:GetWebACLForResource",
+ "waf:GetLoggingConfiguration",
+ "waf:GetWebACL",
+ "wafv2:GetLoggingConfiguration",
+ "wafv2:GetRuleGroup",
+ "wafv2:ListRuleGroups",
+ "wafv2:ListTagsForResource",
+ "workspaces:DescribeConnectionAliases",
+ "workspaces:DescribeTags",
+ "workspaces:DescribeWorkspaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/config/*"
+ },
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/config/*:log-stream:config-rule-evaluation/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PP7QZ4FBG",
+ "PolicyName": "AWS_ConfigRole",
+ "UpdateDate": "2022-03-11T21:35:16+00:00",
+ "VersionId": "v11"
+ },
+ "AccessAnalyzerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AccessAnalyzerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-02T17:13:10+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeByoipCidrs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "kms:DescribeKey",
+ "kms:GetKeyPolicy",
+ "kms:ListGrants",
+ "kms:ListKeyPolicies",
+ "kms:ListKeys",
+ "lambda:GetLayerVersionPolicy",
+ "lambda:GetPolicy",
+ "lambda:ListAliases",
+ "lambda:ListFunctions",
+ "lambda:ListLayers",
+ "lambda:ListLayerVersions",
+ "lambda:ListVersionsByFunction",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListChildren",
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListParents",
+ "organizations:ListRoots",
+ "s3:DescribeMultiRegionAccessPointOperation",
+ "s3:GetAccessPoint",
+ "s3:GetAccessPointPolicy",
+ "s3:GetAccessPointPolicyStatus",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicyStatus",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetMultiRegionAccessPoint",
+ "s3:GetMultiRegionAccessPointPolicy",
+ "s3:GetMultiRegionAccessPointPolicyStatus",
+ "s3:ListAccessPoints",
+ "s3:ListAllMyBuckets",
+ "s3:ListMultiRegionAccessPoints",
+ "sns:GetTopicAttributes",
+ "sns:ListTopics",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:GetResourcePolicy",
+ "secretsmanager:ListSecrets",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CAIXDDRI2",
+ "PolicyName": "AccessAnalyzerServiceRolePolicy",
+ "UpdateDate": "2021-09-02T16:49:47+00:00",
+ "VersionId": "v6"
+ },
+ "AdministratorAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AdministratorAccess",
+ "AttachmentCount": 8,
+ "CreateDate": "2015-02-06T18:39:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWMBCKSKIEE64ZLYK",
+ "PolicyName": "AdministratorAccess",
+ "UpdateDate": "2015-02-06T18:39:46+00:00",
+ "VersionId": "v1"
+ },
+ "AdministratorAccess-AWSElasticBeanstalk": {
+ "Arn": "arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-22T19:36:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:Describe*",
+ "acm:List*",
+ "autoscaling:Describe*",
+ "cloudformation:Describe*",
+ "cloudformation:Estimate*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:Validate*",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "codecommit:Get*",
+ "codecommit:UploadArchive",
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroup*",
+ "ec2:CreateLaunchTemplate*",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteLaunchTemplate*",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroup*",
+ "ecs:CreateCluster",
+ "ecs:DeRegisterTaskDefinition",
+ "ecs:Describe*",
+ "ecs:List*",
+ "ecs:RegisterTaskDefinition",
+ "elasticbeanstalk:*",
+ "elasticloadbalancing:Describe*",
+ "iam:GetRole",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "iam:ListServerCertificates",
+ "logs:Describe*",
+ "rds:Describe*",
+ "s3:ListAllMyBuckets",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "autoscaling:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/eb-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/eb-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CancelUpdateStack",
+ "cloudformation:ContinueUpdateRollback",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStackResources",
+ "cloudformation:SignalResource",
+ "cloudformation:TagResource",
+ "cloudformation:UntagResource",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/awseb-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:awseb-*",
+ "arn:aws:cloudwatch:*:*:alarm:eb-*"
+ ]
+ },
+ {
+ "Action": [
+ "codebuild:BatchGetBuilds",
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codebuild:*:*:project/Elastic-Beanstalk-*"
+ },
+ {
+ "Action": [
+ "dynamodb:CreateTable",
+ "dynamodb:DeleteTable",
+ "dynamodb:DescribeTable",
+ "dynamodb:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/awseb-e-*",
+ "arn:aws:dynamodb:*:*:table/eb-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RebootInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": [
+ "arn:aws:cloudformation:*:*:stack/awseb-e-*",
+ "arn:aws:cloudformation:*:*:stack/eb-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "ArnLike": {
+ "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ecs:DeleteCluster"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:cluster/awseb-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:*Rule",
+ "elasticloadbalancing:*Tags",
+ "elasticloadbalancing:SetRulePriorities",
+ "elasticloadbalancing:SetSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*/*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/awseb-*/*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/eb-*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener/awseb-*",
+ "arn:aws:elasticloadbalancing:*:*:listener/eb-*",
+ "arn:aws:elasticloadbalancing:*:*:listener/*/awseb-*/*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener/*/eb-*/*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/awseb-*/*/*/*",
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/eb-*/*/*/*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:AddRoleToInstanceProfile",
+ "iam:CreateInstanceProfile",
+ "iam:CreateRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-elasticbeanstalk*",
+ "arn:aws:iam::*:instance-profile/aws-elasticbeanstalk*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:AttachRolePolicy"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PolicyArn": [
+ "arn:aws:iam::aws:policy/AWSElasticBeanstalk*",
+ "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalk*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-elasticbeanstalk*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "elasticbeanstalk.amazonaws.com",
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn",
+ "autoscaling.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "ecs.amazonaws.com",
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "autoscaling.amazonaws.com",
+ "elasticbeanstalk.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "managedupdates.elasticbeanstalk.amazonaws.com",
+ "maintenance.elasticbeanstalk.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling*",
+ "arn:aws:iam::*:role/aws-service-role/elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*",
+ "arn:aws:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing*",
+ "arn:aws:iam::*:role/aws-service-role/managedupdates.elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*",
+ "arn:aws:iam::*:role/aws-service-role/maintenance.elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DeleteLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*"
+ },
+ {
+ "Action": [
+ "rds:*DBSubnetGroup",
+ "rds:AuthorizeDBSecurityGroupIngress",
+ "rds:CreateDBInstance",
+ "rds:CreateDBSecurityGroup",
+ "rds:DeleteDBInstance",
+ "rds:DeleteDBSecurityGroup",
+ "rds:ModifyDBInstance",
+ "rds:RestoreDBInstanceFromDBSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:db:*",
+ "arn:aws:rds:*:*:secgrp:awseb-e-*",
+ "arn:aws:rds:*:*:secgrp:eb-*",
+ "arn:aws:rds:*:*:snapshot:*",
+ "arn:aws:rds:*:*:subgrp:awseb-e-*",
+ "arn:aws:rds:*:*:subgrp:eb-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:Delete*",
+ "s3:Get*",
+ "s3:Put*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*/*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:GetBucket*",
+ "s3:ListBucket",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::elasticbeanstalk-*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:GetTopicAttributes",
+ "sns:Publish",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:ElasticBeanstalkNotifications-*"
+ },
+ {
+ "Action": [
+ "sqs:*QueueAttributes",
+ "sqs:CreateQueue",
+ "sqs:DeleteQueue",
+ "sqs:SendMessage",
+ "sqs:TagQueue"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:awseb-e-*",
+ "arn:aws:sqs:*:*:eb-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AX52KWGWY",
+ "PolicyName": "AdministratorAccess-AWSElasticBeanstalk",
+ "UpdateDate": "2021-03-09T22:36:27+00:00",
+ "VersionId": "v2"
+ },
+ "AdministratorAccess-Amplify": {
+ "Arn": "arn:aws:iam::aws:policy/AdministratorAccess-Amplify",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T19:03:08+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateChangeSet",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:GetTemplate",
+ "cloudformation:UpdateStack",
+ "cloudformation:ListStackResources",
+ "cloudformation:DeleteStackSet",
+ "cloudformation:DescribeStackSet",
+ "cloudformation:UpdateStackSet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/amplify-*"
+ ],
+ "Sid": "CLICloudformationPolicy"
+ },
+ {
+ "Action": [
+ "iam:ListRoleTags",
+ "iam:TagRole",
+ "iam:AttachRolePolicy",
+ "iam:CreatePolicy",
+ "iam:DeletePolicy",
+ "iam:DeleteRole",
+ "iam:DeleteRolePolicy",
+ "iam:DetachRolePolicy",
+ "iam:PutRolePolicy",
+ "iam:UpdateRole",
+ "iam:GetRole",
+ "iam:GetPolicy",
+ "iam:GetRolePolicy",
+ "iam:PassRole",
+ "iam:ListPolicyVersions",
+ "iam:CreatePolicyVersion",
+ "iam:DeletePolicyVersion",
+ "iam:CreateRole",
+ "iam:ListRolePolicies",
+ "iam:PutRolePermissionsBoundary",
+ "iam:DeleteRolePermissionsBoundary",
+ "appsync:CreateApiKey",
+ "appsync:CreateDataSource",
+ "appsync:CreateFunction",
+ "appsync:CreateResolver",
+ "appsync:CreateType",
+ "appsync:DeleteApiKey",
+ "appsync:DeleteDataSource",
+ "appsync:DeleteFunction",
+ "appsync:DeleteResolver",
+ "appsync:DeleteType",
+ "appsync:GetDataSource",
+ "appsync:GetFunction",
+ "appsync:GetIntrospectionSchema",
+ "appsync:GetResolver",
+ "appsync:GetSchemaCreationStatus",
+ "appsync:GetType",
+ "appsync:GraphQL",
+ "appsync:ListApiKeys",
+ "appsync:ListDataSources",
+ "appsync:ListFunctions",
+ "appsync:ListGraphqlApis",
+ "appsync:ListResolvers",
+ "appsync:ListResolversByFunction",
+ "appsync:ListTypes",
+ "appsync:StartSchemaCreation",
+ "appsync:UpdateApiKey",
+ "appsync:UpdateDataSource",
+ "appsync:UpdateFunction",
+ "appsync:UpdateResolver",
+ "appsync:UpdateType",
+ "appsync:TagResource",
+ "appsync:CreateGraphqlApi",
+ "appsync:DeleteGraphqlApi",
+ "appsync:GetGraphqlApi",
+ "appsync:ListTagsForResource",
+ "appsync:UpdateGraphqlApi",
+ "apigateway:DELETE",
+ "apigateway:GET",
+ "apigateway:PATCH",
+ "apigateway:POST",
+ "apigateway:PUT",
+ "cognito-idp:CreateUserPool",
+ "cognito-identity:CreateIdentityPool",
+ "cognito-identity:DeleteIdentityPool",
+ "cognito-identity:DescribeIdentity",
+ "cognito-identity:DescribeIdentityPool",
+ "cognito-identity:SetIdentityPoolRoles",
+ "cognito-identity:GetIdentityPoolRoles",
+ "cognito-identity:UpdateIdentityPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:DeleteUserPool",
+ "cognito-idp:DeleteUserPoolClient",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:ListTagsForResource",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-idp:UpdateUserPoolClient",
+ "cognito-idp:CreateGroup",
+ "cognito-idp:DeleteGroup",
+ "cognito-identity:TagResource",
+ "cognito-idp:TagResource",
+ "cognito-idp:UpdateUserPool",
+ "cognito-idp:SetUserPoolMfaConfig",
+ "lambda:AddPermission",
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:InvokeAsync",
+ "lambda:InvokeFunction",
+ "lambda:RemovePermission",
+ "lambda:UpdateFunctionCode",
+ "lambda:UpdateFunctionConfiguration",
+ "lambda:ListTags",
+ "lambda:TagResource",
+ "lambda:UntagResource",
+ "lambda:AddLayerVersionPermission",
+ "lambda:CreateEventSourceMapping",
+ "lambda:DeleteEventSourceMapping",
+ "lambda:DeleteLayerVersion",
+ "lambda:GetEventSourceMapping",
+ "lambda:GetLayerVersion",
+ "lambda:ListEventSourceMappings",
+ "lambda:ListLayerVersions",
+ "lambda:PublishLayerVersion",
+ "lambda:RemoveLayerVersionPermission",
+ "dynamodb:CreateTable",
+ "dynamodb:DeleteItem",
+ "dynamodb:DeleteTable",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeTimeToLive",
+ "dynamodb:ListStreams",
+ "dynamodb:PutItem",
+ "dynamodb:TagResource",
+ "dynamodb:ListTagsOfResource",
+ "dynamodb:UpdateContinuousBackups",
+ "dynamodb:UpdateItem",
+ "dynamodb:UpdateTable",
+ "dynamodb:UpdateTimeToLive",
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:PutBucketAcl",
+ "s3:PutBucketCORS",
+ "s3:PutBucketNotification",
+ "s3:PutBucketPolicy",
+ "s3:PutBucketWebsite",
+ "s3:PutObjectAcl",
+ "cloudfront:CreateCloudFrontOriginAccessIdentity",
+ "cloudfront:CreateDistribution",
+ "cloudfront:DeleteCloudFrontOriginAccessIdentity",
+ "cloudfront:DeleteDistribution",
+ "cloudfront:GetCloudFrontOriginAccessIdentity",
+ "cloudfront:GetCloudFrontOriginAccessIdentityConfig",
+ "cloudfront:GetDistribution",
+ "cloudfront:GetDistributionConfig",
+ "cloudfront:TagResource",
+ "cloudfront:UntagResource",
+ "cloudfront:UpdateCloudFrontOriginAccessIdentity",
+ "cloudfront:UpdateDistribution",
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "mobiletargeting:GetApp",
+ "kinesis:AddTagsToStream",
+ "kinesis:CreateStream",
+ "kinesis:DeleteStream",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListTagsForStream",
+ "kinesis:PutRecords",
+ "es:AddTags",
+ "es:CreateElasticsearchDomain",
+ "es:DeleteElasticsearchDomain",
+ "es:DescribeElasticsearchDomain",
+ "s3:PutEncryptionConfiguration"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "cloudformation.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CLIManageviaCFNPolicy"
+ },
+ {
+ "Action": [
+ "appsync:GetIntrospectionSchema",
+ "appsync:GraphQL",
+ "appsync:UpdateApiKey",
+ "appsync:ListApiKeys",
+ "amplify:*",
+ "amplifybackend:*",
+ "amplifyuibuilder:*",
+ "sts:AssumeRole",
+ "mobiletargeting:*",
+ "cognito-idp:AdminAddUserToGroup",
+ "cognito-idp:AdminCreateUser",
+ "cognito-idp:CreateGroup",
+ "cognito-idp:DeleteGroup",
+ "cognito-idp:DeleteUser",
+ "cognito-idp:ListUsers",
+ "cognito-idp:AdminGetUser",
+ "cognito-idp:ListUsersInGroup",
+ "cognito-idp:AdminDisableUser",
+ "cognito-idp:AdminRemoveUserFromGroup",
+ "cognito-idp:AdminResetUserPassword",
+ "cognito-idp:AdminListGroupsForUser",
+ "cognito-idp:ListGroups",
+ "cognito-idp:AdminListUserAuthEvents",
+ "cognito-idp:AdminDeleteUser",
+ "cognito-idp:AdminConfirmSignUp",
+ "cognito-idp:AdminEnableUser",
+ "cognito-idp:AdminUpdateUserAttributes",
+ "cognito-idp:DescribeIdentityProvider",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DeleteUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:CreateUserPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:UpdateUserPool",
+ "cognito-idp:AdminSetUserPassword",
+ "cognito-idp:ListUserPools",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-idp:ListIdentityProviders",
+ "cognito-idp:GetUserPoolMfaConfig",
+ "cognito-identity:GetIdentityPoolRoles",
+ "cognito-identity:SetIdentityPoolRoles",
+ "cognito-identity:CreateIdentityPool",
+ "cognito-identity:DeleteIdentityPool",
+ "cognito-identity:ListIdentityPools",
+ "cognito-identity:DescribeIdentityPool",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "lambda:GetFunction",
+ "lambda:CreateFunction",
+ "lambda:AddPermission",
+ "lambda:DeleteFunction",
+ "lambda:DeleteLayerVersion",
+ "lambda:InvokeFunction",
+ "lambda:ListLayerVersions",
+ "iam:PutRolePolicy",
+ "iam:CreatePolicy",
+ "iam:AttachRolePolicy",
+ "iam:ListPolicyVersions",
+ "iam:ListAttachedRolePolicies",
+ "iam:CreateRole",
+ "iam:PassRole",
+ "iam:ListRolePolicies",
+ "iam:DeleteRolePolicy",
+ "iam:CreatePolicyVersion",
+ "iam:DeletePolicyVersion",
+ "iam:DeleteRole",
+ "iam:DetachRolePolicy",
+ "cloudformation:ListStacks",
+ "sns:CreateSMSSandboxPhoneNumber",
+ "sns:GetSMSSandboxAccountStatus",
+ "sns:VerifySMSSandboxPhoneNumber",
+ "sns:DeleteSMSSandboxPhoneNumber",
+ "sns:ListSMSSandboxPhoneNumbers",
+ "sns:ListOriginationNumbers",
+ "rekognition:DescribeCollection",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "lex:GetBot",
+ "lex:GetBuiltinIntent",
+ "lex:GetBuiltinIntents",
+ "lex:GetBuiltinSlotTypes",
+ "cloudformation:GetTemplateSummary",
+ "codecommit:GitPull"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CLISDKCalls"
+ },
+ {
+ "Action": [
+ "ssm:PutParameter",
+ "ssm:DeleteParameter",
+ "ssm:GetParametersByPath",
+ "ssm:GetParameters",
+ "ssm:GetParameter",
+ "ssm:DeleteParameters"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/amplify/*",
+ "Sid": "AmplifySSMCalls"
+ },
+ {
+ "Action": [
+ "geo:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "GeoPowerUser"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteBucketWebsite",
+ "s3:DeleteObject",
+ "s3:DeleteObjectVersion",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:ListBucketVersions",
+ "s3:PutBucketAcl",
+ "s3:PutBucketCORS",
+ "s3:PutBucketNotification",
+ "s3:PutBucketPolicy",
+ "s3:PutBucketVersioning",
+ "s3:PutBucketWebsite",
+ "s3:PutEncryptionConfiguration",
+ "s3:PutLifecycleConfiguration",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmplifyStorageSDKCalls"
+ },
+ {
+ "Action": [
+ "cloudfront:CreateCloudFrontOriginAccessIdentity",
+ "cloudfront:CreateDistribution",
+ "cloudfront:CreateInvalidation",
+ "cloudfront:GetDistribution",
+ "cloudfront:GetDistributionConfig",
+ "cloudfront:ListCloudFrontOriginAccessIdentities",
+ "cloudfront:ListDistributions",
+ "cloudfront:ListDistributionsByLambdaFunction",
+ "cloudfront:ListDistributionsByWebACLId",
+ "cloudfront:ListFieldLevelEncryptionConfigs",
+ "cloudfront:ListFieldLevelEncryptionProfiles",
+ "cloudfront:ListInvalidations",
+ "cloudfront:ListPublicKeys",
+ "cloudfront:ListStreamingDistributions",
+ "cloudfront:UpdateDistribution",
+ "cloudfront:TagResource",
+ "cloudfront:UntagResource",
+ "cloudfront:ListTagsForResource",
+ "iam:AttachRolePolicy",
+ "iam:CreateRole",
+ "iam:CreateServiceLinkedRole",
+ "iam:GetRole",
+ "iam:PutRolePolicy",
+ "iam:PassRole",
+ "lambda:CreateFunction",
+ "lambda:EnableReplication",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:PublishVersion",
+ "lambda:UpdateFunctionCode",
+ "lambda:UpdateFunctionConfiguration",
+ "lambda:ListTags",
+ "lambda:TagResource",
+ "lambda:UntagResource",
+ "route53:ChangeResourceRecordSets",
+ "route53:ListHostedZonesByName",
+ "route53:ListResourceRecordSets",
+ "s3:CreateBucket",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutAccelerateConfiguration",
+ "s3:PutBucketPolicy",
+ "s3:PutObject",
+ "s3:PutBucketTagging",
+ "s3:GetBucketTagging",
+ "lambda:ListEventSourceMappings",
+ "lambda:CreateEventSourceMapping",
+ "iam:UpdateAssumeRolePolicy",
+ "iam:DeleteRolePolicy",
+ "sqs:CreateQueue",
+ "sqs:DeleteQueue",
+ "sqs:GetQueueAttributes",
+ "sqs:SetQueueAttributes",
+ "amplify:GetApp",
+ "amplify:GetBranch",
+ "amplify:UpdateApp",
+ "amplify:UpdateBranch"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmplifySSRCalls"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AML23RALR",
+ "PolicyName": "AdministratorAccess-Amplify",
+ "UpdateDate": "2021-12-01T19:07:19+00:00",
+ "VersionId": "v7"
+ },
+ "AlexaForBusinessDeviceSetup": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessDeviceSetup",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:47:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:RegisterDevice",
+ "a4b:CompleteRegistration",
+ "a4b:SearchDevices",
+ "a4b:SearchNetworkProfiles",
+ "a4b:GetNetworkProfile",
+ "a4b:PutDeviceSetupEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:A4BNetworkProfile*",
+ "Sid": "A4bDeviceSetupAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUEFZFUTDTY4HGFU2",
+ "PolicyName": "AlexaForBusinessDeviceSetup",
+ "UpdateDate": "2019-05-20T21:05:39+00:00",
+ "VersionId": "v2"
+ },
+ "AlexaForBusinessFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:47:09+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:*",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "*a4b.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/*a4b.amazonaws.com/AWSServiceRoleForAlexaForBusiness*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:UpdateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:A4B*"
+ },
+ {
+ "Action": "secretsmanager:CreateSecret",
+ "Condition": {
+ "StringLike": {
+ "secretsmanager:Name": "A4B*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILUT3JGG7WRIMVNH2",
+ "PolicyName": "AlexaForBusinessFullAccess",
+ "UpdateDate": "2020-07-01T21:01:55+00:00",
+ "VersionId": "v5"
+ },
+ "AlexaForBusinessGatewayExecution": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessGatewayExecution",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:47:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:Send*",
+ "a4b:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:a4b:*:*:gateway/*"
+ },
+ {
+ "Action": [
+ "sqs:ReceiveMessage",
+ "sqs:DeleteMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:dd-*",
+ "arn:aws:sqs:*:*:sd-*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:List*",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3LZ7YP7KHLG4DT2Q",
+ "PolicyName": "AlexaForBusinessGatewayExecution",
+ "UpdateDate": "2017-11-30T16:47:19+00:00",
+ "VersionId": "v1"
+ },
+ "AlexaForBusinessLifesizeDelegatedAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessLifesizeDelegatedAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-04T19:46:56+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:DisassociateDeviceFromRoom",
+ "a4b:DeleteDevice",
+ "a4b:UpdateDevice",
+ "a4b:GetDevice"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:a4b:us-east-1:*:device/*/*:A2IWO7UEGWV4TL"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:RegisterAVSDevice"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "a4b:amazonId": [
+ "A2IWO7UEGWV4TL"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:SearchDevices"
+ ],
+ "Condition": {
+ "ForAllValues:StringLike": {
+ "a4b:filters_deviceType": [
+ "*A2IWO7UEGWV4TL"
+ ]
+ },
+ "Null": {
+ "a4b:filters_deviceType": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:AssociateDeviceWithRoom"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:a4b:us-east-1:*:device/*/*:A2IWO7UEGWV4TL",
+ "arn:aws:a4b:us-east-1:*:room/*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:GetRoom",
+ "a4b:GetAddressBook",
+ "a4b:SearchRooms",
+ "a4b:CreateContact",
+ "a4b:CreateRoom",
+ "a4b:UpdateContact",
+ "a4b:ListConferenceProviders",
+ "a4b:DeleteRoom",
+ "a4b:CreateAddressBook",
+ "a4b:DisassociateContactFromAddressBook",
+ "a4b:CreateConferenceProvider",
+ "a4b:PutConferencePreference",
+ "a4b:DeleteAddressBook",
+ "a4b:AssociateContactWithAddressBook",
+ "a4b:DeleteContact",
+ "a4b:SearchProfiles",
+ "a4b:UpdateProfile",
+ "a4b:GetContact"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kms:*:*:key/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HXQBRRIQV",
+ "PolicyName": "AlexaForBusinessLifesizeDelegatedAccessPolicy",
+ "UpdateDate": "2020-06-12T20:31:59+00:00",
+ "VersionId": "v2"
+ },
+ "AlexaForBusinessNetworkProfileServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AlexaForBusinessNetworkProfileServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-13T00:53:40+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:GetCertificate",
+ "acm-pca:IssueCertificate",
+ "acm-pca:RevokeCertificate"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/a4b": "enabled"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "A4bPcaTagAccess"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:A4BNetworkProfile*",
+ "Sid": "A4bNetworkProfileAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI7GYBNGIZU2EDSMGQ",
+ "PolicyName": "AlexaForBusinessNetworkProfileServicePolicy",
+ "UpdateDate": "2019-04-05T21:57:56+00:00",
+ "VersionId": "v2"
+ },
+ "AlexaForBusinessPolyDelegatedAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessPolyDelegatedAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-10-16T19:48:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:DisassociateDeviceFromRoom",
+ "a4b:DeleteDevice",
+ "a4b:UpdateDevice",
+ "a4b:GetDevice"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:a4b:us-east-1:*:device/*/*:A238TWV36W3S92",
+ "arn:aws:a4b:us-east-1:*:device/*/*:A1FUZ1SC53VJXD"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:RegisterAVSDevice"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "a4b:amazonId": [
+ "A238TWV36W3S92",
+ "A1FUZ1SC53VJXD"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:SearchDevices"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:AssociateDeviceWithRoom"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:a4b:us-east-1:*:device/*/*:A238TWV36W3S92",
+ "arn:aws:a4b:us-east-1:*:device/*/*:A1FUZ1SC53VJXD",
+ "arn:aws:a4b:us-east-1:*:room/*"
+ ]
+ },
+ {
+ "Action": [
+ "a4b:GetRoom",
+ "a4b:SearchRooms",
+ "a4b:CreateRoom",
+ "a4b:GetProfile",
+ "a4b:SearchSkillGroups",
+ "a4b:DisassociateSkillGroupFromRoom",
+ "a4b:AssociateSkillGroupWithRoom",
+ "a4b:GetSkillGroup",
+ "a4b:SearchProfiles",
+ "a4b:GetAddressBook",
+ "a4b:UpdateRoom"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FIHC2UP5Z",
+ "PolicyName": "AlexaForBusinessPolyDelegatedAccessPolicy",
+ "UpdateDate": "2019-10-16T19:48:45+00:00",
+ "VersionId": "v1"
+ },
+ "AlexaForBusinessReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AlexaForBusinessReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-30T16:47:12+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:Get*",
+ "a4b:List*",
+ "a4b:Search*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI6BKSTB4XMLPBFFJ2",
+ "PolicyName": "AlexaForBusinessReadOnlyAccess",
+ "UpdateDate": "2019-11-20T00:25:33+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonAPIGatewayAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAPIGatewayAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:34:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:apigateway:*::/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4PT6VY5NLKTNUYSI",
+ "PolicyName": "AmazonAPIGatewayAdministrator",
+ "UpdateDate": "2015-07-09T17:34:45+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAPIGatewayInvokeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAPIGatewayInvokeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:36:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "execute-api:Invoke",
+ "execute-api:ManageConnections"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:execute-api:*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIIWAX2NOOQJ4AIEQ6",
+ "PolicyName": "AmazonAPIGatewayInvokeFullAccess",
+ "UpdateDate": "2018-12-18T18:25:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonAPIGatewayPushToCloudWatchLogs": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-11T23:41:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents",
+ "logs:GetLogEvents",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIK4GFO7HLKYN64ASK",
+ "PolicyName": "AmazonAPIGatewayPushToCloudWatchLogs",
+ "UpdateDate": "2015-11-11T23:41:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAppFlowFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppFlowFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-02T23:30:14+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "appflow:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ListRolesForRedshift"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KMSListAccess"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": "true"
+ },
+ "StringLike": {
+ "kms:ViaService": "appflow.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KMSGrantAccess"
+ },
+ {
+ "Action": [
+ "kms:ListGrants"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "appflow.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KMSListGrantAccess"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "S3ReadAccess"
+ },
+ {
+ "Action": [
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::appflow-*",
+ "Sid": "S3PutBucketPolicyAccess"
+ },
+ {
+ "Action": "secretsmanager:CreateSecret",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "appflow.amazonaws.com"
+ ]
+ },
+ "StringLike": {
+ "secretsmanager:Name": "appflow!*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerCreateSecretAccess"
+ },
+ {
+ "Action": [
+ "secretsmanager:PutResourcePolicy"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "appflow.amazonaws.com"
+ ]
+ },
+ "StringEqualsIgnoreCase": {
+ "secretsmanager:ResourceTag/aws:secretsmanager:owningService": "appflow"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerPutResourcePolicyAccess"
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LambdaListFunctions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PGBU2ALC4",
+ "PolicyName": "AmazonAppFlowFullAccess",
+ "UpdateDate": "2022-02-28T23:11:23+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonAppFlowReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppFlowReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-02T23:26:51+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appflow:DescribeConnector",
+ "appflow:DescribeConnectors",
+ "appflow:DescribeConnectorProfiles",
+ "appflow:DescribeFlows",
+ "appflow:DescribeFlowExecution",
+ "appflow:DescribeConnectorFields",
+ "appflow:ListConnectors",
+ "appflow:ListConnectorFields",
+ "appflow:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CCGEQPIQI",
+ "PolicyName": "AmazonAppFlowReadOnlyAccess",
+ "UpdateDate": "2022-02-28T20:42:58+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonAppStreamFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppStreamFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:09+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "application-autoscaling:DescribeScheduledActions",
+ "application-autoscaling:PutScheduledAction",
+ "application-autoscaling:DeleteScheduledAction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/ApplicationAutoScalingForAmazonAppStreamAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "appstream.application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLZZXU2YQVGL4QDNC",
+ "PolicyName": "AmazonAppStreamFullAccess",
+ "UpdateDate": "2020-08-28T17:24:35+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonAppStreamReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAppStreamReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:10+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:Get*",
+ "appstream:List*",
+ "appstream:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXIFDGB4VBX23DX7K",
+ "PolicyName": "AmazonAppStreamReadOnlyAccess",
+ "UpdateDate": "2016-12-07T21:00:06+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonAppStreamServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonAppStreamServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-19T04:17:37+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSubnets",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcEndpoints",
+ "s3:ListAllMyBuckets",
+ "ds:DescribeDirectories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:GetObjectVersion",
+ "s3:DeleteObjectVersion",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy",
+ "s3:PutEncryptionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::appstream2-36fb080bb8-*",
+ "arn:aws:s3:::appstream-app-settings-*",
+ "arn:aws:s3:::appstream-logs-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAISBRZ7LMMCBYEF3SE",
+ "PolicyName": "AmazonAppStreamServiceAccess",
+ "UpdateDate": "2020-06-26T16:33:54+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonAthenaFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAthenaFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T16:46:01+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "athena:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:DeleteTable",
+ "glue:BatchDeleteTable",
+ "glue:UpdateTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:BatchCreatePartition",
+ "glue:CreatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:UpdatePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket",
+ "s3:PutObject",
+ "s3:PutBucketPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-athena-query-results-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::athena-examples*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lakeformation:GetDataAccess"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPJMLMD4C7RYZ6XCK",
+ "PolicyName": "AmazonAthenaFullAccess",
+ "UpdateDate": "2021-07-07T20:15:04+00:00",
+ "VersionId": "v7"
+ },
+ "AmazonAugmentedAIFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAugmentedAIFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T16:21:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:*HumanLoop",
+ "sagemaker:*HumanLoops",
+ "sagemaker:*FlowDefinition",
+ "sagemaker:*FlowDefinitions",
+ "sagemaker:*HumanTaskUi",
+ "sagemaker:*HumanTaskUis"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "sagemaker:WorkteamType": [
+ "private-crowd",
+ "vendor-crowd"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HJOEBWQWI",
+ "PolicyName": "AmazonAugmentedAIFullAccess",
+ "UpdateDate": "2019-12-03T16:21:56+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAugmentedAIHumanLoopFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAugmentedAIHumanLoopFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T16:20:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:*HumanLoop",
+ "sagemaker:*HumanLoops"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DLDNVPZG4",
+ "PolicyName": "AmazonAugmentedAIHumanLoopFullAccess",
+ "UpdateDate": "2019-12-03T16:20:47+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonAugmentedAIIntegratedAPIAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonAugmentedAIIntegratedAPIAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-22T20:47:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:*HumanLoop",
+ "sagemaker:*HumanLoops",
+ "sagemaker:*FlowDefinition",
+ "sagemaker:*FlowDefinitions",
+ "sagemaker:*HumanTaskUi",
+ "sagemaker:*HumanTaskUis"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "sagemaker:WorkteamType": [
+ "private-crowd",
+ "vendor-crowd"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "textract:AnalyzeDocument"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "rekognition:DetectModerationLabels"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4A7KC4RFTV",
+ "PolicyName": "AmazonAugmentedAIIntegratedAPIAccess",
+ "UpdateDate": "2020-04-22T20:47:32+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonBraketFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonBraketFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-06T20:12:37+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:ListBucket",
+ "s3:CreateBucket",
+ "s3:PutBucketPublicAccessBlock",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-braket-*"
+ },
+ {
+ "Action": [
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "ecr:BatchCheckLayerAvailability"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecr:*:*:repository/amazon-braket*"
+ },
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:List*",
+ "logs:StartQuery",
+ "logs:StopQuery",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/braket*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles",
+ "iam:ListRolePolicies",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:ListNotebookInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:CreatePresignedNotebookInstanceUrl",
+ "sagemaker:CreateNotebookInstance",
+ "sagemaker:DeleteNotebookInstance",
+ "sagemaker:DescribeNotebookInstance",
+ "sagemaker:StartNotebookInstance",
+ "sagemaker:StopNotebookInstance",
+ "sagemaker:UpdateNotebookInstance",
+ "sagemaker:ListTags",
+ "sagemaker:AddTags",
+ "sagemaker:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sagemaker:*:*:notebook-instance/amazon-braket-*"
+ },
+ {
+ "Action": [
+ "sagemaker:DescribeNotebookInstanceLifecycleConfig",
+ "sagemaker:CreateNotebookInstanceLifecycleConfig",
+ "sagemaker:DeleteNotebookInstanceLifecycleConfig",
+ "sagemaker:ListNotebookInstanceLifecycleConfigs",
+ "sagemaker:UpdateNotebookInstanceLifecycleConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sagemaker:*:*:notebook-instance-lifecycle-config/amazon-braket-*"
+ },
+ {
+ "Action": "braket:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "braket.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/braket.amazonaws.com/AWSServiceRoleForAmazonBraket*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "sagemaker.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/AmazonBraketServiceSageMakerNotebookRole*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "braket.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/AmazonBraketJobsExecutionRole*"
+ },
+ {
+ "Action": [
+ "logs:GetQueryResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/braket*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "/aws/braket"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HUAKO7NZO",
+ "PolicyName": "AmazonBraketFullAccess",
+ "UpdateDate": "2021-11-28T05:31:50+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonBraketJobsExecutionPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonBraketJobsExecutionPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-26T19:34:41+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:ListBucket",
+ "s3:CreateBucket",
+ "s3:PutBucketPublicAccessBlock",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-braket-*"
+ },
+ {
+ "Action": [
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "ecr:BatchCheckLayerAvailability"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecr:*:*:repository/amazon-braket*"
+ },
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "braket:CancelJob",
+ "braket:CancelQuantumTask",
+ "braket:CreateJob",
+ "braket:CreateQuantumTask",
+ "braket:GetDevice",
+ "braket:GetJob",
+ "braket:GetQuantumTask",
+ "braket:SearchDevices",
+ "braket:SearchJobs",
+ "braket:SearchQuantumTasks",
+ "braket:ListTagsForResource",
+ "braket:TagResource",
+ "braket:UntagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "braket.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/AmazonBraketJobsExecutionRole*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": [
+ "logs:GetQueryResults"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:GetLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:StartQuery",
+ "logs:StopQuery"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/braket*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "/aws/braket"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CBFQZHJ3B",
+ "PolicyName": "AmazonBraketJobsExecutionPolicy",
+ "UpdateDate": "2021-11-28T05:34:55+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonBraketServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonBraketServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-04T17:12:23+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-braket-*"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/braket:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NIYU42I3S",
+ "PolicyName": "AmazonBraketServiceRolePolicy",
+ "UpdateDate": "2020-08-06T20:10:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonChimeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonChimeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-01T22:15:43+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "chime:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:ListLogDeliveries",
+ "logs:DescribeResourcePolicies",
+ "logs:PutResourcePolicy",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:ChimeVoiceConnector-Streaming*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:GetQueueAttributes",
+ "sqs:CreateQueue"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:ChimeVoiceConnector-Streaming*"
+ ]
+ },
+ {
+ "Action": [
+ "kinesis:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:DescribeStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesis:*:*:stream/chime-chat-*",
+ "arn:aws:kinesis:*:*:stream/chime-messaging-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetEncryptionConfiguration",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::chime-chat-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUJFSAKUERNORYRWO",
+ "PolicyName": "AmazonChimeFullAccess",
+ "UpdateDate": "2020-12-14T21:00:52+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonChimeReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonChimeReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-01T22:04:17+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "chime:List*",
+ "chime:Get*",
+ "chime:Describe*",
+ "chime:SearchAvailablePhoneNumbers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLBFZZFABRXVWRTCI",
+ "PolicyName": "AmazonChimeReadOnly",
+ "UpdateDate": "2020-12-14T20:53:57+00:00",
+ "VersionId": "v10"
+ },
+ "AmazonChimeSDK": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonChimeSDK",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-02-04T21:53:37+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "chime:CreateMeeting",
+ "chime:CreateMeetingWithAttendees",
+ "chime:DeleteMeeting",
+ "chime:GetMeeting",
+ "chime:ListMeetings",
+ "chime:CreateAttendee",
+ "chime:BatchCreateAttendee",
+ "chime:DeleteAttendee",
+ "chime:GetAttendee",
+ "chime:ListAttendees",
+ "chime:ListAttendeeTags",
+ "chime:ListMeetingTags",
+ "chime:ListTagsForResource",
+ "chime:TagAttendee",
+ "chime:TagMeeting",
+ "chime:TagResource",
+ "chime:UntagAttendee",
+ "chime:UntagMeeting",
+ "chime:UntagResource",
+ "chime:StartMeetingTranscription",
+ "chime:StopMeetingTranscription"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ACM6EA4B7",
+ "PolicyName": "AmazonChimeSDK",
+ "UpdateDate": "2021-10-21T18:04:27+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonChimeServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonChimeServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-09-30T22:25:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "chime.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/chime.amazonaws.com/AWSServiceRoleForAmazonChime"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NA5XMV3PI",
+ "PolicyName": "AmazonChimeServiceRolePolicy",
+ "UpdateDate": "2019-09-30T22:25:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonChimeTranscriptionServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonChimeTranscriptionServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-04T21:47:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "transcribe:StartStreamTranscription",
+ "transcribe:StartMedicalStreamTranscription"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DC6EM4O3Q",
+ "PolicyName": "AmazonChimeTranscriptionServiceLinkedRolePolicy",
+ "UpdateDate": "2021-08-04T21:47:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonChimeUserManagement": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonChimeUserManagement",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-01T22:17:26+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "chime:ListAccounts",
+ "chime:GetAccount",
+ "chime:GetAccountSettings",
+ "chime:UpdateAccountSettings",
+ "chime:ListUsers",
+ "chime:GetUser",
+ "chime:GetUserByEmail",
+ "chime:InviteUsers",
+ "chime:InviteUsersFromProvider",
+ "chime:SuspendUsers",
+ "chime:ActivateUsers",
+ "chime:UpdateUserLicenses",
+ "chime:ResetPersonalPIN",
+ "chime:LogoutUser",
+ "chime:ListDomains",
+ "chime:GetDomain",
+ "chime:ListDirectories",
+ "chime:ListGroups",
+ "chime:SubmitSupportRequest",
+ "chime:ListDelegates",
+ "chime:ListAccountUsageReportData",
+ "chime:GetMeetingDetail",
+ "chime:ListMeetingEvents",
+ "chime:ListMeetingsReportData",
+ "chime:GetUserActivityReportData",
+ "chime:UpdateUser",
+ "chime:BatchUpdateUser",
+ "chime:BatchSuspendUser",
+ "chime:BatchUnsuspendUser",
+ "chime:AssociatePhoneNumberWithUser",
+ "chime:DisassociatePhoneNumberFromUser",
+ "chime:GetPhoneNumber",
+ "chime:ListPhoneNumbers",
+ "chime:GetUserSettings",
+ "chime:UpdateUserSettings",
+ "chime:CreateUser",
+ "chime:AssociateSigninDelegateGroupsWithAccount",
+ "chime:DisassociateSigninDelegateGroupsFromAccount"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGLHVUHNMQPSDGSOO",
+ "PolicyName": "AmazonChimeUserManagement",
+ "UpdateDate": "2020-02-18T19:26:10+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonChimeVoiceConnectorServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonChimeVoiceConnectorServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-09-30T22:16:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "chime:GetVoiceConnector*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "kinesisvideo:GetDataEndpoint",
+ "kinesisvideo:PutMedia",
+ "kinesisvideo:UpdateDataRetention",
+ "kinesisvideo:DescribeStream",
+ "kinesisvideo:CreateStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesisvideo:*:*:stream/ChimeVoiceConnector-*"
+ ]
+ },
+ {
+ "Action": [
+ "kinesisvideo:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:ChimeVoiceConnector-Streaming*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:SendMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:ChimeVoiceConnector-Streaming*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GP44ZBY4P",
+ "PolicyName": "AmazonChimeVoiceConnectorServiceLinkedRolePolicy",
+ "UpdateDate": "2021-12-21T00:08:05+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonCloudDirectoryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudDirectoryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-25T00:41:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "clouddirectory:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJG3XQK77ATFLCF2CK",
+ "PolicyName": "AmazonCloudDirectoryFullAccess",
+ "UpdateDate": "2017-02-25T00:41:39+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudDirectoryReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudDirectoryReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-28T23:42:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "clouddirectory:List*",
+ "clouddirectory:Get*",
+ "clouddirectory:LookupPolicy",
+ "clouddirectory:BatchRead"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICMSZQGR3O62KMD6M",
+ "PolicyName": "AmazonCloudDirectoryReadOnlyAccess",
+ "UpdateDate": "2017-02-28T23:42:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudWatchEvidentlyFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudWatchEvidentlyFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T15:10:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "evidently:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/CloudWatchRUMEvidentlyRole-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:TagResource",
+ "cloudwatch:UnTagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudtrail:LookupEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:Evidently-Alarm-*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:Subscribe",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:sns:*:*:Evidently-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OBNGJAXBS",
+ "PolicyName": "AmazonCloudWatchEvidentlyFullAccess",
+ "UpdateDate": "2021-11-29T15:10:14+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudWatchEvidentlyReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudWatchEvidentlyReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T15:08:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "evidently:GetExperiment",
+ "evidently:GetFeature",
+ "evidently:GetLaunch",
+ "evidently:GetProject",
+ "evidently:ListExperiments",
+ "evidently:ListFeatures",
+ "evidently:ListLaunches",
+ "evidently:ListProjects"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EQ6XHY7DQ",
+ "PolicyName": "AmazonCloudWatchEvidentlyReadOnlyAccess",
+ "UpdateDate": "2021-11-29T15:08:38+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudWatchRUMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudWatchRUMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T15:46:12+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rum:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/rum.amazonaws.com/AWSServiceRoleForRealUserMonitoring"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "cognito-identity.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/RUM-Monitor*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:*"
+ },
+ {
+ "Action": [
+ "cognito-identity:CreateIdentityPool",
+ "cognito-identity:ListIdentityPools",
+ "cognito-identity:DescribeIdentityPool",
+ "cognito-identity:GetIdentityPoolRoles",
+ "cognito-identity:SetIdentityPoolRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cognito-identity:*:*:identitypool/*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DeleteLogGroup",
+ "logs:PutRetentionPolicy",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:*RUMService*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:ListLogDeliveries",
+ "logs:DescribeResourcePolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group::log-stream:*"
+ },
+ {
+ "Action": [
+ "synthetics:describeCanaries",
+ "synthetics:describeCanariesLastRun"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:synthetics:*:*:canary:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DPYSNOE6F",
+ "PolicyName": "AmazonCloudWatchRUMFullAccess",
+ "UpdateDate": "2021-11-29T15:46:12+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudWatchRUMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCloudWatchRUMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T15:43:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rum:GetAppMonitor",
+ "rum:GetAppMonitorData",
+ "rum:ListAppMonitors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MNS2SANVJ",
+ "PolicyName": "AmazonCloudWatchRUMReadOnlyAccess",
+ "UpdateDate": "2021-11-29T15:43:47+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCloudWatchRUMServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonCloudWatchRUMServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-17T23:17:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "xray:PutTraceSegments"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GYUK4NU52",
+ "PolicyName": "AmazonCloudWatchRUMServiceRolePolicy",
+ "UpdateDate": "2021-11-17T23:17:23+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCodeGuruProfilerAgentAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCodeGuruProfilerAgentAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-05T22:11:56+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-profiler:ConfigureAgent",
+ "codeguru-profiler:CreateProfilingGroup",
+ "codeguru-profiler:PostAgentProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NJEGTVMFC",
+ "PolicyName": "AmazonCodeGuruProfilerAgentAccess",
+ "UpdateDate": "2021-04-02T23:21:37+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonCodeGuruProfilerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCodeGuruProfilerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T10:13:27+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-profiler:*",
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "sns:ListTopics",
+ "codeguru:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "codeguru-profiler.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*AWSServiceRoleForCodeGuruProfiler*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FVCBNS424",
+ "PolicyName": "AmazonCodeGuruProfilerFullAccess",
+ "UpdateDate": "2020-07-15T03:23:08+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonCodeGuruProfilerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCodeGuruProfilerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T10:30:15+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru:Get*",
+ "codeguru-profiler:BatchGet*",
+ "codeguru-profiler:Describe*",
+ "codeguru-profiler:Get*",
+ "codeguru-profiler:List*",
+ "iam:ListRoles",
+ "iam:ListUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LUSUINUHE",
+ "PolicyName": "AmazonCodeGuruProfilerReadOnlyAccess",
+ "UpdateDate": "2020-06-27T23:52:52+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonCodeGuruReviewerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCodeGuruReviewerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T08:33:47+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru-reviewer:*",
+ "codeguru:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonCodeGuruReviewerFullAccess"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/codeguru-reviewer.amazonaws.com/AWSServiceRoleForAmazonCodeGuruReviewer",
+ "Sid": "AmazonCodeGuruReviewerSLRCreation"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/codeguru-reviewer.amazonaws.com/AWSServiceRoleForAmazonCodeGuruReviewer",
+ "Sid": "AmazonCodeGuruReviewerSLRDeletion"
+ },
+ {
+ "Action": [
+ "codecommit:ListRepositories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeCommitAccess"
+ },
+ {
+ "Action": [
+ "codecommit:TagResource",
+ "codecommit:UntagResource"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "codeguru-reviewer"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeCommitTagManagement"
+ },
+ {
+ "Action": [
+ "codestar-connections:TagResource",
+ "codestar-connections:UntagResource",
+ "codestar-connections:ListTagsForResource"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "codeguru-reviewer"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeConnectTagManagement"
+ },
+ {
+ "Action": [
+ "codestar-connections:UseConnection",
+ "codestar-connections:ListConnections",
+ "codestar-connections:PassConnection"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "codestar-connections:ProviderAction": [
+ "ListRepositories",
+ "ListOwners"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CodeConnectManagedRules"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsManagedRules"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ENLFBTHWM",
+ "PolicyName": "AmazonCodeGuruReviewerFullAccess",
+ "UpdateDate": "2020-08-29T04:16:08+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonCodeGuruReviewerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCodeGuruReviewerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T08:48:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codeguru:Get*",
+ "codeguru-reviewer:List*",
+ "codeguru-reviewer:Describe*",
+ "codeguru-reviewer:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonCodeGuruReviewerReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FOJ4PYG77",
+ "PolicyName": "AmazonCodeGuruReviewerReadOnlyAccess",
+ "UpdateDate": "2020-08-29T04:15:32+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonCodeGuruReviewerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonCodeGuruReviewerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T05:31:12+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "codecommit:GetRepository",
+ "codecommit:GetBranch",
+ "codecommit:DescribePullRequestEvents",
+ "codecommit:GetCommentsForPullRequest",
+ "codecommit:GetDifferences",
+ "codecommit:GetPullRequest",
+ "codecommit:ListPullRequests",
+ "codecommit:PostCommentForPullRequest",
+ "codecommit:GitPull",
+ "codecommit:UntagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/codeguru-reviewer": "enabled"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AccessCodeGuruReviewerEnabledRepositories"
+ },
+ {
+ "Action": [
+ "codestar-connections:UseConnection"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "codestar-connections:ProviderAction": [
+ "ListBranches",
+ "GetBranch",
+ "ListRepositories",
+ "ListOwners",
+ "ListPullRequests",
+ "GetPullRequest",
+ "ListPullRequestComments",
+ "ListPullRequestCommits",
+ "ListCommitFiles",
+ "ListBranchCommits",
+ "CreatePullRequestDiffComment",
+ "GitPull"
+ ]
+ },
+ "Null": {
+ "aws:ResourceTag/codeguru-reviewer": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AccessCodeGuruReviewerEnabledConnections"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "codeguru-reviewer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsResourceCleanup"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::codeguru-reviewer-*",
+ "arn:aws:s3:::codeguru-reviewer-*/*"
+ ],
+ "Sid": "AllowGuruS3GetObject"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NJY3GAUD2",
+ "PolicyName": "AmazonCodeGuruReviewerServiceRolePolicy",
+ "UpdateDate": "2020-11-27T15:09:46+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonCognitoDeveloperAuthenticatedIdentities": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoDeveloperAuthenticatedIdentities",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-03-24T17:22:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:GetOpenIdTokenForDeveloperIdentity",
+ "cognito-identity:LookupDeveloperIdentity",
+ "cognito-identity:MergeDeveloperIdentities",
+ "cognito-identity:UnlinkDeveloperIdentity"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQOKZ5BGKLCMTXH4W",
+ "PolicyName": "AmazonCognitoDeveloperAuthenticatedIdentities",
+ "UpdateDate": "2015-03-24T17:22:23+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCognitoIdpEmailServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonCognitoIdpEmailServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-21T21:32:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:SendEmail",
+ "ses:SendRawEmail"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ses:List*"
+ ],
+ "Effect": "Deny",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIX7PW362PLAQFKBHM",
+ "PolicyName": "AmazonCognitoIdpEmailServiceRolePolicy",
+ "UpdateDate": "2019-03-21T21:32:25+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCognitoIdpServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonCognitoIdpServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-26T22:30:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-idp:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LEUDXVZDR",
+ "PolicyName": "AmazonCognitoIdpServiceRolePolicy",
+ "UpdateDate": "2020-06-26T22:30:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonCognitoPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-03-24T17:14:56+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:*",
+ "cognito-idp:*",
+ "cognito-sync:*",
+ "iam:ListRoles",
+ "iam:ListOpenIdConnectProviders",
+ "iam:GetRole",
+ "iam:ListSAMLProviders",
+ "iam:GetSAMLProvider",
+ "kinesis:ListStreams",
+ "lambda:GetPolicy",
+ "lambda:ListFunctions",
+ "sns:GetSMSSandboxAccountStatus",
+ "sns:ListPlatformApplications",
+ "ses:ListIdentities",
+ "ses:GetIdentityVerificationAttributes",
+ "mobiletargeting:GetApps",
+ "acm:ListCertificates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "cognito-idp.amazonaws.com",
+ "email.cognito-idp.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/cognito-idp.amazonaws.com/AWSServiceRoleForAmazonCognitoIdp*",
+ "arn:aws:iam::*:role/aws-service-role/email.cognito-idp.amazonaws.com/AWSServiceRoleForAmazonCognitoIdpEmail*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKW5H2HNCPGCYGR6Y",
+ "PolicyName": "AmazonCognitoPowerUser",
+ "UpdateDate": "2021-06-01T17:33:32+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonCognitoReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonCognitoReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-03-24T17:06:46+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-identity:Describe*",
+ "cognito-identity:Get*",
+ "cognito-identity:List*",
+ "cognito-idp:Describe*",
+ "cognito-idp:AdminGet*",
+ "cognito-idp:AdminList*",
+ "cognito-idp:List*",
+ "cognito-idp:Get*",
+ "cognito-sync:Describe*",
+ "cognito-sync:Get*",
+ "cognito-sync:List*",
+ "iam:ListOpenIdConnectProviders",
+ "iam:ListRoles",
+ "sns:ListPlatformApplications"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBFTRZD2GQGJHSVQK",
+ "PolicyName": "AmazonCognitoReadOnly",
+ "UpdateDate": "2019-08-01T19:21:04+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonConnectCampaignsServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonConnectCampaignsServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-23T20:54:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "connect-campaigns:ListCampaigns"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PT3AZPOPK",
+ "PolicyName": "AmazonConnectCampaignsServiceLinkedRolePolicy",
+ "UpdateDate": "2021-09-23T20:54:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonConnectReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonConnectReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-10-17T21:00:44+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "connect:Get*",
+ "connect:Describe*",
+ "connect:List*",
+ "ds:DescribeDirectories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "connect:GetFederationTokens",
+ "Effect": "Deny",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIVZMH7VU6YYKRY6ZU",
+ "PolicyName": "AmazonConnectReadOnlyAccess",
+ "UpdateDate": "2019-11-06T22:10:18+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonConnectServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonConnectServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-09-07T00:21:43+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "connect:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DeleteRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/connect.amazonaws.com/AWSServiceRoleForAmazonConnect_*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:DeleteObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::amazon-connect-*/*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::amazon-connect-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/connect/*:*"
+ ]
+ },
+ {
+ "Action": [
+ "lex:ListBots",
+ "lex:ListBotAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "profile:SearchProfiles",
+ "profile:CreateProfile",
+ "profile:UpdateProfile",
+ "profile:AddProfileKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:profile:*:*:domains/amazon-connect-*"
+ },
+ {
+ "Action": [
+ "profile:ListProfileObjects"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:profile:*:*:domains/amazon-connect-*/object-types/CTR",
+ "arn:aws:profile:*:*:domains/amazon-connect-*/object-types/_asset"
+ ]
+ },
+ {
+ "Action": [
+ "profile:ListAccountIntegrations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/Connect"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6R6FMTSRUJSKI72Y",
+ "PolicyName": "AmazonConnectServiceLinkedRolePolicy",
+ "UpdateDate": "2021-12-09T22:12:26+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonConnectVoiceIDFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonConnectVoiceIDFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-26T19:04:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "voiceid:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EE2VNKAA5",
+ "PolicyName": "AmazonConnectVoiceIDFullAccess",
+ "UpdateDate": "2021-09-26T19:04:10+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonConnect_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonConnect_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-20T19:54:21+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "connect:*",
+ "ds:CreateAlias",
+ "ds:AuthorizeApplication",
+ "ds:CreateIdentityPoolDirectory",
+ "ds:DeleteDirectory",
+ "ds:DescribeDirectories",
+ "ds:UnauthorizeApplication",
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "lex:GetBots",
+ "lex:ListBots",
+ "lex:ListBotAliases",
+ "logs:CreateLogGroup",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets",
+ "lambda:ListFunctions",
+ "ds:CheckAlias",
+ "profile:ListAccountIntegrations",
+ "profile:GetDomain",
+ "profile:ListDomains",
+ "profile:GetProfileObjectType",
+ "profile:ListProfileObjectTypeTemplates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "profile:AddProfileKey",
+ "profile:CreateDomain",
+ "profile:CreateProfile",
+ "profile:DeleteDomain",
+ "profile:DeleteIntegration",
+ "profile:DeleteProfile",
+ "profile:DeleteProfileKey",
+ "profile:DeleteProfileObject",
+ "profile:DeleteProfileObjectType",
+ "profile:GetIntegration",
+ "profile:GetMatches",
+ "profile:GetProfileObjectType",
+ "profile:ListIntegrations",
+ "profile:ListProfileObjects",
+ "profile:ListProfileObjectTypes",
+ "profile:ListTagsForResource",
+ "profile:MergeProfiles",
+ "profile:PutIntegration",
+ "profile:PutProfileObject",
+ "profile:PutProfileObjectType",
+ "profile:SearchProfiles",
+ "profile:TagResource",
+ "profile:UntagResource",
+ "profile:UpdateDomain",
+ "profile:UpdateProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:profile:*:*:domains/amazon-connect-*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-connect-*"
+ },
+ {
+ "Action": [
+ "servicequotas:GetServiceQuota"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:servicequotas:*:*:connect/*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "connect.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:DeleteServiceLinkedRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/connect.amazonaws.com/AWSServiceRoleForAmazonConnect*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JXAE7KLRO",
+ "PolicyName": "AmazonConnect_FullAccess",
+ "UpdateDate": "2021-11-23T22:05:12+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonDMSCloudWatchLogsRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSCloudWatchLogsRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-07T23:44:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AllowDescribeOnAllLogGroups"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*"
+ ],
+ "Sid": "AllowDescribeOfAllLogStreamsOnDmsTasksLogGroup"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*"
+ ],
+ "Sid": "AllowCreationOfDmsTasksLogGroups"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*:log-stream:dms-task-*"
+ ],
+ "Sid": "AllowCreationOfDmsTaskLogStream"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:dms-tasks-*:log-stream:dms-task-*"
+ ],
+ "Sid": "AllowUploadOfLogEventsToDmsTaskLogStream"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBG7UXZZXUJD3TDJE",
+ "PolicyName": "AmazonDMSCloudWatchLogsRole",
+ "UpdateDate": "2016-01-07T23:44:53+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDMSRedshiftS3Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSRedshiftS3Role",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-04-20T17:05:56+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:DeleteBucket",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:GetObjectVersion",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketPolicy",
+ "s3:GetBucketAcl",
+ "s3:PutBucketVersioning",
+ "s3:GetBucketVersioning",
+ "s3:PutLifecycleConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:DeleteBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::dms-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3CCUQ4U5WNC5F6B6",
+ "PolicyName": "AmazonDMSRedshiftS3Role",
+ "UpdateDate": "2019-07-08T18:19:14+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonDMSVPCManagementRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonDMSVPCManagementRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-18T16:33:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHKIGMBQI4AEFFSYO",
+ "PolicyName": "AmazonDMSVPCManagementRole",
+ "UpdateDate": "2016-05-23T16:29:57+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonDRSVPCManagement": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDRSVPCManagement",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-02T00:09:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPXIBTTZMBEFEX6UA",
+ "PolicyName": "AmazonDRSVPCManagement",
+ "UpdateDate": "2015-09-02T00:09:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDetectiveFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDetectiveFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-30T17:57:15+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "detective:*",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "guardduty:ArchiveFindings"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:guardduty:*:*:detector/*"
+ },
+ {
+ "Action": [
+ "guardduty:ListDetectors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IRLX3QVOO",
+ "PolicyName": "AmazonDetectiveFullAccess",
+ "UpdateDate": "2020-10-21T22:07:28+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonDetectiveServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonDetectiveServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-18T19:47:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:ListAccounts"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G5GQKDXB6",
+ "PolicyName": "AmazonDetectiveServiceLinkedRolePolicy",
+ "UpdateDate": "2021-11-18T19:47:32+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDevOpsGuruConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDevOpsGuruConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-12-17T18:43:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devops-guru:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DevOpsGuruFullAccess"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudFormationListStacksAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchGetMetricDataAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SnsListTopicsAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes",
+ "sns:SetTopicAttributes",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:DevOps-Guru-*",
+ "Sid": "SnsTopicOperations"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "devops-guru.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/devops-guru.amazonaws.com/AWSServiceRoleForDevOpsGuru",
+ "Sid": "DevOpsGuruSlrCreation"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/devops-guru.amazonaws.com/AWSServiceRoleForDevOpsGuru",
+ "Sid": "DevOpsGuruSlrDeletion"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RDSDescribeDBInstancesAccess"
+ },
+ {
+ "Action": [
+ "pi:GetResourceMetrics",
+ "pi:DescribeDimensionKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PerformanceInsightsMetricsDataAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GSGM7UDO3",
+ "PolicyName": "AmazonDevOpsGuruConsoleFullAccess",
+ "UpdateDate": "2021-12-17T18:43:09+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDevOpsGuruFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDevOpsGuruFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T16:38:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devops-guru:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DevOpsGuruFullAccess"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudFormationListStacksAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchGetMetricDataAccess"
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SnsListTopicsAccess"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:GetTopicAttributes",
+ "sns:SetTopicAttributes",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:DevOps-Guru-*",
+ "Sid": "SnsTopicOperations"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "devops-guru.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/devops-guru.amazonaws.com/AWSServiceRoleForDevOpsGuru",
+ "Sid": "DevOpsGuruSlrCreation"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/devops-guru.amazonaws.com/AWSServiceRoleForDevOpsGuru",
+ "Sid": "DevOpsGuruSlrDeletion"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RDSDescribeDBInstancesAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BQEAUGTMM",
+ "PolicyName": "AmazonDevOpsGuruFullAccess",
+ "UpdateDate": "2021-11-26T20:39:13+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonDevOpsGuruOrganizationsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDevOpsGuruOrganizationsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-15T23:50:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devops-guru:DescribeOrganizationHealth",
+ "devops-guru:DescribeOrganizationResourceCollectionHealth",
+ "devops-guru:DescribeOrganizationOverview",
+ "devops-guru:ListOrganizationInsights",
+ "devops-guru:SearchOrganizationInsights"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DevOpsGuruOrganizationsAccess"
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListChildren",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListRoots"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:organizations::*:",
+ "Sid": "OrganizationsDataAccess"
+ },
+ {
+ "Action": [
+ "organizations:DeregisterDelegatedAdministrator",
+ "organizations:RegisterDelegatedAdministrator",
+ "organizations:ListDelegatedAdministrators",
+ "organizations:EnableAWSServiceAccess",
+ "organizations:DisableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "organizations:ServicePrincipal": [
+ "devops-guru.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "OrganizationsAdminDataAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M26ELBKR2",
+ "PolicyName": "AmazonDevOpsGuruOrganizationsAccess",
+ "UpdateDate": "2021-11-15T23:50:52+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDevOpsGuruReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDevOpsGuruReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T16:34:40+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "devops-guru:DescribeAccountHealth",
+ "devops-guru:DescribeAccountOverview",
+ "devops-guru:DescribeAnomaly",
+ "devops-guru:DescribeEventSourcesConfig",
+ "devops-guru:DescribeFeedback",
+ "devops-guru:DescribeInsight",
+ "devops-guru:DescribeResourceCollectionHealth",
+ "devops-guru:DescribeServiceIntegration",
+ "devops-guru:GetCostEstimation",
+ "devops-guru:GetResourceCollection",
+ "devops-guru:ListAnomaliesForInsight",
+ "devops-guru:ListEvents",
+ "devops-guru:ListInsights",
+ "devops-guru:ListNotificationChannels",
+ "devops-guru:ListRecommendations",
+ "devops-guru:SearchInsights",
+ "devops-guru:StartCostEstimation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DevOpsGuruReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudFormationListStacksAccess"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/devops-guru.amazonaws.com/AWSServiceRoleForDevOpsGuru"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchGetMetricDataAccess"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RDSDescribeDBInstancesAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JK4QO3QK6",
+ "PolicyName": "AmazonDevOpsGuruReadOnlyAccess",
+ "UpdateDate": "2022-03-04T02:37:19+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonDevOpsGuruServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonDevOpsGuruServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T10:24:42+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingGroups",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:DescribeAnomalyDetectors",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:ListDashboards",
+ "cloudwatch:GetDashboard",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStacks",
+ "cloudformation:ListStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListImports",
+ "codedeploy:BatchGetDeployments",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:ListDeployments",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:GetResourceConfigHistory",
+ "events:ListRuleNamesByTarget",
+ "xray:GetServiceGraph",
+ "organizations:ListRoots",
+ "organizations:ListChildren",
+ "organizations:ListDelegatedAdministrators",
+ "pi:GetResourceMetrics",
+ "tag:GetResources",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConcurrency",
+ "lambda:GetAccountSettings",
+ "lambda:ListProvisionedConcurrencyConfigs",
+ "lambda:ListAliases",
+ "lambda:ListEventSourceMappings",
+ "lambda:GetPolicy",
+ "ec2:DescribeSubnets",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "sqs:GetQueueAttributes",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeStream",
+ "dynamodb:ListStreams",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBInstanceAutomatedBackups",
+ "rds:DescribeAccountAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:PutTargets",
+ "events:PutRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/DevOps-Guru-managed-*",
+ "Sid": "AllowPutTargetsOnASpecificRule"
+ },
+ {
+ "Action": [
+ "ssm:CreateOpsItem"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowCreateOpsItem"
+ },
+ {
+ "Action": [
+ "ssm:AddTagsToResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:opsitem/*",
+ "Sid": "AllowAddTagsToOpsItem"
+ },
+ {
+ "Action": [
+ "ssm:GetOpsItem",
+ "ssm:UpdateOpsItem"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/DevOps-GuruInsightSsmOpsItemRelated": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowAccessOpsItem"
+ },
+ {
+ "Action": "events:PutRule",
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/DevOpsGuruManagedRule*",
+ "Sid": "AllowCreateManagedRule"
+ },
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/DevOpsGuruManagedRule*",
+ "Sid": "AllowAccessManagedRule"
+ },
+ {
+ "Action": [
+ "events:DeleteRule",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "devops-guru.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/DevOpsGuruManagedRule*",
+ "Sid": "AllowOtherOperationsOnManagedRule"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LOGPH224B",
+ "PolicyName": "AmazonDevOpsGuruServiceRolePolicy",
+ "UpdateDate": "2022-02-07T19:30:10+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonDocDBConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDocDBConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-09T20:37:28+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:AddRoleToDBCluster",
+ "rds:AddSourceIdentifierToSubscription",
+ "rds:AddTagsToResource",
+ "rds:ApplyPendingMaintenanceAction",
+ "rds:CopyDBClusterParameterGroup",
+ "rds:CopyDBClusterSnapshot",
+ "rds:CopyDBParameterGroup",
+ "rds:CreateDBCluster",
+ "rds:CreateDBClusterParameterGroup",
+ "rds:CreateDBClusterSnapshot",
+ "rds:CreateDBInstance",
+ "rds:CreateDBParameterGroup",
+ "rds:CreateDBSubnetGroup",
+ "rds:CreateEventSubscription",
+ "rds:DeleteDBCluster",
+ "rds:DeleteDBClusterParameterGroup",
+ "rds:DeleteDBClusterSnapshot",
+ "rds:DeleteDBInstance",
+ "rds:DeleteDBParameterGroup",
+ "rds:DeleteDBSubnetGroup",
+ "rds:DeleteEventSubscription",
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEngineDefaultClusterParameters",
+ "rds:DescribeEngineDefaultParameters",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DescribeValidDBInstanceModifications",
+ "rds:DownloadDBLogFilePortion",
+ "rds:FailoverDBCluster",
+ "rds:ListTagsForResource",
+ "rds:ModifyDBCluster",
+ "rds:ModifyDBClusterParameterGroup",
+ "rds:ModifyDBClusterSnapshotAttribute",
+ "rds:ModifyDBInstance",
+ "rds:ModifyDBParameterGroup",
+ "rds:ModifyDBSubnetGroup",
+ "rds:ModifyEventSubscription",
+ "rds:PromoteReadReplicaDBCluster",
+ "rds:RebootDBInstance",
+ "rds:RemoveRoleFromDBCluster",
+ "rds:RemoveSourceIdentifierFromSubscription",
+ "rds:RemoveTagsFromResource",
+ "rds:ResetDBClusterParameterGroup",
+ "rds:ResetDBParameterGroup",
+ "rds:RestoreDBClusterFromSnapshot",
+ "rds:RestoreDBClusterToPointInTime"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:AllocateAddress",
+ "ec2:AssignIpv6Addresses",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateRouteTable",
+ "ec2:AssociateSubnetCidrBlock",
+ "ec2:AssociateVpcCidrBlock",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDefaultSubnet",
+ "ec2:CreateDefaultVpc",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies",
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHV6VMSNDDHJ3ESNI",
+ "PolicyName": "AmazonDocDBConsoleFullAccess",
+ "UpdateDate": "2021-04-05T22:42:40+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonDocDBFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDocDBFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-09T20:21:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:AddRoleToDBCluster",
+ "rds:AddSourceIdentifierToSubscription",
+ "rds:AddTagsToResource",
+ "rds:ApplyPendingMaintenanceAction",
+ "rds:CopyDBClusterParameterGroup",
+ "rds:CopyDBClusterSnapshot",
+ "rds:CopyDBParameterGroup",
+ "rds:CreateDBCluster",
+ "rds:CreateDBClusterParameterGroup",
+ "rds:CreateDBClusterSnapshot",
+ "rds:CreateDBInstance",
+ "rds:CreateDBParameterGroup",
+ "rds:CreateDBSubnetGroup",
+ "rds:CreateEventSubscription",
+ "rds:DeleteDBCluster",
+ "rds:DeleteDBClusterParameterGroup",
+ "rds:DeleteDBClusterSnapshot",
+ "rds:DeleteDBInstance",
+ "rds:DeleteDBParameterGroup",
+ "rds:DeleteDBSubnetGroup",
+ "rds:DeleteEventSubscription",
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEngineDefaultClusterParameters",
+ "rds:DescribeEngineDefaultParameters",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DescribeValidDBInstanceModifications",
+ "rds:DownloadDBLogFilePortion",
+ "rds:FailoverDBCluster",
+ "rds:ListTagsForResource",
+ "rds:ModifyDBCluster",
+ "rds:ModifyDBClusterParameterGroup",
+ "rds:ModifyDBClusterSnapshotAttribute",
+ "rds:ModifyDBInstance",
+ "rds:ModifyDBParameterGroup",
+ "rds:ModifyDBSubnetGroup",
+ "rds:ModifyEventSubscription",
+ "rds:PromoteReadReplicaDBCluster",
+ "rds:RebootDBInstance",
+ "rds:RemoveRoleFromDBCluster",
+ "rds:RemoveSourceIdentifierFromSubscription",
+ "rds:RemoveTagsFromResource",
+ "rds:ResetDBClusterParameterGroup",
+ "rds:ResetDBParameterGroup",
+ "rds:RestoreDBClusterFromSnapshot",
+ "rds:RestoreDBClusterToPointInTime"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies",
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQKACUF6JJHALEG5K",
+ "PolicyName": "AmazonDocDBFullAccess",
+ "UpdateDate": "2019-01-09T20:21:44+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDocDBReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDocDBReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-09T20:30:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DownloadDBLogFilePortion",
+ "rds:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/docdb/*:log-stream:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI477RMVACLTLWY5RQ",
+ "PolicyName": "AmazonDocDBReadOnlyAccess",
+ "UpdateDate": "2019-01-09T20:30:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonDynamoDBFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess",
+ "AttachmentCount": 2,
+ "CreateDate": "2015-02-06T18:40:11+00:00",
+ "DefaultVersionId": "v15",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:*",
+ "dax:*",
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:GetMetricData",
+ "datapipeline:ActivatePipeline",
+ "datapipeline:CreatePipeline",
+ "datapipeline:DeletePipeline",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:PutPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:SetTopicAttributes",
+ "lambda:CreateFunction",
+ "lambda:ListFunctions",
+ "lambda:ListEventSourceMappings",
+ "lambda:CreateEventSourceMapping",
+ "lambda:DeleteEventSourceMapping",
+ "lambda:GetFunctionConfiguration",
+ "lambda:DeleteFunction",
+ "resource-groups:ListGroups",
+ "resource-groups:ListGroupResources",
+ "resource-groups:GetGroup",
+ "resource-groups:GetGroupQuery",
+ "resource-groups:DeleteGroup",
+ "resource-groups:CreateGroup",
+ "tag:GetResources",
+ "kinesis:ListStreams",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:GetInsightRuleReport",
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:insight-rule/DynamoDBContributorInsights*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "application-autoscaling.amazonaws.com",
+ "application-autoscaling.amazonaws.com.cn",
+ "dax.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "replication.dynamodb.amazonaws.com",
+ "dax.amazonaws.com",
+ "dynamodb.application-autoscaling.amazonaws.com",
+ "contributorinsights.dynamodb.amazonaws.com",
+ "kinesisreplication.dynamodb.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINUGF2JSOSUY76KYA",
+ "PolicyName": "AmazonDynamoDBFullAccess",
+ "UpdateDate": "2021-01-29T17:38:30+00:00",
+ "VersionId": "v15"
+ },
+ "AmazonDynamoDBFullAccesswithDataPipeline": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccesswithDataPipeline",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "dynamodb:*",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "sns:Subscribe",
+ "sns:Unsubscribe",
+ "sns:SetTopicAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsole"
+ },
+ {
+ "Action": [
+ "lambda:*",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsoleTriggers"
+ },
+ {
+ "Action": [
+ "datapipeline:*",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DDBConsoleImportExport"
+ },
+ {
+ "Action": [
+ "iam:GetRolePolicy",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "IAMEDPRoles"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DescribeInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "elasticmapreduce:*",
+ "datapipeline:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EMR"
+ },
+ {
+ "Action": [
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:Put*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "S3"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ3ORT7KDISSXGHJXA",
+ "PolicyName": "AmazonDynamoDBFullAccesswithDataPipeline",
+ "UpdateDate": "2015-11-12T02:17:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonDynamoDBReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:12+00:00",
+ "DefaultVersionId": "v13",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricData",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "dynamodb:BatchGetItem",
+ "dynamodb:Describe*",
+ "dynamodb:List*",
+ "dynamodb:GetItem",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "dynamodb:PartiQLSelect",
+ "dax:Describe*",
+ "dax:List*",
+ "dax:GetItem",
+ "dax:BatchGetItem",
+ "dax:Query",
+ "dax:Scan",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "iam:GetRole",
+ "iam:ListRoles",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics",
+ "lambda:ListFunctions",
+ "lambda:ListEventSourceMappings",
+ "lambda:GetFunctionConfiguration",
+ "resource-groups:ListGroups",
+ "resource-groups:ListGroupResources",
+ "resource-groups:GetGroup",
+ "resource-groups:GetGroupQuery",
+ "tag:GetResources",
+ "kinesis:ListStreams",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:GetInsightRuleReport",
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:insight-rule/DynamoDBContributorInsights*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIY2XFNA232XJ6J7X2",
+ "PolicyName": "AmazonDynamoDBReadOnlyAccess",
+ "UpdateDate": "2021-01-27T01:01:47+00:00",
+ "VersionId": "v13"
+ },
+ "AmazonEC2ContainerRegistryFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-21T17:06:48+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:*",
+ "cloudtrail:LookupEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "replication.ecr.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIESRL7KD7IIVF6V4W",
+ "PolicyName": "AmazonEC2ContainerRegistryFullAccess",
+ "UpdateDate": "2020-12-05T00:04:19+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2ContainerRegistryPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-21T17:05:33+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:GetRepositoryPolicy",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecr:DescribeImages",
+ "ecr:BatchGetImage",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetLifecyclePolicyPreview",
+ "ecr:ListTagsForResource",
+ "ecr:DescribeImageScanFindings",
+ "ecr:InitiateLayerUpload",
+ "ecr:UploadLayerPart",
+ "ecr:CompleteLayerUpload",
+ "ecr:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDNE5PIHROIBGGDDW",
+ "PolicyName": "AmazonEC2ContainerRegistryPowerUser",
+ "UpdateDate": "2019-12-10T20:48:08+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2ContainerRegistryReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-21T17:04:15+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:GetRepositoryPolicy",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecr:DescribeImages",
+ "ecr:BatchGetImage",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetLifecyclePolicyPreview",
+ "ecr:ListTagsForResource",
+ "ecr:DescribeImageScanFindings"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFYZPA37OOHVIH7KQ",
+ "PolicyName": "AmazonEC2ContainerRegistryReadOnly",
+ "UpdateDate": "2019-12-10T20:56:32+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2ContainerServiceAutoscaleRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceAutoscaleRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-05-12T23:25:44+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:DescribeServices",
+ "ecs:UpdateService"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUAP3EGGGXXCPDQKK",
+ "PolicyName": "AmazonEC2ContainerServiceAutoscaleRole",
+ "UpdateDate": "2018-02-05T19:15:15+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerServiceEventsRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-05-30T16:51:35+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecs:RunTask"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ecs-tasks.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITKFNIUAG27VSYNZ4",
+ "PolicyName": "AmazonEC2ContainerServiceEventsRole",
+ "UpdateDate": "2018-05-22T19:13:11+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T16:14:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:Describe*",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DeregisterTargets",
+ "elasticloadbalancing:Describe*",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJO53W2XHNACG7V77Q",
+ "PolicyName": "AmazonEC2ContainerServiceRole",
+ "UpdateDate": "2016-08-11T13:08:01+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2ContainerServiceforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-03-19T18:45:18+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeTags",
+ "ecs:CreateCluster",
+ "ecs:DeregisterContainerInstance",
+ "ecs:DiscoverPollEndpoint",
+ "ecs:Poll",
+ "ecs:RegisterContainerInstance",
+ "ecs:StartTelemetrySession",
+ "ecs:UpdateContainerInstancesState",
+ "ecs:Submit*",
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLYJCVHC7TQHCSQDS",
+ "PolicyName": "AmazonEC2ContainerServiceforEC2Role",
+ "UpdateDate": "2019-06-13T19:11:37+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonEC2FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:15+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "autoscaling.amazonaws.com",
+ "ec2scheduled.amazonaws.com",
+ "elasticloadbalancing.amazonaws.com",
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com",
+ "transitgateway.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3VAJF5ZCRZ7MCQE6",
+ "PolicyName": "AmazonEC2FullAccess",
+ "UpdateDate": "2018-11-27T02:16:56+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonEC2ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIGDT4SV4GSETWTBZK",
+ "PolicyName": "AmazonEC2ReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:17+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEC2RolePolicyForLaunchWizard": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEC2RolePolicyForLaunchWizard",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-13T08:05:53+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachVolume",
+ "ec2:RebootInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/LaunchWizardResourceGroupID": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:ReplaceRoute"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/LaunchWizardApplicationType": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:route-table/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:AssociateAddress",
+ "ec2:DescribeInstances",
+ "ec2:DescribeImages",
+ "ec2:DescribeRegions",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeRouteTables",
+ "ec2:ModifyInstanceAttribute",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricData",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:CreateVolume"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "LaunchWizardResourceGroupID",
+ "LaunchWizardApplicationType"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectTagging",
+ "s3:GetBucketLocation",
+ "logs:PutLogEvents",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:*",
+ "arn:aws:s3:::launchwizard*",
+ "arn:aws:s3:::aws-sap-data-provider/config.properties"
+ ]
+ },
+ {
+ "Action": "logs:Create*",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:*"
+ },
+ {
+ "Action": [
+ "ec2:Describe*",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:SignalResource",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStacks"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "LaunchWizardResourceGroupID"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:BatchGetItem",
+ "dynamodb:PutItem",
+ "sqs:ReceiveMessage",
+ "sqs:SendMessage",
+ "dynamodb:Scan",
+ "s3:ListBucket",
+ "dynamodb:Query",
+ "dynamodb:UpdateItem",
+ "dynamodb:DeleteTable",
+ "dynamodb:CreateTable",
+ "s3:GetObject",
+ "dynamodb:DescribeTable",
+ "s3:GetBucketLocation",
+ "dynamodb:UpdateTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::launchwizard*",
+ "arn:aws:dynamodb:*:*:table/LaunchWizard*",
+ "arn:aws:sqs:*:*:LaunchWizard*"
+ ]
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Condition": {
+ "StringLike": {
+ "ssm:resourceTag/LaunchWizardApplicationType": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:SendCommand",
+ "ssm:GetDocument"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:document/AWSSAP-InstallBackint"
+ ]
+ },
+ {
+ "Action": [
+ "fsx:DescribeFileSystems",
+ "fsx:ListTagsForResource"
+ ],
+ "Condition": {
+ "ForAllValues:StringLike": {
+ "aws:TagKeys": "LaunchWizard*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CBGI56NFS",
+ "PolicyName": "AmazonEC2RolePolicyForLaunchWizard",
+ "UpdateDate": "2022-01-27T23:01:20+00:00",
+ "VersionId": "v9"
+ },
+ "AmazonEC2RoleforAWSCodeDeploy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforAWSCodeDeploy",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-19T18:10:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAZKXZ27TAJ4PVWGK",
+ "PolicyName": "AmazonEC2RoleforAWSCodeDeploy",
+ "UpdateDate": "2017-03-20T17:14:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2RoleforAWSCodeDeployLimited": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforAWSCodeDeployLimited",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-24T17:55:18+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*/CodeDeploy/*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/UseWithCodeDeploy": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NN2A7WC6C",
+ "PolicyName": "AmazonEC2RoleforAWSCodeDeployLimited",
+ "UpdateDate": "2022-01-20T21:37:31+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEC2RoleforDataPipelineRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforDataPipelineRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:25+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "datapipeline:*",
+ "dynamodb:*",
+ "ec2:Describe*",
+ "elasticmapreduce:AddJobFlowSteps",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:ListInstance*",
+ "elasticmapreduce:ModifyInstanceGroups",
+ "rds:Describe*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "s3:*",
+ "sdb:*",
+ "sns:*",
+ "sqs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ3Z5I2WAJE5DN2J36",
+ "PolicyName": "AmazonEC2RoleforDataPipelineRole",
+ "UpdateDate": "2016-02-22T17:24:05+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2RoleforSSM": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-29T17:48:35+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAssociation",
+ "ssm:GetDeployablePatchSnapshotForInstance",
+ "ssm:GetDocument",
+ "ssm:DescribeDocument",
+ "ssm:GetManifest",
+ "ssm:GetParameters",
+ "ssm:ListAssociations",
+ "ssm:ListInstanceAssociations",
+ "ssm:PutInventory",
+ "ssm:PutComplianceItems",
+ "ssm:PutConfigurePackageResult",
+ "ssm:UpdateAssociationStatus",
+ "ssm:UpdateInstanceAssociationStatus",
+ "ssm:UpdateInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssmmessages:CreateControlChannel",
+ "ssmmessages:CreateDataChannel",
+ "ssmmessages:OpenControlChannel",
+ "ssmmessages:OpenDataChannel"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2messages:AcknowledgeMessage",
+ "ec2messages:DeleteMessage",
+ "ec2messages:FailMessage",
+ "ec2messages:GetEndpoint",
+ "ec2messages:GetMessages",
+ "ec2messages:SendReply"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ds:CreateComputer",
+ "ds:DescribeDirectories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:GetEncryptionConfiguration",
+ "s3:AbortMultipartUpload",
+ "s3:ListMultipartUploadParts",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI6TL3SMY22S4KMMX6",
+ "PolicyName": "AmazonEC2RoleforSSM",
+ "UpdateDate": "2019-01-24T19:20:51+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonEC2SpotFleetAutoscaleRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetAutoscaleRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-08-19T18:27:22+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "ec2.application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIMFFRMIOBGDP2TAVE",
+ "PolicyName": "AmazonEC2SpotFleetAutoscaleRole",
+ "UpdateDate": "2019-02-18T19:17:03+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEC2SpotFleetTaggingRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-29T18:19:29+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:RequestSpotInstances",
+ "ec2:TerminateInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:CreateTags",
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:RegisterTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:*/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5U6UMLCEYLX5OLC4",
+ "PolicyName": "AmazonEC2SpotFleetTaggingRole",
+ "UpdateDate": "2020-04-23T19:30:49+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonECSServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonECSServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-10-14T01:18:58+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachNetworkInterface",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:Describe*",
+ "ec2:DetachNetworkInterface",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DeregisterTargets",
+ "elasticloadbalancing:Describe*",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:RegisterTargets",
+ "route53:ChangeResourceRecordSets",
+ "route53:CreateHealthCheck",
+ "route53:DeleteHealthCheck",
+ "route53:Get*",
+ "route53:List*",
+ "route53:UpdateHealthCheck",
+ "servicediscovery:DeregisterInstance",
+ "servicediscovery:Get*",
+ "servicediscovery:List*",
+ "servicediscovery:RegisterInstance",
+ "servicediscovery:UpdateInstanceCustomHealthStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ECSTaskManagement"
+ },
+ {
+ "Action": [
+ "autoscaling:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AutoScaling"
+ },
+ {
+ "Action": [
+ "autoscaling:DeletePolicy",
+ "autoscaling:PutScalingPolicy",
+ "autoscaling:SetInstanceProtection",
+ "autoscaling:UpdateAutoScalingGroup"
+ ],
+ "Condition": {
+ "Null": {
+ "autoscaling:ResourceTag/AmazonECSManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AutoScalingManagement"
+ },
+ {
+ "Action": [
+ "autoscaling-plans:CreateScalingPlan",
+ "autoscaling-plans:DeleteScalingPlan",
+ "autoscaling-plans:DescribeScalingPlans"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AutoScalingPlanManagement"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:*",
+ "Sid": "CWAlarmManagement"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*",
+ "Sid": "ECSTagging"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*",
+ "Sid": "CWLogGroupManagement"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*:log-stream:*",
+ "Sid": "CWLogStreamManagement"
+ },
+ {
+ "Action": [
+ "ssm:DescribeSessions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ExecuteCommandSessionManagement"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ecs:*:*:task/*",
+ "arn:aws:ssm:*:*:document/AmazonECS-ExecuteInteractiveCommand"
+ ],
+ "Sid": "ExecuteCommand"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIVUWKCAI7URU4WUEI",
+ "PolicyName": "AmazonECSServiceRolePolicy",
+ "UpdateDate": "2021-01-13T20:04:13+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonECSTaskExecutionRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-11-16T18:48:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJG4T4G4PV56DE72PY",
+ "PolicyName": "AmazonECSTaskExecutionRolePolicy",
+ "UpdateDate": "2017-11-16T18:48:22+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonECS_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonECS_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-07T21:36:54+00:00",
+ "DefaultVersionId": "v19",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "appmesh:DescribeVirtualGateway",
+ "appmesh:DescribeVirtualNode",
+ "appmesh:ListMeshes",
+ "appmesh:ListVirtualGateways",
+ "appmesh:ListVirtualNodes",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:Describe*",
+ "autoscaling:UpdateAutoScalingGroup",
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStack*",
+ "cloudformation:UpdateStack",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "codedeploy:BatchGetApplicationRevisions",
+ "codedeploy:BatchGetApplications",
+ "codedeploy:BatchGetDeploymentGroups",
+ "codedeploy:BatchGetDeployments",
+ "codedeploy:ContinueDeployment",
+ "codedeploy:CreateApplication",
+ "codedeploy:CreateDeployment",
+ "codedeploy:CreateDeploymentGroup",
+ "codedeploy:GetApplication",
+ "codedeploy:GetApplicationRevision",
+ "codedeploy:GetDeployment",
+ "codedeploy:GetDeploymentConfig",
+ "codedeploy:GetDeploymentGroup",
+ "codedeploy:GetDeploymentTarget",
+ "codedeploy:ListApplicationRevisions",
+ "codedeploy:ListApplications",
+ "codedeploy:ListDeploymentConfigs",
+ "codedeploy:ListDeploymentGroups",
+ "codedeploy:ListDeployments",
+ "codedeploy:ListDeploymentTargets",
+ "codedeploy:RegisterApplicationRevision",
+ "codedeploy:StopDeployment",
+ "ec2:AssociateRouteTable",
+ "ec2:AttachInternetGateway",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateVpc",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteVpc",
+ "ec2:Describe*",
+ "ec2:DetachInternetGateway",
+ "ec2:DisassociateRouteTable",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:RequestSpotFleet",
+ "ec2:RunInstances",
+ "ecs:*",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticloadbalancing:CreateListener",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:CreateRule",
+ "elasticloadbalancing:CreateTargetGroup",
+ "elasticloadbalancing:DeleteListener",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeleteRule",
+ "elasticloadbalancing:DeleteTargetGroup",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget",
+ "events:ListTargetsByRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "fsx:DescribeFileSystems",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListInstanceProfiles",
+ "iam:ListRoles",
+ "lambda:ListFunctions",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "logs:FilterLogEvents",
+ "route53:CreateHostedZone",
+ "route53:DeleteHostedZone",
+ "route53:GetHealthCheck",
+ "route53:GetHostedZone",
+ "route53:ListHostedZonesByName",
+ "servicediscovery:CreatePrivateDnsNamespace",
+ "servicediscovery:CreateService",
+ "servicediscovery:DeleteService",
+ "servicediscovery:GetNamespace",
+ "servicediscovery:GetOperation",
+ "servicediscovery:GetService",
+ "servicediscovery:ListNamespaces",
+ "servicediscovery:ListServices",
+ "servicediscovery:UpdateService",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:GetParameter",
+ "ssm:GetParameters",
+ "ssm:GetParametersByPath"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/aws/service/ecs*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-name": "EC2ContainerService-*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ecs-tasks.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/ecsInstanceRole*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "application-autoscaling.amazonaws.com",
+ "application-autoscaling.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/ecsAutoscaleRole*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "autoscaling.amazonaws.com",
+ "ecs.amazonaws.com",
+ "ecs.application-autoscaling.amazonaws.com",
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7S7AN6YQPTJC7IFS",
+ "PolicyName": "AmazonECS_FullAccess",
+ "UpdateDate": "2020-10-12T21:02:23+00:00",
+ "VersionId": "v19"
+ },
+ "AmazonEKSClusterPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-27T21:06:14+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:UpdateAutoScalingGroup",
+ "ec2:AttachVolume",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateRoute",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:DeleteRoute",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DescribeInstances",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVolumesModifications",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DetachVolume",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifyVolume",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInternetGateways",
+ "elasticloadbalancing:AddTags",
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:AttachLoadBalancerToSubnets",
+ "elasticloadbalancing:ConfigureHealthCheck",
+ "elasticloadbalancing:CreateListener",
+ "elasticloadbalancing:CreateLoadBalancer",
+ "elasticloadbalancing:CreateLoadBalancerListeners",
+ "elasticloadbalancing:CreateLoadBalancerPolicy",
+ "elasticloadbalancing:CreateTargetGroup",
+ "elasticloadbalancing:DeleteListener",
+ "elasticloadbalancing:DeleteLoadBalancer",
+ "elasticloadbalancing:DeleteLoadBalancerListeners",
+ "elasticloadbalancing:DeleteTargetGroup",
+ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
+ "elasticloadbalancing:DeregisterTargets",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancerPolicies",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroupAttributes",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticloadbalancing:DetachLoadBalancerFromSubnets",
+ "elasticloadbalancing:ModifyListener",
+ "elasticloadbalancing:ModifyLoadBalancerAttributes",
+ "elasticloadbalancing:ModifyTargetGroup",
+ "elasticloadbalancing:ModifyTargetGroupAttributes",
+ "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
+ "elasticloadbalancing:RegisterTargets",
+ "elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
+ "elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIBTLDQMIC6UOIGFWA",
+ "PolicyName": "AmazonEKSClusterPolicy",
+ "UpdateDate": "2021-06-15T20:57:05+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonEKSConnectorServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEKSConnectorServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-04T20:31:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:CreateActivation",
+ "ssm:DescribeInstanceInformation",
+ "ssm:DeleteActivation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AccessSSMService"
+ },
+ {
+ "Action": [
+ "ssm:StartSession"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:eks:*:*:cluster/*",
+ "arn:aws:ssm:*::document/AmazonEKS-ExecuteNonInteractiveCommand"
+ ],
+ "Sid": "ConnectorAgentStartSession"
+ },
+ {
+ "Action": [
+ "ssm:DeregisterManagedInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:eks:*:*:cluster/*"
+ ],
+ "Sid": "ConnectorAgentDeregister"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PassAnyRoleToSsm"
+ },
+ {
+ "Action": "events:PutRule",
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "eks-connector.amazonaws.com",
+ "events:source": "aws.ssm"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PutManagedEventRule"
+ },
+ {
+ "Action": "events:PutTargets",
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "eks-connector.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PutManagedEventTarget"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H2PH3AV2C",
+ "PolicyName": "AmazonEKSConnectorServiceRolePolicy",
+ "UpdateDate": "2021-09-04T20:31:08+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEKSFargatePodExecutionRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-22T04:34:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchGetImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FJRXZH7YQ",
+ "PolicyName": "AmazonEKSFargatePodExecutionRolePolicy",
+ "UpdateDate": "2019-11-22T04:34:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEKSForFargateServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEKSForFargateServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-22T04:36:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeRouteTables"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JAUTVFICB",
+ "PolicyName": "AmazonEKSForFargateServiceRolePolicy",
+ "UpdateDate": "2019-11-22T04:36:25+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEKSServicePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKSServicePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-27T21:08:21+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DetachNetworkInterface",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "iam:ListAttachedRolePolicies",
+ "eks:UpdateClusterVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:subnet/*"
+ ]
+ },
+ {
+ "Action": "route53:AssociateVPCWithHostedZone",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:CreateLogGroup",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*:*"
+ },
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*:*:*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "eks.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFCNXU6HPGCIVXYDI",
+ "PolicyName": "AmazonEKSServicePolicy",
+ "UpdateDate": "2020-05-27T19:27:03+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonEKSServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEKSServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-02-21T20:10:47+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:CreateNetworkInterfacePermission",
+ "iam:ListAttachedRolePolicies",
+ "ec2:CreateSecurityGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupIngress"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "ec2:ResourceTag/Name": "eks-cluster-sg*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "aws:TagKeys": [
+ "kubernetes.io/cluster/*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:subnet/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "aws:RequestTag/Name": "eks-cluster-sg*",
+ "aws:TagKeys": [
+ "kubernetes.io/cluster/*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": "route53:AssociateVPCWithHostedZone",
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53:::hostedzone/*"
+ },
+ {
+ "Action": "logs:CreateLogGroup",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*:*"
+ },
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KZBLSP26Y",
+ "PolicyName": "AmazonEKSServiceRolePolicy",
+ "UpdateDate": "2020-05-27T19:30:19+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEKSVPCResourceController": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKSVPCResourceController",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-12T00:55:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:CreateNetworkInterfacePermission",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "ec2:ResourceTag/eks:eni:owner": "eks-vpc-resource-controller"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface",
+ "ec2:AttachNetworkInterface",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:AssignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PBOFT2NNA",
+ "PolicyName": "AmazonEKSVPCResourceController",
+ "UpdateDate": "2020-08-12T00:55:34+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEKSWorkerNodePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-27T21:09:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVolumesModifications",
+ "ec2:DescribeVpcs",
+ "eks:DescribeCluster"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIBVMOY52IPQ6HD3PO",
+ "PolicyName": "AmazonEKSWorkerNodePolicy",
+ "UpdateDate": "2018-05-27T21:09:01+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEKS_CNI_Policy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-27T21:07:42+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AttachNetworkInterface",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeInstanceTypes",
+ "ec2:DetachNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWLAS474LDBXNNTM4",
+ "PolicyName": "AmazonEKS_CNI_Policy",
+ "UpdateDate": "2020-04-20T20:52:01+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonEMRCleanupPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEMRCleanupPolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-09-26T23:54:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:TerminateInstances",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeVolumeStatus",
+ "ec2:DescribeVolumes",
+ "ec2:DetachVolume",
+ "ec2:DeleteVolume",
+ "ec2:DescribePlacementGroups",
+ "ec2:DeletePlacementGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4YEZURRMKACW56EA",
+ "PolicyName": "AmazonEMRCleanupPolicy",
+ "UpdateDate": "2020-09-29T21:11:54+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEMRContainersServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEMRContainersServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-09T00:38:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "eks:DescribeCluster",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancers"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "acm:ImportCertificate",
+ "acm:AddTagsToCertificate"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/emr-container:endpoint:managed-certificate": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "acm:DeleteCertificate"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/emr-container:endpoint:managed-certificate": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P24YZ52G4",
+ "PolicyName": "AmazonEMRContainersServiceRolePolicy",
+ "UpdateDate": "2021-12-03T19:55:44+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEMRFullAccessPolicy_v2": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEMRFullAccessPolicy_v2",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-12T01:50:29+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticmapreduce:RunJobFlow"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RunJobFlowExplicitlyWithEMRManagedTag"
+ },
+ {
+ "Action": [
+ "elasticmapreduce:AddInstanceFleet",
+ "elasticmapreduce:AddInstanceGroups",
+ "elasticmapreduce:AddJobFlowSteps",
+ "elasticmapreduce:AddTags",
+ "elasticmapreduce:CancelSteps",
+ "elasticmapreduce:CreateEditor",
+ "elasticmapreduce:CreateSecurityConfiguration",
+ "elasticmapreduce:DeleteEditor",
+ "elasticmapreduce:DeleteSecurityConfiguration",
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:DescribeEditor",
+ "elasticmapreduce:DescribeJobFlows",
+ "elasticmapreduce:DescribeSecurityConfiguration",
+ "elasticmapreduce:DescribeStep",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:GetManagedScalingPolicy",
+ "elasticmapreduce:ListBootstrapActions",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListEditors",
+ "elasticmapreduce:ListInstanceFleets",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "elasticmapreduce:ListSteps",
+ "elasticmapreduce:ModifyCluster",
+ "elasticmapreduce:ModifyInstanceFleet",
+ "elasticmapreduce:ModifyInstanceGroups",
+ "elasticmapreduce:OpenEditorInConsole",
+ "elasticmapreduce:PutAutoScalingPolicy",
+ "elasticmapreduce:PutBlockPublicAccessConfiguration",
+ "elasticmapreduce:PutManagedScalingPolicy",
+ "elasticmapreduce:RemoveAutoScalingPolicy",
+ "elasticmapreduce:RemoveManagedScalingPolicy",
+ "elasticmapreduce:RemoveTags",
+ "elasticmapreduce:SetTerminationProtection",
+ "elasticmapreduce:StartEditor",
+ "elasticmapreduce:StopEditor",
+ "elasticmapreduce:TerminateJobFlows",
+ "elasticmapreduce:ViewEventsFromAllClustersInConsole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ElasticMapReduceActions"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ViewMetricsInEMRConsole"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "elasticmapreduce.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EMR_DefaultRole",
+ "Sid": "PassRoleForElasticMapReduce"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EMR_EC2_DefaultRole",
+ "Sid": "PassRoleForEC2"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "application-autoscaling.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EMR_AutoScaling_DefaultRole",
+ "Sid": "PassRoleForAutoScaling"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "elasticmapreduce.amazonaws.com",
+ "elasticmapreduce.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/elasticmapreduce.amazonaws.com*/AWSServiceRoleForEMRCleanup*",
+ "Sid": "ElasticMapReduceServiceLinkedRole"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "s3:ListAllMyBuckets",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ConsoleUIActions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BK4MMWW4W",
+ "PolicyName": "AmazonEMRFullAccessPolicy_v2",
+ "UpdateDate": "2021-03-23T16:57:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEMRReadOnlyAccessPolicy_v2": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEMRReadOnlyAccessPolicy_v2",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-12T01:39:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticmapreduce:DescribeCluster",
+ "elasticmapreduce:DescribeEditor",
+ "elasticmapreduce:DescribeJobFlows",
+ "elasticmapreduce:DescribeSecurityConfiguration",
+ "elasticmapreduce:DescribeStep",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:GetManagedScalingPolicy",
+ "elasticmapreduce:ListBootstrapActions",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListEditors",
+ "elasticmapreduce:ListInstanceFleets",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "elasticmapreduce:ListSteps",
+ "elasticmapreduce:ViewEventsFromAllClustersInConsole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ElasticMapReduceActions"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ViewMetricsInEMRConsole"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GDFTJ74PD",
+ "PolicyName": "AmazonEMRReadOnlyAccessPolicy_v2",
+ "UpdateDate": "2021-03-12T01:39:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEMRServicePolicy_v2": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonEMRServicePolicy_v2",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-12T01:11:08+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:RunInstances",
+ "ec2:CreateFleet",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "CreateInTaggedNetwork"
+ },
+ {
+ "Action": [
+ "ec2:CreateFleet",
+ "ec2:RunInstances",
+ "ec2:CreateLaunchTemplateVersion"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*",
+ "Sid": "CreateWithEMRTaggedLaunchTemplate"
+ },
+ {
+ "Action": "ec2:CreateLaunchTemplate",
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*",
+ "Sid": "CreateEMRTaggedLaunchTemplate"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:CreateFleet"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ],
+ "Sid": "CreateEMRTaggedInstancesAndVolumes"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:CreateFleet",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*::image/ami-*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:capacity-reservation/*",
+ "arn:aws:ec2:*:*:placement-group/EMR_*",
+ "arn:aws:ec2:*:*:fleet/*",
+ "arn:aws:ec2:*:*:dedicated-host/*",
+ "arn:aws:resource-groups:*:*:group/*"
+ ],
+ "Sid": "ResourcesToLaunchEC2"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ManageEMRTaggedResources"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ],
+ "Sid": "ManageTagsOnEMRTaggedResources"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ],
+ "Sid": "CreateNetworkInterfaceNeededForPrivateSubnet"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "RunInstances",
+ "CreateFleet",
+ "CreateLaunchTemplate",
+ "CreateNetworkInterface"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ],
+ "Sid": "TagOnCreateTaggedEMRResources"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags",
+ "ec2:DeleteTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:placement-group/EMR_*"
+ ],
+ "Sid": "TagPlacementGroups"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeCapacityReservations",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVolumeStatus",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ListActionsForEC2Resources"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "CreateDefaultSecurityGroupWithEMRTags"
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc/*"
+ ],
+ "Sid": "CreateDefaultSecurityGroupInVPCWithEMRTags"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true",
+ "ec2:CreateAction": "CreateSecurityGroup"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*",
+ "Sid": "TagOnCreateDefaultSecurityGroupWithEMRTags"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ManageSecurityGroups"
+ },
+ {
+ "Action": [
+ "ec2:CreatePlacementGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:placement-group/EMR_*",
+ "Sid": "CreateEMRPlacementGroups"
+ },
+ {
+ "Action": [
+ "ec2:DeletePlacementGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DeletePlacementGroups"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AutoScaling"
+ },
+ {
+ "Action": [
+ "resource-groups:ListGroupResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResourceGroupsForCapacityReservations"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:*_EMR_Auto_Scaling",
+ "Sid": "AutoScalingCloudWatch"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "application-autoscaling.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EMR_AutoScaling_DefaultRole",
+ "Sid": "PassRoleForAutoScaling"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/EMR_EC2_DefaultRole",
+ "Sid": "PassRoleForEC2"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M2DU3H3GW",
+ "PolicyName": "AmazonEMRServicePolicy_v2",
+ "UpdateDate": "2022-02-15T16:48:29+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonESCognitoAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonESCognitoAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-02-28T22:29:18+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:DeleteUserPoolClient",
+ "cognito-idp:UpdateUserPoolClient",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:AdminInitiateAuth",
+ "cognito-idp:AdminUserGlobalSignOut",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-identity:DescribeIdentityPool",
+ "cognito-identity:UpdateIdentityPool",
+ "cognito-identity:SetIdentityPoolRoles",
+ "cognito-identity:GetIdentityPoolRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "cognito-identity.amazonaws.com",
+ "cognito-identity-us-gov.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJL2FUMODIGNDPTZHO",
+ "PolicyName": "AmazonESCognitoAccess",
+ "UpdateDate": "2021-12-20T14:04:44+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonESFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonESFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-01T19:14:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJM6ZTCU24QL5PZCGC",
+ "PolicyName": "AmazonESFullAccess",
+ "UpdateDate": "2015-10-01T19:14:00+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonESReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonESReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-01T19:18:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:Describe*",
+ "es:List*",
+ "es:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUDMRLOQ7FPAR46FQ",
+ "PolicyName": "AmazonESReadOnlyAccess",
+ "UpdateDate": "2018-10-03T03:32:56+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElastiCacheFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:20+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "elasticache:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "elasticache.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/elasticache.amazonaws.com/AWSServiceRoleForElastiCache"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIA2V44CPHAUAAECKG",
+ "PolicyName": "AmazonElastiCacheFullAccess",
+ "UpdateDate": "2017-12-07T17:48:26+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElastiCacheReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElastiCacheReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticache:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPDACSNQHSENWAKM2",
+ "PolicyName": "AmazonElastiCacheReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:21+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticContainerRegistryPublicFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticContainerRegistryPublicFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T17:25:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr-public:*",
+ "sts:GetServiceBearerToken"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4F2SFMTI3G",
+ "PolicyName": "AmazonElasticContainerRegistryPublicFullAccess",
+ "UpdateDate": "2020-12-01T17:25:52+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticContainerRegistryPublicPowerUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticContainerRegistryPublicPowerUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T16:16:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr-public:GetAuthorizationToken",
+ "sts:GetServiceBearerToken",
+ "ecr-public:BatchCheckLayerAvailability",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:DescribeRegistries",
+ "ecr-public:DescribeImages",
+ "ecr-public:DescribeImageTags",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRegistryCatalogData",
+ "ecr-public:InitiateLayerUpload",
+ "ecr-public:UploadLayerPart",
+ "ecr-public:CompleteLayerUpload",
+ "ecr-public:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P6F7N3OP7",
+ "PolicyName": "AmazonElasticContainerRegistryPublicPowerUser",
+ "UpdateDate": "2020-12-01T16:16:54+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticContainerRegistryPublicReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticContainerRegistryPublicReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T17:27:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr-public:GetAuthorizationToken",
+ "sts:GetServiceBearerToken",
+ "ecr-public:BatchCheckLayerAvailability",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:DescribeRegistries",
+ "ecr-public:DescribeImages",
+ "ecr-public:DescribeImageTags",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRegistryCatalogData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AD7UYLF25",
+ "PolicyName": "AmazonElasticContainerRegistryPublicReadOnly",
+ "UpdateDate": "2020-12-01T17:27:04+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticFileSystemClientFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemClientFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-13T16:27:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticfilesystem:ClientMount",
+ "elasticfilesystem:ClientRootAccess",
+ "elasticfilesystem:ClientWrite",
+ "elasticfilesystem:DescribeMountTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KAMR2MLDF",
+ "PolicyName": "AmazonElasticFileSystemClientFullAccess",
+ "UpdateDate": "2020-01-13T16:27:00+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticFileSystemClientReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemClientReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-13T16:24:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticfilesystem:ClientMount",
+ "elasticfilesystem:DescribeMountTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LBXR6UPYS",
+ "PolicyName": "AmazonElasticFileSystemClientReadOnlyAccess",
+ "UpdateDate": "2020-01-13T16:24:36+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticFileSystemClientReadWriteAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemClientReadWriteAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-13T16:21:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticfilesystem:ClientMount",
+ "elasticfilesystem:ClientWrite",
+ "elasticfilesystem:DescribeMountTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H74P6RBOF",
+ "PolicyName": "AmazonElasticFileSystemClientReadWriteAccess",
+ "UpdateDate": "2020-01-13T16:21:55+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticFileSystemFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-27T16:22:28+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricData",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "elasticfilesystem:CreateFileSystem",
+ "elasticfilesystem:CreateMountTarget",
+ "elasticfilesystem:CreateTags",
+ "elasticfilesystem:CreateAccessPoint",
+ "elasticfilesystem:CreateReplicationConfiguration",
+ "elasticfilesystem:DeleteFileSystem",
+ "elasticfilesystem:DeleteMountTarget",
+ "elasticfilesystem:DeleteTags",
+ "elasticfilesystem:DeleteAccessPoint",
+ "elasticfilesystem:DeleteFileSystemPolicy",
+ "elasticfilesystem:DeleteReplicationConfiguration",
+ "elasticfilesystem:DescribeAccountPreferences",
+ "elasticfilesystem:DescribeBackupPolicy",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeFileSystemPolicy",
+ "elasticfilesystem:DescribeLifecycleConfiguration",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticfilesystem:DescribeTags",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeReplicationConfigurations",
+ "elasticfilesystem:ModifyMountTargetSecurityGroups",
+ "elasticfilesystem:PutAccountPreferences",
+ "elasticfilesystem:PutBackupPolicy",
+ "elasticfilesystem:PutLifecycleConfiguration",
+ "elasticfilesystem:PutFileSystemPolicy",
+ "elasticfilesystem:UpdateFileSystem",
+ "elasticfilesystem:TagResource",
+ "elasticfilesystem:UntagResource",
+ "elasticfilesystem:ListTagsForResource",
+ "elasticfilesystem:Backup",
+ "elasticfilesystem:Restore",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "elasticfilesystem.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKXTMNVQGIDNCKPBC",
+ "PolicyName": "AmazonElasticFileSystemFullAccess",
+ "UpdateDate": "2022-01-10T19:03:16+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonElasticFileSystemReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-27T16:25:25+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:GetMetricData",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "elasticfilesystem:DescribeAccountPreferences",
+ "elasticfilesystem:DescribeBackupPolicy",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeFileSystemPolicy",
+ "elasticfilesystem:DescribeLifecycleConfiguration",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticfilesystem:DescribeTags",
+ "elasticfilesystem:DescribeAccessPoints",
+ "elasticfilesystem:DescribeReplicationConfigurations",
+ "elasticfilesystem:ListTagsForResource",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPN5S4NE5JJOKVC4Y",
+ "PolicyName": "AmazonElasticFileSystemReadOnlyAccess",
+ "UpdateDate": "2022-01-10T18:53:37+00:00",
+ "VersionId": "v7"
+ },
+ "AmazonElasticFileSystemServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonElasticFileSystemServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2019-11-05T16:52:41+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "backup-storage:MountCapsule",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kms:*:*:key/*"
+ },
+ {
+ "Action": [
+ "backup:CreateBackupVault",
+ "backup:PutBackupVaultAccessPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:backup:*:*:backup-vault:aws/efs/automatic-backup-vault"
+ ]
+ },
+ {
+ "Action": [
+ "backup:CreateBackupPlan",
+ "backup:CreateBackupSelection"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:backup:*:*:backup-plan:*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "backup.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "backup.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/backup.amazonaws.com/AWSServiceRoleForBackup"
+ ]
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:CreateReplicationConfiguration",
+ "elasticfilesystem:DescribeReplicationConfigurations",
+ "elasticfilesystem:DeleteReplicationConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FXCJYWBN7",
+ "PolicyName": "AmazonElasticFileSystemServiceRolePolicy",
+ "UpdateDate": "2022-01-10T19:27:33+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonElasticFileSystemsUtils": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-29T15:16:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAssociation",
+ "ssm:GetDeployablePatchSnapshotForInstance",
+ "ssm:GetDocument",
+ "ssm:DescribeDocument",
+ "ssm:GetManifest",
+ "ssm:GetParameter",
+ "ssm:GetParameters",
+ "ssm:ListAssociations",
+ "ssm:ListInstanceAssociations",
+ "ssm:PutInventory",
+ "ssm:PutComplianceItems",
+ "ssm:PutConfigurePackageResult",
+ "ssm:UpdateAssociationStatus",
+ "ssm:UpdateInstanceAssociationStatus",
+ "ssm:UpdateInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssmmessages:CreateControlChannel",
+ "ssmmessages:CreateDataChannel",
+ "ssmmessages:OpenControlChannel",
+ "ssmmessages:OpenDataChannel"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2messages:AcknowledgeMessage",
+ "ec2messages:DeleteMessage",
+ "ec2messages:FailMessage",
+ "ec2messages:GetEndpoint",
+ "ec2messages:GetMessages",
+ "ec2messages:SendReply"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeMountTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAvailabilityZones"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KVOAQRKXW",
+ "PolicyName": "AmazonElasticFileSystemsUtils",
+ "UpdateDate": "2020-09-29T15:16:47+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticMapReduceEditorsRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceEditorsRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-16T21:55:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeSecurityGroups",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeTags",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:DescribeCluster"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "aws:elasticmapreduce:editor-id",
+ "aws:elasticmapreduce:job-flow-id"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIBI5CIE6OHUIGLYVG",
+ "PolicyName": "AmazonElasticMapReduceEditorsRole",
+ "UpdateDate": "2018-11-16T21:55:25+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticMapReduceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticMapReduceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:22+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateRoute",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteRoute",
+ "ec2:DeleteTags",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeNetworkAcls",
+ "ec2:CreateVpcEndpoint",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RunInstances",
+ "ec2:TerminateInstances",
+ "elasticmapreduce:*",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:ListRoles",
+ "iam:PassRole",
+ "kms:List*",
+ "s3:*",
+ "sdb:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "elasticmapreduce.amazonaws.com",
+ "elasticmapreduce.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZP5JFP3AMSGINBB2",
+ "PolicyName": "AmazonElasticMapReduceFullAccess",
+ "UpdateDate": "2019-10-11T15:19:30+00:00",
+ "VersionId": "v7"
+ },
+ "AmazonElasticMapReducePlacementGroupPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticMapReducePlacementGroupPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-29T00:37:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DeletePlacementGroup",
+ "ec2:DescribePlacementGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreatePlacementGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:placement-group/EMR_*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LC2KU77YD",
+ "PolicyName": "AmazonElasticMapReducePlacementGroupPolicy",
+ "UpdateDate": "2020-09-29T00:37:08+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticMapReduceReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticMapReduceReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:23+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:List*",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:ViewEventsFromAllClustersInConsole",
+ "s3:GetObject",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sdb:Select",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIHP6NH2S6GYFCOINC",
+ "PolicyName": "AmazonElasticMapReduceReadOnlyAccess",
+ "UpdateDate": "2020-07-29T23:14:09+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonElasticMapReduceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:41:20+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateFleet",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateTags",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteTags",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeLaunchTemplates",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcs",
+ "ec2:DetachNetworkInterface",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RunInstances",
+ "ec2:TerminateInstances",
+ "ec2:DeleteVolume",
+ "ec2:DescribeVolumeStatus",
+ "ec2:DescribeVolumes",
+ "ec2:DetachVolume",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:ListInstanceProfiles",
+ "iam:ListRolePolicies",
+ "iam:PassRole",
+ "s3:CreateBucket",
+ "s3:Get*",
+ "s3:List*",
+ "sdb:BatchPutAttributes",
+ "sdb:Select",
+ "sqs:CreateQueue",
+ "sqs:Delete*",
+ "sqs:GetQueue*",
+ "sqs:PurgeQueue",
+ "sqs:ReceiveMessage",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DeleteAlarms",
+ "application-autoscaling:RegisterScalableTarget",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "spot.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIDI2BQT2LKXZG36TW",
+ "PolicyName": "AmazonElasticMapReduceRole",
+ "UpdateDate": "2020-06-24T22:24:20+00:00",
+ "VersionId": "v10"
+ },
+ "AmazonElasticMapReduceforAutoScalingRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforAutoScalingRole",
+ "AttachmentCount": 1,
+ "CreateDate": "2016-11-18T01:09:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ModifyInstanceGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJSVXG6QHPE6VHDZ4Q",
+ "PolicyName": "AmazonElasticMapReduceforAutoScalingRole",
+ "UpdateDate": "2016-11-18T01:09:10+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonElasticMapReduceforEC2Role": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforEC2Role",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:41:21+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:*",
+ "dynamodb:*",
+ "ec2:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:ListBootstrapActions",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstanceGroups",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSteps",
+ "kinesis:CreateStream",
+ "kinesis:DeleteStream",
+ "kinesis:DescribeStream",
+ "kinesis:GetRecords",
+ "kinesis:GetShardIterator",
+ "kinesis:MergeShards",
+ "kinesis:PutRecord",
+ "kinesis:SplitShard",
+ "rds:Describe*",
+ "s3:*",
+ "sdb:*",
+ "sns:*",
+ "sqs:*",
+ "glue:CreateDatabase",
+ "glue:UpdateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:CreateTable",
+ "glue:UpdateTable",
+ "glue:DeleteTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetTableVersions",
+ "glue:CreatePartition",
+ "glue:BatchCreatePartition",
+ "glue:UpdatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition",
+ "glue:CreateUserDefinedFunction",
+ "glue:UpdateUserDefinedFunction",
+ "glue:DeleteUserDefinedFunction",
+ "glue:GetUserDefinedFunction",
+ "glue:GetUserDefinedFunctions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIGALS5RCDLZLB3PGS",
+ "PolicyName": "AmazonElasticMapReduceforEC2Role",
+ "UpdateDate": "2017-08-11T23:57:30+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonElasticTranscoderRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonElasticTranscoderRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:26+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:Get*",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:*MultipartUpload*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "1"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "2"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNW3WMKVXFJ2KPIQ2",
+ "PolicyName": "AmazonElasticTranscoderRole",
+ "UpdateDate": "2019-06-13T22:48:22+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElasticTranscoder_FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoder_FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-27T18:59:35+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "iam:ListRoles",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "elastictranscoder.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICFT6XVF3RSR4E7JG",
+ "PolicyName": "AmazonElasticTranscoder_FullAccess",
+ "UpdateDate": "2019-06-10T22:51:51+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElasticTranscoder_JobsSubmitter": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoder_JobsSubmitter",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-07T21:12:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:Read*",
+ "elastictranscoder:List*",
+ "elastictranscoder:*Job",
+ "elastictranscoder:*Preset",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "iam:ListRoles",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7AUMMRQOVZRI734S",
+ "PolicyName": "AmazonElasticTranscoder_JobsSubmitter",
+ "UpdateDate": "2019-06-10T22:49:34+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElasticTranscoder_ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonElasticTranscoder_ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-07T21:09:56+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elastictranscoder:Read*",
+ "elastictranscoder:List*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "iam:ListRoles",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3R3CR6KVEWD4DPFY",
+ "PolicyName": "AmazonElasticTranscoder_ReadOnlyAccess",
+ "UpdateDate": "2019-06-10T22:48:32+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonElasticsearchServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonElasticsearchServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-07T00:15:31+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticloadbalancing:AddListenerCertificates",
+ "elasticloadbalancing:RemoveListenerCertificates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973134"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFEWZPHXKLCVHEUIC",
+ "PolicyName": "AmazonElasticsearchServiceRolePolicy",
+ "UpdateDate": "2020-08-31T10:30:23+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEventBridgeApiDestinationsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEventBridgeApiDestinationsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-11T20:52:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:UpdateSecret",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:PutSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:events!connection/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GHQV22EVJ",
+ "PolicyName": "AmazonEventBridgeApiDestinationsServiceRolePolicy",
+ "UpdateDate": "2021-02-11T20:52:05+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEventBridgeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEventBridgeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-11T14:08:55+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "events:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "apidestinations.events.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/AmazonEventBridgeApiDestinationsServiceRolePolicy"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:UpdateSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:PutSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:events!*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "events.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BUM4GCASI",
+ "PolicyName": "AmazonEventBridgeFullAccess",
+ "UpdateDate": "2021-03-04T18:56:38+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEventBridgeReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEventBridgeReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-11T13:59:07+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:DescribeEventBus",
+ "events:DescribeEventSource",
+ "events:ListEventBuses",
+ "events:ListEventSources",
+ "events:ListRuleNamesByTarget",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "events:TestEventPattern",
+ "events:DescribeArchive",
+ "events:ListArchives",
+ "events:DescribeReplay",
+ "events:ListReplays",
+ "events:DescribeConnection",
+ "events:ListConnections",
+ "events:DescribeApiDestination",
+ "events:ListApiDestinations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BDMP3LZME",
+ "PolicyName": "AmazonEventBridgeReadOnlyAccess",
+ "UpdateDate": "2021-03-04T19:08:31+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonEventBridgeSchemasFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEventBridgeSchemasFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-28T23:12:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "schemas:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonEventBridgeSchemasFullAccess"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:DeleteRule",
+ "events:RemoveTargets",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/*Schemas*",
+ "Sid": "AmazonEventBridgeManageRule"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/schemas.amazonaws.com/AWSServiceRoleForSchemas",
+ "Sid": "IAMCreateServiceLinkedRoleForAmazonEventBridgeSchemas"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JF3KP3V5J",
+ "PolicyName": "AmazonEventBridgeSchemasFullAccess",
+ "UpdateDate": "2019-11-28T23:12:53+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonEventBridgeSchemasReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonEventBridgeSchemasReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-28T23:05:57+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "schemas:ListDiscoverers",
+ "schemas:DescribeDiscoverer",
+ "schemas:ListRegistries",
+ "schemas:DescribeRegistry",
+ "schemas:SearchSchemas",
+ "schemas:ListSchemas",
+ "schemas:ListSchemaVersions",
+ "schemas:DescribeSchema",
+ "schemas:GetDiscoveredSchema",
+ "schemas:DescribeCodeBinding",
+ "schemas:GetCodeBindingSource",
+ "schemas:ListTagsForResource",
+ "schemas:GetResourcePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonEventBridgeSchemasReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JK7CLVFIU",
+ "PolicyName": "AmazonEventBridgeSchemasReadOnlyAccess",
+ "UpdateDate": "2020-05-01T00:50:53+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonEventBridgeSchemasServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonEventBridgeSchemasServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-27T01:10:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:EnableRule",
+ "events:DisableRule",
+ "events:DeleteRule",
+ "events:RemoveTargets",
+ "events:ListTargetsByRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/*Schemas-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GZI6BHNDI",
+ "PolicyName": "AmazonEventBridgeSchemasServiceRolePolicy",
+ "UpdateDate": "2019-11-27T01:10:40+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonFISServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonFISServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-21T21:18:19+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:PutRule",
+ "events:DeleteRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "fis.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EventBridge"
+ },
+ {
+ "Action": [
+ "events:DescribeRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EventBridgeDescribe"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Tagging"
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmHistory"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatch"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "iam:GetUser",
+ "iam:GetRole",
+ "iam:ListUsers",
+ "iam:ListRoles",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBInstances",
+ "ecs:DescribeClusters",
+ "ecs:DescribeTasks",
+ "ecs:ListTasks",
+ "eks:DescribeNodegroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DescribeUserResources"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JLZR2TQJD",
+ "PolicyName": "AmazonFISServiceRolePolicy",
+ "UpdateDate": "2022-02-07T11:13:04+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonFSxConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFSxConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T16:36:05+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "ds:DescribeDirectories",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "firehose:ListDeliveryStreams",
+ "fsx:*",
+ "kms:ListAliases",
+ "logs:DescribeLogGroups",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "fsx.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "s3.data-source.lustre.fsx.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "fsx.amazonaws.com"
+ ]
+ },
+ "StringEquals": {
+ "aws:RequestTag/AmazonFSx": "ManagedByAmazonFSx"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:route-table/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITDDJ23Y5UZ2WCZRQ",
+ "PolicyName": "AmazonFSxConsoleFullAccess",
+ "UpdateDate": "2021-08-26T13:18:46+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonFSxConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFSxConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T16:35:24+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "ds:DescribeDirectories",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "firehose:ListDeliveryStreams",
+ "fsx:Describe*",
+ "fsx:ListTagsForResource",
+ "kms:DescribeKey",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQUISIZNHGLA6YQFM",
+ "PolicyName": "AmazonFSxConsoleReadOnlyAccess",
+ "UpdateDate": "2021-06-08T12:21:09+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonFSxFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFSxFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T16:34:43+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "fsx:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "fsx.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "s3.data-source.lustre.fsx.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/fsx/*:log-group:*"
+ ]
+ },
+ {
+ "Action": [
+ "firehose:PutRecord"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:firehose:*:*:deliverystream/aws-fsx-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "fsx.amazonaws.com"
+ ]
+ },
+ "StringEquals": {
+ "aws:RequestTag/AmazonFSx": "ManagedByAmazonFSx"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:route-table/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIEUV6Z2X4VNZRVB5I",
+ "PolicyName": "AmazonFSxFullAccess",
+ "UpdateDate": "2021-08-26T13:17:29+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonFSxReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFSxReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T16:33:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "fsx:Describe*",
+ "fsx:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4ICPKXR6KK32HT52",
+ "PolicyName": "AmazonFSxReadOnlyAccess",
+ "UpdateDate": "2018-11-28T16:33:32+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonFSxServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonFSxServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T10:38:37+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ds:AuthorizeApplication",
+ "ds:GetAuthorizedApplicationDetails",
+ "ds:UnauthorizeApplication",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "route53:AssociateVPCWithHostedZone"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "AmazonFSx.FileSystemId"
+ },
+ "StringEquals": {
+ "ec2:CreateAction": "CreateNetworkInterface"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AmazonFSx.FileSystemId": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateRoute",
+ "ec2:ReplaceRoute",
+ "ec2:DeleteRoute"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/AmazonFSx": "ManagedByAmazonFSx"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:route-table/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/fsx/*"
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:firehose:*:*:deliverystream/aws-fsx-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIVQ24YKVRBV5IYQ5G",
+ "PolicyName": "AmazonFSxServiceRolePolicy",
+ "UpdateDate": "2021-08-20T12:51:29+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonForecastFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonForecastFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-18T01:52:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "forecast:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "forecast.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAKOTFNTUECQVU7C4",
+ "PolicyName": "AmazonForecastFullAccess",
+ "UpdateDate": "2019-01-18T01:52:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonFraudDetectorFullAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFraudDetectorFullAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T22:46:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "frauddetector:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:ListEndpoints",
+ "sagemaker:DescribeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "frauddetector.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AAPDEABT6",
+ "PolicyName": "AmazonFraudDetectorFullAccessPolicy",
+ "UpdateDate": "2019-12-03T22:46:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonFreeRTOSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonFreeRTOSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T15:32:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "freertos:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJAN6PSDCOH6HXG2SE",
+ "PolicyName": "AmazonFreeRTOSFullAccess",
+ "UpdateDate": "2017-11-29T15:32:51+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonFreeRTOSOTAUpdate": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonFreeRTOSOTAUpdate",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-27T22:43:07+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObjectVersion",
+ "s3:PutObject",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::afr-ota*"
+ },
+ {
+ "Action": [
+ "signer:StartSigningJob",
+ "signer:DescribeSigningJob",
+ "signer:GetSigningProfile",
+ "signer:PutSigningProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListBucketVersions",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iot:DeleteJob",
+ "iot:DescribeJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:job/AFR_OTA*"
+ },
+ {
+ "Action": [
+ "iot:DeleteStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iot:*:*:stream/AFR_OTA*"
+ },
+ {
+ "Action": [
+ "iot:CreateStream",
+ "iot:CreateJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINC2TXHAYDOK3SWMU",
+ "PolicyName": "AmazonFreeRTOSOTAUpdate",
+ "UpdateDate": "2020-12-18T17:47:30+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonGlacierFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGlacierFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "glacier:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQSTZJWB2AXXAKHVQ",
+ "PolicyName": "AmazonGlacierFullAccess",
+ "UpdateDate": "2015-02-06T18:40:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonGlacierReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGlacierReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:27+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glacier:DescribeJob",
+ "glacier:DescribeVault",
+ "glacier:GetDataRetrievalPolicy",
+ "glacier:GetJobOutput",
+ "glacier:GetVaultAccessPolicy",
+ "glacier:GetVaultLock",
+ "glacier:GetVaultNotifications",
+ "glacier:ListJobs",
+ "glacier:ListMultipartUploads",
+ "glacier:ListParts",
+ "glacier:ListTagsForVault",
+ "glacier:ListVaults"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI2D5NJKMU274MET4E",
+ "PolicyName": "AmazonGlacierReadOnlyAccess",
+ "UpdateDate": "2016-05-05T18:46:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonGrafanaAthenaAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonGrafanaAthenaAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-22T17:11:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "athena:GetDatabase",
+ "athena:GetDataCatalog",
+ "athena:GetTableMetadata",
+ "athena:ListDatabases",
+ "athena:ListDataCatalogs",
+ "athena:ListTableMetadata",
+ "athena:ListWorkGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "athena:GetQueryExecution",
+ "athena:GetQueryResults",
+ "athena:GetWorkGroup",
+ "athena:StartQueryExecution",
+ "athena:StopQueryExecution"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/GrafanaDataSource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket",
+ "s3:PutObject",
+ "s3:PutBucketPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::grafana-athena-query-results-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GXSPM7QQ7",
+ "PolicyName": "AmazonGrafanaAthenaAccess",
+ "UpdateDate": "2021-11-22T17:11:11+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonGrafanaRedshiftAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonGrafanaRedshiftAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-26T23:15:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:DescribeClusters",
+ "redshift-data:GetStatementResult",
+ "redshift-data:DescribeStatement",
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift-data:DescribeTable",
+ "redshift-data:ExecuteStatement",
+ "redshift-data:ListTables",
+ "redshift-data:ListSchemas"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/GrafanaDataSource": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "redshift:GetClusterCredentials",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:redshift:*:*:dbname:*/*",
+ "arn:aws:redshift:*:*:dbuser:*/redshift_data_api_user"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Condition": {
+ "Null": {
+ "secretsmanager:ResourceTag/RedshiftQueryOwner": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GQPUO5JGY",
+ "PolicyName": "AmazonGrafanaRedshiftAccess",
+ "UpdateDate": "2021-11-26T23:15:15+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonGuardDutyFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGuardDutyFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-28T22:31:30+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "guardduty:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "guardduty.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:EnableAWSServiceAccess",
+ "organizations:RegisterDelegatedAdministrator",
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIKUTKSN4KC63VDQUM",
+ "PolicyName": "AmazonGuardDutyFullAccess",
+ "UpdateDate": "2021-02-16T23:39:53+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonGuardDutyReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonGuardDutyReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-28T22:29:40+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "guardduty:Describe*",
+ "guardduty:Get*",
+ "guardduty:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIVMCEDV336RWUSNHG",
+ "PolicyName": "AmazonGuardDutyReadOnlyAccess",
+ "UpdateDate": "2021-02-16T23:37:57+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonGuardDutyServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonGuardDutyServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-11-28T20:12:59+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeImages",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeTransitGatewayAttachments",
+ "organizations:ListAccounts",
+ "organizations:DescribeAccount",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetBucketTagging",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPolicyStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIHZREZOWNSSA6FWQO",
+ "PolicyName": "AmazonGuardDutyServiceRolePolicy",
+ "UpdateDate": "2021-08-03T23:14:07+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonHealthLakeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHealthLakeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T01:07:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "healthlake:*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "healthlake.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OMJS7NARX",
+ "PolicyName": "AmazonHealthLakeFullAccess",
+ "UpdateDate": "2021-02-17T01:07:05+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHealthLakeReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHealthLakeReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-17T02:43:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "healthlake:ListFHIRDatastores",
+ "healthlake:DescribeFHIRDatastore",
+ "healthlake:DescribeFHIRImportJob",
+ "healthlake:DescribeFHIRExportJob",
+ "healthlake:GetCapabilities",
+ "healthlake:ReadResource",
+ "healthlake:SearchWithGet",
+ "healthlake:SearchWithPost"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MIFB6JFLV",
+ "PolicyName": "AmazonHealthLakeReadOnlyAccess",
+ "UpdateDate": "2021-02-17T02:43:31+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHoneycodeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:28:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ECUH6WAX6",
+ "PolicyName": "AmazonHoneycodeFullAccess",
+ "UpdateDate": "2020-06-24T20:28:11+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHoneycodeReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:28:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:List*",
+ "honeycode:Get*",
+ "honeycode:Describe*",
+ "honeycode:Query*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CRFGMHZ3B",
+ "PolicyName": "AmazonHoneycodeReadOnlyAccess",
+ "UpdateDate": "2020-12-01T17:27:53+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonHoneycodeServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonHoneycodeServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-18T18:03:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sso:GetManagedApplicationInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4COQCKOKUQ",
+ "PolicyName": "AmazonHoneycodeServiceRolePolicy",
+ "UpdateDate": "2020-11-18T18:03:08+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHoneycodeTeamAssociationFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeTeamAssociationFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:28:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:ListTeamAssociations",
+ "honeycode:ApproveTeamAssociation",
+ "honeycode:RejectTeamAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JH4KLR35J",
+ "PolicyName": "AmazonHoneycodeTeamAssociationFullAccess",
+ "UpdateDate": "2020-06-24T20:28:27+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHoneycodeTeamAssociationReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeTeamAssociationReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:27:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:ListTeamAssociations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KRI4FOLPG",
+ "PolicyName": "AmazonHoneycodeTeamAssociationReadOnlyAccess",
+ "UpdateDate": "2020-06-24T20:27:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonHoneycodeWorkbookFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeWorkbookFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:28:46+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:GetScreenData",
+ "honeycode:InvokeScreenAutomation",
+ "honeycode:BatchCreateTableRows",
+ "honeycode:BatchDeleteTableRows",
+ "honeycode:BatchUpdateTableRows",
+ "honeycode:BatchUpsertTableRows",
+ "honeycode:DescribeTableDataImportJob",
+ "honeycode:ListTableColumns",
+ "honeycode:ListTableRows",
+ "honeycode:ListTables",
+ "honeycode:QueryTableRows",
+ "honeycode:StartTableDataImportJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OQLA2WKSW",
+ "PolicyName": "AmazonHoneycodeWorkbookFullAccess",
+ "UpdateDate": "2020-12-01T17:30:06+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonHoneycodeWorkbookReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonHoneycodeWorkbookReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T20:28:07+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "honeycode:GetScreenData",
+ "honeycode:DescribeTableDataImportJob",
+ "honeycode:ListTableColumns",
+ "honeycode:ListTableRows",
+ "honeycode:ListTables",
+ "honeycode:QueryTableRows"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GUHKYOSNH",
+ "PolicyName": "AmazonHoneycodeWorkbookReadOnlyAccess",
+ "UpdateDate": "2020-12-01T17:32:49+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonInspector2FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspector2FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-29T19:10:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "inspector2:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "inspector2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:EnableAWSServiceAccess",
+ "organizations:RegisterDelegatedAdministrator",
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CK4E7UETF",
+ "PolicyName": "AmazonInspector2FullAccess",
+ "UpdateDate": "2021-11-29T19:10:15+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonInspector2ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspector2ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-01-21T14:45:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "inspector2:ListAccountPermissions",
+ "inspector2:ListMembers",
+ "inspector2:ListFilters",
+ "inspector2:DescribeOrganizationConfiguration",
+ "inspector2:GetMember",
+ "inspector2:BatchGetFreeTrialInfo",
+ "inspector2:ListUsageTotals",
+ "inspector2:ListCoverageStatistics",
+ "inspector2:BatchGetAccountStatus",
+ "inspector2:ListFindings",
+ "inspector2:ListFindingAggregations",
+ "inspector2:ListCoverage",
+ "inspector2:GetDelegatedAdminAccount",
+ "inspector2:GetFindingsReportStatus",
+ "inspector2:ListDelegatedAdminAccounts",
+ "inspector2:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IASIMCEPM",
+ "PolicyName": "AmazonInspector2ReadOnlyAccess",
+ "UpdateDate": "2022-01-21T14:45:14+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonInspector2ServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonInspector2ServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-16T20:27:48+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:DescribeConnections",
+ "directconnect:DescribeDirectConnectGatewayAssociations",
+ "directconnect:DescribeDirectConnectGatewayAttachments",
+ "directconnect:DescribeDirectConnectGateways",
+ "directconnect:DescribeVirtualGateways",
+ "directconnect:DescribeVirtualInterfaces",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeManagedPrefixLists",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRegions",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTransitGatewayAttachments",
+ "ec2:DescribeTransitGatewayConnects",
+ "ec2:DescribeTransitGatewayPeeringAttachments",
+ "ec2:DescribeTransitGatewayRouteTables",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "ec2:DescribeTransitGateways",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:GetManagedPrefixListEntries",
+ "ec2:GetTransitGatewayRouteTablePropagations",
+ "ec2:SearchTransitGatewayRoutes",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTags",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "network-firewall:DescribeFirewall",
+ "network-firewall:DescribeFirewallPolicy",
+ "network-firewall:DescribeResourcePolicy",
+ "network-firewall:DescribeRuleGroup",
+ "network-firewall:ListFirewallPolicies",
+ "network-firewall:ListFirewalls",
+ "network-firewall:ListRuleGroups",
+ "tiros:CreateQuery",
+ "tiros:GetQueryAnswer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "TirosPolicy"
+ },
+ {
+ "Action": [
+ "ecr:BatchGetImage",
+ "ecr:BatchGetRepositoryScanningConfiguration",
+ "ecr:DescribeImages",
+ "ecr:DescribeRegistry",
+ "ecr:DescribeRepositories",
+ "ecr:GetAuthorizationToken",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:GetRegistryScanningConfiguration",
+ "ecr:ListImages",
+ "ecr:PutRegistryScanningConfiguration",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "ssm:DescribeAssociation",
+ "ssm:DescribeInstanceInformation",
+ "ssm:ListAssociations",
+ "ssm:ListResourceDataSync",
+ "ssm:StartAssociationsOnce",
+ "ssm:DeleteAssociation",
+ "ssm:UpdateAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "PackageVulnerabilityScanning"
+ },
+ {
+ "Action": [
+ "ssm:CreateAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:ec2:*:*:instance/*",
+ "arn:aws:ssm:*:*:document/AWS-GatherSoftwareInventory",
+ "arn:*:ssm:*:*:managed-instance/*"
+ ],
+ "Sid": "GatherInventory"
+ },
+ {
+ "Action": [
+ "ssm:CreateResourceDataSync",
+ "ssm:DeleteResourceDataSync"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:ssm:*:*:resource-data-sync/InspectorResourceDataSync-do-not-delete"
+ ],
+ "Sid": "DataSyncCleanup"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:DeleteRule",
+ "events:DescribeRule",
+ "events:ListTargetsByRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:events:*:*:rule/DO-NOT-DELETE-AmazonInspector*ManagedRule"
+ ],
+ "Sid": "ManagedRules"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BINOILVQW",
+ "PolicyName": "AmazonInspector2ServiceRolePolicy",
+ "UpdateDate": "2021-11-16T20:27:48+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonInspectorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspectorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T17:08:04+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "inspector:*",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "sns:ListTopics",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "inspector.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "inspector.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/inspector.amazonaws.com/AWSServiceRoleForAmazonInspector"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI7Y6NTA27NWNA5U5E",
+ "PolicyName": "AmazonInspectorFullAccess",
+ "UpdateDate": "2017-12-21T14:53:31+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonInspectorReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonInspectorReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T17:08:01+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "inspector:Describe*",
+ "inspector:Get*",
+ "inspector:List*",
+ "inspector:Preview*",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "sns:ListTopics",
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXQNTHTEJ2JFRN2SE",
+ "PolicyName": "AmazonInspectorReadOnlyAccess",
+ "UpdateDate": "2019-10-01T15:17:54+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonInspectorServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonInspectorServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-21T15:48:27+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "directconnect:DescribeConnections",
+ "directconnect:DescribeDirectConnectGateways",
+ "directconnect:DescribeDirectConnectGatewayAssociations",
+ "directconnect:DescribeDirectConnectGatewayAttachments",
+ "directconnect:DescribeVirtualGateways",
+ "directconnect:DescribeVirtualInterfaces",
+ "directconnect:DescribeTags",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeInstances",
+ "ec2:DescribeTags",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRegions",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribeManagedPrefixLists",
+ "ec2:GetManagedPrefixListEntries",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeTransitGateways",
+ "ec2:DescribeTransitGatewayAttachments",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "ec2:DescribeTransitGatewayRouteTables",
+ "ec2:SearchTransitGatewayRoutes",
+ "ec2:DescribeTransitGatewayPeeringAttachments",
+ "ec2:GetTransitGatewayRouteTablePropagations",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeRules",
+ "elasticloadbalancing:DescribeTags",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKBMSBWLU2TGXHHUQ",
+ "PolicyName": "AmazonInspectorServiceRolePolicy",
+ "UpdateDate": "2020-09-11T17:12:02+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonKendraFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKendraFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T16:15:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "kendra.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:DescribeSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:AmazonKendra-*"
+ },
+ {
+ "Action": "kendra:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BK2ALV3AM",
+ "PolicyName": "AmazonKendraFullAccess",
+ "UpdateDate": "2019-12-03T16:15:37+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKendraReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKendraReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T16:13:45+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kendra:Describe*",
+ "kendra:List*",
+ "kendra:Query",
+ "kendra:GetQuerySuggestions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4POKTT2LDN",
+ "PolicyName": "AmazonKendraReadOnlyAccess",
+ "UpdateDate": "2021-05-27T17:01:20+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonKeyspacesFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-23T17:06:37+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cassandra:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeleteScheduledAction",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:DescribeScheduledActions",
+ "application-autoscaling:PutScheduledAction",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "cassandra.application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/cassandra.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_CassandraTable"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HMS72N6JG",
+ "PolicyName": "AmazonKeyspacesFullAccess",
+ "UpdateDate": "2021-06-01T19:31:39+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonKeyspacesReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKeyspacesReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-23T17:07:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cassandra:Select"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:DescribeScheduledActions",
+ "cloudwatch:DescribeAlarms",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LHLFMFIPN",
+ "PolicyName": "AmazonKeyspacesReadOnlyAccess",
+ "UpdateDate": "2021-06-01T19:32:47+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonKinesisAnalyticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisAnalyticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-09-21T19:01:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kinesisanalytics:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:CreateStream",
+ "kinesis:DeleteStream",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "kinesis:PutRecord",
+ "kinesis:PutRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:GetLogEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListPolicyVersions",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/kinesis-analytics*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQOSKHTXP43R7P5AC",
+ "PolicyName": "AmazonKinesisAnalyticsFullAccess",
+ "UpdateDate": "2016-09-21T19:01:14+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisAnalyticsReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisAnalyticsReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-09-21T18:16:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesisanalytics:Describe*",
+ "kinesisanalytics:Get*",
+ "kinesisanalytics:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "firehose:DescribeDeliveryStream",
+ "firehose:ListDeliveryStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:GetLogEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListPolicyVersions",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIJIEXZAFUK43U7ARK",
+ "PolicyName": "AmazonKinesisAnalyticsReadOnly",
+ "UpdateDate": "2016-09-21T18:16:43+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFirehoseFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T18:45:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMZQMTZ7FRBFHHAHI",
+ "PolicyName": "AmazonKinesisFirehoseFullAccess",
+ "UpdateDate": "2015-10-07T18:45:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFirehoseReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFirehoseReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-10-07T18:43:39+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:Describe*",
+ "firehose:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ36NT645INW4K24W6",
+ "PolicyName": "AmazonKinesisFirehoseReadOnlyAccess",
+ "UpdateDate": "2015-10-07T18:43:39+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kinesis:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIVF32HAMOXCUYRAYE",
+ "PolicyName": "AmazonKinesisFullAccess",
+ "UpdateDate": "2015-02-06T18:40:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kinesis:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOCMTDT5RLKZ2CAJO",
+ "PolicyName": "AmazonKinesisReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisVideoStreamsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisVideoStreamsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-01T23:27:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kinesisvideo:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZAN5AK7E7UVYIAZY",
+ "PolicyName": "AmazonKinesisVideoStreamsFullAccess",
+ "UpdateDate": "2017-12-01T23:27:18+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonKinesisVideoStreamsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonKinesisVideoStreamsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-12-01T23:14:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesisvideo:Describe*",
+ "kinesisvideo:Get*",
+ "kinesisvideo:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDS2DKUCYTEA7M6UA",
+ "PolicyName": "AmazonKinesisVideoStreamsReadOnlyAccess",
+ "UpdateDate": "2017-12-01T23:14:32+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLaunchWizard_Fullaccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLaunchWizard_Fullaccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-06T17:47:30+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "applicationinsights:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "resource-groups:List*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "route53:ChangeResourceRecordSets",
+ "route53:GetChange",
+ "route53:ListResourceRecordSets",
+ "route53:ListHostedZones",
+ "route53:ListHostedZonesByName"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:List*",
+ "cloudwatch:Get*",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateVpc",
+ "ec2:CreateKeyPair",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSubnet"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AllocateHosts",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateEgressOnlyInternetGateway",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateVolume",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVolumeAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:AssociateDhcpOptions",
+ "ec2:AssociateSubnetCidrBlock",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVolume",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteKeyPair",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DeleteVpc",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachVolume",
+ "ec2:DeleteSnapshot",
+ "ec2:AssociateRouteTable",
+ "ec2:AssociateVpcCidrBlock",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSubnet",
+ "ec2:DetachNetworkInterface",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateVpcCidrBlock",
+ "ec2:GetLaunchTemplateData",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifyVolume",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:GetConsoleOutput",
+ "ec2:GetPasswordData",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceRoute",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:DisassociateRouteTable",
+ "ec2:DisassociateSubnetCidrBlock",
+ "ec2:ModifyInstancePlacement",
+ "ec2:DeletePlacementGroup",
+ "ec2:CreatePlacementGroup",
+ "elasticfilesystem:DeleteFileSystem",
+ "elasticfilesystem:DeleteMountTarget",
+ "ds:AddIpRoutes",
+ "ds:CreateComputer",
+ "ds:CreateMicrosoftAD",
+ "ds:DeleteDirectory",
+ "servicecatalog:AssociateProductWithPortfolio",
+ "cloudformation:GetTemplateSummary",
+ "sts:GetCallerIdentity"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": "launchwizard.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStack*",
+ "cloudformation:Get*",
+ "cloudformation:ListStacks",
+ "cloudformation:SignalResource",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/LaunchWizard*/*",
+ "arn:aws:cloudformation:*:*:stack/ApplicationInsights*/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/LaunchWizard-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateInstanceProfile",
+ "iam:DeleteInstanceProfile",
+ "iam:RemoveRoleFromInstanceProfile",
+ "iam:AddRoleToInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AmazonEC2RoleForLaunchWizard*",
+ "arn:aws:iam::*:instance-profile/LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": [
+ "lambda.amazonaws.com",
+ "ec2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AmazonEC2RoleForLaunchWizard*",
+ "arn:aws:iam::*:role/service-role/AmazonLambdaRoleForLaunchWizard*",
+ "arn:aws:iam::*:instance-profile/LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "autoscaling:AttachInstances",
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:DeleteLaunchConfiguration",
+ "autoscaling:UpdateAutoScalingGroup",
+ "logs:CreateLogStream",
+ "logs:DeleteLogGroup",
+ "logs:DeleteLogStream",
+ "logs:DescribeLog*",
+ "logs:PutLogEvents",
+ "resource-groups:CreateGroup",
+ "resource-groups:DeleteGroup",
+ "sns:ListSubscriptionsByTopic",
+ "sns:Publish",
+ "ssm:DeleteDocument",
+ "ssm:DeleteParameter*",
+ "ssm:DescribeDocument*",
+ "ssm:GetDocument",
+ "ssm:PutParameter"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:resource-groups:*:*:group/LaunchWizard*",
+ "arn:aws:sns:*:*:*",
+ "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/LaunchWizard*",
+ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/LaunchWizard*",
+ "arn:aws:ssm:*:*:parameter/LaunchWizard*",
+ "arn:aws:ssm:*:*:document/LaunchWizard*",
+ "arn:aws:logs:*:*:log-group:*:*:*",
+ "arn:aws:logs:*:*:log-group:LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:GetDocument",
+ "ssm:SendCommand"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*::document/AWS-RunShellScript"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:SendCommand"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/LaunchWizard-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:DeleteLogStream",
+ "logs:GetLogEvents",
+ "logs:PutLogEvents",
+ "ssm:AddTagsToResource",
+ "ssm:DescribeDocument",
+ "ssm:GetDocument",
+ "ssm:ListTagsForResource",
+ "ssm:RemoveTagsFromResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*:*:*",
+ "arn:aws:logs:*:*:log-group:LaunchWizard*",
+ "arn:aws:ssm:*:*:parameter/LaunchWizard*",
+ "arn:aws:ssm:*:*:document/LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudformation:DescribeAccountLimits",
+ "cloudformation:DescribeStackDriftDetectionStatus",
+ "cloudformation:List*",
+ "cloudformation:ValidateTemplate",
+ "ds:Describe*",
+ "ds:ListAuthorizedApplications",
+ "ec2:Describe*",
+ "ec2:Get*",
+ "iam:GetRole",
+ "iam:GetRolePolicy",
+ "iam:GetUser",
+ "iam:GetPolicyVersion",
+ "iam:GetPolicy",
+ "iam:List*",
+ "logs:CreateLogGroup",
+ "logs:GetLogDelivery",
+ "logs:GetLogRecord",
+ "logs:ListLogDeliveries",
+ "resource-groups:Get*",
+ "resource-groups:List*",
+ "servicequotas:GetServiceQuota",
+ "servicequotas:ListServiceQuotas",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "ssm:CreateDocument",
+ "ssm:DescribeAutomation*",
+ "ssm:DescribeInstanceInformation",
+ "ssm:DescribeParameters",
+ "ssm:GetAutomationExecution",
+ "ssm:GetCommandInvocation",
+ "ssm:GetParameter*",
+ "ssm:GetConnectionStatus",
+ "ssm:ListCommand*",
+ "ssm:ListDocument*",
+ "ssm:ListInstanceAssociations",
+ "ssm:SendAutomationSignal",
+ "ssm:StartAutomationExecution",
+ "ssm:StopAutomationExecution",
+ "tag:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "logs:GetLog*",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*:*:*",
+ "arn:aws:logs:*:*:log-group:LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:List*",
+ "cloudformation:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/LaunchWizard*/"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "autoscaling.amazonaws.com",
+ "application-insights.amazonaws.com",
+ "events.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "launchwizard:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sqs:TagQueue",
+ "sqs:GetQueueUrl",
+ "sqs:AddPermission",
+ "sqs:ListQueues",
+ "sqs:DeleteQueue",
+ "sqs:GetQueueAttributes",
+ "sqs:ListQueueTags",
+ "sqs:CreateQueue",
+ "sqs:SetQueueAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sqs:*:*:LaunchWizard*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "iam:GetInstanceProfile",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:LaunchWizard*",
+ "arn:aws:iam::*:instance-profile/LaunchWizard*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "route53:ListHostedZones",
+ "ec2:CreateSecurityGroup",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:CreateFileSystem",
+ "elasticfilesystem:CreateMountTarget",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::launchwizard*",
+ "arn:aws:s3:::launchwizard*/*",
+ "arn:aws:s3:::aws-sap-data-provider/config.properties"
+ ]
+ },
+ {
+ "Action": "cloudformation:TagResource",
+ "Condition": {
+ "ForAllValues:StringLike": {
+ "aws:TagKeys": "LaunchWizard*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:PutBucketVersioning",
+ "s3:DeleteBucket",
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:LaunchWizard*",
+ "arn:aws:s3:::launchwizard*"
+ ]
+ },
+ {
+ "Action": [
+ "dynamodb:CreateTable",
+ "dynamodb:DescribeTable",
+ "dynamodb:DeleteTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/LaunchWizard*"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource",
+ "secretsmanager:UntagResource",
+ "secretsmanager:PutResourcePolicy",
+ "secretsmanager:DeleteResourcePolicy",
+ "secretsmanager:ListSecretVersionIds",
+ "secretsmanager:GetSecretValue"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:LaunchWizard*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetRandomPassword",
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:CreateOpsMetadata"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:DeleteOpsMetadata",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:opsmetadata/aws/ssm/LaunchWizard*"
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:LaunchWizard*"
+ },
+ {
+ "Action": [
+ "fsx:UntagResource",
+ "fsx:TagResource",
+ "fsx:DeleteFileSystem",
+ "fsx:ListTagsForResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/Name": "LaunchWizard*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "fsx:CreateFileSystem"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/Name": [
+ "LaunchWizard*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "fsx:DescribeFileSystems"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:CreatePortfolio",
+ "servicecatalog:DescribePortfolio",
+ "servicecatalog:CreateConstraint",
+ "servicecatalog:CreateProduct",
+ "servicecatalog:AssociatePrincipalWithPortfolio",
+ "servicecatalog:CreateProvisioningArtifact"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": "launchwizard.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:servicecatalog:*:*:*/*",
+ "arn:aws:catalog:*:*:*/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ABPQ7BLC2",
+ "PolicyName": "AmazonLaunchWizard_Fullaccess",
+ "UpdateDate": "2022-02-10T00:28:41+00:00",
+ "VersionId": "v12"
+ },
+ "AmazonLexChannelsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonLexChannelsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-13T20:12:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:ListBots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HVR6S6UVL",
+ "PolicyName": "AmazonLexChannelsAccess",
+ "UpdateDate": "2021-01-13T20:12:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLexFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-11T23:20:36+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "lambda:GetPolicy",
+ "lambda:ListFunctions",
+ "lex:*",
+ "polly:DescribeVoices",
+ "polly:SynthesizeSpeech",
+ "kendra:ListIndices",
+ "iam:ListRoles",
+ "s3:ListAllMyBuckets",
+ "logs:DescribeLogGroups",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:RemovePermission"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "lambda:Principal": "lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:AmazonLex*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots",
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels",
+ "arn:aws:iam::*:role/aws-service-role/lexv2.amazonaws.com/AWSServiceRoleForLexV2Bots*",
+ "arn:aws:iam::*:role/aws-service-role/channels.lexv2.amazonaws.com/AWSServiceRoleForLexV2Channels*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "channels.lex.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "lexv2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lexv2.amazonaws.com/AWSServiceRoleForLexV2Bots*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "channels.lexv2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/channels.lexv2.amazonaws.com/AWSServiceRoleForLexV2Channels*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots",
+ "arn:aws:iam::*:role/aws-service-role/channels.lex.amazonaws.com/AWSServiceRoleForLexChannels",
+ "arn:aws:iam::*:role/aws-service-role/lexv2.amazonaws.com/AWSServiceRoleForLexV2Bots*",
+ "arn:aws:iam::*:role/aws-service-role/channels.lexv2.amazonaws.com/AWSServiceRoleForLexV2Channels*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lex.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lexv2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/lexv2.amazonaws.com/AWSServiceRoleForLexV2Bots*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "channels.lexv2.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/channels.lexv2.amazonaws.com/AWSServiceRoleForLexV2Channels*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJVLXDHKVC23HRTKSI",
+ "PolicyName": "AmazonLexFullAccess",
+ "UpdateDate": "2021-07-26T21:48:05+00:00",
+ "VersionId": "v7"
+ },
+ "AmazonLexReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-11T23:13:33+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:GetBot",
+ "lex:GetBotAlias",
+ "lex:GetBotAliases",
+ "lex:GetBots",
+ "lex:GetBotChannelAssociation",
+ "lex:GetBotChannelAssociations",
+ "lex:GetBotVersions",
+ "lex:GetBuiltinIntent",
+ "lex:GetBuiltinIntents",
+ "lex:GetBuiltinSlotTypes",
+ "lex:GetIntent",
+ "lex:GetIntents",
+ "lex:GetIntentVersions",
+ "lex:GetSlotType",
+ "lex:GetSlotTypes",
+ "lex:GetSlotTypeVersions",
+ "lex:GetUtterancesView",
+ "lex:DescribeBot",
+ "lex:DescribeBotAlias",
+ "lex:DescribeBotChannel",
+ "lex:DescribeBotLocale",
+ "lex:DescribeBotVersion",
+ "lex:DescribeExport",
+ "lex:DescribeImport",
+ "lex:DescribeIntent",
+ "lex:DescribeResourcePolicy",
+ "lex:DescribeSlot",
+ "lex:DescribeSlotType",
+ "lex:ListBots",
+ "lex:ListBotLocales",
+ "lex:ListBotAliases",
+ "lex:ListBotChannels",
+ "lex:ListBotVersions",
+ "lex:ListBuiltInIntents",
+ "lex:ListBuiltInSlotTypes",
+ "lex:ListExports",
+ "lex:ListImports",
+ "lex:ListIntents",
+ "lex:ListSlots",
+ "lex:ListSlotTypes",
+ "lex:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGBI5LSMAJNDGBNAM",
+ "PolicyName": "AmazonLexReadOnly",
+ "UpdateDate": "2021-07-26T22:04:56+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonLexRunBotsOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLexRunBotsOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-04-11T23:06:24+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:PostContent",
+ "lex:PostText",
+ "lex:PutSession",
+ "lex:GetSession",
+ "lex:DeleteSession",
+ "lex:RecognizeText",
+ "lex:RecognizeUtterance",
+ "lex:StartConversation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJVZGB5CM3N6YWJHBE",
+ "PolicyName": "AmazonLexRunBotsOnly",
+ "UpdateDate": "2021-08-18T00:15:48+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonLexV2BotPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonLexV2BotPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-13T20:10:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:SynthesizeSpeech"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DXFCYFGBA",
+ "PolicyName": "AmazonLexV2BotPolicy",
+ "UpdateDate": "2021-01-13T20:10:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLookoutEquipmentFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutEquipmentFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-08T15:52:08+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutequipment:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lookoutequipment.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "lookoutequipment.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KPPCPGNJA",
+ "PolicyName": "AmazonLookoutEquipmentFullAccess",
+ "UpdateDate": "2021-11-24T21:00:13+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonLookoutEquipmentReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutEquipmentReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-05T16:47:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutequipment:DescribeDataset",
+ "lookoutequipment:DescribeDataIngestionJob",
+ "lookoutequipment:DescribeModel",
+ "lookoutequipment:DescribeInferenceScheduler",
+ "lookoutequipment:ListDatasets",
+ "lookoutequipment:ListDataIngestionJobs",
+ "lookoutequipment:ListModels",
+ "lookoutequipment:ListInferenceSchedulers",
+ "lookoutequipment:ListInferenceExecutions",
+ "lookoutequipment:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DNIMPJYBT",
+ "PolicyName": "AmazonLookoutEquipmentReadOnlyAccess",
+ "UpdateDate": "2021-05-05T16:47:55+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLookoutMetricsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutMetricsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-07T00:43:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutmetrics:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "lookoutmetrics.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*LookoutMetrics*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CYQN5ZMMA",
+ "PolicyName": "AmazonLookoutMetricsFullAccess",
+ "UpdateDate": "2021-05-07T00:43:38+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLookoutMetricsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutMetricsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-07T00:43:34+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutmetrics:DescribeMetricSet",
+ "lookoutmetrics:ListMetricSets",
+ "lookoutmetrics:DescribeAnomalyDetector",
+ "lookoutmetrics:ListAnomalyDetectors",
+ "lookoutmetrics:DescribeAnomalyDetectionExecutions",
+ "lookoutmetrics:DescribeAlert",
+ "lookoutmetrics:ListAlerts",
+ "lookoutmetrics:ListTagsForResource",
+ "lookoutmetrics:ListAnomalyGroupSummaries",
+ "lookoutmetrics:ListAnomalyGroupTimeSeries",
+ "lookoutmetrics:ListAnomalyGroupRelatedMetrics",
+ "lookoutmetrics:GetAnomalyGroup",
+ "lookoutmetrics:GetDataQualityMetrics",
+ "lookoutmetrics:GetSampleData",
+ "lookoutmetrics:GetFeedback"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MP33SLV3F",
+ "PolicyName": "AmazonLookoutMetricsReadOnlyAccess",
+ "UpdateDate": "2022-01-04T18:19:27+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonLookoutVisionConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutVisionConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-11T19:37:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutvision:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionFullAccess"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleS3BucketSearchAccess"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:PutBucketVersioning",
+ "s3:PutLifecycleConfiguration",
+ "s3:PutEncryptionConfiguration",
+ "s3:PutBucketPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::lookoutvision-*",
+ "Sid": "LookoutVisionConsoleS3BucketFirstUseSetupAccess"
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketVersioning"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::lookoutvision-*",
+ "Sid": "LookoutVisionConsoleS3BucketAccess"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:PutObject",
+ "s3:AbortMultipartUpload",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::lookoutvision-*/*",
+ "Sid": "LookoutVisionConsoleS3ObjectAccess"
+ },
+ {
+ "Action": [
+ "groundtruthlabeling:RunGenerateManifestByCrawlingJob",
+ "groundtruthlabeling:AssociatePatchToManifestJob",
+ "groundtruthlabeling:DescribeConsoleJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleDatasetLabelingToolsAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleDashboardAccess"
+ },
+ {
+ "Action": [
+ "tag:GetTagKeys",
+ "tag:GetTagValues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleTagSelectorAccess"
+ },
+ {
+ "Action": [
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleKmsKeySelectorAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NJJ7RFZ5A",
+ "PolicyName": "AmazonLookoutVisionConsoleFullAccess",
+ "UpdateDate": "2021-05-11T19:37:17+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLookoutVisionConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutVisionConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-11T19:32:02+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutvision:DescribeDataset",
+ "lookoutvision:DescribeModel",
+ "lookoutvision:DescribeProject",
+ "lookoutvision:DescribeTrialDetection",
+ "lookoutvision:DescribeModelPackagingJob",
+ "lookoutvision:ListDatasetEntries",
+ "lookoutvision:ListModels",
+ "lookoutvision:ListProjects",
+ "lookoutvision:ListTagsForResource",
+ "lookoutvision:ListTrialDetections",
+ "lookoutvision:ListModelPackagingJobs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionReadOnlyAccess"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleS3BucketSearchAccess"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::lookoutvision-*/*",
+ "Sid": "LookoutVisionConsoleS3ObjectReadAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionConsoleDashboardAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CE2DP5IDX",
+ "PolicyName": "AmazonLookoutVisionConsoleReadOnlyAccess",
+ "UpdateDate": "2021-12-09T02:46:29+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonLookoutVisionFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutVisionFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-11T19:24:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutvision:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionFullAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CMORWIX77",
+ "PolicyName": "AmazonLookoutVisionFullAccess",
+ "UpdateDate": "2021-05-11T19:24:54+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonLookoutVisionReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonLookoutVisionReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-11T19:11:07+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lookoutvision:DescribeDataset",
+ "lookoutvision:DescribeModel",
+ "lookoutvision:DescribeProject",
+ "lookoutvision:DescribeModelPackagingJob",
+ "lookoutvision:ListDatasetEntries",
+ "lookoutvision:ListModels",
+ "lookoutvision:ListProjects",
+ "lookoutvision:ListTagsForResource",
+ "lookoutvision:ListModelPackagingJobs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "LookoutVisionReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OJEEMR6Q3",
+ "PolicyName": "AmazonLookoutVisionReadOnlyAccess",
+ "UpdateDate": "2021-12-09T03:01:51+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMCSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMCSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T13:45:25+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "application-autoscaling:PutScheduledAction",
+ "application-autoscaling:DeleteScheduledAction",
+ "application-autoscaling:DescribeScheduledActions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cassandra:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "cassandra.application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/cassandra.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_CassandraTable"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4K6JRQY7NV",
+ "PolicyName": "AmazonMCSFullAccess",
+ "UpdateDate": "2020-04-17T19:19:29+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMCSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMCSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T13:46:21+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cassandra:Select"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:DescribeScheduledActions",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4F6NKMXCNS",
+ "PolicyName": "AmazonMCSReadOnlyAccess",
+ "UpdateDate": "2020-04-17T19:21:34+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMQApiFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMQApiFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-18T20:31:31+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mq:*",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DetachNetworkInterface",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/amazonmq/*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "mq.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4CMO533EBV3L2GW4",
+ "PolicyName": "AmazonMQApiFullAccess",
+ "UpdateDate": "2020-11-04T16:45:35+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMQApiReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMQApiReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-18T20:31:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mq:Describe*",
+ "mq:List*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIKI5JRHKAFHXQJKMO",
+ "PolicyName": "AmazonMQApiReadOnlyAccess",
+ "UpdateDate": "2018-12-18T20:31:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMQFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMQFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-28T15:28:29+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mq:*",
+ "cloudformation:CreateStack",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DetachNetworkInterface",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:CreateSecurityGroup",
+ "ec2:AuthorizeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/amazonmq/*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "mq.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLKBROJNQYDDXOOGG",
+ "PolicyName": "AmazonMQFullAccess",
+ "UpdateDate": "2020-11-04T16:34:09+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonMQReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMQReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-28T15:30:32+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mq:Describe*",
+ "mq:List*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFH3NKGULDUU66D5C",
+ "PolicyName": "AmazonMQReadOnlyAccess",
+ "UpdateDate": "2017-11-28T19:02:03+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMQServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonMQServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-04T16:07:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpoint"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/AMQManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc-endpoint/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateVpcEndpoint"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVpcEndpoints"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/AMQManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/amazonmq/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LFY3JJDI6",
+ "PolicyName": "AmazonMQServiceRolePolicy",
+ "UpdateDate": "2020-11-04T16:07:17+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMSKConnectReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMSKConnectReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-20T10:18:43+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kafkaconnect:ListConnectors",
+ "kafkaconnect:ListCustomPlugins",
+ "kafkaconnect:ListWorkerConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kafkaconnect:DescribeConnector"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kafkaconnect:*:*:connector/*"
+ ]
+ },
+ {
+ "Action": [
+ "kafkaconnect:DescribeCustomPlugin"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kafkaconnect:*:*:custom-plugin/*"
+ ]
+ },
+ {
+ "Action": [
+ "kafkaconnect:DescribeWorkerConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kafkaconnect:*:*:worker-configuration/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NBJ5F5NIS",
+ "PolicyName": "AmazonMSKConnectReadOnlyAccess",
+ "UpdateDate": "2021-10-18T09:16:26+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMSKFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMSKFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-14T22:07:52+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kafka:*",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcAttribute",
+ "kms:DescribeKey",
+ "kms:CreateGrant",
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:ListLogDeliveries",
+ "logs:PutResourcePolicy",
+ "logs:DescribeResourcePolicies",
+ "logs:DescribeLogGroups",
+ "S3:GetBucketPolicy",
+ "firehose:TagDeliveryStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:ec2:*:*:vpc/*",
+ "arn:*:ec2:*:*:subnet/*",
+ "arn:*:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpoint"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/AWSMSKManaged": "true"
+ },
+ "StringLike": {
+ "aws:RequestTag/ClusterArn": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:ec2:*:*:vpc-endpoint/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateVpcEndpoint"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteVpcEndpoints"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/AWSMSKManaged": "true"
+ },
+ "StringLike": {
+ "ec2:ResourceTag/ClusterArn": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:*:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "kafka.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/kafka.amazonaws.com/AWSServiceRoleForKafka*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "delivery.logs.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/delivery.logs.amazonaws.com/AWSServiceRoleForLogDelivery*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJERQQQTWI5OMENTQE",
+ "PolicyName": "AmazonMSKFullAccess",
+ "UpdateDate": "2022-01-06T21:18:01+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonMSKReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMSKReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-14T22:28:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kafka:Describe*",
+ "kafka:List*",
+ "kafka:Get*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJGMUI3DP2EVP3VGYO",
+ "PolicyName": "AmazonMSKReadOnlyAccess",
+ "UpdateDate": "2019-01-14T22:28:45+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMWAAServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonMWAAServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-24T14:13:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:airflow-*:*"
+ },
+ {
+ "Action": [
+ "ec2:AttachNetworkInterface",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "ec2:DetachNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateVpcEndpoint",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:TagKeys": "AmazonMWAAManaged"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifyVpcEndpoint",
+ "ec2:DeleteVpcEndpoints"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AmazonMWAAManaged": false
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateVpcEndpoint",
+ "ec2:ModifyVpcEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:subnet/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:TagKeys": "AmazonMWAAManaged"
+ },
+ "StringEquals": {
+ "ec2:CreateAction": "CreateVpcEndpoint"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JU5RBMG7W",
+ "PolicyName": "AmazonMWAAServiceRolePolicy",
+ "UpdateDate": "2020-11-24T14:13:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningBatchPredictionsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningBatchPredictionsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:12:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:CreateBatchPrediction",
+ "machinelearning:DeleteBatchPrediction",
+ "machinelearning:DescribeBatchPredictions",
+ "machinelearning:GetBatchPrediction",
+ "machinelearning:UpdateBatchPrediction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILOI4HTQSFTF3GQSC",
+ "PolicyName": "AmazonMachineLearningBatchPredictionsAccess",
+ "UpdateDate": "2015-04-09T17:12:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningCreateOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningCreateOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:18:09+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Add*",
+ "machinelearning:Create*",
+ "machinelearning:Delete*",
+ "machinelearning:Describe*",
+ "machinelearning:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDRUNIC2RYAMAT3CK",
+ "PolicyName": "AmazonMachineLearningCreateOnlyAccess",
+ "UpdateDate": "2016-06-29T20:55:03+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonMachineLearningFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:25:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWKW6AGSGYOQ5ERHC",
+ "PolicyName": "AmazonMachineLearningFullAccess",
+ "UpdateDate": "2015-04-09T17:25:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningManageRealTimeEndpointOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningManageRealTimeEndpointOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:32:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:CreateRealtimeEndpoint",
+ "machinelearning:DeleteRealtimeEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJJL3PC3VCSVZP6OCI",
+ "PolicyName": "AmazonMachineLearningManageRealTimeEndpointOnlyAccess",
+ "UpdateDate": "2015-04-09T17:32:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:40:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Describe*",
+ "machinelearning:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIW5VYBCGEX56JCINC",
+ "PolicyName": "AmazonMachineLearningReadOnlyAccess",
+ "UpdateDate": "2015-04-09T17:40:02+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningRealTimePredictionOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMachineLearningRealTimePredictionOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T17:44:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "machinelearning:Predict"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWMCNQPRWMWT36GVQ",
+ "PolicyName": "AmazonMachineLearningRealTimePredictionOnlyAccess",
+ "UpdateDate": "2015-04-09T17:44:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMachineLearningRoleforRedshiftDataSourceV3": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMachineLearningRoleforRedshiftDataSourceV3",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-24T18:00:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:RevokeSecurityGroupIngress",
+ "redshift:AuthorizeClusterSecurityGroupIngress",
+ "redshift:CreateClusterSecurityGroup",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSecurityGroups",
+ "redshift:ModifyCluster",
+ "redshift:RevokeClusterSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutBucketPolicy",
+ "s3:GetBucketLocation",
+ "s3:GetBucketPolicy",
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::amazon-machine-learning*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DIXIZO4E2",
+ "PolicyName": "AmazonMachineLearningRoleforRedshiftDataSourceV3",
+ "UpdateDate": "2020-06-24T18:00:09+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMacieFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:54:30+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "macie2:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "macie.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSServiceRoleForAmazonMacie"
+ },
+ {
+ "Action": "pricing:GetProducts",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJJF2N5FR6S5TZN5OA",
+ "PolicyName": "AmazonMacieFullAccess",
+ "UpdateDate": "2022-03-07T18:08:14+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonMacieHandshakeRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMacieHandshakeRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-28T15:46:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "iam:AWSServiceName": "macie.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7CVEIVL347MLOVKI",
+ "PolicyName": "AmazonMacieHandshakeRole",
+ "UpdateDate": "2018-06-28T15:46:10+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMacieServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:53:26+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJVV7PON3FPBL2PSGC",
+ "PolicyName": "AmazonMacieServiceRole",
+ "UpdateDate": "2017-08-14T14:53:26+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMacieServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonMacieServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-19T22:17:38+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "iam:ListAccountAliases",
+ "organizations:DescribeAccount",
+ "organizations:ListAccounts",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetBucketLogging",
+ "s3:GetBucketPolicy",
+ "s3:GetBucketPolicyStatus",
+ "s3:GetBucketPublicAccessBlock",
+ "s3:GetBucketTagging",
+ "s3:GetBucketVersioning",
+ "s3:GetBucketWebsite",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetReplicationConfiguration",
+ "s3:ListBucket",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectTagging"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudtrail:CreateTrail",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudtrail:UpdateTrail",
+ "cloudtrail:DeleteTrail",
+ "cloudtrail:PutEventSelectors"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/AWSMacieTrail-DO-NOT-EDIT"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteBucketWebsite",
+ "s3:DeleteObject",
+ "s3:DeleteObjectTagging",
+ "s3:DeleteObjectVersion",
+ "s3:DeleteObjectVersionTagging",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awsmacie-*",
+ "arn:aws:s3:::awsmacietrail-*",
+ "arn:aws:s3:::*-awsmacietrail-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/macie/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/macie/*:log-stream:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPLHONRH2HP2H6TNQ",
+ "PolicyName": "AmazonMacieServiceRolePolicy",
+ "UpdateDate": "2021-04-13T17:55:07+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonMacieSetupRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonMacieSetupRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-14T14:53:34+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "iam:ListAccountAliases",
+ "s3:GetBucket*",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudtrail:CreateTrail",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudtrail:UpdateTrail",
+ "cloudtrail:DeleteTrail",
+ "cloudtrail:PutEventSelectors"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/AWSMacieTrail-DO-NOT-EDIT"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:DeleteBucketWebsite",
+ "s3:DeleteObject",
+ "s3:DeleteObjectTagging",
+ "s3:DeleteObjectVersion",
+ "s3:DeleteObjectVersionTagging",
+ "s3:PutBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awsmacie-*",
+ "arn:aws:s3:::awsmacietrail-*",
+ "arn:aws:s3:::*-awsmacietrail-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5DC6UBVKND7ADSKA",
+ "PolicyName": "AmazonMacieSetupRole",
+ "UpdateDate": "2019-09-27T18:41:21+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonManagedBlockchainConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonManagedBlockchainConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-29T21:23:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "managedblockchain:*",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:CreateVpcEndpoint",
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ONVQBFILL",
+ "PolicyName": "AmazonManagedBlockchainConsoleFullAccess",
+ "UpdateDate": "2019-04-29T21:23:25+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonManagedBlockchainFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonManagedBlockchainFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-29T21:39:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "managedblockchain:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CGBOJKRYD",
+ "PolicyName": "AmazonManagedBlockchainFullAccess",
+ "UpdateDate": "2019-04-29T21:39:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonManagedBlockchainReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonManagedBlockchainReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-30T18:17:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "managedblockchain:Get*",
+ "managedblockchain:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OIIAURVWV",
+ "PolicyName": "AmazonManagedBlockchainReadOnlyAccess",
+ "UpdateDate": "2019-04-30T18:17:31+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonManagedBlockchainServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonManagedBlockchainServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2020-01-17T19:51:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/managedblockchain/*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/managedblockchain/*:log-stream:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MMO7477QN",
+ "PolicyName": "AmazonManagedBlockchainServiceRolePolicy",
+ "UpdateDate": "2020-01-17T19:51:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMechanicalTurkFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMechanicalTurkFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-11T19:08:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mechanicalturk:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJDGCL5BET73H5QIQC",
+ "PolicyName": "AmazonMechanicalTurkFullAccess",
+ "UpdateDate": "2015-12-11T19:08:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMechanicalTurkReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMechanicalTurkReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-12-11T19:08:28+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mechanicalturk:Get*",
+ "mechanicalturk:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIO5IY3G3WXSX5PPRM",
+ "PolicyName": "AmazonMechanicalTurkReadOnly",
+ "UpdateDate": "2019-09-25T21:06:26+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonMemoryDBFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMemoryDBFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-08T19:24:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "memorydb:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "memorydb.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/memorydb.amazonaws.com/AWSServiceRoleForMemoryDB"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LGPHLZEWJ",
+ "PolicyName": "AmazonMemoryDBFullAccess",
+ "UpdateDate": "2021-10-08T19:24:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMemoryDBReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMemoryDBReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-08T19:27:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "memorydb:Describe*",
+ "memorydb:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HGOZ3UBWP",
+ "PolicyName": "AmazonMemoryDBReadOnlyAccess",
+ "UpdateDate": "2021-10-08T19:27:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsFinancialReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsFinancialReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "mobileanalytics:GetReports",
+ "mobileanalytics:GetFinancialReports"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKJHO2R27TXKCWBU4",
+ "PolicyName": "AmazonMobileAnalyticsFinancialReportAccess",
+ "UpdateDate": "2015-02-06T18:40:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIJIKLU2IJ7WJ6DZFG",
+ "PolicyName": "AmazonMobileAnalyticsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:34+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsNon-financialReportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsNon-financialReportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:GetReports",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQLKQ4RXPUBBVVRDE",
+ "PolicyName": "AmazonMobileAnalyticsNon-financialReportAccess",
+ "UpdateDate": "2015-02-06T18:40:36+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMobileAnalyticsWriteOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMobileAnalyticsWriteOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mobileanalytics:PutEvents",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5TAWBBQC2FAL3G6G",
+ "PolicyName": "AmazonMobileAnalyticsWriteOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:37+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonMonitronFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonMonitronFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-02T22:40:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "monitron.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "monitron:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "kms:CreateGrant",
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": true
+ },
+ "StringLike": {
+ "kms:ViaService": [
+ "monitron.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "ds:DescribeDirectories",
+ "ds:DescribeTrusts"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AWSSSOPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MHDVZEITQ",
+ "PolicyName": "AmazonMonitronFullAccess",
+ "UpdateDate": "2020-12-02T22:40:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonNimbleStudio-LaunchProfileWorker": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonNimbleStudio-LaunchProfileWorker",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-28T04:47:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "fsx:DescribeFileSystems",
+ "ds:DescribeDirectories"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "nimble.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "GetLaunchProfileInitializationDependencies"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G3GPJQ7LQ",
+ "PolicyName": "AmazonNimbleStudio-LaunchProfileWorker",
+ "UpdateDate": "2021-04-28T04:47:02+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonNimbleStudio-StudioAdmin": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonNimbleStudio-StudioAdmin",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-28T04:47:36+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "nimble:CreateStreamingSession",
+ "nimble:GetStreamingSession",
+ "nimble:StartStreamingSession",
+ "nimble:StopStreamingSession",
+ "nimble:CreateStreamingSessionStream",
+ "nimble:GetStreamingSessionStream",
+ "nimble:DeleteStreamingSession",
+ "nimble:ListEulas",
+ "nimble:ListEulaAcceptances",
+ "nimble:GetEula",
+ "nimble:AcceptEulas",
+ "nimble:ListStudioMembers",
+ "nimble:GetStudioMember",
+ "nimble:ListStreamingSessions",
+ "nimble:GetStreamingImage",
+ "nimble:ListStreamingImages",
+ "nimble:GetLaunchProfileInitialization",
+ "nimble:GetLaunchProfileDetails",
+ "nimble:GetFeatureMap",
+ "nimble:PutStudioLogEvents",
+ "nimble:ListLaunchProfiles",
+ "nimble:GetLaunchProfile",
+ "nimble:GetLaunchProfileMember",
+ "nimble:ListLaunchProfileMembers",
+ "nimble:PutLaunchProfileMembers",
+ "nimble:UpdateLaunchProfileMember",
+ "nimble:DeleteLaunchProfileMember"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "StudioAdminFullAccess"
+ },
+ {
+ "Action": [
+ "sso-directory:DescribeUsers",
+ "sso-directory:SearchUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ds:CreateComputer",
+ "ds:DescribeDirectories",
+ "ec2:DescribeSubnets",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeSecurityGroups",
+ "fsx:DescribeFileSystems"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "nimble.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PTQDL2ND4",
+ "PolicyName": "AmazonNimbleStudio-StudioAdmin",
+ "UpdateDate": "2021-11-01T20:02:36+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonNimbleStudio-StudioUser": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonNimbleStudio-StudioUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-04-28T04:48:11+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:CreateComputer",
+ "ec2:DescribeSubnets",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeSecurityGroups",
+ "fsx:DescribeFileSystems",
+ "ds:DescribeDirectories"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "nimble.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sso-directory:DescribeUsers",
+ "sso-directory:SearchUsers"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "nimble:ListLaunchProfiles"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "nimble:requesterPrincipalId": "${nimble:principalId}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "nimble:ListStudioMembers",
+ "nimble:GetStudioMember",
+ "nimble:ListEulas",
+ "nimble:ListEulaAcceptances",
+ "nimble:GetFeatureMap",
+ "nimble:PutStudioLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "nimble:DeleteStreamingSession",
+ "nimble:GetStreamingSession",
+ "nimble:StartStreamingSession",
+ "nimble:StopStreamingSession",
+ "nimble:CreateStreamingSessionStream",
+ "nimble:GetStreamingSessionStream",
+ "nimble:ListStreamingSessions"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "nimble:ownedBy": "${nimble:requesterPrincipalId}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CA37MTXJV",
+ "PolicyName": "AmazonNimbleStudio-StudioUser",
+ "UpdateDate": "2021-11-01T20:01:52+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonOpenSearchServiceCognitoAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonOpenSearchServiceCognitoAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-02T06:31:49+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:DeleteUserPoolClient",
+ "cognito-idp:UpdateUserPoolClient",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:AdminInitiateAuth",
+ "cognito-idp:AdminUserGlobalSignOut",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-identity:DescribeIdentityPool",
+ "cognito-identity:UpdateIdentityPool",
+ "cognito-identity:GetIdentityPoolRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cognito-identity:*:*:identitypool/*",
+ "arn:aws:cognito-idp:*:*:userpool/*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": [
+ "cognito-identity.amazonaws.com",
+ "cognito-identity-us-gov.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": "cognito-identity:SetIdentityPoolRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4I2NKQTDYL",
+ "PolicyName": "AmazonOpenSearchServiceCognitoAccess",
+ "UpdateDate": "2021-12-20T14:04:18+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonOpenSearchServiceFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonOpenSearchServiceFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-08T05:33:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4F6P6N56MG",
+ "PolicyName": "AmazonOpenSearchServiceFullAccess",
+ "UpdateDate": "2021-09-08T05:33:47+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonOpenSearchServiceReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonOpenSearchServiceReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-08T05:38:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "es:Describe*",
+ "es:List*",
+ "es:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PQONZTCWT",
+ "PolicyName": "AmazonOpenSearchServiceReadOnlyAccess",
+ "UpdateDate": "2021-09-08T05:38:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonOpenSearchServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonOpenSearchServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-26T09:27:09+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "Stmt1480452973134"
+ },
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973145"
+ },
+ {
+ "Action": [
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ],
+ "Sid": "Stmt1480452973144"
+ },
+ {
+ "Action": [
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ],
+ "Sid": "Stmt1480452973165"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973154"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973164"
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973174"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:AddListenerCertificates",
+ "elasticloadbalancing:RemoveListenerCertificates"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticloadbalancing:*:*:listener/*"
+ ],
+ "Sid": "Stmt1480452973184"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*"
+ ],
+ "Sid": "Stmt1480452973194"
+ },
+ {
+ "Action": [
+ "ec2:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "Stmt1480452973195"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NHHCOTRP6",
+ "PolicyName": "AmazonOpenSearchServiceRolePolicy",
+ "UpdateDate": "2021-09-09T10:43:21+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonPersonalizeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonPersonalizeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-04T22:24:33+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "personalize:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*Personalize*",
+ "arn:aws:s3:::*personalize*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "personalize.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ45XBPPZNI3MMVAUK",
+ "PolicyName": "AmazonPersonalizeFullAccess",
+ "UpdateDate": "2019-05-30T23:46:59+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonPollyFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPollyFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T18:59:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUZOYQU6XQYPR7EWS",
+ "PolicyName": "AmazonPollyFullAccess",
+ "UpdateDate": "2016-11-30T18:59:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonPollyReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T18:59:24+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:DescribeVoices",
+ "polly:GetLexicon",
+ "polly:GetSpeechSynthesisTask",
+ "polly:ListLexicons",
+ "polly:ListSpeechSynthesisTasks",
+ "polly:SynthesizeSpeech"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5FENL3CVPL2FPDLA",
+ "PolicyName": "AmazonPollyReadOnlyAccess",
+ "UpdateDate": "2018-07-17T16:41:07+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonPrometheusConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPrometheusConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T18:11:10+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "tag:GetTagValues",
+ "tag:GetTagKeys"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "aps:CreateWorkspace",
+ "aps:DescribeWorkspace",
+ "aps:UpdateWorkspaceAlias",
+ "aps:DeleteWorkspace",
+ "aps:ListWorkspaces",
+ "aps:DescribeAlertManagerDefinition",
+ "aps:DescribeRuleGroupsNamespace",
+ "aps:CreateAlertManagerDefinition",
+ "aps:CreateRuleGroupsNamespace",
+ "aps:DeleteAlertManagerDefinition",
+ "aps:DeleteRuleGroupsNamespace",
+ "aps:ListRuleGroupsNamespaces",
+ "aps:PutAlertManagerDefinition",
+ "aps:PutRuleGroupsNamespace",
+ "aps:TagResource",
+ "aps:UntagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4P7IR2JZ6H",
+ "PolicyName": "AmazonPrometheusConsoleFullAccess",
+ "UpdateDate": "2021-09-29T15:29:28+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonPrometheusFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPrometheusFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-15T18:10:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aps:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4POZK2DGLM",
+ "PolicyName": "AmazonPrometheusFullAccess",
+ "UpdateDate": "2020-12-15T18:10:46+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonPrometheusQueryAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-19T01:02:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aps:GetLabels",
+ "aps:GetMetricMetadata",
+ "aps:GetSeries",
+ "aps:QueryMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GQ2MT4E46",
+ "PolicyName": "AmazonPrometheusQueryAccess",
+ "UpdateDate": "2020-12-19T01:02:58+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonPrometheusRemoteWriteAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-19T01:04:32+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aps:RemoteWrite"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JHMXH2L3T",
+ "PolicyName": "AmazonPrometheusRemoteWriteAccess",
+ "UpdateDate": "2020-12-19T01:04:32+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonQLDBConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonQLDBConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-09-05T18:24:20+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "qldb:CreateLedger",
+ "qldb:UpdateLedger",
+ "qldb:UpdateLedgerPermissionsMode",
+ "qldb:DeleteLedger",
+ "qldb:ListLedgers",
+ "qldb:DescribeLedger",
+ "qldb:ExportJournalToS3",
+ "qldb:ListJournalS3Exports",
+ "qldb:ListJournalS3ExportsForLedger",
+ "qldb:DescribeJournalS3Export",
+ "qldb:CancelJournalKinesisStream",
+ "qldb:DescribeJournalKinesisStream",
+ "qldb:ListJournalKinesisStreamsForLedger",
+ "qldb:StreamJournalToKinesis",
+ "qldb:GetBlock",
+ "qldb:GetDigest",
+ "qldb:GetRevision",
+ "qldb:TagResource",
+ "qldb:UntagResource",
+ "qldb:ListTagsForResource",
+ "qldb:SendCommand",
+ "qldb:ExecuteStatement",
+ "qldb:ShowCatalog",
+ "qldb:InsertSampleData",
+ "qldb:PartiQLCreateTable",
+ "qldb:PartiQLCreateIndex",
+ "qldb:PartiQLDropTable",
+ "qldb:PartiQLDropIndex",
+ "qldb:PartiQLUndropTable",
+ "qldb:PartiQLDelete",
+ "qldb:PartiQLInsert",
+ "qldb:PartiQLUpdate",
+ "qldb:PartiQLSelect",
+ "qldb:PartiQLHistoryFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dbqms:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:ListStreams",
+ "kinesis:DescribeStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "qldb.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4H2DEHAFRU",
+ "PolicyName": "AmazonQLDBConsoleFullAccess",
+ "UpdateDate": "2021-09-02T23:21:23+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonQLDBFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonQLDBFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-09-05T18:23:32+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "qldb:CreateLedger",
+ "qldb:UpdateLedger",
+ "qldb:UpdateLedgerPermissionsMode",
+ "qldb:DeleteLedger",
+ "qldb:ListLedgers",
+ "qldb:DescribeLedger",
+ "qldb:ExportJournalToS3",
+ "qldb:ListJournalS3Exports",
+ "qldb:ListJournalS3ExportsForLedger",
+ "qldb:DescribeJournalS3Export",
+ "qldb:CancelJournalKinesisStream",
+ "qldb:DescribeJournalKinesisStream",
+ "qldb:ListJournalKinesisStreamsForLedger",
+ "qldb:StreamJournalToKinesis",
+ "qldb:GetDigest",
+ "qldb:GetRevision",
+ "qldb:GetBlock",
+ "qldb:TagResource",
+ "qldb:UntagResource",
+ "qldb:ListTagsForResource",
+ "qldb:SendCommand",
+ "qldb:PartiQLCreateTable",
+ "qldb:PartiQLCreateIndex",
+ "qldb:PartiQLDropTable",
+ "qldb:PartiQLDropIndex",
+ "qldb:PartiQLUndropTable",
+ "qldb:PartiQLDelete",
+ "qldb:PartiQLInsert",
+ "qldb:PartiQLUpdate",
+ "qldb:PartiQLSelect",
+ "qldb:PartiQLHistoryFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "qldb.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HHBBWGE2J",
+ "PolicyName": "AmazonQLDBFullAccess",
+ "UpdateDate": "2021-09-02T23:21:04+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonQLDBReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonQLDBReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-09-05T18:19:24+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "qldb:ListLedgers",
+ "qldb:DescribeLedger",
+ "qldb:ListJournalS3Exports",
+ "qldb:ListJournalS3ExportsForLedger",
+ "qldb:DescribeJournalS3Export",
+ "qldb:DescribeJournalKinesisStream",
+ "qldb:ListJournalKinesisStreamsForLedger",
+ "qldb:GetBlock",
+ "qldb:GetDigest",
+ "qldb:GetRevision",
+ "qldb:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IC74JOQJR",
+ "PolicyName": "AmazonQLDBReadOnly",
+ "UpdateDate": "2021-07-02T02:17:25+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonRDSBetaServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRDSBetaServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-02T19:41:04+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateCoipPoolPermission",
+ "ec2:CreateLocalGatewayRouteTablePermission",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteCoipPoolPermission",
+ "ec2:DeleteLocalGatewayRouteTablePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCoipPools",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLocalGatewayRouteTablePermissions",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeLocalGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DeleteVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": [
+ "AWS/DocDB",
+ "AWS/Neptune",
+ "AWS/RDS"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ36CJAE6OYAR4YEK4",
+ "PolicyName": "AmazonRDSBetaServiceRolePolicy",
+ "UpdateDate": "2022-02-22T20:46:59+00:00",
+ "VersionId": "v6"
+ },
+ "AmazonRDSCustomPreviewServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRDSCustomPreviewServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-08T21:44:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeIamInstanceProfileAssociations",
+ "ec2:DescribeImages",
+ "ec2:DescribeVpcs",
+ "ec2:RegisterImage",
+ "ec2:DeregisterImage",
+ "ec2:DescribeTags",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVolumesModifications",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1"
+ },
+ {
+ "Action": [
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:AssociateIamInstanceProfile",
+ "ec2:ReplaceIamInstanceProfileAssociation",
+ "ec2:TerminateInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:RebootInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "ecc2"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1scoping"
+ },
+ {
+ "Action": [
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1scoping2"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:network-interface/*"
+ ],
+ "Sid": "eccRunInstances1"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*",
+ "arn:aws:ec2:*:*:placement-group/*"
+ ],
+ "Sid": "eccRunInstances2"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:DeleteKeyPair"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*"
+ ],
+ "Sid": "eccRunInstances3keyPair1"
+ },
+ {
+ "Action": [
+ "ec2:CreateKeyPair"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*"
+ ],
+ "Sid": "eccKeyPair2"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "eccCreateTag1"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ],
+ "ec2:CreateAction": [
+ "CreateKeyPair",
+ "RunInstances",
+ "CreateVolume",
+ "CreateSnapshots",
+ "CopySnapshot",
+ "AllocateAddress"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "eccCreateTag2"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ],
+ "Sid": "eccVolume1"
+ },
+ {
+ "Action": "ec2:CreateVolume",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*",
+ "Sid": "eccVolume2"
+ },
+ {
+ "Action": [
+ "ec2:ModifyVolumeAttribute",
+ "ec2:DeleteVolume",
+ "ec2:ModifyVolume"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*",
+ "Sid": "eccVolume3"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume",
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*",
+ "Sid": "eccVolume4snapshot1"
+ },
+ {
+ "Action": [
+ "ec2:CopySnapshot",
+ "ec2:CreateSnapshots"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*",
+ "Sid": "eccSnapshot2"
+ },
+ {
+ "Action": "ec2:CreateSnapshots",
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ],
+ "Sid": "eccSnapshot3"
+ },
+ {
+ "Action": [
+ "iam:ListInstanceProfiles",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:ListRolePolicies",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "iam1"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSRDSCustom*",
+ "Sid": "iam2"
+ },
+ {
+ "Action": [
+ "cloudtrail:GetTrailStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/do-not-delete-rds-custom-*",
+ "Sid": "cloudtrail1"
+ },
+ {
+ "Action": [
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:do-not-delete-rds-custom-*",
+ "Sid": "cw1"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:TagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:do-not-delete-rds-custom-*",
+ "Sid": "cw2"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:document/*",
+ "Sid": "ssm1"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "ssm2"
+ },
+ {
+ "Action": [
+ "ssm:GetCommandInvocation",
+ "ssm:GetConnectionStatus",
+ "ssm:DescribeInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ssm3"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:TagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/do-not-delete-rds-custom-*",
+ "Sid": "eb1"
+ },
+ {
+ "Action": [
+ "events:PutTargets",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:ListTargetsByRule",
+ "events:DeleteRule",
+ "events:RemoveTargets",
+ "events:DisableRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/do-not-delete-rds-custom-*",
+ "Sid": "eb2"
+ },
+ {
+ "Action": [
+ "secretsmanager:TagResource",
+ "secretsmanager:CreateSecret"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:do-not-delete-rds-custom-*",
+ "Sid": "secretmanager1"
+ },
+ {
+ "Action": [
+ "secretsmanager:TagResource",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:PutSecretValue"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:do-not-delete-rds-custom-*",
+ "Sid": "secretmanager2"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4D6BEPON2G",
+ "PolicyName": "AmazonRDSCustomPreviewServiceRolePolicy",
+ "UpdateDate": "2021-10-08T21:44:15+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSCustomServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRDSCustomServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-10-08T21:39:12+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeIamInstanceProfileAssociations",
+ "ec2:DescribeImages",
+ "ec2:DescribeVpcs",
+ "ec2:RegisterImage",
+ "ec2:DeregisterImage",
+ "ec2:DescribeTags",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVolumesModifications",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1"
+ },
+ {
+ "Action": [
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:AssociateIamInstanceProfile",
+ "ec2:ReplaceIamInstanceProfileAssociation",
+ "ec2:TerminateInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:RebootInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "ecc2"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1scoping"
+ },
+ {
+ "Action": [
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:ReleaseAddress"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "ecc1scoping2"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:network-interface/*"
+ ],
+ "Sid": "eccRunInstances1"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*",
+ "arn:aws:ec2:*:*:placement-group/*"
+ ],
+ "Sid": "eccRunInstances2"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:DeleteKeyPair"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*"
+ ],
+ "Sid": "eccRunInstances3keyPair1"
+ },
+ {
+ "Action": [
+ "ec2:CreateKeyPair"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:key-pair/do-not-delete-rds-custom-*"
+ ],
+ "Sid": "eccKeyPair2"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "eccCreateTag1"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ],
+ "ec2:CreateAction": [
+ "CreateKeyPair",
+ "RunInstances",
+ "CreateVolume",
+ "CreateSnapshots",
+ "CopySnapshot",
+ "AllocateAddress"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "eccCreateTag2"
+ },
+ {
+ "Action": [
+ "ec2:DetachVolume",
+ "ec2:AttachVolume"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ],
+ "Sid": "eccVolume1"
+ },
+ {
+ "Action": "ec2:CreateVolume",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*",
+ "Sid": "eccVolume2"
+ },
+ {
+ "Action": [
+ "ec2:ModifyVolumeAttribute",
+ "ec2:DeleteVolume",
+ "ec2:ModifyVolume"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:volume/*",
+ "Sid": "eccVolume3"
+ },
+ {
+ "Action": [
+ "ec2:CreateVolume",
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*",
+ "Sid": "eccVolume4snapshot1"
+ },
+ {
+ "Action": [
+ "ec2:CopySnapshot",
+ "ec2:CreateSnapshots"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::snapshot/*",
+ "Sid": "eccSnapshot2"
+ },
+ {
+ "Action": "ec2:CreateSnapshots",
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ],
+ "Sid": "eccSnapshot3"
+ },
+ {
+ "Action": [
+ "iam:ListInstanceProfiles",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:ListRolePolicies",
+ "iam:GetRolePolicy",
+ "iam:ListAttachedRolePolicies",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "iam1"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSRDSCustom*",
+ "Sid": "iam2"
+ },
+ {
+ "Action": [
+ "cloudtrail:GetTrailStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudtrail:*:*:trail/do-not-delete-rds-custom-*",
+ "Sid": "cloudtrail1"
+ },
+ {
+ "Action": [
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:do-not-delete-rds-custom-*",
+ "Sid": "cw1"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:TagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:alarm:do-not-delete-rds-custom-*",
+ "Sid": "cw2"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:document/*",
+ "Sid": "ssm1"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*",
+ "Sid": "ssm2"
+ },
+ {
+ "Action": [
+ "ssm:GetCommandInvocation",
+ "ssm:GetConnectionStatus",
+ "ssm:DescribeInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ssm3"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:TagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/do-not-delete-rds-custom-*",
+ "Sid": "eb1"
+ },
+ {
+ "Action": [
+ "events:PutTargets",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:ListTargetsByRule",
+ "events:DeleteRule",
+ "events:RemoveTargets",
+ "events:DisableRule"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/do-not-delete-rds-custom-*",
+ "Sid": "eb2"
+ },
+ {
+ "Action": [
+ "secretsmanager:TagResource",
+ "secretsmanager:CreateSecret"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:do-not-delete-rds-custom-*",
+ "Sid": "secretmanager1"
+ },
+ {
+ "Action": [
+ "secretsmanager:TagResource",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:PutSecretValue"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/AWSRDSCustom": [
+ "custom-oracle",
+ "custom-sqlserver"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:do-not-delete-rds-custom-*",
+ "Sid": "secretmanager2"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4F2M3XYA7J",
+ "PolicyName": "AmazonRDSCustomServiceRolePolicy",
+ "UpdateDate": "2021-10-08T21:39:12+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSDataFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRDSDataFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-20T21:29:36+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:PutResourcePolicy",
+ "secretsmanager:PutSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:rds-db-credentials/*",
+ "Sid": "SecretsManagerDbCredentialsAccess"
+ },
+ {
+ "Action": [
+ "dbqms:CreateFavoriteQuery",
+ "dbqms:DescribeFavoriteQueries",
+ "dbqms:UpdateFavoriteQuery",
+ "dbqms:DeleteFavoriteQueries",
+ "dbqms:GetQueryString",
+ "dbqms:CreateQueryHistory",
+ "dbqms:DescribeQueryHistory",
+ "dbqms:UpdateQueryHistory",
+ "dbqms:DeleteQueryHistory",
+ "rds-data:ExecuteSql",
+ "rds-data:ExecuteStatement",
+ "rds-data:BatchExecuteStatement",
+ "rds-data:BeginTransaction",
+ "rds-data:CommitTransaction",
+ "rds-data:RollbackTransaction",
+ "secretsmanager:CreateSecret",
+ "secretsmanager:ListSecrets",
+ "secretsmanager:GetRandomPassword",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RDSDataServiceAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5HUMNZCSW4IC74T6",
+ "PolicyName": "AmazonRDSDataFullAccess",
+ "UpdateDate": "2019-11-20T21:58:46+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonRDSDirectoryServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonRDSDirectoryServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-02-26T02:02:05+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:DescribeDirectories",
+ "ds:AuthorizeApplication",
+ "ds:UnauthorizeApplication",
+ "ds:GetAuthorizedApplicationDetails"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIL4KBY57XWMYUHKUU",
+ "PolicyName": "AmazonRDSDirectoryServiceAccess",
+ "UpdateDate": "2019-05-15T16:51:50+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRDSEnhancedMonitoringRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-11-11T19:58:29+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:RDS*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:RDS*:log-stream:*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogStreams"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJV7BS425S4PTSSVGK",
+ "PolicyName": "AmazonRDSEnhancedMonitoringRole",
+ "UpdateDate": "2015-11-11T19:58:29+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRDSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRDSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:52+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:*",
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:RegisterScalableTarget",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCoipPools",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLocalGatewayRouteTablePermissions",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeLocalGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:GetCoipPoolUsage",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "sns:Publish",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "outposts:GetOutpostInstanceTypes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "pi:*",
+ "Effect": "Allow",
+ "Resource": "arn:aws:pi:*:*:metrics/rds/*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "rds.amazonaws.com",
+ "rds.application-autoscaling.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3R4QMOG6Q5A4VWVG",
+ "PolicyName": "AmazonRDSFullAccess",
+ "UpdateDate": "2022-03-07T21:11:46+00:00",
+ "VersionId": "v9"
+ },
+ "AmazonRDSPreviewServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRDSPreviewServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-31T18:02:00+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:CrossRegionCommunication"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateCoipPoolPermission",
+ "ec2:CreateLocalGatewayRouteTablePermission",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteCoipPoolPermission",
+ "ec2:DeleteLocalGatewayRouteTablePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCoipPools",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLocalGatewayRouteTablePermissions",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeLocalGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": [
+ "AWS/DocDB",
+ "AWS/Neptune",
+ "AWS/RDS"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZHJJBU3675JOUEMQ",
+ "PolicyName": "AmazonRDSPreviewServiceRolePolicy",
+ "UpdateDate": "2022-02-22T20:46:58+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonRDSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:53+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKTTTYV2IIHKLZ346",
+ "PolicyName": "AmazonRDSReadOnlyAccess",
+ "UpdateDate": "2017-08-28T21:36:32+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonRDSServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRDSServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-01-08T18:17:46+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:CrossRegionCommunication"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AllocateAddress",
+ "ec2:AssociateAddress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateCoipPoolPermission",
+ "ec2:CreateLocalGatewayRouteTablePermission",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteCoipPoolPermission",
+ "ec2:DeleteLocalGatewayRouteTablePermission",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCoipPools",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLocalGatewayRouteTablePermissions",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeLocalGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DisassociateAddress",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:ReleaseAddress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*",
+ "arn:aws:logs:*:*:log-group:/aws/docdb/*",
+ "arn:aws:logs:*:*:log-group:/aws/neptune/*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/docdb/*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/neptune/*:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "kinesis:CreateStream",
+ "kinesis:PutRecord",
+ "kinesis:PutRecords",
+ "kinesis:DescribeStream",
+ "kinesis:SplitShard",
+ "kinesis:MergeShards",
+ "kinesis:DeleteStream",
+ "kinesis:UpdateShardCount"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:kinesis:*:*:stream/aws-rds-das-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": [
+ "AWS/DocDB",
+ "AWS/Neptune",
+ "AWS/RDS"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPEU5ZOBJWKWHUIBA",
+ "PolicyName": "AmazonRDSServiceRolePolicy",
+ "UpdateDate": "2022-02-24T01:07:42+00:00",
+ "VersionId": "v10"
+ },
+ "AmazonRedshiftAllCommandsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftAllCommandsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-04T00:48:08+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:CreateTrainingJob",
+ "sagemaker:CreateAutoMLJob",
+ "sagemaker:CreateCompilationJob",
+ "sagemaker:CreateEndpoint",
+ "sagemaker:DescribeAutoMLJob",
+ "sagemaker:DescribeTrainingJob",
+ "sagemaker:DescribeCompilationJob",
+ "sagemaker:DescribeProcessingJob",
+ "sagemaker:DescribeTransformJob",
+ "sagemaker:ListCandidatesForAutoMLJob",
+ "sagemaker:StopAutoMLJob",
+ "sagemaker:StopCompilationJob",
+ "sagemaker:StopTrainingJob",
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:InvokeEndpoint",
+ "sagemaker:StopProcessingJob",
+ "sagemaker:CreateModel",
+ "sagemaker:CreateProcessingJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:model/*redshift*",
+ "arn:aws:sagemaker:*:*:training-job/*redshift*",
+ "arn:aws:sagemaker:*:*:automl-job/*redshift*",
+ "arn:aws:sagemaker:*:*:compilation-job/*redshift*",
+ "arn:aws:sagemaker:*:*:processing-job/*redshift*",
+ "arn:aws:sagemaker:*:*:transform-job/*redshift*",
+ "arn:aws:sagemaker:*:*:endpoint/*redshift*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/sagemaker/Endpoints/*redshift*",
+ "arn:aws:logs:*:*:log-group:/aws/sagemaker/ProcessingJobs/*redshift*",
+ "arn:aws:logs:*:*:log-group:/aws/sagemaker/TrainingJobs/*redshift*",
+ "arn:aws:logs:*:*:log-group:/aws/sagemaker/TransformJobs/*redshift*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": [
+ "SageMaker",
+ "/aws/sagemaker/Endpoints",
+ "/aws/sagemaker/ProcessingJobs",
+ "/aws/sagemaker/TrainingJobs",
+ "/aws/sagemaker/TransformJobs"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:BatchGetImage",
+ "ecr:GetAuthorizationToken",
+ "ecr:GetDownloadUrlForLayer"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCors",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:ListMultipartUploadParts",
+ "s3:ListBucketMultipartUploads",
+ "s3:PutObject",
+ "s3:PutBucketAcl",
+ "s3:PutBucketCors",
+ "s3:DeleteObject",
+ "s3:AbortMultipartUpload",
+ "s3:CreateBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::redshift-downloads",
+ "arn:aws:s3:::redshift-downloads/*",
+ "arn:aws:s3:::*redshift*",
+ "arn:aws:s3:::*redshift*/*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/Redshift": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dynamodb:Scan",
+ "dynamodb:DescribeTable",
+ "dynamodb:Getitem"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dynamodb:*:*:table/*redshift*",
+ "arn:aws:dynamodb:*:*:table/*redshift*/index/*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticmapreduce:ListInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:elasticmapreduce:*:*:cluster/*redshift*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticmapreduce:ListInstances"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "elasticmapreduce:ResourceTag/Redshift": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:*redshift*"
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:DeleteTable",
+ "glue:BatchDeleteTable",
+ "glue:UpdateTable",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:BatchCreatePartition",
+ "glue:CreatePartition",
+ "glue:DeletePartition",
+ "glue:BatchDeletePartition",
+ "glue:UpdatePartition",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:BatchGetPartition"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:table/*redshift*/*",
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*redshift*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:GetResourcePolicy",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:ListSecretVersionIds"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:*redshift*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:GetRandomPassword",
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "redshift.amazonaws.com",
+ "glue.amazonaws.com",
+ "sagemaker.amazonaws.com",
+ "athena.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FLN3TI7CS",
+ "PolicyName": "AmazonRedshiftAllCommandsFullAccess",
+ "UpdateDate": "2021-11-25T02:27:31+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftDataFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftDataFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-09T19:23:55+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift-data:BatchExecuteStatement",
+ "redshift-data:ExecuteStatement",
+ "redshift-data:CancelStatement",
+ "redshift-data:ListStatements",
+ "redshift-data:GetStatementResult",
+ "redshift-data:DescribeStatement",
+ "redshift-data:ListDatabases",
+ "redshift-data:ListSchemas",
+ "redshift-data:ListTables",
+ "redshift-data:DescribeTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DataAPIPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Condition": {
+ "StringLike": {
+ "secretsmanager:ResourceTag/RedshiftDataFullAccess": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerPermissions"
+ },
+ {
+ "Action": "redshift:GetClusterCredentials",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:redshift:*:*:dbname:*/*",
+ "arn:aws:redshift:*:*:dbuser:*/redshift_data_api_user"
+ ],
+ "Sid": "GetCredentialsForAPIUser"
+ },
+ {
+ "Action": "redshift:CreateClusterUser",
+ "Effect": "Deny",
+ "Resource": [
+ "arn:aws:redshift:*:*:dbuser:*/redshift_data_api_user"
+ ],
+ "Sid": "DenyCreateAPIUser"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "redshift-data.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/redshift-data.amazonaws.com/AWSServiceRoleForRedshift",
+ "Sid": "ServiceLinkedRole"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PX5LA5SG6",
+ "PolicyName": "AmazonRedshiftDataFullAccess",
+ "UpdateDate": "2021-07-27T20:05:33+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:50+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:*",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "sns:CreateTopic",
+ "sns:Get*",
+ "sns:List*",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:DisableAlarmActions",
+ "tag:GetResources",
+ "tag:UntagResources",
+ "tag:GetTagValues",
+ "tag:GetTagKeys",
+ "tag:TagResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "redshift.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift"
+ },
+ {
+ "Action": [
+ "redshift-data:ExecuteStatement",
+ "redshift-data:CancelStatement",
+ "redshift-data:ListStatements",
+ "redshift-data:GetStatementResult",
+ "redshift-data:DescribeStatement",
+ "redshift-data:ListDatabases",
+ "redshift-data:ListSchemas",
+ "redshift-data:ListTables",
+ "redshift-data:DescribeTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DataAPIPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerListPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:TagResource"
+ ],
+ "Condition": {
+ "StringLike": {
+ "secretsmanager:ResourceTag/RedshiftDataFullAccess": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerCreateGetPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAISEKCHH4YDB46B5ZO",
+ "PolicyName": "AmazonRedshiftFullAccess",
+ "UpdateDate": "2020-09-09T19:51:19+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonRedshiftQueryEditor": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftQueryEditor",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-10-04T22:50:32+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:GetClusterCredentials",
+ "redshift:ListSchemas",
+ "redshift:ListTables",
+ "redshift:ListDatabases",
+ "redshift:ExecuteQuery",
+ "redshift:FetchResults",
+ "redshift:CancelQuery",
+ "redshift:DescribeClusters",
+ "redshift:DescribeQuery",
+ "redshift:DescribeTable",
+ "redshift:ViewQueriesFromConsole",
+ "redshift:DescribeSavedQueries",
+ "redshift:CreateSavedQuery",
+ "redshift:DeleteSavedQueries",
+ "redshift:ModifySavedQuery"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "redshift-data:ExecuteStatement",
+ "redshift-data:ListDatabases",
+ "redshift-data:ListSchemas",
+ "redshift-data:ListTables",
+ "redshift-data:DescribeTable"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DataAPIPermissions"
+ },
+ {
+ "Action": [
+ "redshift-data:GetStatementResult",
+ "redshift-data:CancelStatement",
+ "redshift-data:DescribeStatement",
+ "redshift-data:ListStatements"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "redshift-data:statement-owner-iam-userid": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "DataAPIIAMSessionPermissionsRestriction"
+ },
+ {
+ "Action": [
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SecretsManagerListPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "secretsmanager:ResourceTag/RedshiftQueryOwner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:*",
+ "Sid": "SecretsManagerCreateGetPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINVFHHP7CWVHTGBGM",
+ "PolicyName": "AmazonRedshiftQueryEditor",
+ "UpdateDate": "2021-02-16T19:33:45+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonRedshiftQueryEditorV2FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-24T14:06:02+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "redshift:DescribeClusters",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RedshiftPermissions"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "KeyManagementServicePermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:sqlworkbench!*",
+ "Sid": "SecretsManagerPermissions"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "sqlworkbench.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResourceGroupsTaggingPermissions"
+ },
+ {
+ "Action": "sqlworkbench:*",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2Permissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BKYFZHR4E",
+ "PolicyName": "AmazonRedshiftQueryEditorV2FullAccess",
+ "UpdateDate": "2022-02-23T17:05:06+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftQueryEditorV2NoSharing": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2NoSharing",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-24T14:18:42+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "redshift:DescribeClusters",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RedshiftPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "secretsmanager:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:sqlworkbench!*",
+ "Sid": "SecretsManagerPermissions"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "sqlworkbench.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResourceGroupsTaggingPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateFolder",
+ "sqlworkbench:PutTab",
+ "sqlworkbench:BatchDeleteFolder",
+ "sqlworkbench:DeleteTab",
+ "sqlworkbench:GenerateSession",
+ "sqlworkbench:GetAccountInfo",
+ "sqlworkbench:GetUserInfo",
+ "sqlworkbench:GetUserWorkspaceSettings",
+ "sqlworkbench:PutUserWorkspaceSettings",
+ "sqlworkbench:ListConnections",
+ "sqlworkbench:ListFiles",
+ "sqlworkbench:ListTabs",
+ "sqlworkbench:UpdateFolder",
+ "sqlworkbench:ListRedshiftClusters",
+ "sqlworkbench:DriverExecute",
+ "sqlworkbench:ListTaggedResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2NonResourceLevelPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateConnection",
+ "sqlworkbench:CreateSavedQuery",
+ "sqlworkbench:CreateChart"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2CreateOwnedResourcePermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:DeleteChart",
+ "sqlworkbench:DeleteConnection",
+ "sqlworkbench:DeleteSavedQuery",
+ "sqlworkbench:GetChart",
+ "sqlworkbench:GetConnection",
+ "sqlworkbench:GetSavedQuery",
+ "sqlworkbench:ListSavedQueryVersions",
+ "sqlworkbench:UpdateChart",
+ "sqlworkbench:UpdateConnection",
+ "sqlworkbench:UpdateSavedQuery",
+ "sqlworkbench:AssociateConnectionWithTab",
+ "sqlworkbench:AssociateQueryWithTab",
+ "sqlworkbench:AssociateConnectionWithChart",
+ "sqlworkbench:UpdateFileFolder",
+ "sqlworkbench:ListTagsForResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2OwnerSpecificPermissions"
+ },
+ {
+ "Action": "sqlworkbench:TagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-resource-owner"
+ },
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}",
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TagOnlyUserIdPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JFCSC6IV2",
+ "PolicyName": "AmazonRedshiftQueryEditorV2NoSharing",
+ "UpdateDate": "2022-02-23T17:04:20+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftQueryEditorV2ReadSharing": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2ReadSharing",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-24T14:22:21+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "redshift:DescribeClusters",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RedshiftPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "secretsmanager:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:sqlworkbench!*",
+ "Sid": "SecretsManagerPermissions"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "sqlworkbench.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResourceGroupsTaggingPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateFolder",
+ "sqlworkbench:PutTab",
+ "sqlworkbench:BatchDeleteFolder",
+ "sqlworkbench:DeleteTab",
+ "sqlworkbench:GenerateSession",
+ "sqlworkbench:GetAccountInfo",
+ "sqlworkbench:GetUserInfo",
+ "sqlworkbench:GetUserWorkspaceSettings",
+ "sqlworkbench:PutUserWorkspaceSettings",
+ "sqlworkbench:ListConnections",
+ "sqlworkbench:ListFiles",
+ "sqlworkbench:ListTabs",
+ "sqlworkbench:UpdateFolder",
+ "sqlworkbench:ListRedshiftClusters",
+ "sqlworkbench:DriverExecute",
+ "sqlworkbench:ListTaggedResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2NonResourceLevelPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateConnection",
+ "sqlworkbench:CreateSavedQuery",
+ "sqlworkbench:CreateChart"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2CreateOwnedResourcePermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:DeleteChart",
+ "sqlworkbench:DeleteConnection",
+ "sqlworkbench:DeleteSavedQuery",
+ "sqlworkbench:GetChart",
+ "sqlworkbench:GetConnection",
+ "sqlworkbench:GetSavedQuery",
+ "sqlworkbench:ListSavedQueryVersions",
+ "sqlworkbench:UpdateChart",
+ "sqlworkbench:UpdateConnection",
+ "sqlworkbench:UpdateSavedQuery",
+ "sqlworkbench:AssociateConnectionWithTab",
+ "sqlworkbench:AssociateQueryWithTab",
+ "sqlworkbench:AssociateConnectionWithChart",
+ "sqlworkbench:UpdateFileFolder",
+ "sqlworkbench:ListTagsForResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2OwnerSpecificPermissions"
+ },
+ {
+ "Action": "sqlworkbench:TagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-resource-owner"
+ },
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}",
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TagOnlyUserIdPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:GetChart",
+ "sqlworkbench:GetConnection",
+ "sqlworkbench:GetSavedQuery",
+ "sqlworkbench:ListSavedQueryVersions",
+ "sqlworkbench:ListTagsForResource",
+ "sqlworkbench:AssociateQueryWithTab"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-team": "${aws:PrincipalTag/sqlworkbench-team}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TeamReadAccessPermissions"
+ },
+ {
+ "Action": "sqlworkbench:TagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-team"
+ },
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-team": "${aws:PrincipalTag/sqlworkbench-team}",
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TagOnlyTeamPermissions"
+ },
+ {
+ "Action": "sqlworkbench:UntagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-team"
+ },
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2UntagOnlyTeamPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G5PCICHSV",
+ "PolicyName": "AmazonRedshiftQueryEditorV2ReadSharing",
+ "UpdateDate": "2022-02-23T17:03:58+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftQueryEditorV2ReadWriteSharing": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2ReadWriteSharing",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-24T14:25:37+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "redshift:DescribeClusters",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "RedshiftPermissions"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DeleteSecret",
+ "secretsmanager:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "secretsmanager:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:sqlworkbench!*",
+ "Sid": "SecretsManagerPermissions"
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:CalledViaLast": "sqlworkbench.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ResourceGroupsTaggingPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateFolder",
+ "sqlworkbench:PutTab",
+ "sqlworkbench:BatchDeleteFolder",
+ "sqlworkbench:DeleteTab",
+ "sqlworkbench:GenerateSession",
+ "sqlworkbench:GetAccountInfo",
+ "sqlworkbench:GetUserInfo",
+ "sqlworkbench:GetUserWorkspaceSettings",
+ "sqlworkbench:PutUserWorkspaceSettings",
+ "sqlworkbench:ListConnections",
+ "sqlworkbench:ListFiles",
+ "sqlworkbench:ListTabs",
+ "sqlworkbench:UpdateFolder",
+ "sqlworkbench:ListRedshiftClusters",
+ "sqlworkbench:DriverExecute",
+ "sqlworkbench:ListTaggedResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2NonResourceLevelPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:CreateConnection",
+ "sqlworkbench:CreateSavedQuery",
+ "sqlworkbench:CreateChart"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2CreateOwnedResourcePermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:DeleteChart",
+ "sqlworkbench:DeleteConnection",
+ "sqlworkbench:DeleteSavedQuery",
+ "sqlworkbench:GetChart",
+ "sqlworkbench:GetConnection",
+ "sqlworkbench:GetSavedQuery",
+ "sqlworkbench:ListSavedQueryVersions",
+ "sqlworkbench:UpdateChart",
+ "sqlworkbench:UpdateConnection",
+ "sqlworkbench:UpdateSavedQuery",
+ "sqlworkbench:AssociateConnectionWithTab",
+ "sqlworkbench:AssociateQueryWithTab",
+ "sqlworkbench:AssociateConnectionWithChart",
+ "sqlworkbench:UpdateFileFolder",
+ "sqlworkbench:ListTagsForResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2OwnerSpecificPermissions"
+ },
+ {
+ "Action": "sqlworkbench:TagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-resource-owner"
+ },
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-resource-owner": "${aws:userid}",
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TagOnlyUserIdPermissions"
+ },
+ {
+ "Action": [
+ "sqlworkbench:GetChart",
+ "sqlworkbench:GetConnection",
+ "sqlworkbench:GetSavedQuery",
+ "sqlworkbench:ListSavedQueryVersions",
+ "sqlworkbench:ListTagsForResource",
+ "sqlworkbench:UpdateChart",
+ "sqlworkbench:UpdateConnection",
+ "sqlworkbench:UpdateSavedQuery",
+ "sqlworkbench:AssociateConnectionWithTab",
+ "sqlworkbench:AssociateQueryWithTab",
+ "sqlworkbench:AssociateConnectionWithChart"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-team": "${aws:PrincipalTag/sqlworkbench-team}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TeamReadWriteAccessPermissions"
+ },
+ {
+ "Action": "sqlworkbench:TagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-team"
+ },
+ "StringEquals": {
+ "aws:RequestTag/sqlworkbench-team": "${aws:PrincipalTag/sqlworkbench-team}",
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2TagOnlyTeamPermissions"
+ },
+ {
+ "Action": "sqlworkbench:UntagResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "sqlworkbench-team"
+ },
+ "StringEquals": {
+ "aws:ResourceTag/sqlworkbench-resource-owner": "${aws:userid}"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AmazonRedshiftQueryEditorV2UntagOnlyTeamPermissions"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LIWZX3BPO",
+ "PolicyName": "AmazonRedshiftQueryEditorV2ReadWriteSharing",
+ "UpdateDate": "2022-02-23T17:02:35+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRedshiftReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRedshiftReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:51+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "redshift:Describe*",
+ "redshift:ViewQueriesInConsole",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeInternetGateways",
+ "sns:Get*",
+ "sns:List*",
+ "cloudwatch:Describe*",
+ "cloudwatch:List*",
+ "cloudwatch:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIGD46KSON64QBSEZM",
+ "PolicyName": "AmazonRedshiftReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:51+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRedshiftServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonRedshiftServiceLinkedRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-09-18T19:19:45+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeAddresses",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:ModifyVpcEndpoint"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/redshift/*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRedshiftCloudwatchLogGroups"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/redshift/*:log-stream:*"
+ ],
+ "Sid": "EnableCreationAndManagementOfRedshiftCloudwatchLogStreams"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:CreateRouteTable",
+ "ec2:AttachInternetGateway",
+ "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
+ "ec2:AssociateRouteTable",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:CreateRoute",
+ "ec2:CreateSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:ModifyVpcAttribute",
+ "ec2:CreateSubnet"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/Purpose": "RedshiftMigrateToVpc"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:route-table/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:internet-gateway/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateVpc",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSubnet"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/Purpose": "RedshiftMigrateToVpc"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:route-table/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:internet-gateway/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateVpc",
+ "CreateSecurityGroup",
+ "CreateSubnet",
+ "CreateInternetGateway",
+ "CreateRouteTable"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:route-table/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:vpc/*",
+ "arn:aws:ec2:*:*:internet-gateway/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroupRules",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeRouteTables"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPY2VXNRUYOY3SRZS",
+ "PolicyName": "AmazonRedshiftServiceLinkedRolePolicy",
+ "UpdateDate": "2021-11-22T21:08:22+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonRekognitionCustomLabelsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRekognitionCustomLabelsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-08T19:18:34+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:GetObjectTagging",
+ "s3:GetObjectVersion",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*custom-labels*"
+ },
+ {
+ "Action": [
+ "rekognition:CreateProject",
+ "rekognition:CreateProjectVersion",
+ "rekognition:StartProjectVersion",
+ "rekognition:StopProjectVersion",
+ "rekognition:DescribeProjects",
+ "rekognition:DescribeProjectVersions",
+ "rekognition:DetectCustomLabels",
+ "rekognition:DeleteProject",
+ "rekognition:DeleteProjectVersion",
+ "rekognition:TagResource",
+ "rekognition:UntagResource",
+ "rekognition:ListTagsForResource",
+ "rekognition:CreateDataset",
+ "rekognition:ListDatasetEntries",
+ "rekognition:ListDatasetLabels",
+ "rekognition:DescribeDataset",
+ "rekognition:UpdateDatasetEntries",
+ "rekognition:DistributeDatasetEntries",
+ "rekognition:DeleteDataset"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OJEQDEQQQ",
+ "PolicyName": "AmazonRekognitionCustomLabelsFullAccess",
+ "UpdateDate": "2021-11-03T02:53:05+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonRekognitionFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRekognitionFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T14:40:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rekognition:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWDAOK6AIFDVX6TT6",
+ "PolicyName": "AmazonRekognitionFullAccess",
+ "UpdateDate": "2016-11-30T14:40:44+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRekognitionReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRekognitionReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-30T14:58:06+00:00",
+ "DefaultVersionId": "v7",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rekognition:CompareFaces",
+ "rekognition:DetectFaces",
+ "rekognition:DetectLabels",
+ "rekognition:ListCollections",
+ "rekognition:ListFaces",
+ "rekognition:SearchFaces",
+ "rekognition:SearchFacesByImage",
+ "rekognition:DetectText",
+ "rekognition:GetCelebrityInfo",
+ "rekognition:RecognizeCelebrities",
+ "rekognition:DetectModerationLabels",
+ "rekognition:GetLabelDetection",
+ "rekognition:GetFaceDetection",
+ "rekognition:GetContentModeration",
+ "rekognition:GetPersonTracking",
+ "rekognition:GetCelebrityRecognition",
+ "rekognition:GetFaceSearch",
+ "rekognition:GetTextDetection",
+ "rekognition:GetSegmentDetection",
+ "rekognition:DescribeStreamProcessor",
+ "rekognition:ListStreamProcessors",
+ "rekognition:DescribeProjects",
+ "rekognition:DescribeProjectVersions",
+ "rekognition:DetectCustomLabels",
+ "rekognition:DetectProtectiveEquipment",
+ "rekognition:ListTagsForResource",
+ "rekognition:ListDatasetEntries",
+ "rekognition:ListDatasetLabels",
+ "rekognition:DescribeDataset"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILWSUHXUY4ES43SA4",
+ "PolicyName": "AmazonRekognitionReadOnlyAccess",
+ "UpdateDate": "2021-11-03T02:53:36+00:00",
+ "VersionId": "v7"
+ },
+ "AmazonRekognitionServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonRekognitionServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T16:52:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:AmazonRekognition*"
+ },
+ {
+ "Action": [
+ "kinesis:PutRecord",
+ "kinesis:PutRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kinesis:*:*:stream/AmazonRekognition*"
+ },
+ {
+ "Action": [
+ "kinesisvideo:GetDataEndpoint",
+ "kinesisvideo:GetMedia"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJI6Q3CUQAVBJ2CTE2",
+ "PolicyName": "AmazonRekognitionServiceRole",
+ "UpdateDate": "2017-11-29T16:52:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53AutoNamingFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53AutoNamingFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-01-18T18:40:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:GetHostedZone",
+ "route53:ListHostedZonesByName",
+ "route53:CreateHostedZone",
+ "route53:DeleteHostedZone",
+ "route53:ChangeResourceRecordSets",
+ "route53:CreateHealthCheck",
+ "route53:GetHealthCheck",
+ "route53:DeleteHealthCheck",
+ "route53:UpdateHealthCheck",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeRegions",
+ "servicediscovery:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJCNJBBLMJN2ZMV62Y",
+ "PolicyName": "AmazonRoute53AutoNamingFullAccess",
+ "UpdateDate": "2018-01-18T18:40:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53AutoNamingReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53AutoNamingReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-01-18T03:02:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "servicediscovery:Get*",
+ "servicediscovery:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBPMV2EFBFFKJ6SI4",
+ "PolicyName": "AmazonRoute53AutoNamingReadOnlyAccess",
+ "UpdateDate": "2018-01-18T03:02:59+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53AutoNamingRegistrantAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53AutoNamingRegistrantAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-12T22:33:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:GetHostedZone",
+ "route53:ListHostedZonesByName",
+ "route53:ChangeResourceRecordSets",
+ "route53:CreateHealthCheck",
+ "route53:GetHealthCheck",
+ "route53:DeleteHealthCheck",
+ "route53:UpdateHealthCheck",
+ "servicediscovery:Get*",
+ "servicediscovery:List*",
+ "servicediscovery:RegisterInstance",
+ "servicediscovery:DeregisterInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKXLG7EKP2O5SVZW6",
+ "PolicyName": "AmazonRoute53AutoNamingRegistrantAccess",
+ "UpdateDate": "2018-03-12T22:33:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53DomainsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53DomainsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:CreateHostedZone",
+ "route53domains:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPAFBMIYUILMOKL6G",
+ "PolicyName": "AmazonRoute53DomainsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:56+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53DomainsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53DomainsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53domains:Get*",
+ "route53domains:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIDRINP6PPTRXYVQCI",
+ "PolicyName": "AmazonRoute53DomainsReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:40:57+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53FullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:54+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:*",
+ "route53domains:*",
+ "cloudfront:ListDistributions",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticbeanstalk:DescribeEnvironments",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetBucketWebsite",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeRegions",
+ "sns:ListTopics",
+ "sns:ListSubscriptionsByTopic",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "apigateway:GET",
+ "Effect": "Allow",
+ "Resource": "arn:aws:apigateway:*::/domainnames"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWVDLG5RPST6PHQ3A",
+ "PolicyName": "AmazonRoute53FullAccess",
+ "UpdateDate": "2018-12-20T21:42:00+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonRoute53ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:55+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53:Get*",
+ "route53:List*",
+ "route53:TestDNSAnswer"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITOYK2ZAOQFXV2JNC",
+ "PolicyName": "AmazonRoute53ReadOnlyAccess",
+ "UpdateDate": "2016-11-15T21:15:16+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRoute53RecoveryClusterFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryClusterFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T18:37:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-cluster:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MMWM2PHKW",
+ "PolicyName": "AmazonRoute53RecoveryClusterFullAccess",
+ "UpdateDate": "2021-08-18T18:37:00+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53RecoveryClusterReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryClusterReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T17:36:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-cluster:GetRoutingControlState"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PNOFP2E23",
+ "PolicyName": "AmazonRoute53RecoveryClusterReadOnlyAccess",
+ "UpdateDate": "2021-08-18T17:36:01+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53RecoveryControlConfigFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryControlConfigFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T17:48:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-control-config:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BNPPOPVZM",
+ "PolicyName": "AmazonRoute53RecoveryControlConfigFullAccess",
+ "UpdateDate": "2021-08-18T17:48:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53RecoveryControlConfigReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryControlConfigReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T18:01:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-control-config:DescribeCluster",
+ "route53-recovery-control-config:DescribeControlPanel",
+ "route53-recovery-control-config:DescribeRoutingControl",
+ "route53-recovery-control-config:DescribeRoutingControlByName",
+ "route53-recovery-control-config:DescribeSafetyRule",
+ "route53-recovery-control-config:ListAssociatedRoute53HealthChecks",
+ "route53-recovery-control-config:ListClusters",
+ "route53-recovery-control-config:ListControlPanels",
+ "route53-recovery-control-config:ListRoutingControls",
+ "route53-recovery-control-config:ListSafetyRules",
+ "route53-recovery-control-config:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DBQWX62W5",
+ "PolicyName": "AmazonRoute53RecoveryControlConfigReadOnlyAccess",
+ "UpdateDate": "2021-12-09T23:38:51+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRoute53RecoveryReadinessFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryReadinessFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T16:45:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-readiness:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AP3B2MSA3",
+ "PolicyName": "AmazonRoute53RecoveryReadinessFullAccess",
+ "UpdateDate": "2021-08-18T16:45:07+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonRoute53RecoveryReadinessReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53RecoveryReadinessReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T18:11:33+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53-recovery-readiness:GetCell",
+ "route53-recovery-readiness:GetReadinessCheck",
+ "route53-recovery-readiness:GetReadinessCheckResourceStatus",
+ "route53-recovery-readiness:GetReadinessCheckStatus",
+ "route53-recovery-readiness:GetRecoveryGroup",
+ "route53-recovery-readiness:GetRecoveryGroupReadinessSummary",
+ "route53-recovery-readiness:GetResourceSet",
+ "route53-recovery-readiness:ListCells",
+ "route53-recovery-readiness:ListCrossAccountAuthorizations",
+ "route53-recovery-readiness:ListReadinessChecks",
+ "route53-recovery-readiness:ListRecoveryGroups",
+ "route53-recovery-readiness:ListResourceSets",
+ "route53-recovery-readiness:ListRules",
+ "route53-recovery-readiness:ListTagsForResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "route53-recovery-readiness:GetArchitectureRecommendations",
+ "route53-recovery-readiness:GetCellReadinessSummary"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53-recovery-readiness::*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M6P5L3S4F",
+ "PolicyName": "AmazonRoute53RecoveryReadinessReadOnlyAccess",
+ "UpdateDate": "2021-11-09T20:14:51+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRoute53ResolverFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53ResolverFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-30T18:10:50+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53resolver:*",
+ "ec2:DescribeSubnets",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeAvailabilityZones"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MZN2MQCY3",
+ "PolicyName": "AmazonRoute53ResolverFullAccess",
+ "UpdateDate": "2020-07-17T19:03:27+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonRoute53ResolverReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonRoute53ResolverReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-30T18:11:31+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "route53resolver:Get*",
+ "route53resolver:List*",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CARVKYCWY",
+ "PolicyName": "AmazonRoute53ResolverReadOnlyAccess",
+ "UpdateDate": "2019-09-27T16:37:48+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonS3FullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3FullAccess",
+ "AttachmentCount": 3,
+ "CreateDate": "2015-02-06T18:40:58+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:*",
+ "s3-object-lambda:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFIR6V6BVTRAHWINE",
+ "PolicyName": "AmazonS3FullAccess",
+ "UpdateDate": "2021-09-27T20:16:37+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonS3ObjectLambdaExecutionRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-18T10:07:41+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "s3-object-lambda:WriteGetObjectResponse"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PG47VBSXA",
+ "PolicyName": "AmazonS3ObjectLambdaExecutionRolePolicy",
+ "UpdateDate": "2021-08-18T10:07:41+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonS3OutpostsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3OutpostsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-02T17:26:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "s3-outposts:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "datasync:ListTasks",
+ "datasync:ListLocations",
+ "datasync:DescribeTask",
+ "datasync:DescribeLocation*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeNetworkInterfaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "outposts:ListOutposts",
+ "outposts:GetOutpost"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BKMLUXKOR",
+ "PolicyName": "AmazonS3OutpostsFullAccess",
+ "UpdateDate": "2020-10-02T17:26:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonS3OutpostsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3OutpostsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-02T18:55:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3-outposts:Get*",
+ "s3-outposts:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "datasync:ListTasks",
+ "datasync:ListLocations",
+ "datasync:DescribeTask",
+ "datasync:DescribeLocation*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeNetworkInterfaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "outposts:ListOutposts",
+ "outposts:GetOutpost"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PJ2AX4CUB",
+ "PolicyName": "AmazonS3OutpostsReadOnlyAccess",
+ "UpdateDate": "2020-10-02T18:55:58+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonS3ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess",
+ "AttachmentCount": 2,
+ "CreateDate": "2015-02-06T18:40:59+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:Get*",
+ "s3:List*",
+ "s3-object-lambda:Get*",
+ "s3-object-lambda:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZTJ4DXE7G6AGAE6M",
+ "PolicyName": "AmazonS3ReadOnlyAccess",
+ "UpdateDate": "2021-09-27T20:24:58+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSESFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSESFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ2P4NXCHAT7NDPNR4",
+ "PolicyName": "AmazonSESFullAccess",
+ "UpdateDate": "2015-02-06T18:41:02+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSESReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSESReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:03+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:Get*",
+ "ses:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINV2XPFRMWJJNSCGI",
+ "PolicyName": "AmazonSESReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:03+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSNSFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWEKLCXXUNT2SOLSG",
+ "PolicyName": "AmazonSNSFullAccess",
+ "UpdateDate": "2015-02-06T18:41:05+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSNSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:GetTopicAttributes",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIZGQCQTFOFPMHSB6W",
+ "PolicyName": "AmazonSNSReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSNSRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSNSRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:30+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJK5GQB7CIK7KHY2GA",
+ "PolicyName": "AmazonSNSRole",
+ "UpdateDate": "2015-02-06T18:41:30+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSQSFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSQSFullAccess",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-02-06T18:41:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI65L554VRJ33ECQS6",
+ "PolicyName": "AmazonSQSFullAccess",
+ "UpdateDate": "2015-02-06T18:41:07+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSQSReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSQSReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:08+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sqs:ListDeadLetterSourceQueues",
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUGSSQY362XGCM6KW",
+ "PolicyName": "AmazonSQSReadOnlyAccess",
+ "UpdateDate": "2018-08-20T23:35:49+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSSMAutomationApproverAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMAutomationApproverAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-08-07T23:07:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAutomationExecutions",
+ "ssm:GetAutomationExecution",
+ "ssm:SendAutomationSignal"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIDSSXIRWBSLWWIORC",
+ "PolicyName": "AmazonSSMAutomationApproverAccess",
+ "UpdateDate": "2017-08-07T23:07:28+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMAutomationRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-05T22:09:55+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:Automation*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateImage",
+ "ec2:CopyImage",
+ "ec2:DeregisterImage",
+ "ec2:DescribeImages",
+ "ec2:DeleteSnapshot",
+ "ec2:StartInstances",
+ "ec2:RunInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:DescribeTags",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks",
+ "cloudformation:UpdateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:Automation*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJIBQCTBCXD2XRNB6W",
+ "PolicyName": "AmazonSSMAutomationRole",
+ "UpdateDate": "2017-07-24T23:29:12+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonSSMDirectoryServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMDirectoryServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-15T17:44:38+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:CreateComputer",
+ "ds:DescribeDirectories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ7OJQH3CZU674ERII",
+ "PolicyName": "AmazonSSMDirectoryServiceAccess",
+ "UpdateDate": "2019-03-15T17:44:38+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-05-29T17:39:47+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ds:CreateComputer",
+ "ds:DescribeDirectories",
+ "ec2:DescribeInstanceStatus",
+ "logs:*",
+ "ssm:*",
+ "ec2messages:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "ssm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM*"
+ },
+ {
+ "Action": [
+ "ssmmessages:CreateControlChannel",
+ "ssmmessages:CreateDataChannel",
+ "ssmmessages:OpenControlChannel",
+ "ssmmessages:OpenDataChannel"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJA7V6HI4ISQFMDYAG",
+ "PolicyName": "AmazonSSMFullAccess",
+ "UpdateDate": "2019-11-20T20:08:56+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonSSMMaintenanceWindowRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSSMMaintenanceWindowRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-01T15:57:54+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:GetAutomationExecution",
+ "ssm:GetParameters",
+ "ssm:ListCommands",
+ "ssm:SendCommand",
+ "ssm:StartAutomationExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:SSM*",
+ "arn:aws:lambda:*:*:function:*:SSM*"
+ ]
+ },
+ {
+ "Action": [
+ "states:DescribeExecution",
+ "states:StartExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:states:*:*:stateMachine:SSM*",
+ "arn:aws:states:*:*:execution:SSM*"
+ ]
+ },
+ {
+ "Action": [
+ "resource-groups:ListGroups",
+ "resource-groups:ListGroupResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJV3JNYSTZ47VOXYME",
+ "PolicyName": "AmazonSSMMaintenanceWindowRole",
+ "UpdateDate": "2019-07-27T00:16:05+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonSSMManagedInstanceCore": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-15T17:22:12+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:DescribeAssociation",
+ "ssm:GetDeployablePatchSnapshotForInstance",
+ "ssm:GetDocument",
+ "ssm:DescribeDocument",
+ "ssm:GetManifest",
+ "ssm:GetParameter",
+ "ssm:GetParameters",
+ "ssm:ListAssociations",
+ "ssm:ListInstanceAssociations",
+ "ssm:PutInventory",
+ "ssm:PutComplianceItems",
+ "ssm:PutConfigurePackageResult",
+ "ssm:UpdateAssociationStatus",
+ "ssm:UpdateInstanceAssociationStatus",
+ "ssm:UpdateInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssmmessages:CreateControlChannel",
+ "ssmmessages:CreateDataChannel",
+ "ssmmessages:OpenControlChannel",
+ "ssmmessages:OpenDataChannel"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2messages:AcknowledgeMessage",
+ "ec2messages:DeleteMessage",
+ "ec2messages:FailMessage",
+ "ec2messages:GetEndpoint",
+ "ec2messages:GetMessages",
+ "ec2messages:SendReply"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXSHM2BNB2D3AXXRU",
+ "PolicyName": "AmazonSSMManagedInstanceCore",
+ "UpdateDate": "2019-05-23T16:54:21+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSSMPatchAssociation": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMPatchAssociation",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-13T16:00:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ssm:DescribeEffectivePatchesForPatchBaseline",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:patchbaseline/*"
+ },
+ {
+ "Action": "ssm:GetPatchBaseline",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:patchbaseline/*"
+ },
+ {
+ "Action": "tag:GetResources",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:DescribePatchBaselines",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EWLEL5ZX7",
+ "PolicyName": "AmazonSSMPatchAssociation",
+ "UpdateDate": "2020-05-13T16:00:42+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess",
+ "AttachmentCount": 1,
+ "CreateDate": "2015-05-29T17:44:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:Describe*",
+ "ssm:Get*",
+ "ssm:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJODSKQGGJTHRYZ5FC",
+ "PolicyName": "AmazonSSMReadOnlyAccess",
+ "UpdateDate": "2015-05-29T17:44:19+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSSMServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonSSMServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-13T19:20:08+00:00",
+ "DefaultVersionId": "v13",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation",
+ "ssm:ListCommandInvocations",
+ "ssm:ListCommands",
+ "ssm:SendCommand",
+ "ssm:GetAutomationExecution",
+ "ssm:GetParameters",
+ "ssm:StartAutomationExecution",
+ "ssm:ListTagsForResource",
+ "ssm:GetCalendarState"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:UpdateServiceSetting",
+ "ssm:GetServiceSetting"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*:*:servicesetting/ssm/opsitem/*",
+ "arn:aws:ssm:*:*:servicesetting/ssm/opsdata/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:SSM*",
+ "arn:aws:lambda:*:*:function:*:SSM*"
+ ]
+ },
+ {
+ "Action": [
+ "states:DescribeExecution",
+ "states:StartExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:states:*:*:stateMachine:SSM*",
+ "arn:aws:states:*:*:execution:SSM*"
+ ]
+ },
+ {
+ "Action": [
+ "resource-groups:ListGroups",
+ "resource-groups:ListGroupResources",
+ "resource-groups:GetGroupQuery"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "config:SelectResourceConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "compute-optimizer:GetEC2InstanceRecommendations",
+ "compute-optimizer:GetEnrollmentStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "support:DescribeTrustedAdvisorChecks",
+ "support:DescribeTrustedAdvisorCheckSummaries",
+ "support:DescribeTrustedAdvisorCheckResult",
+ "support:DescribeCases"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "config:DescribeComplianceByConfigRule",
+ "config:DescribeComplianceByResource",
+ "config:DescribeRemediationConfigurations",
+ "config:DescribeConfigurationRecorders"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ssm.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "organizations:DescribeOrganization",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudformation:ListStackSets",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:ListStackInstances",
+ "cloudformation:DescribeStackSetOperation",
+ "cloudformation:DeleteStackSet"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stackset/AWS-QuickSetup-SSM*:*"
+ },
+ {
+ "Action": "cloudformation:DeleteStackInstances",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stackset/AWS-QuickSetup-SSM*:*",
+ "arn:aws:cloudformation:*:*:stackset-target/AWS-QuickSetup-SSM*:*",
+ "arn:aws:cloudformation:*:*:type/resource/*"
+ ]
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "ssm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "events:RemoveTargets",
+ "events:DeleteRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/SSMExplorerManagedRule"
+ ]
+ },
+ {
+ "Action": "events:DescribeRule",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "securityhub:DescribeHub",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXJ26NUGBA3TCV7EC",
+ "PolicyName": "AmazonSSMServiceRolePolicy",
+ "UpdateDate": "2021-04-26T20:43:46+00:00",
+ "VersionId": "v13"
+ },
+ "AmazonSageMakerAdmin-ServiceCatalogProductsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerAdmin-ServiceCatalogProductsServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2020-11-27T18:48:07+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "apigateway:GET",
+ "apigateway:POST",
+ "apigateway:PUT",
+ "apigateway:PATCH",
+ "apigateway:DELETE"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/sagemaker:launch-source": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:POST"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "aws:TagKeys": [
+ "sagemaker:launch-source"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:PATCH"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/account"
+ ]
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:UpdateStack",
+ "cloudformation:DeleteStack"
+ ],
+ "Condition": {
+ "ArnLikeIfExists": {
+ "cloudformation:RoleArn": [
+ "arn:aws:sts::*:assumed-role/AmazonSageMakerServiceCatalog*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/SC-*"
+ },
+ {
+ "Action": [
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/SC-*"
+ },
+ {
+ "Action": [
+ "cloudformation:GetTemplateSummary",
+ "cloudformation:ValidateTemplate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codebuild:CreateProject",
+ "codebuild:DeleteProject",
+ "codebuild:UpdateProject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codebuild:*:*:project/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "codecommit:CreateCommit",
+ "codecommit:CreateRepository",
+ "codecommit:DeleteRepository",
+ "codecommit:GetRepository",
+ "codecommit:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codecommit:*:*:sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "codecommit:ListRepositories"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "codepipeline:CreatePipeline",
+ "codepipeline:DeletePipeline",
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineState",
+ "codepipeline:StartPipelineExecution",
+ "codepipeline:TagResource",
+ "codepipeline:UpdatePipeline"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codepipeline:*:*:sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "cognito-idp:CreateUserPool",
+ "cognito-idp:TagResource"
+ ],
+ "Condition": {
+ "ForAnyValue:StringLike": {
+ "aws:TagKeys": [
+ "sagemaker:launch-source"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cognito-idp:CreateGroup",
+ "cognito-idp:CreateUserPoolDomain",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:DeleteGroup",
+ "cognito-idp:DeleteUserPool",
+ "cognito-idp:DeleteUserPoolClient",
+ "cognito-idp:DeleteUserPoolDomain",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:UpdateUserPool",
+ "cognito-idp:UpdateUserPoolClient"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/sagemaker:launch-source": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ecr:CreateRepository",
+ "ecr:DeleteRepository"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ecr:*:*:repository/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:DeleteRule",
+ "events:DisableRule",
+ "events:EnableRule",
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "firehose:CreateDeliveryStream",
+ "firehose:DeleteDeliveryStream",
+ "firehose:DescribeDeliveryStream",
+ "firehose:StartDeliveryStreamEncryption",
+ "firehose:StopDeliveryStreamEncryption",
+ "firehose:UpdateDestination"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:firehose:*:*:deliverystream/sagemaker-*"
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:DeleteDatabase"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/sagemaker-*",
+ "arn:aws:glue:*:*:table/sagemaker-*",
+ "arn:aws:glue:*:*:userDefinedFunction/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateClassifier",
+ "glue:DeleteClassifier",
+ "glue:DeleteCrawler",
+ "glue:DeleteJob",
+ "glue:DeleteTrigger",
+ "glue:DeleteWorkflow",
+ "glue:StopCrawler"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateWorkflow"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:workflow/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateJob"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:job/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateCrawler",
+ "glue:GetCrawler"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:crawler/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateTrigger",
+ "glue:GetTrigger"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:trigger/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AmazonSageMakerServiceCatalog*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:GetFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:InvokeFunction",
+ "lambda:RemovePermission"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DeleteLogGroup",
+ "logs:DeleteLogStream",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/apigateway/AccessLogs/*",
+ "arn:aws:logs:*:*:log-group::log-stream:*"
+ ]
+ },
+ {
+ "Action": "s3:GetObject",
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/servicecatalog:provisioning": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteBucketPolicy",
+ "s3:GetBucketPolicy",
+ "s3:PutBucketAcl",
+ "s3:PutBucketNotification",
+ "s3:PutBucketPolicy",
+ "s3:PutBucketPublicAccessBlock",
+ "s3:PutBucketLogging",
+ "s3:PutEncryptionConfiguration",
+ "s3:PutBucketCORS",
+ "s3:PutBucketTagging",
+ "s3:PutObjectTagging"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::sagemaker-*"
+ },
+ {
+ "Action": [
+ "sagemaker:CreateEndpoint",
+ "sagemaker:CreateEndpointConfig",
+ "sagemaker:CreateModel",
+ "sagemaker:CreateWorkteam",
+ "sagemaker:DeleteEndpoint",
+ "sagemaker:DeleteEndpointConfig",
+ "sagemaker:DeleteModel",
+ "sagemaker:DeleteWorkteam",
+ "sagemaker:DescribeModel",
+ "sagemaker:DescribeEndpointConfig",
+ "sagemaker:DescribeEndpoint",
+ "sagemaker:DescribeWorkteam",
+ "sagemaker:CreateCodeRepository",
+ "sagemaker:DescribeCodeRepository",
+ "sagemaker:UpdateCodeRepository",
+ "sagemaker:DeleteCodeRepository"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:*"
+ ]
+ },
+ {
+ "Action": [
+ "sagemaker:CreateImage",
+ "sagemaker:DeleteImage",
+ "sagemaker:DescribeImage",
+ "sagemaker:UpdateImage",
+ "sagemaker:ListTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:image/*"
+ ]
+ },
+ {
+ "Action": [
+ "states:CreateStateMachine",
+ "states:DeleteStateMachine",
+ "states:UpdateStateMachine"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:states:*:*:stateMachine:sagemaker-*"
+ ]
+ },
+ {
+ "Action": "codestar-connections:PassConnection",
+ "Condition": {
+ "StringEquals": {
+ "codestar-connections:PassedToService": "codepipeline.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:codestar-connections:*:*:connection/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NAOSKQH4V",
+ "PolicyName": "AmazonSageMakerAdmin-ServiceCatalogProductsServiceRolePolicy",
+ "UpdateDate": "2022-02-16T19:52:11+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonSageMakerCoreServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonSageMakerCoreServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-21T21:40:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterfacePermission"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:AuthorizedService": "sagemaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MMWQCSNKX",
+ "PolicyName": "AmazonSageMakerCoreServiceRolePolicy",
+ "UpdateDate": "2020-12-21T21:40:47+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerEdgeDeviceFleetPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSageMakerEdgeDeviceFleetPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-08T16:17:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*sagemaker*"
+ ],
+ "Sid": "DeviceS3Access"
+ },
+ {
+ "Action": [
+ "sagemaker:SendHeartbeat",
+ "sagemaker:GetDeviceRegistration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SageMakerEdgeApis"
+ },
+ {
+ "Action": [
+ "iot:CreateRoleAlias",
+ "iot:DescribeRoleAlias",
+ "iot:UpdateRoleAlias",
+ "iot:ListTagsForResource",
+ "iot:TagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iot:*:*:rolealias/SageMakerEdge*"
+ ],
+ "Sid": "CreateIoTRoleAlias"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*SageMaker*",
+ "arn:aws:iam::*:role/*Sagemaker*",
+ "arn:aws:iam::*:role/*sagemaker*"
+ ],
+ "Sid": "CreateIoTRoleAliasIamPermissionsGetRole"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": [
+ "iot.amazonaws.com",
+ "credentials.iot.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/*SageMaker*",
+ "arn:aws:iam::*:role/*Sagemaker*",
+ "arn:aws:iam::*:role/*sagemaker*"
+ ],
+ "Sid": "CreateIoTRoleAliasIamPermissionsPassRole"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CPENAJLBT",
+ "PolicyName": "AmazonSageMakerEdgeDeviceFleetPolicy",
+ "UpdateDate": "2020-12-08T16:17:22+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerFeatureStoreAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerFeatureStoreAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-01T16:24:05+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:GetBucketAcl",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*sagemaker*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FO5MQNGJU",
+ "PolicyName": "AmazonSageMakerFeatureStoreAccess",
+ "UpdateDate": "2021-02-24T02:18:50+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonSageMakerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T13:07:59+00:00",
+ "DefaultVersionId": "v21",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:*"
+ ],
+ "Effect": "Allow",
+ "NotResource": [
+ "arn:aws:sagemaker:*:*:domain/*",
+ "arn:aws:sagemaker:*:*:user-profile/*",
+ "arn:aws:sagemaker:*:*:app/*",
+ "arn:aws:sagemaker:*:*:flow-definition/*"
+ ]
+ },
+ {
+ "Action": [
+ "sagemaker:CreatePresignedDomainUrl",
+ "sagemaker:DescribeDomain",
+ "sagemaker:ListDomains",
+ "sagemaker:DescribeUserProfile",
+ "sagemaker:ListUserProfiles",
+ "sagemaker:*App",
+ "sagemaker:ListApps"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "sagemaker:*",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "sagemaker:WorkteamType": [
+ "private-crowd",
+ "vendor-crowd"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sagemaker:*:*:flow-definition/*"
+ ]
+ },
+ {
+ "Action": [
+ "application-autoscaling:DeleteScalingPolicy",
+ "application-autoscaling:DeleteScheduledAction",
+ "application-autoscaling:DeregisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:DescribeScheduledActions",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:PutScheduledAction",
+ "application-autoscaling:RegisterScalableTarget",
+ "aws-marketplace:ViewSubscriptions",
+ "cloudformation:GetTemplateSummary",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:PutMetricData",
+ "codecommit:BatchGetRepositories",
+ "codecommit:CreateRepository",
+ "codecommit:GetRepository",
+ "codecommit:List*",
+ "cognito-idp:AdminAddUserToGroup",
+ "cognito-idp:AdminCreateUser",
+ "cognito-idp:AdminDeleteUser",
+ "cognito-idp:AdminDisableUser",
+ "cognito-idp:AdminEnableUser",
+ "cognito-idp:AdminRemoveUserFromGroup",
+ "cognito-idp:CreateGroup",
+ "cognito-idp:CreateUserPool",
+ "cognito-idp:CreateUserPoolClient",
+ "cognito-idp:CreateUserPoolDomain",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:List*",
+ "cognito-idp:UpdateUserPool",
+ "cognito-idp:UpdateUserPoolClient",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:BatchGetImage",
+ "ecr:CreateRepository",
+ "ecr:Describe*",
+ "ecr:GetAuthorizationToken",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:StartImageScan",
+ "elastic-inference:Connect",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeMountTargets",
+ "fsx:DescribeFileSystems",
+ "glue:CreateJob",
+ "glue:DeleteJob",
+ "glue:GetJob*",
+ "glue:GetTable*",
+ "glue:GetWorkflowRun",
+ "glue:ResetJobBookmark",
+ "glue:StartJobRun",
+ "glue:StartWorkflowRun",
+ "glue:UpdateJob",
+ "groundtruthlabeling:*",
+ "iam:ListRoles",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "lambda:ListFunctions",
+ "logs:CreateLogDelivery",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DeleteLogDelivery",
+ "logs:Describe*",
+ "logs:GetLogDelivery",
+ "logs:GetLogEvents",
+ "logs:ListLogDeliveries",
+ "logs:PutLogEvents",
+ "logs:PutResourcePolicy",
+ "logs:UpdateLogDelivery",
+ "robomaker:CreateSimulationApplication",
+ "robomaker:DescribeSimulationApplication",
+ "robomaker:DeleteSimulationApplication",
+ "robomaker:CreateSimulationJob",
+ "robomaker:DescribeSimulationJob",
+ "robomaker:CancelSimulationJob",
+ "secretsmanager:ListSecrets",
+ "servicecatalog:Describe*",
+ "servicecatalog:List*",
+ "servicecatalog:ScanProvisionedProducts",
+ "servicecatalog:SearchProducts",
+ "servicecatalog:SearchProvisionedProducts",
+ "sns:ListTopics",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ecr:SetRepositoryPolicy",
+ "ecr:CompleteLayerUpload",
+ "ecr:BatchDeleteImage",
+ "ecr:UploadLayerPart",
+ "ecr:DeleteRepositoryPolicy",
+ "ecr:InitiateLayerUpload",
+ "ecr:DeleteRepository",
+ "ecr:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ecr:*:*:repository/*sagemaker*"
+ ]
+ },
+ {
+ "Action": [
+ "codecommit:GitPull",
+ "codecommit:GitPush"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codecommit:*:*:*sagemaker*",
+ "arn:aws:codecommit:*:*:*SageMaker*",
+ "arn:aws:codecommit:*:*:*Sagemaker*"
+ ]
+ },
+ {
+ "Action": [
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codebuild:*:*:project/sagemaker*",
+ "arn:aws:codebuild:*:*:build/*"
+ ]
+ },
+ {
+ "Action": [
+ "states:DescribeExecution",
+ "states:GetExecutionHistory",
+ "states:StartExecution",
+ "states:StopExecution",
+ "states:UpdateStateMachine"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:states:*:*:statemachine:*sagemaker*",
+ "arn:aws:states:*:*:execution:*sagemaker*:*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:CreateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:secretsmanager:*:*:secret:AmazonSageMaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:GetSecretValue"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "secretsmanager:ResourceTag/SageMaker": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:ProvisionProduct"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "servicecatalog:TerminateProvisionedProduct",
+ "servicecatalog:UpdateProvisionedProduct"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "servicecatalog:userLevel": "self"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:DeleteObject",
+ "s3:AbortMultipartUpload"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*sagemaker*",
+ "arn:aws:s3:::*aws-glue*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/SageMaker": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "s3:ExistingObjectTag/servicecatalog:provisioning": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:GetBucketLocation",
+ "s3:ListBucket",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketCors",
+ "s3:PutBucketCors"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketAcl",
+ "s3:PutObjectAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*sagemaker*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*SageMaker*",
+ "arn:aws:lambda:*:*:function:*sagemaker*",
+ "arn:aws:lambda:*:*:function:*Sagemaker*",
+ "arn:aws:lambda:*:*:function:*LabelingFunction*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "sagemaker.application-autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/sagemaker.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_SageMakerEndpoint"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "robomaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:Subscribe",
+ "sns:CreateTopic",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:*SageMaker*",
+ "arn:aws:sns:*:*:*Sagemaker*",
+ "arn:aws:sns:*:*:*sagemaker*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "glue.amazonaws.com",
+ "robomaker.amazonaws.com",
+ "states.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*AmazonSageMaker*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "sagemaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ },
+ {
+ "Action": [
+ "athena:ListDataCatalogs",
+ "athena:ListDatabases",
+ "athena:ListTableMetadata",
+ "athena:GetQueryExecution",
+ "athena:GetQueryResults",
+ "athena:StartQueryExecution",
+ "athena:StopQueryExecution"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:table/*/sagemaker_tmp_*",
+ "arn:aws:glue:*:*:table/sagemaker_featurestore/*",
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:DeleteTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:table/*/sagemaker_tmp_*",
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:GetDatabases",
+ "glue:GetTable",
+ "glue:GetTables"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:table/*",
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:GetDatabase"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/sagemaker_featurestore",
+ "arn:aws:glue:*:*:database/sagemaker_processing",
+ "arn:aws:glue:*:*:database/default",
+ "arn:aws:glue:*:*:database/sagemaker_data_wrangler"
+ ]
+ },
+ {
+ "Action": [
+ "redshift-data:ExecuteStatement",
+ "redshift-data:DescribeStatement",
+ "redshift-data:CancelStatement",
+ "redshift-data:GetStatementResult",
+ "redshift-data:ListSchemas",
+ "redshift-data:ListTables"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "redshift:GetClusterCredentials"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:redshift:*:*:dbuser:*/sagemaker_access*",
+ "arn:aws:redshift:*:*:dbname:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZ5IWYMXO5QDB4QOG",
+ "PolicyName": "AmazonSageMakerFullAccess",
+ "UpdateDate": "2021-09-08T17:12:25+00:00",
+ "VersionId": "v21"
+ },
+ "AmazonSageMakerGroundTruthExecution": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerGroundTruthExecution",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-07-09T19:30:20+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*GtRecipe*",
+ "arn:aws:lambda:*:*:function:*LabelingFunction*",
+ "arn:aws:lambda:*:*:function:*SageMaker*",
+ "arn:aws:lambda:*:*:function:*sagemaker*",
+ "arn:aws:lambda:*:*:function:*Sagemaker*"
+ ],
+ "Sid": "CustomLabelingJobs"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:GetObject",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*GroundTruth*",
+ "arn:aws:s3:::*Groundtruth*",
+ "arn:aws:s3:::*groundtruth*",
+ "arn:aws:s3:::*SageMaker*",
+ "arn:aws:s3:::*Sagemaker*",
+ "arn:aws:s3:::*sagemaker*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Condition": {
+ "StringEqualsIgnoreCase": {
+ "s3:ExistingObjectTag/SageMaker": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogStreams",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatch"
+ },
+ {
+ "Action": [
+ "sqs:CreateQueue",
+ "sqs:DeleteMessage",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sqs:ReceiveMessage",
+ "sqs:SendMessage",
+ "sqs:SendMessageBatch",
+ "sqs:SetQueueAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sqs:*:*:*GroundTruth*",
+ "Sid": "StreamingQueue"
+ },
+ {
+ "Action": "sns:Subscribe",
+ "Condition": {
+ "StringEquals": {
+ "sns:Protocol": "sqs"
+ },
+ "StringLike": {
+ "sns:Endpoint": "arn:aws:sqs:*:*:*GroundTruth*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:*GroundTruth*",
+ "arn:aws:sns:*:*:*Groundtruth*",
+ "arn:aws:sns:*:*:*groundTruth*",
+ "arn:aws:sns:*:*:*groundtruth*",
+ "arn:aws:sns:*:*:*SageMaker*",
+ "arn:aws:sns:*:*:*Sagemaker*",
+ "arn:aws:sns:*:*:*sageMaker*",
+ "arn:aws:sns:*:*:*sagemaker*"
+ ],
+ "Sid": "StreamingTopicSubscribe"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sns:*:*:*GroundTruth*",
+ "arn:aws:sns:*:*:*Groundtruth*",
+ "arn:aws:sns:*:*:*groundTruth*",
+ "arn:aws:sns:*:*:*groundtruth*",
+ "arn:aws:sns:*:*:*SageMaker*",
+ "arn:aws:sns:*:*:*Sagemaker*",
+ "arn:aws:sns:*:*:*sageMaker*",
+ "arn:aws:sns:*:*:*sagemaker*"
+ ],
+ "Sid": "StreamingTopic"
+ },
+ {
+ "Action": [
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "StreamingTopicUnsubscribe"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FYNFSJXO3",
+ "PolicyName": "AmazonSageMakerGroundTruthExecution",
+ "UpdateDate": "2020-07-09T19:30:20+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerMechanicalTurkAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerMechanicalTurkAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T16:19:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:*FlowDefinition",
+ "sagemaker:*FlowDefinitions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AYDBKMMDV",
+ "PolicyName": "AmazonSageMakerMechanicalTurkAccess",
+ "UpdateDate": "2019-12-03T16:19:36+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerNotebooksServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonSageMakerNotebooksServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2019-10-18T20:27:37+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "elasticfilesystem:CreateFileSystem",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/ManagedByAmazonSageMakerResource": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:CreateMountTarget",
+ "elasticfilesystem:DeleteFileSystem",
+ "elasticfilesystem:DeleteMountTarget"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/ManagedByAmazonSageMakerResource": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeMountTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/ManagedByAmazonSageMakerResource": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sso:CreateManagedApplicationInstance",
+ "sso:DeleteManagedApplicationInstance",
+ "sso:GetManagedApplicationInstance"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:CreateUserProfile",
+ "sagemaker:DescribeUserProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MYB7OEJED",
+ "PolicyName": "AmazonSageMakerNotebooksServiceRolePolicy",
+ "UpdateDate": "2020-08-28T22:39:39+00:00",
+ "VersionId": "v5"
+ },
+ "AmazonSageMakerPipelinesIntegrations": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerPipelinesIntegrations",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-07-30T16:35:10+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:DeleteFunction",
+ "lambda:InvokeFunction",
+ "lambda:UpdateFunctionCode"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:*sagemaker*",
+ "arn:aws:lambda:*:*:function:*sageMaker*",
+ "arn:aws:lambda:*:*:function:*SageMaker*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:CreateQueue",
+ "sqs:SendMessage"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:sqs:*:*:*sagemaker*",
+ "arn:aws:sqs:*:*:*sageMaker*",
+ "arn:aws:sqs:*:*:*SageMaker*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lambda.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FK53JOAN3",
+ "PolicyName": "AmazonSageMakerPipelinesIntegrations",
+ "UpdateDate": "2021-07-30T16:35:10+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSageMakerReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T13:07:09+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sagemaker:Describe*",
+ "sagemaker:List*",
+ "sagemaker:BatchGetMetrics",
+ "sagemaker:GetDeviceRegistration",
+ "sagemaker:GetDeviceFleetReport",
+ "sagemaker:GetSearchSuggestions",
+ "sagemaker:BatchGetRecord",
+ "sagemaker:GetRecord",
+ "sagemaker:Search",
+ "sagemaker:QueryLineage",
+ "sagemaker:GetLineageGroupPolicy",
+ "sagemaker:BatchDescribeModelPackage",
+ "sagemaker:GetModelPackageGroupPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingActivities",
+ "application-autoscaling:DescribeScalingPolicies",
+ "application-autoscaling:DescribeScheduledActions",
+ "aws-marketplace:ViewSubscriptions",
+ "cloudwatch:DescribeAlarms",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:ListGroups",
+ "cognito-idp:ListIdentityProviders",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-idp:ListUserPools",
+ "cognito-idp:ListUsers",
+ "cognito-idp:ListUsersInGroup",
+ "ecr:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJTZ2FTFCQ6CFLQA2O",
+ "PolicyName": "AmazonSageMakerReadOnly",
+ "UpdateDate": "2021-12-01T16:29:20+00:00",
+ "VersionId": "v11"
+ },
+ "AmazonSageMakerServiceCatalogProductsCodePipelineServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsCodePipelineServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-22T09:53:17+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateChangeSet",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:UpdateStack"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/sagemaker-*"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/AmazonSageMakerServiceCatalogProductsCloudformationRole"
+ ]
+ },
+ {
+ "Action": [
+ "codebuild:BatchGetBuilds",
+ "codebuild:StartBuild"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:codebuild:*:*:project/sagemaker-*",
+ "arn:aws:codebuild:*:*:build/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "codecommit:CancelUploadArchive",
+ "codecommit:GetBranch",
+ "codecommit:GetCommit",
+ "codecommit:GetUploadArchiveStatus",
+ "codecommit:UploadArchive"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:codecommit:*:*:sagemaker-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CL3UG2EHM",
+ "PolicyName": "AmazonSageMakerServiceCatalogProductsCodePipelineServiceRolePolicy",
+ "UpdateDate": "2022-02-22T09:53:17+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerServiceCatalogProductsEventsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsEventsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-22T09:53:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "codepipeline:StartPipelineExecution",
+ "Effect": "Allow",
+ "Resource": "arn:aws:codepipeline:*:*:sagemaker-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ATIM24QYI",
+ "PolicyName": "AmazonSageMakerServiceCatalogProductsEventsServiceRolePolicy",
+ "UpdateDate": "2022-02-22T09:53:59+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerServiceCatalogProductsFirehoseServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsFirehoseServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-22T09:54:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:firehose:*:*:deliverystream/sagemaker-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ESFA6JNN2",
+ "PolicyName": "AmazonSageMakerServiceCatalogProductsFirehoseServiceRolePolicy",
+ "UpdateDate": "2022-02-22T09:54:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSageMakerServiceCatalogProductsGlueServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsGlueServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-02-22T09:51:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:BatchCreatePartition",
+ "glue:BatchDeletePartition",
+ "glue:BatchDeleteTable",
+ "glue:BatchDeleteTableVersion",
+ "glue:BatchGetPartition",
+ "glue:CreateDatabase",
+ "glue:CreatePartition",
+ "glue:CreateTable",
+ "glue:DeletePartition",
+ "glue:DeleteTable",
+ "glue:DeleteTableVersion",
+ "glue:GetDatabase",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetTableVersion",
+ "glue:GetTableVersions",
+ "glue:SearchTables",
+ "glue:UpdatePartition",
+ "glue:UpdateTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/default",
+ "arn:aws:glue:*:*:database/global_temp",
+ "arn:aws:glue:*:*:database/sagemaker-*",
+ "arn:aws:glue:*:*:table/sagemaker-*",
+ "arn:aws:glue:*:*:tableVersion/sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:GetBucketAcl",
+ "s3:GetBucketCors",
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:ListBucketMultipartUploads",
+ "s3:PutBucketCors"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*",
+ "arn:aws:s3:::sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:GetObjectVersion",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::aws-glue-*",
+ "arn:aws:s3:::sagemaker-*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:DeleteLogDelivery",
+ "logs:Describe*",
+ "logs:GetLogDelivery",
+ "logs:GetLogEvents",
+ "logs:ListLogDeliveries",
+ "logs:PutLogEvents",
+ "logs:PutResourcePolicy",
+ "logs:UpdateLogDelivery"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/glue/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DOYZH7RTZ",
+ "PolicyName": "AmazonSageMakerServiceCatalogProductsGlueServiceRolePolicy",
+ "UpdateDate": "2022-02-22T09:51:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonSumerianFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonSumerianFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-24T20:14:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sumerian:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMGUENPB56MXVVGBE",
+ "PolicyName": "AmazonSumerianFullAccess",
+ "UpdateDate": "2018-04-24T20:14:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonTextractFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTextractFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T19:07:42+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "textract:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIQDD47A7H3GBVPWOQ",
+ "PolicyName": "AmazonTextractFullAccess",
+ "UpdateDate": "2018-11-28T19:07:42+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonTextractServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AmazonTextractServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T19:12:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:AmazonTextract*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBDSAWESWLL34WASG",
+ "PolicyName": "AmazonTextractServiceRole",
+ "UpdateDate": "2018-11-28T19:12:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonTimestreamConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTimestreamConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-30T21:47:18+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "timestream:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey",
+ "kms:ListKeys",
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": true
+ },
+ "ForAnyValue:StringEquals": {
+ "kms:EncryptionContextKeys": "aws:timestream:database-name"
+ },
+ "StringLike": {
+ "kms:ViaService": "timestream.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "dbqms:CreateFavoriteQuery",
+ "dbqms:DescribeFavoriteQueries",
+ "dbqms:UpdateFavoriteQuery",
+ "dbqms:DeleteFavoriteQueries",
+ "dbqms:GetQueryString",
+ "dbqms:CreateQueryHistory",
+ "dbqms:DescribeQueryHistory",
+ "dbqms:UpdateQueryHistory",
+ "dbqms:DeleteQueryHistory"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListTopics",
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AZJLUKMAZ",
+ "PolicyName": "AmazonTimestreamConsoleFullAccess",
+ "UpdateDate": "2022-02-01T21:37:31+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonTimestreamFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTimestreamFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-30T21:47:14+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "timestream:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:CreateGrant"
+ ],
+ "Condition": {
+ "Bool": {
+ "kms:GrantIsForAWSResource": true
+ },
+ "ForAnyValue:StringEquals": {
+ "kms:EncryptionContextKeys": "aws:timestream:database-name"
+ },
+ "StringLike": {
+ "kms:ViaService": "timestream.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CGYUJBH4V",
+ "PolicyName": "AmazonTimestreamFullAccess",
+ "UpdateDate": "2021-11-26T23:42:00+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonTimestreamReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTimestreamReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-30T21:47:08+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "timestream:CancelQuery",
+ "timestream:DescribeDatabase",
+ "timestream:DescribeEndpoints",
+ "timestream:DescribeTable",
+ "timestream:ListDatabases",
+ "timestream:ListMeasures",
+ "timestream:ListTables",
+ "timestream:ListTagsForResource",
+ "timestream:Select",
+ "timestream:SelectValues",
+ "timestream:DescribeScheduledQuery",
+ "timestream:ListScheduledQueries"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4I7VUQXAEJ",
+ "PolicyName": "AmazonTimestreamReadOnlyAccess",
+ "UpdateDate": "2021-11-26T23:39:30+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonTranscribeFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTranscribeFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-04T16:06:16+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "transcribe:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*transcribe*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINAV45F5NT5RMFO7K",
+ "PolicyName": "AmazonTranscribeFullAccess",
+ "UpdateDate": "2018-04-04T16:06:16+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonTranscribeReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonTranscribeReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-04T16:05:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "transcribe:Get*",
+ "transcribe:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJM6JONISXCAZKFCAO",
+ "PolicyName": "AmazonTranscribeReadOnlyAccess",
+ "UpdateDate": "2018-04-04T16:05:06+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonVPCCrossAccountNetworkInterfaceOperations": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCCrossAccountNetworkInterfaceOperations",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-07-18T20:47:16+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeRouteTables",
+ "ec2:CreateRoute",
+ "ec2:DeleteRoute",
+ "ec2:ReplaceRoute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeRegions",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:UnassignPrivateIpAddresses"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ53Y4ZY5OHP4CNRJC",
+ "PolicyName": "AmazonVPCCrossAccountNetworkInterfaceOperations",
+ "UpdateDate": "2020-06-16T14:16:49+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonVPCFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:16+00:00",
+ "DefaultVersionId": "v9",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AcceptVpcEndpointConnections",
+ "ec2:AllocateAddress",
+ "ec2:AssignIpv6Addresses",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateDhcpOptions",
+ "ec2:AssociateRouteTable",
+ "ec2:AssociateSubnetCidrBlock",
+ "ec2:AssociateVpcCidrBlock",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateCarrierGateway",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDefaultSubnet",
+ "ec2:CreateDefaultVpc",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateEgressOnlyInternetGateway",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateLocalGatewayRouteTableVpcAssociation",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAclEntry",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpcEndpointConnectionNotification",
+ "ec2:CreateVpcEndpointServiceConfiguration",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:DeleteCarrierGateway",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteEgressOnlyInternetGateway",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteLocalGatewayRouteTableVpcAssociation",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkAclEntry",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpcEndpointConnectionNotifications",
+ "ec2:DeleteVpcEndpointServiceConfigurations",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCarrierGateways",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeEgressOnlyInternetGateways",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeIpv6Pools",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroupRules",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeStaleSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcClassicLinkDnsSupport",
+ "ec2:DescribeVpcEndpointConnectionNotifications",
+ "ec2:DescribeVpcEndpointConnections",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeVpcEndpointServicePermissions",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisableVpcClassicLink",
+ "ec2:DisableVpcClassicLinkDnsSupport",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:DisassociateSubnetCidrBlock",
+ "ec2:DisassociateVpcCidrBlock",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:EnableVpcClassicLink",
+ "ec2:EnableVpcClassicLinkDnsSupport",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySecurityGroupRules",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:ModifyVpcEndpointConnectionNotification",
+ "ec2:ModifyVpcEndpointServiceConfiguration",
+ "ec2:ModifyVpcEndpointServicePermissions",
+ "ec2:ModifyVpcPeeringConnectionOptions",
+ "ec2:ModifyVpcTenancy",
+ "ec2:MoveAddressToVpc",
+ "ec2:RejectVpcEndpointConnections",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceNetworkAclAssociation",
+ "ec2:ReplaceNetworkAclEntry",
+ "ec2:ReplaceRoute",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:ResetNetworkInterfaceAttribute",
+ "ec2:RestoreAddressToClassic",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:UnassignIpv6Addresses",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJBWPGNOVKZD3JI2P2",
+ "PolicyName": "AmazonVPCFullAccess",
+ "UpdateDate": "2021-08-02T19:12:14+00:00",
+ "VersionId": "v9"
+ },
+ "AmazonVPCReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonVPCReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:17+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeCarrierGateways",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeEgressOnlyInternetGateways",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroupRules",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeStaleSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcClassicLinkDnsSupport",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcEndpointConnectionNotifications",
+ "ec2:DescribeVpcEndpointConnections",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeVpcEndpointServicePermissions",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIICZJNOJN36GTG6CM",
+ "PolicyName": "AmazonVPCReadOnlyAccess",
+ "UpdateDate": "2021-08-02T15:47:38+00:00",
+ "VersionId": "v8"
+ },
+ "AmazonWorkDocsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkDocsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-16T23:05:11+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workdocs:*",
+ "ds:DescribeDirectories",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GTERAZYCR",
+ "PolicyName": "AmazonWorkDocsFullAccess",
+ "UpdateDate": "2020-04-16T23:05:11+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkDocsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkDocsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-01-08T23:49:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workdocs:Describe*",
+ "ds:DescribeDirectories",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EDG6WGO5A",
+ "PolicyName": "AmazonWorkDocsReadOnlyAccess",
+ "UpdateDate": "2020-01-08T23:49:59+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkLinkFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkLinkFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-23T18:52:09+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "worklink:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:worklink:*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJM4ITL7TEVURHCQSY",
+ "PolicyName": "AmazonWorkLinkFullAccess",
+ "UpdateDate": "2019-09-23T18:37:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonWorkLinkReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkLinkReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-23T19:07:10+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "worklink:Describe*",
+ "worklink:List*",
+ "worklink:Search*"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:worklink:*:*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIANQMFGU4EUUZKFQ4",
+ "PolicyName": "AmazonWorkLinkReadOnly",
+ "UpdateDate": "2019-09-23T18:37:21+00:00",
+ "VersionId": "v3"
+ },
+ "AmazonWorkLinkServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonWorkLinkServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-18T18:00:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:PutRecord",
+ "kinesis:PutRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kinesis:*:*:stream/AmazonWorkLink-*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:ModifyListener",
+ "elasticloadbalancing:AddListenerCertificates",
+ "elasticloadbalancing:RemoveListenerCertificates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAINJJP6CO7ATFCV4CU",
+ "PolicyName": "AmazonWorkLinkServiceRolePolicy",
+ "UpdateDate": "2020-02-07T20:48:49+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonWorkMailEventsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonWorkMailEventsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-04-16T16:52:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JG5LNO3U7",
+ "PolicyName": "AmazonWorkMailEventsServiceRolePolicy",
+ "UpdateDate": "2019-04-16T16:52:43+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkMailFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:41+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ds:AuthorizeApplication",
+ "ds:CheckAlias",
+ "ds:CreateAlias",
+ "ds:CreateDirectory",
+ "ds:CreateIdentityPoolDirectory",
+ "ds:DeleteDirectory",
+ "ds:DescribeDirectories",
+ "ds:GetDirectoryLimits",
+ "ds:ListAuthorizedApplications",
+ "ds:UnauthorizeApplication",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteVpc",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "lambda:ListFunctions",
+ "route53:ChangeResourceRecordSets",
+ "route53:ListHostedZones",
+ "route53:ListResourceRecordSets",
+ "route53:GetHostedZone",
+ "route53domains:CheckDomainAvailability",
+ "route53domains:ListDomains",
+ "ses:*",
+ "workmail:*",
+ "iam:ListRoles",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy",
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "events.workmail.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/events.workmail.amazonaws.com/AWSServiceRoleForAmazonWorkMailEvents*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "events.workmail.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*workmail*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQVKNMT7SVATQ4AUY",
+ "PolicyName": "AmazonWorkMailFullAccess",
+ "UpdateDate": "2020-12-21T14:13:40+00:00",
+ "VersionId": "v10"
+ },
+ "AmazonWorkMailMessageFlowFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailMessageFlowFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-02-11T11:08:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workmailmessageflow:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ORQUVJL66",
+ "PolicyName": "AmazonWorkMailMessageFlowFullAccess",
+ "UpdateDate": "2021-02-11T11:08:35+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkMailMessageFlowReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailMessageFlowReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-01-28T12:40:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workmailmessageflow:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M6UETQLYG",
+ "PolicyName": "AmazonWorkMailMessageFlowReadOnlyAccess",
+ "UpdateDate": "2021-01-28T12:40:08+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkMailReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkMailReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:42+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ses:Describe*",
+ "ses:Get*",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workmail:List*",
+ "workmail:Search*",
+ "lambda:ListFunctions",
+ "iam:ListRoles",
+ "logs:DescribeLogGroups",
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHF7J65E2QFKCWAJM",
+ "PolicyName": "AmazonWorkMailReadOnlyAccess",
+ "UpdateDate": "2019-07-25T08:24:50+00:00",
+ "VersionId": "v4"
+ },
+ "AmazonWorkSpacesAdmin": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesAdmin",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-22T22:21:15+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workspaces:CreateWorkspaces",
+ "workspaces:DescribeWorkspaces",
+ "workspaces:RebootWorkspaces",
+ "workspaces:RebuildWorkspaces",
+ "workspaces:TerminateWorkspaces",
+ "workspaces:DescribeWorkspaceDirectories",
+ "workspaces:DescribeWorkspaceBundles",
+ "workspaces:ModifyWorkspaceProperties",
+ "workspaces:StopWorkspaces",
+ "workspaces:StartWorkspaces",
+ "workspaces:DescribeWorkspacesConnectionStatus",
+ "workspaces:CreateTags",
+ "workspaces:DeleteTags",
+ "workspaces:DescribeTags",
+ "kms:ListKeys",
+ "kms:ListAliases",
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ26AU6ATUQCT5KVJU",
+ "PolicyName": "AmazonWorkSpacesAdmin",
+ "UpdateDate": "2016-08-18T23:08:42+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonWorkSpacesApplicationManagerAdminAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesApplicationManagerAdminAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-04-09T14:03:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "wam:AuthenticatePackager",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPRL4KYETIH7XGTSS",
+ "PolicyName": "AmazonWorkSpacesApplicationManagerAdminAccess",
+ "UpdateDate": "2015-04-09T14:03:18+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkSpacesSelfServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesSelfServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-27T19:22:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workspaces:RebootWorkspaces",
+ "workspaces:RebuildWorkspaces",
+ "workspaces:ModifyWorkspaceProperties"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MLHUSTJAF",
+ "PolicyName": "AmazonWorkSpacesSelfServiceAccess",
+ "UpdateDate": "2019-06-27T19:22:52+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkSpacesServiceAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesServiceAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-27T19:19:09+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeNetworkInterfaces"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KRXBM753F",
+ "PolicyName": "AmazonWorkSpacesServiceAccess",
+ "UpdateDate": "2020-03-18T23:32:10+00:00",
+ "VersionId": "v2"
+ },
+ "AmazonWorkSpacesWebReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonWorkSpacesWebReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-30T14:20:36+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "workspaces-web:GetBrowserSettings",
+ "workspaces-web:GetIdentityProvider",
+ "workspaces-web:GetNetworkSettings",
+ "workspaces-web:GetPortal",
+ "workspaces-web:GetPortalServiceProviderMetadata",
+ "workspaces-web:GetTrustStore",
+ "workspaces-web:GetTrustStoreCertificate",
+ "workspaces-web:GetUserSettings",
+ "workspaces-web:ListBrowserSettings",
+ "workspaces-web:ListIdentityProviders",
+ "workspaces-web:ListNetworkSettings",
+ "workspaces-web:ListPortals",
+ "workspaces-web:ListTagsForResource",
+ "workspaces-web:ListTrustStoreCertificates",
+ "workspaces-web:ListTrustStores",
+ "workspaces-web:ListUserSettings"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:workspaces-web:*:*:*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HIYKYJQEQ",
+ "PolicyName": "AmazonWorkSpacesWebReadOnly",
+ "UpdateDate": "2021-11-30T14:20:36+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonWorkSpacesWebServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonWorkSpacesWebServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-11-30T13:15:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface",
+ "ec2:AssociateAddress",
+ "ec2:DisassociateAddress",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcEndpoints"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/WorkSpacesWeb"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JW4G4DATC",
+ "PolicyName": "AmazonWorkSpacesWebServiceRolePolicy",
+ "UpdateDate": "2021-11-30T13:15:53+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonZocaloFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonZocaloFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "zocalo:*",
+ "ds:*",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJLCDXYRINDMUXEVL6",
+ "PolicyName": "AmazonZocaloFullAccess",
+ "UpdateDate": "2015-02-06T18:41:13+00:00",
+ "VersionId": "v1"
+ },
+ "AmazonZocaloReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AmazonZocaloReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:14+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "zocalo:Describe*",
+ "ds:DescribeDirectories",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAISRCSSJNS3QPKZJPM",
+ "PolicyName": "AmazonZocaloReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:41:14+00:00",
+ "VersionId": "v1"
+ },
+ "AppRunnerNetworkingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AppRunnerNetworkingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-01-12T21:02:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateNetworkInterface",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "AWSAppRunnerManaged"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateNetworkInterface"
+ },
+ "StringLike": {
+ "aws:RequestTag/AWSAppRunnerManaged": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": "ec2:DeleteNetworkInterface",
+ "Condition": {
+ "Null": {
+ "ec2:ResourceTag/AWSAppRunnerManaged": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BKUD67OZN",
+ "PolicyName": "AppRunnerNetworkingServiceRolePolicy",
+ "UpdateDate": "2022-01-12T21:02:40+00:00",
+ "VersionId": "v1"
+ },
+ "AppRunnerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AppRunnerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-05-14T19:15:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/apprunner/*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/apprunner/*:log-stream:*"
+ ]
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:DeleteRule",
+ "events:RemoveTargets",
+ "events:DescribeRule",
+ "events:EnableRule",
+ "events:DisableRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:events:*:*:rule/AWSAppRunnerManagedRule*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FKEGI2QN2",
+ "PolicyName": "AppRunnerServiceRolePolicy",
+ "UpdateDate": "2021-05-14T19:15:04+00:00",
+ "VersionId": "v1"
+ },
+ "ApplicationAutoScalingForAmazonAppStreamAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ApplicationAutoScalingForAmazonAppStreamAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-06T21:39:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "appstream:UpdateFleet",
+ "appstream:DescribeFleets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIEL3HJCCWFVHA6KPG",
+ "PolicyName": "ApplicationAutoScalingForAmazonAppStreamAccess",
+ "UpdateDate": "2017-02-06T21:39:56+00:00",
+ "VersionId": "v1"
+ },
+ "ApplicationDiscoveryServiceContinuousExportServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ApplicationDiscoveryServiceContinuousExportServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-09T20:22:01+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "glue:CreateDatabase",
+ "glue:UpdateDatabase",
+ "glue:CreateTable",
+ "glue:UpdateTable",
+ "firehose:CreateDeliveryStream",
+ "firehose:DescribeDeliveryStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "firehose:DeleteDeliveryStream",
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch",
+ "firehose:UpdateDestination"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:firehose:*:*:deliverystream/aws-application-discovery-service*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:ListBucket",
+ "s3:PutBucketLogging",
+ "s3:PutEncryptionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-application-discovery-service*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-application-discovery-service*/*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutRetentionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/application-discovery-service/firehose*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "firehose.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWSApplicationDiscoveryServiceFirehose"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "firehose.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/service-role/AWSApplicationDiscoveryServiceFirehose"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMGMY3P6OEWOELRFE",
+ "PolicyName": "ApplicationDiscoveryServiceContinuousExportServiceRolePolicy",
+ "UpdateDate": "2018-08-13T22:31:21+00:00",
+ "VersionId": "v2"
+ },
+ "AutoScalingConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:43:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateKeyPair",
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:ImportKeyPair"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListSubscriptions",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:ListRoles",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIYEN6FJGYYWJFFCZW",
+ "PolicyName": "AutoScalingConsoleFullAccess",
+ "UpdateDate": "2018-02-06T23:15:36+00:00",
+ "VersionId": "v2"
+ },
+ "AutoScalingConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:48:53+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:ListMetrics",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sns:ListSubscriptions",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3A7GDXOYQV3VUQMK",
+ "PolicyName": "AutoScalingConsoleReadOnlyAccess",
+ "UpdateDate": "2017-01-12T19:48:53+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:31:58+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "autoscaling:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricAlarm",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstances",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcClassicLink"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAWRCSJDDXDXGPCFU",
+ "PolicyName": "AutoScalingFullAccess",
+ "UpdateDate": "2018-02-06T21:59:13+00:00",
+ "VersionId": "v2"
+ },
+ "AutoScalingNotificationAccessRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/AutoScalingNotificationAccessRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:22+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sqs:SendMessage",
+ "sqs:GetQueueUrl",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIO2VMUPGDC5PZVXVA",
+ "PolicyName": "AutoScalingNotificationAccessRole",
+ "UpdateDate": "2015-02-06T18:41:22+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/AutoScalingReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-01-12T19:39:35+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "autoscaling:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAFWUVLC2LPLSFTFG",
+ "PolicyName": "AutoScalingReadOnlyAccess",
+ "UpdateDate": "2017-01-12T19:39:35+00:00",
+ "VersionId": "v1"
+ },
+ "AutoScalingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/AutoScalingServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-01-08T23:10:55+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AttachClassicLinkVpc",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CreateFleet",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:RequestSpotInstances",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2InstanceManagement"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:PassedToService": "ec2.amazonaws.com*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2InstanceProfileManagement"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "spot.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2SpotManagement"
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:Register*",
+ "elasticloadbalancing:Deregister*",
+ "elasticloadbalancing:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ELBManagement"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:PutMetricAlarm"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CWManagement"
+ },
+ {
+ "Action": [
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SNSManagement"
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "events:DeleteRule",
+ "events:DescribeRule"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "events:ManagedBy": "autoscaling.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EventBridgeRuleManagement"
+ },
+ {
+ "Action": [
+ "ssm:GetParameters"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "SystemsManagerParameterManagement"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIC5D2V7MRWBMHGD7G",
+ "PolicyName": "AutoScalingServiceRolePolicy",
+ "UpdateDate": "2021-10-29T22:06:23+00:00",
+ "VersionId": "v6"
+ },
+ "AwsGlueDataBrewFullAccessPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/AwsGlueDataBrewFullAccessPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-11T16:51:39+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "databrew:CreateDataset",
+ "databrew:DescribeDataset",
+ "databrew:ListDatasets",
+ "databrew:UpdateDataset",
+ "databrew:DeleteDataset",
+ "databrew:CreateProject",
+ "databrew:DescribeProject",
+ "databrew:ListProjects",
+ "databrew:StartProjectSession",
+ "databrew:SendProjectSessionAction",
+ "databrew:UpdateProject",
+ "databrew:DeleteProject",
+ "databrew:CreateRecipe",
+ "databrew:DescribeRecipe",
+ "databrew:ListRecipes",
+ "databrew:ListRecipeVersions",
+ "databrew:PublishRecipe",
+ "databrew:UpdateRecipe",
+ "databrew:BatchDeleteRecipeVersion",
+ "databrew:DeleteRecipeVersion",
+ "databrew:CreateRecipeJob",
+ "databrew:CreateProfileJob",
+ "databrew:DescribeJob",
+ "databrew:DescribeJobRun",
+ "databrew:ListJobRuns",
+ "databrew:ListJobs",
+ "databrew:StartJobRun",
+ "databrew:StopJobRun",
+ "databrew:UpdateProfileJob",
+ "databrew:UpdateRecipeJob",
+ "databrew:DeleteJob",
+ "databrew:CreateSchedule",
+ "databrew:DescribeSchedule",
+ "databrew:ListSchedules",
+ "databrew:UpdateSchedule",
+ "databrew:DeleteSchedule",
+ "databrew:CreateRuleset",
+ "databrew:DeleteRuleset",
+ "databrew:DescribeRuleset",
+ "databrew:ListRulesets",
+ "databrew:UpdateRuleset",
+ "databrew:ListTagsForResource",
+ "databrew:TagResource",
+ "databrew:UntagResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "appflow:DescribeFlow",
+ "appflow:DescribeFlowExecutionRecords",
+ "appflow:ListFlows",
+ "glue:GetConnection",
+ "glue:GetConnections",
+ "glue:GetDatabases",
+ "glue:GetPartitions",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetDataCatalogEncryptionSettings",
+ "dataexchange:ListDataSets",
+ "dataexchange:ListDataSetRevisions",
+ "dataexchange:ListRevisionAssets",
+ "dataexchange:CreateJob",
+ "dataexchange:StartJob",
+ "dataexchange:GetJob",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "kms:DescribeKey",
+ "kms:ListKeys",
+ "kms:ListAliases",
+ "redshift:DescribeClusters",
+ "redshift:DescribeClusterSubnetGroups",
+ "redshift-data:DescribeStatement",
+ "redshift-data:ListDatabases",
+ "redshift-data:ListSchemas",
+ "redshift-data:ListTables",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketCORS",
+ "s3:GetBucketLocation",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "secretsmanager:ListSecrets",
+ "secretsmanager:DescribeSecret",
+ "sts:GetCallerIdentity",
+ "cloudtrail:LookupEvents",
+ "iam:ListRoles",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateConnection"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:connection/AwsGlueDataBrew-*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:GetDatabases"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*"
+ ]
+ },
+ {
+ "Action": [
+ "glue:CreateTable"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:glue:*:*:catalog",
+ "arn:aws:glue:*:*:database/*",
+ "arn:aws:glue:*:*:table/*/awsgluedatabrew*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::databrew-public-datasets-*"
+ ]
+ },
+ {
+ "Action": [
+ "kms:GenerateDataKey"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "s3.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:AwsGlueDataBrew-*"
+ },
+ {
+ "Action": [
+ "kms:GenerateRandom"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetSecretValue"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "databrew.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:databrew!default-*"
+ },
+ {
+ "Action": [
+ "secretsmanager:CreateSecret"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "databrew.amazonaws.com"
+ ]
+ },
+ "StringLike": {
+ "secretsmanager:Name": "databrew!default"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:secretsmanager:*:*:secret:databrew!default-*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "databrew.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ACNRIK7M3",
+ "PolicyName": "AwsGlueDataBrewFullAccessPolicy",
+ "UpdateDate": "2022-02-04T18:28:33+00:00",
+ "VersionId": "v8"
+ },
+ "BatchServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/BatchServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-03-10T06:55:36+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeImages",
+ "ec2:DescribeImageAttribute",
+ "ec2:DescribeSpotInstanceRequests",
+ "ec2:DescribeSpotFleetInstances",
+ "ec2:DescribeSpotFleetRequests",
+ "ec2:DescribeSpotPriceHistory",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:RequestSpotFleet",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeLaunchConfigurations",
+ "autoscaling:DescribeAutoScalingInstances",
+ "ecs:DescribeClusters",
+ "ecs:DescribeContainerInstances",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTasks",
+ "ecs:ListClusters",
+ "ecs:ListContainerInstances",
+ "ecs:ListTaskDefinitionFamilies",
+ "ecs:ListTaskDefinitions",
+ "ecs:ListTasks",
+ "ecs:DeregisterTaskDefinition",
+ "ecs:TagResource",
+ "ecs:ListAccountSettings",
+ "logs:DescribeLogGroups",
+ "iam:GetInstanceProfile",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/batch/job*"
+ },
+ {
+ "Action": [
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/batch/job*:log-stream:*"
+ },
+ {
+ "Action": [
+ "autoscaling:CreateOrUpdateTags"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSBatchServiceTag": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn",
+ "ecs-tasks.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "spot.amazonaws.com",
+ "spotfleet.amazonaws.com",
+ "autoscaling.amazonaws.com",
+ "ecs.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:CreateLaunchTemplate"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSBatchServiceTag": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:DeleteLaunchTemplate"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/AWSBatchServiceTag": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "autoscaling:CreateLaunchConfiguration",
+ "autoscaling:DeleteLaunchConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/AWSBatch*"
+ },
+ {
+ "Action": [
+ "autoscaling:CreateAutoScalingGroup",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:SetDesiredCapacity",
+ "autoscaling:DeleteAutoScalingGroup",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:PutNotificationConfiguration",
+ "autoscaling:TerminateInstanceInAutoScalingGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/AWSBatch*"
+ },
+ {
+ "Action": [
+ "ecs:DeleteCluster",
+ "ecs:DeregisterContainerInstance",
+ "ecs:RunTask",
+ "ecs:StartTask",
+ "ecs:StopTask"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:cluster/AWSBatch*"
+ },
+ {
+ "Action": [
+ "ecs:RunTask",
+ "ecs:StartTask",
+ "ecs:StopTask"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:task-definition/*"
+ },
+ {
+ "Action": [
+ "ecs:StopTask"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ecs:*:*:task/*/*"
+ },
+ {
+ "Action": [
+ "ecs:CreateCluster",
+ "ecs:RegisterTaskDefinition"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSBatchServiceTag": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*::snapshot/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:launch-template/*",
+ "arn:aws:ec2:*:*:placement-group/*",
+ "arn:aws:ec2:*:*:capacity-reservation/*",
+ "arn:aws:ec2:*:*:elastic-gpu/*",
+ "arn:aws:elastic-inference:*:*:elastic-inference-accelerator/*"
+ ]
+ },
+ {
+ "Action": "ec2:RunInstances",
+ "Condition": {
+ "Null": {
+ "aws:RequestTag/AWSBatchServiceTag": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "RunInstances",
+ "CreateLaunchTemplate",
+ "RequestSpotFleet"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4COHHXEWBT",
+ "PolicyName": "BatchServiceRolePolicy",
+ "UpdateDate": "2021-12-07T02:15:31+00:00",
+ "VersionId": "v4"
+ },
+ "Billing": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/Billing",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:33:18+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "aws-portal:*Billing",
+ "aws-portal:*Usage",
+ "aws-portal:*PaymentMethods",
+ "budgets:ViewBudget",
+ "budgets:ModifyBudget",
+ "ce:UpdatePreferences",
+ "ce:CreateReport",
+ "ce:UpdateReport",
+ "ce:DeleteReport",
+ "ce:CreateNotificationSubscription",
+ "ce:UpdateNotificationSubscription",
+ "ce:DeleteNotificationSubscription",
+ "cur:DescribeReportDefinitions",
+ "cur:PutReportDefinition",
+ "cur:ModifyReportDefinition",
+ "cur:DeleteReportDefinition",
+ "purchase-orders:*PurchaseOrders"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFTHXT6FFMIRT7ZEA",
+ "PolicyName": "Billing",
+ "UpdateDate": "2020-10-05T20:37:01+00:00",
+ "VersionId": "v5"
+ },
+ "CertificateManagerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CertificateManagerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-25T17:56:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm-pca:IssueCertificate",
+ "acm-pca:GetCertificate"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G2T4BX7CL",
+ "PolicyName": "CertificateManagerServiceRolePolicy",
+ "UpdateDate": "2020-06-25T17:56:49+00:00",
+ "VersionId": "v1"
+ },
+ "ClientVPNServiceConnectionsRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ClientVPNServiceConnectionsRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-12T19:48:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lambda:InvokeFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:AWSClientVPN-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PG4VWZTEZ",
+ "PolicyName": "ClientVPNServiceConnectionsRolePolicy",
+ "UpdateDate": "2020-08-12T19:48:06+00:00",
+ "VersionId": "v1"
+ },
+ "ClientVPNServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ClientVPNServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-10T21:20:25+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeInternetGateways",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DescribeAccountAttributes",
+ "ds:AuthorizeApplication",
+ "ds:DescribeDirectories",
+ "ds:GetDirectoryLimits",
+ "ds:UnauthorizeApplication",
+ "logs:DescribeLogStreams",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogGroups",
+ "acm:GetCertificate",
+ "acm:DescribeCertificate",
+ "iam:GetSAMLProvider",
+ "lambda:GetFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI2SV25KUCYQYS5N74",
+ "PolicyName": "ClientVPNServiceRolePolicy",
+ "UpdateDate": "2020-08-12T19:39:34+00:00",
+ "VersionId": "v5"
+ },
+ "CloudFormationStackSetsOrgAdminServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudFormationStackSetsOrgAdminServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-10T00:20:05+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:List*",
+ "organizations:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AllowsAWSOrganizationsReadAPIs"
+ },
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/stacksets-exec-*",
+ "Sid": "AllowAssumeRoleInMemberAccounts"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JEQ3CDBDV",
+ "PolicyName": "CloudFormationStackSetsOrgAdminServiceRolePolicy",
+ "UpdateDate": "2019-12-10T00:20:05+00:00",
+ "VersionId": "v1"
+ },
+ "CloudFormationStackSetsOrgMemberServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudFormationStackSetsOrgMemberServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-09T23:52:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:CreateRole",
+ "iam:DeleteRole",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/stacksets-exec-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:DetachRolePolicy",
+ "iam:AttachRolePolicy"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PolicyARN": "arn:aws:iam::aws:policy/AdministratorAccess"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/stacksets-exec-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LHV6H6QDU",
+ "PolicyName": "CloudFormationStackSetsOrgMemberServiceRolePolicy",
+ "UpdateDate": "2019-12-09T23:52:37+00:00",
+ "VersionId": "v1"
+ },
+ "CloudFrontFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudFrontFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:50+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "cloudfront:*",
+ "iam:ListServerCertificates",
+ "waf:ListWebACLs",
+ "waf:GetWebACL",
+ "wafv2:ListWebACLs",
+ "wafv2:GetWebACL",
+ "kinesis:ListStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:DescribeStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kinesis:*:*:*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIPRV52SH6HDCCFY6U",
+ "PolicyName": "CloudFrontFullAccess",
+ "UpdateDate": "2020-09-03T20:18:42+00:00",
+ "VersionId": "v6"
+ },
+ "CloudFrontReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudFrontReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:55+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "cloudfront:DescribeFunction",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "iam:ListServerCertificates",
+ "route53:List*",
+ "waf:ListWebACLs",
+ "waf:GetWebACL",
+ "wafv2:ListWebACLs",
+ "wafv2:GetWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJJZMNYOTZCNQP36LG",
+ "PolicyName": "CloudFrontReadOnlyAccess",
+ "UpdateDate": "2021-09-08T22:10:54+00:00",
+ "VersionId": "v5"
+ },
+ "CloudHSMServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudHSMServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-06T19:12:46+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogGroup",
+ "logs:CreateLogStream",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJILYY7JP6JLMQG56I",
+ "PolicyName": "CloudHSMServiceRolePolicy",
+ "UpdateDate": "2017-11-06T19:12:46+00:00",
+ "VersionId": "v1"
+ },
+ "CloudSearchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudSearchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudsearch:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIM6OOWKQ7L7VBOZOC",
+ "PolicyName": "CloudSearchFullAccess",
+ "UpdateDate": "2015-02-06T18:39:56+00:00",
+ "VersionId": "v1"
+ },
+ "CloudSearchReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudSearchReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:57+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudsearch:Describe*",
+ "cloudsearch:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWPLX7N7BCC3RZLHW",
+ "PolicyName": "CloudSearchReadOnlyAccess",
+ "UpdateDate": "2015-02-06T18:39:57+00:00",
+ "VersionId": "v1"
+ },
+ "CloudTrailServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudTrailServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-10-24T21:21:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudtrail:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudTrailFullAccess"
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AwsOrgsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJXQJ45EGU6U7NQBW4",
+ "PolicyName": "CloudTrailServiceRolePolicy",
+ "UpdateDate": "2018-10-24T21:21:44+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatch-CrossAccountAccess": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudWatch-CrossAccountAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-23T09:59:27+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sts:AssumeRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/CloudWatch-CrossAccountSharing*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4OV6AFDA5J",
+ "PolicyName": "CloudWatch-CrossAccountAccess",
+ "UpdateDate": "2019-07-23T09:59:27+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchActionsEC2Access": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchActionsEC2Access",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-07T00:00:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:Describe*",
+ "ec2:Describe*",
+ "ec2:RebootInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIOWD4E3FVSORSZTGU",
+ "PolicyName": "CloudWatchActionsEC2Access",
+ "UpdateDate": "2015-07-07T00:00:33+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchAgentAdminPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-07T00:52:31+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ec2:DescribeTags",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:GetParameter",
+ "ssm:PutParameter"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAICMXPKT7EBAF6KR3O",
+ "PolicyName": "CloudWatchAgentAdminPolicy",
+ "UpdateDate": "2018-03-07T00:52:31+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchAgentServerPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-07T01:06:44+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:PutMetricData",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeTags",
+ "logs:PutLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:GetParameter"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIGOPKN7KRDAKTLG4I",
+ "PolicyName": "CloudWatchAgentServerPolicy",
+ "UpdateDate": "2019-10-17T23:08:51+00:00",
+ "VersionId": "v2"
+ },
+ "CloudWatchApplicationInsightsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchApplicationInsightsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-24T18:44:14+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "applicationinsights:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeVolumes",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters",
+ "sqs:ListQueues",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "autoscaling:DescribeAutoScalingGroups",
+ "lambda:ListFunctions",
+ "dynamodb:ListTables",
+ "s3:ListAllMyBuckets",
+ "sns:ListTopics",
+ "states:ListStateMachines",
+ "apigateway:GET",
+ "ecs:ListClusters",
+ "ecs:DescribeTaskDefinition",
+ "ecs:ListServices",
+ "ecs:ListTasks",
+ "eks:ListClusters",
+ "eks:ListNodegroups",
+ "fsx:DescribeFileSystems",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "application-insights.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/application-insights.amazonaws.com/AWSServiceRoleForApplicationInsights"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MSQN23AKX",
+ "PolicyName": "CloudWatchApplicationInsightsFullAccess",
+ "UpdateDate": "2022-01-25T17:51:29+00:00",
+ "VersionId": "v4"
+ },
+ "CloudWatchApplicationInsightsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchApplicationInsightsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-24T18:48:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "applicationinsights:Describe*",
+ "applicationinsights:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AX4TJYLSI",
+ "PolicyName": "CloudWatchApplicationInsightsReadOnlyAccess",
+ "UpdateDate": "2020-11-24T18:48:00+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchAutomaticDashboardsAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchAutomaticDashboardsAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-23T10:01:08+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingGroups",
+ "cloudfront:GetDistribution",
+ "cloudfront:ListDistributions",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "ec2:DescribeInstances",
+ "ec2:DescribeVolumes",
+ "ecs:DescribeClusters",
+ "ecs:DescribeContainerInstances",
+ "ecs:ListClusters",
+ "ecs:ListContainerInstances",
+ "ecs:ListServices",
+ "elasticache:DescribeCacheClusters",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "kinesis:DescribeStream",
+ "kinesis:ListStreams",
+ "lambda:GetFunction",
+ "lambda:ListFunctions",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBInstances",
+ "resource-groups:ListGroupResources",
+ "resource-groups:ListGroups",
+ "route53:GetHealthCheck",
+ "route53:ListHealthChecks",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sqs:ListQueues",
+ "synthetics:DescribeCanariesLastRun",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/restapis*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JFCXGSE2Q",
+ "PolicyName": "CloudWatchAutomaticDashboardsAccess",
+ "UpdateDate": "2021-04-20T13:05:40+00:00",
+ "VersionId": "v4"
+ },
+ "CloudWatchEventsBuiltInTargetExecutionAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/CloudWatchEventsBuiltInTargetExecutionAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:35:49+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:Describe*",
+ "ec2:RebootInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:CreateSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsBuiltInTargetExecutionAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIC5AQ5DATYSNF4AUM",
+ "PolicyName": "CloudWatchEventsBuiltInTargetExecutionAccess",
+ "UpdateDate": "2016-01-14T18:35:49+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchEventsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:37:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "events:*",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsFullAccess"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/AWS_Events_Invoke_Targets",
+ "Sid": "IAMPassRoleForCloudWatchEvents"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZLOYLNHESMYOJAFU",
+ "PolicyName": "CloudWatchEventsFullAccess",
+ "UpdateDate": "2016-01-14T18:37:08+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsInvocationAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/CloudWatchEventsInvocationAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:36:33+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "kinesis:PutRecord"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsInvocationAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJJXD6JKJLK2WDLZNO",
+ "PolicyName": "CloudWatchEventsInvocationAccess",
+ "UpdateDate": "2016-01-14T18:36:33+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchEventsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchEventsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-01-14T18:27:18+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "events:DescribeRule",
+ "events:ListRuleNamesByTarget",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "events:TestEventPattern",
+ "events:DescribeEventBus"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchEventsReadOnlyAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIILJPXXA6F7GYLYBS",
+ "PolicyName": "CloudWatchEventsReadOnlyAccess",
+ "UpdateDate": "2017-08-10T17:25:34+00:00",
+ "VersionId": "v2"
+ },
+ "CloudWatchEventsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudWatchEventsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-17T00:42:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeVolumeStatus",
+ "ec2:DescribeVolumes",
+ "ec2:RebootInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances",
+ "ec2:CreateSnapshot"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNVASSNSIDZIP4X7I",
+ "PolicyName": "CloudWatchEventsServiceRolePolicy",
+ "UpdateDate": "2017-11-17T00:42:04+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:00+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudwatch:*",
+ "logs:*",
+ "sns:*",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "events.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/events.amazonaws.com/AWSServiceRoleForCloudWatchEvents*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIKEABORKUXN6DEAZU",
+ "PolicyName": "CloudWatchFullAccess",
+ "UpdateDate": "2018-08-09T19:10:43+00:00",
+ "VersionId": "v3"
+ },
+ "CloudWatchLambdaInsightsExecutionRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-10-07T19:27:06+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "logs:CreateLogGroup",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda-insights:*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EDWWYYDS6",
+ "PolicyName": "CloudWatchLambdaInsightsExecutionRolePolicy",
+ "UpdateDate": "2020-10-07T19:27:06+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchLogsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:02+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ3ZGNWK2R5HW5BQFO",
+ "PolicyName": "CloudWatchLogsFullAccess",
+ "UpdateDate": "2015-02-06T18:40:02+00:00",
+ "VersionId": "v1"
+ },
+ "CloudWatchLogsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchLogsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:03+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:Describe*",
+ "logs:Get*",
+ "logs:List*",
+ "logs:StartQuery",
+ "logs:StopQuery",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ2YIYDYSNNEHK3VKW",
+ "PolicyName": "CloudWatchLogsReadOnlyAccess",
+ "UpdateDate": "2019-01-14T19:32:45+00:00",
+ "VersionId": "v4"
+ },
+ "CloudWatchReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:01+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "logs:Get*",
+ "logs:List*",
+ "logs:StartQuery",
+ "logs:StopQuery",
+ "logs:Describe*",
+ "logs:TestMetricFilter",
+ "logs:FilterLogEvents",
+ "sns:Get*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJN23PDQP7SZQAE3QE",
+ "PolicyName": "CloudWatchReadOnlyAccess",
+ "UpdateDate": "2020-07-17T17:49:09+00:00",
+ "VersionId": "v4"
+ },
+ "CloudWatchSyntheticsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchSyntheticsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-25T17:39:46+00:00",
+ "DefaultVersionId": "v8",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "synthetics:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:PutEncryptionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::cw-syn-results-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:ListRoles",
+ "s3:ListAllMyBuckets",
+ "xray:GetTraceSummaries",
+ "xray:BatchGetTraces",
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::*"
+ },
+ {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::cw-syn-*"
+ },
+ {
+ "Action": [
+ "s3:GetObjectVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::aws-synthetics-library-*"
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "lambda.amazonaws.com",
+ "synthetics.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/CloudWatchSyntheticsRole*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/service-role/CloudWatchSyntheticsRole*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:Synthetics-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarms"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudwatch:*:*:alarm:*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:CreateFunction",
+ "lambda:AddPermission",
+ "lambda:PublishVersion",
+ "lambda:UpdateFunctionCode",
+ "lambda:UpdateFunctionConfiguration",
+ "lambda:GetFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:function:cwsyn-*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:GetLayerVersion",
+ "lambda:PublishLayerVersion"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:lambda:*:*:layer:cwsyn-*",
+ "arn:aws:lambda:*:*:layer:Synthetics:*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:CreateTopic",
+ "sns:Subscribe",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:sns:*:*:Synthetics-*"
+ ]
+ },
+ {
+ "Action": [
+ "kms:ListAliases"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:DescribeKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kms:*:*:key/*"
+ },
+ {
+ "Action": [
+ "kms:Decrypt"
+ ],
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": [
+ "s3.*.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:kms:*:*:key/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MAGQWEZP4",
+ "PolicyName": "CloudWatchSyntheticsFullAccess",
+ "UpdateDate": "2021-09-29T23:07:11+00:00",
+ "VersionId": "v8"
+ },
+ "CloudWatchSyntheticsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/CloudWatchSyntheticsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-25T17:45:40+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "synthetics:Describe*",
+ "synthetics:Get*",
+ "synthetics:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4C7XDT2FFB",
+ "PolicyName": "CloudWatchSyntheticsReadOnlyAccess",
+ "UpdateDate": "2020-03-06T19:26:01+00:00",
+ "VersionId": "v2"
+ },
+ "CloudwatchApplicationInsightsServiceLinkedRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/CloudwatchApplicationInsightsServiceLinkedRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-12-01T16:22:12+00:00",
+ "DefaultVersionId": "v19",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DescribeAlarmHistory",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:ListMetrics",
+ "cloudwatch:PutMetricAlarm",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:PutAnomalyDetector",
+ "cloudwatch:DeleteAnomalyDetector",
+ "cloudwatch:DescribeAnomalyDetectors"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:FilterLogEvents",
+ "logs:GetLogEvents",
+ "logs:DescribeLogStreams",
+ "logs:DescribeLogGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "events:DescribeRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudFormation:CreateStack",
+ "cloudFormation:UpdateStack",
+ "cloudFormation:DeleteStack",
+ "cloudFormation:DescribeStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:cloudformation:*:*:stack/ApplicationInsights-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudFormation:DescribeStacks",
+ "cloudFormation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "resource-groups:ListGroupResources",
+ "resource-groups:GetGroupQuery",
+ "resource-groups:GetGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "resource-groups:CreateGroup",
+ "resource-groups:DeleteGroup"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:resource-groups:*:*:group/ApplicationInsights-*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:PutParameter",
+ "ssm:DeleteParameter",
+ "ssm:AddTagsToResource",
+ "ssm:RemoveTagsFromResource",
+ "ssm:GetParameters"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-ApplicationInsights-*"
+ },
+ {
+ "Action": [
+ "ssm:CreateAssociation",
+ "ssm:UpdateAssociation",
+ "ssm:DeleteAssociation",
+ "ssm:DescribeAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ssm:*:*:association/*",
+ "arn:aws:ssm:*:*:managed-instance/*",
+ "arn:aws:ssm:*:*:document/AWSEC2-ApplicationInsightsCloudwatchAgentInstallAndConfigure",
+ "arn:aws:ssm:*:*:document/AWS-ConfigureAWSPackage",
+ "arn:aws:ssm:*:*:document/AmazonCloudWatch-ManageAgent"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:GetOpsItem",
+ "ssm:CreateOpsItem",
+ "ssm:DescribeOpsItems",
+ "ssm:UpdateOpsItem",
+ "ssm:DescribeInstanceInformation"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ssm:AddTagsToResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ssm:*:*:opsitem/*"
+ },
+ {
+ "Action": [
+ "ssm:ListCommandInvocations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ssm:*:*:document/AWSEC2-CheckPerformanceCounterSets",
+ "arn:aws:ssm:*:*:document/AWS-ConfigureAWSPackage",
+ "arn:aws:ssm:*:*:document/AWSEC2-DetectWorkload",
+ "arn:aws:ssm:*:*:document/AmazonCloudWatch-ManageAgent"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVolumeStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBClusters"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "lambda:ListFunctions",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListEventSourceMappings"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "events:PutRule",
+ "events:PutTargets",
+ "events:RemoveTargets",
+ "events:DeleteRule"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:events:*:*:rule/AmazonCloudWatch-ApplicationInsights-*"
+ ]
+ },
+ {
+ "Action": [
+ "xray:GetServiceGraph",
+ "xray:GetTraceSummaries",
+ "xray:GetTimeSeriesServiceStatistics",
+ "xray:GetTraceGraph"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "dynamodb:ListTables",
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeContributorInsights",
+ "dynamodb:DescribeTimeToLive"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "application-autoscaling:DescribeScalableTargets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:ListAllMyBuckets",
+ "s3:GetMetricsConfiguration",
+ "s3:GetReplicationConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "states:ListStateMachines",
+ "states:DescribeExecution",
+ "states:DescribeStateMachine",
+ "states:GetExecutionHistory"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ecs:DescribeClusters",
+ "ecs:DescribeContainerInstances",
+ "ecs:DescribeServices",
+ "ecs:DescribeTaskDefinition",
+ "ecs:DescribeTasks",
+ "ecs:DescribeTaskSets",
+ "ecs:ListClusters",
+ "ecs:ListContainerInstances",
+ "ecs:ListServices",
+ "ecs:ListTasks"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ecs:UpdateClusterSettings"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ecs:*:*:cluster/*"
+ ]
+ },
+ {
+ "Action": [
+ "eks:DescribeCluster",
+ "eks:DescribeFargateProfile",
+ "eks:DescribeNodegroup",
+ "eks:ListClusters",
+ "eks:ListFargateProfiles",
+ "eks:ListNodegroups",
+ "fsx:DescribeFileSystems"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sns:GetSubscriptionAttributes",
+ "sns:GetTopicAttributes",
+ "sns:GetSMSAttributes",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "sqs:ListQueues"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DeleteSubscriptionFilter"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*"
+ ]
+ },
+ {
+ "Action": [
+ "logs:PutSubscriptionFilter"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:*",
+ "arn:aws:logs:*:*:destination:AmazonCloudWatch-ApplicationInsights-LogIngestionDestination*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJH3SHQERZRQMQOQ44",
+ "PolicyName": "CloudwatchApplicationInsightsServiceLinkedRolePolicy",
+ "UpdateDate": "2022-01-25T17:51:32+00:00",
+ "VersionId": "v19"
+ },
+ "ComprehendDataAccessRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ComprehendDataAccessRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-03-06T22:28:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": {
+ "Action": [
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*Comprehend*",
+ "arn:aws:s3:::*comprehend*"
+ ]
+ },
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHSDRRKS2Z3MYUPQY",
+ "PolicyName": "ComprehendDataAccessRolePolicy",
+ "UpdateDate": "2019-03-06T22:28:15+00:00",
+ "VersionId": "v1"
+ },
+ "ComprehendFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ComprehendFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T18:08:43+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "comprehend:*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "iam:ListRoles",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITBM2PMWNG2P7RZEQ",
+ "PolicyName": "ComprehendFullAccess",
+ "UpdateDate": "2017-12-05T01:36:24+00:00",
+ "VersionId": "v2"
+ },
+ "ComprehendMedicalFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ComprehendMedicalFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T17:55:52+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "comprehendmedical:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJR5SUEX6PPJ3K4RAO",
+ "PolicyName": "ComprehendMedicalFullAccess",
+ "UpdateDate": "2018-11-27T17:55:52+00:00",
+ "VersionId": "v1"
+ },
+ "ComprehendReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/ComprehendReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T18:10:19+00:00",
+ "DefaultVersionId": "v10",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "comprehend:DetectDominantLanguage",
+ "comprehend:BatchDetectDominantLanguage",
+ "comprehend:DetectEntities",
+ "comprehend:BatchDetectEntities",
+ "comprehend:DetectKeyPhrases",
+ "comprehend:BatchDetectKeyPhrases",
+ "comprehend:DetectPiiEntities",
+ "comprehend:ContainsPiiEntities",
+ "comprehend:DetectSentiment",
+ "comprehend:BatchDetectSentiment",
+ "comprehend:DetectSyntax",
+ "comprehend:BatchDetectSyntax",
+ "comprehend:ClassifyDocument",
+ "comprehend:DescribeTopicsDetectionJob",
+ "comprehend:ListTopicsDetectionJobs",
+ "comprehend:DescribeDominantLanguageDetectionJob",
+ "comprehend:ListDominantLanguageDetectionJobs",
+ "comprehend:DescribeEntitiesDetectionJob",
+ "comprehend:ListEntitiesDetectionJobs",
+ "comprehend:DescribeKeyPhrasesDetectionJob",
+ "comprehend:ListKeyPhrasesDetectionJobs",
+ "comprehend:DescribePiiEntitiesDetectionJob",
+ "comprehend:ListPiiEntitiesDetectionJobs",
+ "comprehend:DescribeSentimentDetectionJob",
+ "comprehend:ListSentimentDetectionJobs",
+ "comprehend:DescribeDocumentClassifier",
+ "comprehend:ListDocumentClassifiers",
+ "comprehend:DescribeDocumentClassificationJob",
+ "comprehend:ListDocumentClassificationJobs",
+ "comprehend:DescribeEntityRecognizer",
+ "comprehend:ListEntityRecognizers",
+ "comprehend:ListTagsForResource",
+ "comprehend:DescribeEndpoint",
+ "comprehend:ListEndpoints",
+ "comprehend:ListDocumentClassifierSummaries",
+ "comprehend:ListEntityRecognizerSummaries",
+ "comprehend:DescribeResourcePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJIUV5K2YCHQBBAH7G",
+ "PolicyName": "ComprehendReadOnly",
+ "UpdateDate": "2022-02-02T21:08:24+00:00",
+ "VersionId": "v10"
+ },
+ "ComputeOptimizerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ComputeOptimizerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-03-07T00:11:02+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "compute-optimizer:DescribeRecommendationExportJobs",
+ "compute-optimizer:GetEnrollmentStatus",
+ "compute-optimizer:GetEnrollmentStatusesForOrganization",
+ "compute-optimizer:GetRecommendationSummaries",
+ "compute-optimizer:GetEC2InstanceRecommendations",
+ "compute-optimizer:GetEC2RecommendationProjectedMetrics",
+ "compute-optimizer:GetAutoScalingGroupRecommendations",
+ "compute-optimizer:GetEBSVolumeRecommendations",
+ "compute-optimizer:GetLambdaFunctionRecommendations",
+ "compute-optimizer:GetRecommendationPreferences",
+ "compute-optimizer:GetEffectiveRecommendationPreferences",
+ "ec2:DescribeInstances",
+ "ec2:DescribeVolumes",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "lambda:ListFunctions",
+ "lambda:ListProvisionedConcurrencyConfigs",
+ "cloudwatch:GetMetricData",
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeAccount"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FI27MEARJ",
+ "PolicyName": "ComputeOptimizerReadOnlyAccess",
+ "UpdateDate": "2021-11-29T16:03:07+00:00",
+ "VersionId": "v5"
+ },
+ "ComputeOptimizerServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ComputeOptimizerServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-03T08:45:19+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "compute-optimizer:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ComputeOptimizerFullAccess"
+ },
+ {
+ "Action": [
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AwsOrgsAccess"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricData"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "CloudWatchAccess"
+ },
+ {
+ "Action": [
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeAutoScalingGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "AutoScalingAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4HPOQZNRNJ",
+ "PolicyName": "ComputeOptimizerServiceRolePolicy",
+ "UpdateDate": "2021-11-29T16:04:07+00:00",
+ "VersionId": "v2"
+ },
+ "ConfigConformsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ConfigConformsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-25T21:38:05+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "config:PutConfigRule",
+ "config:DeleteConfigRule",
+ "config:DescribeConfigRules"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/aws-service-rule/config-conforms.amazonaws.com*"
+ },
+ {
+ "Action": [
+ "config:DescribeRemediationConfigurations",
+ "config:DeleteRemediationConfiguration",
+ "config:PutRemediationConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:remediation-configuration/aws-service-remediation-configuration/config-conforms.amazonaws.com*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/config-conforms.amazonaws.com/*"
+ },
+ {
+ "Action": [
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/remediation.config.amazonaws.com/AWSServiceRoleForConfigRemediation"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "remediation.config.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/remediation.config.amazonaws.com/AWSServiceRoleForConfigRemediation"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ssm.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ssm:DescribeDocument",
+ "ssm:GetDocument"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:GetObject",
+ "s3:GetBucketAcl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::awsconfigconforms*"
+ },
+ {
+ "Action": [
+ "cloudformation:CreateStack",
+ "cloudformation:DeleteStack",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:DescribeStacks",
+ "cloudformation:GetStackPolicy",
+ "cloudformation:SetStackPolicy",
+ "cloudformation:UpdateStack",
+ "cloudformation:UpdateTerminationProtection",
+ "cloudformation:ValidateTemplate",
+ "cloudformation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/awsconfigconforms-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4BCH3IIJPN",
+ "PolicyName": "ConfigConformsServiceRolePolicy",
+ "UpdateDate": "2019-11-13T18:29:21+00:00",
+ "VersionId": "v4"
+ },
+ "DAXServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/DAXServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2018-03-05T17:51:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJQWMGC67G4DWMREGM",
+ "PolicyName": "DAXServiceRolePolicy",
+ "UpdateDate": "2018-03-05T17:51:25+00:00",
+ "VersionId": "v1"
+ },
+ "DataScientist": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/DataScientist",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:28:48+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:*",
+ "cloudwatch:*",
+ "cloudformation:CreateStack",
+ "cloudformation:DescribeStackEvents",
+ "datapipeline:Describe*",
+ "datapipeline:ListPipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "dynamodb:*",
+ "ec2:CancelSpotInstanceRequests",
+ "ec2:CancelSpotFleetRequests",
+ "ec2:CreateTags",
+ "ec2:DeleteTags",
+ "ec2:Describe*",
+ "ec2:ModifyImageAttribute",
+ "ec2:ModifyInstanceAttribute",
+ "ec2:ModifySpotFleetRequest",
+ "ec2:RequestSpotInstances",
+ "ec2:RequestSpotFleet",
+ "elasticfilesystem:*",
+ "elasticmapreduce:*",
+ "es:*",
+ "firehose:*",
+ "fsx:DescribeFileSystems",
+ "iam:GetInstanceProfile",
+ "iam:GetRole",
+ "iam:GetPolicy",
+ "iam:GetPolicyVersion",
+ "iam:ListRoles",
+ "kinesis:*",
+ "kms:List*",
+ "lambda:Create*",
+ "lambda:Delete*",
+ "lambda:Get*",
+ "lambda:InvokeFunction",
+ "lambda:PublishVersion",
+ "lambda:Update*",
+ "lambda:List*",
+ "machinelearning:*",
+ "sdb:*",
+ "rds:*",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "redshift:*",
+ "s3:CreateBucket",
+ "sns:CreateTopic",
+ "sns:Get*",
+ "sns:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:Abort*",
+ "s3:DeleteObject",
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutAccelerateConfiguration",
+ "s3:PutBucketCors",
+ "s3:PutBucketLogging",
+ "s3:PutBucketNotification",
+ "s3:PutBucketTagging",
+ "s3:PutObject",
+ "s3:Replicate*",
+ "s3:RestoreObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/DataPipelineDefaultRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
+ "arn:aws:iam::*:role/EMR_EC2_DefaultRole",
+ "arn:aws:iam::*:role/EMR_DefaultRole",
+ "arn:aws:iam::*:role/kinesis-*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "sagemaker.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:*"
+ ],
+ "Effect": "Allow",
+ "NotResource": [
+ "arn:aws:sagemaker:*:*:domain/*",
+ "arn:aws:sagemaker:*:*:user-profile/*",
+ "arn:aws:sagemaker:*:*:app/*",
+ "arn:aws:sagemaker:*:*:flow-definition/*"
+ ]
+ },
+ {
+ "Action": [
+ "sagemaker:CreatePresignedDomainUrl",
+ "sagemaker:DescribeDomain",
+ "sagemaker:ListDomains",
+ "sagemaker:DescribeUserProfile",
+ "sagemaker:ListUserProfiles",
+ "sagemaker:*App",
+ "sagemaker:ListApps"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sagemaker:*FlowDefinition",
+ "sagemaker:*FlowDefinitions"
+ ],
+ "Condition": {
+ "StringEqualsIfExists": {
+ "sagemaker:WorkteamType": [
+ "private-crowd",
+ "vendor-crowd"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ5YHI2BQW7EQFYDXS",
+ "PolicyName": "DataScientist",
+ "UpdateDate": "2019-12-03T16:48:34+00:00",
+ "VersionId": "v5"
+ },
+ "DatabaseAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/DatabaseAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:25:43+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:Describe*",
+ "cloudwatch:DisableAlarmActions",
+ "cloudwatch:EnableAlarmActions",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "cloudwatch:PutMetricAlarm",
+ "datapipeline:ActivatePipeline",
+ "datapipeline:CreatePipeline",
+ "datapipeline:DeletePipeline",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:PutPipelineDefinition",
+ "datapipeline:QueryObjects",
+ "dynamodb:*",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "elasticache:*",
+ "iam:ListRoles",
+ "iam:GetRole",
+ "kms:ListKeys",
+ "lambda:CreateEventSourceMapping",
+ "lambda:CreateFunction",
+ "lambda:DeleteEventSourceMapping",
+ "lambda:DeleteFunction",
+ "lambda:GetFunctionConfiguration",
+ "lambda:ListEventSourceMappings",
+ "lambda:ListFunctions",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:FilterLogEvents",
+ "logs:GetLogEvents",
+ "logs:Create*",
+ "logs:PutLogEvents",
+ "logs:PutMetricFilter",
+ "rds:*",
+ "redshift:*",
+ "s3:CreateBucket",
+ "sns:CreateTopic",
+ "sns:DeleteTopic",
+ "sns:Get*",
+ "sns:List*",
+ "sns:SetTopicAttributes",
+ "sns:Subscribe",
+ "sns:Unsubscribe"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:DeleteObject*",
+ "s3:Get*",
+ "s3:List*",
+ "s3:PutAccelerateConfiguration",
+ "s3:PutBucketTagging",
+ "s3:PutBucketVersioning",
+ "s3:PutBucketWebsite",
+ "s3:PutLifecycleConfiguration",
+ "s3:PutReplicationConfiguration",
+ "s3:PutObject*",
+ "s3:Replicate*",
+ "s3:RestoreObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/rds-monitoring-role",
+ "arn:aws:iam::*:role/rdbms-lambda-access",
+ "arn:aws:iam::*:role/lambda_exec_role",
+ "arn:aws:iam::*:role/lambda-dynamodb-*",
+ "arn:aws:iam::*:role/lambda-vpc-execution-role",
+ "arn:aws:iam::*:role/DataPipelineDefaultRole",
+ "arn:aws:iam::*:role/DataPipelineDefaultResourceRole"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIGBMAW4VUQKOQNVT6",
+ "PolicyName": "DatabaseAdministrator",
+ "UpdateDate": "2019-01-08T00:48:02+00:00",
+ "VersionId": "v2"
+ },
+ "DynamoDBCloudWatchContributorInsightsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/DynamoDBCloudWatchContributorInsightsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-15T21:13:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudwatch:DeleteInsightRules",
+ "cloudwatch:PutInsightRule"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudwatch:*:*:insight-rule/DynamoDBContributorInsights*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DescribeInsightRules"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4G4VWJTRGV",
+ "PolicyName": "DynamoDBCloudWatchContributorInsightsServiceRolePolicy",
+ "UpdateDate": "2019-11-15T21:13:58+00:00",
+ "VersionId": "v1"
+ },
+ "DynamoDBKinesisReplicationServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/DynamoDBKinesisReplicationServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-12T00:43:25+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "kms:GenerateDataKey",
+ "Condition": {
+ "StringLike": {
+ "kms:ViaService": "kinesis.*.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:PutRecord",
+ "kinesis:PutRecords",
+ "kinesis:DescribeStream"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4A745YPIYL",
+ "PolicyName": "DynamoDBKinesisReplicationServiceRolePolicy",
+ "UpdateDate": "2020-11-12T00:43:25+00:00",
+ "VersionId": "v1"
+ },
+ "DynamoDBReplicationServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/DynamoDBReplicationServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-09T23:55:34+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:GetItem",
+ "dynamodb:PutItem",
+ "dynamodb:UpdateItem",
+ "dynamodb:DeleteItem",
+ "dynamodb:DescribeTable",
+ "dynamodb:UpdateTable",
+ "dynamodb:Scan",
+ "dynamodb:DescribeStream",
+ "dynamodb:GetRecords",
+ "dynamodb:GetShardIterator",
+ "dynamodb:DescribeTimeToLive",
+ "dynamodb:UpdateTimeToLive",
+ "dynamodb:DescribeLimits",
+ "application-autoscaling:RegisterScalableTarget",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:PutScalingPolicy",
+ "application-autoscaling:DescribeScalingPolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "dynamodb.application-autoscaling.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJCUNRXL4BWASNJED2",
+ "PolicyName": "DynamoDBReplicationServiceRolePolicy",
+ "UpdateDate": "2020-09-09T18:43:04+00:00",
+ "VersionId": "v6"
+ },
+ "EC2FastLaunchServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/EC2FastLaunchServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2022-01-10T13:08:21+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*::image/*",
+ "arn:aws:ec2:*:*:key-pair/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:RunInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": "EC2 Fast Launch"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/CreatedBy": "EC2 Fast Launch"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateSnapshot",
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/CreatedBy": "EC2 Fast Launch"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateSnapshot",
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:TagKeys": [
+ "CreatedByLaunchTemplateName",
+ "CreatedByLaunchTemplateId"
+ ]
+ },
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": "EC2 Fast Launch"
+ },
+ "StringLike": {
+ "aws:RequestTag/CreatedByLaunchTemplateVersion": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:snapshot/*"
+ ],
+ "Sid": "AllowCreateTaggedSnapshot"
+ },
+ {
+ "Action": "ec2:CreateLaunchTemplate",
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/CreatedBy": "EC2 Fast Launch"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:launch-template/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": [
+ "CreateSnapshot",
+ "RunInstances",
+ "CreateLaunchTemplate"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:volume/*",
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:snapshot/*",
+ "arn:aws:ec2:*:*:launch-template/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/CreatedBy": "EC2 Fast Launch"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:snapshot/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeInstanceStatus",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInstanceTypeOfferings",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeLaunchTemplates"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "cloudwatch:PutMetricData",
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/EC2"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PBILMNSY7",
+ "PolicyName": "EC2FastLaunchServiceRolePolicy",
+ "UpdateDate": "2022-01-10T13:08:21+00:00",
+ "VersionId": "v1"
+ },
+ "EC2FleetTimeShiftableServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/EC2FleetTimeShiftableServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-23T19:47:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeInstances",
+ "ec2:RunInstances",
+ "ec2:CreateFleet"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:PassRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": [
+ "ec2.amazonaws.com",
+ "ec2.amazonaws.com.cn"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:spot-instances-request/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:ec2:fleet-id": "*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IU3TFNWBH",
+ "PolicyName": "EC2FleetTimeShiftableServiceRolePolicy",
+ "UpdateDate": "2019-12-23T19:47:15+00:00",
+ "VersionId": "v1"
+ },
+ "EC2InstanceConnect": {
+ "Arn": "arn:aws:iam::aws:policy/EC2InstanceConnect",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-27T18:53:34+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2-instance-connect:SendSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "EC2InstanceConnect"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PBRCMEYY5",
+ "PolicyName": "EC2InstanceConnect",
+ "UpdateDate": "2019-06-27T18:53:34+00:00",
+ "VersionId": "v1"
+ },
+ "EC2InstanceProfileForImageBuilder": {
+ "Arn": "arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilder",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-01T19:08:23+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "imagebuilder:GetComponent"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:Decrypt"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "imagebuilder.amazonaws.com"
+ ],
+ "kms:EncryptionContextKeys": "aws:imagebuilder:arn"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::ec2imagebuilder*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/imagebuilder/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EJC2UPLYL",
+ "PolicyName": "EC2InstanceProfileForImageBuilder",
+ "UpdateDate": "2020-08-27T16:40:50+00:00",
+ "VersionId": "v3"
+ },
+ "EC2InstanceProfileForImageBuilderECRContainerBuilds": {
+ "Arn": "arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilderECRContainerBuilds",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-11T19:48:15+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "imagebuilder:GetComponent",
+ "imagebuilder:GetContainerRecipe",
+ "ecr:GetAuthorizationToken",
+ "ecr:BatchGetImage",
+ "ecr:InitiateLayerUpload",
+ "ecr:UploadLayerPart",
+ "ecr:CompleteLayerUpload",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:PutImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:Decrypt"
+ ],
+ "Condition": {
+ "ForAnyValue:StringEquals": {
+ "aws:CalledVia": [
+ "imagebuilder.amazonaws.com"
+ ],
+ "kms:EncryptionContextKeys": "aws:imagebuilder:arn"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::ec2imagebuilder*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:PutLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/imagebuilder/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4C32QNC6KD",
+ "PolicyName": "EC2InstanceProfileForImageBuilderECRContainerBuilds",
+ "UpdateDate": "2020-12-11T19:48:15+00:00",
+ "VersionId": "v1"
+ },
+ "ECRReplicationServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ECRReplicationServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-04T22:11:28+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ecr:CreateRepository",
+ "ecr:ReplicateImage"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NS3XDKIDR",
+ "PolicyName": "ECRReplicationServiceRolePolicy",
+ "UpdateDate": "2020-12-04T22:11:28+00:00",
+ "VersionId": "v1"
+ },
+ "Ec2ImageBuilderCrossAccountDistributionAccess": {
+ "Arn": "arn:aws:iam::aws:policy/Ec2ImageBuilderCrossAccountDistributionAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-30T19:22:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:CreateTags",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*::image/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:CopyImage",
+ "ec2:ModifyImageAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4PHZOLIXKT",
+ "PolicyName": "Ec2ImageBuilderCrossAccountDistributionAccess",
+ "UpdateDate": "2020-09-30T19:22:54+00:00",
+ "VersionId": "v1"
+ },
+ "ElastiCacheServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ElastiCacheServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2017-12-07T17:50:04+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateSecurityGroup",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:RevokeSecurityGroupIngress",
+ "cloudwatch:PutMetricData",
+ "outposts:GetOutpost",
+ "outposts:GetOutpostInstanceTypes",
+ "outposts:ListOutposts",
+ "outposts:ListSites"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIML5LIBUZBVCSF7PI",
+ "PolicyName": "ElastiCacheServiceRolePolicy",
+ "UpdateDate": "2020-02-06T21:27:13+00:00",
+ "VersionId": "v3"
+ },
+ "ElasticLoadBalancingFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElasticLoadBalancingFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-09-20T20:42:07+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "elasticloadbalancing:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeCoipPools",
+ "ec2:GetCoipPoolUsage",
+ "ec2:DescribeVpcPeeringConnections",
+ "cognito-idp:DescribeUserPoolClient"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIDPMLA3IUIOQCISJ4",
+ "PolicyName": "ElasticLoadBalancingFullAccess",
+ "UpdateDate": "2021-08-26T18:32:13+00:00",
+ "VersionId": "v6"
+ },
+ "ElasticLoadBalancingReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/ElasticLoadBalancingReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-09-20T20:17:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "elasticloadbalancing:Describe*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstances",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJMO7B7SNFLQ6HH736",
+ "PolicyName": "ElasticLoadBalancingReadOnly",
+ "UpdateDate": "2018-09-20T20:17:09+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalActivationsDownloadSoftwareAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalActivationsDownloadSoftwareAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-08T17:26:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-activations:Get*",
+ "elemental-activations:Download*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IQVGBB6WY",
+ "PolicyName": "ElementalActivationsDownloadSoftwareAccess",
+ "UpdateDate": "2020-09-08T17:26:09+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalActivationsFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalActivationsFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-06-04T21:00:13+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-activations:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IYX6A6CKJ",
+ "PolicyName": "ElementalActivationsFullAccess",
+ "UpdateDate": "2020-06-04T21:00:13+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalActivationsGenerateLicenses": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalActivationsGenerateLicenses",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-28T18:28:58+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-activations:Get*",
+ "elemental-activations:GenerateLicenses",
+ "elemental-activations:StartFileUpload",
+ "elemental-activations:CompleteFileUpload"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LVMPXPYYJ",
+ "PolicyName": "ElementalActivationsGenerateLicenses",
+ "UpdateDate": "2020-08-28T18:28:58+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalActivationsReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalActivationsReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-28T16:51:01+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-activations:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JBRIPMTYG",
+ "PolicyName": "ElementalActivationsReadOnlyAccess",
+ "UpdateDate": "2020-08-28T16:51:01+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalAppliancesSoftwareFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalAppliancesSoftwareFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-07-31T16:28:53+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-appliances-software:*",
+ "elemental-activations:CompleteAccountRegistration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4DHARJPIR5",
+ "PolicyName": "ElementalAppliancesSoftwareFullAccess",
+ "UpdateDate": "2021-02-05T21:01:25+00:00",
+ "VersionId": "v4"
+ },
+ "ElementalAppliancesSoftwareReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalAppliancesSoftwareReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-01T22:31:09+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-appliances-software:List*",
+ "elemental-appliances-software:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CLKYU5WOM",
+ "PolicyName": "ElementalAppliancesSoftwareReadOnlyAccess",
+ "UpdateDate": "2020-04-01T22:31:09+00:00",
+ "VersionId": "v1"
+ },
+ "ElementalSupportCenterFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ElementalSupportCenterFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-25T18:08:30+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "elemental-support-cases:*",
+ "elemental-support-content:*",
+ "elemental-activations:CompleteAccountRegistration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ECPR57WVQ",
+ "PolicyName": "ElementalSupportCenterFullAccess",
+ "UpdateDate": "2021-02-05T21:02:54+00:00",
+ "VersionId": "v2"
+ },
+ "FMSServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/FMSServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-03-28T23:01:12+00:00",
+ "DefaultVersionId": "v23",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "waf:UpdateWebACL",
+ "waf:DeleteWebACL",
+ "waf:GetWebACL",
+ "waf:GetRuleGroup",
+ "waf:ListSubscribedRuleGroups",
+ "waf-regional:UpdateWebACL",
+ "waf-regional:DeleteWebACL",
+ "waf-regional:GetWebACL",
+ "waf-regional:GetRuleGroup",
+ "waf-regional:ListSubscribedRuleGroups",
+ "waf-regional:ListResourcesForWebACL",
+ "waf-regional:AssociateWebACL",
+ "waf-regional:DisassociateWebACL",
+ "elasticloadbalancing:SetWebACL",
+ "apigateway:SetWebACL",
+ "elasticloadbalancing:SetSecurityGroups",
+ "waf:ListTagsForResource",
+ "waf-regional:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:waf:*:*:webacl/*",
+ "arn:aws:waf-regional:*:*:webacl/*",
+ "arn:aws:waf:*:*:rulegroup/*",
+ "arn:aws:waf-regional:*:*:rulegroup/*",
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*",
+ "arn:aws:apigateway:*::/restapis/*/stages/*"
+ ]
+ },
+ {
+ "Action": [
+ "wafv2:PutLoggingConfiguration",
+ "wafv2:GetLoggingConfiguration",
+ "wafv2:ListLoggingConfigurations",
+ "wafv2:DeleteLoggingConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:wafv2:*:*:regional/webacl/*",
+ "arn:aws:wafv2:*:*:global/webacl/*"
+ ]
+ },
+ {
+ "Action": [
+ "waf:CreateWebACL",
+ "waf-regional:CreateWebACL",
+ "waf:GetChangeToken",
+ "waf-regional:GetChangeToken",
+ "waf-regional:GetWebACLForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:waf:*:*:*",
+ "arn:aws:waf-regional:*:*:*"
+ ]
+ },
+ {
+ "Action": [
+ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
+ "elasticloadbalancing:DescribeTags"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "waf:PutPermissionPolicy",
+ "waf:GetPermissionPolicy",
+ "waf:DeletePermissionPolicy",
+ "waf-regional:PutPermissionPolicy",
+ "waf-regional:GetPermissionPolicy",
+ "waf-regional:DeletePermissionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:waf:*:*:webacl/*",
+ "arn:aws:waf:*:*:rulegroup/*",
+ "arn:aws:waf-regional:*:*:webacl/*",
+ "arn:aws:waf-regional:*:*:rulegroup/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudfront:GetDistribution",
+ "cloudfront:UpdateDistribution",
+ "cloudfront:ListDistributionsByWebACLId",
+ "cloudfront:ListDistributions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "config:DeleteConfigRule",
+ "config:DescribeComplianceByConfigRule",
+ "config:DescribeConfigRuleEvaluationStatus",
+ "config:DescribeConfigRules",
+ "config:GetComplianceDetailsByConfigRule",
+ "config:PutConfigRule",
+ "config:StartConfigRulesEvaluation"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:config:*:*:config-rule/aws-service-rule/fms.amazonaws.com/*"
+ },
+ {
+ "Action": [
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:PutConfigurationRecorder",
+ "config:StartConfigurationRecorder",
+ "config:PutDeliveryChannel",
+ "config:DescribeDeliveryChannels",
+ "config:DescribeDeliveryChannelStatus",
+ "config:GetComplianceSummaryByConfigRule",
+ "config:GetDiscoveredResourceCounts",
+ "config:PutEvaluations",
+ "config:SelectResourceConfig"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/fms.amazonaws.com/AWSServiceRoleForFMS"
+ ]
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:ListChildren",
+ "organizations:ListRoots",
+ "organizations:ListParents",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListAWSServiceAccessForOrganization"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "shield:CreateProtection",
+ "shield:DeleteProtection",
+ "shield:DescribeProtection",
+ "shield:ListProtections",
+ "shield:ListAttacks",
+ "shield:CreateSubscription",
+ "shield:DescribeSubscription",
+ "shield:GetSubscriptionState",
+ "shield:DescribeDRTAccess",
+ "shield:DescribeEmergencyContactSettings",
+ "shield:UpdateEmergencyContactSettings",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "ec2:DescribeAddresses",
+ "shield:EnableApplicationLayerAutomaticResponse",
+ "shield:DisableApplicationLayerAutomaticResponse",
+ "shield:UpdateApplicationLayerAutomaticResponse"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:DeleteSecurityGroup",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:security-group/*",
+ "arn:aws:ec2:*:*:instance/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateSecurityGroup",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeStaleSecurityGroups",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcPeeringConnections"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "wafv2:TagResource",
+ "wafv2:ListResourcesForWebACL",
+ "wafv2:AssociateWebACL",
+ "wafv2:ListTagsForResource",
+ "wafv2:UntagResource",
+ "wafv2:GetWebACL",
+ "wafv2:DisassociateFirewallManager",
+ "wafv2:DeleteWebACL",
+ "wafv2:DisassociateWebACL"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:wafv2:*:*:global/webacl/*",
+ "arn:aws:wafv2:*:*:regional/webacl/*"
+ ]
+ },
+ {
+ "Action": [
+ "wafv2:UpdateWebACL",
+ "wafv2:CreateWebACL",
+ "wafv2:DeleteFirewallManagerRuleGroups",
+ "wafv2:PutFirewallManagerRuleGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:wafv2:*:*:global/webacl/*",
+ "arn:aws:wafv2:*:*:regional/webacl/*",
+ "arn:aws:wafv2:*:*:global/rulegroup/*",
+ "arn:aws:wafv2:*:*:regional/rulegroup/*",
+ "arn:aws:wafv2:*:*:global/managedruleset/*",
+ "arn:aws:wafv2:*:*:regional/managedruleset/*",
+ "arn:aws:wafv2:*:*:global/ipset/*",
+ "arn:aws:wafv2:*:*:regional/ipset/*",
+ "arn:aws:wafv2:*:*:global/regexpatternset/*",
+ "arn:aws:wafv2:*:*:regional/regexpatternset/*"
+ ]
+ },
+ {
+ "Action": [
+ "wafv2:PutPermissionPolicy",
+ "wafv2:GetPermissionPolicy",
+ "wafv2:DeletePermissionPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:wafv2:*:*:global/rulegroup/*",
+ "arn:aws:wafv2:*:*:regional/rulegroup/*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudfront:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "wafv2:GetWebACLForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:wafv2:*:*:regional/webacl/*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Name",
+ "FMManaged"
+ ]
+ },
+ "StringEquals": {
+ "ec2:CreateAction": "CreateRouteTable"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:route-table/*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Name",
+ "FMManaged"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*"
+ ]
+ },
+ {
+ "Action": "ec2:DeleteRouteTable",
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/FMManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:route-table/*"
+ },
+ {
+ "Action": [
+ "ec2:AssociateRouteTable",
+ "ec2:CreateSubnet",
+ "ec2:CreateRouteTable",
+ "ec2:DeleteSubnet",
+ "ec2:DisassociateRouteTable",
+ "ec2:ReplaceRouteTableAssociation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeAvailabilityZones"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ram:TagResource"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Name",
+ "FMManaged"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ram:*:*:resource-share/*"
+ ]
+ },
+ {
+ "Action": [
+ "ram:AssociateResourceShare",
+ "ram:UpdateResourceShare",
+ "ram:DeleteResourceShare"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/FMManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ram:*:*:resource-share/*"
+ },
+ {
+ "Action": "ram:CreateResourceShare",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Name",
+ "FMManaged"
+ ]
+ },
+ "StringEquals": {
+ "aws:RequestTag/FMManaged": [
+ "true"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ram:GetResourceShareAssociations",
+ "ram:GetResourceShares"
+ ],
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ram"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": [
+ "network-firewall.amazonaws.com",
+ "shield.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:GetRole",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "network-firewall:TagResource"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "Name",
+ "FMManaged"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "network-firewall:AssociateSubnets",
+ "network-firewall:CreateFirewall",
+ "network-firewall:CreateFirewallPolicy",
+ "network-firewall:DisassociateSubnets",
+ "network-firewall:UpdateFirewallDeleteProtection",
+ "network-firewall:UpdateFirewallPolicy",
+ "network-firewall:UpdateFirewallPolicyChangeProtection",
+ "network-firewall:UpdateSubnetChangeProtection",
+ "network-firewall:AssociateFirewallPolicy",
+ "network-firewall:DescribeFirewall",
+ "network-firewall:DescribeFirewallPolicy",
+ "network-firewall:DescribeRuleGroup",
+ "network-firewall:ListFirewallPolicies",
+ "network-firewall:ListFirewalls",
+ "network-firewall:ListRuleGroups",
+ "network-firewall:PutResourcePolicy",
+ "network-firewall:DescribeResourcePolicy",
+ "network-firewall:DeleteResourcePolicy",
+ "network-firewall:DescribeLoggingConfiguration",
+ "network-firewall:UpdateLoggingConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "network-firewall:DeleteFirewallPolicy",
+ "network-firewall:DeleteFirewall"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/FMManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:ListLogDeliveries",
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "route53resolver:ListFirewallRuleGroupAssociations",
+ "route53resolver:ListTagsForResource",
+ "route53resolver:ListFirewallRuleGroups",
+ "route53resolver:GetFirewallRuleGroupAssociation",
+ "route53resolver:GetFirewallRuleGroup",
+ "route53resolver:GetFirewallRuleGroupPolicy",
+ "route53resolver:PutFirewallRuleGroupPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "route53resolver:UpdateFirewallRuleGroupAssociation",
+ "route53resolver:DisassociateFirewallRuleGroup"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/FMManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53resolver:*:*:firewall-rule-group-association/*"
+ },
+ {
+ "Action": [
+ "route53resolver:AssociateFirewallRuleGroup",
+ "route53resolver:TagResource"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:RequestTag/FMManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53resolver:*:*:firewall-rule-group-association/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI62NTGYJB446ACUEA",
+ "PolicyName": "FMSServiceRolePolicy",
+ "UpdateDate": "2022-02-16T18:35:29+00:00",
+ "VersionId": "v23"
+ },
+ "FSxDeleteServiceLinkedRoleAccess": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/FSxDeleteServiceLinkedRoleAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-28T10:40:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:*:iam::*:role/aws-service-role/s3.data-source.lustre.fsx.amazonaws.com/AWSServiceRoleForFSxS3Access_*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6IRP2YV2YPKWPPNQ",
+ "PolicyName": "FSxDeleteServiceLinkedRoleAccess",
+ "UpdateDate": "2018-11-28T10:40:24+00:00",
+ "VersionId": "v1"
+ },
+ "GameLiftGameServerGroupPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/GameLiftGameServerGroupPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-04-03T23:12:19+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "ec2:TerminateInstances",
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/GameLift": "GameServerGroups"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "autoscaling:CompleteLifecycleAction",
+ "autoscaling:ResumeProcesses",
+ "autoscaling:EnterStandby",
+ "autoscaling:SetInstanceProtection",
+ "autoscaling:UpdateAutoScalingGroup",
+ "autoscaling:SuspendProcesses",
+ "autoscaling:DetachInstances"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "aws:ResourceTag/GameLift": "GameServerGroups"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "autoscaling:DescribeAutoScalingGroups",
+ "ec2:DescribeLaunchTemplateVersions",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "sns:Publish",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:*:sns:*:*:ActivatingLifecycleHookTopic-*",
+ "arn:*:sns:*:*:TerminatingLifecycleHookTopic-*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/GameLift"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JTX4JYBF6",
+ "PolicyName": "GameLiftGameServerGroupPolicy",
+ "UpdateDate": "2020-05-13T17:27:43+00:00",
+ "VersionId": "v3"
+ },
+ "GlobalAcceleratorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/GlobalAcceleratorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T02:44:44+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "globalaccelerator:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "elasticloadbalancing:DescribeLoadBalancers",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAddresses",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeRegions",
+ "ec2:DescribeSubnets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "globalaccelerator.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/globalaccelerator.amazonaws.com/AWSServiceRoleForGlobalAccelerator*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ3NSRQKPB42BCNRT6",
+ "PolicyName": "GlobalAcceleratorFullAccess",
+ "UpdateDate": "2020-12-04T19:17:26+00:00",
+ "VersionId": "v6"
+ },
+ "GlobalAcceleratorReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/GlobalAcceleratorReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T02:41:00+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "globalaccelerator:Describe*",
+ "globalaccelerator:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYXHGCVENJKQZRNGU",
+ "PolicyName": "GlobalAcceleratorReadOnlyAccess",
+ "UpdateDate": "2018-11-27T02:41:00+00:00",
+ "VersionId": "v1"
+ },
+ "GreengrassOTAUpdateArtifactAccess": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/GreengrassOTAUpdateArtifactAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T18:11:47+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*-greengrass-updates/*"
+ ],
+ "Sid": "AllowsIotToAccessGreengrassOTAUpdateArtifacts"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFGE66SKIK3GW5UC2",
+ "PolicyName": "GreengrassOTAUpdateArtifactAccess",
+ "UpdateDate": "2018-12-18T00:59:43+00:00",
+ "VersionId": "v2"
+ },
+ "Health_OrganizationsServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/Health_OrganizationsServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-16T13:28:21+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "organizations:ListAccounts",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "organizations:ListAWSServiceAccessForOrganization",
+ "Effect": "Allow",
+ "Resource": "*",
+ "Sid": "ListAWSServiceAccessForOrganization0"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4EZKGOJYHQ",
+ "PolicyName": "Health_OrganizationsServiceRolePolicy",
+ "UpdateDate": "2020-06-08T12:48:44+00:00",
+ "VersionId": "v2"
+ },
+ "IAMAccessAdvisorReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/IAMAccessAdvisorReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-21T19:33:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:ListRoles",
+ "iam:ListUsers",
+ "iam:ListGroups",
+ "iam:ListPolicies",
+ "iam:ListPoliciesGrantingServiceAccess",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:GenerateOrganizationsAccessReport",
+ "iam:GenerateCredentialReport",
+ "iam:GetRole",
+ "iam:GetPolicy",
+ "iam:GetServiceLastAccessedDetails",
+ "iam:GetServiceLastAccessedDetailsWithEntities",
+ "iam:GetOrganizationsAccessReport",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribePolicy",
+ "organizations:ListChildren",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "organizations:ListRoots",
+ "organizations:ListPolicies",
+ "organizations:ListTargetsForPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FNDX5PG6Z",
+ "PolicyName": "IAMAccessAdvisorReadOnly",
+ "UpdateDate": "2019-06-21T19:33:45+00:00",
+ "VersionId": "v1"
+ },
+ "IAMAccessAnalyzerFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMAccessAnalyzerFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-02T17:12:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "access-analyzer.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:ListAccounts",
+ "organizations:ListAccountsForParent",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListChildren",
+ "organizations:ListDelegatedAdministrators",
+ "organizations:ListOrganizationalUnitsForParent",
+ "organizations:ListParents",
+ "organizations:ListRoots"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4MAZGHIYZN",
+ "PolicyName": "IAMAccessAnalyzerFullAccess",
+ "UpdateDate": "2019-12-02T17:12:40+00:00",
+ "VersionId": "v1"
+ },
+ "IAMAccessAnalyzerReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-12-02T17:12:53+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:Get*",
+ "access-analyzer:List*",
+ "access-analyzer:ValidatePolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GY4R3GAPM",
+ "PolicyName": "IAMAccessAnalyzerReadOnlyAccess",
+ "UpdateDate": "2021-03-16T20:37:30+00:00",
+ "VersionId": "v2"
+ },
+ "IAMFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:38+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:*",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:DescribeOrganizationalUnit",
+ "organizations:DescribePolicy",
+ "organizations:ListChildren",
+ "organizations:ListParents",
+ "organizations:ListPoliciesForTarget",
+ "organizations:ListRoots",
+ "organizations:ListPolicies",
+ "organizations:ListTargetsForPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI7XKCFMBPM3QQRRVQ",
+ "PolicyName": "IAMFullAccess",
+ "UpdateDate": "2019-06-21T19:40:00+00:00",
+ "VersionId": "v2"
+ },
+ "IAMReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/IAMReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:40:39+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:GenerateCredentialReport",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:Get*",
+ "iam:List*",
+ "iam:SimulateCustomPolicy",
+ "iam:SimulatePrincipalPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKSO7NDY4T57MWDSQ",
+ "PolicyName": "IAMReadOnlyAccess",
+ "UpdateDate": "2018-01-25T19:11:27+00:00",
+ "VersionId": "v4"
+ },
+ "IAMSelfManageServiceSpecificCredentials": {
+ "Arn": "arn:aws:iam::aws:policy/IAMSelfManageServiceSpecificCredentials",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-12-22T17:25:18+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:CreateServiceSpecificCredential",
+ "iam:ListServiceSpecificCredentials",
+ "iam:UpdateServiceSpecificCredential",
+ "iam:DeleteServiceSpecificCredential",
+ "iam:ResetServiceSpecificCredential"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI4VT74EMXK2PMQJM2",
+ "PolicyName": "IAMSelfManageServiceSpecificCredentials",
+ "UpdateDate": "2016-12-22T17:25:18+00:00",
+ "VersionId": "v1"
+ },
+ "IAMUserChangePassword": {
+ "Arn": "arn:aws:iam::aws:policy/IAMUserChangePassword",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-15T00:25:16+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:ChangePassword"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:user/${aws:username}"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetAccountPasswordPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4L4MM2A7QIEB56MS",
+ "PolicyName": "IAMUserChangePassword",
+ "UpdateDate": "2016-11-15T23:18:55+00:00",
+ "VersionId": "v2"
+ },
+ "IAMUserSSHKeys": {
+ "Arn": "arn:aws:iam::aws:policy/IAMUserSSHKeys",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-07-09T17:08:54+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteSSHPublicKey",
+ "iam:GetSSHPublicKey",
+ "iam:ListSSHPublicKeys",
+ "iam:UpdateSSHPublicKey",
+ "iam:UploadSSHPublicKey"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:user/${aws:username}"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJTSHUA4UXGXU7ANUA",
+ "PolicyName": "IAMUserSSHKeys",
+ "UpdateDate": "2015-07-09T17:08:54+00:00",
+ "VersionId": "v1"
+ },
+ "IVSRecordToS3": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/IVSRecordToS3",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-12-05T00:10:43+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:PutObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::AWSIVS_*/ivs/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4M65NGVKOJ",
+ "PolicyName": "IVSRecordToS3",
+ "UpdateDate": "2020-12-05T00:10:43+00:00",
+ "VersionId": "v1"
+ },
+ "KafkaConnectServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/KafkaConnectServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-09-07T13:12:44+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "AmazonMSKConnectManaged"
+ },
+ "StringEquals": {
+ "aws:RequestTag/AmazonMSKConnectManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CreateNetworkInterface"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:AttachNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/AmazonMSKConnectManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KFEKH7VR6",
+ "PolicyName": "KafkaConnectServiceRolePolicy",
+ "UpdateDate": "2021-09-07T13:12:44+00:00",
+ "VersionId": "v1"
+ },
+ "KafkaServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/KafkaServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-15T23:31:48+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:AttachNetworkInterface",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DetachNetworkInterface",
+ "acm-pca:GetCertificateAuthorityCertificate",
+ "secretsmanager:ListSecrets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "secretsmanager:GetResourcePolicy",
+ "secretsmanager:PutResourcePolicy",
+ "secretsmanager:DeleteResourcePolicy",
+ "secretsmanager:DescribeSecret"
+ ],
+ "Condition": {
+ "ArnLike": {
+ "secretsmanager:SecretId": "arn:*:secretsmanager:*:*:secret:AmazonMSK_*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJUXPRZ76MAP2EVQJU",
+ "PolicyName": "KafkaServiceRolePolicy",
+ "UpdateDate": "2020-08-26T20:40:53+00:00",
+ "VersionId": "v3"
+ },
+ "LakeFormationDataAccessServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/LakeFormationDataAccessServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-20T20:46:19+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4N342E3KHW",
+ "PolicyName": "LakeFormationDataAccessServiceRolePolicy",
+ "UpdateDate": "2019-06-20T20:46:19+00:00",
+ "VersionId": "v1"
+ },
+ "LexBotPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/LexBotPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-17T22:18:13+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "polly:SynthesizeSpeech"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "comprehend:DetectSentiment"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJJ3NZRBBQKSESXXJC",
+ "PolicyName": "LexBotPolicy",
+ "UpdateDate": "2019-11-13T22:29:16+00:00",
+ "VersionId": "v2"
+ },
+ "LexChannelPolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/LexChannelPolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-02-17T23:23:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "lex:PostText"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKYEISPO63JTBJWPY",
+ "PolicyName": "LexChannelPolicy",
+ "UpdateDate": "2017-02-17T23:23:24+00:00",
+ "VersionId": "v1"
+ },
+ "LightsailExportAccess": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/LightsailExportAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-09-28T16:35:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "iam:DeleteServiceLinkedRole",
+ "iam:GetServiceLinkedRoleDeletionStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/lightsail.amazonaws.com/AWSServiceRoleForLightsail*"
+ },
+ {
+ "Action": [
+ "ec2:CopySnapshot",
+ "ec2:DescribeSnapshots",
+ "ec2:CopyImage",
+ "ec2:DescribeImages"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetAccountPublicAccessBlock"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ4LZGPQLZWMVR4WMQ",
+ "PolicyName": "LightsailExportAccess",
+ "UpdateDate": "2022-01-15T01:45:33+00:00",
+ "VersionId": "v2"
+ },
+ "MediaPackageServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/MediaPackageServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-09-18T17:45:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "logs:PutLogEvents",
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*:log-stream:*"
+ },
+ {
+ "Action": [
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4GXH4HDK6N",
+ "PolicyName": "MediaPackageServiceRolePolicy",
+ "UpdateDate": "2020-09-18T17:45:47+00:00",
+ "VersionId": "v1"
+ },
+ "MemoryDBServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/MemoryDBServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-08-17T22:34:59+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateTags"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": [
+ "AmazonMemoryDBManaged"
+ ]
+ },
+ "StringEquals": {
+ "ec2:CreateAction": "CreateNetworkInterface"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:network-interface/*",
+ "arn:aws:ec2:*:*:subnet/*",
+ "arn:aws:ec2:*:*:security-group/*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "ec2:ResourceTag/AmazonMemoryDBManaged": "true"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:network-interface/*"
+ },
+ {
+ "Action": [
+ "ec2:DeleteNetworkInterface",
+ "ec2:ModifyNetworkInterfaceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:security-group/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:PutMetricData"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "cloudwatch:namespace": "AWS/MemoryDB"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4KWEJCOJNF",
+ "PolicyName": "MemoryDBServiceRolePolicy",
+ "UpdateDate": "2021-08-18T23:48:16+00:00",
+ "VersionId": "v2"
+ },
+ "MigrationHubDMSAccessServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/MigrationHubDMSAccessServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-12T17:50:39+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mgh:CreateProgressUpdateStream",
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS"
+ },
+ {
+ "Action": [
+ "mgh:DescribeMigrationTask",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:ListDiscoveredResources",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:AssociateCreatedArtifact",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:PutResourceAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/DMS/migrationTask/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IV7DIZ555",
+ "PolicyName": "MigrationHubDMSAccessServiceRolePolicy",
+ "UpdateDate": "2019-10-07T17:57:44+00:00",
+ "VersionId": "v2"
+ },
+ "MigrationHubSMSAccessServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/MigrationHubSMSAccessServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-12T18:30:28+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "mgh:CreateProgressUpdateStream",
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS"
+ },
+ {
+ "Action": [
+ "mgh:DescribeMigrationTask",
+ "mgh:AssociateDiscoveredResource",
+ "mgh:ListDiscoveredResources",
+ "mgh:ImportMigrationTask",
+ "mgh:ListCreatedArtifacts",
+ "mgh:DisassociateDiscoveredResource",
+ "mgh:AssociateCreatedArtifact",
+ "mgh:NotifyMigrationTaskState",
+ "mgh:DisassociateCreatedArtifact",
+ "mgh:PutResourceAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:mgh:*:*:progressUpdateStream/SMS/migrationTask/*"
+ },
+ {
+ "Action": [
+ "mgh:ListMigrationTasks",
+ "mgh:NotifyApplicationState",
+ "mgh:DescribeApplicationState",
+ "mgh:GetHomeRegion"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4JCW2B2IGB",
+ "PolicyName": "MigrationHubSMSAccessServiceRolePolicy",
+ "UpdateDate": "2019-10-07T18:02:22+00:00",
+ "VersionId": "v2"
+ },
+ "MigrationHubServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/MigrationHubServiceRolePolicy",
+ "AttachmentCount": 1,
+ "CreateDate": "2019-06-12T17:22:16+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "discovery:ListConfigurations",
+ "discovery:DescribeConfigurations"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "aws:migrationhub:source-id"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ec2:*:*:instance/*",
+ "arn:aws:ec2:*:*:image/*",
+ "arn:aws:ec2:*:*:volume/*"
+ ]
+ },
+ {
+ "Action": "dms:AddTagsToResource",
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "aws:TagKeys": "aws:migrationhub:source-id"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:dms:*:*:endpoint:*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:DescribeInstanceAttribute"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NWLJ3LLW3",
+ "PolicyName": "MigrationHubServiceRolePolicy",
+ "UpdateDate": "2020-08-06T18:08:46+00:00",
+ "VersionId": "v3"
+ },
+ "NeptuneConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/NeptuneConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-06-19T21:35:19+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:CreateDBCluster",
+ "rds:CreateDBInstance"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "rds:DatabaseEngine": [
+ "graphdb",
+ "neptune"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:AddRoleToDBCluster",
+ "rds:AddSourceIdentifierToSubscription",
+ "rds:AddTagsToResource",
+ "rds:ApplyPendingMaintenanceAction",
+ "rds:CopyDBClusterParameterGroup",
+ "rds:CopyDBClusterSnapshot",
+ "rds:CopyDBParameterGroup",
+ "rds:CreateDBClusterParameterGroup",
+ "rds:CreateDBClusterSnapshot",
+ "rds:CreateDBParameterGroup",
+ "rds:CreateDBSubnetGroup",
+ "rds:CreateEventSubscription",
+ "rds:DeleteDBCluster",
+ "rds:DeleteDBClusterParameterGroup",
+ "rds:DeleteDBClusterSnapshot",
+ "rds:DeleteDBInstance",
+ "rds:DeleteDBParameterGroup",
+ "rds:DeleteDBSubnetGroup",
+ "rds:DeleteEventSubscription",
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEngineDefaultClusterParameters",
+ "rds:DescribeEngineDefaultParameters",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DescribeValidDBInstanceModifications",
+ "rds:DownloadDBLogFilePortion",
+ "rds:FailoverDBCluster",
+ "rds:ListTagsForResource",
+ "rds:ModifyDBCluster",
+ "rds:ModifyDBClusterParameterGroup",
+ "rds:ModifyDBClusterSnapshotAttribute",
+ "rds:ModifyDBInstance",
+ "rds:ModifyDBParameterGroup",
+ "rds:ModifyDBSubnetGroup",
+ "rds:ModifyEventSubscription",
+ "rds:PromoteReadReplicaDBCluster",
+ "rds:RebootDBInstance",
+ "rds:RemoveRoleFromDBCluster",
+ "rds:RemoveSourceIdentifierFromSubscription",
+ "rds:RemoveTagsFromResource",
+ "rds:ResetDBClusterParameterGroup",
+ "rds:ResetDBParameterGroup",
+ "rds:RestoreDBClusterFromSnapshot",
+ "rds:RestoreDBClusterToPointInTime"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:AllocateAddress",
+ "ec2:AssignIpv6Addresses",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateRouteTable",
+ "ec2:AssociateSubnetCidrBlock",
+ "ec2:AssociateVpcCidrBlock",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDefaultSubnet",
+ "ec2:CreateDefaultVpc",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpcEndpoint",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeInstances",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpcs",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "iam:ListRoles",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies",
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:passedToService": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJWTD4ELX2KRNICUVQ",
+ "PolicyName": "NeptuneConsoleFullAccess",
+ "UpdateDate": "2020-09-02T17:25:07+00:00",
+ "VersionId": "v4"
+ },
+ "NeptuneFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/NeptuneFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-30T19:17:31+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:CreateDBCluster",
+ "rds:CreateDBInstance"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "rds:DatabaseEngine": [
+ "graphdb",
+ "neptune"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:rds:*:*:*"
+ ]
+ },
+ {
+ "Action": [
+ "rds:AddRoleToDBCluster",
+ "rds:AddSourceIdentifierToSubscription",
+ "rds:AddTagsToResource",
+ "rds:ApplyPendingMaintenanceAction",
+ "rds:CopyDBClusterParameterGroup",
+ "rds:CopyDBClusterSnapshot",
+ "rds:CopyDBParameterGroup",
+ "rds:CreateDBClusterParameterGroup",
+ "rds:CreateDBClusterSnapshot",
+ "rds:CreateDBParameterGroup",
+ "rds:CreateDBSubnetGroup",
+ "rds:CreateEventSubscription",
+ "rds:DeleteDBCluster",
+ "rds:DeleteDBClusterParameterGroup",
+ "rds:DeleteDBClusterSnapshot",
+ "rds:DeleteDBInstance",
+ "rds:DeleteDBParameterGroup",
+ "rds:DeleteDBSubnetGroup",
+ "rds:DeleteEventSubscription",
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSecurityGroups",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEngineDefaultClusterParameters",
+ "rds:DescribeEngineDefaultParameters",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOptionGroups",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DescribeValidDBInstanceModifications",
+ "rds:DownloadDBLogFilePortion",
+ "rds:FailoverDBCluster",
+ "rds:ListTagsForResource",
+ "rds:ModifyDBCluster",
+ "rds:ModifyDBClusterParameterGroup",
+ "rds:ModifyDBClusterSnapshotAttribute",
+ "rds:ModifyDBInstance",
+ "rds:ModifyDBParameterGroup",
+ "rds:ModifyDBSubnetGroup",
+ "rds:ModifyEventSubscription",
+ "rds:PromoteReadReplicaDBCluster",
+ "rds:RebootDBInstance",
+ "rds:RemoveRoleFromDBCluster",
+ "rds:RemoveSourceIdentifierFromSubscription",
+ "rds:RemoveTagsFromResource",
+ "rds:ResetDBClusterParameterGroup",
+ "rds:ResetDBParameterGroup",
+ "rds:RestoreDBClusterFromSnapshot",
+ "rds:RestoreDBClusterToPointInTime"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies",
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "sns:ListSubscriptions",
+ "sns:ListTopics",
+ "sns:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:passedToService": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:CreateServiceLinkedRole",
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "rds.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIXSDEYRCNJRC6ITFK",
+ "PolicyName": "NeptuneFullAccess",
+ "UpdateDate": "2020-09-02T17:24:56+00:00",
+ "VersionId": "v5"
+ },
+ "NeptuneReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/NeptuneReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-05-30T19:16:37+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "rds:DescribeAccountAttributes",
+ "rds:DescribeCertificates",
+ "rds:DescribeDBClusterParameterGroups",
+ "rds:DescribeDBClusterParameters",
+ "rds:DescribeDBClusterSnapshotAttributes",
+ "rds:DescribeDBClusterSnapshots",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBEngineVersions",
+ "rds:DescribeDBInstances",
+ "rds:DescribeDBLogFiles",
+ "rds:DescribeDBParameterGroups",
+ "rds:DescribeDBParameters",
+ "rds:DescribeDBSubnetGroups",
+ "rds:DescribeEventCategories",
+ "rds:DescribeEventSubscriptions",
+ "rds:DescribeEvents",
+ "rds:DescribeOrderableDBInstanceOptions",
+ "rds:DescribePendingMaintenanceActions",
+ "rds:DownloadDBLogFilePortion",
+ "rds:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcs"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kms:ListKeys",
+ "kms:ListRetirableGrants",
+ "kms:ListAliases",
+ "kms:ListKeyPolicies"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*",
+ "arn:aws:logs:*:*:log-group:/aws/neptune/*:log-stream:*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJS5OQ5RXULC66WTGQ",
+ "PolicyName": "NeptuneReadOnlyAccess",
+ "UpdateDate": "2018-05-30T19:16:37+00:00",
+ "VersionId": "v1"
+ },
+ "NetworkAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/NetworkAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:31:35+00:00",
+ "DefaultVersionId": "v11",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:Describe*",
+ "cloudfront:ListDistributions",
+ "cloudwatch:DeleteAlarms",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "directconnect:*",
+ "ec2:AcceptVpcEndpointConnections",
+ "ec2:AllocateAddress",
+ "ec2:AssignIpv6Addresses",
+ "ec2:AssignPrivateIpAddresses",
+ "ec2:AssociateAddress",
+ "ec2:AssociateDhcpOptions",
+ "ec2:AssociateRouteTable",
+ "ec2:AssociateSubnetCidrBlock",
+ "ec2:AssociateVpcCidrBlock",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:CreateCarrierGateway",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDefaultSubnet",
+ "ec2:CreateDefaultVpc",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateEgressOnlyInternetGateway",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkAcl",
+ "ec2:CreateNetworkAclEntry",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:CreatePlacementGroup",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpcEndpointConnectionNotification",
+ "ec2:CreateVpcEndpointServiceConfiguration",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:DeleteCarrierGateway",
+ "ec2:DeleteEgressOnlyInternetGateway",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:DeletePlacementGroup",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpointConnectionNotifications",
+ "ec2:DeleteVpcEndpointServiceConfigurations",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeCarrierGateways",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeEgressOnlyInternetGateways",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeInstances",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetworkAcls",
+ "ec2:DescribeNetworkInterfaceAttribute",
+ "ec2:DescribeNetworkInterfacePermissions",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroupReferences",
+ "ec2:DescribeSecurityGroupRules",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeStaleSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVpcAttribute",
+ "ec2:DescribeVpcClassicLink",
+ "ec2:DescribeVpcClassicLinkDnsSupport",
+ "ec2:DescribeVpcEndpointConnectionNotifications",
+ "ec2:DescribeVpcEndpointConnections",
+ "ec2:DescribeVpcEndpointServiceConfigurations",
+ "ec2:DescribeVpcEndpointServicePermissions",
+ "ec2:DescribeVpcEndpointServices",
+ "ec2:DescribeVpcEndpoints",
+ "ec2:DescribeVpcPeeringConnections",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribePublicIpv4Pools",
+ "ec2:DescribeIpv6Pools",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisableVpcClassicLinkDnsSupport",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:DisassociateSubnetCidrBlock",
+ "ec2:DisassociateVpcCidrBlock",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:EnableVpcClassicLinkDnsSupport",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:ModifySecurityGroupRules",
+ "ec2:ModifySubnetAttribute",
+ "ec2:ModifyVpcAttribute",
+ "ec2:ModifyVpcEndpoint",
+ "ec2:ModifyVpcEndpointConnectionNotification",
+ "ec2:ModifyVpcEndpointServiceConfiguration",
+ "ec2:ModifyVpcEndpointServicePermissions",
+ "ec2:ModifyVpcPeeringConnectionOptions",
+ "ec2:ModifyVpcTenancy",
+ "ec2:MoveAddressToVpc",
+ "ec2:RejectVpcEndpointConnections",
+ "ec2:ReleaseAddress",
+ "ec2:ReplaceNetworkAclAssociation",
+ "ec2:ReplaceNetworkAclEntry",
+ "ec2:ReplaceRoute",
+ "ec2:ReplaceRouteTableAssociation",
+ "ec2:ResetNetworkInterfaceAttribute",
+ "ec2:RestoreAddressToClassic",
+ "ec2:UnassignIpv6Addresses",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "elasticloadbalancing:*",
+ "logs:DescribeLogGroups",
+ "logs:DescribeLogStreams",
+ "logs:GetLogEvents",
+ "route53:*",
+ "route53domains:*",
+ "sns:CreateTopic",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTopics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNetworkAcl",
+ "ec2:DeleteNetworkAclEntry",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DisableVpcClassicLink",
+ "ec2:EnableVpcClassicLink",
+ "ec2:GetConsoleScreenshot",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:CreateLocalGatewayRoute",
+ "ec2:CreateLocalGatewayRouteTableVpcAssociation",
+ "ec2:DeleteLocalGatewayRoute",
+ "ec2:DeleteLocalGatewayRouteTableVpcAssociation",
+ "ec2:DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayVirtualInterfaceGroups",
+ "ec2:DescribeLocalGatewayVirtualInterfaces",
+ "ec2:DescribeLocalGateways",
+ "ec2:SearchLocalGatewayRoutes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:GetBucketWebsite",
+ "s3:ListBucket"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListRoles",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/flow-logs-*"
+ },
+ {
+ "Action": [
+ "networkmanager:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AcceptTransitGatewayVpcAttachment",
+ "ec2:AssociateTransitGatewayRouteTable",
+ "ec2:CreateTransitGateway",
+ "ec2:CreateTransitGatewayRoute",
+ "ec2:CreateTransitGatewayRouteTable",
+ "ec2:CreateTransitGatewayVpcAttachment",
+ "ec2:DeleteTransitGateway",
+ "ec2:DeleteTransitGatewayRoute",
+ "ec2:DeleteTransitGatewayRouteTable",
+ "ec2:DeleteTransitGatewayVpcAttachment",
+ "ec2:DescribeTransitGatewayAttachments",
+ "ec2:DescribeTransitGatewayRouteTables",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "ec2:DescribeTransitGateways",
+ "ec2:DisableTransitGatewayRouteTablePropagation",
+ "ec2:DisassociateTransitGatewayRouteTable",
+ "ec2:EnableTransitGatewayRouteTablePropagation",
+ "ec2:ExportTransitGatewayRoutes",
+ "ec2:GetTransitGatewayAttachmentPropagations",
+ "ec2:GetTransitGatewayRouteTableAssociations",
+ "ec2:GetTransitGatewayRouteTablePropagations",
+ "ec2:ModifyTransitGateway",
+ "ec2:ModifyTransitGatewayVpcAttachment",
+ "ec2:RejectTransitGatewayVpcAttachment",
+ "ec2:ReplaceTransitGatewayRoute",
+ "ec2:SearchTransitGatewayRoutes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": [
+ "transitgateway.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJPNMADZFJCVPJVZA2",
+ "PolicyName": "NetworkAdministrator",
+ "UpdateDate": "2021-09-16T20:22:54+00:00",
+ "VersionId": "v11"
+ },
+ "PowerUserAccess": {
+ "Arn": "arn:aws:iam::aws:policy/PowerUserAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:47+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "NotAction": [
+ "iam:*",
+ "organizations:*",
+ "account:*"
+ ],
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole",
+ "iam:DeleteServiceLinkedRole",
+ "iam:ListRoles",
+ "organizations:DescribeOrganization",
+ "account:ListRegions"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYRXTHIB4FOVS3ZXS",
+ "PolicyName": "PowerUserAccess",
+ "UpdateDate": "2019-03-20T22:19:03+00:00",
+ "VersionId": "v4"
+ },
+ "QuickSightAccessForS3StorageManagementAnalyticsReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/QuickSightAccessForS3StorageManagementAnalyticsReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-06-12T18:18:38+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::s3-analytics-export-shared-*"
+ ]
+ },
+ {
+ "Action": [
+ "s3:GetAnalyticsConfiguration",
+ "s3:ListAllMyBuckets",
+ "s3:GetBucketLocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFWG3L3WDMR4I7ZJW",
+ "PolicyName": "QuickSightAccessForS3StorageManagementAnalyticsReadOnly",
+ "UpdateDate": "2019-10-08T23:53:11+00:00",
+ "VersionId": "v4"
+ },
+ "RDSCloudHsmAuthorizationRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/RDSCloudHsmAuthorizationRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:29+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudhsm:CreateLunaClient",
+ "cloudhsm:DeleteLunaClient",
+ "cloudhsm:DescribeHapg",
+ "cloudhsm:DescribeLunaClient",
+ "cloudhsm:GetConfig",
+ "cloudhsm:ModifyHapg",
+ "cloudhsm:ModifyLunaClient"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIWKFXRLQG2ROKKXLE",
+ "PolicyName": "RDSCloudHsmAuthorizationRole",
+ "UpdateDate": "2019-09-26T22:14:29+00:00",
+ "VersionId": "v2"
+ },
+ "ReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:48+00:00",
+ "DefaultVersionId": "v83",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "a4b:Get*",
+ "a4b:List*",
+ "a4b:Search*",
+ "access-analyzer:GetAccessPreview",
+ "access-analyzer:GetAnalyzedResource",
+ "access-analyzer:GetAnalyzer",
+ "access-analyzer:GetArchiveRule",
+ "access-analyzer:GetFinding",
+ "access-analyzer:GetGeneratedPolicy",
+ "access-analyzer:ListAccessPreviewFindings",
+ "access-analyzer:ListAccessPreviews",
+ "access-analyzer:ListAnalyzedResources",
+ "access-analyzer:ListAnalyzers",
+ "access-analyzer:ListArchiveRules",
+ "access-analyzer:ListFindings",
+ "access-analyzer:ListPolicyGenerations",
+ "access-analyzer:ListTagsForResource",
+ "access-analyzer:ValidatePolicy",
+ "acm-pca:Describe*",
+ "acm-pca:Get*",
+ "acm-pca:List*",
+ "acm:Describe*",
+ "acm:Get*",
+ "acm:List*",
+ "airflow:ListEnvironments",
+ "airflow:ListTagsForResource",
+ "amplify:GetApp",
+ "amplify:GetBranch",
+ "amplify:GetDomainAssociation",
+ "amplify:GetJob",
+ "amplify:ListApps",
+ "amplify:ListBranches",
+ "amplify:ListDomainAssociations",
+ "amplify:ListJobs",
+ "apigateway:GET",
+ "appconfig:GetApplication",
+ "appconfig:GetConfiguration",
+ "appconfig:GetConfigurationProfile",
+ "appconfig:GetDeployment",
+ "appconfig:GetDeploymentStrategy",
+ "appconfig:GetEnvironment",
+ "appconfig:GetHostedConfigurationVersion",
+ "appconfig:ListApplications",
+ "appconfig:ListConfigurationProfiles",
+ "appconfig:ListDeployments",
+ "appconfig:ListDeploymentStrategies",
+ "appconfig:ListEnvironments",
+ "appconfig:ListHostedConfigurationVersions",
+ "appconfig:ListTagsForResource",
+ "application-autoscaling:Describe*",
+ "applicationinsights:Describe*",
+ "applicationinsights:List*",
+ "appmesh:Describe*",
+ "appmesh:List*",
+ "appstream:Describe*",
+ "appstream:List*",
+ "appsync:Get*",
+ "appsync:List*",
+ "aps:DescribeAlertManagerDefinition",
+ "aps:DescribeRuleGroupsNamespace",
+ "aps:DescribeWorkspace",
+ "aps:GetAlertManagerSilence",
+ "aps:GetAlertManagerStatus",
+ "aps:GetLabels",
+ "aps:GetMetricMetadata",
+ "aps:GetSeries",
+ "aps:ListAlerts",
+ "aps:ListAlertManagerAlerts",
+ "aps:ListAlertManagerAlertGroups",
+ "aps:ListAlertManagerReceivers",
+ "aps:ListAlertManagerSilences",
+ "aps:ListRules",
+ "aps:ListRuleGroupsNamespaces",
+ "aps:ListTagsForResource",
+ "aps:ListWorkspaces",
+ "aps:QueryMetrics",
+ "athena:Batch*",
+ "athena:Get*",
+ "athena:List*",
+ "auditmanager:GetAccountStatus",
+ "auditmanager:GetAssessment",
+ "auditmanager:GetAssessmentFramework",
+ "auditmanager:GetAssessmentReportUrl",
+ "auditmanager:GetChangeLogs",
+ "auditmanager:GetControl",
+ "auditmanager:GetDelegations",
+ "auditmanager:GetEvidence",
+ "auditmanager:GetEvidenceByEvidenceFolder",
+ "auditmanager:GetEvidenceFolder",
+ "auditmanager:GetEvidenceFoldersByAssessment",
+ "auditmanager:GetEvidenceFoldersByAssessmentControl",
+ "auditmanager:GetOrganizationAdminAccount",
+ "auditmanager:GetServicesInScope",
+ "auditmanager:GetSettings",
+ "auditmanager:ListAssessmentFrameworks",
+ "auditmanager:ListAssessmentReports",
+ "auditmanager:ListAssessments",
+ "auditmanager:ListControls",
+ "auditmanager:ListKeywordsForDataSource",
+ "auditmanager:ListNotifications",
+ "auditmanager:ListTagsForResource",
+ "auditmanager:ValidateAssessmentReportIntegrity",
+ "autoscaling-plans:Describe*",
+ "autoscaling-plans:GetScalingPlanResourceForecastData",
+ "autoscaling:Describe*",
+ "aws-portal:View*",
+ "backup:Describe*",
+ "backup:Get*",
+ "backup:List*",
+ "batch:Describe*",
+ "batch:List*",
+ "braket:GetDevice",
+ "braket:GetQuantumTask",
+ "braket:SearchDevices",
+ "braket:SearchQuantumTasks",
+ "budgets:Describe*",
+ "budgets:View*",
+ "cassandra:Select",
+ "ce:DescribeCostCategoryDefinition",
+ "ce:DescribeNotificationSubscription",
+ "ce:DescribeReport",
+ "ce:GetAnomalies",
+ "ce:GetAnomalyMonitors",
+ "ce:GetAnomalySubscriptions",
+ "ce:GetCostAndUsage",
+ "ce:GetCostAndUsageWithResources",
+ "ce:GetCostCategories",
+ "ce:GetCostForecast",
+ "ce:GetDimensionValues",
+ "ce:GetPreferences",
+ "ce:GetReservationCoverage",
+ "ce:GetReservationPurchaseRecommendation",
+ "ce:GetReservationUtilization",
+ "ce:GetRightsizingRecommendation",
+ "ce:GetSavingsPlansCoverage",
+ "ce:GetSavingsPlansPurchaseRecommendation",
+ "ce:GetSavingsPlansUtilization",
+ "ce:GetSavingsPlansUtilizationDetails",
+ "ce:GetTags",
+ "ce:GetUsageForecast",
+ "ce:ListCostCategoryDefinitions",
+ "chatbot:Describe*",
+ "chatbot:Get*",
+ "chime:Get*",
+ "chime:List*",
+ "chime:Retrieve*",
+ "chime:Search*",
+ "chime:Validate*",
+ "cloud9:Describe*",
+ "cloud9:List*",
+ "clouddirectory:BatchRead",
+ "clouddirectory:Get*",
+ "clouddirectory:List*",
+ "clouddirectory:LookupPolicy",
+ "cloudformation:Describe*",
+ "cloudformation:Detect*",
+ "cloudformation:Estimate*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudfront:DescribeFunction",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudhsm:Describe*",
+ "cloudhsm:Get*",
+ "cloudhsm:List*",
+ "cloudsearch:Describe*",
+ "cloudsearch:List*",
+ "cloudtrail:Describe*",
+ "cloudtrail:Get*",
+ "cloudtrail:List*",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "codeartifact:DescribeDomain",
+ "codeartifact:DescribePackageVersion",
+ "codeartifact:DescribeRepository",
+ "codeartifact:GetAuthorizationToken",
+ "codeartifact:GetDomainPermissionsPolicy",
+ "codeartifact:GetPackageVersionAsset",
+ "codeartifact:GetPackageVersionReadme",
+ "codeartifact:GetRepositoryEndpoint",
+ "codeartifact:GetRepositoryPermissionsPolicy",
+ "codeartifact:ListDomains",
+ "codeartifact:ListPackages",
+ "codeartifact:ListPackageVersionAssets",
+ "codeartifact:ListPackageVersionDependencies",
+ "codeartifact:ListPackageVersions",
+ "codeartifact:ListRepositories",
+ "codeartifact:ListRepositoriesInDomain",
+ "codeartifact:ListTagsForResource",
+ "codeartifact:ReadFromRepository",
+ "codebuild:BatchGet*",
+ "codebuild:DescribeCodeCoverages",
+ "codebuild:DescribeTestCases",
+ "codebuild:List*",
+ "codecommit:BatchGet*",
+ "codecommit:Describe*",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:List*",
+ "codedeploy:BatchGet*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codeguru-profiler:Describe*",
+ "codeguru-profiler:Get*",
+ "codeguru-profiler:List*",
+ "codeguru-reviewer:Describe*",
+ "codeguru-reviewer:Get*",
+ "codeguru-reviewer:List*",
+ "codepipeline:Get*",
+ "codepipeline:List*",
+ "codestar-connections:GetConnection",
+ "codestar-connections:GetHost",
+ "codestar-connections:ListConnections",
+ "codestar-connections:ListHosts",
+ "codestar-connections:ListTagsForResource",
+ "codestar-notifications:describeNotificationRule",
+ "codestar-notifications:listEventTypes",
+ "codestar-notifications:listNotificationRules",
+ "codestar-notifications:listTagsForResource",
+ "codestar-notifications:ListTargets",
+ "codestar:Describe*",
+ "codestar:Get*",
+ "codestar:List*",
+ "codestar:Verify*",
+ "cognito-identity:Describe*",
+ "cognito-identity:GetCredentialsForIdentity",
+ "cognito-identity:GetIdentityPoolRoles",
+ "cognito-identity:GetOpenIdToken",
+ "cognito-identity:GetOpenIdTokenForDeveloperIdentity",
+ "cognito-identity:List*",
+ "cognito-identity:Lookup*",
+ "cognito-idp:AdminGet*",
+ "cognito-idp:AdminList*",
+ "cognito-idp:Describe*",
+ "cognito-idp:Get*",
+ "cognito-idp:List*",
+ "cognito-sync:Describe*",
+ "cognito-sync:Get*",
+ "cognito-sync:List*",
+ "cognito-sync:QueryRecords",
+ "compute-optimizer:DescribeRecommendationExportJobs",
+ "compute-optimizer:GetAutoScalingGroupRecommendations",
+ "compute-optimizer:GetEBSVolumeRecommendations",
+ "compute-optimizer:GetEC2InstanceRecommendations",
+ "compute-optimizer:GetEC2RecommendationProjectedMetrics",
+ "compute-optimizer:GetEnrollmentStatus",
+ "compute-optimizer:GetEnrollmentStatusesForOrganization",
+ "compute-optimizer:GetLambdaFunctionRecommendations",
+ "compute-optimizer:GetRecommendationSummaries",
+ "config:BatchGetAggregateResourceConfig",
+ "config:BatchGetResourceConfig",
+ "config:Deliver*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "config:SelectAggregateResourceConfig",
+ "config:SelectResourceConfig",
+ "connect:Describe*",
+ "connect:GetFederationToken",
+ "connect:List*",
+ "dataexchange:Get*",
+ "dataexchange:List*",
+ "datapipeline:Describe*",
+ "datapipeline:EvaluateExpression",
+ "datapipeline:Get*",
+ "datapipeline:List*",
+ "datapipeline:QueryObjects",
+ "datapipeline:Validate*",
+ "datasync:Describe*",
+ "datasync:List*",
+ "dax:BatchGetItem",
+ "dax:Describe*",
+ "dax:GetItem",
+ "dax:ListTags",
+ "dax:Query",
+ "dax:Scan",
+ "deepcomposer:GetComposition",
+ "deepcomposer:GetModel",
+ "deepcomposer:GetSampleModel",
+ "deepcomposer:ListCompositions",
+ "deepcomposer:ListModels",
+ "deepcomposer:ListSampleModels",
+ "deepcomposer:ListTrainingTopics",
+ "detective:Get*",
+ "detective:List*",
+ "detective:SearchGraph",
+ "devicefarm:Get*",
+ "devicefarm:List*",
+ "devops-guru:DescribeAccountHealth",
+ "devops-guru:DescribeAccountOverview",
+ "devops-guru:DescribeAnomaly",
+ "devops-guru:DescribeFeedback",
+ "devops-guru:DescribeInsight",
+ "devops-guru:DescribeResourceCollectionHealth",
+ "devops-guru:DescribeServiceIntegration",
+ "devops-guru:GetCostEstimation",
+ "devops-guru:GetResourceCollection",
+ "devops-guru:ListAnomaliesForInsight",
+ "devops-guru:ListEvents",
+ "devops-guru:ListInsights",
+ "devops-guru:ListNotificationChannels",
+ "devops-guru:ListRecommendations",
+ "devops-guru:SearchInsights",
+ "devops-guru:StartCostEstimation",
+ "directconnect:Describe*",
+ "discovery:Describe*",
+ "discovery:Get*",
+ "discovery:List*",
+ "dlm:Get*",
+ "dms:Describe*",
+ "dms:List*",
+ "dms:Test*",
+ "ds:Check*",
+ "ds:Describe*",
+ "ds:Get*",
+ "ds:List*",
+ "ds:Verify*",
+ "dynamodb:BatchGet*",
+ "dynamodb:Describe*",
+ "dynamodb:Get*",
+ "dynamodb:List*",
+ "dynamodb:Query",
+ "dynamodb:Scan",
+ "ec2:Describe*",
+ "ec2:Get*",
+ "ec2:ListSnapshotsInRecycleBin",
+ "ec2:SearchLocalGatewayRoutes",
+ "ec2:SearchTransitGatewayRoutes",
+ "ec2messages:Get*",
+ "ecr-public:BatchCheckLayerAvailability",
+ "ecr-public:DescribeImages",
+ "ecr-public:DescribeImageTags",
+ "ecr-public:DescribeRegistries",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:GetAuthorizationToken",
+ "ecr-public:GetRegistryCatalogData",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr-public:ListTagsForResource",
+ "ecr:BatchCheck*",
+ "ecr:BatchGet*",
+ "ecr:Describe*",
+ "ecr:Get*",
+ "ecr:List*",
+ "ecs:Describe*",
+ "ecs:List*",
+ "eks:Describe*",
+ "eks:List*",
+ "elasticache:Describe*",
+ "elasticache:List*",
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:Request*",
+ "elasticbeanstalk:Retrieve*",
+ "elasticbeanstalk:Validate*",
+ "elasticfilesystem:Describe*",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:List*",
+ "elasticmapreduce:View*",
+ "elastictranscoder:List*",
+ "elastictranscoder:Read*",
+ "elemental-appliances-software:Get*",
+ "elemental-appliances-software:List*",
+ "emr-containers:DescribeJobRun",
+ "emr-containers:DescribeManagedEndpoint",
+ "emr-containers:DescribeVirtualCluster",
+ "emr-containers:ListJobRuns",
+ "emr-containers:ListManagedEndpoints",
+ "emr-containers:ListVirtualClusters",
+ "emr-containers:ListTagsForResource",
+ "es:Describe*",
+ "es:ESHttpGet",
+ "es:ESHttpHead",
+ "es:Get*",
+ "es:List*",
+ "events:Describe*",
+ "events:List*",
+ "events:Test*",
+ "firehose:Describe*",
+ "firehose:List*",
+ "fis:GetAction",
+ "fis:GetExperiment",
+ "fis:GetExperimentTemplate",
+ "fis:ListActions",
+ "fis:ListExperiments",
+ "fis:ListExperimentTemplates",
+ "fis:ListTagsForResource",
+ "fms:GetAdminAccount",
+ "fms:GetAppsList",
+ "fms:GetComplianceDetail",
+ "fms:GetNotificationChannel",
+ "fms:GetPolicy",
+ "fms:GetProtectionStatus",
+ "fms:GetProtocolsList",
+ "fms:GetViolationDetails",
+ "fms:ListAppsLists",
+ "fms:ListComplianceStatus",
+ "fms:ListMemberAccounts",
+ "fms:ListPolicies",
+ "fms:ListProtocolsLists",
+ "fms:ListTagsForResource",
+ "forecast:DescribeDataset",
+ "forecast:DescribeDatasetGroup",
+ "forecast:DescribeDatasetImportJob",
+ "forecast:DescribeForecast",
+ "forecast:DescribeForecastExportJob",
+ "forecast:DescribePredictor",
+ "forecast:DescribePredictorBacktestExportJob",
+ "forecast:GetAccuracyMetrics",
+ "forecast:ListDatasetGroups",
+ "forecast:ListDatasetImportJobs",
+ "forecast:ListDatasets",
+ "forecast:ListForecastExportJobs",
+ "forecast:ListForecasts",
+ "forecast:ListPredictorBacktestExportJobs",
+ "forecast:ListPredictors",
+ "forecast:QueryForecast",
+ "freertos:Describe*",
+ "freertos:List*",
+ "fsx:Describe*",
+ "fsx:List*",
+ "gamelift:Describe*",
+ "gamelift:Get*",
+ "gamelift:List*",
+ "gamelift:ResolveAlias",
+ "gamelift:Search*",
+ "glacier:Describe*",
+ "glacier:Get*",
+ "glacier:List*",
+ "globalaccelerator:Describe*",
+ "globalaccelerator:List*",
+ "glue:BatchGetDevEndpoints",
+ "glue:BatchGetJobs",
+ "glue:BatchGetPartition",
+ "glue:BatchGetTriggers",
+ "glue:BatchGetWorkflows",
+ "glue:CheckSchemaVersionValidity",
+ "glue:GetCatalogImportStatus",
+ "glue:GetClassifier",
+ "glue:GetClassifiers",
+ "glue:GetCrawler",
+ "glue:GetCrawlerMetrics",
+ "glue:GetCrawlers",
+ "glue:GetDatabase",
+ "glue:GetDatabases",
+ "glue:GetDataCatalogEncryptionSettings",
+ "glue:GetDataflowGraph",
+ "glue:GetDevEndpoint",
+ "glue:GetDevEndpoints",
+ "glue:GetJob",
+ "glue:GetJobBookmark",
+ "glue:GetJobRun",
+ "glue:GetJobRuns",
+ "glue:GetJobs",
+ "glue:GetMapping",
+ "glue:GetMLTaskRun",
+ "glue:GetMLTaskRuns",
+ "glue:GetMLTransform",
+ "glue:GetMLTransforms",
+ "glue:GetPartition",
+ "glue:GetPartitions",
+ "glue:GetPlan",
+ "glue:GetRegistry",
+ "glue:GetResourcePolicy",
+ "glue:GetSchema",
+ "glue:GetSchemaByDefinition",
+ "glue:GetSchemaVersion",
+ "glue:GetSchemaVersionsDiff",
+ "glue:GetSecurityConfiguration",
+ "glue:GetSecurityConfigurations",
+ "glue:GetTable",
+ "glue:GetTables",
+ "glue:GetTableVersion",
+ "glue:GetTableVersions",
+ "glue:GetTags",
+ "glue:GetTrigger",
+ "glue:GetTriggers",
+ "glue:GetUserDefinedFunction",
+ "glue:GetUserDefinedFunctions",
+ "glue:GetWorkflow",
+ "glue:GetWorkflowRun",
+ "glue:GetWorkflowRunProperties",
+ "glue:GetWorkflowRuns",
+ "glue:ListCrawlers",
+ "glue:ListDevEndpoints",
+ "glue:ListJobs",
+ "glue:ListMLTransforms",
+ "glue:ListRegistries",
+ "glue:ListSchemas",
+ "glue:ListSchemaVersions",
+ "glue:ListTriggers",
+ "glue:ListWorkflows",
+ "glue:QuerySchemaVersionMetadata",
+ "greengrass:DescribeComponent",
+ "greengrass:Get*",
+ "greengrass:List*",
+ "groundstation:DescribeContact",
+ "groundstation:GetConfig",
+ "groundstation:GetDataflowEndpointGroup",
+ "groundstation:GetMinuteUsage",
+ "groundstation:GetMissionProfile",
+ "groundstation:GetSatellite",
+ "groundstation:ListConfigs",
+ "groundstation:ListContacts",
+ "groundstation:ListDataflowEndpointGroups",
+ "groundstation:ListGroundStations",
+ "groundstation:ListMissionProfiles",
+ "groundstation:ListSatellites",
+ "groundstation:ListTagsForResource",
+ "guardduty:DescribeOrganizationConfiguration",
+ "guardduty:DescribePublishingDestination",
+ "guardduty:Get*",
+ "guardduty:List*",
+ "health:Describe*",
+ "iam:Generate*",
+ "iam:Get*",
+ "iam:List*",
+ "iam:Simulate*",
+ "imagebuilder:Get*",
+ "imagebuilder:List*",
+ "importexport:Get*",
+ "importexport:List*",
+ "inspector:Describe*",
+ "inspector:Get*",
+ "inspector:List*",
+ "inspector:Preview*",
+ "iot:Describe*",
+ "iot:Get*",
+ "iot:List*",
+ "iot1click:DescribeDevice",
+ "iot1click:DescribePlacement",
+ "iot1click:DescribeProject",
+ "iot1click:GetDeviceMethods",
+ "iot1click:GetDevicesInPlacement",
+ "iot1click:ListDeviceEvents",
+ "iot1click:ListDevices",
+ "iot1click:ListPlacements",
+ "iot1click:ListProjects",
+ "iot1click:ListTagsForResource",
+ "iotanalytics:Describe*",
+ "iotanalytics:Get*",
+ "iotanalytics:List*",
+ "iotanalytics:SampleChannelData",
+ "iotevents:DescribeAlarm",
+ "iotevents:DescribeAlarmModel",
+ "iotevents:DescribeDetector",
+ "iotevents:DescribeDetectorModel",
+ "iotevents:DescribeInput",
+ "iotevents:DescribeLoggingOptions",
+ "iotevents:ListAlarmModels",
+ "iotevents:ListAlarmModelVersions",
+ "iotevents:ListAlarms",
+ "iotevents:ListDetectorModels",
+ "iotevents:ListDetectorModelVersions",
+ "iotevents:ListDetectors",
+ "iotevents:ListInputs",
+ "iotevents:ListTagsForResource",
+ "iotfleethub:DescribeApplication",
+ "iotfleethub:ListApplications",
+ "iotroborunner:GetAction",
+ "iotroborunner:GetActionTemplate",
+ "iotroborunner:GetActivity",
+ "iotroborunner:GetDestination",
+ "iotroborunner:GetDestinationRelationship",
+ "iotroborunner:GetSite",
+ "iotroborunner:GetTask",
+ "iotroborunner:GetWorker",
+ "iotroborunner:GetWorkerFleet",
+ "iotroborunner:ListActions",
+ "iotroborunner:ListActionTemplates",
+ "iotroborunner:ListActivities",
+ "iotroborunner:ListDestinations",
+ "iotroborunner:ListDestinationRelationships",
+ "iotroborunner:ListSites",
+ "iotroborunner:ListTasks",
+ "iotroborunner:ListWorkers",
+ "iotroborunner:ListWorkerFleets",
+ "iotsitewise:Describe*",
+ "iotsitewise:Get*",
+ "iotsitewise:List*",
+ "iotwireless:GetDestination",
+ "iotwireless:GetDeviceProfile",
+ "iotwireless:GetPartnerAccount",
+ "iotwireless:GetServiceEndpoint",
+ "iotwireless:GetServiceProfile",
+ "iotwireless:GetWirelessDevice",
+ "iotwireless:GetWirelessDeviceStatistics",
+ "iotwireless:GetWirelessGateway",
+ "iotwireless:GetWirelessGatewayCertificate",
+ "iotwireless:GetWirelessGatewayFirmwareInformation",
+ "iotwireless:GetWirelessGatewayStatistics",
+ "iotwireless:GetWirelessGatewayTask",
+ "iotwireless:GetWirelessGatewayTaskDefinition",
+ "iotwireless:ListDestinations",
+ "iotwireless:ListDeviceProfiles",
+ "iotwireless:ListPartnerAccounts",
+ "iotwireless:ListServiceProfiles",
+ "iotwireless:ListTagsForResource",
+ "iotwireless:ListWirelessDevices",
+ "iotwireless:ListWirelessGateways",
+ "iotwireless:ListWirelessGatewayTaskDefinitions",
+ "ivs:BatchGetChannel",
+ "ivs:GetChannel",
+ "ivs:GetPlaybackKeyPair",
+ "ivs:GetRecordingConfiguration",
+ "ivs:ListChannels",
+ "ivs:ListPlaybackKeyPairs",
+ "ivs:ListRecordingConfigurations",
+ "ivs:ListStreams",
+ "ivs:ListTagsForResource",
+ "kafka:Describe*",
+ "kafka:Get*",
+ "kafka:List*",
+ "kafkaconnect:DescribeConnector",
+ "kafkaconnect:DescribeCustomPlugin",
+ "kafkaconnect:DescribeWorkerConfiguration",
+ "kafkaconnect:ListConnectors",
+ "kafkaconnect:ListCustomPlugins",
+ "kafkaconnect:ListWorkerConfigurations",
+ "kendra:DescribeDataSource",
+ "kendra:DescribeFaq",
+ "kendra:DescribeIndex",
+ "kendra:DescribeQuerySuggestionsBlockList",
+ "kendra:DescribeQuerySuggestionsConfig",
+ "kendra:DescribeThesaurus",
+ "kendra:GetQuerySuggestions",
+ "kendra:ListDataSources",
+ "kendra:ListDataSourceSyncJobs",
+ "kendra:ListFaqs",
+ "kendra:ListIndices",
+ "kendra:ListQuerySuggestionsBlockLists",
+ "kendra:ListTagsForResource",
+ "kendra:ListThesauri",
+ "kendra:Query",
+ "kinesis:Describe*",
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kinesisanalytics:Describe*",
+ "kinesisanalytics:Discover*",
+ "kinesisanalytics:Get*",
+ "kinesisanalytics:List*",
+ "kinesisvideo:Describe*",
+ "kinesisvideo:Get*",
+ "kinesisvideo:List*",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:Get*",
+ "lambda:List*",
+ "lex:DescribeBot",
+ "lex:DescribeBotAlias",
+ "lex:DescribeBotChannel",
+ "lex:DescribeBotLocale",
+ "lex:DescribeBotVersion",
+ "lex:DescribeExport",
+ "lex:DescribeImport",
+ "lex:DescribeIntent",
+ "lex:DescribeResourcePolicy",
+ "lex:DescribeSlot",
+ "lex:DescribeSlotType",
+ "lex:Get*",
+ "lex:ListBotAliases",
+ "lex:ListBotChannels",
+ "lex:ListBotLocales",
+ "lex:ListBots",
+ "lex:ListBotVersions",
+ "lex:ListBuiltInIntents",
+ "lex:ListBuiltInSlotTypes",
+ "lex:ListExports",
+ "lex:ListImports",
+ "lex:ListIntents",
+ "lex:ListSlots",
+ "lex:ListSlotTypes",
+ "lex:ListTagsForResource",
+ "license-manager:Get*",
+ "license-manager:List*",
+ "lightsail:GetActiveNames",
+ "lightsail:GetAlarms",
+ "lightsail:GetAutoSnapshots",
+ "lightsail:GetBlueprints",
+ "lightsail:GetBucketAccessKeys",
+ "lightsail:GetBucketBundles",
+ "lightsail:GetBucketMetricData",
+ "lightsail:GetBuckets",
+ "lightsail:GetBundles",
+ "lightsail:GetCertificates",
+ "lightsail:GetCloudFormationStackRecords",
+ "lightsail:GetContainerAPIMetadata",
+ "lightsail:GetContainerImages",
+ "lightsail:GetContainerServiceDeployments",
+ "lightsail:GetContainerServiceMetricData",
+ "lightsail:GetContainerServicePowers",
+ "lightsail:GetContainerServices",
+ "lightsail:GetDisk",
+ "lightsail:GetDisks",
+ "lightsail:GetDiskSnapshot",
+ "lightsail:GetDiskSnapshots",
+ "lightsail:GetDistributionBundles",
+ "lightsail:GetDistributionLatestCacheReset",
+ "lightsail:GetDistributionMetricData",
+ "lightsail:GetDistributions",
+ "lightsail:GetDomain",
+ "lightsail:GetDomains",
+ "lightsail:GetExportSnapshotRecords",
+ "lightsail:GetInstance",
+ "lightsail:GetInstanceMetricData",
+ "lightsail:GetInstancePortStates",
+ "lightsail:GetInstances",
+ "lightsail:GetInstanceSnapshot",
+ "lightsail:GetInstanceSnapshots",
+ "lightsail:GetInstanceState",
+ "lightsail:GetKeyPair",
+ "lightsail:GetKeyPairs",
+ "lightsail:GetLoadBalancer",
+ "lightsail:GetLoadBalancerMetricData",
+ "lightsail:GetLoadBalancers",
+ "lightsail:GetLoadBalancerTlsCertificates",
+ "lightsail:GetOperation",
+ "lightsail:GetOperations",
+ "lightsail:GetOperationsForResource",
+ "lightsail:GetRegions",
+ "lightsail:GetRelationalDatabase",
+ "lightsail:GetRelationalDatabaseBlueprints",
+ "lightsail:GetRelationalDatabaseBundles",
+ "lightsail:GetRelationalDatabaseEvents",
+ "lightsail:GetRelationalDatabaseLogEvents",
+ "lightsail:GetRelationalDatabaseLogStreams",
+ "lightsail:GetRelationalDatabaseMetricData",
+ "lightsail:GetRelationalDatabaseParameters",
+ "lightsail:GetRelationalDatabases",
+ "lightsail:GetRelationalDatabaseSnapshot",
+ "lightsail:GetRelationalDatabaseSnapshots",
+ "lightsail:GetStaticIp",
+ "lightsail:GetStaticIps",
+ "lightsail:Is*",
+ "logs:Describe*",
+ "logs:FilterLogEvents",
+ "logs:Get*",
+ "logs:ListTagsLogGroup",
+ "logs:StartQuery",
+ "logs:StopQuery",
+ "logs:TestMetricFilter",
+ "lookoutvision:DescribeDataset",
+ "lookoutvision:DescribeModel",
+ "lookoutvision:DescribeModelPackagingJob",
+ "lookoutvision:DescribeProject",
+ "lookoutvision:ListDatasetEntries",
+ "lookoutvision:ListModels",
+ "lookoutvision:ListModelPackagingJobs",
+ "lookoutvision:ListProjects",
+ "lookoutvision:ListTagsForResource",
+ "machinelearning:Describe*",
+ "machinelearning:Get*",
+ "macie:ListMemberAccounts",
+ "macie:ListS3Resources",
+ "macie2:BatchGetCustomDataIdentifiers",
+ "macie2:DescribeBuckets",
+ "macie2:DescribeClassificationJob",
+ "macie2:DescribeOrganizationConfiguration",
+ "macie2:GetAdministratorAccount",
+ "macie2:GetBucketStatistics",
+ "macie2:GetClassificationExportConfiguration",
+ "macie2:GetCustomDataIdentifier",
+ "macie2:GetFindings",
+ "macie2:GetFindingsFilter",
+ "macie2:GetFindingsPublicationConfiguration",
+ "macie2:GetFindingStatistics",
+ "macie2:GetInvitationsCount",
+ "macie2:GetMacieSession",
+ "macie2:GetMember",
+ "macie2:GetUsageStatistics",
+ "macie2:GetUsageTotals",
+ "macie2:ListClassificationJobs",
+ "macie2:ListCustomDataIdentifiers",
+ "macie2:ListFindings",
+ "macie2:ListFindingsFilters",
+ "macie2:ListInvitations",
+ "macie2:ListMembers",
+ "macie2:ListOrganizationAdminAccounts",
+ "macie2:ListTagsForResource",
+ "macie2:SearchResources",
+ "managedblockchain:GetNetwork",
+ "managedblockchain:GetProposal",
+ "managedblockchain:GetMember",
+ "managedblockchain:GetNode",
+ "managedblockchain:ListNetworks",
+ "managedblockchain:ListProposals",
+ "managedblockchain:ListProposalVotes",
+ "managedblockchain:ListInvitations",
+ "managedblockchain:ListMembers",
+ "managedblockchain:ListNodes",
+ "managedblockchain:ListTagsForResource",
+ "mediaconnect:DescribeFlow",
+ "mediaconnect:DescribeOffering",
+ "mediaconnect:DescribeReservation",
+ "mediaconnect:ListFlows",
+ "mediaconvert:DescribeEndpoints",
+ "mediaconvert:Get*",
+ "mediaconvert:List*",
+ "mediapackage:Describe*",
+ "mediapackage:List*",
+ "mediastore:DescribeContainer",
+ "mediastore:DescribeObject",
+ "mediastore:GetContainerPolicy",
+ "mediastore:GetCorsPolicy",
+ "mediastore:GetLifecyclePolicy",
+ "mediastore:GetMetricPolicy",
+ "mediastore:GetObject",
+ "mediastore:ListContainers",
+ "mediastore:ListItems",
+ "mediastore:ListTagsForResource",
+ "mgh:Describe*",
+ "mgh:GetHomeRegion",
+ "mgh:List*",
+ "mgn:DescribeJobLogItems",
+ "mgn:DescribeJobs",
+ "mgn:DescribeReplicationConfigurationTemplates",
+ "mgn:DescribeSourceServers",
+ "mgn:GetLaunchConfiguration",
+ "mgn:GetReplicationConfiguration",
+ "mobileanalytics:Get*",
+ "mobilehub:Describe*",
+ "mobilehub:Export*",
+ "mobilehub:Generate*",
+ "mobilehub:Get*",
+ "mobilehub:List*",
+ "mobilehub:Validate*",
+ "mobilehub:Verify*",
+ "mobiletargeting:Get*",
+ "mobiletargeting:List*",
+ "monitron:GetProject",
+ "monitron:GetProjectAdminUser",
+ "monitron:ListProjects",
+ "monitron:ListTagsForResource",
+ "mq:Describe*",
+ "mq:List*",
+ "network-firewall:DescribeFirewall",
+ "network-firewall:DescribeFirewallPolicy",
+ "network-firewall:DescribeLoggingConfiguration",
+ "network-firewall:DescribeResourcePolicy",
+ "network-firewall:DescribeRuleGroup",
+ "network-firewall:DescribeRuleGroupMetadata",
+ "network-firewall:ListFirewallPolicies",
+ "network-firewall:ListFirewalls",
+ "network-firewall:ListRuleGroups",
+ "network-firewall:ListTagsForResource",
+ "networkmanager:DescribeGlobalNetworks",
+ "networkmanager:GetConnections",
+ "networkmanager:GetCustomerGatewayAssociations",
+ "networkmanager:GetDevices",
+ "networkmanager:GetLinkAssociations",
+ "networkmanager:GetLinks",
+ "networkmanager:GetSites",
+ "networkmanager:GetTransitGatewayConnectPeerAssociations",
+ "networkmanager:GetTransitGatewayRegistrations",
+ "opsworks-cm:Describe*",
+ "opsworks-cm:List*",
+ "opsworks:Describe*",
+ "opsworks:Get*",
+ "organizations:Describe*",
+ "organizations:List*",
+ "outposts:Get*",
+ "outposts:List*",
+ "personalize:Describe*",
+ "personalize:Get*",
+ "personalize:List*",
+ "pi:DescribeDimensionKeys",
+ "pi:GetDimensionKeyDetails",
+ "pi:GetResourceMetadata",
+ "pi:GetResourceMetrics",
+ "pi:ListAvailableResourceDimensions",
+ "pi:ListAvailableResourceMetrics",
+ "polly:Describe*",
+ "polly:Get*",
+ "polly:List*",
+ "polly:SynthesizeSpeech",
+ "proton:GetEnvironment",
+ "proton:GetEnvironmentTemplate",
+ "proton:GetEnvironmentTemplateVersion",
+ "proton:GetService",
+ "proton:GetServiceInstance",
+ "proton:GetServiceTemplate",
+ "proton:GetServiceTemplateVersion",
+ "proton:ListEnvironmentAccountConnections",
+ "proton:ListEnvironments",
+ "proton:ListEnvironmentTemplates",
+ "proton:ListServiceInstances",
+ "proton:ListServices",
+ "proton:ListServiceTemplates",
+ "proton:ListTagsForResource",
+ "qldb:DescribeJournalS3Export",
+ "qldb:DescribeLedger",
+ "qldb:GetBlock",
+ "qldb:GetDigest",
+ "qldb:GetRevision",
+ "qldb:ListJournalS3Exports",
+ "qldb:ListJournalS3ExportsForLedger",
+ "qldb:ListLedgers",
+ "qldb:ListTagsForResource",
+ "ram:Get*",
+ "ram:List*",
+ "rbin:GetRule",
+ "rbin:ListRules",
+ "rbin:ListTagsForResource",
+ "rds:Describe*",
+ "rds:Download*",
+ "rds:List*",
+ "redshift:Describe*",
+ "redshift:GetReservedNodeExchangeOfferings",
+ "redshift:View*",
+ "rekognition:CompareFaces",
+ "rekognition:Detect*",
+ "rekognition:List*",
+ "rekognition:Search*",
+ "resiliencehub:DescribeApp",
+ "resiliencehub:DescribeAppAssessment",
+ "resiliencehub:DescribeAppVersionResourcesResolutionStatus",
+ "resiliencehub:DescribeAppVersionTemplate",
+ "resiliencehub:DescribeDraftAppVersionResourcesImportStatus",
+ "resiliencehub:DescribeResiliencyPolicy",
+ "resiliencehub:ListAlarmRecommendations",
+ "resiliencehub:ListAppAssessments",
+ "resiliencehub:ListAppComponentCompliances",
+ "resiliencehub:ListAppComponentRecommendations",
+ "resiliencehub:ListAppVersionResourceMappings",
+ "resiliencehub:ListAppVersionResources",
+ "resiliencehub:ListAppVersions",
+ "resiliencehub:ListApps",
+ "resiliencehub:ListRecommendationTemplates",
+ "resiliencehub:ListResiliencyPolicies",
+ "resiliencehub:ListSopRecommendations",
+ "resiliencehub:ListSuggestedResiliencyPolicies",
+ "resiliencehub:ListTagsForResource",
+ "resiliencehub:ListTestRecommendations",
+ "resiliencehub:ListUnsupportedAppVersionResources",
+ "resource-groups:Get*",
+ "resource-groups:List*",
+ "resource-groups:Search*",
+ "robomaker:BatchDescribe*",
+ "robomaker:Describe*",
+ "robomaker:Get*",
+ "robomaker:List*",
+ "route53-recovery-cluster:Get*",
+ "route53-recovery-control-config:Describe*",
+ "route53-recovery-control-config:List*",
+ "route53-recovery-readiness:Get*",
+ "route53-recovery-readiness:List*",
+ "route53:Get*",
+ "route53:List*",
+ "route53:Test*",
+ "route53domains:Check*",
+ "route53domains:Get*",
+ "route53domains:List*",
+ "route53domains:View*",
+ "route53resolver:Get*",
+ "route53resolver:List*",
+ "s3-object-lambda:GetObject",
+ "s3-object-lambda:GetObjectAcl",
+ "s3-object-lambda:GetObjectLegalHold",
+ "s3-object-lambda:GetObjectRetention",
+ "s3-object-lambda:GetObjectTagging",
+ "s3-object-lambda:GetObjectVersion",
+ "s3-object-lambda:GetObjectVersionAcl",
+ "s3-object-lambda:GetObjectVersionTagging",
+ "s3-object-lambda:ListBucket",
+ "s3-object-lambda:ListBucketMultipartUploads",
+ "s3-object-lambda:ListBucketVersions",
+ "s3-object-lambda:ListMultipartUploadParts",
+ "s3:DescribeJob",
+ "s3:Get*",
+ "s3:List*",
+ "sagemaker:Describe*",
+ "sagemaker:GetSearchSuggestions",
+ "sagemaker:List*",
+ "sagemaker:Search",
+ "savingsplans:DescribeSavingsPlanRates",
+ "savingsplans:DescribeSavingsPlans",
+ "savingsplans:DescribeSavingsPlansOfferingRates",
+ "savingsplans:DescribeSavingsPlansOfferings",
+ "savingsplans:ListTagsForResource",
+ "schemas:Describe*",
+ "schemas:Get*",
+ "schemas:List*",
+ "schemas:Search*",
+ "sdb:Get*",
+ "sdb:List*",
+ "sdb:Select*",
+ "secretsmanager:Describe*",
+ "secretsmanager:GetResourcePolicy",
+ "secretsmanager:List*",
+ "securityhub:Describe*",
+ "securityhub:Get*",
+ "securityhub:List*",
+ "serverlessrepo:Get*",
+ "serverlessrepo:List*",
+ "serverlessrepo:SearchApplications",
+ "servicecatalog:Describe*",
+ "servicecatalog:GetApplication",
+ "servicecatalog:GetAttributeGroup",
+ "servicecatalog:List*",
+ "servicecatalog:Scan*",
+ "servicecatalog:Search*",
+ "servicediscovery:Get*",
+ "servicediscovery:List*",
+ "servicequotas:GetAssociationForServiceQuotaTemplate",
+ "servicequotas:GetAWSDefaultServiceQuota",
+ "servicequotas:GetRequestedServiceQuotaChange",
+ "servicequotas:GetServiceQuota",
+ "servicequotas:GetServiceQuotaIncreaseRequestFromTemplate",
+ "servicequotas:ListAWSDefaultServiceQuotas",
+ "servicequotas:ListRequestedServiceQuotaChangeHistory",
+ "servicequotas:ListRequestedServiceQuotaChangeHistoryByQuota",
+ "servicequotas:ListServiceQuotaIncreaseRequestsInTemplate",
+ "servicequotas:ListServiceQuotas",
+ "servicequotas:ListServices",
+ "ses:Describe*",
+ "ses:Get*",
+ "ses:List*",
+ "shield:Describe*",
+ "shield:Get*",
+ "shield:List*",
+ "signer:DescribeSigningJob",
+ "signer:GetSigningPlatform",
+ "signer:GetSigningProfile",
+ "signer:ListProfilePermissions",
+ "signer:ListSigningJobs",
+ "signer:ListSigningPlatforms",
+ "signer:ListSigningProfiles",
+ "signer:ListTagsForResource",
+ "snowball:Describe*",
+ "snowball:Get*",
+ "snowball:List*",
+ "sns:Check*",
+ "sns:Get*",
+ "sns:List*",
+ "sqs:Get*",
+ "sqs:List*",
+ "sqs:Receive*",
+ "ssm-contacts:DescribeEngagement",
+ "ssm-contacts:DescribePage",
+ "ssm-contacts:GetContact",
+ "ssm-contacts:GetContactChannel",
+ "ssm-contacts:ListContactChannels",
+ "ssm-contacts:ListContacts",
+ "ssm-contacts:ListEngagements",
+ "ssm-contacts:ListPageReceipts",
+ "ssm-contacts:ListPagesByContact",
+ "ssm-contacts:ListPagesByEngagement",
+ "ssm-incidents:GetIncidentRecord",
+ "ssm-incidents:GetReplicationSet",
+ "ssm-incidents:GetResourcePolicies",
+ "ssm-incidents:GetResponsePlan",
+ "ssm-incidents:GetTimelineEvent",
+ "ssm-incidents:ListIncidentRecords",
+ "ssm-incidents:ListRelatedItems",
+ "ssm-incidents:ListReplicationSets",
+ "ssm-incidents:ListResponsePlans",
+ "ssm-incidents:ListTagsForResource",
+ "ssm-incidents:ListTimelineEvents",
+ "ssm:Describe*",
+ "ssm:Get*",
+ "ssm:List*",
+ "sso-directory:Describe*",
+ "sso-directory:List*",
+ "sso-directory:Search*",
+ "sso:Describe*",
+ "sso:Get*",
+ "sso:List*",
+ "sso:Search*",
+ "states:Describe*",
+ "states:GetExecutionHistory",
+ "states:List*",
+ "storagegateway:Describe*",
+ "storagegateway:List*",
+ "sts:GetAccessKeyInfo",
+ "sts:GetCallerIdentity",
+ "sts:GetSessionToken",
+ "support:DescribeCases",
+ "swf:Count*",
+ "swf:Describe*",
+ "swf:Get*",
+ "swf:List*",
+ "synthetics:Describe*",
+ "synthetics:Get*",
+ "synthetics:List*",
+ "tag:Get*",
+ "timestream:DescribeDatabase",
+ "timestream:DescribeEndpoints",
+ "timestream:DescribeTable",
+ "timestream:ListDatabases",
+ "timestream:ListMeasures",
+ "timestream:ListTables",
+ "timestream:ListTagsForResource",
+ "transcribe:Get*",
+ "transcribe:List*",
+ "transfer:Describe*",
+ "transfer:List*",
+ "transfer:TestIdentityProvider",
+ "trustedadvisor:Describe*",
+ "waf-regional:Get*",
+ "waf-regional:List*",
+ "waf:Get*",
+ "waf:List*",
+ "wafv2:CheckCapacity",
+ "wafv2:Describe*",
+ "wafv2:Get*",
+ "wafv2:List*",
+ "workdocs:CheckAlias",
+ "workdocs:Describe*",
+ "workdocs:Get*",
+ "worklink:Describe*",
+ "worklink:List*",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workmail:List*",
+ "workmail:Search*",
+ "workspaces:Describe*",
+ "xray:BatchGet*",
+ "xray:Get*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAILL3HVNFSB6DCOWYQ",
+ "PolicyName": "ReadOnlyAccess",
+ "UpdateDate": "2022-02-16T20:46:04+00:00",
+ "VersionId": "v83"
+ },
+ "ResourceGroupsandTagEditorFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ResourceGroupsandTagEditorFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:53+00:00",
+ "DefaultVersionId": "v5",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "tag:getResources",
+ "tag:getTagKeys",
+ "tag:getTagValues",
+ "tag:TagResources",
+ "tag:UntagResources",
+ "resource-groups:*",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJNOS54ZFXN4T2Y34A",
+ "PolicyName": "ResourceGroupsandTagEditorFullAccess",
+ "UpdateDate": "2019-10-02T23:57:57+00:00",
+ "VersionId": "v5"
+ },
+ "ResourceGroupsandTagEditorReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ResourceGroupsandTagEditorReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:39:54+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "tag:getResources",
+ "tag:getTagKeys",
+ "tag:getTagValues",
+ "resource-groups:Get*",
+ "resource-groups:List*",
+ "resource-groups:Search*",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ListStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJHXQTPI5I5JKAIU74",
+ "PolicyName": "ResourceGroupsandTagEditorReadOnlyAccess",
+ "UpdateDate": "2019-03-07T19:43:17+00:00",
+ "VersionId": "v2"
+ },
+ "Route53RecoveryReadinessServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/Route53RecoveryReadinessServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2021-07-15T16:06:21+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "dynamodb:DescribeReservedCapacity",
+ "dynamodb:DescribeReservedCapacityOfferings"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:*"
+ },
+ {
+ "Action": [
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeTimeToLive"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:dynamodb:*:*:table/*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringLike": {
+ "iam:AWSServiceName": "servicequotas.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:iam::*:role/aws-service-role/servicequotas.amazonaws.com/AWSServiceRoleForServiceQuotas"
+ },
+ {
+ "Action": [
+ "lambda:GetFunctionConcurrency",
+ "lambda:GetFunctionConfiguration",
+ "lambda:GetProvisionedConcurrencyConfig",
+ "lambda:ListAliases",
+ "lambda:ListVersionsByFunction"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:*"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBClusters"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:rds:*:*:cluster:*"
+ },
+ {
+ "Action": [
+ "rds:DescribeDBInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:rds:*:*:db:*"
+ },
+ {
+ "Action": [
+ "route53:ListResourceRecordSets"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53:::hostedzone/*"
+ },
+ {
+ "Action": [
+ "route53:GetHealthCheck",
+ "route53:GetHealthCheckStatus"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:route53:::healthcheck/*"
+ },
+ {
+ "Action": [
+ "servicequotas:RequestServiceQuotaIncrease"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:servicequotas:*:*:*"
+ },
+ {
+ "Action": [
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptionsByTopic"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:*"
+ },
+ {
+ "Action": [
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sqs:*:*:*"
+ },
+ {
+ "Action": [
+ "apigateway:GET",
+ "application-autoscaling:DescribeScalableTargets",
+ "application-autoscaling:DescribeScalingPolicies",
+ "autoscaling:DescribeAccountLimits",
+ "autoscaling:DescribeAutoScalingGroups",
+ "autoscaling:DescribeAutoScalingInstances",
+ "autoscaling:DescribeLifecycleHooks",
+ "autoscaling:DescribeLoadBalancers",
+ "autoscaling:DescribeLoadBalancerTargetGroups",
+ "autoscaling:DescribeNotificationConfigurations",
+ "autoscaling:DescribePolicies",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:DescribeAlarms",
+ "dynamodb:DescribeLimits",
+ "dynamodb:ListGlobalTables",
+ "dynamodb:ListTables",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVolumes",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeVpnConnections",
+ "ec2:GetEbsEncryptionByDefault",
+ "ec2:GetEbsDefaultKmsKeyId",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "kafka:DescribeCluster",
+ "kafka:DescribeConfigurationRevision",
+ "lambda:ListEventSourceMappings",
+ "lambda:ListFunctions",
+ "rds:DescribeAccountAttributes",
+ "route53:GetHostedZone",
+ "servicequotas:ListAWSDefaultServiceQuotas",
+ "servicequotas:ListRequestedServiceQuotaChangeHistory",
+ "servicequotas:ListServiceQuotas",
+ "servicequotas:ListServices",
+ "sns:GetEndpointAttributes",
+ "sns:GetSubscriptionAttributes"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4J7MSL2FYD",
+ "PolicyName": "Route53RecoveryReadinessServiceRolePolicy",
+ "UpdateDate": "2021-10-29T07:09:46+00:00",
+ "VersionId": "v3"
+ },
+ "Route53ResolverServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/Route53ResolverServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-12T17:47:24+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "logs:CreateLogDelivery",
+ "logs:GetLogDelivery",
+ "logs:UpdateLogDelivery",
+ "logs:DeleteLogDelivery",
+ "logs:ListLogDeliveries",
+ "logs:DescribeResourcePolicies",
+ "logs:DescribeLogGroups",
+ "s3:GetBucketPolicy"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AEMJZANMJ",
+ "PolicyName": "Route53ResolverServiceRolePolicy",
+ "UpdateDate": "2020-08-12T17:47:24+00:00",
+ "VersionId": "v1"
+ },
+ "S3StorageLensServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/S3StorageLensServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-11-18T18:15:40+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "organizations:DescribeOrganization",
+ "organizations:ListAccounts",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "organizations:ListDelegatedAdministrators"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ],
+ "Sid": "AwsOrgsAccess"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IHOVJESMS",
+ "PolicyName": "S3StorageLensServiceRolePolicy",
+ "UpdateDate": "2020-11-18T18:15:40+00:00",
+ "VersionId": "v1"
+ },
+ "SecretsManagerReadWrite": {
+ "Arn": "arn:aws:iam::aws:policy/SecretsManagerReadWrite",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-04-04T18:05:29+00:00",
+ "DefaultVersionId": "v3",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "secretsmanager:*",
+ "cloudformation:CreateChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStacks",
+ "cloudformation:ExecuteChangeSet",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeVpcs",
+ "kms:DescribeKey",
+ "kms:ListAliases",
+ "kms:ListKeys",
+ "lambda:ListFunctions",
+ "rds:DescribeDBClusters",
+ "rds:DescribeDBInstances",
+ "redshift:DescribeClusters",
+ "tag:GetResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "lambda:AddPermission",
+ "lambda:CreateFunction",
+ "lambda:GetFunction",
+ "lambda:InvokeFunction",
+ "lambda:UpdateFunctionConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:lambda:*:*:function:SecretsManager*"
+ },
+ {
+ "Action": [
+ "serverlessrepo:CreateCloudFormationChangeSet",
+ "serverlessrepo:GetApplication"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:serverlessrepo:*:*:applications/SecretsManager*"
+ },
+ {
+ "Action": [
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::awsserverlessrepo-changesets*",
+ "arn:aws:s3:::secrets-manager-rotation-apps-*/*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3VG7CI5BIQZQ6G2E",
+ "PolicyName": "SecretsManagerReadWrite",
+ "UpdateDate": "2020-06-24T18:01:22+00:00",
+ "VersionId": "v3"
+ },
+ "SecurityAudit": {
+ "Arn": "arn:aws:iam::aws:policy/SecurityAudit",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:01+00:00",
+ "DefaultVersionId": "v35",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "access-analyzer:GetAnalyzedResource",
+ "access-analyzer:GetAnalyzer",
+ "access-analyzer:GetArchiveRule",
+ "access-analyzer:GetFinding",
+ "access-analyzer:ListAnalyzedResources",
+ "access-analyzer:ListAnalyzers",
+ "access-analyzer:ListArchiveRules",
+ "access-analyzer:ListFindings",
+ "access-analyzer:ListTagsForResource",
+ "acm-pca:ListPermissions",
+ "acm:Describe*",
+ "acm:List*",
+ "application-autoscaling:Describe*",
+ "appmesh:Describe*",
+ "appmesh:List*",
+ "appsync:List*",
+ "athena:GetWorkGroup",
+ "athena:List*",
+ "autoscaling-plans:DescribeScalingPlans",
+ "autoscaling:Describe*",
+ "batch:DescribeComputeEnvironments",
+ "batch:DescribeJobDefinitions",
+ "chime:List*",
+ "cloud9:Describe*",
+ "cloud9:ListEnvironments",
+ "clouddirectory:ListDirectories",
+ "cloudformation:DescribeStack*",
+ "cloudformation:GetStackPolicy",
+ "cloudformation:GetTemplate",
+ "cloudformation:ListStack*",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudhsm:ListHapgs",
+ "cloudhsm:ListHsms",
+ "cloudhsm:ListLunaClients",
+ "cloudsearch:DescribeDomainEndpointOptions",
+ "cloudsearch:DescribeDomains",
+ "cloudsearch:DescribeServiceAccessPolicies",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetEventSelectors",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:Describe*",
+ "cloudwatch:ListTagsForResource",
+ "codebuild:ListProjects",
+ "codecommit:BatchGetRepositories",
+ "codecommit:GetBranch",
+ "codecommit:GetObjectIdentifier",
+ "codecommit:GetRepository",
+ "codecommit:GetRepositoryTriggers",
+ "codecommit:List*",
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codepipeline:GetJobDetails",
+ "codepipeline:GetPipeline",
+ "codepipeline:GetPipelineExecution",
+ "codepipeline:GetPipelineState",
+ "codepipeline:ListPipelines",
+ "codestar:Describe*",
+ "codestar:List*",
+ "cognito-identity:ListIdentityPools",
+ "cognito-idp:DescribeIdentityProvider",
+ "cognito-idp:DescribeResourceServer",
+ "cognito-idp:DescribeRiskConfiguration",
+ "cognito-idp:DescribeUserImportJob",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolClient",
+ "cognito-idp:DescribeUserPoolDomain",
+ "cognito-idp:ListDevices",
+ "cognito-idp:ListGroups",
+ "cognito-idp:ListIdentityProviders",
+ "cognito-idp:ListResourceServers",
+ "cognito-idp:ListTagsForResource",
+ "cognito-idp:ListUserImportJobs",
+ "cognito-idp:ListUserPoolClients",
+ "cognito-idp:ListUserPools",
+ "cognito-idp:ListUsers",
+ "cognito-idp:ListUsersInGroup",
+ "cognito-sync:Describe*",
+ "cognito-sync:List*",
+ "comprehend:Describe*",
+ "comprehend:List*",
+ "config:BatchGetAggregateResourceConfig",
+ "config:BatchGetResourceConfig",
+ "config:Deliver*",
+ "config:Describe*",
+ "config:Get*",
+ "config:List*",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:EvaluateExpression",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "datapipeline:ValidatePipelineDefinition",
+ "datasync:Describe*",
+ "datasync:List*",
+ "dax:Describe*",
+ "dax:ListTags",
+ "detective:GetGraphIngestState",
+ "detective:ListGraphs",
+ "detective:ListMembers",
+ "directconnect:Describe*",
+ "dms:Describe*",
+ "dms:ListTagsForResource",
+ "ds:DescribeDirectories",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeGlobalTable",
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeTimeToLive",
+ "dynamodb:ListBackups",
+ "dynamodb:ListGlobalTables",
+ "dynamodb:ListStreams",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "ec2:Describe*",
+ "ec2:DescribeTransitGatewayAttachments",
+ "ec2:DescribeTransitGatewayMulticastDomains",
+ "ec2:DescribeTransitGatewayPeeringAttachments",
+ "ec2:DescribeTransitGatewayRouteTables",
+ "ec2:DescribeTransitGatewayVpcAttachments",
+ "ec2:DescribeTransitGateways",
+ "ec2:GetManagedPrefixListAssociations",
+ "ec2:GetManagedPrefixListEntries",
+ "ec2:GetTransitGatewayAttachmentPropagations",
+ "ec2:GetTransitGatewayMulticastDomainAssociations",
+ "ec2:GetTransitGatewayPrefixListReferences",
+ "ec2:GetTransitGatewayRouteTableAssociations",
+ "ec2:GetTransitGatewayRouteTablePropagations",
+ "ecr-public:DescribeImageTags",
+ "ecr-public:DescribeImages",
+ "ecr-public:DescribeRegistries",
+ "ecr-public:DescribeRepositories",
+ "ecr-public:GetRegistryCatalogData",
+ "ecr-public:GetRepositoryCatalogData",
+ "ecr-public:GetRepositoryPolicy",
+ "ecr:DescribeImageScanFindings",
+ "ecr:DescribeImages",
+ "ecr:DescribeRepositories",
+ "ecr:GetLifecyclePolicy",
+ "ecr:GetRepositoryPolicy",
+ "ecr:ListImages",
+ "ecr:ListTagsForResource",
+ "ecs:Describe*",
+ "ecs:List*",
+ "eks:DescribeCluster",
+ "eks:DescribeNodeGroup",
+ "eks:ListClusters",
+ "eks:ListNodeGroups",
+ "elasticache:Describe*",
+ "elasticache:ListTagsForResource",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:ListTagsForResource",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticfilesystem:DescribeMountTargetSecurityGroups",
+ "elasticfilesystem:DescribeMountTargets",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:GetBlockPublicAccessConfiguration",
+ "elasticmapreduce:ListClusters",
+ "elasticmapreduce:ListInstances",
+ "elasticmapreduce:ListSecurityConfigurations",
+ "es:Describe*",
+ "es:ListDomainNames",
+ "es:ListElasticsearchInstanceTypeDetails",
+ "es:ListElasticsearchVersions",
+ "es:ListTags",
+ "events:Describe*",
+ "events:List*",
+ "events:TestEventPattern",
+ "firehose:Describe*",
+ "firehose:List*",
+ "fms:ListComplianceStatus",
+ "fms:ListPolicies",
+ "fsx:Describe*",
+ "fsx:List*",
+ "gamelift:ListBuilds",
+ "gamelift:ListFleets",
+ "glacier:DescribeVault",
+ "glacier:GetVaultAccessPolicy",
+ "glacier:ListVaults",
+ "globalaccelerator:Describe*",
+ "globalaccelerator:List*",
+ "glue:GetCrawlers",
+ "glue:GetDataCatalogEncryptionSettings",
+ "glue:GetDatabases",
+ "glue:GetDevEndpoints",
+ "glue:GetJobs",
+ "greengrass:List*",
+ "guardduty:DescribePublishingDestination",
+ "guardduty:Get*",
+ "guardduty:List*",
+ "iam:GenerateCredentialReport",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:Get*",
+ "iam:List*",
+ "iam:SimulateCustomPolicy",
+ "iam:SimulatePrincipalPolicy",
+ "inspector:Describe*",
+ "inspector:Get*",
+ "inspector:List*",
+ "inspector:Preview*",
+ "iot:Describe*",
+ "iot:GetPolicy",
+ "iot:GetPolicyVersion",
+ "iot:List*",
+ "kinesis:DescribeLimits",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamConsumer",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListStreamConsumers",
+ "kinesis:ListStreams",
+ "kinesis:ListTagsForStream",
+ "kinesisanalytics:ListApplications",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:GetAccountSettings",
+ "lambda:GetFunctionConfiguration",
+ "lambda:GetFunctionEventInvokeConfig",
+ "lambda:GetLayerVersionPolicy",
+ "lambda:GetPolicy",
+ "lambda:List*",
+ "license-manager:List*",
+ "lightsail:GetInstances",
+ "lightsail:GetLoadBalancers",
+ "logs:Describe*",
+ "logs:ListTagsLogGroup",
+ "machinelearning:DescribeMLModels",
+ "mediaconnect:Describe*",
+ "mediaconnect:List*",
+ "mediastore:GetContainerPolicy",
+ "mediastore:ListContainers",
+ "mq:DescribeBroker",
+ "mq:DescribeBrokerEngineTypes",
+ "mq:DescribeBrokerInstanceOptions",
+ "mq:DescribeConfiguration",
+ "mq:DescribeConfigurationRevision",
+ "mq:DescribeUser",
+ "mq:ListBrokers",
+ "mq:ListConfigurationRevisions",
+ "mq:ListConfigurations",
+ "mq:ListTags",
+ "mq:ListUsers",
+ "network-firewall:ListFirewalls",
+ "opsworks-cm:DescribeServers",
+ "opsworks:DescribeStacks",
+ "organizations:Describe*",
+ "organizations:List*",
+ "quicksight:Describe*",
+ "quicksight:List*",
+ "ram:List*",
+ "rds:Describe*",
+ "rds:DownloadDBLogFilePortion",
+ "rds:ListTagsForResource",
+ "redshift:Describe*",
+ "rekognition:Describe*",
+ "rekognition:List*",
+ "robomaker:Describe*",
+ "robomaker:List*",
+ "route53:Get*",
+ "route53:List*",
+ "route53domains:GetDomainDetail",
+ "route53domains:GetOperationDetail",
+ "route53domains:ListDomains",
+ "route53domains:ListOperations",
+ "route53domains:ListTagsForDomain",
+ "route53resolver:Get*",
+ "route53resolver:List*",
+ "s3:GetAccelerateConfiguration",
+ "s3:GetAccessPoint",
+ "s3:GetAccessPointPolicy",
+ "s3:GetAccessPointPolicyStatus",
+ "s3:GetAccountPublicAccessBlock",
+ "s3:GetAnalyticsConfiguration",
+ "s3:GetBucket*",
+ "s3:GetEncryptionConfiguration",
+ "s3:GetInventoryConfiguration",
+ "s3:GetLifecycleConfiguration",
+ "s3:GetMetricsConfiguration",
+ "s3:GetObjectAcl",
+ "s3:GetObjectVersionAcl",
+ "s3:GetReplicationConfiguration",
+ "s3:ListAccessPoints",
+ "s3:ListAllMyBuckets",
+ "sagemaker:Describe*",
+ "sagemaker:List*",
+ "schemas:DescribeCodeBinding",
+ "schemas:DescribeDiscoverer",
+ "schemas:DescribeRegistry",
+ "schemas:DescribeSchema",
+ "schemas:ListDiscoverers",
+ "schemas:ListRegistries",
+ "schemas:ListSchemaVersions",
+ "schemas:ListSchemas",
+ "schemas:ListTagsForResource",
+ "sdb:DomainMetadata",
+ "sdb:ListDomains",
+ "secretsmanager:DescribeSecret",
+ "secretsmanager:GetResourcePolicy",
+ "secretsmanager:ListSecretVersionIds",
+ "secretsmanager:ListSecrets",
+ "securityhub:Describe*",
+ "securityhub:Get*",
+ "securityhub:List*",
+ "serverlessrepo:GetApplicationPolicy",
+ "serverlessrepo:List*",
+ "servicequotas:GetAWSDefaultServiceQuota",
+ "servicequotas:GetAssociationForServiceQuotaTemplate",
+ "servicequotas:GetRequestedServiceQuotaChange",
+ "servicequotas:GetServiceQuota",
+ "servicequotas:GetServiceQuotaIncreaseRequestFromTemplate",
+ "servicequotas:ListAWSDefaultServiceQuotas",
+ "servicequotas:ListRequestedServiceQuotaChangeHistory",
+ "servicequotas:ListRequestedServiceQuotaChangeHistoryByQuota",
+ "servicequotas:ListServiceQuotaIncreaseRequestsInTemplate",
+ "servicequotas:ListServiceQuotas",
+ "servicequotas:ListServices",
+ "servicequotas:ListTagsForResource",
+ "ses:GetIdentityDkimAttributes",
+ "ses:GetIdentityPolicies",
+ "ses:GetIdentityVerificationAttributes",
+ "ses:ListIdentities",
+ "ses:ListIdentityPolicies",
+ "ses:ListVerifiedEmailAddresses",
+ "shield:Describe*",
+ "shield:List*",
+ "snowball:ListClusters",
+ "snowball:ListJobs",
+ "sns:GetTopicAttributes",
+ "sns:ListSubscriptions",
+ "sns:ListSubscriptionsByTopic",
+ "sns:ListTagsForResource",
+ "sns:ListTopics",
+ "sqs:GetQueueAttributes",
+ "sqs:ListDeadLetterSourceQueues",
+ "sqs:ListQueueTags",
+ "sqs:ListQueues",
+ "ssm:Describe*",
+ "ssm:GetAutomationExecution",
+ "ssm:ListAssociationVersions",
+ "ssm:ListAssociations",
+ "ssm:ListCommands",
+ "ssm:ListComplianceItems",
+ "ssm:ListComplianceSummaries",
+ "ssm:ListDocumentMetadataHistory",
+ "ssm:ListDocumentVersions",
+ "ssm:ListDocuments",
+ "ssm:ListInventoryEntries",
+ "ssm:ListOpsMetadata",
+ "ssm:ListResourceComplianceSummaries",
+ "ssm:ListResourceDataSync",
+ "ssm:ListTagsForResource",
+ "sso:DescribePermissionsPolicies",
+ "sso:List*",
+ "states:ListStateMachines",
+ "storagegateway:DescribeBandwidthRateLimit",
+ "storagegateway:DescribeCache",
+ "storagegateway:DescribeCachediSCSIVolumes",
+ "storagegateway:DescribeGatewayInformation",
+ "storagegateway:DescribeMaintenanceStartTime",
+ "storagegateway:DescribeNFSFileShares",
+ "storagegateway:DescribeSnapshotSchedule",
+ "storagegateway:DescribeStorediSCSIVolumes",
+ "storagegateway:DescribeTapeArchives",
+ "storagegateway:DescribeTapeRecoveryPoints",
+ "storagegateway:DescribeTapes",
+ "storagegateway:DescribeUploadBuffer",
+ "storagegateway:DescribeVTLDevices",
+ "storagegateway:DescribeWorkingStorage",
+ "storagegateway:List*",
+ "support:DescribeTrustedAdvisorCheckRefreshStatuses",
+ "support:DescribeTrustedAdvisorCheckResult",
+ "support:DescribeTrustedAdvisorCheckSummaries",
+ "support:DescribeTrustedAdvisorChecks",
+ "tag:GetResources",
+ "tag:GetTagKeys",
+ "transfer:Describe*",
+ "transfer:List*",
+ "translate:List*",
+ "trustedadvisor:Describe*",
+ "waf-regional:GetWebACL",
+ "waf-regional:ListResourcesForWebACL",
+ "waf-regional:ListTagsForResource",
+ "waf-regional:ListWebACLs",
+ "waf:GetWebACL",
+ "waf:ListTagsForResource",
+ "waf:ListWebACLs",
+ "wafv2:GetWebACL",
+ "wafv2:ListAvailableManagedRuleGroups",
+ "wafv2:ListIPSets",
+ "wafv2:ListLoggingConfigurations",
+ "wafv2:ListRegexPatternSets",
+ "wafv2:ListResourcesForWebACL",
+ "wafv2:ListRuleGroups",
+ "wafv2:ListTagsForResource",
+ "wafv2:ListWebACLs",
+ "workdocs:DescribeResourcePermissions",
+ "workspaces:Describe*",
+ "xray:GetEncryptionConfig",
+ "xray:GetGroup",
+ "xray:GetGroups",
+ "xray:GetSamplingRules",
+ "xray:GetSamplingTargets",
+ "xray:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "apigateway:GET"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:apigateway:*::/apis",
+ "arn:aws:apigateway:*::/apis/*/routes",
+ "arn:aws:apigateway:*::/apis/*/stages",
+ "arn:aws:apigateway:*::/apis/*/stages/*",
+ "arn:aws:apigateway:*::/clientcertificates/*",
+ "arn:aws:apigateway:*::/restapis",
+ "arn:aws:apigateway:*::/restapis/*/authorizers",
+ "arn:aws:apigateway:*::/restapis/*/authorizers/*",
+ "arn:aws:apigateway:*::/restapis/*/documentation/versions",
+ "arn:aws:apigateway:*::/restapis/*/resources",
+ "arn:aws:apigateway:*::/restapis/*/resources/*",
+ "arn:aws:apigateway:*::/restapis/*/resources/*/methods/*",
+ "arn:aws:apigateway:*::/restapis/*/stages",
+ "arn:aws:apigateway:*::/restapis/*/stages/*",
+ "arn:aws:apigateway:*::/tags/*",
+ "arn:aws:apigateway:*::/vpclinks"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIX2T3QCXHR2OGGCTO",
+ "PolicyName": "SecurityAudit",
+ "UpdateDate": "2021-04-14T20:28:28+00:00",
+ "VersionId": "v35"
+ },
+ "ServerMigrationConnector": {
+ "Arn": "arn:aws:iam::aws:policy/ServerMigrationConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-10-24T21:45:56+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "iam:GetUser",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "sms:SendMessage",
+ "sms:GetMessages"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutLifecycleConfiguration",
+ "s3:AbortMultipartUpload",
+ "s3:ListBucketMultipartUploads",
+ "s3:ListMultipartUploadParts"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::sms-b-*",
+ "arn:aws:s3:::import-to-ec2-*",
+ "arn:aws:s3:::server-migration-service-upgrade",
+ "arn:aws:s3:::server-migration-service-upgrade/*",
+ "arn:aws:s3:::connector-platform-upgrade-info/*",
+ "arn:aws:s3:::connector-platform-upgrade-info",
+ "arn:aws:s3:::connector-platform-upgrade-bundles/*",
+ "arn:aws:s3:::connector-platform-upgrade-bundles",
+ "arn:aws:s3:::connector-platform-release-notes/*",
+ "arn:aws:s3:::connector-platform-release-notes"
+ ]
+ },
+ {
+ "Action": "awsconnector:*",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "SNS:Publish"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:sns:*:*:metrics-sns-topic-for-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJKZRWXIPK5HSG3QDQ",
+ "PolicyName": "ServerMigrationConnector",
+ "UpdateDate": "2016-10-24T21:45:56+00:00",
+ "VersionId": "v1"
+ },
+ "ServerMigrationServiceConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServerMigrationServiceConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-05-09T17:18:57+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "sms:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudformation:ListStacks",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackResources"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:ListAllMyBuckets",
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "s3:GetObject",
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::sms-app-*/*"
+ },
+ {
+ "Action": [
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeVpcs",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeSecurityGroups"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:ListRoles"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "sms.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:GetInstanceProfile",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4IIEMRGEYB",
+ "PolicyName": "ServerMigrationServiceConsoleFullAccess",
+ "UpdateDate": "2020-07-20T22:00:37+00:00",
+ "VersionId": "v2"
+ },
+ "ServerMigrationServiceLaunchRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ServerMigrationServiceLaunchRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-26T19:53:06+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:ModifyInstanceAttribute",
+ "ec2:StopInstances",
+ "ec2:StartInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:AssociateIamInstanceProfile",
+ "ec2:ReplaceIamInstanceProfileAssociation"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:RunInstances",
+ "ec2:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "applicationinsights:Describe*",
+ "applicationinsights:List*",
+ "cloudformation:ListStackResources",
+ "cloudformation:DescribeStacks"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "applicationinsights:CreateApplication",
+ "applicationinsights:CreateComponent",
+ "applicationinsights:UpdateApplication",
+ "applicationinsights:DeleteApplication",
+ "applicationinsights:UpdateComponentConfiguration",
+ "applicationinsights:DeleteComponent"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:applicationinsights:*:*:application/resource-group/sms-app-*"
+ },
+ {
+ "Action": [
+ "resource-groups:CreateGroup",
+ "resource-groups:GetGroup",
+ "resource-groups:UpdateGroup",
+ "resource-groups:DeleteGroup"
+ ],
+ "Condition": {
+ "StringLike": {
+ "aws:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:resource-groups:*:*:group/sms-app-*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "application-insights.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/aws-service-role/application-insights.amazonaws.com/AWSServiceRoleForApplicationInsights"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIIIAAMVUCBR2OLXZO",
+ "PolicyName": "ServerMigrationServiceLaunchRole",
+ "UpdateDate": "2020-10-15T17:29:00+00:00",
+ "VersionId": "v4"
+ },
+ "ServerMigrationServiceRoleForInstanceValidation": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ServerMigrationServiceRoleForInstanceValidation",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-07-20T22:25:07+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": "s3:GetObject",
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::sms-app-*/*"
+ },
+ {
+ "Action": "sms:NotifyAppValidationOutput",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4LJMOLEWUV",
+ "PolicyName": "ServerMigrationServiceRoleForInstanceValidation",
+ "UpdateDate": "2020-07-20T22:25:07+00:00",
+ "VersionId": "v1"
+ },
+ "ServerMigration_ServiceRole": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/ServerMigration_ServiceRole",
+ "AttachmentCount": 0,
+ "CreateDate": "2020-08-11T20:41:44+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "cloudformation:CreateChangeSet",
+ "cloudformation:CreateStack"
+ ],
+ "Condition": {
+ "ForAllValues:StringEquals": {
+ "cloudformation:ResourceTypes": [
+ "AWS::EC2::Instance",
+ "AWS::ApplicationInsights::Application",
+ "AWS::ResourceGroups::Group"
+ ]
+ },
+ "Null": {
+ "cloudformation:ResourceTypes": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ },
+ {
+ "Action": [
+ "cloudformation:DeleteStack",
+ "cloudformation:ExecuteChangeSet",
+ "cloudformation:DeleteChangeSet",
+ "cloudformation:DescribeChangeSet",
+ "cloudformation:DescribeStacks",
+ "cloudformation:DescribeStackEvents",
+ "cloudformation:DescribeStackResource",
+ "cloudformation:DescribeStackResources",
+ "cloudformation:GetTemplate"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ },
+ {
+ "Action": [
+ "cloudformation:ValidateTemplate",
+ "s3:ListAllMyBuckets"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "s3:CreateBucket",
+ "s3:DeleteBucket",
+ "s3:DeleteObject",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:ListBucket",
+ "s3:PutObject",
+ "s3:PutObjectAcl",
+ "s3:PutLifecycleConfiguration"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:s3:::sms-app-*"
+ },
+ {
+ "Action": [
+ "sms:CreateReplicationJob",
+ "sms:DeleteReplicationJob",
+ "sms:GetReplicationJobs",
+ "sms:GetReplicationRuns",
+ "sms:GetServers",
+ "sms:ImportServerCatalog",
+ "sms:StartOnDemandReplicationRun",
+ "sms:UpdateReplicationJob"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:ssm:*::document/AWS-RunRemoteScript",
+ "arn:aws:s3:::sms-app-*"
+ ]
+ },
+ {
+ "Action": "ssm:SendCommand",
+ "Condition": {
+ "StringEquals": {
+ "ssm:resourceTag/UseForSMSApplicationValidation": [
+ "true"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": [
+ "ssm:CancelCommand",
+ "ssm:GetCommandInvocation"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "ec2:CreateTags",
+ "Condition": {
+ "StringEquals": {
+ "ec2:CreateAction": "CopySnapshot"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": "ec2:CopySnapshot",
+ "Condition": {
+ "StringLike": {
+ "aws:RequestTag/SMSJobId": [
+ "sms-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:DeleteSnapshot"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/SMSJobId": [
+ "sms-*"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:snapshot/*"
+ },
+ {
+ "Action": [
+ "ec2:CopyImage",
+ "ec2:DescribeImages",
+ "ec2:DescribeInstances",
+ "ec2:DescribeSnapshots",
+ "ec2:DescribeSnapshotAttribute",
+ "ec2:DeregisterImage",
+ "ec2:ImportImage",
+ "ec2:DescribeImportImageTasks",
+ "ec2:GetEbsEncryptionByDefault"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:GetInstanceProfile"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:DisassociateIamInstanceProfile",
+ "ec2:AssociateIamInstanceProfile",
+ "ec2:ReplaceIamInstanceProfileAssociation"
+ ],
+ "Condition": {
+ "StringLike": {
+ "ec2:ResourceTag/aws:cloudformation:stack-id": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "arn:aws:ec2:*:*:instance/*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEquals": {
+ "iam:PassedToService": "ec2.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": "iam:PassRole",
+ "Condition": {
+ "StringEqualsIfExists": {
+ "iam:PassedToService": "cloudformation.amazonaws.com"
+ },
+ "StringLike": {
+ "iam:AssociatedResourceArn": "arn:aws:cloudformation:*:*:stack/sms-app-*/*"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4NKLZNDFDI",
+ "PolicyName": "ServerMigration_ServiceRole",
+ "UpdateDate": "2020-10-15T17:26:32+00:00",
+ "VersionId": "v2"
+ },
+ "ServiceQuotasFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceQuotasFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-24T15:44:35+00:00",
+ "DefaultVersionId": "v4",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAccountLimits",
+ "cloudformation:DescribeAccountLimits",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:PutMetricAlarm",
+ "dynamodb:DescribeLimits",
+ "elasticloadbalancing:DescribeAccountLimits",
+ "iam:GetAccountSummary",
+ "kinesis:DescribeLimits",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "rds:DescribeAccountAttributes",
+ "route53:GetAccountLimit",
+ "tag:GetTagKeys",
+ "tag:GetTagValues",
+ "servicequotas:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "cloudwatch:DeleteAlarms"
+ ],
+ "Condition": {
+ "Null": {
+ "aws:ResourceTag/ServiceQuotaMonitor": "false"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "organizations:EnableAWSServiceAccess"
+ ],
+ "Condition": {
+ "StringLike": {
+ "organizations:ServicePrincipal": [
+ "servicequotas.amazonaws.com"
+ ]
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "iam:CreateServiceLinkedRole"
+ ],
+ "Condition": {
+ "StringEquals": {
+ "iam:AWSServiceName": "servicequotas.amazonaws.com"
+ }
+ },
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4CGHQWENW3",
+ "PolicyName": "ServiceQuotasFullAccess",
+ "UpdateDate": "2021-02-04T21:29:43+00:00",
+ "VersionId": "v4"
+ },
+ "ServiceQuotasReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/ServiceQuotasReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-06-24T15:31:06+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "autoscaling:DescribeAccountLimits",
+ "cloudformation:DescribeAccountLimits",
+ "cloudwatch:DescribeAlarmsForMetric",
+ "cloudwatch:DescribeAlarms",
+ "cloudwatch:GetMetricData",
+ "cloudwatch:GetMetricStatistics",
+ "dynamodb:DescribeLimits",
+ "elasticloadbalancing:DescribeAccountLimits",
+ "iam:GetAccountSummary",
+ "kinesis:DescribeLimits",
+ "organizations:DescribeAccount",
+ "organizations:DescribeOrganization",
+ "organizations:ListAWSServiceAccessForOrganization",
+ "rds:DescribeAccountAttributes",
+ "route53:GetAccountLimit",
+ "tag:GetTagKeys",
+ "tag:GetTagValues",
+ "servicequotas:GetAssociationForServiceQuotaTemplate",
+ "servicequotas:GetAWSDefaultServiceQuota",
+ "servicequotas:GetRequestedServiceQuotaChange",
+ "servicequotas:GetServiceQuota",
+ "servicequotas:GetServiceQuotaIncreaseRequestFromTemplate",
+ "servicequotas:ListAWSDefaultServiceQuotas",
+ "servicequotas:ListRequestedServiceQuotaChangeHistory",
+ "servicequotas:ListRequestedServiceQuotaChangeHistoryByQuota",
+ "servicequotas:ListServices",
+ "servicequotas:ListServiceQuotas",
+ "servicequotas:ListServiceQuotaIncreaseRequestsInTemplate",
+ "servicequotas:ListTagsForResource"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4ITU2HGGUJ",
+ "PolicyName": "ServiceQuotasReadOnlyAccess",
+ "UpdateDate": "2020-12-21T18:11:57+00:00",
+ "VersionId": "v2"
+ },
+ "ServiceQuotasServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/ServiceQuotasServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-05-22T20:44:17+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "support:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4FCG7EVJIR",
+ "PolicyName": "ServiceQuotasServiceRolePolicy",
+ "UpdateDate": "2019-06-24T14:52:56+00:00",
+ "VersionId": "v2"
+ },
+ "SimpleWorkflowFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/SimpleWorkflowFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-02-06T18:41:04+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "swf:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIFE3AV6VE7EANYBVM",
+ "PolicyName": "SimpleWorkflowFullAccess",
+ "UpdateDate": "2015-02-06T18:41:04+00:00",
+ "VersionId": "v1"
+ },
+ "SupportUser": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/SupportUser",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:21:53+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "support:*",
+ "acm:DescribeCertificate",
+ "acm:GetCertificate",
+ "acm:List*",
+ "acm-pca:DescribeCertificateAuthority",
+ "acm-pca:ListCertificateAuthorities",
+ "apigateway:GET",
+ "autoscaling:Describe*",
+ "aws-marketplace:ViewSubscriptions",
+ "cloudformation:Describe*",
+ "cloudformation:Get*",
+ "cloudformation:List*",
+ "cloudformation:EstimateTemplateCost",
+ "cloudfront:Get*",
+ "cloudfront:List*",
+ "cloudsearch:Describe*",
+ "cloudsearch:List*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:ListTags",
+ "cloudtrail:ListPublicKeys",
+ "cloudwatch:Describe*",
+ "cloudwatch:Get*",
+ "cloudwatch:List*",
+ "codecommit:BatchGetRepositories",
+ "codecommit:Get*",
+ "codecommit:List*",
+ "codedeploy:Batch*",
+ "codedeploy:Get*",
+ "codedeploy:List*",
+ "codepipeline:AcknowledgeJob",
+ "codepipeline:AcknowledgeThirdPartyJob",
+ "codepipeline:ListActionTypes",
+ "codepipeline:ListPipelines",
+ "codepipeline:PollForJobs",
+ "codepipeline:PollForThirdPartyJobs",
+ "codepipeline:GetPipelineState",
+ "codepipeline:GetPipeline",
+ "cognito-identity:List*",
+ "cognito-identity:LookupDeveloperIdentity",
+ "cognito-identity:Describe*",
+ "cognito-idp:DescribeResourceServer",
+ "cognito-idp:DescribeRiskConfiguration",
+ "cognito-idp:DescribeUserImportJob",
+ "cognito-idp:DescribeUserPool",
+ "cognito-idp:DescribeUserPoolDomain",
+ "cognito-idp:List*",
+ "cognito-sync:Describe*",
+ "cognito-sync:GetBulkPublishDetails",
+ "cognito-sync:GetCognitoEvents",
+ "cognito-sync:GetIdentityPoolConfiguration",
+ "cognito-sync:List*",
+ "config:DescribeConfigurationRecorders",
+ "config:DescribeConfigurationRecorderStatus",
+ "config:DescribeConfigRuleEvaluationStatus",
+ "config:DescribeConfigRules",
+ "config:DescribeDeliveryChannels",
+ "config:DescribeDeliveryChannelStatus",
+ "config:GetResourceConfigHistory",
+ "config:ListDiscoveredResources",
+ "datapipeline:DescribeObjects",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetPipelineDefinition",
+ "datapipeline:ListPipelines",
+ "datapipeline:QueryObjects",
+ "datapipeline:ReportTaskProgress",
+ "datapipeline:ReportTaskRunnerHeartbeat",
+ "devicefarm:List*",
+ "devicefarm:Get*",
+ "directconnect:Describe*",
+ "discovery:Describe*",
+ "discovery:ListConfigurations",
+ "dms:Describe*",
+ "dms:List*",
+ "ds:DescribeDirectories",
+ "ds:DescribeSnapshots",
+ "ds:GetDirectoryLimits",
+ "ds:GetSnapshotLimits",
+ "ds:ListAuthorizedApplications",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeTable",
+ "dynamodb:ListTables",
+ "ec2:Describe*",
+ "ec2:DescribeHosts",
+ "ec2:describeIdentityIdFormat",
+ "ec2:DescribeIdFormat",
+ "ec2:DescribeInstanceAttribute",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeReservedInstancesModifications",
+ "ec2:DescribeTags",
+ "ecr:GetRepositoryPolicy",
+ "ecr:BatchCheckLayerAvailability",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:Describe*",
+ "ecs:List*",
+ "elasticache:Describe*",
+ "elasticache:List*",
+ "elasticbeanstalk:Check*",
+ "elasticbeanstalk:Describe*",
+ "elasticbeanstalk:List*",
+ "elasticbeanstalk:RequestEnvironmentInfo",
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
+ "elasticbeanstalk:ValidateConfigurationSettings",
+ "elasticfilesystem:Describe*",
+ "elasticloadbalancing:Describe*",
+ "elasticmapreduce:Describe*",
+ "elasticmapreduce:List*",
+ "elastictranscoder:List*",
+ "elastictranscoder:ReadJob",
+ "elasticfilesystem:DescribeFileSystems",
+ "es:Describe*",
+ "es:List*",
+ "es:ESHttpGet",
+ "es:ESHttpHead",
+ "events:DescribeRule",
+ "events:List*",
+ "events:TestEventPattern",
+ "firehose:Describe*",
+ "firehose:List*",
+ "gamelift:List*",
+ "gamelift:Describe*",
+ "glacier:ListVaults",
+ "glacier:DescribeVault",
+ "glacier:DescribeJob",
+ "glacier:Get*",
+ "glacier:List*",
+ "iam:GenerateCredentialReport",
+ "iam:GenerateServiceLastAccessedDetails",
+ "iam:Get*",
+ "iam:List*",
+ "importexport:GetStatus",
+ "importexport:ListJobs",
+ "inspector:Describe*",
+ "inspector:List*",
+ "iot:Describe*",
+ "iot:Get*",
+ "iot:List*",
+ "kinesisanalytics:DescribeApplication",
+ "kinesisanalytics:DiscoverInputSchema",
+ "kinesisanalytics:GetApplicationState",
+ "kinesisanalytics:ListApplications",
+ "kinesis:Describe*",
+ "kinesis:Get*",
+ "kinesis:List*",
+ "kms:Describe*",
+ "kms:Get*",
+ "kms:List*",
+ "lambda:List*",
+ "lambda:Get*",
+ "logs:Describe*",
+ "logs:TestMetricFilter",
+ "machinelearning:Describe*",
+ "machinelearning:Get*",
+ "mobilehub:GetProject",
+ "mobilehub:List*",
+ "mobilehub:ValidateProject",
+ "mobilehub:VerifyServiceRole",
+ "opsworks:Describe*",
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "redshift:Describe*",
+ "route53:Get*",
+ "route53:List*",
+ "route53domains:CheckDomainAvailability",
+ "route53domains:GetDomainDetail",
+ "route53domains:GetOperationDetail",
+ "route53domains:List*",
+ "s3:List*",
+ "sdb:GetAttributes",
+ "sdb:List*",
+ "sdb:Select*",
+ "servicecatalog:SearchProducts",
+ "servicecatalog:DescribeProduct",
+ "servicecatalog:DescribeProductView",
+ "servicecatalog:ListLaunchPaths",
+ "servicecatalog:DescribeProvisioningParameters",
+ "servicecatalog:ListRecordHistory",
+ "servicecatalog:DescribeRecord",
+ "servicecatalog:ScanProvisionedProducts",
+ "ses:Get*",
+ "ses:List*",
+ "sns:Get*",
+ "sns:List*",
+ "sqs:GetQueueAttributes",
+ "sqs:GetQueueUrl",
+ "sqs:ListQueues",
+ "sqs:ReceiveMessage",
+ "ssm:List*",
+ "ssm:Describe*",
+ "storagegateway:Describe*",
+ "storagegateway:List*",
+ "swf:Count*",
+ "swf:Describe*",
+ "swf:Get*",
+ "swf:List*",
+ "waf:Get*",
+ "waf:List*",
+ "workdocs:Describe*",
+ "workmail:Describe*",
+ "workmail:Get*",
+ "workspaces:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAI3V4GSSN5SJY3P2RO",
+ "PolicyName": "SupportUser",
+ "UpdateDate": "2022-02-02T15:11:42+00:00",
+ "VersionId": "v6"
+ },
+ "SystemAdministrator": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/SystemAdministrator",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:23:56+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:Describe*",
+ "acm:Get*",
+ "acm:List*",
+ "acm:Request*",
+ "acm:Resend*",
+ "autoscaling:*",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:GetTrailStatus",
+ "cloudtrail:ListPublicKeys",
+ "cloudtrail:ListTags",
+ "cloudtrail:LookupEvents",
+ "cloudtrail:StartLogging",
+ "cloudtrail:StopLogging",
+ "cloudwatch:*",
+ "codecommit:BatchGetRepositories",
+ "codecommit:CreateBranch",
+ "codecommit:CreateRepository",
+ "codecommit:Get*",
+ "codecommit:GitPull",
+ "codecommit:GitPush",
+ "codecommit:List*",
+ "codecommit:Put*",
+ "codecommit:Test*",
+ "codecommit:Update*",
+ "codedeploy:*",
+ "codepipeline:*",
+ "config:*",
+ "ds:*",
+ "ec2:Allocate*",
+ "ec2:AssignPrivateIpAddresses*",
+ "ec2:Associate*",
+ "ec2:Allocate*",
+ "ec2:AttachInternetGateway",
+ "ec2:AttachNetworkInterface",
+ "ec2:AttachVpnGateway",
+ "ec2:Bundle*",
+ "ec2:Cancel*",
+ "ec2:Copy*",
+ "ec2:CreateCustomerGateway",
+ "ec2:CreateDhcpOptions",
+ "ec2:CreateFlowLogs",
+ "ec2:CreateImage",
+ "ec2:CreateInstanceExportTask",
+ "ec2:CreateInternetGateway",
+ "ec2:CreateKeyPair",
+ "ec2:CreateLaunchTemplate",
+ "ec2:CreateLaunchTemplateVersion",
+ "ec2:CreateNatGateway",
+ "ec2:CreateNetworkInterface",
+ "ec2:CreatePlacementGroup",
+ "ec2:CreateReservedInstancesListing",
+ "ec2:CreateRoute",
+ "ec2:CreateRouteTable",
+ "ec2:CreateSecurityGroup",
+ "ec2:CreateSnapshot",
+ "ec2:CreateSpotDatafeedSubscription",
+ "ec2:CreateSubnet",
+ "ec2:CreateTags",
+ "ec2:CreateVolume",
+ "ec2:CreateVpc",
+ "ec2:CreateVpcEndpoint",
+ "ec2:CreateVpnConnection",
+ "ec2:CreateVpnConnectionRoute",
+ "ec2:CreateVpnGateway",
+ "ec2:DeleteFlowLogs",
+ "ec2:DeleteKeyPair",
+ "ec2:DeleteLaunchTemplate",
+ "ec2:DeleteLaunchTemplateVersions",
+ "ec2:DeleteNatGateway",
+ "ec2:DeleteNetworkInterface",
+ "ec2:DeletePlacementGroup",
+ "ec2:DeleteSnapshot",
+ "ec2:DeleteSpotDatafeedSubscription",
+ "ec2:DeleteSubnet",
+ "ec2:DeleteTags",
+ "ec2:DeleteVpc",
+ "ec2:DeleteVpcEndpoints",
+ "ec2:DeleteVpnConnection",
+ "ec2:DeleteVpnConnectionRoute",
+ "ec2:DeleteVpnGateway",
+ "ec2:DeregisterImage",
+ "ec2:Describe*",
+ "ec2:DetachInternetGateway",
+ "ec2:DetachNetworkInterface",
+ "ec2:DetachVpnGateway",
+ "ec2:DisableVgwRoutePropagation",
+ "ec2:DisableVpcClassicLinkDnsSupport",
+ "ec2:DisassociateAddress",
+ "ec2:DisassociateRouteTable",
+ "ec2:EnableVgwRoutePropagation",
+ "ec2:EnableVolumeIO",
+ "ec2:EnableVpcClassicLinkDnsSupport",
+ "ec2:GetConsoleOutput",
+ "ec2:GetHostReservationPurchasePreview",
+ "ec2:GetLaunchTemplateData",
+ "ec2:GetPasswordData",
+ "ec2:Import*",
+ "ec2:Modify*",
+ "ec2:MonitorInstances",
+ "ec2:MoveAddressToVpc",
+ "ec2:Purchase*",
+ "ec2:RegisterImage",
+ "ec2:Release*",
+ "ec2:Replace*",
+ "ec2:ReportInstanceStatus",
+ "ec2:Request*",
+ "ec2:Reset*",
+ "ec2:RestoreAddressToClassic",
+ "ec2:RunScheduledInstances",
+ "ec2:UnassignPrivateIpAddresses",
+ "ec2:UnmonitorInstances",
+ "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
+ "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
+ "elasticloadbalancing:*",
+ "events:*",
+ "iam:GetAccount*",
+ "iam:GetContextKeys*",
+ "iam:GetCredentialReport",
+ "iam:ListAccountAliases",
+ "iam:ListGroups",
+ "iam:ListOpenIDConnectProviders",
+ "iam:ListPolicies",
+ "iam:ListPoliciesGrantingServiceAccess",
+ "iam:ListRoles",
+ "iam:ListSAMLProviders",
+ "iam:ListServerCertificates",
+ "iam:Simulate*",
+ "iam:UpdateServerCertificate",
+ "iam:UpdateSigningCertificate",
+ "kinesis:ListStreams",
+ "kinesis:PutRecord",
+ "kms:CreateAlias",
+ "kms:CreateKey",
+ "kms:DeleteAlias",
+ "kms:Describe*",
+ "kms:GenerateRandom",
+ "kms:Get*",
+ "kms:List*",
+ "kms:Encrypt",
+ "kms:ReEncrypt*",
+ "lambda:Create*",
+ "lambda:Delete*",
+ "lambda:Get*",
+ "lambda:InvokeFunction",
+ "lambda:List*",
+ "lambda:PublishVersion",
+ "lambda:Update*",
+ "logs:*",
+ "rds:Describe*",
+ "rds:ListTagsForResource",
+ "route53:*",
+ "route53domains:*",
+ "ses:*",
+ "sns:*",
+ "sqs:*",
+ "trustedadvisor:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "ec2:AcceptVpcPeeringConnection",
+ "ec2:AttachClassicLinkVpc",
+ "ec2:AttachVolume",
+ "ec2:AuthorizeSecurityGroupEgress",
+ "ec2:AuthorizeSecurityGroupIngress",
+ "ec2:CreateVpcPeeringConnection",
+ "ec2:DeleteCustomerGateway",
+ "ec2:DeleteDhcpOptions",
+ "ec2:DeleteInternetGateway",
+ "ec2:DeleteNetworkAcl*",
+ "ec2:DeleteRoute",
+ "ec2:DeleteRouteTable",
+ "ec2:DeleteSecurityGroup",
+ "ec2:DeleteVolume",
+ "ec2:DeleteVpcPeeringConnection",
+ "ec2:DetachClassicLinkVpc",
+ "ec2:DetachVolume",
+ "ec2:DisableVpcClassicLink",
+ "ec2:EnableVpcClassicLink",
+ "ec2:GetConsoleScreenshot",
+ "ec2:RebootInstances",
+ "ec2:RejectVpcPeeringConnection",
+ "ec2:RevokeSecurityGroupEgress",
+ "ec2:RevokeSecurityGroupIngress",
+ "ec2:RunInstances",
+ "ec2:StartInstances",
+ "ec2:StopInstances",
+ "ec2:TerminateInstances"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": "s3:*",
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetAccessKeyLastUsed",
+ "iam:GetGroup*",
+ "iam:GetInstanceProfile",
+ "iam:GetLoginProfile",
+ "iam:GetOpenIDConnectProvider",
+ "iam:GetPolicy*",
+ "iam:GetRole*",
+ "iam:GetSAMLProvider",
+ "iam:GetSSHPublicKey",
+ "iam:GetServerCertificate",
+ "iam:GetServiceLastAccessed*",
+ "iam:GetUser*",
+ "iam:ListAccessKeys",
+ "iam:ListAttached*",
+ "iam:ListEntitiesForPolicy",
+ "iam:ListGroupPolicies",
+ "iam:ListGroupsForUser",
+ "iam:ListInstanceProfiles*",
+ "iam:ListMFADevices",
+ "iam:ListPolicyVersions",
+ "iam:ListRolePolicies",
+ "iam:ListSSHPublicKeys",
+ "iam:ListSigningCertificates",
+ "iam:ListUserPolicies",
+ "iam:Upload*"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Action": [
+ "iam:GetRole",
+ "iam:ListRoles",
+ "iam:PassRole"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:iam::*:role/rds-monitoring-role",
+ "arn:aws:iam::*:role/ec2-sysadmin-*",
+ "arn:aws:iam::*:role/ecr-sysadmin-*",
+ "arn:aws:iam::*:role/lambda-sysadmin-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAITJPEZXCYCBXANDSW",
+ "PolicyName": "SystemAdministrator",
+ "UpdateDate": "2020-08-24T20:05:29+00:00",
+ "VersionId": "v6"
+ },
+ "TranslateFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/TranslateFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-27T23:36:20+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "translate:*",
+ "comprehend:DetectDominantLanguage",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "iam:ListRoles",
+ "iam:GetRole"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIAPOAEI2VFQYUK5RY",
+ "PolicyName": "TranslateFullAccess",
+ "UpdateDate": "2020-01-08T21:22:27+00:00",
+ "VersionId": "v2"
+ },
+ "TranslateReadOnly": {
+ "Arn": "arn:aws:iam::aws:policy/TranslateReadOnly",
+ "AttachmentCount": 0,
+ "CreateDate": "2017-11-29T18:22:00+00:00",
+ "DefaultVersionId": "v6",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "translate:TranslateText",
+ "translate:GetTerminology",
+ "translate:ListTerminologies",
+ "translate:ListTextTranslationJobs",
+ "translate:DescribeTextTranslationJob",
+ "translate:GetParallelData",
+ "translate:ListParallelData",
+ "comprehend:DetectDominantLanguage",
+ "cloudwatch:GetMetricStatistics",
+ "cloudwatch:ListMetrics"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJYAMZMTQNWUDJKY2E",
+ "PolicyName": "TranslateReadOnly",
+ "UpdateDate": "2020-11-23T17:31:06+00:00",
+ "VersionId": "v6"
+ },
+ "VMImportExportRoleForAWSConnector": {
+ "Arn": "arn:aws:iam::aws:policy/service-role/VMImportExportRoleForAWSConnector",
+ "AttachmentCount": 0,
+ "CreateDate": "2015-09-03T20:48:59+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetObject"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:s3:::import-to-ec2-*"
+ ]
+ },
+ {
+ "Action": [
+ "ec2:ModifySnapshotAttribute",
+ "ec2:CopySnapshot",
+ "ec2:RegisterImage",
+ "ec2:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJFLQOOJ6F5XNX4LAW",
+ "PolicyName": "VMImportExportRoleForAWSConnector",
+ "UpdateDate": "2015-09-03T20:48:59+00:00",
+ "VersionId": "v1"
+ },
+ "ViewOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2016-11-10T17:20:15+00:00",
+ "DefaultVersionId": "v12",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "acm:ListCertificates",
+ "athena:List*",
+ "aws-marketplace:ViewSubscriptions",
+ "autoscaling:Describe*",
+ "batch:ListJobs",
+ "clouddirectory:ListAppliedSchemaArns",
+ "clouddirectory:ListDevelopmentSchemaArns",
+ "clouddirectory:ListDirectories",
+ "clouddirectory:ListPublishedSchemaArns",
+ "cloudformation:List*",
+ "cloudformation:DescribeStacks",
+ "cloudfront:List*",
+ "cloudhsm:ListAvailableZones",
+ "cloudhsm:ListLunaClients",
+ "cloudhsm:ListHapgs",
+ "cloudhsm:ListHsms",
+ "cloudsearch:List*",
+ "cloudsearch:DescribeDomains",
+ "cloudtrail:DescribeTrails",
+ "cloudtrail:LookupEvents",
+ "cloudwatch:List*",
+ "cloudwatch:Get*",
+ "codebuild:ListBuilds*",
+ "codebuild:ListProjects",
+ "codecommit:List*",
+ "codedeploy:List*",
+ "codedeploy:Get*",
+ "codepipeline:ListPipelines",
+ "codestar:List*",
+ "cognito-idp:List*",
+ "cognito-identity:ListIdentities",
+ "cognito-identity:ListIdentityPools",
+ "cognito-sync:ListDatasets",
+ "connect:List*",
+ "config:List*",
+ "config:Describe*",
+ "datapipeline:ListPipelines",
+ "datapipeline:DescribePipelines",
+ "datapipeline:GetAccountLimits",
+ "dax:DescribeClusters",
+ "dax:DescribeDefaultParameters",
+ "dax:DescribeEvents",
+ "dax:DescribeParameterGroups",
+ "dax:DescribeParameters",
+ "dax:DescribeSubnetGroups",
+ "dax:ListTags",
+ "devicefarm:List*",
+ "directconnect:Describe*",
+ "discovery:List*",
+ "dms:List*",
+ "ds:DescribeDirectories",
+ "dynamodb:DescribeBackup",
+ "dynamodb:DescribeContinuousBackups",
+ "dynamodb:DescribeGlobalTable",
+ "dynamodb:DescribeGlobalTableSettings",
+ "dynamodb:DescribeLimits",
+ "dynamodb:DescribeReservedCapacity",
+ "dynamodb:DescribeReservedCapacityOfferings",
+ "dynamodb:DescribeStream",
+ "dynamodb:DescribeTable",
+ "dynamodb:DescribeTimeToLive",
+ "dynamodb:ListBackups",
+ "dynamodb:ListGlobalTables",
+ "dynamodb:ListStreams",
+ "dynamodb:ListTables",
+ "dynamodb:ListTagsOfResource",
+ "ec2:DescribeAccountAttributes",
+ "ec2:DescribeAddresses",
+ "ec2:DescribeAvailabilityZones",
+ "ec2:DescribeBundleTasks",
+ "ec2:DescribeClassicLinkInstances",
+ "ec2:DescribeConversionTasks",
+ "ec2:DescribeCustomerGateways",
+ "ec2:DescribeDhcpOptions",
+ "ec2:DescribeExportTasks",
+ "ec2:DescribeFlowLogs",
+ "ec2:DescribeHost*",
+ "ec2:DescribeIdentityIdFormat",
+ "ec2:DescribeIdFormat",
+ "ec2:DescribeImage*",
+ "ec2:DescribeImport*",
+ "ec2:DescribeInstance*",
+ "ec2:DescribeInternetGateways",
+ "ec2:DescribeKeyPairs",
+ "ec2:DescribeMovingAddresses",
+ "ec2:DescribeNatGateways",
+ "ec2:DescribeNetwork*",
+ "ec2:DescribePlacementGroups",
+ "ec2:DescribePrefixLists",
+ "ec2:DescribeRegions",
+ "ec2:DescribeReserved*",
+ "ec2:DescribeRouteTables",
+ "ec2:DescribeSecurityGroups",
+ "ec2:DescribeSnapshot*",
+ "ec2:DescribeSpot*",
+ "ec2:DescribeSubnets",
+ "ec2:DescribeTags",
+ "ec2:DescribeVolume*",
+ "ec2:DescribeVpc*",
+ "ec2:DescribeVpnGateways",
+ "ec2:DescribeCarrierGateways",
+ "ec2:DescribeLocalGateways",
+ "ec2:DescribeLocalGatewayVirtualInterfaces",
+ "ec2:DescribeLocalGatewayVirtualInterfaceGroups",
+ "ec2:DescribeLocalGatewayRouteTables",
+ "ec2:DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations",
+ "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
+ "ec2:SearchLocalGatewayRoutes",
+ "ecr:DescribeRepositories",
+ "ecr:ListImages",
+ "ecs:List*",
+ "ecs:Describe*",
+ "elasticache:Describe*",
+ "elasticbeanstalk:DescribeApplicationVersions",
+ "elasticbeanstalk:DescribeApplications",
+ "elasticbeanstalk:DescribeEnvironments",
+ "elasticbeanstalk:ListAvailableSolutionStacks",
+ "elasticloadbalancing:DescribeListeners",
+ "elasticloadbalancing:DescribeLoadBalancers",
+ "elasticloadbalancing:DescribeTargetGroups",
+ "elasticfilesystem:DescribeFileSystems",
+ "elasticloadbalancing:DescribeInstanceHealth",
+ "elasticloadbalancing:DescribeTargetHealth",
+ "elasticmapreduce:List*",
+ "elastictranscoder:List*",
+ "es:DescribeElasticsearchDomain",
+ "es:DescribeElasticsearchDomains",
+ "es:ListDomainNames",
+ "events:ListRuleNamesByTarget",
+ "events:ListRules",
+ "events:ListTargetsByRule",
+ "firehose:List*",
+ "firehose:DescribeDeliveryStream",
+ "fsx:DescribeFileSystems",
+ "gamelift:List*",
+ "glacier:List*",
+ "greengrass:List*",
+ "iam:List*",
+ "iam:GetAccountSummary",
+ "iam:GetLoginProfile",
+ "importexport:ListJobs",
+ "inspector:List*",
+ "iot:List*",
+ "kinesis:ListStreams",
+ "kinesisanalytics:ListApplications",
+ "kms:ListKeys",
+ "lambda:List*",
+ "lex:GetBotAliases",
+ "lex:GetBotChannelAssociations",
+ "lex:GetBots",
+ "lex:GetBotVersions",
+ "lex:GetIntents",
+ "lex:GetIntentVersions",
+ "lex:GetSlotTypes",
+ "lex:GetSlotTypeVersions",
+ "lex:GetUtterancesView",
+ "lightsail:GetBlueprints",
+ "lightsail:GetBundles",
+ "lightsail:GetInstances",
+ "lightsail:GetInstanceSnapshots",
+ "lightsail:GetKeyPair",
+ "lightsail:GetRegions",
+ "lightsail:GetStaticIps",
+ "lightsail:IsVpcPeered",
+ "logs:Describe*",
+ "machinelearning:Describe*",
+ "mobilehub:ListAvailableFeatures",
+ "mobilehub:ListAvailableRegions",
+ "mobilehub:ListProjects",
+ "opsworks:Describe*",
+ "opsworks-cm:Describe*",
+ "organizations:List*",
+ "outposts:GetOutpost",
+ "outposts:GetOutpostInstanceTypes",
+ "outposts:ListOutposts",
+ "outposts:ListSites",
+ "outposts:ListTagsForResource",
+ "mobiletargeting:GetApplicationSettings",
+ "mobiletargeting:GetCampaigns",
+ "mobiletargeting:GetImportJobs",
+ "mobiletargeting:GetSegments",
+ "polly:Describe*",
+ "polly:List*",
+ "rds:Describe*",
+ "redshift:DescribeClusters",
+ "redshift:DescribeEvents",
+ "redshift:ViewQueriesInConsole",
+ "route53:List*",
+ "route53:Get*",
+ "route53domains:List*",
+ "route53resolver:Get*",
+ "route53resolver:List*",
+ "s3:ListAllMyBuckets",
+ "s3:ListBucket",
+ "sagemaker:Describe*",
+ "sagemaker:List*",
+ "sdb:List*",
+ "servicecatalog:List*",
+ "ses:List*",
+ "shield:List*",
+ "states:ListActivities",
+ "states:ListStateMachines",
+ "sns:List*",
+ "sqs:ListQueues",
+ "ssm:ListAssociations",
+ "ssm:ListDocuments",
+ "storagegateway:ListGateways",
+ "storagegateway:ListLocalDisks",
+ "storagegateway:ListVolumeRecoveryPoints",
+ "storagegateway:ListVolumes",
+ "swf:List*",
+ "trustedadvisor:Describe*",
+ "waf:List*",
+ "waf-regional:List*",
+ "wafv2:List*",
+ "workdocs:DescribeAvailableDirectories",
+ "workdocs:DescribeInstances",
+ "workmail:Describe*",
+ "workspaces:Describe*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/job-function/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAID22R6XPJATWOFDK6",
+ "PolicyName": "ViewOnlyAccess",
+ "UpdateDate": "2021-12-21T02:53:03+00:00",
+ "VersionId": "v12"
+ },
+ "WAFLoggingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/WAFLoggingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-24T21:05:47+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:firehose:*:*:deliverystream/aws-waf-logs-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJZ7N545GUNUHNTYOM",
+ "PolicyName": "WAFLoggingServiceRolePolicy",
+ "UpdateDate": "2018-08-24T21:05:47+00:00",
+ "VersionId": "v1"
+ },
+ "WAFRegionalLoggingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/WAFRegionalLoggingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-08-24T18:40:55+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:firehose:*:*:deliverystream/aws-waf-logs-*"
+ ]
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJE43HAZMEH4CI6SU2",
+ "PolicyName": "WAFRegionalLoggingServiceRolePolicy",
+ "UpdateDate": "2018-08-24T18:40:55+00:00",
+ "VersionId": "v1"
+ },
+ "WAFV2LoggingServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/aws-service-role/WAFV2LoggingServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-11-07T00:40:56+00:00",
+ "DefaultVersionId": "v2",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "firehose:PutRecord",
+ "firehose:PutRecordBatch"
+ ],
+ "Effect": "Allow",
+ "Resource": [
+ "arn:aws:firehose:*:*:deliverystream/aws-waf-logs-*"
+ ]
+ },
+ {
+ "Action": "organizations:DescribeOrganization",
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/aws-service-role/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAZKAPJZG4AHQ3ASNCX",
+ "PolicyName": "WAFV2LoggingServiceRolePolicy",
+ "UpdateDate": "2020-07-23T17:04:25+00:00",
+ "VersionId": "v2"
+ },
+ "WellArchitectedConsoleFullAccess": {
+ "Arn": "arn:aws:iam::aws:policy/WellArchitectedConsoleFullAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-29T18:19:23+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "wellarchitected:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIH6HSBHM3VSYC5SKA",
+ "PolicyName": "WellArchitectedConsoleFullAccess",
+ "UpdateDate": "2018-11-29T18:19:23+00:00",
+ "VersionId": "v1"
+ },
+ "WellArchitectedConsoleReadOnlyAccess": {
+ "Arn": "arn:aws:iam::aws:policy/WellArchitectedConsoleReadOnlyAccess",
+ "AttachmentCount": 0,
+ "CreateDate": "2018-11-29T18:21:08+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "wellarchitected:Get*",
+ "wellarchitected:List*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAIUTK35NDTYF6T2GFY",
+ "PolicyName": "WellArchitectedConsoleReadOnlyAccess",
+ "UpdateDate": "2018-11-29T18:21:08+00:00",
+ "VersionId": "v1"
+ },
+ "WorkLinkServiceRolePolicy": {
+ "Arn": "arn:aws:iam::aws:policy/WorkLinkServiceRolePolicy",
+ "AttachmentCount": 0,
+ "CreateDate": "2019-01-23T19:03:45+00:00",
+ "DefaultVersionId": "v1",
+ "Document": {
+ "Statement": [
+ {
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DeleteNetworkInterfacePermission",
+ "ec2:CreateNetworkInterfacePermission",
+ "ec2:ModifyNetworkInterfaceAttribute",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ },
+ {
+ "Action": [
+ "kinesis:PutRecord",
+ "kinesis:PutRecords"
+ ],
+ "Effect": "Allow",
+ "Resource": "arn:aws:kinesis:*:*:stream/AmazonWorkLink-*"
+ }
+ ],
+ "Version": "2012-10-17"
+ },
+ "IsAttachable": true,
+ "IsDefaultVersion": true,
+ "Path": "/",
+ "PermissionsBoundaryUsageCount": 0,
+ "PolicyId": "ANPAJ6JTE3DI5JOULLNLS",
+ "PolicyName": "WorkLinkServiceRolePolicy",
+ "UpdateDate": "2019-01-23T19:03:45+00:00",
+ "VersionId": "v1"
+ }
+}"""
diff --git a/contrib/python/moto/py3/moto/iam/config.py b/contrib/python/moto/py3/moto/iam/config.py
new file mode 100644
index 0000000000..357907db9c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/config.py
@@ -0,0 +1,321 @@
+import json
+import boto3
+from moto.core.exceptions import InvalidNextTokenException
+from moto.core.common_models import ConfigQueryModel
+from moto.iam import iam_backends
+
+
+class RoleConfigQuery(ConfigQueryModel):
+ def list_config_service_resources(
+ self,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=None,
+ resource_region=None,
+ aggregator=None,
+ ):
+ # IAM roles are "global" and aren't assigned into any availability zone
+ # The resource ID is a AWS-assigned random string like "AROA0BSVNSZKXVHS00SBJ"
+ # The resource name is a user-assigned string like "MyDevelopmentAdminRole"
+ # Stored in moto backend with the AWS-assigned random string like "AROA0BSVNSZKXVHS00SBJ"
+
+ # Grab roles from backend; need the full values since names and id's are different
+ role_list = list(self.backends["global"].roles.values())
+
+ if not role_list:
+ return [], None
+
+ # Filter by resource name or ids
+ if resource_name or resource_ids:
+ filtered_roles = []
+ # resource_name takes precedence over resource_ids
+ if resource_name:
+ for role in role_list:
+ if role.name == resource_name:
+ filtered_roles = [role]
+ break
+ # but if both are passed, it must be a subset
+ if filtered_roles and resource_ids:
+ if filtered_roles[0].id not in resource_ids:
+ return [], None
+ else:
+ for role in role_list:
+ if role.id in resource_ids:
+ filtered_roles.append(role)
+
+ # Filtered roles are now the subject for the listing
+ role_list = filtered_roles
+
+ if aggregator:
+ # IAM is a little special; Roles are created in us-east-1 (which AWS calls the "global" region)
+ # However, the resource will return in the aggregator (in duplicate) for each region in the aggregator
+ # Therefore, we'll need to find out the regions where the aggregators are running, and then duplicate the resource there
+
+ # In practice, it looks like AWS will only duplicate these resources if you've "used" any roles in the region, but since
+ # we can't really tell if this has happened in moto, we'll just bind this to the regions in your aggregator
+ aggregated_regions = []
+ aggregator_sources = aggregator.get(
+ "account_aggregation_sources"
+ ) or aggregator.get("organization_aggregation_source")
+ for source in aggregator_sources:
+ source_dict = source.__dict__
+ if source_dict.get("all_aws_regions", False):
+ aggregated_regions = boto3.Session().get_available_regions("config")
+ break
+ for region in source_dict.get("aws_regions", []):
+ aggregated_regions.append(region)
+
+ duplicate_role_list = []
+ for region in list(set(aggregated_regions)):
+ for role in role_list:
+ duplicate_role_list.append(
+ {
+ "_id": "{}{}".format(
+ role.id, region
+ ), # this is only for sorting, isn't returned outside of this functin
+ "type": "AWS::IAM::Role",
+ "id": role.id,
+ "name": role.name,
+ "region": region,
+ }
+ )
+
+ # Pagination logic, sort by role id
+ sorted_roles = sorted(duplicate_role_list, key=lambda role: role["_id"])
+ else:
+ # Non-aggregated queries are in the else block, and we can treat these like a normal config resource
+ # Pagination logic, sort by role id
+ sorted_roles = sorted(role_list, key=lambda role: role.id)
+
+ new_token = None
+
+ # Get the start:
+ if not next_token:
+ start = 0
+ else:
+ try:
+ # Find the index of the next
+ start = next(
+ index
+ for (index, r) in enumerate(sorted_roles)
+ if next_token == (r["_id"] if aggregator else r.id)
+ )
+ except StopIteration:
+ raise InvalidNextTokenException()
+
+ # Get the list of items to collect:
+ role_list = sorted_roles[start : (start + limit)]
+
+ if len(sorted_roles) > (start + limit):
+ record = sorted_roles[start + limit]
+ new_token = record["_id"] if aggregator else record.id
+
+ return (
+ [
+ {
+ "type": "AWS::IAM::Role",
+ "id": role["id"] if aggregator else role.id,
+ "name": role["name"] if aggregator else role.name,
+ "region": role["region"] if aggregator else "global",
+ }
+ for role in role_list
+ ],
+ new_token,
+ )
+
+ def get_config_resource(
+ self, resource_id, resource_name=None, backend_region=None, resource_region=None
+ ):
+
+ role = self.backends["global"].roles.get(resource_id, {})
+
+ if not role:
+ return
+
+ if resource_name and role.name != resource_name:
+ return
+
+ # Format the role to the AWS Config format:
+ config_data = role.to_config_dict()
+
+ # The 'configuration' field is also a JSON string:
+ config_data["configuration"] = json.dumps(config_data["configuration"])
+
+ # Supplementary config need all values converted to JSON strings if they are not strings already:
+ for field, value in config_data["supplementaryConfiguration"].items():
+ if not isinstance(value, str):
+ config_data["supplementaryConfiguration"][field] = json.dumps(value)
+
+ return config_data
+
+
+class PolicyConfigQuery(ConfigQueryModel):
+ def list_config_service_resources(
+ self,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=None,
+ resource_region=None,
+ aggregator=None,
+ ):
+ # IAM policies are "global" and aren't assigned into any availability zone
+ # The resource ID is a AWS-assigned random string like "ANPA0BSVNSZK00SJSPVUJ"
+ # The resource name is a user-assigned string like "my-development-policy"
+ # Stored in moto backend with the arn like "arn:aws:iam::123456789012:policy/my-development-policy"
+
+ policy_list = list(self.backends["global"].managed_policies.values())
+
+ # We don't want to include AWS Managed Policies. This technically needs to
+ # respect the configuration recorder's 'includeGlobalResourceTypes' setting,
+ # but it's default set be default, and moto's config doesn't yet support
+ # custom configuration recorders, we'll just behave as default.
+ policy_list = list(
+ filter(
+ lambda policy: not policy.arn.startswith("arn:aws:iam::aws"),
+ policy_list,
+ )
+ )
+
+ if not policy_list:
+ return [], None
+
+ # Filter by resource name or ids
+ if resource_name or resource_ids:
+ filtered_policies = []
+ # resource_name takes precedence over resource_ids
+ if resource_name:
+ for policy in policy_list:
+ if policy.name == resource_name:
+ filtered_policies = [policy]
+ break
+ # but if both are passed, it must be a subset
+ if filtered_policies and resource_ids:
+ if filtered_policies[0].id not in resource_ids:
+ return [], None
+
+ else:
+ for policy in policy_list:
+ if policy.id in resource_ids:
+ filtered_policies.append(policy)
+
+ # Filtered roles are now the subject for the listing
+ policy_list = filtered_policies
+
+ if aggregator:
+ # IAM is a little special; Policies are created in us-east-1 (which AWS calls the "global" region)
+ # However, the resource will return in the aggregator (in duplicate) for each region in the aggregator
+ # Therefore, we'll need to find out the regions where the aggregators are running, and then duplicate the resource there
+
+ # In practice, it looks like AWS will only duplicate these resources if you've "used" any policies in the region, but since
+ # we can't really tell if this has happened in moto, we'll just bind this to the regions in your aggregator
+ aggregated_regions = []
+ aggregator_sources = aggregator.get(
+ "account_aggregation_sources"
+ ) or aggregator.get("organization_aggregation_source")
+ for source in aggregator_sources:
+ source_dict = source.__dict__
+ if source_dict.get("all_aws_regions", False):
+ aggregated_regions = boto3.Session().get_available_regions("config")
+ break
+ for region in source_dict.get("aws_regions", []):
+ aggregated_regions.append(region)
+
+ duplicate_policy_list = []
+ for region in list(set(aggregated_regions)):
+ for policy in policy_list:
+ duplicate_policy_list.append(
+ {
+ "_id": "{}{}".format(
+ policy.id, region
+ ), # this is only for sorting, isn't returned outside of this functin
+ "type": "AWS::IAM::Policy",
+ "id": policy.id,
+ "name": policy.name,
+ "region": region,
+ }
+ )
+
+ # Pagination logic, sort by role id
+ sorted_policies = sorted(
+ duplicate_policy_list, key=lambda policy: policy["_id"]
+ )
+
+ else:
+ # Non-aggregated queries are in the else block, and we can treat these like a normal config resource
+ # Pagination logic, sort by role id
+ sorted_policies = sorted(policy_list, key=lambda role: role.id)
+
+ new_token = None
+
+ # Get the start:
+ if not next_token:
+ start = 0
+ else:
+ try:
+ # Find the index of the next
+ start = next(
+ index
+ for (index, p) in enumerate(sorted_policies)
+ if next_token == (p["_id"] if aggregator else p.id)
+ )
+ except StopIteration:
+ raise InvalidNextTokenException()
+
+ # Get the list of items to collect:
+ policy_list = sorted_policies[start : (start + limit)]
+
+ if len(sorted_policies) > (start + limit):
+ record = sorted_policies[start + limit]
+ new_token = record["_id"] if aggregator else record.id
+
+ return (
+ [
+ {
+ "type": "AWS::IAM::Policy",
+ "id": policy["id"] if aggregator else policy.id,
+ "name": policy["name"] if aggregator else policy.name,
+ "region": policy["region"] if aggregator else "global",
+ }
+ for policy in policy_list
+ ],
+ new_token,
+ )
+
+ def get_config_resource(
+ self, resource_id, resource_name=None, backend_region=None, resource_region=None
+ ):
+ # policies are listed in the backend as arns, but we have to accept the PolicyID as the resource_id
+ # we'll make a really crude search for it
+ policy = None
+ for arn in self.backends["global"].managed_policies.keys():
+ policy_candidate = self.backends["global"].managed_policies[arn]
+ if policy_candidate.id == resource_id:
+ policy = policy_candidate
+ break
+
+ if not policy:
+ return
+
+ if resource_name and policy.name != resource_name:
+ return
+
+ # Format the policy to the AWS Config format:
+ config_data = policy.to_config_dict()
+
+ # The 'configuration' field is also a JSON string:
+ config_data["configuration"] = json.dumps(config_data["configuration"])
+
+ # Supplementary config need all values converted to JSON strings if they are not strings already:
+ for field, value in config_data["supplementaryConfiguration"].items():
+ if not isinstance(value, str):
+ config_data["supplementaryConfiguration"][field] = json.dumps(value)
+
+ return config_data
+
+
+role_config_query = RoleConfigQuery(iam_backends)
+policy_config_query = PolicyConfigQuery(iam_backends)
diff --git a/contrib/python/moto/py3/moto/iam/exceptions.py b/contrib/python/moto/py3/moto/iam/exceptions.py
new file mode 100644
index 0000000000..2be2d16a9e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/exceptions.py
@@ -0,0 +1,142 @@
+from moto.core.exceptions import RESTError
+
+XMLNS_IAM = "https://iam.amazonaws.com/doc/2010-05-08/"
+
+
+class IAMNotFoundException(RESTError):
+ code = 404
+
+ def __init__(self, message):
+ super().__init__(
+ "NoSuchEntity", message, xmlns=XMLNS_IAM, template="wrapped_single_error"
+ )
+
+
+class IAMConflictException(RESTError):
+ code = 409
+
+ def __init__(self, code="Conflict", message=""):
+ super().__init__(code, message)
+
+
+class IAMReportNotPresentException(RESTError):
+ code = 410
+
+ def __init__(self, message):
+ super().__init__("ReportNotPresent", message)
+
+
+class IAMLimitExceededException(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("LimitExceeded", message)
+
+
+class MalformedCertificate(RESTError):
+ code = 400
+
+ def __init__(self, cert):
+ super().__init__(
+ "MalformedCertificate", "Certificate {cert} is malformed".format(cert=cert)
+ )
+
+
+class MalformedPolicyDocument(RESTError):
+ code = 400
+
+ def __init__(self, message=""):
+ super().__init__(
+ "MalformedPolicyDocument",
+ message,
+ xmlns=XMLNS_IAM,
+ template="wrapped_single_error",
+ )
+
+
+class DuplicateTags(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidInput",
+ "Duplicate tag keys found. Please note that Tag keys are case insensitive.",
+ )
+
+
+class TagKeyTooBig(RESTError):
+ code = 400
+
+ def __init__(self, tag, param="tags.X.member.key"):
+ super().__init__(
+ "ValidationError",
+ "1 validation error detected: Value '{}' at '{}' failed to satisfy "
+ "constraint: Member must have length less than or equal to 128.".format(
+ tag, param
+ ),
+ )
+
+
+class TagValueTooBig(RESTError):
+ code = 400
+
+ def __init__(self, tag):
+ super().__init__(
+ "ValidationError",
+ "1 validation error detected: Value '{}' at 'tags.X.member.value' failed to satisfy "
+ "constraint: Member must have length less than or equal to 256.".format(
+ tag
+ ),
+ )
+
+
+class InvalidTagCharacters(RESTError):
+ code = 400
+
+ def __init__(self, tag, param="tags.X.member.key"):
+ message = f"1 validation error detected: Value '{tag}' at '{param}' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\p{{L}}\\p{{Z}}\\p{{N}}_.:/=+\\-@]+"
+
+ super().__init__("ValidationError", message)
+
+
+class TooManyTags(RESTError):
+ code = 400
+
+ def __init__(self, tags, param="tags"):
+ super().__init__(
+ "ValidationError",
+ "1 validation error detected: Value '{}' at '{}' failed to satisfy "
+ "constraint: Member must have length less than or equal to 50.".format(
+ tags, param
+ ),
+ )
+
+
+class EntityAlreadyExists(RESTError):
+ code = 409
+
+ def __init__(self, message):
+ super().__init__("EntityAlreadyExists", message)
+
+
+class ValidationError(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationError", message)
+
+
+class InvalidInput(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidInput", message)
+
+
+class NoSuchEntity(RESTError):
+ code = 404
+
+ def __init__(self, message):
+ super().__init__(
+ "NoSuchEntity", message, xmlns=XMLNS_IAM, template="wrapped_single_error"
+ )
diff --git a/contrib/python/moto/py3/moto/iam/models.py b/contrib/python/moto/py3/moto/iam/models.py
new file mode 100644
index 0000000000..5f12238e33
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/models.py
@@ -0,0 +1,2927 @@
+import base64
+import os
+import random
+import string
+import sys
+import uuid
+from datetime import datetime
+import json
+import re
+import time
+
+from cryptography import x509
+from cryptography.hazmat.backends import default_backend
+
+from jinja2 import Template
+from urllib import parse
+from moto.core.exceptions import RESTError
+from moto.core import BaseBackend, BaseModel, get_account_id, CloudFormationModel
+from moto.core.utils import (
+ iso_8601_datetime_without_milliseconds,
+ iso_8601_datetime_with_milliseconds,
+)
+from moto.iam.policy_validation import IAMPolicyDocumentValidator
+from moto.utilities.utils import md5_hash
+
+from .aws_managed_policies import aws_managed_policies_data
+from .exceptions import (
+ IAMNotFoundException,
+ IAMConflictException,
+ IAMReportNotPresentException,
+ IAMLimitExceededException,
+ MalformedCertificate,
+ DuplicateTags,
+ TagKeyTooBig,
+ InvalidTagCharacters,
+ TooManyTags,
+ TagValueTooBig,
+ EntityAlreadyExists,
+ ValidationError,
+ InvalidInput,
+ NoSuchEntity,
+)
+from .utils import (
+ random_access_key,
+ random_alphanumeric,
+ random_resource_id,
+ random_policy_id,
+)
+from ..utilities.tagging_service import TaggingService
+
+
+# Map to convert service names used in ServiceLinkedRoles
+# The PascalCase should be used as part of the RoleName
+SERVICE_NAME_CONVERSION = {
+ "autoscaling": "AutoScaling",
+ "application-autoscaling": "ApplicationAutoScaling",
+ "elasticbeanstalk": "ElasticBeanstalk",
+}
+
+
+class MFADevice(object):
+ """MFA Device class."""
+
+ def __init__(self, serial_number, authentication_code_1, authentication_code_2):
+ self.enable_date = datetime.utcnow()
+ self.serial_number = serial_number
+ self.authentication_code_1 = authentication_code_1
+ self.authentication_code_2 = authentication_code_2
+
+ @property
+ def enabled_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.enable_date)
+
+
+class VirtualMfaDevice(object):
+ def __init__(self, device_name):
+ self.serial_number = "arn:aws:iam::{0}:mfa{1}".format(
+ get_account_id(), device_name
+ )
+
+ random_base32_string = "".join(
+ random.choice(string.ascii_uppercase + "234567") for _ in range(64)
+ )
+ self.base32_string_seed = base64.b64encode(
+ random_base32_string.encode("ascii")
+ ).decode("ascii")
+ self.qr_code_png = base64.b64encode(
+ os.urandom(64)
+ ) # this would be a generated PNG
+
+ self.enable_date = None
+ self.user_attribute = None
+ self.user = None
+
+ @property
+ def enabled_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.enable_date)
+
+
+class Policy(CloudFormationModel):
+
+ # Note: This class does not implement the CloudFormation support for AWS::IAM::Policy, as that CF resource
+ # is for creating *inline* policies. That is done in class InlinePolicy.
+
+ is_attachable = False
+
+ def __init__(
+ self,
+ name,
+ default_version_id=None,
+ description=None,
+ document=None,
+ path=None,
+ create_date=None,
+ update_date=None,
+ tags=None,
+ ):
+ self.name = name
+
+ self.attachment_count = 0
+ self.description = description or ""
+ self.id = random_policy_id()
+ self.path = path or "/"
+ self.tags = tags
+
+ if default_version_id:
+ self.default_version_id = default_version_id
+ self.next_version_num = int(default_version_id.lstrip("v")) + 1
+ else:
+ self.default_version_id = "v1"
+ self.next_version_num = 2
+ self.versions = [
+ PolicyVersion(
+ self.arn, document, True, self.default_version_id, update_date
+ )
+ ]
+
+ self.create_date = create_date if create_date is not None else datetime.utcnow()
+ self.update_date = update_date if update_date is not None else datetime.utcnow()
+
+ def update_default_version(self, new_default_version_id):
+ for version in self.versions:
+ if version.version_id == new_default_version_id:
+ version.is_default = True
+ if version.version_id == self.default_version_id:
+ version.is_default = False
+ self.default_version_id = new_default_version_id
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+ @property
+ def updated_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.update_date)
+
+ def get_tags(self):
+ return [self.tags[tag] for tag in self.tags]
+
+
+class SAMLProvider(BaseModel):
+ def __init__(self, name, saml_metadata_document=None):
+ self.name = name
+ self.saml_metadata_document = saml_metadata_document
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:saml-provider/{1}".format(get_account_id(), self.name)
+
+
+class OpenIDConnectProvider(BaseModel):
+ def __init__(self, url, thumbprint_list, client_id_list=None, tags=None):
+ self._errors = []
+ self._validate(url, thumbprint_list, client_id_list)
+
+ parsed_url = parse.urlparse(url)
+ self.url = parsed_url.netloc + parsed_url.path
+ self.thumbprint_list = thumbprint_list
+ self.client_id_list = client_id_list
+ self.create_date = datetime.utcnow()
+ self.tags = tags
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:oidc-provider/{1}".format(get_account_id(), self.url)
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.create_date)
+
+ def _validate(self, url, thumbprint_list, client_id_list):
+ if any(len(client_id) > 255 for client_id in client_id_list):
+ self._errors.append(
+ self._format_error(
+ key="clientIDList",
+ value=client_id_list,
+ constraint="Member must satisfy constraint: "
+ "[Member must have length less than or equal to 255, "
+ "Member must have length greater than or equal to 1]",
+ )
+ )
+
+ if any(len(thumbprint) > 40 for thumbprint in thumbprint_list):
+ self._errors.append(
+ self._format_error(
+ key="thumbprintList",
+ value=thumbprint_list,
+ constraint="Member must satisfy constraint: "
+ "[Member must have length less than or equal to 40, "
+ "Member must have length greater than or equal to 40]",
+ )
+ )
+
+ if len(url) > 255:
+ self._errors.append(
+ self._format_error(
+ key="url",
+ value=url,
+ constraint="Member must have length less than or equal to 255",
+ )
+ )
+
+ self._raise_errors()
+
+ parsed_url = parse.urlparse(url)
+ if not parsed_url.scheme or not parsed_url.netloc:
+ raise ValidationError("Invalid Open ID Connect Provider URL")
+
+ if len(thumbprint_list) > 5:
+ raise InvalidInput("Thumbprint list must contain fewer than 5 entries.")
+
+ if len(client_id_list) > 100:
+ raise IAMLimitExceededException(
+ "Cannot exceed quota for ClientIdsPerOpenIdConnectProvider: 100"
+ )
+
+ def _format_error(self, key, value, constraint):
+ return 'Value "{value}" at "{key}" failed to satisfy constraint: {constraint}'.format(
+ constraint=constraint, key=key, value=value
+ )
+
+ def _raise_errors(self):
+ if self._errors:
+ count = len(self._errors)
+ plural = "s" if len(self._errors) > 1 else ""
+ errors = "; ".join(self._errors)
+ self._errors = [] # reset collected errors
+
+ raise ValidationError(
+ "{count} validation error{plural} detected: {errors}".format(
+ count=count, plural=plural, errors=errors
+ )
+ )
+
+ def get_tags(self):
+ return [self.tags[tag] for tag in self.tags]
+
+
+class PolicyVersion(object):
+ def __init__(
+ self, policy_arn, document, is_default=False, version_id="v1", create_date=None
+ ):
+ self.policy_arn = policy_arn
+ self.document = document or {}
+ self.is_default = is_default
+ self.version_id = version_id
+
+ self.create_date = create_date if create_date is not None else datetime.utcnow()
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+
+class ManagedPolicy(Policy, CloudFormationModel):
+ """Managed policy."""
+
+ is_attachable = True
+
+ def attach_to(self, obj):
+ self.attachment_count += 1
+ obj.managed_policies[self.arn] = self
+
+ def detach_from(self, obj):
+ self.attachment_count -= 1
+ del obj.managed_policies[self.arn]
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:policy{1}{2}".format(
+ get_account_id(), self.path, self.name
+ )
+
+ def to_config_dict(self):
+ return {
+ "version": "1.3",
+ "configurationItemCaptureTime": str(self.create_date),
+ "configurationItemStatus": "OK",
+ "configurationStateId": str(
+ int(time.mktime(self.create_date.timetuple()))
+ ), # PY2 and 3 compatible
+ "arn": "arn:aws:iam::{}:policy/{}".format(get_account_id(), self.name),
+ "resourceType": "AWS::IAM::Policy",
+ "resourceId": self.id,
+ "resourceName": self.name,
+ "awsRegion": "global",
+ "availabilityZone": "Not Applicable",
+ "resourceCreationTime": str(self.create_date),
+ "tags": self.tags,
+ "configuration": {
+ "policyName": self.name,
+ "policyId": self.id,
+ "arn": "arn:aws:iam::{}:policy/{}".format(get_account_id(), self.name),
+ "path": self.path,
+ "defaultVersionId": self.default_version_id,
+ "attachmentCount": self.attachment_count,
+ "permissionsBoundaryUsageCount": 0,
+ "isAttachable": ManagedPolicy.is_attachable,
+ "description": self.description,
+ "createDate": str(self.create_date.isoformat()),
+ "updateDate": str(self.create_date.isoformat()),
+ "tags": list(
+ map(
+ lambda key: {"key": key, "value": self.tags[key]["Value"]},
+ self.tags,
+ )
+ ),
+ "policyVersionList": list(
+ map(
+ lambda version: {
+ "document": parse.quote(version.document),
+ "versionId": version.version_id,
+ "isDefaultVersion": version.is_default,
+ "createDate": str(version.create_date),
+ },
+ self.versions,
+ )
+ ),
+ },
+ "supplementaryConfiguration": {},
+ }
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None # Resource never gets named after by template PolicyName!
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::IAM::ManagedPolicy"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ policy_document = json.dumps(properties.get("PolicyDocument"))
+ name = properties.get("ManagedPolicyName", resource_name)
+ description = properties.get("Description")
+ path = properties.get("Path")
+ group_names = properties.get("Groups", [])
+ user_names = properties.get("Users", [])
+ role_names = properties.get("Roles", [])
+ tags = properties.get("Tags", {})
+
+ policy = iam_backend.create_policy(
+ description=description,
+ path=path,
+ policy_document=policy_document,
+ policy_name=name,
+ tags=tags,
+ )
+ for group_name in group_names:
+ iam_backend.attach_group_policy(
+ group_name=group_name, policy_arn=policy.arn
+ )
+ for user_name in user_names:
+ iam_backend.attach_user_policy(user_name=user_name, policy_arn=policy.arn)
+ for role_name in role_names:
+ iam_backend.attach_role_policy(role_name=role_name, policy_arn=policy.arn)
+ return policy
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+
+class AWSManagedPolicy(ManagedPolicy):
+ """AWS-managed policy."""
+
+ @classmethod
+ def from_data(cls, name, data):
+ return cls(
+ name,
+ default_version_id=data.get("DefaultVersionId"),
+ path=data.get("Path"),
+ document=json.dumps(data.get("Document")),
+ create_date=datetime.strptime(
+ data.get("CreateDate"), "%Y-%m-%dT%H:%M:%S+00:00"
+ ),
+ update_date=datetime.strptime(
+ data.get("UpdateDate"), "%Y-%m-%dT%H:%M:%S+00:00"
+ ),
+ )
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::aws:policy{0}{1}".format(self.path, self.name)
+
+
+# AWS defines some of its own managed policies and we periodically
+# import them via `make aws_managed_policies`
+# FIXME: Takes about 40ms at import time
+aws_managed_policies_data_parsed = json.loads(aws_managed_policies_data)
+aws_managed_policies = [
+ AWSManagedPolicy.from_data(name, d)
+ for name, d in aws_managed_policies_data_parsed.items()
+]
+
+
+class InlinePolicy(CloudFormationModel):
+ # Represents an Inline Policy created by CloudFormation
+ def __init__(
+ self,
+ resource_name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ ):
+ self.name = resource_name
+ self.policy_name = None
+ self.policy_document = None
+ self.group_names = None
+ self.role_names = None
+ self.user_names = None
+ self.update(policy_name, policy_document, group_names, role_names, user_names)
+
+ def update(self, policy_name, policy_document, group_names, role_names, user_names):
+ self.policy_name = policy_name
+ self.policy_document = (
+ json.dumps(policy_document)
+ if isinstance(policy_document, dict)
+ else policy_document
+ )
+ self.group_names = group_names
+ self.role_names = role_names
+ self.user_names = user_names
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None # Resource never gets named after by template PolicyName!
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::IAM::Policy"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ policy_document = properties.get("PolicyDocument")
+ policy_name = properties.get("PolicyName")
+ user_names = properties.get("Users")
+ role_names = properties.get("Roles")
+ group_names = properties.get("Groups")
+
+ return iam_backend.create_inline_policy(
+ resource_name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ if cls.is_replacement_update(properties):
+ resource_name_property = cls.cloudformation_name_type()
+ if resource_name_property not in properties:
+ properties[resource_name_property] = new_resource_name
+ new_resource = cls.create_from_cloudformation_json(
+ properties[resource_name_property], cloudformation_json, region_name
+ )
+ properties[resource_name_property] = original_resource.name
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else: # No Interruption
+ properties = cloudformation_json.get("Properties", {})
+ policy_document = properties.get("PolicyDocument")
+ policy_name = properties.get("PolicyName", original_resource.name)
+ user_names = properties.get("Users")
+ role_names = properties.get("Roles")
+ group_names = properties.get("Groups")
+
+ return iam_backend.update_inline_policy(
+ original_resource.name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ iam_backend.delete_inline_policy(resource_name)
+
+ @staticmethod
+ def is_replacement_update(properties):
+ properties_requiring_replacement_update = []
+ return any(
+ [
+ property_requiring_replacement in properties
+ for property_requiring_replacement in properties_requiring_replacement_update
+ ]
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ def apply_policy(self, backend):
+ if self.user_names:
+ for user_name in self.user_names:
+ backend.put_user_policy(
+ user_name, self.policy_name, self.policy_document
+ )
+ if self.role_names:
+ for role_name in self.role_names:
+ backend.put_role_policy(
+ role_name, self.policy_name, self.policy_document
+ )
+ if self.group_names:
+ for group_name in self.group_names:
+ backend.put_group_policy(
+ group_name, self.policy_name, self.policy_document
+ )
+
+ def unapply_policy(self, backend):
+ if self.user_names:
+ for user_name in self.user_names:
+ backend.delete_user_policy(user_name, self.policy_name)
+ if self.role_names:
+ for role_name in self.role_names:
+ backend.delete_role_policy(role_name, self.policy_name)
+ if self.group_names:
+ for group_name in self.group_names:
+ backend.delete_group_policy(group_name, self.policy_name)
+
+
+class Role(CloudFormationModel):
+ def __init__(
+ self,
+ role_id,
+ name,
+ assume_role_policy_document,
+ path,
+ permissions_boundary,
+ description,
+ tags,
+ max_session_duration,
+ linked_service=None,
+ ):
+ self.id = role_id
+ self.name = name
+ self.assume_role_policy_document = assume_role_policy_document
+ self.path = path or "/"
+ self.policies = {}
+ self.managed_policies = {}
+ self.create_date = datetime.utcnow()
+ self.tags = tags
+ self.description = description
+ self.permissions_boundary = permissions_boundary
+ self.max_session_duration = max_session_duration
+ self._linked_service = linked_service
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "RoleName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html
+ return "AWS::IAM::Role"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ role_name = properties.get("RoleName", resource_name)
+
+ role = iam_backend.create_role(
+ role_name=role_name,
+ assume_role_policy_document=properties["AssumeRolePolicyDocument"],
+ path=properties.get("Path", "/"),
+ permissions_boundary=properties.get("PermissionsBoundary", ""),
+ description=properties.get("Description", ""),
+ tags=properties.get("Tags", {}),
+ max_session_duration=properties.get("MaxSessionDuration", 3600),
+ )
+
+ policies = properties.get("Policies", [])
+ for policy in policies:
+ policy_name = policy["PolicyName"]
+ policy_json = policy["PolicyDocument"]
+ role.put_policy(policy_name, policy_json)
+
+ return role
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ for profile in iam_backend.instance_profiles.values():
+ profile.delete_role(role_name=resource_name)
+
+ for role in iam_backend.roles.values():
+ if role.name == resource_name:
+ for arn in role.policies.keys():
+ role.delete_policy(arn)
+ iam_backend.delete_role(resource_name)
+
+ @property
+ def arn(self):
+ if self._linked_service:
+ return f"arn:aws:iam::{get_account_id()}:role/aws-service-role/{self._linked_service}/{self.name}"
+ return "arn:aws:iam::{0}:role{1}{2}".format(
+ get_account_id(), self.path, self.name
+ )
+
+ def to_config_dict(self):
+ _managed_policies = []
+ for key in self.managed_policies.keys():
+ _managed_policies.append(
+ {"policyArn": key, "policyName": iam_backend.managed_policies[key].name}
+ )
+
+ _role_policy_list = []
+ for key, value in self.policies.items():
+ _role_policy_list.append(
+ {"policyName": key, "policyDocument": parse.quote(value)}
+ )
+
+ _instance_profiles = []
+ for key, instance_profile in iam_backend.instance_profiles.items():
+ for _ in instance_profile.roles:
+ _instance_profiles.append(instance_profile.to_embedded_config_dict())
+ break
+
+ config_dict = {
+ "version": "1.3",
+ "configurationItemCaptureTime": str(self.create_date),
+ "configurationItemStatus": "ResourceDiscovered",
+ "configurationStateId": str(
+ int(time.mktime(self.create_date.timetuple()))
+ ), # PY2 and 3 compatible
+ "arn": "arn:aws:iam::{}:role/{}".format(get_account_id(), self.name),
+ "resourceType": "AWS::IAM::Role",
+ "resourceId": self.name,
+ "resourceName": self.name,
+ "awsRegion": "global",
+ "availabilityZone": "Not Applicable",
+ "resourceCreationTime": str(self.create_date),
+ "relatedEvents": [],
+ "relationships": [],
+ "tags": self.tags,
+ "configuration": {
+ "path": self.path,
+ "roleName": self.name,
+ "roleId": self.id,
+ "arn": "arn:aws:iam::{}:role/{}".format(get_account_id(), self.name),
+ "assumeRolePolicyDocument": parse.quote(
+ self.assume_role_policy_document
+ )
+ if self.assume_role_policy_document
+ else None,
+ "instanceProfileList": _instance_profiles,
+ "rolePolicyList": _role_policy_list,
+ "createDate": self.create_date.isoformat(),
+ "attachedManagedPolicies": _managed_policies,
+ "permissionsBoundary": self.permissions_boundary,
+ "tags": list(
+ map(
+ lambda key: {"key": key, "value": self.tags[key]["Value"]},
+ self.tags,
+ )
+ ),
+ "roleLastUsed": None,
+ },
+ "supplementaryConfiguration": {},
+ }
+ return config_dict
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def delete_policy(self, policy_name):
+ try:
+ del self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "The role policy with name {0} cannot be found.".format(policy_name)
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+ def get_tags(self):
+ return [self.tags[tag] for tag in self.tags]
+
+ @property
+ def description_escaped(self):
+ import html
+
+ return html.escape(self.description or "")
+
+ def to_xml(self):
+ template = Template(
+ """<Role>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ {% if role.description is not none %}
+ <Description>{{ role.description_escaped }}</Description>
+ {% endif %}
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ {% if role.max_session_duration %}
+ <MaxSessionDuration>{{ role.max_session_duration }}</MaxSessionDuration>
+ {% endif %}
+ {% if role.permissions_boundary %}
+ <PermissionsBoundary>
+ <PermissionsBoundaryType>PermissionsBoundaryPolicy</PermissionsBoundaryType>
+ <PermissionsBoundaryArn>{{ role.permissions_boundary }}</PermissionsBoundaryArn>
+ </PermissionsBoundary>
+ {% endif %}
+ {% if role.tags %}
+ <Tags>
+ {% for tag in role.get_tags() %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ {% endif %}
+ </Role>"""
+ )
+ return template.render(role=self)
+
+
+class InstanceProfile(CloudFormationModel):
+ def __init__(self, instance_profile_id, name, path, roles, tags=None):
+ self.id = instance_profile_id
+ self.name = name
+ self.path = path or "/"
+ self.roles = roles if roles else []
+ self.create_date = datetime.utcnow()
+ self.tags = {tag["Key"]: tag["Value"] for tag in tags or []}
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "InstanceProfileName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html
+ return "AWS::IAM::InstanceProfile"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ role_names = properties["Roles"]
+ return iam_backend.create_instance_profile(
+ name=resource_name,
+ path=properties.get("Path", "/"),
+ role_names=role_names,
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ iam_backend.delete_instance_profile(resource_name)
+
+ def delete_role(self, role_name):
+ self.roles = [role for role in self.roles if role.name != role_name]
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:instance-profile{1}{2}".format(
+ get_account_id(), self.path, self.name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+ def to_embedded_config_dict(self):
+ # Instance Profiles aren't a config item itself, but they are returned in IAM roles with
+ # a "config like" json structure It's also different than Role.to_config_dict()
+ roles = []
+ for role in self.roles:
+ roles.append(
+ {
+ "path": role.path,
+ "roleName": role.name,
+ "roleId": role.id,
+ "arn": "arn:aws:iam::{}:role/{}".format(
+ get_account_id(), role.name
+ ),
+ "createDate": str(role.create_date),
+ "assumeRolePolicyDocument": parse.quote(
+ role.assume_role_policy_document
+ ),
+ "description": role.description,
+ "maxSessionDuration": None,
+ "permissionsBoundary": role.permissions_boundary,
+ "tags": list(
+ map(
+ lambda key: {"key": key, "value": role.tags[key]["Value"]},
+ role.tags,
+ )
+ ),
+ "roleLastUsed": None,
+ }
+ )
+
+ return {
+ "path": self.path,
+ "instanceProfileName": self.name,
+ "instanceProfileId": self.id,
+ "arn": "arn:aws:iam::{}:instance-profile/{}".format(
+ get_account_id(), self.name
+ ),
+ "createDate": str(self.create_date),
+ "roles": roles,
+ }
+
+
+class Certificate(BaseModel):
+ def __init__(self, cert_name, cert_body, private_key, cert_chain=None, path=None):
+ self.cert_name = cert_name
+ if cert_body:
+ cert_body = cert_body.rstrip()
+ self.cert_body = cert_body
+ self.private_key = private_key
+ self.path = path if path else "/"
+ self.cert_chain = cert_chain
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:server-certificate{1}{2}".format(
+ get_account_id(), self.path, self.cert_name
+ )
+
+
+class SigningCertificate(BaseModel):
+ def __init__(self, certificate_id, user_name, body):
+ self.id = certificate_id
+ self.user_name = user_name
+ self.body = body
+ self.upload_date = datetime.utcnow()
+ self.status = "Active"
+
+ @property
+ def uploaded_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.upload_date)
+
+
+class AccessKey(CloudFormationModel):
+ def __init__(self, user_name, status="Active"):
+ self.user_name = user_name
+ self.access_key_id = "AKIA" + random_access_key()
+ self.secret_access_key = random_alphanumeric(40)
+ self.status = status
+ self.create_date = datetime.utcnow()
+ self.last_used = None
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.create_date)
+
+ @property
+ def last_used_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.last_used)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["SecretAccessKey"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "SecretAccessKey":
+ return self.secret_access_key
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None # Resource never gets named after by template PolicyName!
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::IAM::AccessKey"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ user_name = properties.get("UserName")
+ status = properties.get("Status", "Active")
+
+ return iam_backend.create_access_key(user_name, status=status)
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ if cls.is_replacement_update(properties):
+ new_resource = cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+ cls.delete_from_cloudformation_json(
+ original_resource.physical_resource_id, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else: # No Interruption
+ properties = cloudformation_json.get("Properties", {})
+ status = properties.get("Status")
+ return iam_backend.update_access_key(
+ original_resource.user_name, original_resource.access_key_id, status
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ iam_backend.delete_access_key_by_name(resource_name)
+
+ @staticmethod
+ def is_replacement_update(properties):
+ properties_requiring_replacement_update = ["Serial", "UserName"]
+ return any(
+ [
+ property_requiring_replacement in properties
+ for property_requiring_replacement in properties_requiring_replacement_update
+ ]
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.access_key_id
+
+
+class SshPublicKey(BaseModel):
+ def __init__(self, user_name, ssh_public_key_body):
+ self.user_name = user_name
+ self.ssh_public_key_body = ssh_public_key_body
+ self.ssh_public_key_id = "APKA" + random_access_key()
+ self.fingerprint = md5_hash(ssh_public_key_body.encode()).hexdigest()
+ self.status = "Active"
+ self.upload_date = datetime.utcnow()
+
+ @property
+ def uploaded_iso_8601(self):
+ return iso_8601_datetime_without_milliseconds(self.upload_date)
+
+
+class Group(BaseModel):
+ def __init__(self, name, path="/"):
+ self.name = name
+ self.id = random_resource_id()
+ self.path = path
+ self.create_date = datetime.utcnow()
+
+ self.users = []
+ self.managed_policies = {}
+ self.policies = {}
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ raise NotImplementedError('"Fn::GetAtt" : [ "{0}" , "Arn" ]"')
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def arn(self):
+ if self.path == "/":
+ return "arn:aws:iam::{0}:group/{1}".format(get_account_id(), self.name)
+
+ else:
+ return "arn:aws:iam::{0}:group/{1}/{2}".format(
+ get_account_id(), self.path, self.name
+ )
+
+ def get_policy(self, policy_name):
+ try:
+ policy_json = self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_name))
+
+ return {
+ "policy_name": policy_name,
+ "policy_document": policy_json,
+ "group_name": self.name,
+ }
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def list_policies(self):
+ return self.policies.keys()
+
+ def delete_policy(self, policy_name):
+ if policy_name not in self.policies:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_name))
+
+ del self.policies[policy_name]
+
+
+class User(CloudFormationModel):
+ def __init__(self, name, path=None):
+ self.name = name
+ self.id = random_resource_id()
+ self.path = path if path else "/"
+ self.create_date = datetime.utcnow()
+ self.mfa_devices = {}
+ self.policies = {}
+ self.managed_policies = {}
+ self.access_keys = []
+ self.ssh_public_keys = []
+ self.password = None
+ self.password_last_used = None
+ self.password_reset_required = False
+ self.signing_certificates = {}
+
+ @property
+ def arn(self):
+ return "arn:aws:iam::{0}:user{1}{2}".format(
+ get_account_id(), self.path, self.name
+ )
+
+ @property
+ def created_iso_8601(self):
+ return iso_8601_datetime_with_milliseconds(self.create_date)
+
+ def get_policy(self, policy_name):
+ policy_json = None
+ try:
+ policy_json = self.policies[policy_name]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_name))
+
+ return {
+ "policy_name": policy_name,
+ "policy_document": policy_json,
+ "user_name": self.name,
+ }
+
+ def put_policy(self, policy_name, policy_json):
+ self.policies[policy_name] = policy_json
+
+ def deactivate_mfa_device(self, serial_number):
+ self.mfa_devices.pop(serial_number)
+
+ def delete_policy(self, policy_name):
+ if policy_name not in self.policies:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_name))
+
+ del self.policies[policy_name]
+
+ def create_access_key(self, status="Active"):
+ access_key = AccessKey(self.name, status)
+ self.access_keys.append(access_key)
+ return access_key
+
+ def enable_mfa_device(
+ self, serial_number, authentication_code_1, authentication_code_2
+ ):
+ self.mfa_devices[serial_number] = MFADevice(
+ serial_number, authentication_code_1, authentication_code_2
+ )
+
+ def get_all_access_keys(self):
+ return self.access_keys
+
+ def delete_access_key(self, access_key_id):
+ key = self.get_access_key_by_id(access_key_id)
+ self.access_keys.remove(key)
+
+ def update_access_key(self, access_key_id, status=None):
+ key = self.get_access_key_by_id(access_key_id)
+ if status is not None:
+ key.status = status
+ return key
+
+ def get_access_key_by_id(self, access_key_id):
+ for key in self.access_keys:
+ if key.access_key_id == access_key_id:
+ return key
+
+ raise IAMNotFoundException(
+ f"The Access Key with id {access_key_id} cannot be found"
+ )
+
+ def has_access_key(self, access_key_id):
+ return any(
+ [
+ access_key
+ for access_key in self.access_keys
+ if access_key.access_key_id == access_key_id
+ ]
+ )
+
+ def upload_ssh_public_key(self, ssh_public_key_body):
+ pubkey = SshPublicKey(self.name, ssh_public_key_body)
+ self.ssh_public_keys.append(pubkey)
+ return pubkey
+
+ def get_ssh_public_key(self, ssh_public_key_id):
+ for key in self.ssh_public_keys:
+ if key.ssh_public_key_id == ssh_public_key_id:
+ return key
+
+ raise IAMNotFoundException(
+ f"The SSH Public Key with id {ssh_public_key_id} cannot be found"
+ )
+
+ def get_all_ssh_public_keys(self):
+ return self.ssh_public_keys
+
+ def update_ssh_public_key(self, ssh_public_key_id, status):
+ key = self.get_ssh_public_key(ssh_public_key_id)
+ key.status = status
+
+ def delete_ssh_public_key(self, ssh_public_key_id):
+ key = self.get_ssh_public_key(ssh_public_key_id)
+ self.ssh_public_keys.remove(key)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+ def to_csv(self):
+ date_format = "%Y-%m-%dT%H:%M:%S+00:00"
+ date_created = self.create_date
+ # aagrawal,arn:aws:iam::509284790694:user/aagrawal,2014-09-01T22:28:48+00:00,true,2014-11-12T23:36:49+00:00,2014-09-03T18:59:00+00:00,N/A,false,true,2014-09-01T22:28:48+00:00,false,N/A,false,N/A,false,N/A
+ if not self.password:
+ password_enabled = "false"
+ password_last_used = "not_supported"
+ else:
+ password_enabled = "true"
+ password_last_used = "no_information"
+ if self.password_last_used:
+ password_last_used = self.password_last_used.strftime(date_format)
+
+ if len(self.access_keys) == 0:
+ access_key_1_active = "false"
+ access_key_1_last_rotated = "N/A"
+ access_key_1_last_used = "N/A"
+ access_key_2_active = "false"
+ access_key_2_last_rotated = "N/A"
+ access_key_2_last_used = "N/A"
+ elif len(self.access_keys) == 1:
+ access_key_1_active = (
+ "true" if self.access_keys[0].status == "Active" else "false"
+ )
+ access_key_1_last_rotated = self.access_keys[0].create_date.strftime(
+ date_format
+ )
+ access_key_1_last_used = (
+ "N/A"
+ if self.access_keys[0].last_used is None
+ else self.access_keys[0].last_used.strftime(date_format)
+ )
+ access_key_2_active = "false"
+ access_key_2_last_rotated = "N/A"
+ access_key_2_last_used = "N/A"
+ else:
+ access_key_1_active = (
+ "true" if self.access_keys[0].status == "Active" else "false"
+ )
+ access_key_1_last_rotated = self.access_keys[0].create_date.strftime(
+ date_format
+ )
+ access_key_1_last_used = (
+ "N/A"
+ if self.access_keys[0].last_used is None
+ else self.access_keys[0].last_used.strftime(date_format)
+ )
+ access_key_2_active = (
+ "true" if self.access_keys[1].status == "Active" else "false"
+ )
+ access_key_2_last_rotated = self.access_keys[1].create_date.strftime(
+ date_format
+ )
+ access_key_2_last_used = (
+ "N/A"
+ if self.access_keys[1].last_used is None
+ else self.access_keys[1].last_used.strftime(date_format)
+ )
+
+ return "{0},{1},{2},{3},{4},{5},not_supported,{6},{7},{8},{9},not_supported,not_supported,{10},{11},{12},not_supported,not_supported,false,N/A,false,N/A\n".format(
+ self.name,
+ self.arn,
+ date_created.strftime(date_format),
+ password_enabled,
+ password_last_used,
+ date_created.strftime(date_format),
+ "true" if len(self.mfa_devices) else "false",
+ access_key_1_active,
+ access_key_1_last_rotated,
+ access_key_1_last_used,
+ access_key_2_active,
+ access_key_2_last_rotated,
+ access_key_2_last_used,
+ )
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "UserName"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::IAM::User"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ path = properties.get("Path")
+ user, _ = iam_backend.create_user(resource_name, path)
+ return user
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ if cls.is_replacement_update(properties):
+ resource_name_property = cls.cloudformation_name_type()
+ if resource_name_property not in properties:
+ properties[resource_name_property] = new_resource_name
+ new_resource = cls.create_from_cloudformation_json(
+ properties[resource_name_property], cloudformation_json, region_name
+ )
+ properties[resource_name_property] = original_resource.name
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else: # No Interruption
+ if "Path" in properties:
+ original_resource.path = properties["Path"]
+ return original_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ iam_backend.delete_user(resource_name)
+
+ @staticmethod
+ def is_replacement_update(properties):
+ properties_requiring_replacement_update = ["UserName"]
+ return any(
+ [
+ property_requiring_replacement in properties
+ for property_requiring_replacement in properties_requiring_replacement_update
+ ]
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+
+class AccountPasswordPolicy(BaseModel):
+ def __init__(
+ self,
+ allow_change_password,
+ hard_expiry,
+ max_password_age,
+ minimum_password_length,
+ password_reuse_prevention,
+ require_lowercase_characters,
+ require_numbers,
+ require_symbols,
+ require_uppercase_characters,
+ ):
+ self._errors = []
+ self._validate(
+ max_password_age, minimum_password_length, password_reuse_prevention
+ )
+
+ self.allow_users_to_change_password = allow_change_password
+ self.hard_expiry = hard_expiry
+ self.max_password_age = max_password_age
+ self.minimum_password_length = minimum_password_length
+ self.password_reuse_prevention = password_reuse_prevention
+ self.require_lowercase_characters = require_lowercase_characters
+ self.require_numbers = require_numbers
+ self.require_symbols = require_symbols
+ self.require_uppercase_characters = require_uppercase_characters
+
+ @property
+ def expire_passwords(self):
+ return True if self.max_password_age and self.max_password_age > 0 else False
+
+ def _validate(
+ self, max_password_age, minimum_password_length, password_reuse_prevention
+ ):
+ if minimum_password_length > 128:
+ self._errors.append(
+ self._format_error(
+ key="minimumPasswordLength",
+ value=minimum_password_length,
+ constraint="Member must have value less than or equal to 128",
+ )
+ )
+
+ if password_reuse_prevention and password_reuse_prevention > 24:
+ self._errors.append(
+ self._format_error(
+ key="passwordReusePrevention",
+ value=password_reuse_prevention,
+ constraint="Member must have value less than or equal to 24",
+ )
+ )
+
+ if max_password_age and max_password_age > 1095:
+ self._errors.append(
+ self._format_error(
+ key="maxPasswordAge",
+ value=max_password_age,
+ constraint="Member must have value less than or equal to 1095",
+ )
+ )
+
+ self._raise_errors()
+
+ def _format_error(self, key, value, constraint):
+ return 'Value "{value}" at "{key}" failed to satisfy constraint: {constraint}'.format(
+ constraint=constraint, key=key, value=value
+ )
+
+ def _raise_errors(self):
+ if self._errors:
+ count = len(self._errors)
+ plural = "s" if len(self._errors) > 1 else ""
+ errors = "; ".join(self._errors)
+ self._errors = [] # reset collected errors
+
+ raise ValidationError(
+ "{count} validation error{plural} detected: {errors}".format(
+ count=count, plural=plural, errors=errors
+ )
+ )
+
+
+class AccountSummary(BaseModel):
+ def __init__(self, iam_backend):
+ self._iam_backend = iam_backend
+
+ self._group_policy_size_quota = 5120
+ self._instance_profiles_quota = 1000
+ self._groups_per_user_quota = 10
+ self._attached_policies_per_user_quota = 10
+ self._policies_quota = 1500
+ self._account_mfa_enabled = 0 # Haven't found any information being able to activate MFA for the root account programmatically
+ self._access_keys_per_user_quota = 2
+ self._assume_role_policy_size_quota = 2048
+ self._policy_versions_in_use_quota = 10000
+ self._global_endpoint_token_version = (
+ 1 # ToDo: Implement set_security_token_service_preferences()
+ )
+ self._versions_per_policy_quota = 5
+ self._attached_policies_per_group_quota = 10
+ self._policy_size_quota = 6144
+ self._account_signing_certificates_present = 0 # valid values: 0 | 1
+ self._users_quota = 5000
+ self._server_certificates_quota = 20
+ self._user_policy_size_quota = 2048
+ self._roles_quota = 1000
+ self._signing_certificates_per_user_quota = 2
+ self._role_policy_size_quota = 10240
+ self._attached_policies_per_role_quota = 10
+ self._account_access_keys_present = 0 # valid values: 0 | 1
+ self._groups_quota = 300
+
+ @property
+ def summary_map(self):
+ return {
+ "GroupPolicySizeQuota": self._group_policy_size_quota,
+ "InstanceProfilesQuota": self._instance_profiles_quota,
+ "Policies": self._policies,
+ "GroupsPerUserQuota": self._groups_per_user_quota,
+ "InstanceProfiles": self._instance_profiles,
+ "AttachedPoliciesPerUserQuota": self._attached_policies_per_user_quota,
+ "Users": self._users,
+ "PoliciesQuota": self._policies_quota,
+ "Providers": self._providers,
+ "AccountMFAEnabled": self._account_mfa_enabled,
+ "AccessKeysPerUserQuota": self._access_keys_per_user_quota,
+ "AssumeRolePolicySizeQuota": self._assume_role_policy_size_quota,
+ "PolicyVersionsInUseQuota": self._policy_versions_in_use_quota,
+ "GlobalEndpointTokenVersion": self._global_endpoint_token_version,
+ "VersionsPerPolicyQuota": self._versions_per_policy_quota,
+ "AttachedPoliciesPerGroupQuota": self._attached_policies_per_group_quota,
+ "PolicySizeQuota": self._policy_size_quota,
+ "Groups": self._groups,
+ "AccountSigningCertificatesPresent": self._account_signing_certificates_present,
+ "UsersQuota": self._users_quota,
+ "ServerCertificatesQuota": self._server_certificates_quota,
+ "MFADevices": self._mfa_devices,
+ "UserPolicySizeQuota": self._user_policy_size_quota,
+ "PolicyVersionsInUse": self._policy_versions_in_use,
+ "ServerCertificates": self._server_certificates,
+ "Roles": self._roles,
+ "RolesQuota": self._roles_quota,
+ "SigningCertificatesPerUserQuota": self._signing_certificates_per_user_quota,
+ "MFADevicesInUse": self._mfa_devices_in_use,
+ "RolePolicySizeQuota": self._role_policy_size_quota,
+ "AttachedPoliciesPerRoleQuota": self._attached_policies_per_role_quota,
+ "AccountAccessKeysPresent": self._account_access_keys_present,
+ "GroupsQuota": self._groups_quota,
+ }
+
+ @property
+ def _groups(self):
+ return len(self._iam_backend.groups)
+
+ @property
+ def _instance_profiles(self):
+ return len(self._iam_backend.instance_profiles)
+
+ @property
+ def _mfa_devices(self):
+ # Don't know, if hardware devices are also counted here
+ return len(self._iam_backend.virtual_mfa_devices)
+
+ @property
+ def _mfa_devices_in_use(self):
+ devices = 0
+
+ for user in self._iam_backend.users.values():
+ devices += len(user.mfa_devices)
+
+ return devices
+
+ @property
+ def _policies(self):
+ customer_policies = [
+ policy
+ for policy in self._iam_backend.managed_policies
+ if not policy.startswith("arn:aws:iam::aws:policy")
+ ]
+ return len(customer_policies)
+
+ @property
+ def _policy_versions_in_use(self):
+ attachments = 0
+
+ for policy in self._iam_backend.managed_policies.values():
+ attachments += policy.attachment_count
+
+ return attachments
+
+ @property
+ def _providers(self):
+ providers = len(self._iam_backend.saml_providers) + len(
+ self._iam_backend.open_id_providers
+ )
+ return providers
+
+ @property
+ def _roles(self):
+ return len(self._iam_backend.roles)
+
+ @property
+ def _server_certificates(self):
+ return len(self._iam_backend.certificates)
+
+ @property
+ def _users(self):
+ return len(self._iam_backend.users)
+
+
+def filter_items_with_path_prefix(path_prefix, items):
+ return [role for role in items if role.path.startswith(path_prefix)]
+
+
+class IAMBackend(BaseBackend):
+ def __init__(self, region_name, account_id=None):
+ self.instance_profiles = {}
+ self.roles = {}
+ self.certificates = {}
+ self.groups = {}
+ self.users = {}
+ self.credential_report = None
+ self.managed_policies = self._init_managed_policies()
+ self.account_aliases = []
+ self.saml_providers = {}
+ self.open_id_providers = {}
+ self.policy_arn_regex = re.compile(r"^arn:aws:iam::(aws|[0-9]*):policy/.*$")
+ self.virtual_mfa_devices = {}
+ self.account_password_policy = None
+ self.account_summary = AccountSummary(self)
+ self.inline_policies = {}
+ self.access_keys = {}
+
+ self.tagger = TaggingService()
+ super().__init__(region_name=region_name, account_id=account_id)
+
+ def _init_managed_policies(self):
+ return dict((p.arn, p) for p in aws_managed_policies)
+
+ def attach_role_policy(self, policy_arn, role_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ policy = arns[policy_arn]
+ policy.attach_to(self.get_role(role_name))
+
+ def update_role_description(self, role_name, role_description):
+ role = self.get_role(role_name)
+ role.description = role_description
+ return role
+
+ def update_role(self, role_name, role_description, max_session_duration):
+ role = self.get_role(role_name)
+ role.description = role_description
+ role.max_session_duration = max_session_duration
+ return role
+
+ def put_role_permissions_boundary(self, role_name, permissions_boundary):
+ if permissions_boundary and not self.policy_arn_regex.match(
+ permissions_boundary
+ ):
+ raise RESTError(
+ "InvalidParameterValue",
+ "Value ({}) for parameter PermissionsBoundary is invalid.".format(
+ permissions_boundary
+ ),
+ )
+ role = self.get_role(role_name)
+ role.permissions_boundary = permissions_boundary
+
+ def delete_role_permissions_boundary(self, role_name):
+ role = self.get_role(role_name)
+ role.permissions_boundary = None
+
+ def detach_role_policy(self, policy_arn, role_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ policy.detach_from(self.get_role(role_name))
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+
+ def attach_group_policy(self, policy_arn, group_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ if policy.arn in self.get_group(group_name).managed_policies.keys():
+ return
+ policy.attach_to(self.get_group(group_name))
+
+ def detach_group_policy(self, policy_arn, group_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.detach_from(self.get_group(group_name))
+
+ def attach_user_policy(self, policy_arn, user_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.attach_to(self.get_user(user_name))
+
+ def detach_user_policy(self, policy_arn, user_name):
+ arns = dict((p.arn, p) for p in self.managed_policies.values())
+ try:
+ policy = arns[policy_arn]
+ except KeyError:
+ raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
+ policy.detach_from(self.get_user(user_name))
+
+ def create_policy(self, description, path, policy_document, policy_name, tags):
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_document)
+ iam_policy_document_validator.validate()
+
+ clean_tags = self._tag_verification(tags)
+ policy = ManagedPolicy(
+ policy_name,
+ description=description,
+ document=policy_document,
+ path=path,
+ tags=clean_tags,
+ )
+ if policy.arn in self.managed_policies:
+ raise EntityAlreadyExists(
+ "A policy called {0} already exists. Duplicate names are not allowed.".format(
+ policy_name
+ )
+ )
+ self.managed_policies[policy.arn] = policy
+ return policy
+
+ def get_policy(self, policy_arn):
+ if policy_arn not in self.managed_policies:
+ raise IAMNotFoundException("Policy {0} not found".format(policy_arn))
+ return self.managed_policies.get(policy_arn)
+
+ def list_attached_role_policies(
+ self, role_name, marker=None, max_items=100, path_prefix="/"
+ ):
+ policies = self.get_role(role_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_attached_group_policies(
+ self, group_name, marker=None, max_items=100, path_prefix="/"
+ ):
+ policies = self.get_group(group_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_attached_user_policies(
+ self, user_name, marker=None, max_items=100, path_prefix="/"
+ ):
+ policies = self.get_user(user_name).managed_policies.values()
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def list_policies(self, marker, max_items, only_attached, path_prefix, scope):
+ policies = self.managed_policies.values()
+
+ if only_attached:
+ policies = [p for p in policies if p.attachment_count > 0]
+
+ if scope == "AWS":
+ policies = [p for p in policies if isinstance(p, AWSManagedPolicy)]
+ elif scope == "Local":
+ policies = [p for p in policies if not isinstance(p, AWSManagedPolicy)]
+
+ return self._filter_attached_policies(policies, marker, max_items, path_prefix)
+
+ def set_default_policy_version(self, policy_arn, version_id):
+ if re.match(r"v[1-9][0-9]*(\.[A-Za-z0-9-]*)?", version_id) is None:
+ raise ValidationError(
+ "Value '{0}' at 'versionId' failed to satisfy constraint: Member must satisfy regular expression pattern: v[1-9][0-9]*(\\.[A-Za-z0-9-]*)?".format(
+ version_id
+ )
+ )
+
+ policy = self.get_policy(policy_arn)
+
+ for version in policy.versions:
+ if version.version_id == version_id:
+ policy.update_default_version(version_id)
+ return True
+
+ raise NoSuchEntity(
+ "Policy {0} version {1} does not exist or is not attachable.".format(
+ policy_arn, version_id
+ )
+ )
+
+ def _filter_attached_policies(self, policies, marker, max_items, path_prefix):
+ if path_prefix:
+ policies = [p for p in policies if p.path.startswith(path_prefix)]
+
+ policies = sorted(policies, key=lambda policy: policy.name)
+ start_idx = int(marker) if marker else 0
+
+ policies = policies[start_idx : start_idx + max_items]
+
+ if len(policies) < max_items:
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ return policies, marker
+
+ def create_role(
+ self,
+ role_name,
+ assume_role_policy_document,
+ path,
+ permissions_boundary,
+ description,
+ tags,
+ max_session_duration,
+ linked_service=None,
+ ):
+ role_id = random_resource_id()
+ if permissions_boundary and not self.policy_arn_regex.match(
+ permissions_boundary
+ ):
+ raise RESTError(
+ "InvalidParameterValue",
+ "Value ({}) for parameter PermissionsBoundary is invalid.".format(
+ permissions_boundary
+ ),
+ )
+ if [role for role in self.get_roles() if role.name == role_name]:
+ raise EntityAlreadyExists(
+ "Role with name {0} already exists.".format(role_name)
+ )
+
+ clean_tags = self._tag_verification(tags)
+ role = Role(
+ role_id,
+ role_name,
+ assume_role_policy_document,
+ path,
+ permissions_boundary,
+ description,
+ clean_tags,
+ max_session_duration,
+ linked_service=linked_service,
+ )
+ self.roles[role_id] = role
+ return role
+
+ def get_role_by_id(self, role_id):
+ return self.roles.get(role_id)
+
+ def get_role(self, role_name):
+ for role in self.get_roles():
+ if role.name == role_name:
+ return role
+ raise IAMNotFoundException("Role {0} not found".format(role_name))
+
+ def get_role_by_arn(self, arn):
+ for role in self.get_roles():
+ if role.arn == arn:
+ return role
+ raise IAMNotFoundException("Role {0} not found".format(arn))
+
+ def delete_role(self, role_name):
+ role = self.get_role(role_name)
+ for instance_profile in self.get_instance_profiles():
+ for profile_role in instance_profile.roles:
+ if profile_role.name == role_name:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must remove roles from instance profile first.",
+ )
+ if role.managed_policies:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must detach all policies first.",
+ )
+ if role.policies:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must delete policies first.",
+ )
+ del self.roles[role.id]
+
+ def get_roles(self):
+ return self.roles.values()
+
+ def put_role_policy(self, role_name, policy_name, policy_json):
+ role = self.get_role(role_name)
+
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_json)
+ iam_policy_document_validator.validate()
+ role.put_policy(policy_name, policy_json)
+
+ def delete_role_policy(self, role_name, policy_name):
+ role = self.get_role(role_name)
+ role.delete_policy(policy_name)
+
+ def get_role_policy(self, role_name, policy_name):
+ role = self.get_role(role_name)
+ for p, d in role.policies.items():
+ if p == policy_name:
+ return p, d
+ raise IAMNotFoundException(
+ "Policy Document {0} not attached to role {1}".format(
+ policy_name, role_name
+ )
+ )
+
+ def list_role_policies(self, role_name):
+ role = self.get_role(role_name)
+ return role.policies.keys()
+
+ def _tag_verification(self, tags):
+ if len(tags) > 50:
+ raise TooManyTags(tags)
+
+ tag_keys = {}
+ for tag in tags:
+ # Need to index by the lowercase tag key since the keys are case insensitive, but their case is retained.
+ ref_key = tag["Key"].lower()
+ self._check_tag_duplicate(tag_keys, ref_key)
+ self._validate_tag_key(tag["Key"])
+ if len(tag["Value"]) > 256:
+ raise TagValueTooBig(tag["Value"])
+
+ tag_keys[ref_key] = tag
+
+ return tag_keys
+
+ def _validate_tag_key(self, tag_key, exception_param="tags.X.member.key"):
+ """Validates the tag key.
+
+ :param tag_key: The tag key to check against.
+ :param exception_param: The exception parameter to send over to help format the message. This is to reflect
+ the difference between the tag and untag APIs.
+ :return:
+ """
+ # Validate that the key length is correct:
+ if len(tag_key) > 128:
+ raise TagKeyTooBig(tag_key, param=exception_param)
+
+ # Validate that the tag key fits the proper Regex:
+ # [\w\s_.:/=+\-@]+ SHOULD be the same as the Java regex on the AWS documentation: [\p{L}\p{Z}\p{N}_.:/=+\-@]+
+ match = re.findall(r"[\w\s_.:/=+\-@]+", tag_key)
+ # Kudos if you can come up with a better way of doing a global search :)
+ if not len(match) or len(match[0]) < len(tag_key):
+ raise InvalidTagCharacters(tag_key, param=exception_param)
+
+ def _check_tag_duplicate(self, all_tags, tag_key):
+ """Validates that a tag key is not a duplicate
+
+ :param all_tags: Dict to check if there is a duplicate tag.
+ :param tag_key: The tag key to check against.
+ :return:
+ """
+ if tag_key in all_tags:
+ raise DuplicateTags()
+
+ def list_role_tags(self, role_name, marker, max_items=100):
+ role = self.get_role(role_name)
+
+ max_items = int(max_items)
+ tag_index = sorted(role.tags)
+ start_idx = int(marker) if marker else 0
+
+ tag_index = tag_index[start_idx : start_idx + max_items]
+
+ if len(role.tags) <= (start_idx + max_items):
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ # Make the tag list of dict's:
+ tags = [role.tags[tag] for tag in tag_index]
+
+ return tags, marker
+
+ def tag_role(self, role_name, tags):
+ clean_tags = self._tag_verification(tags)
+ role = self.get_role(role_name)
+ role.tags.update(clean_tags)
+
+ def untag_role(self, role_name, tag_keys):
+ if len(tag_keys) > 50:
+ raise TooManyTags(tag_keys, param="tagKeys")
+
+ role = self.get_role(role_name)
+
+ for key in tag_keys:
+ ref_key = key.lower()
+ self._validate_tag_key(key, exception_param="tagKeys")
+
+ role.tags.pop(ref_key, None)
+
+ def list_policy_tags(self, policy_arn, marker, max_items=100):
+ policy = self.get_policy(policy_arn)
+
+ max_items = int(max_items)
+ tag_index = sorted(policy.tags)
+ start_idx = int(marker) if marker else 0
+
+ tag_index = tag_index[start_idx : start_idx + max_items]
+
+ if len(policy.tags) <= (start_idx + max_items):
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ # Make the tag list of dict's:
+ tags = [policy.tags[tag] for tag in tag_index]
+
+ return tags, marker
+
+ def tag_policy(self, policy_arn, tags):
+ clean_tags = self._tag_verification(tags)
+ policy = self.get_policy(policy_arn)
+ policy.tags.update(clean_tags)
+
+ def untag_policy(self, policy_arn, tag_keys):
+ if len(tag_keys) > 50:
+ raise TooManyTags(tag_keys, param="tagKeys")
+
+ policy = self.get_policy(policy_arn)
+
+ for key in tag_keys:
+ ref_key = key.lower()
+ self._validate_tag_key(key, exception_param="tagKeys")
+
+ policy.tags.pop(ref_key, None)
+
+ def create_policy_version(self, policy_arn, policy_document, set_as_default):
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_document)
+ iam_policy_document_validator.validate()
+
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ if len(policy.versions) >= 5:
+ raise IAMLimitExceededException(
+ "A managed policy can have up to 5 versions. Before you create a new version, you must delete an existing version."
+ )
+ set_as_default = set_as_default == "true" # convert it to python bool
+ version = PolicyVersion(policy_arn, policy_document, set_as_default)
+ policy.versions.append(version)
+ version.version_id = "v{0}".format(policy.next_version_num)
+ policy.next_version_num += 1
+ if set_as_default:
+ policy.update_default_version(version.version_id)
+ return version
+
+ def get_policy_version(self, policy_arn, version_id):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ for version in policy.versions:
+ if version.version_id == version_id:
+ return version
+ raise IAMNotFoundException("Policy version not found")
+
+ def list_policy_versions(self, policy_arn):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ return policy.versions
+
+ def delete_policy_version(self, policy_arn, version_id):
+ policy = self.get_policy(policy_arn)
+ if not policy:
+ raise IAMNotFoundException("Policy not found")
+ if version_id == policy.default_version_id:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete the default version of a policy.",
+ )
+ for i, v in enumerate(policy.versions):
+ if v.version_id == version_id:
+ del policy.versions[i]
+ return
+ raise IAMNotFoundException("Policy not found")
+
+ def create_instance_profile(self, name, path, role_names, tags=None):
+ if self.instance_profiles.get(name):
+ raise IAMConflictException(
+ code="EntityAlreadyExists",
+ message="Instance Profile {0} already exists.".format(name),
+ )
+
+ instance_profile_id = random_resource_id()
+
+ roles = [iam_backend.get_role(role_name) for role_name in role_names]
+ instance_profile = InstanceProfile(instance_profile_id, name, path, roles, tags)
+ self.instance_profiles[name] = instance_profile
+ return instance_profile
+
+ def delete_instance_profile(self, name):
+ instance_profile = self.get_instance_profile(name)
+ if len(instance_profile.roles) > 0:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must remove roles from instance profile first.",
+ )
+ del self.instance_profiles[name]
+
+ def get_instance_profile(self, profile_name):
+ for profile in self.get_instance_profiles():
+ if profile.name == profile_name:
+ return profile
+
+ raise IAMNotFoundException(
+ "Instance profile {0} not found".format(profile_name)
+ )
+
+ def get_instance_profile_by_arn(self, profile_arn):
+ for profile in self.get_instance_profiles():
+ if profile.arn == profile_arn:
+ return profile
+
+ raise IAMNotFoundException("Instance profile {0} not found".format(profile_arn))
+
+ def get_instance_profiles(self):
+ return self.instance_profiles.values()
+
+ def get_instance_profiles_for_role(self, role_name):
+ found_profiles = []
+
+ for profile in self.get_instance_profiles():
+ if len(profile.roles) > 0:
+ if profile.roles[0].name == role_name:
+ found_profiles.append(profile)
+
+ return found_profiles
+
+ def add_role_to_instance_profile(self, profile_name, role_name):
+ profile = self.get_instance_profile(profile_name)
+ role = self.get_role(role_name)
+ profile.roles.append(role)
+
+ def remove_role_from_instance_profile(self, profile_name, role_name):
+ profile = self.get_instance_profile(profile_name)
+ role = self.get_role(role_name)
+ profile.roles.remove(role)
+
+ def list_server_certificates(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.certificates.values()
+
+ def upload_server_certificate(
+ self, cert_name, cert_body, private_key, cert_chain=None, path=None
+ ):
+ certificate_id = random_resource_id()
+ cert = Certificate(cert_name, cert_body, private_key, cert_chain, path)
+ self.certificates[certificate_id] = cert
+ return cert
+
+ def get_server_certificate(self, name):
+ for cert in self.certificates.values():
+ if name == cert.cert_name:
+ return cert
+
+ raise IAMNotFoundException(
+ "The Server Certificate with name {0} cannot be " "found.".format(name)
+ )
+
+ def get_certificate_by_arn(self, arn):
+ for cert in self.certificates.values():
+ if arn == cert.arn:
+ return cert
+ return None
+
+ def delete_server_certificate(self, name):
+ cert_id = None
+ for key, cert in self.certificates.items():
+ if name == cert.cert_name:
+ cert_id = key
+ break
+
+ if cert_id is None:
+ raise IAMNotFoundException(
+ "The Server Certificate with name {0} cannot be " "found.".format(name)
+ )
+
+ self.certificates.pop(cert_id, None)
+
+ def create_group(self, group_name, path="/"):
+ if group_name in self.groups:
+ raise IAMConflictException("Group {0} already exists".format(group_name))
+
+ group = Group(group_name, path)
+ self.groups[group_name] = group
+ return group
+
+ def get_group(self, group_name):
+ """
+ Pagination is not yet implemented
+ """
+ try:
+ return self.groups[group_name]
+ except KeyError:
+ raise IAMNotFoundException("Group {0} not found".format(group_name))
+
+ def list_groups(self):
+ return self.groups.values()
+
+ def get_groups_for_user(self, user_name):
+ user = self.get_user(user_name)
+ groups = []
+ for group in self.list_groups():
+ if user in group.users:
+ groups.append(group)
+
+ return groups
+
+ def put_group_policy(self, group_name, policy_name, policy_json):
+ group = self.get_group(group_name)
+
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_json)
+ iam_policy_document_validator.validate()
+ group.put_policy(policy_name, policy_json)
+
+ def list_group_policies(self, group_name):
+ """
+ Pagination is not yet implemented
+ """
+ group = self.get_group(group_name)
+ return group.list_policies()
+
+ def delete_group_policy(self, group_name, policy_name):
+ group = self.get_group(group_name)
+ group.delete_policy(policy_name)
+
+ def get_group_policy(self, group_name, policy_name):
+ group = self.get_group(group_name)
+ return group.get_policy(policy_name)
+
+ def delete_group(self, group_name):
+ try:
+ del self.groups[group_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "The group with name {0} cannot be found.".format(group_name)
+ )
+
+ def update_group(self, group_name, new_group_name, new_path):
+ if new_group_name:
+ if new_group_name in self.groups:
+ raise IAMConflictException(
+ message="Group {0} already exists".format(new_group_name)
+ )
+ try:
+ group = self.groups[group_name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "The group with name {0} cannot be found.".format(group_name)
+ )
+
+ existing_policies = group.managed_policies.copy()
+ for policy_arn in existing_policies:
+ self.detach_group_policy(policy_arn, group_name)
+ if new_path:
+ group.path = new_path
+ group.name = new_group_name
+ self.groups[new_group_name] = self.groups.pop(group_name)
+ for policy_arn in existing_policies:
+ self.attach_group_policy(policy_arn, new_group_name)
+
+ def create_user(self, user_name, path="/", tags=None):
+ if user_name in self.users:
+ raise IAMConflictException(
+ "EntityAlreadyExists", "User {0} already exists".format(user_name)
+ )
+
+ user = User(user_name, path)
+ self.tagger.tag_resource(user.arn, tags or [])
+ self.users[user_name] = user
+ return user, self.tagger.list_tags_for_resource(user.arn)
+
+ def get_user(self, name):
+ user = self.users.get(name)
+
+ if not user:
+ raise NoSuchEntity("The user with name {} cannot be found.".format(name))
+
+ return user
+
+ def list_users(self, path_prefix, marker, max_items):
+ users = None
+ try:
+
+ users = self.users.values()
+ if path_prefix:
+ users = filter_items_with_path_prefix(path_prefix, users)
+
+ except KeyError:
+ raise IAMNotFoundException(
+ "Users {0}, {1}, {2} not found".format(path_prefix, marker, max_items)
+ )
+
+ return users
+
+ def update_user(self, user_name, new_path=None, new_user_name=None):
+ try:
+ user = self.users[user_name]
+ except KeyError:
+ raise IAMNotFoundException("User {0} not found".format(user_name))
+
+ if new_path:
+ user.path = new_path
+ if new_user_name:
+ user.name = new_user_name
+ self.users[new_user_name] = self.users.pop(user_name)
+
+ def list_roles(self, path_prefix=None, marker=None, max_items=None):
+ path_prefix = path_prefix if path_prefix else "/"
+ max_items = int(max_items) if max_items else 100
+ start_index = int(marker) if marker else 0
+
+ roles = self.roles.values()
+ roles = filter_items_with_path_prefix(path_prefix, roles)
+ sorted_roles = sorted(roles, key=lambda role: role.id)
+
+ roles_to_return = sorted_roles[start_index : start_index + max_items]
+
+ if len(sorted_roles) <= (start_index + max_items):
+ marker = None
+ else:
+ marker = str(start_index + max_items)
+
+ return roles_to_return, marker
+
+ def upload_signing_certificate(self, user_name, body):
+ user = self.get_user(user_name)
+ cert_id = random_resource_id(size=32)
+
+ # Validate the signing cert:
+ try:
+ if sys.version_info < (3, 0):
+ data = bytes(body)
+ else:
+ data = bytes(body, "utf8")
+
+ x509.load_pem_x509_certificate(data, default_backend())
+
+ except Exception:
+ raise MalformedCertificate(body)
+
+ user.signing_certificates[cert_id] = SigningCertificate(
+ cert_id, user_name, body
+ )
+
+ return user.signing_certificates[cert_id]
+
+ def delete_signing_certificate(self, user_name, cert_id):
+ user = self.get_user(user_name)
+
+ try:
+ del user.signing_certificates[cert_id]
+ except KeyError:
+ raise IAMNotFoundException(
+ "The Certificate with id {id} cannot be found.".format(id=cert_id)
+ )
+
+ def list_signing_certificates(self, user_name):
+ user = self.get_user(user_name)
+
+ return list(user.signing_certificates.values())
+
+ def update_signing_certificate(self, user_name, cert_id, status):
+ user = self.get_user(user_name)
+
+ try:
+ user.signing_certificates[cert_id].status = status
+
+ except KeyError:
+ raise IAMNotFoundException(
+ "The Certificate with id {id} cannot be found.".format(id=cert_id)
+ )
+
+ def create_login_profile(self, user_name, password):
+ # This does not currently deal with PasswordPolicyViolation.
+ user = self.get_user(user_name)
+ if user.password:
+ raise IAMConflictException(
+ "User {0} already has password".format(user_name)
+ )
+ user.password = password
+ return user
+
+ def get_login_profile(self, user_name):
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name)
+ )
+ return user
+
+ def update_login_profile(self, user_name, password, password_reset_required):
+ # This does not currently deal with PasswordPolicyViolation.
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name)
+ )
+ user.password = password
+ user.password_reset_required = password_reset_required
+ return user
+
+ def delete_login_profile(self, user_name):
+ user = self.get_user(user_name)
+ if not user.password:
+ raise IAMNotFoundException(
+ "Login profile for {0} not found".format(user_name)
+ )
+ user.password = None
+
+ def add_user_to_group(self, group_name, user_name):
+ user = self.get_user(user_name)
+ group = self.get_group(group_name)
+ group.users.append(user)
+
+ def remove_user_from_group(self, group_name, user_name):
+ group = self.get_group(group_name)
+ user = self.get_user(user_name)
+ try:
+ group.users.remove(user)
+ except ValueError:
+ raise IAMNotFoundException(
+ "User {0} not in group {1}".format(user_name, group_name)
+ )
+
+ def get_user_policy(self, user_name, policy_name):
+ user = self.get_user(user_name)
+ policy = user.get_policy(policy_name)
+ return policy
+
+ def list_user_policies(self, user_name):
+ user = self.get_user(user_name)
+ return user.policies.keys()
+
+ def list_user_tags(self, user_name):
+ user = self.get_user(user_name)
+ return self.tagger.list_tags_for_resource(user.arn)
+
+ def put_user_policy(self, user_name, policy_name, policy_json):
+ user = self.get_user(user_name)
+
+ iam_policy_document_validator = IAMPolicyDocumentValidator(policy_json)
+ iam_policy_document_validator.validate()
+ user.put_policy(policy_name, policy_json)
+
+ def delete_user_policy(self, user_name, policy_name):
+ user = self.get_user(user_name)
+ user.delete_policy(policy_name)
+
+ def delete_policy(self, policy_arn):
+ policy = self.get_policy(policy_arn)
+ del self.managed_policies[policy.arn]
+
+ def create_access_key(self, user_name=None, status="Active"):
+ user = self.get_user(user_name)
+ key = user.create_access_key(status)
+ self.access_keys[key.physical_resource_id] = key
+ return key
+
+ def update_access_key(self, user_name, access_key_id, status=None):
+ user = self.get_user(user_name)
+ return user.update_access_key(access_key_id, status)
+
+ def get_access_key_last_used(self, access_key_id):
+ access_keys_list = self.get_all_access_keys_for_all_users()
+ for key in access_keys_list:
+ if key.access_key_id == access_key_id:
+ return {"user_name": key.user_name, "last_used": key.last_used_iso_8601}
+
+ raise IAMNotFoundException(
+ f"The Access Key with id {access_key_id} cannot be found"
+ )
+
+ def get_all_access_keys_for_all_users(self):
+ access_keys_list = []
+ for user_name in self.users:
+ access_keys_list += self.list_access_keys(user_name)
+ return access_keys_list
+
+ def list_access_keys(self, user_name):
+ """
+ Pagination is not yet implemented
+ """
+ user = self.get_user(user_name)
+ keys = user.get_all_access_keys()
+ return keys
+
+ def delete_access_key(self, access_key_id, user_name):
+ user = self.get_user(user_name)
+ access_key = user.get_access_key_by_id(access_key_id)
+ self.delete_access_key_by_name(access_key.access_key_id)
+
+ def delete_access_key_by_name(self, name):
+ key = self.access_keys[name]
+ try: # User may have been deleted before their access key...
+ user = self.get_user(key.user_name)
+ user.delete_access_key(key.access_key_id)
+ except NoSuchEntity:
+ pass
+ del self.access_keys[name]
+
+ def upload_ssh_public_key(self, user_name, ssh_public_key_body):
+ user = self.get_user(user_name)
+ return user.upload_ssh_public_key(ssh_public_key_body)
+
+ def get_ssh_public_key(self, user_name, ssh_public_key_id):
+ user = self.get_user(user_name)
+ return user.get_ssh_public_key(ssh_public_key_id)
+
+ def get_all_ssh_public_keys(self, user_name):
+ user = self.get_user(user_name)
+ return user.get_all_ssh_public_keys()
+
+ def update_ssh_public_key(self, user_name, ssh_public_key_id, status):
+ user = self.get_user(user_name)
+ return user.update_ssh_public_key(ssh_public_key_id, status)
+
+ def delete_ssh_public_key(self, user_name, ssh_public_key_id):
+ user = self.get_user(user_name)
+ return user.delete_ssh_public_key(ssh_public_key_id)
+
+ def enable_mfa_device(
+ self, user_name, serial_number, authentication_code_1, authentication_code_2
+ ):
+ """Enable MFA Device for user."""
+ user = self.get_user(user_name)
+ if serial_number in user.mfa_devices:
+ raise IAMConflictException(
+ "EntityAlreadyExists", "Device {0} already exists".format(serial_number)
+ )
+
+ device = self.virtual_mfa_devices.get(serial_number, None)
+ if device:
+ device.enable_date = datetime.utcnow()
+ device.user = user
+ device.user_attribute = {
+ "Path": user.path,
+ "UserName": user.name,
+ "UserId": user.id,
+ "Arn": user.arn,
+ "CreateDate": user.created_iso_8601,
+ "PasswordLastUsed": None, # not supported
+ "PermissionsBoundary": {}, # ToDo: add put_user_permissions_boundary() functionality
+ "Tags": self.tagger.list_tags_for_resource(user.arn)["Tags"],
+ }
+
+ user.enable_mfa_device(
+ serial_number, authentication_code_1, authentication_code_2
+ )
+
+ def deactivate_mfa_device(self, user_name, serial_number):
+ """Deactivate and detach MFA Device from user if device exists."""
+ user = self.get_user(user_name)
+ if serial_number not in user.mfa_devices:
+ raise IAMNotFoundException("Device {0} not found".format(serial_number))
+
+ device = self.virtual_mfa_devices.get(serial_number, None)
+ if device:
+ device.enable_date = None
+ device.user = None
+ device.user_attribute = None
+
+ user.deactivate_mfa_device(serial_number)
+
+ def list_mfa_devices(self, user_name):
+ user = self.get_user(user_name)
+ return user.mfa_devices.values()
+
+ def create_virtual_mfa_device(self, device_name, path):
+ if not path:
+ path = "/"
+
+ if not path.startswith("/") and not path.endswith("/"):
+ raise ValidationError(
+ "The specified value for path is invalid. "
+ "It must begin and end with / and contain only alphanumeric characters and/or / characters."
+ )
+
+ if any(not len(part) for part in path.split("/")[1:-1]):
+ raise ValidationError(
+ "The specified value for path is invalid. "
+ "It must begin and end with / and contain only alphanumeric characters and/or / characters."
+ )
+
+ if len(path) > 512:
+ raise ValidationError(
+ "1 validation error detected: "
+ 'Value "{}" at "path" failed to satisfy constraint: '
+ "Member must have length less than or equal to 512"
+ )
+
+ device = VirtualMfaDevice(path + device_name)
+
+ if device.serial_number in self.virtual_mfa_devices:
+ raise EntityAlreadyExists(
+ "MFADevice entity at the same path and name already exists."
+ )
+
+ self.virtual_mfa_devices[device.serial_number] = device
+ return device
+
+ def delete_virtual_mfa_device(self, serial_number):
+ device = self.virtual_mfa_devices.pop(serial_number, None)
+
+ if not device:
+ raise IAMNotFoundException(
+ "VirtualMFADevice with serial number {0} doesn't exist.".format(
+ serial_number
+ )
+ )
+
+ def list_virtual_mfa_devices(self, assignment_status, marker, max_items):
+ devices = list(self.virtual_mfa_devices.values())
+
+ if assignment_status == "Assigned":
+ devices = [device for device in devices if device.enable_date]
+
+ if assignment_status == "Unassigned":
+ devices = [device for device in devices if not device.enable_date]
+
+ sorted(devices, key=lambda device: device.serial_number)
+ max_items = int(max_items)
+ start_idx = int(marker) if marker else 0
+
+ if start_idx > len(devices):
+ raise ValidationError("Invalid Marker.")
+
+ devices = devices[start_idx : start_idx + max_items]
+
+ if len(devices) < max_items:
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ return devices, marker
+
+ def delete_user(self, user_name):
+ user = self.get_user(user_name)
+ if user.managed_policies:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must detach all policies first.",
+ )
+ if user.policies:
+ raise IAMConflictException(
+ code="DeleteConflict",
+ message="Cannot delete entity, must delete policies first.",
+ )
+ self.tagger.delete_all_tags_for_resource(user.arn)
+ del self.users[user_name]
+
+ def report_generated(self):
+ return self.credential_report
+
+ def generate_report(self):
+ self.credential_report = True
+
+ def get_credential_report(self):
+ if not self.credential_report:
+ raise IAMReportNotPresentException("Credential report not present")
+ report = "user,arn,user_creation_time,password_enabled,password_last_used,password_last_changed,password_next_rotation,mfa_active,access_key_1_active,access_key_1_last_rotated,access_key_1_last_used_date,access_key_1_last_used_region,access_key_1_last_used_service,access_key_2_active,access_key_2_last_rotated,access_key_2_last_used_date,access_key_2_last_used_region,access_key_2_last_used_service,cert_1_active,cert_1_last_rotated,cert_2_active,cert_2_last_rotated\n"
+ for user in self.users:
+ report += self.users[user].to_csv()
+ return base64.b64encode(report.encode("ascii")).decode("ascii")
+
+ def list_account_aliases(self):
+ return self.account_aliases
+
+ def create_account_alias(self, alias):
+ # alias is force updated
+ self.account_aliases = [alias]
+
+ def delete_account_alias(self):
+ self.account_aliases = []
+
+ def get_account_authorization_details(self, policy_filter):
+ policies = self.managed_policies.values()
+ local_policies = set(policies) - set(aws_managed_policies)
+ returned_policies = []
+
+ if len(policy_filter) == 0:
+ return {
+ "instance_profiles": self.instance_profiles.values(),
+ "roles": self.roles.values(),
+ "groups": self.groups.values(),
+ "users": self.users.values(),
+ "managed_policies": self.managed_policies.values(),
+ }
+
+ if "AWSManagedPolicy" in policy_filter:
+ returned_policies = aws_managed_policies
+ if "LocalManagedPolicy" in policy_filter:
+ returned_policies = returned_policies + list(local_policies)
+
+ return {
+ "instance_profiles": self.instance_profiles.values(),
+ "roles": self.roles.values() if "Role" in policy_filter else [],
+ "groups": self.groups.values() if "Group" in policy_filter else [],
+ "users": self.users.values() if "User" in policy_filter else [],
+ "managed_policies": returned_policies,
+ }
+
+ def create_saml_provider(self, name, saml_metadata_document):
+ saml_provider = SAMLProvider(name, saml_metadata_document)
+ self.saml_providers[name] = saml_provider
+ return saml_provider
+
+ def update_saml_provider(self, saml_provider_arn, saml_metadata_document):
+ saml_provider = self.get_saml_provider(saml_provider_arn)
+ saml_provider.saml_metadata_document = saml_metadata_document
+ return saml_provider
+
+ def delete_saml_provider(self, saml_provider_arn):
+ try:
+ for saml_provider in list(self.list_saml_providers()):
+ if saml_provider.arn == saml_provider_arn:
+ del self.saml_providers[saml_provider.name]
+ except KeyError:
+ raise IAMNotFoundException(
+ "SAMLProvider {0} not found".format(saml_provider_arn)
+ )
+
+ def list_saml_providers(self):
+ return self.saml_providers.values()
+
+ def get_saml_provider(self, saml_provider_arn):
+ for saml_provider in self.list_saml_providers():
+ if saml_provider.arn == saml_provider_arn:
+ return saml_provider
+ raise IAMNotFoundException(
+ "SamlProvider {0} not found".format(saml_provider_arn)
+ )
+
+ def get_user_from_access_key_id(self, access_key_id):
+ for user_name, user in self.users.items():
+ access_keys = self.list_access_keys(user_name)
+ for access_key in access_keys:
+ if access_key.access_key_id == access_key_id:
+ return user
+ return None
+
+ def create_open_id_connect_provider(
+ self, url, thumbprint_list, client_id_list, tags
+ ):
+ clean_tags = self._tag_verification(tags)
+ open_id_provider = OpenIDConnectProvider(
+ url, thumbprint_list, client_id_list, clean_tags
+ )
+
+ if open_id_provider.arn in self.open_id_providers:
+ raise EntityAlreadyExists("Unknown")
+
+ self.open_id_providers[open_id_provider.arn] = open_id_provider
+ return open_id_provider
+
+ def update_open_id_connect_provider_thumbprint(self, arn, thumbprint_list):
+ open_id_provider = self.get_open_id_connect_provider(arn)
+ open_id_provider.thumbprint_list = thumbprint_list
+
+ def tag_open_id_connect_provider(self, arn, tags):
+ open_id_provider = self.get_open_id_connect_provider(arn)
+ clean_tags = self._tag_verification(tags)
+ open_id_provider.tags.update(clean_tags)
+
+ def untag_open_id_connect_provider(self, arn, tag_keys):
+ open_id_provider = self.get_open_id_connect_provider(arn)
+
+ for key in tag_keys:
+ ref_key = key.lower()
+ self._validate_tag_key(key, exception_param="tagKeys")
+ open_id_provider.tags.pop(ref_key, None)
+
+ def list_open_id_connect_provider_tags(self, arn, marker, max_items=100):
+ open_id_provider = self.get_open_id_connect_provider(arn)
+
+ max_items = int(max_items)
+ tag_index = sorted(open_id_provider.tags)
+ start_idx = int(marker) if marker else 0
+
+ tag_index = tag_index[start_idx : start_idx + max_items]
+
+ if len(open_id_provider.tags) <= (start_idx + max_items):
+ marker = None
+ else:
+ marker = str(start_idx + max_items)
+
+ tags = [open_id_provider.tags[tag] for tag in tag_index]
+ return tags, marker
+
+ def delete_open_id_connect_provider(self, arn):
+ self.open_id_providers.pop(arn, None)
+
+ def get_open_id_connect_provider(self, arn):
+ open_id_provider = self.open_id_providers.get(arn)
+
+ if not open_id_provider:
+ raise IAMNotFoundException(
+ "OpenIDConnect Provider not found for arn {}".format(arn)
+ )
+
+ return open_id_provider
+
+ def list_open_id_connect_providers(self):
+ return list(self.open_id_providers.keys())
+
+ def update_account_password_policy(
+ self,
+ allow_change_password,
+ hard_expiry,
+ max_password_age,
+ minimum_password_length,
+ password_reuse_prevention,
+ require_lowercase_characters,
+ require_numbers,
+ require_symbols,
+ require_uppercase_characters,
+ ):
+ self.account_password_policy = AccountPasswordPolicy(
+ allow_change_password,
+ hard_expiry,
+ max_password_age,
+ minimum_password_length,
+ password_reuse_prevention,
+ require_lowercase_characters,
+ require_numbers,
+ require_symbols,
+ require_uppercase_characters,
+ )
+
+ def get_account_password_policy(self):
+ if not self.account_password_policy:
+ raise NoSuchEntity(
+ "The Password Policy with domain name {} cannot be found.".format(
+ get_account_id()
+ )
+ )
+
+ return self.account_password_policy
+
+ def delete_account_password_policy(self):
+ if not self.account_password_policy:
+ raise NoSuchEntity(
+ "The account policy with name PasswordPolicy cannot be found."
+ )
+
+ self.account_password_policy = None
+
+ def get_account_summary(self):
+ return self.account_summary
+
+ def create_inline_policy(
+ self,
+ resource_name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ ):
+ if resource_name in self.inline_policies:
+ raise IAMConflictException(
+ "EntityAlreadyExists",
+ "Inline Policy {0} already exists".format(resource_name),
+ )
+
+ inline_policy = InlinePolicy(
+ resource_name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ )
+ self.inline_policies[resource_name] = inline_policy
+ inline_policy.apply_policy(self)
+ return inline_policy
+
+ def get_inline_policy(self, policy_id):
+ inline_policy = None
+ try:
+ inline_policy = self.inline_policies[policy_id]
+ except KeyError:
+ raise IAMNotFoundException("Inline policy {0} not found".format(policy_id))
+ return inline_policy
+
+ def update_inline_policy(
+ self,
+ resource_name,
+ policy_name,
+ policy_document,
+ group_names,
+ role_names,
+ user_names,
+ ):
+ inline_policy = self.get_inline_policy(resource_name)
+ inline_policy.unapply_policy(self)
+ inline_policy.update(
+ policy_name, policy_document, group_names, role_names, user_names
+ )
+ inline_policy.apply_policy(self)
+ return inline_policy
+
+ def delete_inline_policy(self, policy_id):
+ inline_policy = self.get_inline_policy(policy_id)
+ inline_policy.unapply_policy(self)
+ del self.inline_policies[policy_id]
+
+ def tag_user(self, name, tags):
+ user = self.get_user(name)
+
+ self.tagger.tag_resource(user.arn, tags)
+
+ def untag_user(self, name, tag_keys):
+ user = self.get_user(name)
+
+ self.tagger.untag_resource_using_names(user.arn, tag_keys)
+
+ def create_service_linked_role(self, service_name, description, suffix):
+ # service.amazonaws.com -> Service
+ # some-thing.service.amazonaws.com -> Service_SomeThing
+ service = service_name.split(".")[-3]
+ prefix = service_name.split(".")[0]
+ if service != prefix:
+ prefix = "".join([x.capitalize() for x in prefix.split("-")])
+ service = SERVICE_NAME_CONVERSION.get(service, service) + "_" + prefix
+ else:
+ service = SERVICE_NAME_CONVERSION.get(service, service)
+ role_name = f"AWSServiceRoleFor{service}"
+ if suffix:
+ role_name = role_name + f"_{suffix}"
+ assume_role_policy_document = {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Action": ["sts:AssumeRole"],
+ "Effect": "Allow",
+ "Principal": {"Service": [service_name]},
+ }
+ ],
+ }
+ path = f"/aws-service-role/{service_name}/"
+ return self.create_role(
+ role_name,
+ json.dumps(assume_role_policy_document),
+ path,
+ permissions_boundary=None,
+ description=description,
+ tags=[],
+ max_session_duration=None,
+ linked_service=service_name,
+ )
+
+ def delete_service_linked_role(self, role_name):
+ self.delete_role(role_name)
+ deletion_task_id = str(uuid.uuid4())
+ return deletion_task_id
+
+ def get_service_linked_role_deletion_status(self):
+ """
+ This method always succeeds for now - we do not yet keep track of deletions
+ """
+ return True
+
+
+iam_backend = IAMBackend("global")
diff --git a/contrib/python/moto/py3/moto/iam/policy_validation.py b/contrib/python/moto/py3/moto/iam/policy_validation.py
new file mode 100644
index 0000000000..ee6a33ae29
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/policy_validation.py
@@ -0,0 +1,523 @@
+import json
+import re
+
+from moto.iam.exceptions import MalformedPolicyDocument
+
+
+VALID_TOP_ELEMENTS = ["Version", "Id", "Statement", "Conditions"]
+
+VALID_VERSIONS = ["2008-10-17", "2012-10-17"]
+
+VALID_STATEMENT_ELEMENTS = [
+ "Sid",
+ "Action",
+ "NotAction",
+ "Resource",
+ "NotResource",
+ "Effect",
+ "Principal",
+ "NotPrincipal",
+ "Condition",
+]
+
+VALID_EFFECTS = ["Allow", "Deny"]
+
+VALID_CONDITIONS = [
+ "StringEquals",
+ "StringNotEquals",
+ "StringEqualsIgnoreCase",
+ "StringNotEqualsIgnoreCase",
+ "StringLike",
+ "StringNotLike",
+ "NumericEquals",
+ "NumericNotEquals",
+ "NumericLessThan",
+ "NumericLessThanEquals",
+ "NumericGreaterThan",
+ "NumericGreaterThanEquals",
+ "DateEquals",
+ "DateNotEquals",
+ "DateLessThan",
+ "DateLessThanEquals",
+ "DateGreaterThan",
+ "DateGreaterThanEquals",
+ "Bool",
+ "BinaryEquals",
+ "IpAddress",
+ "NotIpAddress",
+ "ArnEquals",
+ "ArnLike",
+ "ArnNotEquals",
+ "ArnNotLike",
+ "Null",
+]
+
+VALID_CONDITION_PREFIXES = ["ForAnyValue:", "ForAllValues:"]
+
+VALID_CONDITION_POSTFIXES = ["IfExists"]
+
+SERVICE_TYPE_REGION_INFORMATION_ERROR_ASSOCIATIONS = {
+ "iam": "IAM resource {resource} cannot contain region information.",
+ "s3": "Resource {resource} can not contain region information.",
+}
+
+VALID_RESOURCE_PATH_STARTING_VALUES = {
+ "iam": {
+ "values": [
+ "user/",
+ "federated-user/",
+ "role/",
+ "group/",
+ "instance-profile/",
+ "mfa/",
+ "server-certificate/",
+ "policy/",
+ "sms-mfa/",
+ "saml-provider/",
+ "oidc-provider/",
+ "report/",
+ "access-report/",
+ ],
+ "error_message": 'IAM resource path must either be "*" or start with {values}.',
+ }
+}
+
+
+class IAMPolicyDocumentValidator:
+ def __init__(self, policy_document):
+ self._policy_document = policy_document
+ self._policy_json = {}
+ self._statements = []
+ self._resource_error = "" # the first resource error found that does not generate a legacy parsing error
+
+ def validate(self):
+ try:
+ self._validate_syntax()
+ except Exception:
+ raise MalformedPolicyDocument("Syntax errors in policy.")
+ try:
+ self._validate_version()
+ except Exception:
+ raise MalformedPolicyDocument(
+ "Policy document must be version 2012-10-17 or greater."
+ )
+ try:
+ self._perform_first_legacy_parsing()
+ self._validate_resources_for_formats()
+ self._validate_not_resources_for_formats()
+ except Exception:
+ raise MalformedPolicyDocument("The policy failed legacy parsing")
+ try:
+ self._validate_sid_uniqueness()
+ except Exception:
+ raise MalformedPolicyDocument(
+ "Statement IDs (SID) in a single policy must be unique."
+ )
+ try:
+ self._validate_action_like_exist()
+ except Exception:
+ raise MalformedPolicyDocument("Policy statement must contain actions.")
+ try:
+ self._validate_resource_exist()
+ except Exception:
+ raise MalformedPolicyDocument("Policy statement must contain resources.")
+
+ if self._resource_error != "":
+ raise MalformedPolicyDocument(self._resource_error)
+
+ self._validate_actions_for_prefixes()
+ self._validate_not_actions_for_prefixes()
+
+ def _validate_syntax(self):
+ self._policy_json = json.loads(self._policy_document)
+ assert isinstance(self._policy_json, dict)
+ self._validate_top_elements()
+ self._validate_version_syntax()
+ self._validate_id_syntax()
+ self._validate_statements_syntax()
+
+ def _validate_top_elements(self):
+ top_elements = self._policy_json.keys()
+ for element in top_elements:
+ assert element in VALID_TOP_ELEMENTS
+
+ def _validate_version_syntax(self):
+ if "Version" in self._policy_json:
+ assert self._policy_json["Version"] in VALID_VERSIONS
+
+ def _validate_version(self):
+ assert self._policy_json["Version"] == "2012-10-17"
+
+ def _validate_sid_uniqueness(self):
+ sids = []
+ for statement in self._statements:
+ if "Sid" in statement:
+ statementId = statement["Sid"]
+ if statementId:
+ assert statementId not in sids
+ sids.append(statementId)
+
+ def _validate_statements_syntax(self):
+ assert "Statement" in self._policy_json
+ assert isinstance(self._policy_json["Statement"], (dict, list))
+
+ if isinstance(self._policy_json["Statement"], dict):
+ self._statements.append(self._policy_json["Statement"])
+ else:
+ self._statements += self._policy_json["Statement"]
+
+ assert self._statements
+ for statement in self._statements:
+ self._validate_statement_syntax(statement)
+
+ @staticmethod
+ def _validate_statement_syntax(statement):
+ assert isinstance(statement, dict)
+ for statement_element in statement.keys():
+ assert statement_element in VALID_STATEMENT_ELEMENTS
+
+ assert "Resource" not in statement or "NotResource" not in statement
+ assert "Action" not in statement or "NotAction" not in statement
+
+ IAMPolicyDocumentValidator._validate_effect_syntax(statement)
+ IAMPolicyDocumentValidator._validate_action_syntax(statement)
+ IAMPolicyDocumentValidator._validate_not_action_syntax(statement)
+ IAMPolicyDocumentValidator._validate_resource_syntax(statement)
+ IAMPolicyDocumentValidator._validate_not_resource_syntax(statement)
+ IAMPolicyDocumentValidator._validate_condition_syntax(statement)
+ IAMPolicyDocumentValidator._validate_sid_syntax(statement)
+
+ @staticmethod
+ def _validate_effect_syntax(statement):
+ assert "Effect" in statement
+ assert isinstance(statement["Effect"], str)
+ assert statement["Effect"].lower() in [
+ allowed_effect.lower() for allowed_effect in VALID_EFFECTS
+ ]
+
+ @staticmethod
+ def _validate_action_syntax(statement):
+ IAMPolicyDocumentValidator._validate_string_or_list_of_strings_syntax(
+ statement, "Action"
+ )
+
+ @staticmethod
+ def _validate_not_action_syntax(statement):
+ IAMPolicyDocumentValidator._validate_string_or_list_of_strings_syntax(
+ statement, "NotAction"
+ )
+
+ @staticmethod
+ def _validate_resource_syntax(statement):
+ IAMPolicyDocumentValidator._validate_string_or_list_of_strings_syntax(
+ statement, "Resource"
+ )
+
+ @staticmethod
+ def _validate_not_resource_syntax(statement):
+ IAMPolicyDocumentValidator._validate_string_or_list_of_strings_syntax(
+ statement, "NotResource"
+ )
+
+ @staticmethod
+ def _validate_string_or_list_of_strings_syntax(statement, key):
+ if key in statement:
+ assert isinstance(statement[key], (str, list))
+ if isinstance(statement[key], list):
+ for resource in statement[key]:
+ assert isinstance(resource, str)
+
+ @staticmethod
+ def _validate_condition_syntax(statement):
+ if "Condition" in statement:
+ assert isinstance(statement["Condition"], dict)
+ for condition_key, condition_value in statement["Condition"].items():
+ assert isinstance(condition_value, dict)
+ for condition_element_value in condition_value.values():
+ assert isinstance(condition_element_value, (list, str))
+
+ if (
+ IAMPolicyDocumentValidator._strip_condition_key(condition_key)
+ not in VALID_CONDITIONS
+ ):
+ assert not condition_value # empty dict
+
+ @staticmethod
+ def _strip_condition_key(condition_key):
+ for valid_prefix in VALID_CONDITION_PREFIXES:
+ if condition_key.startswith(valid_prefix):
+ condition_key = condition_key[len(valid_prefix) :]
+ break # strip only the first match
+
+ for valid_postfix in VALID_CONDITION_POSTFIXES:
+ if condition_key.endswith(valid_postfix):
+ condition_key = condition_key[: -len(valid_postfix)]
+ break # strip only the first match
+
+ return condition_key
+
+ @staticmethod
+ def _validate_sid_syntax(statement):
+ if "Sid" in statement:
+ assert isinstance(statement["Sid"], str)
+
+ def _validate_id_syntax(self):
+ if "Id" in self._policy_json:
+ assert isinstance(self._policy_json["Id"], str)
+
+ def _validate_resource_exist(self):
+ for statement in self._statements:
+ assert "Resource" in statement or "NotResource" in statement
+ if "Resource" in statement and isinstance(statement["Resource"], list):
+ assert statement["Resource"]
+ elif "NotResource" in statement and isinstance(
+ statement["NotResource"], list
+ ):
+ assert statement["NotResource"]
+
+ def _validate_action_like_exist(self):
+ for statement in self._statements:
+ assert "Action" in statement or "NotAction" in statement
+ if "Action" in statement and isinstance(statement["Action"], list):
+ assert statement["Action"]
+ elif "NotAction" in statement and isinstance(statement["NotAction"], list):
+ assert statement["NotAction"]
+
+ def _validate_actions_for_prefixes(self):
+ self._validate_action_like_for_prefixes("Action")
+
+ def _validate_not_actions_for_prefixes(self):
+ self._validate_action_like_for_prefixes("NotAction")
+
+ def _validate_action_like_for_prefixes(self, key):
+ for statement in self._statements:
+ if key in statement:
+ if isinstance(statement[key], str):
+ self._validate_action_prefix(statement[key])
+ else:
+ for action in statement[key]:
+ self._validate_action_prefix(action)
+
+ @staticmethod
+ def _validate_action_prefix(action):
+ action_parts = action.split(":")
+ if len(action_parts) == 1 and action_parts[0] != "*":
+ raise MalformedPolicyDocument(
+ "Actions/Conditions must be prefaced by a vendor, e.g., iam, sdb, ec2, etc."
+ )
+ elif len(action_parts) > 2:
+ raise MalformedPolicyDocument(
+ "Actions/Condition can contain only one colon."
+ )
+
+ vendor_pattern = re.compile(r"[^a-zA-Z0-9\-.]")
+ if action_parts[0] != "*" and vendor_pattern.search(action_parts[0]):
+ raise MalformedPolicyDocument(
+ "Vendor {vendor} is not valid".format(vendor=action_parts[0])
+ )
+
+ def _validate_resources_for_formats(self):
+ self._validate_resource_like_for_formats("Resource")
+
+ def _validate_not_resources_for_formats(self):
+ self._validate_resource_like_for_formats("NotResource")
+
+ def _validate_resource_like_for_formats(self, key):
+ for statement in self._statements:
+ if key in statement:
+ if isinstance(statement[key], str):
+ self._validate_resource_format(statement[key])
+ else:
+ for resource in sorted(statement[key], reverse=True):
+ self._validate_resource_format(resource)
+ if self._resource_error == "":
+ IAMPolicyDocumentValidator._legacy_parse_resource_like(
+ statement, key
+ )
+
+ def _validate_resource_format(self, resource):
+ if resource != "*":
+ resource_partitions = resource.partition(":")
+
+ if resource_partitions[1] == "":
+ self._resource_error = (
+ f'Resource {resource} must be in ARN format or "*".'
+ )
+ return
+
+ resource_partitions = resource_partitions[2].partition(":")
+ if resource_partitions[0] not in ["aws", "*"]:
+ remaining_resource_parts = resource_partitions[2].split(":")
+
+ arn1 = (
+ remaining_resource_parts[0]
+ if remaining_resource_parts[0] != ""
+ or len(remaining_resource_parts) > 1
+ else "*"
+ )
+ arn2 = (
+ remaining_resource_parts[1]
+ if len(remaining_resource_parts) > 1
+ else "*"
+ )
+ arn3 = (
+ remaining_resource_parts[2]
+ if len(remaining_resource_parts) > 2
+ else "*"
+ )
+ arn4 = (
+ ":".join(remaining_resource_parts[3:])
+ if len(remaining_resource_parts) > 3
+ else "*"
+ )
+ self._resource_error = 'Partition "{partition}" is not valid for resource "arn:{partition}:{arn1}:{arn2}:{arn3}:{arn4}".'.format(
+ partition=resource_partitions[0],
+ arn1=arn1,
+ arn2=arn2,
+ arn3=arn3,
+ arn4=arn4,
+ )
+ return
+
+ if resource_partitions[1] != ":":
+ self._resource_error = "Resource vendor must be fully qualified and cannot contain regexes."
+ return
+
+ resource_partitions = resource_partitions[2].partition(":")
+
+ service = resource_partitions[0]
+
+ if (
+ service in SERVICE_TYPE_REGION_INFORMATION_ERROR_ASSOCIATIONS.keys()
+ and not resource_partitions[2].startswith(":")
+ ):
+ self._resource_error = (
+ SERVICE_TYPE_REGION_INFORMATION_ERROR_ASSOCIATIONS[service].format(
+ resource=resource
+ )
+ )
+ return
+
+ resource_partitions = resource_partitions[2].partition(":")
+ resource_partitions = resource_partitions[2].partition(":")
+
+ if service in VALID_RESOURCE_PATH_STARTING_VALUES.keys():
+ valid_start = False
+ for valid_starting_value in VALID_RESOURCE_PATH_STARTING_VALUES[
+ service
+ ]["values"]:
+ if resource_partitions[2].startswith(valid_starting_value):
+ valid_start = True
+ break
+ if not valid_start:
+ self._resource_error = VALID_RESOURCE_PATH_STARTING_VALUES[service][
+ "error_message"
+ ].format(
+ values=", ".join(
+ VALID_RESOURCE_PATH_STARTING_VALUES[service]["values"]
+ )
+ )
+
+ def _perform_first_legacy_parsing(self):
+ """This method excludes legacy parsing resources, since that have to be done later."""
+ for statement in self._statements:
+ self._legacy_parse_statement(statement)
+
+ @staticmethod
+ def _legacy_parse_statement(statement):
+ assert statement["Effect"] in VALID_EFFECTS # case-sensitive matching
+ if "Condition" in statement:
+ for condition_key, condition_value in statement["Condition"].items():
+ IAMPolicyDocumentValidator._legacy_parse_condition(
+ condition_key, condition_value
+ )
+
+ @staticmethod
+ def _legacy_parse_resource_like(statement, key):
+ if isinstance(statement[key], str):
+ if statement[key] != "*":
+ assert statement[key].count(":") >= 5 or "::" not in statement[key]
+ assert statement[key].split(":")[2] != ""
+ else: # list
+ for resource in statement[key]:
+ if resource != "*":
+ assert resource.count(":") >= 5 or "::" not in resource
+ assert resource[2] != ""
+
+ @staticmethod
+ def _legacy_parse_condition(condition_key, condition_value):
+ stripped_condition_key = IAMPolicyDocumentValidator._strip_condition_key(
+ condition_key
+ )
+
+ if stripped_condition_key.startswith("Date"):
+ for condition_element_value in condition_value.values():
+ if isinstance(condition_element_value, str):
+ IAMPolicyDocumentValidator._legacy_parse_date_condition_value(
+ condition_element_value
+ )
+ else: # it has to be a list
+ for date_condition_value in condition_element_value:
+ IAMPolicyDocumentValidator._legacy_parse_date_condition_value(
+ date_condition_value
+ )
+
+ @staticmethod
+ def _legacy_parse_date_condition_value(date_condition_value):
+ if "t" in date_condition_value.lower() or "-" in date_condition_value:
+ IAMPolicyDocumentValidator._validate_iso_8601_datetime(
+ date_condition_value.lower()
+ )
+ else: # timestamp
+ assert 0 <= int(date_condition_value) <= 9223372036854775807
+
+ @staticmethod
+ def _validate_iso_8601_datetime(datetime):
+ datetime_parts = datetime.partition("t")
+ negative_year = datetime_parts[0].startswith("-")
+ date_parts = (
+ datetime_parts[0][1:].split("-")
+ if negative_year
+ else datetime_parts[0].split("-")
+ )
+ year = "-" + date_parts[0] if negative_year else date_parts[0]
+ assert -292275054 <= int(year) <= 292278993
+ if len(date_parts) > 1:
+ month = date_parts[1]
+ assert 1 <= int(month) <= 12
+ if len(date_parts) > 2:
+ day = date_parts[2]
+ assert 1 <= int(day) <= 31
+ assert len(date_parts) < 4
+
+ time_parts = datetime_parts[2].split(":")
+ if time_parts[0] != "":
+ hours = time_parts[0]
+ assert 0 <= int(hours) <= 23
+ if len(time_parts) > 1:
+ minutes = time_parts[1]
+ assert 0 <= int(minutes) <= 59
+ if len(time_parts) > 2:
+ if "z" in time_parts[2]:
+ seconds_with_decimal_fraction = time_parts[2].partition("z")[0]
+ assert time_parts[2].partition("z")[2] == ""
+ elif "+" in time_parts[2]:
+ seconds_with_decimal_fraction = time_parts[2].partition("+")[0]
+ time_zone_data = time_parts[2].partition("+")[2].partition(":")
+ time_zone_hours = time_zone_data[0]
+ assert len(time_zone_hours) == 2
+ assert 0 <= int(time_zone_hours) <= 23
+ if time_zone_data[1] == ":":
+ time_zone_minutes = time_zone_data[2]
+ assert len(time_zone_minutes) == 2
+ assert 0 <= int(time_zone_minutes) <= 59
+ else:
+ seconds_with_decimal_fraction = time_parts[2]
+ seconds_with_decimal_fraction_partition = (
+ seconds_with_decimal_fraction.partition(".")
+ )
+ seconds = seconds_with_decimal_fraction_partition[0]
+ assert 0 <= int(seconds) <= 59
+ if seconds_with_decimal_fraction_partition[1] == ".":
+ decimal_seconds = seconds_with_decimal_fraction_partition[2]
+ assert 0 <= int(decimal_seconds) <= 999999999
diff --git a/contrib/python/moto/py3/moto/iam/responses.py b/contrib/python/moto/py3/moto/iam/responses.py
new file mode 100644
index 0000000000..c203921c72
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/responses.py
@@ -0,0 +1,2760 @@
+from moto.core.responses import BaseResponse
+
+from .models import iam_backend, User
+
+
+class IamResponse(BaseResponse):
+ def attach_role_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ role_name = self._get_param("RoleName")
+ iam_backend.attach_role_policy(policy_arn, role_name)
+ template = self.response_template(ATTACH_ROLE_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_role_policy(self):
+ role_name = self._get_param("RoleName")
+ policy_arn = self._get_param("PolicyArn")
+ iam_backend.detach_role_policy(policy_arn, role_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DetachRolePolicy")
+
+ def attach_group_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ group_name = self._get_param("GroupName")
+ iam_backend.attach_group_policy(policy_arn, group_name)
+ template = self.response_template(ATTACH_GROUP_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_group_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ group_name = self._get_param("GroupName")
+ iam_backend.detach_group_policy(policy_arn, group_name)
+ template = self.response_template(DETACH_GROUP_POLICY_TEMPLATE)
+ return template.render()
+
+ def attach_user_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ user_name = self._get_param("UserName")
+ iam_backend.attach_user_policy(policy_arn, user_name)
+ template = self.response_template(ATTACH_USER_POLICY_TEMPLATE)
+ return template.render()
+
+ def detach_user_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ user_name = self._get_param("UserName")
+ iam_backend.detach_user_policy(policy_arn, user_name)
+ template = self.response_template(DETACH_USER_POLICY_TEMPLATE)
+ return template.render()
+
+ def create_policy(self):
+ description = self._get_param("Description")
+ path = self._get_param("Path")
+ policy_document = self._get_param("PolicyDocument")
+ policy_name = self._get_param("PolicyName")
+ tags = self._get_multi_param("Tags.member")
+ policy = iam_backend.create_policy(
+ description, path, policy_document, policy_name, tags
+ )
+ template = self.response_template(CREATE_POLICY_TEMPLATE)
+ return template.render(policy=policy)
+
+ def get_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ policy = iam_backend.get_policy(policy_arn)
+ template = self.response_template(GET_POLICY_TEMPLATE)
+ return template.render(policy=policy)
+
+ def list_attached_role_policies(self):
+ marker = self._get_param("Marker")
+ max_items = self._get_int_param("MaxItems", 100)
+ path_prefix = self._get_param("PathPrefix", "/")
+ role_name = self._get_param("RoleName")
+ policies, marker = iam_backend.list_attached_role_policies(
+ role_name, marker=marker, max_items=max_items, path_prefix=path_prefix
+ )
+ template = self.response_template(LIST_ATTACHED_ROLE_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_attached_group_policies(self):
+ marker = self._get_param("Marker")
+ max_items = self._get_int_param("MaxItems", 100)
+ path_prefix = self._get_param("PathPrefix", "/")
+ group_name = self._get_param("GroupName")
+ policies, marker = iam_backend.list_attached_group_policies(
+ group_name, marker=marker, max_items=max_items, path_prefix=path_prefix
+ )
+ template = self.response_template(LIST_ATTACHED_GROUP_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_attached_user_policies(self):
+ marker = self._get_param("Marker")
+ max_items = self._get_int_param("MaxItems", 100)
+ path_prefix = self._get_param("PathPrefix", "/")
+ user_name = self._get_param("UserName")
+ policies, marker = iam_backend.list_attached_user_policies(
+ user_name, marker=marker, max_items=max_items, path_prefix=path_prefix
+ )
+ template = self.response_template(LIST_ATTACHED_USER_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_policies(self):
+ marker = self._get_param("Marker")
+ max_items = self._get_int_param("MaxItems", 100)
+ only_attached = self._get_bool_param("OnlyAttached", False)
+ path_prefix = self._get_param("PathPrefix", "/")
+ scope = self._get_param("Scope", "All")
+ policies, marker = iam_backend.list_policies(
+ marker, max_items, only_attached, path_prefix, scope
+ )
+ template = self.response_template(LIST_POLICIES_TEMPLATE)
+ return template.render(policies=policies, marker=marker)
+
+ def list_entities_for_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+
+ # Options 'User'|'Role'|'Group'|'LocalManagedPolicy'|'AWSManagedPolicy
+ entity = self._get_param("EntityFilter")
+ path_prefix = self._get_param("PathPrefix")
+ # policy_usage_filter = self._get_param('PolicyUsageFilter')
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems")
+
+ entity_roles = []
+ entity_groups = []
+ entity_users = []
+
+ if not entity or entity == "User":
+ users = iam_backend.list_users(path_prefix, marker, max_items)
+ if users:
+ for user in users:
+ for p in user.managed_policies:
+ if p == policy_arn:
+ entity_users.append({"name": user.name, "id": user.id})
+
+ if not entity or entity == "Role":
+ roles, _ = iam_backend.list_roles(path_prefix, marker, max_items)
+ if roles:
+ for role in roles:
+ for p in role.managed_policies:
+ if p == policy_arn:
+ entity_roles.append({"name": role.name, "id": role.id})
+
+ if not entity or entity == "Group":
+ groups = iam_backend.list_groups()
+ if groups:
+ for group in groups:
+ for p in group.managed_policies:
+ if p == policy_arn:
+ entity_groups.append({"name": group.name, "id": group.id})
+
+ if entity == "LocalManagedPolicy" or entity == "AWSManagedPolicy":
+ users = iam_backend.list_users(path_prefix, marker, max_items)
+ if users:
+ for user in users:
+ for p in user.managed_policies:
+ if p == policy_arn:
+ entity_users.append({"name": user.name, "id": user.id})
+
+ roles, _ = iam_backend.list_roles(path_prefix, marker, max_items)
+ if roles:
+ for role in roles:
+ for p in role.managed_policies:
+ if p == policy_arn:
+ entity_roles.append({"name": role.name, "id": role.id})
+
+ groups = iam_backend.list_groups()
+ if groups:
+ for group in groups:
+ for p in group.managed_policies:
+ if p == policy_arn:
+ entity_groups.append({"name": group.name, "id": group.id})
+
+ template = self.response_template(LIST_ENTITIES_FOR_POLICY_TEMPLATE)
+ return template.render(
+ roles=entity_roles, users=entity_users, groups=entity_groups
+ )
+
+ def set_default_policy_version(self):
+ policy_arn = self._get_param("PolicyArn")
+ version_id = self._get_param("VersionId")
+ iam_backend.set_default_policy_version(policy_arn, version_id)
+ template = self.response_template(SET_DEFAULT_POLICY_VERSION_TEMPLATE)
+ return template.render()
+
+ def create_role(self):
+ role_name = self._get_param("RoleName")
+ path = self._get_param("Path")
+ assume_role_policy_document = self._get_param("AssumeRolePolicyDocument")
+ permissions_boundary = self._get_param("PermissionsBoundary")
+ description = self._get_param("Description")
+ tags = self._get_multi_param("Tags.member")
+ max_session_duration = self._get_param("MaxSessionDuration", 3600)
+
+ role = iam_backend.create_role(
+ role_name,
+ assume_role_policy_document,
+ path,
+ permissions_boundary,
+ description,
+ tags,
+ max_session_duration,
+ )
+ template = self.response_template(CREATE_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def get_role(self):
+ role_name = self._get_param("RoleName")
+ role = iam_backend.get_role(role_name)
+
+ template = self.response_template(GET_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def delete_role(self):
+ role_name = self._get_param("RoleName")
+ iam_backend.delete_role(role_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteRole")
+
+ def list_role_policies(self):
+ role_name = self._get_param("RoleName")
+ role_policies_names = iam_backend.list_role_policies(role_name)
+ template = self.response_template(LIST_ROLE_POLICIES)
+ return template.render(role_policies=role_policies_names)
+
+ def put_role_policy(self):
+ role_name = self._get_param("RoleName")
+ policy_name = self._get_param("PolicyName")
+ policy_document = self._get_param("PolicyDocument")
+ iam_backend.put_role_policy(role_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutRolePolicy")
+
+ def delete_role_policy(self):
+ role_name = self._get_param("RoleName")
+ policy_name = self._get_param("PolicyName")
+ iam_backend.delete_role_policy(role_name, policy_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteRolePolicy")
+
+ def get_role_policy(self):
+ role_name = self._get_param("RoleName")
+ policy_name = self._get_param("PolicyName")
+ policy_name, policy_document = iam_backend.get_role_policy(
+ role_name, policy_name
+ )
+ template = self.response_template(GET_ROLE_POLICY_TEMPLATE)
+ return template.render(
+ role_name=role_name,
+ policy_name=policy_name,
+ policy_document=policy_document,
+ )
+
+ def update_assume_role_policy(self):
+ role_name = self._get_param("RoleName")
+ role = iam_backend.get_role(role_name)
+ role.assume_role_policy_document = self._get_param("PolicyDocument")
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="UpdateAssumeRolePolicy")
+
+ def update_role_description(self):
+ role_name = self._get_param("RoleName")
+ description = self._get_param("Description")
+ role = iam_backend.update_role_description(role_name, description)
+ template = self.response_template(UPDATE_ROLE_DESCRIPTION_TEMPLATE)
+ return template.render(role=role)
+
+ def update_role(self):
+ role_name = self._get_param("RoleName")
+ description = self._get_param("Description")
+ max_session_duration = self._get_param("MaxSessionDuration", 3600)
+ role = iam_backend.update_role(role_name, description, max_session_duration)
+ template = self.response_template(UPDATE_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def put_role_permissions_boundary(self):
+ permissions_boundary = self._get_param("PermissionsBoundary")
+ role_name = self._get_param("RoleName")
+ iam_backend.put_role_permissions_boundary(role_name, permissions_boundary)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutRolePermissionsBoundary")
+
+ def delete_role_permissions_boundary(self):
+ role_name = self._get_param("RoleName")
+ iam_backend.delete_role_permissions_boundary(role_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteRolePermissionsBoundary")
+
+ def create_policy_version(self):
+ policy_arn = self._get_param("PolicyArn")
+ policy_document = self._get_param("PolicyDocument")
+ set_as_default = self._get_param("SetAsDefault")
+ policy_version = iam_backend.create_policy_version(
+ policy_arn, policy_document, set_as_default
+ )
+ template = self.response_template(CREATE_POLICY_VERSION_TEMPLATE)
+ return template.render(policy_version=policy_version)
+
+ def get_policy_version(self):
+ policy_arn = self._get_param("PolicyArn")
+ version_id = self._get_param("VersionId")
+ policy_version = iam_backend.get_policy_version(policy_arn, version_id)
+ template = self.response_template(GET_POLICY_VERSION_TEMPLATE)
+ return template.render(policy_version=policy_version)
+
+ def list_policy_versions(self):
+ policy_arn = self._get_param("PolicyArn")
+ policy_versions = iam_backend.list_policy_versions(policy_arn)
+
+ template = self.response_template(LIST_POLICY_VERSIONS_TEMPLATE)
+ return template.render(policy_versions=policy_versions)
+
+ def list_policy_tags(self):
+ policy_arn = self._get_param("PolicyArn")
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems", 100)
+
+ tags, marker = iam_backend.list_policy_tags(policy_arn, marker, max_items)
+
+ template = self.response_template(LIST_POLICY_TAG_TEMPLATE)
+ return template.render(tags=tags, marker=marker)
+
+ def tag_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ tags = self._get_multi_param("Tags.member")
+
+ iam_backend.tag_policy(policy_arn, tags)
+
+ template = self.response_template(TAG_POLICY_TEMPLATE)
+ return template.render()
+
+ def untag_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ iam_backend.untag_policy(policy_arn, tag_keys)
+
+ template = self.response_template(UNTAG_POLICY_TEMPLATE)
+ return template.render()
+
+ def delete_policy_version(self):
+ policy_arn = self._get_param("PolicyArn")
+ version_id = self._get_param("VersionId")
+
+ iam_backend.delete_policy_version(policy_arn, version_id)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeletePolicyVersion")
+
+ def create_instance_profile(self):
+ profile_name = self._get_param("InstanceProfileName")
+ path = self._get_param("Path", "/")
+ tags = self._get_multi_param("Tags.member")
+
+ profile = iam_backend.create_instance_profile(
+ profile_name, path, role_names=[], tags=tags
+ )
+ template = self.response_template(CREATE_INSTANCE_PROFILE_TEMPLATE)
+ return template.render(profile=profile)
+
+ def delete_instance_profile(self):
+ profile_name = self._get_param("InstanceProfileName")
+
+ profile = iam_backend.delete_instance_profile(profile_name)
+ template = self.response_template(DELETE_INSTANCE_PROFILE_TEMPLATE)
+ return template.render(profile=profile)
+
+ def get_instance_profile(self):
+ profile_name = self._get_param("InstanceProfileName")
+ profile = iam_backend.get_instance_profile(profile_name)
+
+ template = self.response_template(GET_INSTANCE_PROFILE_TEMPLATE)
+ return template.render(profile=profile)
+
+ def add_role_to_instance_profile(self):
+ profile_name = self._get_param("InstanceProfileName")
+ role_name = self._get_param("RoleName")
+
+ iam_backend.add_role_to_instance_profile(profile_name, role_name)
+ template = self.response_template(ADD_ROLE_TO_INSTANCE_PROFILE_TEMPLATE)
+ return template.render()
+
+ def remove_role_from_instance_profile(self):
+ profile_name = self._get_param("InstanceProfileName")
+ role_name = self._get_param("RoleName")
+
+ iam_backend.remove_role_from_instance_profile(profile_name, role_name)
+ template = self.response_template(REMOVE_ROLE_FROM_INSTANCE_PROFILE_TEMPLATE)
+ return template.render()
+
+ def list_roles(self):
+ path_prefix = self._get_param("PathPrefix", "/")
+ marker = self._get_param("Marker", "0")
+ max_items = self._get_param("MaxItems", 100)
+
+ roles, marker = iam_backend.list_roles(path_prefix, marker, max_items)
+ template = self.response_template(LIST_ROLES_TEMPLATE)
+ return template.render(roles=roles, marker=marker)
+
+ def list_instance_profiles(self):
+ profiles = iam_backend.get_instance_profiles()
+
+ template = self.response_template(LIST_INSTANCE_PROFILES_TEMPLATE)
+ return template.render(instance_profiles=profiles)
+
+ def list_instance_profiles_for_role(self):
+ role_name = self._get_param("RoleName")
+ profiles = iam_backend.get_instance_profiles_for_role(role_name=role_name)
+
+ template = self.response_template(LIST_INSTANCE_PROFILES_FOR_ROLE_TEMPLATE)
+ return template.render(instance_profiles=profiles)
+
+ def upload_server_certificate(self):
+ cert_name = self._get_param("ServerCertificateName")
+ cert_body = self._get_param("CertificateBody")
+ path = self._get_param("Path")
+ private_key = self._get_param("PrivateKey")
+ cert_chain = self._get_param("CertificateName")
+
+ cert = iam_backend.upload_server_certificate(
+ cert_name, cert_body, private_key, cert_chain=cert_chain, path=path
+ )
+ template = self.response_template(UPLOAD_CERT_TEMPLATE)
+ return template.render(certificate=cert)
+
+ def list_server_certificates(self):
+ certs = iam_backend.list_server_certificates()
+ template = self.response_template(LIST_SERVER_CERTIFICATES_TEMPLATE)
+ return template.render(server_certificates=certs)
+
+ def get_server_certificate(self):
+ cert_name = self._get_param("ServerCertificateName")
+ cert = iam_backend.get_server_certificate(cert_name)
+ template = self.response_template(GET_SERVER_CERTIFICATE_TEMPLATE)
+ return template.render(certificate=cert)
+
+ def delete_server_certificate(self):
+ cert_name = self._get_param("ServerCertificateName")
+ iam_backend.delete_server_certificate(cert_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteServerCertificate")
+
+ def create_group(self):
+ group_name = self._get_param("GroupName")
+ path = self._get_param("Path", "/")
+
+ group = iam_backend.create_group(group_name, path)
+ template = self.response_template(CREATE_GROUP_TEMPLATE)
+ return template.render(group=group)
+
+ def get_group(self):
+ group_name = self._get_param("GroupName")
+
+ group = iam_backend.get_group(group_name)
+ template = self.response_template(GET_GROUP_TEMPLATE)
+ return template.render(group=group)
+
+ def list_groups(self):
+ groups = iam_backend.list_groups()
+ template = self.response_template(LIST_GROUPS_TEMPLATE)
+ return template.render(groups=groups)
+
+ def list_groups_for_user(self):
+ user_name = self._get_param("UserName")
+
+ groups = iam_backend.get_groups_for_user(user_name)
+ template = self.response_template(LIST_GROUPS_FOR_USER_TEMPLATE)
+ return template.render(groups=groups)
+
+ def put_group_policy(self):
+ group_name = self._get_param("GroupName")
+ policy_name = self._get_param("PolicyName")
+ policy_document = self._get_param("PolicyDocument")
+ iam_backend.put_group_policy(group_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutGroupPolicy")
+
+ def list_group_policies(self):
+ group_name = self._get_param("GroupName")
+ marker = self._get_param("Marker")
+ policies = iam_backend.list_group_policies(group_name)
+ template = self.response_template(LIST_GROUP_POLICIES_TEMPLATE)
+ return template.render(
+ name="ListGroupPoliciesResponse", policies=policies, marker=marker
+ )
+
+ def get_group_policy(self):
+ group_name = self._get_param("GroupName")
+ policy_name = self._get_param("PolicyName")
+ policy_result = iam_backend.get_group_policy(group_name, policy_name)
+ template = self.response_template(GET_GROUP_POLICY_TEMPLATE)
+ return template.render(name="GetGroupPolicyResponse", **policy_result)
+
+ def delete_group_policy(self):
+ group_name = self._get_param("GroupName")
+ policy_name = self._get_param("PolicyName")
+ iam_backend.delete_group_policy(group_name, policy_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteGroupPolicy")
+
+ def delete_group(self):
+ group_name = self._get_param("GroupName")
+ iam_backend.delete_group(group_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteGroup")
+
+ def update_group(self):
+ group_name = self._get_param("GroupName")
+ new_group_name = self._get_param("NewGroupName")
+ new_path = self._get_param("NewPath")
+ iam_backend.update_group(group_name, new_group_name, new_path)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="UpdateGroup")
+
+ def create_user(self):
+ user_name = self._get_param("UserName")
+ path = self._get_param("Path")
+ tags = self._get_multi_param("Tags.member")
+ user, user_tags = iam_backend.create_user(user_name, path, tags)
+ template = self.response_template(USER_TEMPLATE)
+ return template.render(action="Create", user=user, tags=user_tags["Tags"])
+
+ def get_user(self):
+ user_name = self._get_param("UserName")
+ if not user_name:
+ access_key_id = self.get_current_user()
+ user = iam_backend.get_user_from_access_key_id(access_key_id)
+ if user is None:
+ user = User("default_user")
+ else:
+ user = iam_backend.get_user(user_name)
+ tags = iam_backend.tagger.list_tags_for_resource(user.arn).get("Tags", [])
+ template = self.response_template(USER_TEMPLATE)
+ return template.render(action="Get", user=user, tags=tags)
+
+ def list_users(self):
+ path_prefix = self._get_param("PathPrefix")
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems")
+ users = iam_backend.list_users(path_prefix, marker, max_items)
+ template = self.response_template(LIST_USERS_TEMPLATE)
+ return template.render(action="List", users=users, isTruncated=False)
+
+ def update_user(self):
+ user_name = self._get_param("UserName")
+ new_path = self._get_param("NewPath")
+ new_user_name = self._get_param("NewUserName")
+ iam_backend.update_user(user_name, new_path, new_user_name)
+ if new_user_name:
+ user = iam_backend.get_user(new_user_name)
+ else:
+ user = iam_backend.get_user(user_name)
+ template = self.response_template(USER_TEMPLATE)
+ return template.render(action="Update", user=user)
+
+ def create_login_profile(self):
+ user_name = self._get_param("UserName")
+ password = self._get_param("Password")
+ user = iam_backend.create_login_profile(user_name, password)
+
+ template = self.response_template(CREATE_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def get_login_profile(self):
+ user_name = self._get_param("UserName")
+ user = iam_backend.get_login_profile(user_name)
+
+ template = self.response_template(GET_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def update_login_profile(self):
+ user_name = self._get_param("UserName")
+ password = self._get_param("Password")
+ password_reset_required = self._get_param("PasswordResetRequired")
+ user = iam_backend.update_login_profile(
+ user_name, password, password_reset_required
+ )
+
+ template = self.response_template(UPDATE_LOGIN_PROFILE_TEMPLATE)
+ return template.render(user=user)
+
+ def add_user_to_group(self):
+ group_name = self._get_param("GroupName")
+ user_name = self._get_param("UserName")
+
+ iam_backend.add_user_to_group(group_name, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="AddUserToGroup")
+
+ def remove_user_from_group(self):
+ group_name = self._get_param("GroupName")
+ user_name = self._get_param("UserName")
+
+ iam_backend.remove_user_from_group(group_name, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="RemoveUserFromGroup")
+
+ def get_user_policy(self):
+ user_name = self._get_param("UserName")
+ policy_name = self._get_param("PolicyName")
+
+ policy_document = iam_backend.get_user_policy(user_name, policy_name)
+ template = self.response_template(GET_USER_POLICY_TEMPLATE)
+ return template.render(
+ user_name=user_name,
+ policy_name=policy_name,
+ policy_document=policy_document.get("policy_document"),
+ )
+
+ def list_user_policies(self):
+ user_name = self._get_param("UserName")
+ policies = iam_backend.list_user_policies(user_name)
+ template = self.response_template(LIST_USER_POLICIES_TEMPLATE)
+ return template.render(policies=policies)
+
+ def list_user_tags(self):
+ user_name = self._get_param("UserName")
+ tags = iam_backend.list_user_tags(user_name)
+ template = self.response_template(LIST_USER_TAGS_TEMPLATE)
+ return template.render(user_tags=tags["Tags"])
+
+ def put_user_policy(self):
+ user_name = self._get_param("UserName")
+ policy_name = self._get_param("PolicyName")
+ policy_document = self._get_param("PolicyDocument")
+
+ iam_backend.put_user_policy(user_name, policy_name, policy_document)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="PutUserPolicy")
+
+ def delete_user_policy(self):
+ user_name = self._get_param("UserName")
+ policy_name = self._get_param("PolicyName")
+
+ iam_backend.delete_user_policy(user_name, policy_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteUserPolicy")
+
+ def create_access_key(self):
+ user_name = self._get_param("UserName")
+ if not user_name:
+ access_key_id = self.get_current_user()
+ access_key = iam_backend.get_access_key_last_used(access_key_id)
+ user_name = access_key["user_name"]
+
+ key = iam_backend.create_access_key(user_name)
+ template = self.response_template(CREATE_ACCESS_KEY_TEMPLATE)
+ return template.render(key=key)
+
+ def update_access_key(self):
+ user_name = self._get_param("UserName")
+ access_key_id = self._get_param("AccessKeyId")
+ status = self._get_param("Status")
+ if not user_name:
+ access_key = iam_backend.get_access_key_last_used(access_key_id)
+ user_name = access_key["user_name"]
+
+ iam_backend.update_access_key(user_name, access_key_id, status)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="UpdateAccessKey")
+
+ def get_access_key_last_used(self):
+ access_key_id = self._get_param("AccessKeyId")
+ last_used_response = iam_backend.get_access_key_last_used(access_key_id)
+ template = self.response_template(GET_ACCESS_KEY_LAST_USED_TEMPLATE)
+ return template.render(
+ user_name=last_used_response["user_name"],
+ last_used=last_used_response["last_used"],
+ )
+
+ def list_access_keys(self):
+ user_name = self._get_param("UserName")
+ if not user_name:
+ access_key_id = self.get_current_user()
+ access_key = iam_backend.get_access_key_last_used(access_key_id)
+ user_name = access_key["user_name"]
+
+ keys = iam_backend.list_access_keys(user_name)
+ template = self.response_template(LIST_ACCESS_KEYS_TEMPLATE)
+ return template.render(user_name=user_name, keys=keys)
+
+ def delete_access_key(self):
+ user_name = self._get_param("UserName")
+ access_key_id = self._get_param("AccessKeyId")
+ if not user_name:
+ access_key = iam_backend.get_access_key_last_used(access_key_id)
+ user_name = access_key["user_name"]
+
+ iam_backend.delete_access_key(access_key_id, user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteAccessKey")
+
+ def upload_ssh_public_key(self):
+ user_name = self._get_param("UserName")
+ ssh_public_key_body = self._get_param("SSHPublicKeyBody")
+
+ key = iam_backend.upload_ssh_public_key(user_name, ssh_public_key_body)
+ template = self.response_template(UPLOAD_SSH_PUBLIC_KEY_TEMPLATE)
+ return template.render(key=key)
+
+ def get_ssh_public_key(self):
+ user_name = self._get_param("UserName")
+ ssh_public_key_id = self._get_param("SSHPublicKeyId")
+
+ key = iam_backend.get_ssh_public_key(user_name, ssh_public_key_id)
+ template = self.response_template(GET_SSH_PUBLIC_KEY_TEMPLATE)
+ return template.render(key=key)
+
+ def list_ssh_public_keys(self):
+ user_name = self._get_param("UserName")
+
+ keys = iam_backend.get_all_ssh_public_keys(user_name)
+ template = self.response_template(LIST_SSH_PUBLIC_KEYS_TEMPLATE)
+ return template.render(keys=keys)
+
+ def update_ssh_public_key(self):
+ user_name = self._get_param("UserName")
+ ssh_public_key_id = self._get_param("SSHPublicKeyId")
+ status = self._get_param("Status")
+
+ iam_backend.update_ssh_public_key(user_name, ssh_public_key_id, status)
+ template = self.response_template(UPDATE_SSH_PUBLIC_KEY_TEMPLATE)
+ return template.render()
+
+ def delete_ssh_public_key(self):
+ user_name = self._get_param("UserName")
+ ssh_public_key_id = self._get_param("SSHPublicKeyId")
+
+ iam_backend.delete_ssh_public_key(user_name, ssh_public_key_id)
+ template = self.response_template(DELETE_SSH_PUBLIC_KEY_TEMPLATE)
+ return template.render()
+
+ def deactivate_mfa_device(self):
+ user_name = self._get_param("UserName")
+ serial_number = self._get_param("SerialNumber")
+
+ iam_backend.deactivate_mfa_device(user_name, serial_number)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeactivateMFADevice")
+
+ def enable_mfa_device(self):
+ user_name = self._get_param("UserName")
+ serial_number = self._get_param("SerialNumber")
+ authentication_code_1 = self._get_param("AuthenticationCode1")
+ authentication_code_2 = self._get_param("AuthenticationCode2")
+
+ iam_backend.enable_mfa_device(
+ user_name, serial_number, authentication_code_1, authentication_code_2
+ )
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="EnableMFADevice")
+
+ def list_mfa_devices(self):
+ user_name = self._get_param("UserName")
+ devices = iam_backend.list_mfa_devices(user_name)
+ template = self.response_template(LIST_MFA_DEVICES_TEMPLATE)
+ return template.render(user_name=user_name, devices=devices)
+
+ def create_virtual_mfa_device(self):
+ path = self._get_param("Path")
+ virtual_mfa_device_name = self._get_param("VirtualMFADeviceName")
+
+ virtual_mfa_device = iam_backend.create_virtual_mfa_device(
+ virtual_mfa_device_name, path
+ )
+
+ template = self.response_template(CREATE_VIRTUAL_MFA_DEVICE_TEMPLATE)
+ return template.render(device=virtual_mfa_device)
+
+ def delete_virtual_mfa_device(self):
+ serial_number = self._get_param("SerialNumber")
+
+ iam_backend.delete_virtual_mfa_device(serial_number)
+
+ template = self.response_template(DELETE_VIRTUAL_MFA_DEVICE_TEMPLATE)
+ return template.render()
+
+ def list_virtual_mfa_devices(self):
+ assignment_status = self._get_param("AssignmentStatus", "Any")
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems", 100)
+
+ devices, marker = iam_backend.list_virtual_mfa_devices(
+ assignment_status, marker, max_items
+ )
+
+ template = self.response_template(LIST_VIRTUAL_MFA_DEVICES_TEMPLATE)
+ return template.render(devices=devices, marker=marker)
+
+ def delete_user(self):
+ user_name = self._get_param("UserName")
+ iam_backend.delete_user(user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteUser")
+
+ def delete_policy(self):
+ policy_arn = self._get_param("PolicyArn")
+ iam_backend.delete_policy(policy_arn)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeletePolicy")
+
+ def delete_login_profile(self):
+ user_name = self._get_param("UserName")
+ iam_backend.delete_login_profile(user_name)
+ template = self.response_template(GENERIC_EMPTY_TEMPLATE)
+ return template.render(name="DeleteLoginProfile")
+
+ def generate_credential_report(self):
+ if iam_backend.report_generated():
+ template = self.response_template(CREDENTIAL_REPORT_GENERATED)
+ else:
+ template = self.response_template(CREDENTIAL_REPORT_GENERATING)
+ iam_backend.generate_report()
+ return template.render()
+
+ def get_credential_report(self):
+ report = iam_backend.get_credential_report()
+ template = self.response_template(CREDENTIAL_REPORT)
+ return template.render(report=report)
+
+ def list_account_aliases(self):
+ aliases = iam_backend.list_account_aliases()
+ template = self.response_template(LIST_ACCOUNT_ALIASES_TEMPLATE)
+ return template.render(aliases=aliases)
+
+ def create_account_alias(self):
+ alias = self._get_param("AccountAlias")
+ iam_backend.create_account_alias(alias)
+ template = self.response_template(CREATE_ACCOUNT_ALIAS_TEMPLATE)
+ return template.render()
+
+ def delete_account_alias(self):
+ iam_backend.delete_account_alias()
+ template = self.response_template(DELETE_ACCOUNT_ALIAS_TEMPLATE)
+ return template.render()
+
+ def get_account_authorization_details(self):
+ filter_param = self._get_multi_param("Filter.member")
+ account_details = iam_backend.get_account_authorization_details(filter_param)
+ template = self.response_template(GET_ACCOUNT_AUTHORIZATION_DETAILS_TEMPLATE)
+ return template.render(
+ instance_profiles=account_details["instance_profiles"],
+ policies=account_details["managed_policies"],
+ users=account_details["users"],
+ groups=account_details["groups"],
+ roles=account_details["roles"],
+ get_groups_for_user=iam_backend.get_groups_for_user,
+ )
+
+ def create_saml_provider(self):
+ saml_provider_name = self._get_param("Name")
+ saml_metadata_document = self._get_param("SAMLMetadataDocument")
+ saml_provider = iam_backend.create_saml_provider(
+ saml_provider_name, saml_metadata_document
+ )
+
+ template = self.response_template(CREATE_SAML_PROVIDER_TEMPLATE)
+ return template.render(saml_provider=saml_provider)
+
+ def update_saml_provider(self):
+ saml_provider_arn = self._get_param("SAMLProviderArn")
+ saml_metadata_document = self._get_param("SAMLMetadataDocument")
+ saml_provider = iam_backend.update_saml_provider(
+ saml_provider_arn, saml_metadata_document
+ )
+
+ template = self.response_template(UPDATE_SAML_PROVIDER_TEMPLATE)
+ return template.render(saml_provider=saml_provider)
+
+ def delete_saml_provider(self):
+ saml_provider_arn = self._get_param("SAMLProviderArn")
+ iam_backend.delete_saml_provider(saml_provider_arn)
+
+ template = self.response_template(DELETE_SAML_PROVIDER_TEMPLATE)
+ return template.render()
+
+ def list_saml_providers(self):
+ saml_providers = iam_backend.list_saml_providers()
+
+ template = self.response_template(LIST_SAML_PROVIDERS_TEMPLATE)
+ return template.render(saml_providers=saml_providers)
+
+ def get_saml_provider(self):
+ saml_provider_arn = self._get_param("SAMLProviderArn")
+ saml_provider = iam_backend.get_saml_provider(saml_provider_arn)
+
+ template = self.response_template(GET_SAML_PROVIDER_TEMPLATE)
+ return template.render(saml_provider=saml_provider)
+
+ def upload_signing_certificate(self):
+ user_name = self._get_param("UserName")
+ cert_body = self._get_param("CertificateBody")
+
+ cert = iam_backend.upload_signing_certificate(user_name, cert_body)
+ template = self.response_template(UPLOAD_SIGNING_CERTIFICATE_TEMPLATE)
+ return template.render(cert=cert)
+
+ def update_signing_certificate(self):
+ user_name = self._get_param("UserName")
+ cert_id = self._get_param("CertificateId")
+ status = self._get_param("Status")
+
+ iam_backend.update_signing_certificate(user_name, cert_id, status)
+ template = self.response_template(UPDATE_SIGNING_CERTIFICATE_TEMPLATE)
+ return template.render()
+
+ def delete_signing_certificate(self):
+ user_name = self._get_param("UserName")
+ cert_id = self._get_param("CertificateId")
+
+ iam_backend.delete_signing_certificate(user_name, cert_id)
+ template = self.response_template(DELETE_SIGNING_CERTIFICATE_TEMPLATE)
+ return template.render()
+
+ def list_signing_certificates(self):
+ user_name = self._get_param("UserName")
+
+ certs = iam_backend.list_signing_certificates(user_name)
+ template = self.response_template(LIST_SIGNING_CERTIFICATES_TEMPLATE)
+ return template.render(user_name=user_name, certificates=certs)
+
+ def list_role_tags(self):
+ role_name = self._get_param("RoleName")
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems", 100)
+
+ tags, marker = iam_backend.list_role_tags(role_name, marker, max_items)
+
+ template = self.response_template(LIST_ROLE_TAG_TEMPLATE)
+ return template.render(tags=tags, marker=marker)
+
+ def tag_role(self):
+ role_name = self._get_param("RoleName")
+ tags = self._get_multi_param("Tags.member")
+
+ iam_backend.tag_role(role_name, tags)
+
+ template = self.response_template(TAG_ROLE_TEMPLATE)
+ return template.render()
+
+ def untag_role(self):
+ role_name = self._get_param("RoleName")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ iam_backend.untag_role(role_name, tag_keys)
+
+ template = self.response_template(UNTAG_ROLE_TEMPLATE)
+ return template.render()
+
+ def create_open_id_connect_provider(self):
+ open_id_provider_url = self._get_param("Url")
+ thumbprint_list = self._get_multi_param("ThumbprintList.member")
+ client_id_list = self._get_multi_param("ClientIDList.member")
+ tags = self._get_multi_param("Tags.member")
+
+ open_id_provider = iam_backend.create_open_id_connect_provider(
+ open_id_provider_url, thumbprint_list, client_id_list, tags
+ )
+
+ template = self.response_template(CREATE_OPEN_ID_CONNECT_PROVIDER_TEMPLATE)
+ return template.render(open_id_provider=open_id_provider)
+
+ def update_open_id_connect_provider_thumbprint(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+ thumbprint_list = self._get_multi_param("ThumbprintList.member")
+
+ iam_backend.update_open_id_connect_provider_thumbprint(
+ open_id_provider_arn, thumbprint_list
+ )
+
+ template = self.response_template(UPDATE_OPEN_ID_CONNECT_PROVIDER_THUMBPRINT)
+ return template.render()
+
+ def tag_open_id_connect_provider(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+ tags = self._get_multi_param("Tags.member")
+
+ iam_backend.tag_open_id_connect_provider(open_id_provider_arn, tags)
+
+ template = self.response_template(TAG_OPEN_ID_CONNECT_PROVIDER)
+ return template.render()
+
+ def untag_open_id_connect_provider(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ iam_backend.untag_open_id_connect_provider(open_id_provider_arn, tag_keys)
+
+ template = self.response_template(UNTAG_OPEN_ID_CONNECT_PROVIDER)
+ return template.render()
+
+ def list_open_id_connect_provider_tags(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+ marker = self._get_param("Marker")
+ max_items = self._get_param("MaxItems", 100)
+ tags, marker = iam_backend.list_open_id_connect_provider_tags(
+ open_id_provider_arn, marker, max_items
+ )
+ template = self.response_template(LIST_OPEN_ID_CONNECT_PROVIDER_TAGS)
+ return template.render(tags=tags, marker=marker)
+
+ def delete_open_id_connect_provider(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+
+ iam_backend.delete_open_id_connect_provider(open_id_provider_arn)
+
+ template = self.response_template(DELETE_OPEN_ID_CONNECT_PROVIDER_TEMPLATE)
+ return template.render()
+
+ def get_open_id_connect_provider(self):
+ open_id_provider_arn = self._get_param("OpenIDConnectProviderArn")
+
+ open_id_provider = iam_backend.get_open_id_connect_provider(
+ open_id_provider_arn
+ )
+
+ template = self.response_template(GET_OPEN_ID_CONNECT_PROVIDER_TEMPLATE)
+ return template.render(open_id_provider=open_id_provider)
+
+ def list_open_id_connect_providers(self):
+ open_id_provider_arns = iam_backend.list_open_id_connect_providers()
+
+ template = self.response_template(LIST_OPEN_ID_CONNECT_PROVIDERS_TEMPLATE)
+ return template.render(open_id_provider_arns=open_id_provider_arns)
+
+ def update_account_password_policy(self):
+ allow_change_password = self._get_bool_param(
+ "AllowUsersToChangePassword", False
+ )
+ hard_expiry = self._get_bool_param("HardExpiry", False)
+ max_password_age = self._get_int_param("MaxPasswordAge", 0)
+ minimum_password_length = self._get_int_param("MinimumPasswordLength", 6)
+ password_reuse_prevention = self._get_int_param("PasswordReusePrevention")
+ require_lowercase_characters = self._get_bool_param(
+ "RequireLowercaseCharacters", False
+ )
+ require_numbers = self._get_bool_param("RequireNumbers", False)
+ require_symbols = self._get_bool_param("RequireSymbols", False)
+ require_uppercase_characters = self._get_bool_param(
+ "RequireUppercaseCharacters", False
+ )
+
+ iam_backend.update_account_password_policy(
+ allow_change_password,
+ hard_expiry,
+ max_password_age,
+ minimum_password_length,
+ password_reuse_prevention,
+ require_lowercase_characters,
+ require_numbers,
+ require_symbols,
+ require_uppercase_characters,
+ )
+
+ template = self.response_template(UPDATE_ACCOUNT_PASSWORD_POLICY_TEMPLATE)
+ return template.render()
+
+ def get_account_password_policy(self):
+ account_password_policy = iam_backend.get_account_password_policy()
+
+ template = self.response_template(GET_ACCOUNT_PASSWORD_POLICY_TEMPLATE)
+ return template.render(password_policy=account_password_policy)
+
+ def delete_account_password_policy(self):
+ iam_backend.delete_account_password_policy()
+
+ template = self.response_template(DELETE_ACCOUNT_PASSWORD_POLICY_TEMPLATE)
+ return template.render()
+
+ def get_account_summary(self):
+ account_summary = iam_backend.get_account_summary()
+
+ template = self.response_template(GET_ACCOUNT_SUMMARY_TEMPLATE)
+ return template.render(summary_map=account_summary.summary_map)
+
+ def tag_user(self):
+ name = self._get_param("UserName")
+ tags = self._get_multi_param("Tags.member")
+
+ iam_backend.tag_user(name, tags)
+
+ template = self.response_template(TAG_USER_TEMPLATE)
+ return template.render()
+
+ def untag_user(self):
+ name = self._get_param("UserName")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ iam_backend.untag_user(name, tag_keys)
+
+ template = self.response_template(UNTAG_USER_TEMPLATE)
+ return template.render()
+
+ def create_service_linked_role(self):
+ service_name = self._get_param("AWSServiceName")
+ description = self._get_param("Description")
+ suffix = self._get_param("CustomSuffix")
+
+ role = iam_backend.create_service_linked_role(service_name, description, suffix)
+
+ template = self.response_template(CREATE_SERVICE_LINKED_ROLE_TEMPLATE)
+ return template.render(role=role)
+
+ def delete_service_linked_role(self):
+ role_name = self._get_param("RoleName")
+
+ deletion_task_id = iam_backend.delete_service_linked_role(role_name)
+
+ template = self.response_template(DELETE_SERVICE_LINKED_ROLE_TEMPLATE)
+ return template.render(deletion_task_id=deletion_task_id)
+
+ def get_service_linked_role_deletion_status(self):
+ iam_backend.get_service_linked_role_deletion_status()
+
+ template = self.response_template(
+ GET_SERVICE_LINKED_ROLE_DELETION_STATUS_TEMPLATE
+ )
+ return template.render()
+
+
+LIST_ENTITIES_FOR_POLICY_TEMPLATE = """<ListEntitiesForPolicyResponse>
+ <ListEntitiesForPolicyResult>
+ <PolicyRoles>
+ {% for role in roles %}
+ <member>
+ <RoleName>{{ role.name }}</RoleName>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </PolicyRoles>
+ <PolicyGroups>
+ {% for group in groups %}
+ <member>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ </member>
+ {% endfor %}
+ </PolicyGroups>
+ <IsTruncated>false</IsTruncated>
+ <PolicyUsers>
+ {% for user in users %}
+ <member>
+ <UserName>{{ user.name }}</UserName>
+ <UserId>{{ user.id }}</UserId>
+ </member>
+ {% endfor %}
+ </PolicyUsers>
+ </ListEntitiesForPolicyResult>
+ <ResponseMetadata>
+ <RequestId>eb358e22-9d1f-11e4-93eb-190ecEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListEntitiesForPolicyResponse>"""
+
+
+SET_DEFAULT_POLICY_VERSION_TEMPLATE = """<SetDefaultPolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>35f241af-3ebc-11e4-9d0d-6f969EXAMPLE</RequestId>
+ </ResponseMetadata>
+</SetDefaultPolicyVersionResponse>"""
+
+
+ATTACH_ROLE_POLICY_TEMPLATE = """<AttachRolePolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachRolePolicyResponse>"""
+
+DETACH_ROLE_POLICY_TEMPLATE = """<DetachRolePolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachRolePolicyResponse>"""
+
+ATTACH_USER_POLICY_TEMPLATE = """<AttachUserPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachUserPolicyResponse>"""
+
+DETACH_USER_POLICY_TEMPLATE = """<DetachUserPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachUserPolicyResponse>"""
+
+ATTACH_GROUP_POLICY_TEMPLATE = """<AttachGroupPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</AttachGroupPolicyResponse>"""
+
+DETACH_GROUP_POLICY_TEMPLATE = """<DetachGroupPolicyResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DetachGroupPolicyResponse>"""
+
+CREATE_POLICY_TEMPLATE = """<CreatePolicyResponse>
+ <CreatePolicyResult>
+ <Policy>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.created_iso_8601 }}</CreateDate>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <UpdateDate>{{ policy.updated_iso_8601 }}</UpdateDate>
+ <Tags>
+ {% for tag_key, tag_value in policy.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </Policy>
+ </CreatePolicyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreatePolicyResponse>"""
+
+GET_POLICY_TEMPLATE = """<GetPolicyResponse>
+ <GetPolicyResult>
+ <Policy>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <Description>{{ policy.description }}</Description>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <Path>{{ policy.path }}</Path>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.created_iso_8601 }}</CreateDate>
+ <UpdateDate>{{ policy.updated_iso_8601 }}</UpdateDate>
+ {% if policy.tags %}
+ <Tags>
+ {% for tag in policy.get_tags() %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ {% endif %}
+ </Policy>
+ </GetPolicyResult>
+ <ResponseMetadata>
+ <RequestId>684f0917-3d22-11e4-a4a0-cffb9EXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetPolicyResponse>"""
+
+LIST_ATTACHED_ROLE_POLICIES_TEMPLATE = """<ListAttachedRolePoliciesResponse>
+ <ListAttachedRolePoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedRolePoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedRolePoliciesResponse>"""
+
+LIST_ATTACHED_GROUP_POLICIES_TEMPLATE = """<ListAttachedGroupPoliciesResponse>
+ <ListAttachedGroupPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedGroupPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedGroupPoliciesResponse>"""
+
+LIST_ATTACHED_USER_POLICIES_TEMPLATE = """<ListAttachedUserPoliciesResponse>
+ <ListAttachedUserPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <AttachedPolicies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <PolicyArn>{{ policy.arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedPolicies>
+ </ListAttachedUserPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAttachedUserPoliciesResponse>"""
+
+LIST_POLICIES_TEMPLATE = """<ListPoliciesResponse>
+ <ListPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Policies>
+ {% for policy in policies %}
+ <member>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>{{ policy.attachment_count }}</AttachmentCount>
+ <CreateDate>{{ policy.created_iso_8601 }}</CreateDate>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <UpdateDate>{{ policy.updated_iso_8601 }}</UpdateDate>
+ </member>
+ {% endfor %}
+ </Policies>
+ </ListPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListPoliciesResponse>"""
+
+GENERIC_EMPTY_TEMPLATE = """<{{ name }}Response>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ name }}Response>"""
+
+CREATE_INSTANCE_PROFILE_TEMPLATE = """<CreateInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateInstanceProfileResult>
+ <InstanceProfile>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>{{ profile.created_iso_8601 }}</CreateDate>
+ <Tags>
+ {% for tag_key, tag_value in profile.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </InstanceProfile>
+ </CreateInstanceProfileResult>
+ <ResponseMetadata>
+ <RequestId>974142ee-99f1-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</CreateInstanceProfileResponse>"""
+
+DELETE_INSTANCE_PROFILE_TEMPLATE = """<DeleteInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>786dff92-6cfd-4fa4-b1eb-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</DeleteInstanceProfileResponse>"""
+
+GET_INSTANCE_PROFILE_TEMPLATE = """<GetInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetInstanceProfileResult>
+ <InstanceProfile>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>{{ profile.created_iso_8601 }}</CreateDate>
+ <Tags>
+ {% for tag_key, tag_value in profile.tags.items() %}
+ <member>
+ <Key>{{ tag_key }}</Key>
+ <Value>{{ tag_value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </InstanceProfile>
+ </GetInstanceProfileResult>
+ <ResponseMetadata>
+ <RequestId>37289fda-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</GetInstanceProfileResponse>"""
+
+CREATE_ROLE_TEMPLATE = """<CreateRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateRoleResult>
+ {{ role.to_xml() }}
+ </CreateRoleResult>
+ <ResponseMetadata>
+ <RequestId>4a93ceee-9966-11e1-b624-b1aEXAMPLE7c</RequestId>
+ </ResponseMetadata>
+</CreateRoleResponse>"""
+
+GET_ROLE_POLICY_TEMPLATE = """<GetRolePolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<GetRolePolicyResult>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <RoleName>{{ role_name }}</RoleName>
+ <PolicyDocument>{{ policy_document }}</PolicyDocument>
+</GetRolePolicyResult>
+<ResponseMetadata>
+ <RequestId>7e7cd8bc-99ef-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</GetRolePolicyResponse>"""
+
+CREATE_SERVICE_LINKED_ROLE_TEMPLATE = """<CreateServiceLinkedRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateServiceLinkedRoleResult>
+ {{ role.to_xml() }}
+ </CreateServiceLinkedRoleResult>
+ <ResponseMetadata>
+ <RequestId>4a93ceee-9966-11e1-b624-b1aEXAMPLE7c</RequestId>
+ </ResponseMetadata>
+</CreateServiceLinkedRoleResponse>"""
+
+DELETE_SERVICE_LINKED_ROLE_TEMPLATE = """<DeleteServiceLinkedRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <DeleteServiceLinkedRoleResult>
+ <DeletionTaskId>{{ deletion_task_id }}</DeletionTaskId>
+ </DeleteServiceLinkedRoleResult>
+ <ResponseMetadata>
+ <RequestId>4a93ceee-9966-11e1-b624-b1aEXAMPLE7c</RequestId>
+ </ResponseMetadata>
+</DeleteServiceLinkedRoleResponse>"""
+
+GET_SERVICE_LINKED_ROLE_DELETION_STATUS_TEMPLATE = """<GetServiceLinkedRoleDeletionStatusResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetServiceLinkedRoleDeletionStatusResult>
+ <Status>SUCCEEDED</Status>
+ </GetServiceLinkedRoleDeletionStatusResult>
+ <ResponseMetadata>
+ <RequestId>4a93ceee-9966-11e1-b624-b1aEXAMPLE7c</RequestId>
+ </ResponseMetadata>
+</GetServiceLinkedRoleDeletionStatusResponse>"""
+
+UPDATE_ROLE_TEMPLATE = """<UpdateRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <UpdateRoleResult>
+ </UpdateRoleResult>
+ <ResponseMetadata>
+ <RequestId>df37e965-9967-11e1-a4c3-270EXAMPLE04</RequestId>
+ </ResponseMetadata>
+</UpdateRoleResponse>"""
+
+UPDATE_ROLE_DESCRIPTION_TEMPLATE = """<UpdateRoleDescriptionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <UpdateRoleDescriptionResult>
+ {{ role.to_xml() }}
+ </UpdateRoleDescriptionResult>
+ <ResponseMetadata>
+ <RequestId>df37e965-9967-11e1-a4c3-270EXAMPLE04</RequestId>
+ </ResponseMetadata>
+</UpdateRoleDescriptionResponse>"""
+
+GET_ROLE_TEMPLATE = """<GetRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetRoleResult>
+ {{ role.to_xml() }}
+ </GetRoleResult>
+ <ResponseMetadata>
+ <RequestId>df37e965-9967-11e1-a4c3-270EXAMPLE04</RequestId>
+ </ResponseMetadata>
+</GetRoleResponse>"""
+
+ADD_ROLE_TO_INSTANCE_PROFILE_TEMPLATE = """<AddRoleToInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>12657608-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</AddRoleToInstanceProfileResponse>"""
+
+REMOVE_ROLE_FROM_INSTANCE_PROFILE_TEMPLATE = """<RemoveRoleFromInstanceProfileResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>12657608-99f2-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</RemoveRoleFromInstanceProfileResponse>"""
+
+LIST_ROLES_TEMPLATE = """<ListRolesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListRolesResult>
+ <IsTruncated>{{ 'true' if marker else 'false' }}</IsTruncated>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Roles>
+ {% for role in roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ <MaxSessionDuration>{{ role.max_session_duration }}</MaxSessionDuration>
+ {% if role.permissions_boundary %}
+ <PermissionsBoundary>
+ <PermissionsBoundaryType>PermissionsBoundaryPolicy</PermissionsBoundaryType>
+ <PermissionsBoundaryArn>{{ role.permissions_boundary }}</PermissionsBoundaryArn>
+ </PermissionsBoundary>
+ {% endif %}
+ {% if role.description is not none %}
+ <Description>{{ role.description_escaped }}</Description>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Roles>
+ </ListRolesResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListRolesResponse>"""
+
+LIST_ROLE_POLICIES = """<ListRolePoliciesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListRolePoliciesResult>
+ <PolicyNames>
+ {% for policy_name in role_policies %}
+ <member>{{ policy_name }}</member>
+ {% endfor %}
+ </PolicyNames>
+ <IsTruncated>false</IsTruncated>
+</ListRolePoliciesResult>
+<ResponseMetadata>
+ <RequestId>8c7e1816-99f0-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</ListRolePoliciesResponse>"""
+
+CREATE_POLICY_VERSION_TEMPLATE = """<CreatePolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreatePolicyVersionResult>
+ <PolicyVersion>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default | lower }}</IsDefaultVersion>
+ <CreateDate>{{ policy_version.created_iso_8601 }}</CreateDate>
+ </PolicyVersion>
+ </CreatePolicyVersionResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</CreatePolicyVersionResponse>"""
+
+GET_POLICY_VERSION_TEMPLATE = """<GetPolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetPolicyVersionResult>
+ <PolicyVersion>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default | lower }}</IsDefaultVersion>
+ <CreateDate>{{ policy_version.created_iso_8601 }}</CreateDate>
+ </PolicyVersion>
+ </GetPolicyVersionResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</GetPolicyVersionResponse>"""
+
+LIST_POLICY_VERSIONS_TEMPLATE = """<ListPolicyVersionsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListPolicyVersionsResult>
+ <IsTruncated>false</IsTruncated>
+ <Versions>
+ {% for policy_version in policy_versions %}
+ <member>
+ <Document>{{ policy_version.document }}</Document>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <IsDefaultVersion>{{ policy_version.is_default | lower }}</IsDefaultVersion>
+ <CreateDate>{{ policy_version.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </Versions>
+ </ListPolicyVersionsResult>
+ <ResponseMetadata>
+ <RequestId>20f7279f-99ee-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListPolicyVersionsResponse>"""
+
+LIST_INSTANCE_PROFILES_TEMPLATE = """<ListInstanceProfilesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListInstanceProfilesResult>
+ <IsTruncated>false</IsTruncated>
+ <InstanceProfiles>
+ {% for instance in instance_profiles %}
+ <member>
+ <InstanceProfileId>{{ instance.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in instance.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ instance.name }}</InstanceProfileName>
+ <Path>{{ instance.path }}</Path>
+ <Arn>{{ instance.arn }}</Arn>
+ <CreateDate>{{ instance.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfiles>
+ </ListInstanceProfilesResult>
+ <ResponseMetadata>
+ <RequestId>fd74fa8d-99f3-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</ListInstanceProfilesResponse>"""
+
+UPLOAD_CERT_TEMPLATE = """<UploadServerCertificateResponse>
+ <UploadServerCertificateResult>
+ <ServerCertificateMetadata>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </ServerCertificateMetadata>
+ </UploadServerCertificateResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UploadServerCertificateResponse>"""
+
+LIST_SERVER_CERTIFICATES_TEMPLATE = """<ListServerCertificatesResponse>
+ <ListServerCertificatesResult>
+ <IsTruncated>false</IsTruncated>
+ <ServerCertificateMetadataList>
+ {% for certificate in server_certificates %}
+ <member>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </member>
+ {% endfor %}
+ </ServerCertificateMetadataList>
+ </ListServerCertificatesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListServerCertificatesResponse>"""
+
+GET_SERVER_CERTIFICATE_TEMPLATE = """<GetServerCertificateResponse>
+ <GetServerCertificateResult>
+ <ServerCertificate>
+ <ServerCertificateMetadata>
+ <ServerCertificateName>{{ certificate.cert_name }}</ServerCertificateName>
+ {% if certificate.path %}
+ <Path>{{ certificate.path }}</Path>
+ {% endif %}
+ <Arn>{{ certificate.arn }}</Arn>
+ <UploadDate>2010-05-08T01:02:03.004Z</UploadDate>
+ <ServerCertificateId>ASCACKCEVSQ6C2EXAMPLE</ServerCertificateId>
+ <Expiration>2012-05-08T01:02:03.004Z</Expiration>
+ </ServerCertificateMetadata>
+ <CertificateBody>{{ certificate.cert_body }}</CertificateBody>
+ </ServerCertificate>
+ </GetServerCertificateResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetServerCertificateResponse>"""
+
+CREATE_GROUP_TEMPLATE = """<CreateGroupResponse>
+ <CreateGroupResult>
+ <Group>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.created_iso_8601 }}</CreateDate>
+ </Group>
+ </CreateGroupResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateGroupResponse>"""
+
+GET_GROUP_TEMPLATE = """<GetGroupResponse>
+ <GetGroupResult>
+ <Group>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.created_iso_8601 }}</CreateDate>
+ </Group>
+ <Users>
+ {% for user in group.users %}
+ <member>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <UserId>{{ user.id }}</UserId>
+ <Arn>{{ user.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Users>
+ <IsTruncated>false</IsTruncated>
+ </GetGroupResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetGroupResponse>"""
+
+LIST_GROUPS_TEMPLATE = """<ListGroupsResponse>
+ <ListGroupsResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsResponse>"""
+
+LIST_GROUPS_FOR_USER_TEMPLATE = """<ListGroupsForUserResponse>
+ <ListGroupsForUserResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsForUserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsForUserResponse>"""
+
+LIST_GROUP_POLICIES_TEMPLATE = """<ListGroupPoliciesResponse>
+ <ListGroupPoliciesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <PolicyNames>
+ {% for policy in policies %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </PolicyNames>
+ </ListGroupPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupPoliciesResponse>"""
+
+GET_GROUP_POLICY_TEMPLATE = """<GetGroupPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<GetGroupPolicyResult>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <GroupName>{{ group_name }}</GroupName>
+ <PolicyDocument>{{ policy_document }}</PolicyDocument>
+</GetGroupPolicyResult>
+<ResponseMetadata>
+ <RequestId>7e7cd8bc-99ef-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</GetGroupPolicyResponse>"""
+
+USER_TEMPLATE = """<{{ action }}UserResponse>
+ <{{ action }}UserResult>
+ <User>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <UserId>{{ user.id }}</UserId>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ <Arn>{{ user.arn }}</Arn>
+ {% if tags %}
+ <Tags>
+ {% for tag in tags %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ {% endif %}
+ </User>
+ </{{ action }}UserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ action }}UserResponse>"""
+
+LIST_USERS_TEMPLATE = """<{{ action }}UsersResponse>
+ <{{ action }}UsersResult>
+ <IsTruncated>{{ isTruncated }}</IsTruncated>
+ <Users>
+ {% for user in users %}
+ <member>
+ <UserId>{{ user.id }}</UserId>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ <Arn>{{ user.arn }}</Arn>
+ </member>
+ {% endfor %}
+ </Users>
+ </{{ action }}UsersResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</{{ action }}UsersResponse>"""
+
+CREATE_LOGIN_PROFILE_TEMPLATE = """<CreateLoginProfileResponse>
+ <CreateLoginProfileResult>
+ <LoginProfile>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ </LoginProfile>
+ </CreateLoginProfileResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateLoginProfileResponse>
+"""
+
+GET_LOGIN_PROFILE_TEMPLATE = """<GetLoginProfileResponse>
+ <GetLoginProfileResult>
+ <LoginProfile>
+ <UserName>{{ user.name }}</UserName>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ {% if user.password_reset_required %}
+ <PasswordResetRequired>true</PasswordResetRequired>
+ {% endif %}
+ </LoginProfile>
+ </GetLoginProfileResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetLoginProfileResponse>
+"""
+
+UPDATE_LOGIN_PROFILE_TEMPLATE = """<UpdateLoginProfileResponse>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateLoginProfileResponse>
+"""
+
+GET_USER_POLICY_TEMPLATE = """<GetUserPolicyResponse>
+ <GetUserPolicyResult>
+ <UserName>{{ user_name }}</UserName>
+ <PolicyName>{{ policy_name }}</PolicyName>
+ <PolicyDocument>
+ {{ policy_document }}
+ </PolicyDocument>
+ </GetUserPolicyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetUserPolicyResponse>"""
+
+LIST_USER_POLICIES_TEMPLATE = """<ListUserPoliciesResponse>
+ <ListUserPoliciesResult>
+ <PolicyNames>
+ {% for policy in policies %}
+ <member>{{ policy }}</member>
+ {% endfor %}
+ </PolicyNames>
+ <IsTruncated>false</IsTruncated>
+ </ListUserPoliciesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListUserPoliciesResponse>"""
+
+LIST_USER_TAGS_TEMPLATE = """<ListUserTagsResponse>
+ <ListUserTagsResult>
+ <Tags>
+ {% for tag in user_tags %}
+ <member>
+ <Key>{{ tag.Key }}</Key>
+ <Value>{{ tag.Value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ <IsTruncated>false</IsTruncated>
+ </ListUserTagsResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListUserTagsResponse>"""
+
+CREATE_ACCESS_KEY_TEMPLATE = """<CreateAccessKeyResponse>
+ <CreateAccessKeyResult>
+ <AccessKey>
+ <UserName>{{ key.user_name }}</UserName>
+ <AccessKeyId>{{ key.access_key_id }}</AccessKeyId>
+ <Status>{{ key.status }}</Status>
+ <SecretAccessKey>{{ key.secret_access_key }}</SecretAccessKey>
+ <CreateDate>{{ key.created_iso_8601 }}</CreateDate>
+ </AccessKey>
+ </CreateAccessKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateAccessKeyResponse>"""
+
+LIST_ACCESS_KEYS_TEMPLATE = """<ListAccessKeysResponse>
+ <ListAccessKeysResult>
+ <UserName>{{ user_name }}</UserName>
+ <AccessKeyMetadata>
+ {% for key in keys %}
+ <member>
+ <UserName>{{ user_name }}</UserName>
+ <AccessKeyId>{{ key.access_key_id }}</AccessKeyId>
+ <Status>{{ key.status }}</Status>
+ <CreateDate>{{ key.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </AccessKeyMetadata>
+ <IsTruncated>false</IsTruncated>
+ </ListAccessKeysResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListAccessKeysResponse>"""
+
+
+GET_ACCESS_KEY_LAST_USED_TEMPLATE = """
+<GetAccessKeyLastUsedResponse>
+ <GetAccessKeyLastUsedResult>
+ <UserName>{{ user_name }}</UserName>
+ <AccessKeyLastUsed>
+ {% if last_used %}
+ <LastUsedDate>{{ last_used }}</LastUsedDate>
+ {% endif %}
+ <ServiceName>N/A</ServiceName>
+ <Region>N/A</Region>
+ </AccessKeyLastUsed>
+ </GetAccessKeyLastUsedResult>
+</GetAccessKeyLastUsedResponse>
+"""
+
+UPLOAD_SSH_PUBLIC_KEY_TEMPLATE = """<UploadSSHPublicKeyResponse>
+ <UploadSSHPublicKeyResult>
+ <SSHPublicKey>
+ <UserName>{{ key.user_name }}</UserName>
+ <SSHPublicKeyBody>{{ key.ssh_public_key_body }}</SSHPublicKeyBody>
+ <SSHPublicKeyId>{{ key.ssh_public_key_id }}</SSHPublicKeyId>
+ <Fingerprint>{{ key.fingerprint }}</Fingerprint>
+ <Status>{{ key.status }}</Status>
+ <UploadDate>{{ key.uploaded_iso_8601 }}</UploadDate>
+ </SSHPublicKey>
+ </UploadSSHPublicKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UploadSSHPublicKeyResponse>"""
+
+GET_SSH_PUBLIC_KEY_TEMPLATE = """<GetSSHPublicKeyResponse>
+ <GetSSHPublicKeyResult>
+ <SSHPublicKey>
+ <UserName>{{ key.user_name }}</UserName>
+ <SSHPublicKeyBody>{{ key.ssh_public_key_body }}</SSHPublicKeyBody>
+ <SSHPublicKeyId>{{ key.ssh_public_key_id }}</SSHPublicKeyId>
+ <Fingerprint>{{ key.fingerprint }}</Fingerprint>
+ <Status>{{ key.status }}</Status>
+ <UploadDate>{{ key.uploaded_iso_8601 }}</UploadDate>
+ </SSHPublicKey>
+ </GetSSHPublicKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetSSHPublicKeyResponse>"""
+
+LIST_SSH_PUBLIC_KEYS_TEMPLATE = """<ListSSHPublicKeysResponse>
+ <ListSSHPublicKeysResult>
+ <SSHPublicKeys>
+ {% for key in keys %}
+ <member>
+ <UserName>{{ key.user_name }}</UserName>
+ <SSHPublicKeyId>{{ key.ssh_public_key_id }}</SSHPublicKeyId>
+ <Status>{{ key.status }}</Status>
+ <UploadDate>{{ key.uploaded_iso_8601 }}</UploadDate>
+ </member>
+ {% endfor %}
+ </SSHPublicKeys>
+ <IsTruncated>false</IsTruncated>
+ </ListSSHPublicKeysResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListSSHPublicKeysResponse>"""
+
+UPDATE_SSH_PUBLIC_KEY_TEMPLATE = """<UpdateSSHPublicKeyResponse>
+ <UpdateSSHPublicKeyResult>
+ </UpdateSSHPublicKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateSSHPublicKeyResponse>"""
+
+DELETE_SSH_PUBLIC_KEY_TEMPLATE = """<DeleteSSHPublicKeyResponse>
+ <DeleteSSHPublicKeyResult>
+ </DeleteSSHPublicKeyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteSSHPublicKeyResponse>"""
+
+CREDENTIAL_REPORT_GENERATING = """
+<GenerateCredentialReportResponse>
+ <GenerateCredentialReportResult>
+ <State>STARTED</State>
+ <Description>No report exists. Starting a new report generation task</Description>
+ </GenerateCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GenerateCredentialReportResponse>"""
+
+
+CREDENTIAL_REPORT_GENERATED = """<GenerateCredentialReportResponse>
+ <GenerateCredentialReportResult>
+ <State>COMPLETE</State>
+ </GenerateCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GenerateCredentialReportResponse>"""
+
+
+CREDENTIAL_REPORT = """<GetCredentialReportResponse>
+ <GetCredentialReportResult>
+ <Content>{{ report }}</Content>
+ <GeneratedTime>2015-02-02T20:02:02Z</GeneratedTime>
+ <ReportFormat>text/csv</ReportFormat>
+ </GetCredentialReportResult>
+ <ResponseMetadata>
+ <RequestId>fa788a82-aa8a-11e4-a278-1786c418872b"</RequestId>
+ </ResponseMetadata>
+</GetCredentialReportResponse>"""
+
+
+LIST_INSTANCE_PROFILES_FOR_ROLE_TEMPLATE = """<ListInstanceProfilesForRoleResponse>
+<ListInstanceProfilesForRoleResult>
+ <IsTruncated>false</IsTruncated>
+ <InstanceProfiles>
+ {% for profile in instance_profiles %}
+ <member>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>{{ profile.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfiles>
+</ListInstanceProfilesForRoleResult>
+<ResponseMetadata>
+ <RequestId>6a8c3992-99f4-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</ListInstanceProfilesForRoleResponse>"""
+
+
+LIST_MFA_DEVICES_TEMPLATE = """<ListMFADevicesResponse>
+ <ListMFADevicesResult>
+ <MFADevices>
+ {% for device in devices %}
+ <member>
+ <UserName>{{ user_name }}</UserName>
+ <SerialNumber>{{ device.serial_number }}</SerialNumber>
+ </member>
+ {% endfor %}
+ </MFADevices>
+ <IsTruncated>false</IsTruncated>
+ </ListMFADevicesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListMFADevicesResponse>"""
+
+
+CREATE_VIRTUAL_MFA_DEVICE_TEMPLATE = """<CreateVirtualMFADeviceResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateVirtualMFADeviceResult>
+ <VirtualMFADevice>
+ <SerialNumber>{{ device.serial_number }}</SerialNumber>
+ <Base32StringSeed>{{ device.base32_string_seed }}</Base32StringSeed>
+ <QRCodePNG>{{ device.qr_code_png }}</QRCodePNG>
+ </VirtualMFADevice>
+ </CreateVirtualMFADeviceResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateVirtualMFADeviceResponse>"""
+
+
+DELETE_VIRTUAL_MFA_DEVICE_TEMPLATE = """<DeleteVirtualMFADeviceResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteVirtualMFADeviceResponse>"""
+
+
+LIST_VIRTUAL_MFA_DEVICES_TEMPLATE = """<ListVirtualMFADevicesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListVirtualMFADevicesResult>
+ {% if marker is none %}
+ <IsTruncated>false</IsTruncated>
+ {% else %}
+ <IsTruncated>true</IsTruncated>
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <VirtualMFADevices>
+ {% for device in devices %}
+ <member>
+ <SerialNumber>{{ device.serial_number }}</SerialNumber>
+ {% if device.enable_date %}
+ <EnableDate>{{ device.enabled_iso_8601 }}</EnableDate>
+ {% endif %}
+ {% if device.user_attribute %}
+ <User>
+ <Path>{{ device.user_attribute.Path }}</Path>
+ <UserName>{{ device.user_attribute.UserName }}</UserName>
+ <UserId>{{ device.user_attribute.UserId }}</UserId>
+ <CreateDate>{{ device.user_attribute.CreateDate }}</CreateDate>
+ <Arn>{{ device.user_attribute.Arn }}</Arn>
+ {% if device.user_attribute.Tags %}
+ <Tags>
+ {% for tag in device.user_attribute.Tags %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ {% endif %}
+ </User>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </VirtualMFADevices>
+</ListVirtualMFADevicesResult>
+<ResponseMetadata>
+ <RequestId>b61ce1b1-0401-11e1-b2f8-2dEXAMPLEbfc</RequestId>
+</ResponseMetadata>
+</ListVirtualMFADevicesResponse>"""
+
+
+LIST_ACCOUNT_ALIASES_TEMPLATE = """<ListAccountAliasesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListAccountAliasesResult>
+ <IsTruncated>false</IsTruncated>
+ <AccountAliases>
+ {% for alias in aliases %}
+ <member>{{ alias }}</member>
+ {% endfor %}
+ </AccountAliases>
+</ListAccountAliasesResult>
+<ResponseMetadata>
+ <RequestId>c5a076e9-f1b0-11df-8fbe-45274EXAMPLE</RequestId>
+</ResponseMetadata>
+</ListAccountAliasesResponse>"""
+
+
+CREATE_ACCOUNT_ALIAS_TEMPLATE = """<CreateAccountAliasResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>36b5db08-f1b0-11df-8fbe-45274EXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateAccountAliasResponse>"""
+
+
+DELETE_ACCOUNT_ALIAS_TEMPLATE = """<DeleteAccountAliasResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteAccountAliasResponse>"""
+
+
+LIST_GROUPS_FOR_USER_TEMPLATE = """<ListGroupsForUserResponse>
+ <ListGroupsForUserResult>
+ <Groups>
+ {% for group in groups %}
+ <member>
+ <Path>{{ group.path }}</Path>
+ <GroupName>{{ group.name }}</GroupName>
+ <GroupId>{{ group.id }}</GroupId>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </Groups>
+ <IsTruncated>false</IsTruncated>
+ </ListGroupsForUserResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListGroupsForUserResponse>"""
+
+
+GET_ACCOUNT_AUTHORIZATION_DETAILS_TEMPLATE = """<GetAccountAuthorizationDetailsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetAccountAuthorizationDetailsResult>
+ <IsTruncated>false</IsTruncated>
+ <UserDetailList>
+ {% for user in users %}
+ <member>
+ <GroupList>
+ {% for group in get_groups_for_user(user.name) %}
+ <member>{{ group.name }}</member>
+ {% endfor %}
+ </GroupList>
+ <AttachedManagedPolicies>
+ {% for policy in user.managed_policies %}
+ <member>
+ <PolicyName>{{ user.managed_policies[policy].name }}</PolicyName>
+ <PolicyArn>{{ policy }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedManagedPolicies>
+ <UserId>{{ user.id }}</UserId>
+ <Path>{{ user.path }}</Path>
+ <UserName>{{ user.name }}</UserName>
+ <Arn>{{ user.arn }}</Arn>
+ <CreateDate>{{ user.created_iso_8601 }}</CreateDate>
+ {% if user.policies %}
+ <UserPolicyList>
+ {% for policy in user.policies %}
+ <member>
+ <PolicyName>{{ policy }}</PolicyName>
+ <PolicyDocument>{{ user.policies[policy] }}</PolicyDocument>
+ </member>
+ {% endfor %}
+ </UserPolicyList>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </UserDetailList>
+ <GroupDetailList>
+ {% for group in groups %}
+ <member>
+ <GroupId>{{ group.id }}</GroupId>
+ <AttachedManagedPolicies>
+ {% for policy_arn in group.managed_policies %}
+ <member>
+ <PolicyName>{{ group.managed_policies[policy_arn].name }}</PolicyName>
+ <PolicyArn>{{ policy_arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedManagedPolicies>
+ <GroupName>{{ group.name }}</GroupName>
+ <Path>{{ group.path }}</Path>
+ <Arn>{{ group.arn }}</Arn>
+ <CreateDate>{{ group.created_iso_8601 }}</CreateDate>
+ <GroupPolicyList>
+ {% for policy in group.policies %}
+ <member>
+ <PolicyName>{{ policy }}</PolicyName>
+ <PolicyDocument>{{ group.policies[policy] }}</PolicyDocument>
+ </member>
+ {% endfor %}
+ </GroupPolicyList>
+ </member>
+ {% endfor %}
+ </GroupDetailList>
+ <RoleDetailList>
+ {% for role in roles %}
+ <member>
+ <RolePolicyList>
+ {% for inline_policy in role.policies %}
+ <member>
+ <PolicyName>{{ inline_policy }}</PolicyName>
+ <PolicyDocument>{{ role.policies[inline_policy] }}</PolicyDocument>
+ </member>
+ {% endfor %}
+ </RolePolicyList>
+ <AttachedManagedPolicies>
+ {% for policy_arn in role.managed_policies %}
+ <member>
+ <PolicyName>{{ role.managed_policies[policy_arn].name }}</PolicyName>
+ <PolicyArn>{{ policy_arn }}</PolicyArn>
+ </member>
+ {% endfor %}
+ </AttachedManagedPolicies>
+ <Tags>
+ {% for tag in role.get_tags() %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ <InstanceProfileList>
+ {% for profile in instance_profiles %}
+ <member>
+ <InstanceProfileId>{{ profile.id }}</InstanceProfileId>
+ <Roles>
+ {% for role in profile.roles %}
+ <member>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ {% if role.description is not none %}
+ <Description>{{ role.description_escaped }}</Description>
+ {% endif %}
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ {% if role.permissions_boundary %}
+ <PermissionsBoundary>
+ <PermissionsBoundaryType>PermissionsBoundaryPolicy</PermissionsBoundaryType>
+ <PermissionsBoundaryArn>{{ role.permissions_boundary }}</PermissionsBoundaryArn>
+ </PermissionsBoundary>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Roles>
+ <InstanceProfileName>{{ profile.name }}</InstanceProfileName>
+ <Path>{{ profile.path }}</Path>
+ <Arn>{{ profile.arn }}</Arn>
+ <CreateDate>{{ profile.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </InstanceProfileList>
+ <Path>{{ role.path }}</Path>
+ <Arn>{{ role.arn }}</Arn>
+ <RoleName>{{ role.name }}</RoleName>
+ <AssumeRolePolicyDocument>{{ role.assume_role_policy_document }}</AssumeRolePolicyDocument>
+ <CreateDate>{{ role.created_iso_8601 }}</CreateDate>
+ <RoleId>{{ role.id }}</RoleId>
+ </member>
+ {% endfor %}
+ </RoleDetailList>
+ <Policies>
+ {% for policy in policies %}
+ <member>
+ <PolicyName>{{ policy.name }}</PolicyName>
+ <DefaultVersionId>{{ policy.default_version_id }}</DefaultVersionId>
+ <PolicyId>{{ policy.id }}</PolicyId>
+ <Path>{{ policy.path }}</Path>
+ <PolicyVersionList>
+ {% for policy_version in policy.versions %}
+ <member>
+ <Document>{{ policy_version.document }}</Document>
+ <IsDefaultVersion>{{ policy_version.is_default | lower }}</IsDefaultVersion>
+ <VersionId>{{ policy_version.version_id }}</VersionId>
+ <CreateDate>{{ policy_version.created_iso_8601 }}</CreateDate>
+ </member>
+ {% endfor %}
+ </PolicyVersionList>
+ <Arn>{{ policy.arn }}</Arn>
+ <AttachmentCount>1</AttachmentCount>
+ <CreateDate>{{ policy.created_iso_8601 }}</CreateDate>
+ <IsAttachable>true</IsAttachable>
+ <UpdateDate>{{ policy.updated_iso_8601 }}</UpdateDate>
+ </member>
+ {% endfor %}
+ </Policies>
+ </GetAccountAuthorizationDetailsResult>
+ <ResponseMetadata>
+ <RequestId>92e79ae7-7399-11e4-8c85-4b53eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetAccountAuthorizationDetailsResponse>"""
+
+CREATE_SAML_PROVIDER_TEMPLATE = """<CreateSAMLProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateSAMLProviderResult>
+ <SAMLProviderArn>{{ saml_provider.arn }}</SAMLProviderArn>
+ </CreateSAMLProviderResult>
+ <ResponseMetadata>
+ <RequestId>29f47818-99f5-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</CreateSAMLProviderResponse>"""
+
+LIST_SAML_PROVIDERS_TEMPLATE = """<ListSAMLProvidersResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<ListSAMLProvidersResult>
+ <SAMLProviderList>
+ {% for saml_provider in saml_providers %}
+ <member>
+ <Arn>{{ saml_provider.arn }}</Arn>
+ <ValidUntil>2032-05-09T16:27:11Z</ValidUntil>
+ <CreateDate>2012-05-09T16:27:03Z</CreateDate>
+ </member>
+ {% endfor %}
+ </SAMLProviderList>
+</ListSAMLProvidersResult>
+<ResponseMetadata>
+ <RequestId>fd74fa8d-99f3-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</ListSAMLProvidersResponse>"""
+
+GET_SAML_PROVIDER_TEMPLATE = """<GetSAMLProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<GetSAMLProviderResult>
+ <CreateDate>2012-05-09T16:27:11Z</CreateDate>
+ <ValidUntil>2015-12-31T21:59:59Z</ValidUntil>
+ <SAMLMetadataDocument>{{ saml_provider.saml_metadata_document }}</SAMLMetadataDocument>
+</GetSAMLProviderResult>
+<ResponseMetadata>
+ <RequestId>29f47818-99f5-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</GetSAMLProviderResponse>"""
+
+DELETE_SAML_PROVIDER_TEMPLATE = """<DeleteSAMLProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>c749ee7f-99ef-11e1-a4c3-27EXAMPLE804</RequestId>
+ </ResponseMetadata>
+</DeleteSAMLProviderResponse>"""
+
+UPDATE_SAML_PROVIDER_TEMPLATE = """<UpdateSAMLProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+<UpdateSAMLProviderResult>
+ <SAMLProviderArn>{{ saml_provider.arn }}</SAMLProviderArn>
+</UpdateSAMLProviderResult>
+<ResponseMetadata>
+ <RequestId>29f47818-99f5-11e1-a4c3-27EXAMPLE804</RequestId>
+</ResponseMetadata>
+</UpdateSAMLProviderResponse>"""
+
+UPLOAD_SIGNING_CERTIFICATE_TEMPLATE = """<UploadSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <UploadSigningCertificateResult>
+ <Certificate>
+ <UserName>{{ cert.user_name }}</UserName>
+ <CertificateId>{{ cert.id }}</CertificateId>
+ <CertificateBody>{{ cert.body }}</CertificateBody>
+ <Status>{{ cert.status }}</Status>
+ </Certificate>
+ </UploadSigningCertificateResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UploadSigningCertificateResponse>"""
+
+
+UPDATE_SIGNING_CERTIFICATE_TEMPLATE = """<UpdateSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateSigningCertificateResponse>"""
+
+
+DELETE_SIGNING_CERTIFICATE_TEMPLATE = """<DeleteSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteSigningCertificateResponse>"""
+
+
+LIST_SIGNING_CERTIFICATES_TEMPLATE = """<ListSigningCertificatesResponse>
+ <ListSigningCertificatesResult>
+ <UserName>{{ user_name }}</UserName>
+ <Certificates>
+ {% for cert in certificates %}
+ <member>
+ <UserName>{{ user_name }}</UserName>
+ <CertificateId>{{ cert.id }}</CertificateId>
+ <CertificateBody>{{ cert.body }}</CertificateBody>
+ <Status>{{ cert.status }}</Status>
+ </member>
+ {% endfor %}
+ </Certificates>
+ <IsTruncated>false</IsTruncated>
+ </ListSigningCertificatesResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListSigningCertificatesResponse>"""
+
+
+TAG_ROLE_TEMPLATE = """<TagRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</TagRoleResponse>"""
+
+
+LIST_ROLE_TAG_TEMPLATE = """<ListRoleTagsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListRoleTagsResult>
+ <IsTruncated>{{ 'true' if marker else 'false' }}</IsTruncated>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Tags>
+ {% for tag in tags %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </ListRoleTagsResult>
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListRoleTagsResponse>"""
+
+
+UNTAG_ROLE_TEMPLATE = """<UntagRoleResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</UntagRoleResponse>"""
+
+
+TAG_POLICY_TEMPLATE = """<TagPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</TagPolicyResponse>"""
+
+
+LIST_POLICY_TAG_TEMPLATE = """<ListPolicyTagsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListPolicyTagsResult>
+ <IsTruncated>{{ 'true' if marker else 'false' }}</IsTruncated>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Tags>
+ {% for tag in tags %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </ListPolicyTagsResult>
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListPolicyTagsResponse>"""
+
+
+UNTAG_POLICY_TEMPLATE = """<UntagPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</UntagPolicyResponse>"""
+
+LIST_OPEN_ID_CONNECT_PROVIDER_TAGS = """<ListOpenIDConnectProviderTagsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListOpenIDConnectProviderTagsResult>
+ <IsTruncated>{{ 'true' if marker else 'false' }}</IsTruncated>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ <Tags>
+ {% for tag in tags %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </ListOpenIDConnectProviderTagsResult>
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListOpenIDConnectProviderTagsResponse>
+"""
+
+
+CREATE_OPEN_ID_CONNECT_PROVIDER_TEMPLATE = """<CreateOpenIDConnectProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <CreateOpenIDConnectProviderResult>
+ <OpenIDConnectProviderArn>{{ open_id_provider.arn }}</OpenIDConnectProviderArn>
+ </CreateOpenIDConnectProviderResult>
+ <ResponseMetadata>
+ <RequestId>f248366a-4f64-11e4-aefa-bfd6aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</CreateOpenIDConnectProviderResponse>"""
+
+UPDATE_OPEN_ID_CONNECT_PROVIDER_THUMBPRINT = """<UpdateOpenIDConnectProviderThumbprintResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>29b6031c-4f66-11e4-aefa-bfd6aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateOpenIDConnectProviderThumbprintResponse>
+"""
+
+TAG_OPEN_ID_CONNECT_PROVIDER = """<TagOpenIDConnectProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</TagOpenIDConnectProviderResponse>
+"""
+
+UNTAG_OPEN_ID_CONNECT_PROVIDER = """<UntagOpenIDConnectProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</UntagOpenIDConnectProviderResponse>
+"""
+
+DELETE_OPEN_ID_CONNECT_PROVIDER_TEMPLATE = """<DeleteOpenIDConnectProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>b5e49e29-4f64-11e4-aefa-bfd6aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteOpenIDConnectProviderResponse>"""
+
+
+GET_OPEN_ID_CONNECT_PROVIDER_TEMPLATE = """<GetOpenIDConnectProviderResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetOpenIDConnectProviderResult>
+ <ThumbprintList>
+ {% for thumbprint in open_id_provider.thumbprint_list %}
+ <member>{{ thumbprint }}</member>
+ {% endfor %}
+ </ThumbprintList>
+ <CreateDate>{{ open_id_provider.created_iso_8601 }}</CreateDate>
+ <ClientIDList>
+ {% for client_id in open_id_provider.client_id_list %}
+ <member>{{ client_id }}</member>
+ {% endfor %}
+ </ClientIDList>
+ <Url>{{ open_id_provider.url }}</Url>
+ {% if open_id_provider.tags %}
+ <Tags>
+ {% for tag in open_id_provider.get_tags() %}
+ <member>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ {% endif %}
+ </GetOpenIDConnectProviderResult>
+ <ResponseMetadata>
+ <RequestId>2c91531b-4f65-11e4-aefa-bfd6aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetOpenIDConnectProviderResponse>"""
+
+
+LIST_OPEN_ID_CONNECT_PROVIDERS_TEMPLATE = """<ListOpenIDConnectProvidersResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ListOpenIDConnectProvidersResult>
+ <OpenIDConnectProviderList>
+ {% for open_id_provider_arn in open_id_provider_arns %}
+ <member>
+ <Arn>{{ open_id_provider_arn }}</Arn>
+ </member>
+ {% endfor %}
+ </OpenIDConnectProviderList>
+ </ListOpenIDConnectProvidersResult>
+ <ResponseMetadata>
+ <RequestId>de2c0228-4f63-11e4-aefa-bfd6aEXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListOpenIDConnectProvidersResponse>"""
+
+
+UPDATE_ACCOUNT_PASSWORD_POLICY_TEMPLATE = """<UpdateAccountPasswordPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</UpdateAccountPasswordPolicyResponse>"""
+
+
+GET_ACCOUNT_PASSWORD_POLICY_TEMPLATE = """<GetAccountPasswordPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetAccountPasswordPolicyResult>
+ <PasswordPolicy>
+ <AllowUsersToChangePassword>{{ password_policy.allow_users_to_change_password | lower }}</AllowUsersToChangePassword>
+ <ExpirePasswords>{{ password_policy.expire_passwords | lower }}</ExpirePasswords>
+ <HardExpiry>{{ password_policy.hard_expiry | lower }}</HardExpiry>
+ {% if password_policy.max_password_age %}
+ <MaxPasswordAge>{{ password_policy.max_password_age }}</MaxPasswordAge>
+ {% endif %}
+ <MinimumPasswordLength>{{ password_policy.minimum_password_length }}</MinimumPasswordLength>
+ {% if password_policy.password_reuse_prevention %}
+ <PasswordReusePrevention>{{ password_policy.password_reuse_prevention }}</PasswordReusePrevention>
+ {% endif %}
+ <RequireLowercaseCharacters>{{ password_policy.require_lowercase_characters | lower }}</RequireLowercaseCharacters>
+ <RequireNumbers>{{ password_policy.require_numbers | lower }}</RequireNumbers>
+ <RequireSymbols>{{ password_policy.require_symbols | lower }}</RequireSymbols>
+ <RequireUppercaseCharacters>{{ password_policy.require_uppercase_characters | lower }}</RequireUppercaseCharacters>
+ </PasswordPolicy>
+ </GetAccountPasswordPolicyResult>
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetAccountPasswordPolicyResponse>"""
+
+
+DELETE_ACCOUNT_PASSWORD_POLICY_TEMPLATE = """<DeleteAccountPasswordPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeleteAccountPasswordPolicyResponse>"""
+
+
+GET_ACCOUNT_SUMMARY_TEMPLATE = """<GetAccountSummaryResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <GetAccountSummaryResult>
+ <SummaryMap>
+ {% for key, value in summary_map.items() %}
+ <entry>
+ <key>{{ key }}</key>
+ <value>{{ value }}</value>
+ </entry>
+ {% endfor %}
+ </SummaryMap>
+ </GetAccountSummaryResult>
+ <ResponseMetadata>
+ <RequestId>85cb9b90-ac28-11e4-a88d-97964EXAMPLE</RequestId>
+ </ResponseMetadata>
+</GetAccountSummaryResponse>"""
+
+
+TAG_USER_TEMPLATE = """<TagUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</TagUserResponse>"""
+
+
+UNTAG_USER_TEMPLATE = """<UntagUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
+ <ResponseMetadata>
+ <RequestId>EXAMPLE8-90ab-cdef-fedc-ba987EXAMPLE</RequestId>
+ </ResponseMetadata>
+</UntagUserResponse>"""
diff --git a/contrib/python/moto/py3/moto/iam/urls.py b/contrib/python/moto/py3/moto/iam/urls.py
new file mode 100644
index 0000000000..f453edb261
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/urls.py
@@ -0,0 +1,5 @@
+from .responses import IamResponse
+
+url_bases = [r"https?://iam\.(.*\.)?amazonaws\.com"]
+
+url_paths = {"{0}/$": IamResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/iam/utils.py b/contrib/python/moto/py3/moto/iam/utils.py
new file mode 100644
index 0000000000..42ca109bf5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iam/utils.py
@@ -0,0 +1,27 @@
+import random
+import string
+
+
+def random_alphanumeric(length):
+ return "".join(
+ str(random.choice(string.ascii_letters + string.digits + "+" + "/"))
+ for _ in range(length)
+ )
+
+
+def random_resource_id(size=20):
+ chars = list(range(10)) + list(string.ascii_lowercase)
+
+ return "".join(str(random.choice(chars)) for x in range(size))
+
+
+def random_access_key():
+ return "".join(
+ str(random.choice(string.ascii_uppercase + string.digits)) for _ in range(16)
+ )
+
+
+def random_policy_id():
+ return "A" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(20)
+ )
diff --git a/contrib/python/moto/py3/moto/instance_metadata/__init__.py b/contrib/python/moto/py3/moto/instance_metadata/__init__.py
new file mode 100644
index 0000000000..4f02388a40
--- /dev/null
+++ b/contrib/python/moto/py3/moto/instance_metadata/__init__.py
@@ -0,0 +1,3 @@
+from .models import instance_metadata_backend
+
+instance_metadata_backends = {"global": instance_metadata_backend}
diff --git a/contrib/python/moto/py3/moto/instance_metadata/models.py b/contrib/python/moto/py3/moto/instance_metadata/models.py
new file mode 100644
index 0000000000..c8ba5115a0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/instance_metadata/models.py
@@ -0,0 +1,8 @@
+from moto.core import BaseBackend
+
+
+class InstanceMetadataBackend(BaseBackend):
+ pass
+
+
+instance_metadata_backend = InstanceMetadataBackend(region_name="global")
diff --git a/contrib/python/moto/py3/moto/instance_metadata/responses.py b/contrib/python/moto/py3/moto/instance_metadata/responses.py
new file mode 100644
index 0000000000..f966755819
--- /dev/null
+++ b/contrib/python/moto/py3/moto/instance_metadata/responses.py
@@ -0,0 +1,46 @@
+import datetime
+import json
+from urllib.parse import urlparse
+
+from moto.core.responses import BaseResponse
+
+
+class InstanceMetadataResponse(BaseResponse):
+ def metadata_response(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ """
+ Mock response for localhost metadata
+
+ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
+ """
+
+ parsed_url = urlparse(full_url)
+ tomorrow = datetime.datetime.utcnow() + datetime.timedelta(days=1)
+ credentials = dict(
+ AccessKeyId="test-key",
+ SecretAccessKey="test-secret-key",
+ Token="test-session-token",
+ Expiration=tomorrow.strftime("%Y-%m-%dT%H:%M:%SZ"),
+ )
+
+ path = parsed_url.path
+
+ meta_data_prefix = "/latest/meta-data/"
+ # Strip prefix if it is there
+ if path.startswith(meta_data_prefix):
+ path = path[len(meta_data_prefix) :]
+
+ if path == "":
+ result = "iam"
+ elif path == "iam":
+ result = json.dumps({"security-credentials": {"default-role": credentials}})
+ elif path == "iam/security-credentials/":
+ result = "default-role"
+ elif path == "iam/security-credentials/default-role":
+ result = json.dumps(credentials)
+ else:
+ raise NotImplementedError(
+ "The {0} metadata path has not been implemented".format(path)
+ )
+ return 200, headers, result
diff --git a/contrib/python/moto/py3/moto/instance_metadata/urls.py b/contrib/python/moto/py3/moto/instance_metadata/urls.py
new file mode 100644
index 0000000000..f495db731b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/instance_metadata/urls.py
@@ -0,0 +1,7 @@
+from .responses import InstanceMetadataResponse
+
+url_bases = ["http://169.254.169.254"]
+
+instance_metadata = InstanceMetadataResponse()
+
+url_paths = {"{0}/(?P<path>.+)": instance_metadata.metadata_response}
diff --git a/contrib/python/moto/py3/moto/iot/__init__.py b/contrib/python/moto/py3/moto/iot/__init__.py
new file mode 100644
index 0000000000..ccd2af5f73
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/__init__.py
@@ -0,0 +1,4 @@
+from .models import iot_backends
+from ..core.models import base_decorator
+
+mock_iot = base_decorator(iot_backends)
diff --git a/contrib/python/moto/py3/moto/iot/exceptions.py b/contrib/python/moto/py3/moto/iot/exceptions.py
new file mode 100644
index 0000000000..72c1fdea7c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/exceptions.py
@@ -0,0 +1,84 @@
+import json
+
+from moto.core.exceptions import JsonRESTError
+
+
+class IoTClientError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFoundException(IoTClientError):
+ def __init__(self, msg=None):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException", msg or "The specified resource does not exist"
+ )
+
+
+class InvalidRequestException(IoTClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__("InvalidRequestException", msg or "The request is not valid.")
+
+
+class InvalidStateTransitionException(IoTClientError):
+ def __init__(self, msg=None):
+ self.code = 409
+ super().__init__(
+ "InvalidStateTransitionException",
+ msg or "An attempt was made to change to an invalid state.",
+ )
+
+
+class VersionConflictException(IoTClientError):
+ def __init__(self, name):
+ self.code = 409
+ super().__init__(
+ "VersionConflictException",
+ "The version for thing %s does not match the expected version." % name,
+ )
+
+
+class CertificateStateException(IoTClientError):
+ def __init__(self, msg, cert_id):
+ self.code = 406
+ super().__init__("CertificateStateException", "%s Id: %s" % (msg, cert_id))
+
+
+class DeleteConflictException(IoTClientError):
+ def __init__(self, msg):
+ self.code = 409
+ super().__init__("DeleteConflictException", msg)
+
+
+class ResourceAlreadyExistsException(IoTClientError):
+ def __init__(self, msg, resource_id, resource_arn):
+ self.code = 409
+ super().__init__(
+ "ResourceAlreadyExistsException", msg or "The resource already exists."
+ )
+ self.description = json.dumps(
+ {
+ "message": self.message,
+ "resourceId": resource_id,
+ "resourceArn": resource_arn,
+ }
+ )
+
+
+class VersionsLimitExceededException(IoTClientError):
+ def __init__(self, name):
+ self.code = 409
+ super().__init__(
+ "VersionsLimitExceededException",
+ "The policy %s already has the maximum number of versions (5)" % name,
+ )
+
+
+class ThingStillAttached(IoTClientError):
+ def __init__(self, name):
+ self.code = 409
+ super().__init__(
+ "InvalidRequestException",
+ f"Cannot delete. Thing {name} is still attached to one or more principals",
+ )
diff --git a/contrib/python/moto/py3/moto/iot/models.py b/contrib/python/moto/py3/moto/iot/models.py
new file mode 100644
index 0000000000..c94a5fcf3a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/models.py
@@ -0,0 +1,1684 @@
+import hashlib
+import random
+import re
+import string
+import time
+import uuid
+from collections import OrderedDict
+from cryptography import x509
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives.asymmetric import rsa
+from cryptography.hazmat.primitives import serialization, hashes
+
+from datetime import datetime, timedelta
+
+from .utils import PAGINATION_MODEL
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.utilities.utils import random_string
+from moto.utilities.paginator import paginate
+from .exceptions import (
+ CertificateStateException,
+ DeleteConflictException,
+ ResourceNotFoundException,
+ InvalidRequestException,
+ InvalidStateTransitionException,
+ VersionConflictException,
+ ResourceAlreadyExistsException,
+ VersionsLimitExceededException,
+ ThingStillAttached,
+)
+
+
+class FakeThing(BaseModel):
+ def __init__(self, thing_name, thing_type, attributes, region_name):
+ self.region_name = region_name
+ self.thing_name = thing_name
+ self.thing_type = thing_type
+ self.attributes = attributes
+ self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:thing/{thing_name}"
+ self.version = 1
+ # TODO: we need to handle "version"?
+
+ # for iot-data
+ self.thing_shadow = None
+
+ def matches(self, query_string):
+ if query_string == "*":
+ return True
+ if query_string.startswith("thingName:"):
+ qs = query_string[10:].replace("*", ".*").replace("?", ".")
+ return re.search(f"^{qs}$", self.thing_name)
+ if query_string.startswith("attributes."):
+ k, v = query_string[11:].split(":")
+ return self.attributes.get(k) == v
+ return query_string in self.thing_name
+
+ def to_dict(self, include_default_client_id=False):
+ obj = {
+ "thingName": self.thing_name,
+ "thingArn": self.arn,
+ "attributes": self.attributes,
+ "version": self.version,
+ }
+ if self.thing_type:
+ obj["thingTypeName"] = self.thing_type.thing_type_name
+ if include_default_client_id:
+ obj["defaultClientId"] = self.thing_name
+ return obj
+
+
+class FakeThingType(BaseModel):
+ def __init__(self, thing_type_name, thing_type_properties, region_name):
+ self.region_name = region_name
+ self.thing_type_name = thing_type_name
+ self.thing_type_properties = thing_type_properties
+ self.thing_type_id = str(uuid.uuid4()) # I don't know the rule of id
+ t = time.time()
+ self.metadata = {"deprecated": False, "creationDate": int(t * 1000) / 1000.0}
+ self.arn = "arn:aws:iot:%s:1:thingtype/%s" % (self.region_name, thing_type_name)
+
+ def to_dict(self):
+ return {
+ "thingTypeName": self.thing_type_name,
+ "thingTypeId": self.thing_type_id,
+ "thingTypeProperties": self.thing_type_properties,
+ "thingTypeMetadata": self.metadata,
+ "thingTypeArn": self.arn,
+ }
+
+
+class FakeThingGroup(BaseModel):
+ def __init__(
+ self,
+ thing_group_name,
+ parent_group_name,
+ thing_group_properties,
+ region_name,
+ thing_groups,
+ ):
+ self.region_name = region_name
+ self.thing_group_name = thing_group_name
+ self.thing_group_id = str(uuid.uuid4()) # I don't know the rule of id
+ self.version = 1 # TODO: tmp
+ self.parent_group_name = parent_group_name
+ self.thing_group_properties = thing_group_properties or {}
+ t = time.time()
+ self.metadata = {"creationDate": int(t * 1000) / 1000.0}
+ if parent_group_name:
+ self.metadata["parentGroupName"] = parent_group_name
+ # initilize rootToParentThingGroups
+ if "rootToParentThingGroups" not in self.metadata:
+ self.metadata["rootToParentThingGroups"] = []
+ # search for parent arn
+ for thing_group in thing_groups.values():
+ if thing_group.thing_group_name == parent_group_name:
+ parent_thing_group_structure = thing_group
+ break
+ # if parent arn found (should always be found)
+ if parent_thing_group_structure:
+ # copy parent's rootToParentThingGroups
+ if "rootToParentThingGroups" in parent_thing_group_structure.metadata:
+ self.metadata["rootToParentThingGroups"].extend(
+ parent_thing_group_structure.metadata["rootToParentThingGroups"]
+ )
+ self.metadata["rootToParentThingGroups"].extend(
+ [
+ {
+ "groupName": parent_group_name,
+ "groupArn": parent_thing_group_structure.arn,
+ }
+ ]
+ )
+ self.arn = "arn:aws:iot:%s:1:thinggroup/%s" % (
+ self.region_name,
+ thing_group_name,
+ )
+ self.things = OrderedDict()
+
+ def to_dict(self):
+ return {
+ "thingGroupName": self.thing_group_name,
+ "thingGroupId": self.thing_group_id,
+ "version": self.version,
+ "thingGroupProperties": self.thing_group_properties,
+ "thingGroupMetadata": self.metadata,
+ "thingGroupArn": self.arn,
+ }
+
+
+class FakeCertificate(BaseModel):
+ def __init__(self, certificate_pem, status, region_name, ca_certificate_id=None):
+ m = hashlib.sha256()
+ m.update(certificate_pem.encode("utf-8"))
+ self.certificate_id = m.hexdigest()
+ self.arn = (
+ f"arn:aws:iot:{region_name}:{get_account_id()}:cert/{self.certificate_id}"
+ )
+ self.certificate_pem = certificate_pem
+ self.status = status
+
+ self.owner = get_account_id()
+ self.transfer_data = {}
+ self.creation_date = time.time()
+ self.last_modified_date = self.creation_date
+ self.validity_not_before = time.time() - 86400
+ self.validity_not_after = time.time() + 86400
+ self.ca_certificate_id = ca_certificate_id
+
+ def to_dict(self):
+ return {
+ "certificateArn": self.arn,
+ "certificateId": self.certificate_id,
+ "caCertificateId": self.ca_certificate_id,
+ "status": self.status,
+ "creationDate": self.creation_date,
+ }
+
+ def to_description_dict(self):
+ """
+ You might need keys below in some situation
+ - caCertificateId
+ - previousOwnedBy
+ """
+ return {
+ "certificateArn": self.arn,
+ "certificateId": self.certificate_id,
+ "status": self.status,
+ "certificatePem": self.certificate_pem,
+ "ownedBy": self.owner,
+ "creationDate": self.creation_date,
+ "lastModifiedDate": self.last_modified_date,
+ "validity": {
+ "notBefore": self.validity_not_before,
+ "notAfter": self.validity_not_after,
+ },
+ "transferData": self.transfer_data,
+ }
+
+
+class FakeCaCertificate(FakeCertificate):
+ def __init__(self, ca_certificate, status, region_name, registration_config):
+ super().__init__(
+ certificate_pem=ca_certificate,
+ status=status,
+ region_name=region_name,
+ ca_certificate_id=None,
+ )
+ self.registration_config = registration_config
+
+
+class FakePolicy(BaseModel):
+ def __init__(self, name, document, region_name, default_version_id="1"):
+ self.name = name
+ self.document = document
+ self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{name}"
+ self.default_version_id = default_version_id
+ self.versions = [FakePolicyVersion(self.name, document, True, region_name)]
+
+ def to_get_dict(self):
+ return {
+ "policyName": self.name,
+ "policyArn": self.arn,
+ "policyDocument": self.document,
+ "defaultVersionId": self.default_version_id,
+ }
+
+ def to_dict_at_creation(self):
+ return {
+ "policyName": self.name,
+ "policyArn": self.arn,
+ "policyDocument": self.document,
+ "policyVersionId": self.default_version_id,
+ }
+
+ def to_dict(self):
+ return {"policyName": self.name, "policyArn": self.arn}
+
+
+class FakePolicyVersion(object):
+ def __init__(self, policy_name, document, is_default, region_name):
+ self.name = policy_name
+ self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{policy_name}"
+ self.document = document or {}
+ self.is_default = is_default
+ self.version_id = "1"
+
+ self.create_datetime = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.last_modified_datetime = time.mktime(datetime(2015, 1, 2).timetuple())
+
+ def to_get_dict(self):
+ return {
+ "policyName": self.name,
+ "policyArn": self.arn,
+ "policyDocument": self.document,
+ "policyVersionId": self.version_id,
+ "isDefaultVersion": self.is_default,
+ "creationDate": self.create_datetime,
+ "lastModifiedDate": self.last_modified_datetime,
+ "generationId": self.version_id,
+ }
+
+ def to_dict_at_creation(self):
+ return {
+ "policyArn": self.arn,
+ "policyDocument": self.document,
+ "policyVersionId": self.version_id,
+ "isDefaultVersion": self.is_default,
+ }
+
+ def to_dict(self):
+ return {
+ "versionId": self.version_id,
+ "isDefaultVersion": self.is_default,
+ "createDate": self.create_datetime,
+ }
+
+
+class FakeJob(BaseModel):
+ JOB_ID_REGEX_PATTERN = "[a-zA-Z0-9_-]"
+ JOB_ID_REGEX = re.compile(JOB_ID_REGEX_PATTERN)
+
+ def __init__(
+ self,
+ job_id,
+ targets,
+ document_source,
+ document,
+ description,
+ presigned_url_config,
+ target_selection,
+ job_executions_rollout_config,
+ document_parameters,
+ region_name,
+ ):
+ if not self._job_id_matcher(self.JOB_ID_REGEX, job_id):
+ raise InvalidRequestException()
+
+ self.region_name = region_name
+ self.job_id = job_id
+ self.job_arn = "arn:aws:iot:%s:1:job/%s" % (self.region_name, job_id)
+ self.targets = targets
+ self.document_source = document_source
+ self.document = document
+ self.force = False
+ self.description = description
+ self.presigned_url_config = presigned_url_config
+ self.target_selection = target_selection
+ self.job_executions_rollout_config = job_executions_rollout_config
+ self.status = "QUEUED" # IN_PROGRESS | CANCELED | COMPLETED
+ self.comment = None
+ self.reason_code = None
+ self.created_at = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.last_updated_at = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.completed_at = None
+ self.job_process_details = {
+ "processingTargets": targets,
+ "numberOfQueuedThings": 1,
+ "numberOfCanceledThings": 0,
+ "numberOfSucceededThings": 0,
+ "numberOfFailedThings": 0,
+ "numberOfRejectedThings": 0,
+ "numberOfInProgressThings": 0,
+ "numberOfRemovedThings": 0,
+ }
+ self.document_parameters = document_parameters
+
+ def to_dict(self):
+ obj = {
+ "jobArn": self.job_arn,
+ "jobId": self.job_id,
+ "targets": self.targets,
+ "description": self.description,
+ "presignedUrlConfig": self.presigned_url_config,
+ "targetSelection": self.target_selection,
+ "jobExecutionsRolloutConfig": self.job_executions_rollout_config,
+ "status": self.status,
+ "comment": self.comment,
+ "forceCanceled": self.force,
+ "reasonCode": self.reason_code,
+ "createdAt": self.created_at,
+ "lastUpdatedAt": self.last_updated_at,
+ "completedAt": self.completed_at,
+ "jobProcessDetails": self.job_process_details,
+ "documentParameters": self.document_parameters,
+ "document": self.document,
+ "documentSource": self.document_source,
+ }
+
+ return obj
+
+ def _job_id_matcher(self, regex, argument):
+ regex_match = regex.match(argument)
+ length_match = len(argument) <= 64
+ return regex_match and length_match
+
+
+class FakeJobExecution(BaseModel):
+ def __init__(
+ self,
+ job_id,
+ thing_arn,
+ status="QUEUED",
+ force_canceled=False,
+ status_details_map=None,
+ ):
+ self.job_id = job_id
+ self.status = status # IN_PROGRESS | CANCELED | COMPLETED
+ self.force_canceled = force_canceled
+ self.status_details_map = status_details_map or {}
+ self.thing_arn = thing_arn
+ self.queued_at = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.started_at = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.last_updated_at = time.mktime(datetime(2015, 1, 1).timetuple())
+ self.execution_number = 123
+ self.version_number = 123
+ self.approximate_seconds_before_time_out = 123
+
+ def to_get_dict(self):
+ obj = {
+ "jobId": self.job_id,
+ "status": self.status,
+ "forceCanceled": self.force_canceled,
+ "statusDetails": {"detailsMap": self.status_details_map},
+ "thingArn": self.thing_arn,
+ "queuedAt": self.queued_at,
+ "startedAt": self.started_at,
+ "lastUpdatedAt": self.last_updated_at,
+ "executionNumber": self.execution_number,
+ "versionNumber": self.version_number,
+ "approximateSecondsBeforeTimedOut": self.approximate_seconds_before_time_out,
+ }
+
+ return obj
+
+ def to_dict(self):
+ obj = {
+ "jobId": self.job_id,
+ "thingArn": self.thing_arn,
+ "jobExecutionSummary": {
+ "status": self.status,
+ "queuedAt": self.queued_at,
+ "startedAt": self.started_at,
+ "lastUpdatedAt": self.last_updated_at,
+ "executionNumber": self.execution_number,
+ },
+ }
+
+ return obj
+
+
+class FakeEndpoint(BaseModel):
+ def __init__(self, endpoint_type, region_name):
+ if endpoint_type not in [
+ "iot:Data",
+ "iot:Data-ATS",
+ "iot:CredentialProvider",
+ "iot:Jobs",
+ ]:
+ raise InvalidRequestException(
+ " An error occurred (InvalidRequestException) when calling the DescribeEndpoint "
+ "operation: Endpoint type %s not recognized." % endpoint_type
+ )
+ self.region_name = region_name
+ identifier = random_string(14).lower()
+ if endpoint_type == "iot:Data":
+ self.endpoint = "{i}.iot.{r}.amazonaws.com".format(
+ i=identifier, r=self.region_name
+ )
+ elif "iot:Data-ATS" in endpoint_type:
+ self.endpoint = "{i}-ats.iot.{r}.amazonaws.com".format(
+ i=identifier, r=self.region_name
+ )
+ elif "iot:CredentialProvider" in endpoint_type:
+ self.endpoint = "{i}.credentials.iot.{r}.amazonaws.com".format(
+ i=identifier, r=self.region_name
+ )
+ elif "iot:Jobs" in endpoint_type:
+ self.endpoint = "{i}.jobs.iot.{r}.amazonaws.com".format(
+ i=identifier, r=self.region_name
+ )
+ self.endpoint_type = endpoint_type
+
+ def to_get_dict(self):
+ obj = {
+ "endpointAddress": self.endpoint,
+ }
+
+ return obj
+
+ def to_dict(self):
+ obj = {
+ "endpointAddress": self.endpoint,
+ }
+
+ return obj
+
+
+class FakeRule(BaseModel):
+ def __init__(
+ self,
+ rule_name,
+ description,
+ created_at,
+ rule_disabled,
+ topic_pattern,
+ actions,
+ error_action,
+ sql,
+ aws_iot_sql_version,
+ region_name,
+ ):
+ self.region_name = region_name
+ self.rule_name = rule_name
+ self.description = description or ""
+ self.created_at = created_at
+ self.rule_disabled = bool(rule_disabled)
+ self.topic_pattern = topic_pattern
+ self.actions = actions or []
+ self.error_action = error_action or {}
+ self.sql = sql
+ self.aws_iot_sql_version = aws_iot_sql_version or "2016-03-23"
+ self.arn = "arn:aws:iot:%s:1:rule/%s" % (self.region_name, rule_name)
+
+ def to_get_dict(self):
+ return {
+ "rule": {
+ "actions": self.actions,
+ "awsIotSqlVersion": self.aws_iot_sql_version,
+ "createdAt": self.created_at,
+ "description": self.description,
+ "errorAction": self.error_action,
+ "ruleDisabled": self.rule_disabled,
+ "ruleName": self.rule_name,
+ "sql": self.sql,
+ },
+ "ruleArn": self.arn,
+ }
+
+ def to_dict(self):
+ return {
+ "ruleName": self.rule_name,
+ "createdAt": self.created_at,
+ "ruleArn": self.arn,
+ "ruleDisabled": self.rule_disabled,
+ "topicPattern": self.topic_pattern,
+ }
+
+
+class FakeDomainConfiguration(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ domain_configuration_name,
+ domain_name,
+ server_certificate_arns,
+ domain_configuration_status,
+ service_type,
+ authorizer_config,
+ domain_type,
+ ):
+ if service_type and service_type not in ["DATA", "CREDENTIAL_PROVIDER", "JOBS"]:
+ raise InvalidRequestException(
+ "An error occurred (InvalidRequestException) when calling the DescribeDomainConfiguration "
+ "operation: Service type %s not recognized." % service_type
+ )
+ self.domain_configuration_name = domain_configuration_name
+ self.domain_configuration_arn = "arn:aws:iot:%s:1:domainconfiguration/%s/%s" % (
+ region_name,
+ domain_configuration_name,
+ random_string(5),
+ )
+ self.domain_name = domain_name
+ self.server_certificates = []
+ if server_certificate_arns:
+ for sc in server_certificate_arns:
+ self.server_certificates.append(
+ {"serverCertificateArn": sc, "serverCertificateStatus": "VALID"}
+ )
+ self.domain_configuration_status = domain_configuration_status
+ self.service_type = service_type
+ self.authorizer_config = authorizer_config
+ self.domain_type = domain_type
+ self.last_status_change_date = time.time()
+
+ def to_description_dict(self):
+ return {
+ "domainConfigurationName": self.domain_configuration_name,
+ "domainConfigurationArn": self.domain_configuration_arn,
+ "domainName": self.domain_name,
+ "serverCertificates": self.server_certificates,
+ "authorizerConfig": self.authorizer_config,
+ "domainConfigurationStatus": self.domain_configuration_status,
+ "serviceType": self.service_type,
+ "domainType": self.domain_type,
+ "lastStatusChangeDate": self.last_status_change_date,
+ }
+
+ def to_dict(self):
+ return {
+ "domainConfigurationName": self.domain_configuration_name,
+ "domainConfigurationArn": self.domain_configuration_arn,
+ }
+
+
+class IoTBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.things = OrderedDict()
+ self.jobs = OrderedDict()
+ self.job_executions = OrderedDict()
+ self.thing_types = OrderedDict()
+ self.thing_groups = OrderedDict()
+ self.ca_certificates = OrderedDict()
+ self.certificates = OrderedDict()
+ self.policies = OrderedDict()
+ self.principal_policies = OrderedDict()
+ self.principal_things = OrderedDict()
+ self.rules = OrderedDict()
+ self.endpoint = None
+ self.domain_configurations = OrderedDict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "iot"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region,
+ zones,
+ "data.iot",
+ private_dns_names=False,
+ special_service_name="iot.data",
+ policy_supported=False,
+ )
+
+ def create_certificate_from_csr(self, csr, set_as_active):
+ cert = x509.load_pem_x509_csr(csr.encode("utf-8"), default_backend())
+ pem = self._generate_certificate_pem(
+ domain_name="example.com", subject=cert.subject
+ )
+ return self.register_certificate(
+ pem, ca_certificate_pem=None, set_as_active=set_as_active, status="INACTIVE"
+ )
+
+ def _generate_certificate_pem(self, domain_name, subject):
+ sans = set()
+
+ sans.add(domain_name)
+ sans = [x509.DNSName(item) for item in sans]
+
+ key = rsa.generate_private_key(
+ public_exponent=65537, key_size=2048, backend=default_backend()
+ )
+ issuer = x509.Name(
+ [ # C = US, O = Moto, OU = Server CA 1B, CN = Moto
+ x509.NameAttribute(x509.NameOID.COUNTRY_NAME, "US"),
+ x509.NameAttribute(x509.NameOID.ORGANIZATION_NAME, "Moto"),
+ x509.NameAttribute(
+ x509.NameOID.ORGANIZATIONAL_UNIT_NAME, "Server CA 1B"
+ ),
+ x509.NameAttribute(x509.NameOID.COMMON_NAME, "Moto"),
+ ]
+ )
+ cert = (
+ x509.CertificateBuilder()
+ .subject_name(subject)
+ .issuer_name(issuer)
+ .public_key(key.public_key())
+ .serial_number(x509.random_serial_number())
+ .not_valid_before(datetime.utcnow())
+ .not_valid_after(datetime.utcnow() + timedelta(days=365))
+ .add_extension(x509.SubjectAlternativeName(sans), critical=False)
+ .sign(key, hashes.SHA512(), default_backend())
+ )
+
+ return cert.public_bytes(serialization.Encoding.PEM).decode("utf-8")
+
+ def create_thing(self, thing_name, thing_type_name, attribute_payload):
+ thing_types = self.list_thing_types()
+ thing_type = None
+ if thing_type_name:
+ filtered_thing_types = [
+ _ for _ in thing_types if _.thing_type_name == thing_type_name
+ ]
+ if len(filtered_thing_types) == 0:
+ raise ResourceNotFoundException()
+ thing_type = filtered_thing_types[0]
+
+ if thing_type.metadata["deprecated"]:
+ # note - typo (depreated) exists also in the original exception.
+ raise InvalidRequestException(
+ msg=f"Can not create new thing with depreated thing type:{thing_type_name}"
+ )
+ if attribute_payload is None:
+ attributes = {}
+ elif "attributes" not in attribute_payload:
+ attributes = {}
+ else:
+ attributes = attribute_payload["attributes"]
+ thing = FakeThing(thing_name, thing_type, attributes, self.region_name)
+ self.things[thing.arn] = thing
+ return thing.thing_name, thing.arn
+
+ def create_thing_type(self, thing_type_name, thing_type_properties):
+ if thing_type_properties is None:
+ thing_type_properties = {}
+ thing_type = FakeThingType(
+ thing_type_name, thing_type_properties, self.region_name
+ )
+ self.thing_types[thing_type.arn] = thing_type
+ return thing_type.thing_type_name, thing_type.arn
+
+ def list_thing_types(self, thing_type_name=None):
+ if thing_type_name:
+ # It's weird but thing_type_name is filtered by forward match, not complete match
+ return [
+ _
+ for _ in self.thing_types.values()
+ if _.thing_type_name.startswith(thing_type_name)
+ ]
+ return self.thing_types.values()
+
+ def list_things(
+ self, attribute_name, attribute_value, thing_type_name, max_results, token
+ ):
+ all_things = [_.to_dict() for _ in self.things.values()]
+ if attribute_name is not None and thing_type_name is not None:
+ filtered_things = list(
+ filter(
+ lambda elem: attribute_name in elem["attributes"]
+ and elem["attributes"][attribute_name] == attribute_value
+ and "thingTypeName" in elem
+ and elem["thingTypeName"] == thing_type_name,
+ all_things,
+ )
+ )
+ elif attribute_name is not None and thing_type_name is None:
+ filtered_things = list(
+ filter(
+ lambda elem: attribute_name in elem["attributes"]
+ and elem["attributes"][attribute_name] == attribute_value,
+ all_things,
+ )
+ )
+ elif attribute_name is None and thing_type_name is not None:
+ filtered_things = list(
+ filter(
+ lambda elem: "thingTypeName" in elem
+ and elem["thingTypeName"] == thing_type_name,
+ all_things,
+ )
+ )
+ else:
+ filtered_things = all_things
+
+ if token is None:
+ things = filtered_things[0:max_results]
+ next_token = (
+ str(max_results) if len(filtered_things) > max_results else None
+ )
+ else:
+ token = int(token)
+ things = filtered_things[token : token + max_results]
+ next_token = (
+ str(token + max_results)
+ if len(filtered_things) > token + max_results
+ else None
+ )
+
+ return things, next_token
+
+ def describe_thing(self, thing_name):
+ things = [_ for _ in self.things.values() if _.thing_name == thing_name]
+ if len(things) == 0:
+ raise ResourceNotFoundException()
+ return things[0]
+
+ def describe_thing_type(self, thing_type_name):
+ thing_types = [
+ _ for _ in self.thing_types.values() if _.thing_type_name == thing_type_name
+ ]
+ if len(thing_types) == 0:
+ raise ResourceNotFoundException()
+ return thing_types[0]
+
+ def describe_endpoint(self, endpoint_type):
+ self.endpoint = FakeEndpoint(endpoint_type, self.region_name)
+ return self.endpoint
+
+ def delete_thing(self, thing_name):
+ """
+ The ExpectedVersion-parameter is not yet implemented
+ """
+
+ # can raise ResourceNotFoundError
+ thing = self.describe_thing(thing_name)
+
+ for k in list(self.principal_things.keys()):
+ if k[1] == thing_name:
+ raise ThingStillAttached(thing_name)
+
+ del self.things[thing.arn]
+
+ def delete_thing_type(self, thing_type_name):
+ # can raise ResourceNotFoundError
+ thing_type = self.describe_thing_type(thing_type_name)
+ del self.thing_types[thing_type.arn]
+
+ def deprecate_thing_type(self, thing_type_name, undo_deprecate):
+ thing_types = [
+ _ for _ in self.thing_types.values() if _.thing_type_name == thing_type_name
+ ]
+ if len(thing_types) == 0:
+ raise ResourceNotFoundException()
+ thing_types[0].metadata["deprecated"] = not undo_deprecate
+ return thing_types[0]
+
+ def update_thing(
+ self,
+ thing_name,
+ thing_type_name,
+ attribute_payload,
+ remove_thing_type,
+ ):
+ """
+ The ExpectedVersion-parameter is not yet implemented
+ """
+ # if attributes payload = {}, nothing
+ thing = self.describe_thing(thing_name)
+ thing_type = None
+
+ if remove_thing_type and thing_type_name:
+ raise InvalidRequestException()
+
+ # thing_type
+ if thing_type_name:
+ thing_types = self.list_thing_types()
+ filtered_thing_types = [
+ _ for _ in thing_types if _.thing_type_name == thing_type_name
+ ]
+ if len(filtered_thing_types) == 0:
+ raise ResourceNotFoundException()
+ thing_type = filtered_thing_types[0]
+
+ if thing_type.metadata["deprecated"]:
+ raise InvalidRequestException(
+ msg=f"Can not update a thing to use deprecated thing type: {thing_type_name}"
+ )
+
+ thing.thing_type = thing_type
+
+ if remove_thing_type:
+ thing.thing_type = None
+
+ # attribute
+ if attribute_payload is not None and "attributes" in attribute_payload:
+ do_merge = attribute_payload.get("merge", False)
+ attributes = attribute_payload["attributes"]
+ if not do_merge:
+ thing.attributes = attributes
+ else:
+ thing.attributes.update(attributes)
+
+ def _random_string(self):
+ n = 20
+ random_str = "".join(
+ [random.choice(string.ascii_letters + string.digits) for i in range(n)]
+ )
+ return random_str
+
+ def create_keys_and_certificate(self, set_as_active):
+ # implement here
+ # caCertificate can be blank
+ key_pair = {
+ "PublicKey": self._random_string(),
+ "PrivateKey": self._random_string(),
+ }
+ certificate_pem = self._random_string()
+ status = "ACTIVE" if set_as_active else "INACTIVE"
+ certificate = FakeCertificate(certificate_pem, status, self.region_name)
+ self.certificates[certificate.certificate_id] = certificate
+ return certificate, key_pair
+
+ def delete_ca_certificate(self, certificate_id):
+ cert = self.describe_ca_certificate(certificate_id)
+ self._validation_delete(cert)
+ del self.ca_certificates[certificate_id]
+
+ def delete_certificate(self, certificate_id):
+ cert = self.describe_certificate(certificate_id)
+ self._validation_delete(cert)
+ del self.certificates[certificate_id]
+
+ def _validation_delete(self, cert):
+ if cert.status == "ACTIVE":
+ raise CertificateStateException(
+ "Certificate must be deactivated (not ACTIVE) before deletion.",
+ cert.certificate_id,
+ )
+
+ certs = [
+ k[0]
+ for k, v in self.principal_things.items()
+ if self._get_principal(k[0]).certificate_id == cert.certificate_id
+ ]
+ if len(certs) > 0:
+ raise DeleteConflictException(
+ "Things must be detached before deletion (arn: %s)" % certs[0]
+ )
+
+ certs = [
+ k[0]
+ for k, v in self.principal_policies.items()
+ if self._get_principal(k[0]).certificate_id == cert.certificate_id
+ ]
+ if len(certs) > 0:
+ raise DeleteConflictException(
+ "Certificate policies must be detached before deletion (arn: %s)"
+ % certs[0]
+ )
+
+ def describe_ca_certificate(self, certificate_id):
+ if certificate_id not in self.ca_certificates:
+ raise ResourceNotFoundException()
+ return self.ca_certificates[certificate_id]
+
+ def describe_certificate(self, certificate_id):
+ certs = [
+ _ for _ in self.certificates.values() if _.certificate_id == certificate_id
+ ]
+ if len(certs) == 0:
+ raise ResourceNotFoundException()
+ return certs[0]
+
+ def get_registration_code(self):
+ return str(uuid.uuid4())
+
+ def list_certificates(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.certificates.values()
+
+ def list_certificates_by_ca(self, ca_certificate_id):
+ """
+ Pagination is not yet implemented
+ """
+ return [
+ cert
+ for cert in self.certificates.values()
+ if cert.ca_certificate_id == ca_certificate_id
+ ]
+
+ def __raise_if_certificate_already_exists(self, certificate_id, certificate_arn):
+ if certificate_id in self.certificates:
+ raise ResourceAlreadyExistsException(
+ "The certificate is already provisioned or registered",
+ certificate_id,
+ certificate_arn,
+ )
+
+ def register_ca_certificate(
+ self,
+ ca_certificate,
+ set_as_active,
+ registration_config,
+ ):
+ """
+ The VerificationCertificate-parameter is not yet implemented
+ """
+ certificate = FakeCaCertificate(
+ ca_certificate=ca_certificate,
+ status="ACTIVE" if set_as_active else "INACTIVE",
+ region_name=self.region_name,
+ registration_config=registration_config,
+ )
+
+ self.ca_certificates[certificate.certificate_id] = certificate
+ return certificate
+
+ def _find_ca_certificate(self, ca_certificate_pem):
+ for ca_cert in self.ca_certificates.values():
+ if ca_cert.certificate_pem == ca_certificate_pem:
+ return ca_cert.certificate_id
+ return None
+
+ def register_certificate(
+ self, certificate_pem, ca_certificate_pem, set_as_active, status
+ ):
+ ca_certificate_id = self._find_ca_certificate(ca_certificate_pem)
+ certificate = FakeCertificate(
+ certificate_pem,
+ "ACTIVE" if set_as_active else status,
+ self.region_name,
+ ca_certificate_id,
+ )
+ self.__raise_if_certificate_already_exists(
+ certificate.certificate_id, certificate_arn=certificate.arn
+ )
+
+ self.certificates[certificate.certificate_id] = certificate
+ return certificate
+
+ def register_certificate_without_ca(self, certificate_pem, status):
+ certificate = FakeCertificate(certificate_pem, status, self.region_name)
+ self.__raise_if_certificate_already_exists(
+ certificate.certificate_id, certificate_arn=certificate.arn
+ )
+
+ self.certificates[certificate.certificate_id] = certificate
+ return certificate
+
+ def update_ca_certificate(self, certificate_id, new_status, config):
+ """
+ The newAutoRegistrationStatus and removeAutoRegistration-parameters are not yet implemented
+ """
+ cert = self.describe_ca_certificate(certificate_id)
+ if new_status is not None:
+ cert.status = new_status
+ if config is not None:
+ cert.registration_config = config
+
+ def update_certificate(self, certificate_id, new_status):
+ cert = self.describe_certificate(certificate_id)
+ # TODO: validate new_status
+ cert.status = new_status
+
+ def create_policy(self, policy_name, policy_document):
+ policy = FakePolicy(policy_name, policy_document, self.region_name)
+ self.policies[policy.name] = policy
+ return policy
+
+ def attach_policy(self, policy_name, target):
+ principal = self._get_principal(target)
+ policy = self.get_policy(policy_name)
+ k = (target, policy_name)
+ if k in self.principal_policies:
+ return
+ self.principal_policies[k] = (principal, policy)
+
+ def detach_policy(self, policy_name, target):
+ # this may raises ResourceNotFoundException
+ self._get_principal(target)
+ self.get_policy(policy_name)
+
+ k = (target, policy_name)
+ if k not in self.principal_policies:
+ raise ResourceNotFoundException()
+ del self.principal_policies[k]
+
+ def list_attached_policies(self, target):
+ policies = [v[1] for k, v in self.principal_policies.items() if k[0] == target]
+ return policies
+
+ def list_policies(self):
+ policies = self.policies.values()
+ return policies
+
+ def get_policy(self, policy_name):
+ policies = [_ for _ in self.policies.values() if _.name == policy_name]
+ if len(policies) == 0:
+ raise ResourceNotFoundException()
+ return policies[0]
+
+ def delete_policy(self, policy_name):
+
+ policies = [
+ k[1] for k, v in self.principal_policies.items() if k[1] == policy_name
+ ]
+ if len(policies) > 0:
+ raise DeleteConflictException(
+ "The policy cannot be deleted as the policy is attached to one or more principals (name=%s)"
+ % policy_name
+ )
+
+ policy = self.get_policy(policy_name)
+ del self.policies[policy.name]
+
+ def create_policy_version(self, policy_name, policy_document, set_as_default):
+ policy = self.get_policy(policy_name)
+ if not policy:
+ raise ResourceNotFoundException()
+ if len(policy.versions) >= 5:
+ raise VersionsLimitExceededException(policy_name)
+ version = FakePolicyVersion(
+ policy_name, policy_document, set_as_default, self.region_name
+ )
+ policy.versions.append(version)
+ version.version_id = "{0}".format(len(policy.versions))
+ if set_as_default:
+ self.set_default_policy_version(policy_name, version.version_id)
+ return version
+
+ def set_default_policy_version(self, policy_name, version_id):
+ policy = self.get_policy(policy_name)
+ if not policy:
+ raise ResourceNotFoundException()
+ for version in policy.versions:
+ if version.version_id == version_id:
+ version.is_default = True
+ policy.default_version_id = version.version_id
+ policy.document = version.document
+ else:
+ version.is_default = False
+
+ def get_policy_version(self, policy_name, version_id):
+ policy = self.get_policy(policy_name)
+ if not policy:
+ raise ResourceNotFoundException()
+ for version in policy.versions:
+ if version.version_id == version_id:
+ return version
+ raise ResourceNotFoundException()
+
+ def list_policy_versions(self, policy_name):
+ policy = self.get_policy(policy_name)
+ if not policy:
+ raise ResourceNotFoundException()
+ return policy.versions
+
+ def delete_policy_version(self, policy_name, version_id):
+ policy = self.get_policy(policy_name)
+ if not policy:
+ raise ResourceNotFoundException()
+ if version_id == policy.default_version_id:
+ raise InvalidRequestException(
+ "Cannot delete the default version of a policy"
+ )
+ for i, v in enumerate(policy.versions):
+ if v.version_id == version_id:
+ del policy.versions[i]
+ return
+ raise ResourceNotFoundException()
+
+ def _get_principal(self, principal_arn):
+ """
+ raise ResourceNotFoundException
+ """
+ if ":cert/" in principal_arn:
+ certs = [_ for _ in self.certificates.values() if _.arn == principal_arn]
+ if len(certs) == 0:
+ raise ResourceNotFoundException()
+ principal = certs[0]
+ return principal
+ from moto.cognitoidentity import cognitoidentity_backends
+
+ cognito = cognitoidentity_backends[self.region_name]
+ identities = []
+ for identity_pool in cognito.identity_pools:
+ pool_identities = cognito.pools_identities.get(identity_pool, None)
+ identities.extend(
+ [pi["IdentityId"] for pi in pool_identities.get("Identities", [])]
+ )
+ if principal_arn in identities:
+ return {"IdentityId": principal_arn}
+
+ raise ResourceNotFoundException()
+
+ def attach_principal_policy(self, policy_name, principal_arn):
+ principal = self._get_principal(principal_arn)
+ policy = self.get_policy(policy_name)
+ k = (principal_arn, policy_name)
+ if k in self.principal_policies:
+ return
+ self.principal_policies[k] = (principal, policy)
+
+ def detach_principal_policy(self, policy_name, principal_arn):
+ # this may raises ResourceNotFoundException
+ self._get_principal(principal_arn)
+ self.get_policy(policy_name)
+
+ k = (principal_arn, policy_name)
+ if k not in self.principal_policies:
+ raise ResourceNotFoundException()
+ del self.principal_policies[k]
+
+ def list_principal_policies(self, principal_arn):
+ policies = [
+ v[1] for k, v in self.principal_policies.items() if k[0] == principal_arn
+ ]
+ return policies
+
+ def list_policy_principals(self, policy_name):
+ principals = [
+ k[0] for k, v in self.principal_policies.items() if k[1] == policy_name
+ ]
+ return principals
+
+ def attach_thing_principal(self, thing_name, principal_arn):
+ principal = self._get_principal(principal_arn)
+ thing = self.describe_thing(thing_name)
+ k = (principal_arn, thing_name)
+ if k in self.principal_things:
+ return
+ self.principal_things[k] = (principal, thing)
+
+ def detach_thing_principal(self, thing_name, principal_arn):
+ # this may raises ResourceNotFoundException
+ self._get_principal(principal_arn)
+ self.describe_thing(thing_name)
+
+ k = (principal_arn, thing_name)
+ if k not in self.principal_things:
+ raise ResourceNotFoundException()
+ del self.principal_things[k]
+
+ def list_principal_things(self, principal_arn):
+ thing_names = [
+ k[1] for k, v in self.principal_things.items() if k[0] == principal_arn
+ ]
+ return thing_names
+
+ def list_thing_principals(self, thing_name):
+
+ things = [_ for _ in self.things.values() if _.thing_name == thing_name]
+ if len(things) == 0:
+ raise ResourceNotFoundException(
+ "Failed to list principals for thing %s because the thing does not exist in your account"
+ % thing_name
+ )
+
+ principals = [
+ k[0] for k, v in self.principal_things.items() if k[1] == thing_name
+ ]
+ return principals
+
+ def describe_thing_group(self, thing_group_name):
+ thing_groups = [
+ _
+ for _ in self.thing_groups.values()
+ if _.thing_group_name == thing_group_name
+ ]
+ if len(thing_groups) == 0:
+ raise ResourceNotFoundException()
+ return thing_groups[0]
+
+ def create_thing_group(
+ self, thing_group_name, parent_group_name, thing_group_properties
+ ):
+ thing_group = FakeThingGroup(
+ thing_group_name,
+ parent_group_name,
+ thing_group_properties,
+ self.region_name,
+ self.thing_groups,
+ )
+ self.thing_groups[thing_group.arn] = thing_group
+ return thing_group.thing_group_name, thing_group.arn, thing_group.thing_group_id
+
+ def delete_thing_group(self, thing_group_name):
+ """
+ The ExpectedVersion-parameter is not yet implemented
+ """
+ child_groups = [
+ thing_group
+ for _, thing_group in self.thing_groups.items()
+ if thing_group.parent_group_name == thing_group_name
+ ]
+ if len(child_groups) > 0:
+ raise InvalidRequestException(
+ " Cannot delete thing group : "
+ + thing_group_name
+ + " when there are still child groups attached to it"
+ )
+ try:
+ thing_group = self.describe_thing_group(thing_group_name)
+ del self.thing_groups[thing_group.arn]
+ except ResourceNotFoundException:
+ # AWS returns success even if the thing group does not exist.
+ pass
+
+ def list_thing_groups(self, parent_group, name_prefix_filter, recursive):
+ if recursive is None:
+ recursive = True
+ if name_prefix_filter is None:
+ name_prefix_filter = ""
+ if parent_group and parent_group not in [
+ _.thing_group_name for _ in self.thing_groups.values()
+ ]:
+ raise ResourceNotFoundException()
+ thing_groups = [
+ _ for _ in self.thing_groups.values() if _.parent_group_name == parent_group
+ ]
+ if recursive:
+ for g in thing_groups:
+ thing_groups.extend(
+ self.list_thing_groups(
+ parent_group=g.thing_group_name,
+ name_prefix_filter=None,
+ recursive=False,
+ )
+ )
+ # thing_groups = groups_to_process.values()
+ return [
+ _ for _ in thing_groups if _.thing_group_name.startswith(name_prefix_filter)
+ ]
+
+ def update_thing_group(
+ self, thing_group_name, thing_group_properties, expected_version
+ ):
+ thing_group = self.describe_thing_group(thing_group_name)
+ if expected_version and expected_version != thing_group.version:
+ raise VersionConflictException(thing_group_name)
+ attribute_payload = thing_group_properties.get("attributePayload", None)
+ if attribute_payload is not None and "attributes" in attribute_payload:
+ do_merge = attribute_payload.get("merge", False)
+ attributes = attribute_payload["attributes"]
+ if not do_merge:
+ thing_group.thing_group_properties["attributePayload"][
+ "attributes"
+ ] = attributes
+ else:
+ thing_group.thing_group_properties["attributePayload"][
+ "attributes"
+ ].update(attributes)
+ elif attribute_payload is not None and "attributes" not in attribute_payload:
+ thing_group.attributes = {}
+ thing_group.version = thing_group.version + 1
+ return thing_group.version
+
+ def _identify_thing_group(self, thing_group_name, thing_group_arn):
+ # identify thing group
+ if thing_group_name is None and thing_group_arn is None:
+ raise InvalidRequestException(
+ " Both thingGroupArn and thingGroupName are empty. Need to specify at least one of them"
+ )
+ if thing_group_name is not None:
+ thing_group = self.describe_thing_group(thing_group_name)
+ if thing_group_arn and thing_group.arn != thing_group_arn:
+ raise InvalidRequestException(
+ "ThingGroupName thingGroupArn does not match specified thingGroupName in request"
+ )
+ elif thing_group_arn is not None:
+ if thing_group_arn not in self.thing_groups:
+ raise InvalidRequestException()
+ thing_group = self.thing_groups[thing_group_arn]
+ return thing_group
+
+ def _identify_thing(self, thing_name, thing_arn):
+ # identify thing
+ if thing_name is None and thing_arn is None:
+ raise InvalidRequestException(
+ "Both thingArn and thingName are empty. Need to specify at least one of them"
+ )
+ if thing_name is not None:
+ thing = self.describe_thing(thing_name)
+ if thing_arn and thing.arn != thing_arn:
+ raise InvalidRequestException(
+ "ThingName thingArn does not match specified thingName in request"
+ )
+ elif thing_arn is not None:
+ if thing_arn not in self.things:
+ raise InvalidRequestException()
+ thing = self.things[thing_arn]
+ return thing
+
+ def add_thing_to_thing_group(
+ self, thing_group_name, thing_group_arn, thing_name, thing_arn
+ ):
+ thing_group = self._identify_thing_group(thing_group_name, thing_group_arn)
+ thing = self._identify_thing(thing_name, thing_arn)
+ if thing.arn in thing_group.things:
+ # aws ignores duplicate registration
+ return
+ thing_group.things[thing.arn] = thing
+
+ def remove_thing_from_thing_group(
+ self, thing_group_name, thing_group_arn, thing_name, thing_arn
+ ):
+ thing_group = self._identify_thing_group(thing_group_name, thing_group_arn)
+ thing = self._identify_thing(thing_name, thing_arn)
+ if thing.arn not in thing_group.things:
+ # aws ignores non-registered thing
+ return
+ del thing_group.things[thing.arn]
+
+ def list_things_in_thing_group(self, thing_group_name):
+ """
+ Pagination and the recursive-parameter is not yet implemented
+ """
+ thing_group = self.describe_thing_group(thing_group_name)
+ return thing_group.things.values()
+
+ def list_thing_groups_for_thing(self, thing_name):
+ """
+ Pagination is not yet implemented
+ """
+ thing = self.describe_thing(thing_name)
+ all_thing_groups = self.list_thing_groups(None, None, None)
+ ret = []
+ for thing_group in all_thing_groups:
+ if thing.arn in thing_group.things:
+ ret.append(
+ {
+ "groupName": thing_group.thing_group_name,
+ "groupArn": thing_group.arn,
+ }
+ )
+ return ret
+
+ def update_thing_groups_for_thing(
+ self, thing_name, thing_groups_to_add, thing_groups_to_remove
+ ):
+ thing = self.describe_thing(thing_name)
+ for thing_group_name in thing_groups_to_add:
+ thing_group = self.describe_thing_group(thing_group_name)
+ self.add_thing_to_thing_group(
+ thing_group.thing_group_name, None, thing.thing_name, None
+ )
+ for thing_group_name in thing_groups_to_remove:
+ thing_group = self.describe_thing_group(thing_group_name)
+ self.remove_thing_from_thing_group(
+ thing_group.thing_group_name, None, thing.thing_name, None
+ )
+
+ def create_job(
+ self,
+ job_id,
+ targets,
+ document_source,
+ document,
+ description,
+ presigned_url_config,
+ target_selection,
+ job_executions_rollout_config,
+ document_parameters,
+ ):
+ job = FakeJob(
+ job_id,
+ targets,
+ document_source,
+ document,
+ description,
+ presigned_url_config,
+ target_selection,
+ job_executions_rollout_config,
+ document_parameters,
+ self.region_name,
+ )
+ self.jobs[job_id] = job
+
+ for thing_arn in targets:
+ thing_name = thing_arn.split(":")[-1].split("/")[-1]
+ job_execution = FakeJobExecution(job_id, thing_arn)
+ self.job_executions[(job_id, thing_name)] = job_execution
+ return job.job_arn, job_id, description
+
+ def describe_job(self, job_id):
+ jobs = [_ for _ in self.jobs.values() if _.job_id == job_id]
+ if len(jobs) == 0:
+ raise ResourceNotFoundException()
+ return jobs[0]
+
+ def delete_job(self, job_id, force):
+ job = self.jobs[job_id]
+
+ if job.status == "IN_PROGRESS" and force:
+ del self.jobs[job_id]
+ elif job.status != "IN_PROGRESS":
+ del self.jobs[job_id]
+ else:
+ raise InvalidStateTransitionException()
+
+ def cancel_job(self, job_id, reason_code, comment, force):
+ job = self.jobs[job_id]
+
+ job.reason_code = reason_code if reason_code is not None else job.reason_code
+ job.comment = comment if comment is not None else job.comment
+ job.force = force if force is not None and force != job.force else job.force
+ job.status = "CANCELED"
+
+ if job.status == "IN_PROGRESS" and force:
+ self.jobs[job_id] = job
+ elif job.status != "IN_PROGRESS":
+ self.jobs[job_id] = job
+ else:
+ raise InvalidStateTransitionException()
+
+ return job
+
+ def get_job_document(self, job_id):
+ return self.jobs[job_id]
+
+ def list_jobs(self, max_results, token):
+ """
+ The following parameter are not yet implemented: Status, TargetSelection, ThingGroupName, ThingGroupId
+ """
+ all_jobs = [_.to_dict() for _ in self.jobs.values()]
+ filtered_jobs = all_jobs
+
+ if token is None:
+ jobs = filtered_jobs[0:max_results]
+ next_token = str(max_results) if len(filtered_jobs) > max_results else None
+ else:
+ token = int(token)
+ jobs = filtered_jobs[token : token + max_results]
+ next_token = (
+ str(token + max_results)
+ if len(filtered_jobs) > token + max_results
+ else None
+ )
+
+ return jobs, next_token
+
+ def describe_job_execution(self, job_id, thing_name, execution_number):
+ try:
+ job_execution = self.job_executions[(job_id, thing_name)]
+ except KeyError:
+ raise ResourceNotFoundException()
+
+ if job_execution is None or (
+ execution_number is not None
+ and job_execution.execution_number != execution_number
+ ):
+ raise ResourceNotFoundException()
+
+ return job_execution
+
+ def cancel_job_execution(self, job_id, thing_name, force):
+ """
+ The parameters ExpectedVersion and StatusDetails are not yet implemented
+ """
+ job_execution = self.job_executions[(job_id, thing_name)]
+
+ if job_execution is None:
+ raise ResourceNotFoundException()
+
+ job_execution.force_canceled = (
+ force if force is not None else job_execution.force_canceled
+ )
+ # TODO: implement expected_version and status_details (at most 10 can be specified)
+
+ if job_execution.status == "IN_PROGRESS" and force:
+ job_execution.status = "CANCELED"
+ self.job_executions[(job_id, thing_name)] = job_execution
+ elif job_execution.status != "IN_PROGRESS":
+ job_execution.status = "CANCELED"
+ self.job_executions[(job_id, thing_name)] = job_execution
+ else:
+ raise InvalidStateTransitionException()
+
+ def delete_job_execution(self, job_id, thing_name, execution_number, force):
+ job_execution = self.job_executions[(job_id, thing_name)]
+
+ if job_execution.execution_number != execution_number:
+ raise ResourceNotFoundException()
+
+ if job_execution.status == "IN_PROGRESS" and force:
+ del self.job_executions[(job_id, thing_name)]
+ elif job_execution.status != "IN_PROGRESS":
+ del self.job_executions[(job_id, thing_name)]
+ else:
+ raise InvalidStateTransitionException()
+
+ def list_job_executions_for_job(self, job_id, status, max_results, next_token):
+ job_executions = [
+ self.job_executions[je].to_dict()
+ for je in self.job_executions
+ if je[0] == job_id
+ ]
+
+ if status is not None:
+ job_executions = list(
+ filter(
+ lambda elem: elem["jobExecutionSummary"].get("status") == status,
+ job_executions,
+ )
+ )
+
+ token = next_token
+ if token is None:
+ job_executions = job_executions[0:max_results]
+ next_token = str(max_results) if len(job_executions) > max_results else None
+ else:
+ token = int(token)
+ job_executions = job_executions[token : token + max_results]
+ next_token = (
+ str(token + max_results)
+ if len(job_executions) > token + max_results
+ else None
+ )
+
+ return job_executions, next_token
+
+ @paginate(PAGINATION_MODEL)
+ def list_job_executions_for_thing(self, thing_name, status):
+ job_executions = [
+ self.job_executions[je].to_dict()
+ for je in self.job_executions
+ if je[1] == thing_name
+ ]
+
+ if status is not None:
+ job_executions = list(
+ filter(
+ lambda elem: elem["jobExecutionSummary"].get("status") == status,
+ job_executions,
+ )
+ )
+
+ return job_executions
+
+ def list_topic_rules(self):
+ return [r.to_dict() for r in self.rules.values()]
+
+ def get_topic_rule(self, rule_name):
+ if rule_name not in self.rules:
+ raise ResourceNotFoundException()
+ return self.rules[rule_name].to_get_dict()
+
+ def create_topic_rule(self, rule_name, sql, **kwargs):
+ if rule_name in self.rules:
+ raise ResourceAlreadyExistsException(
+ "Rule with given name already exists", "", self.rules[rule_name].arn
+ )
+ result = re.search(r"FROM\s+([^\s]*)", sql)
+ topic = result.group(1).strip("'") if result else None
+ self.rules[rule_name] = FakeRule(
+ rule_name=rule_name,
+ created_at=int(time.time()),
+ topic_pattern=topic,
+ sql=sql,
+ region_name=self.region_name,
+ **kwargs,
+ )
+
+ def replace_topic_rule(self, rule_name, **kwargs):
+ self.delete_topic_rule(rule_name)
+ self.create_topic_rule(rule_name, **kwargs)
+
+ def delete_topic_rule(self, rule_name):
+ if rule_name not in self.rules:
+ raise ResourceNotFoundException()
+ del self.rules[rule_name]
+
+ def enable_topic_rule(self, rule_name):
+ if rule_name not in self.rules:
+ raise ResourceNotFoundException()
+ self.rules[rule_name].rule_disabled = False
+
+ def disable_topic_rule(self, rule_name):
+ if rule_name not in self.rules:
+ raise ResourceNotFoundException()
+ self.rules[rule_name].rule_disabled = True
+
+ def create_domain_configuration(
+ self,
+ domain_configuration_name,
+ domain_name,
+ server_certificate_arns,
+ authorizer_config,
+ service_type,
+ ):
+ """
+ The ValidationCertificateArn-parameter is not yet implemented
+ """
+ if domain_configuration_name in self.domain_configurations:
+ raise ResourceAlreadyExistsException(
+ "Domain configuration with given name already exists.",
+ self.domain_configurations[
+ domain_configuration_name
+ ].domain_configuration_name,
+ self.domain_configurations[
+ domain_configuration_name
+ ].domain_configuration_arn,
+ )
+ self.domain_configurations[domain_configuration_name] = FakeDomainConfiguration(
+ self.region_name,
+ domain_configuration_name,
+ domain_name,
+ server_certificate_arns,
+ "ENABLED",
+ service_type,
+ authorizer_config,
+ "CUSTOMER_MANAGED",
+ )
+ return self.domain_configurations[domain_configuration_name]
+
+ def delete_domain_configuration(self, domain_configuration_name):
+ if domain_configuration_name not in self.domain_configurations:
+ raise ResourceNotFoundException("The specified resource does not exist.")
+ del self.domain_configurations[domain_configuration_name]
+
+ def describe_domain_configuration(self, domain_configuration_name):
+ if domain_configuration_name not in self.domain_configurations:
+ raise ResourceNotFoundException("The specified resource does not exist.")
+ return self.domain_configurations[domain_configuration_name]
+
+ def list_domain_configurations(self):
+ return [_.to_dict() for _ in self.domain_configurations.values()]
+
+ def update_domain_configuration(
+ self,
+ domain_configuration_name,
+ authorizer_config,
+ domain_configuration_status,
+ remove_authorizer_config,
+ ):
+ if domain_configuration_name not in self.domain_configurations:
+ raise ResourceNotFoundException("The specified resource does not exist.")
+ domain_configuration = self.domain_configurations[domain_configuration_name]
+ if authorizer_config is not None:
+ domain_configuration.authorizer_config = authorizer_config
+ if domain_configuration_status is not None:
+ domain_configuration.domain_configuration_status = (
+ domain_configuration_status
+ )
+ if remove_authorizer_config is not None and remove_authorizer_config is True:
+ domain_configuration.authorizer_config = None
+ return domain_configuration
+
+ def search_index(self, query_string):
+ """
+ Pagination is not yet implemented. Only basic search queries are supported for now.
+ """
+ things = [
+ thing for thing in self.things.values() if thing.matches(query_string)
+ ]
+ groups = []
+ return [t.to_dict() for t in things], groups
+
+
+iot_backends = BackendDict(IoTBackend, "iot")
diff --git a/contrib/python/moto/py3/moto/iot/responses.py b/contrib/python/moto/py3/moto/iot/responses.py
new file mode 100644
index 0000000000..544e8e9446
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/responses.py
@@ -0,0 +1,772 @@
+import json
+from urllib.parse import unquote
+
+from moto.core.responses import BaseResponse
+from .models import iot_backends
+
+
+class IoTResponse(BaseResponse):
+ SERVICE_NAME = "iot"
+
+ @property
+ def iot_backend(self):
+ return iot_backends[self.region]
+
+ def create_certificate_from_csr(self):
+ certificate_signing_request = self._get_param("certificateSigningRequest")
+ set_as_active = self._get_param("setAsActive")
+ cert = self.iot_backend.create_certificate_from_csr(
+ certificate_signing_request, set_as_active=set_as_active
+ )
+ return json.dumps(
+ {
+ "certificateId": cert.certificate_id,
+ "certificateArn": cert.arn,
+ "certificatePem": cert.certificate_pem,
+ }
+ )
+
+ def create_thing(self):
+ thing_name = self._get_param("thingName")
+ thing_type_name = self._get_param("thingTypeName")
+ attribute_payload = self._get_param("attributePayload")
+ thing_name, thing_arn = self.iot_backend.create_thing(
+ thing_name=thing_name,
+ thing_type_name=thing_type_name,
+ attribute_payload=attribute_payload,
+ )
+ return json.dumps(dict(thingName=thing_name, thingArn=thing_arn))
+
+ def create_thing_type(self):
+ thing_type_name = self._get_param("thingTypeName")
+ thing_type_properties = self._get_param("thingTypeProperties")
+ thing_type_name, thing_type_arn = self.iot_backend.create_thing_type(
+ thing_type_name=thing_type_name, thing_type_properties=thing_type_properties
+ )
+ return json.dumps(
+ dict(thingTypeName=thing_type_name, thingTypeArn=thing_type_arn)
+ )
+
+ def list_thing_types(self):
+ previous_next_token = self._get_param("nextToken")
+ max_results = self._get_int_param(
+ "maxResults", 50
+ ) # not the default, but makes testing easier
+ thing_type_name = self._get_param("thingTypeName")
+ thing_types = self.iot_backend.list_thing_types(thing_type_name=thing_type_name)
+
+ thing_types = [_.to_dict() for _ in thing_types]
+ if previous_next_token is None:
+ result = thing_types[0:max_results]
+ next_token = str(max_results) if len(thing_types) > max_results else None
+ else:
+ token = int(previous_next_token)
+ result = thing_types[token : token + max_results]
+ next_token = (
+ str(token + max_results)
+ if len(thing_types) > token + max_results
+ else None
+ )
+
+ return json.dumps(dict(thingTypes=result, nextToken=next_token))
+
+ def list_things(self):
+ previous_next_token = self._get_param("nextToken")
+ max_results = self._get_int_param(
+ "maxResults", 50
+ ) # not the default, but makes testing easier
+ attribute_name = self._get_param("attributeName")
+ attribute_value = self._get_param("attributeValue")
+ thing_type_name = self._get_param("thingTypeName")
+ things, next_token = self.iot_backend.list_things(
+ attribute_name=attribute_name,
+ attribute_value=attribute_value,
+ thing_type_name=thing_type_name,
+ max_results=max_results,
+ token=previous_next_token,
+ )
+
+ return json.dumps(dict(things=things, nextToken=next_token))
+
+ def describe_thing(self):
+ thing_name = self._get_param("thingName")
+ thing = self.iot_backend.describe_thing(thing_name=thing_name)
+ return json.dumps(thing.to_dict(include_default_client_id=True))
+
+ def describe_thing_type(self):
+ thing_type_name = self._get_param("thingTypeName")
+ thing_type = self.iot_backend.describe_thing_type(
+ thing_type_name=thing_type_name
+ )
+ return json.dumps(thing_type.to_dict())
+
+ def describe_endpoint(self):
+ endpoint_type = self._get_param("endpointType", "iot:Data-ATS")
+ endpoint = self.iot_backend.describe_endpoint(endpoint_type=endpoint_type)
+ return json.dumps(endpoint.to_dict())
+
+ def delete_thing(self):
+ thing_name = self._get_param("thingName")
+ self.iot_backend.delete_thing(thing_name=thing_name)
+ return json.dumps(dict())
+
+ def delete_thing_type(self):
+ thing_type_name = self._get_param("thingTypeName")
+ self.iot_backend.delete_thing_type(thing_type_name=thing_type_name)
+ return json.dumps(dict())
+
+ def deprecate_thing_type(self):
+ thing_type_name = self._get_param("thingTypeName")
+ undo_deprecate = self._get_param("undoDeprecate")
+ thing_type = self.iot_backend.deprecate_thing_type(
+ thing_type_name=thing_type_name, undo_deprecate=undo_deprecate
+ )
+ return json.dumps(thing_type.to_dict())
+
+ def update_thing(self):
+ thing_name = self._get_param("thingName")
+ thing_type_name = self._get_param("thingTypeName")
+ attribute_payload = self._get_param("attributePayload")
+ remove_thing_type = self._get_param("removeThingType")
+ self.iot_backend.update_thing(
+ thing_name=thing_name,
+ thing_type_name=thing_type_name,
+ attribute_payload=attribute_payload,
+ remove_thing_type=remove_thing_type,
+ )
+ return json.dumps(dict())
+
+ def create_job(self):
+ job_arn, job_id, description = self.iot_backend.create_job(
+ job_id=self._get_param("jobId"),
+ targets=self._get_param("targets"),
+ description=self._get_param("description"),
+ document_source=self._get_param("documentSource"),
+ document=self._get_param("document"),
+ presigned_url_config=self._get_param("presignedUrlConfig"),
+ target_selection=self._get_param("targetSelection"),
+ job_executions_rollout_config=self._get_param("jobExecutionsRolloutConfig"),
+ document_parameters=self._get_param("documentParameters"),
+ )
+
+ return json.dumps(dict(jobArn=job_arn, jobId=job_id, description=description))
+
+ def describe_job(self):
+ job = self.iot_backend.describe_job(job_id=self._get_param("jobId"))
+ return json.dumps(
+ dict(
+ documentSource=job.document_source,
+ job=dict(
+ comment=job.comment,
+ completedAt=job.completed_at,
+ createdAt=job.created_at,
+ description=job.description,
+ documentParameters=job.document_parameters,
+ forceCanceled=job.force,
+ reasonCode=job.reason_code,
+ jobArn=job.job_arn,
+ jobExecutionsRolloutConfig=job.job_executions_rollout_config,
+ jobId=job.job_id,
+ jobProcessDetails=job.job_process_details,
+ lastUpdatedAt=job.last_updated_at,
+ presignedUrlConfig=job.presigned_url_config,
+ status=job.status,
+ targets=job.targets,
+ targetSelection=job.target_selection,
+ ),
+ )
+ )
+
+ def delete_job(self):
+ job_id = self._get_param("jobId")
+ force = self._get_bool_param("force")
+
+ self.iot_backend.delete_job(job_id=job_id, force=force)
+
+ return json.dumps(dict())
+
+ def cancel_job(self):
+ job_id = self._get_param("jobId")
+ reason_code = self._get_param("reasonCode")
+ comment = self._get_param("comment")
+ force = self._get_bool_param("force")
+
+ job = self.iot_backend.cancel_job(
+ job_id=job_id, reason_code=reason_code, comment=comment, force=force
+ )
+
+ return json.dumps(job.to_dict())
+
+ def get_job_document(self):
+ job = self.iot_backend.get_job_document(job_id=self._get_param("jobId"))
+
+ if job.document is not None:
+ return json.dumps({"document": job.document})
+ else:
+ # job.document_source is not None:
+ # TODO: needs to be implemented to get document_source's content from S3
+ return json.dumps({"document": ""})
+
+ def list_jobs(self):
+ # not the default, but makes testing easier
+ max_results = self._get_int_param("maxResults", 50)
+ previous_next_token = self._get_param("nextToken")
+ jobs, next_token = self.iot_backend.list_jobs(
+ max_results=max_results, token=previous_next_token
+ )
+
+ return json.dumps(dict(jobs=jobs, nextToken=next_token))
+
+ def describe_job_execution(self):
+ job_id = self._get_param("jobId")
+ thing_name = self._get_param("thingName")
+ execution_number = self._get_int_param("executionNumber")
+ job_execution = self.iot_backend.describe_job_execution(
+ job_id=job_id, thing_name=thing_name, execution_number=execution_number
+ )
+
+ return json.dumps(dict(execution=job_execution.to_get_dict()))
+
+ def cancel_job_execution(self):
+ job_id = self._get_param("jobId")
+ thing_name = self._get_param("thingName")
+ force = self._get_bool_param("force")
+
+ self.iot_backend.cancel_job_execution(
+ job_id=job_id, thing_name=thing_name, force=force
+ )
+
+ return json.dumps(dict())
+
+ def delete_job_execution(self):
+ job_id = self._get_param("jobId")
+ thing_name = self._get_param("thingName")
+ execution_number = self._get_int_param("executionNumber")
+ force = self._get_bool_param("force")
+
+ self.iot_backend.delete_job_execution(
+ job_id=job_id,
+ thing_name=thing_name,
+ execution_number=execution_number,
+ force=force,
+ )
+
+ return json.dumps(dict())
+
+ def list_job_executions_for_job(self):
+ job_id = self._get_param("jobId")
+ status = self._get_param("status")
+ max_results = self._get_int_param(
+ "maxResults", 50
+ ) # not the default, but makes testing easier
+ next_token = self._get_param("nextToken")
+ job_executions, next_token = self.iot_backend.list_job_executions_for_job(
+ job_id=job_id, status=status, max_results=max_results, next_token=next_token
+ )
+
+ return json.dumps(dict(executionSummaries=job_executions, nextToken=next_token))
+
+ def list_job_executions_for_thing(self):
+ thing_name = self._get_param("thingName")
+ status = self._get_param("status")
+ max_results = self._get_int_param(
+ "maxResults", 50
+ ) # not the default, but makes testing easier
+ next_token = self._get_param("nextToken")
+ job_executions, next_token = self.iot_backend.list_job_executions_for_thing(
+ thing_name=thing_name,
+ status=status,
+ max_results=max_results,
+ next_token=next_token,
+ )
+
+ return json.dumps(dict(executionSummaries=job_executions, nextToken=next_token))
+
+ def create_keys_and_certificate(self):
+ set_as_active = self._get_bool_param("setAsActive")
+ cert, key_pair = self.iot_backend.create_keys_and_certificate(
+ set_as_active=set_as_active
+ )
+ return json.dumps(
+ dict(
+ certificateArn=cert.arn,
+ certificateId=cert.certificate_id,
+ certificatePem=cert.certificate_pem,
+ keyPair=key_pair,
+ )
+ )
+
+ def delete_ca_certificate(self):
+ certificate_id = self.path.split("/")[-1]
+ self.iot_backend.delete_ca_certificate(certificate_id=certificate_id)
+ return json.dumps(dict())
+
+ def delete_certificate(self):
+ certificate_id = self._get_param("certificateId")
+ self.iot_backend.delete_certificate(certificate_id=certificate_id)
+ return json.dumps(dict())
+
+ def describe_ca_certificate(self):
+ certificate_id = self.path.split("/")[-1]
+ certificate = self.iot_backend.describe_ca_certificate(
+ certificate_id=certificate_id
+ )
+ return json.dumps(
+ {
+ "certificateDescription": certificate.to_description_dict(),
+ "registrationConfig": certificate.registration_config,
+ }
+ )
+
+ def describe_certificate(self):
+ certificate_id = self._get_param("certificateId")
+ certificate = self.iot_backend.describe_certificate(
+ certificate_id=certificate_id
+ )
+ return json.dumps(
+ dict(certificateDescription=certificate.to_description_dict())
+ )
+
+ def get_registration_code(self):
+ code = self.iot_backend.get_registration_code()
+ return json.dumps(dict(registrationCode=code))
+
+ def list_certificates(self):
+ # page_size = self._get_int_param("pageSize")
+ # marker = self._get_param("marker")
+ # ascending_order = self._get_param("ascendingOrder")
+ certificates = self.iot_backend.list_certificates()
+ return json.dumps(dict(certificates=[_.to_dict() for _ in certificates]))
+
+ def list_certificates_by_ca(self):
+ ca_certificate_id = self._get_param("caCertificateId")
+ certificates = self.iot_backend.list_certificates_by_ca(ca_certificate_id)
+ return json.dumps(dict(certificates=[_.to_dict() for _ in certificates]))
+
+ def register_ca_certificate(self):
+ ca_certificate = self._get_param("caCertificate")
+ set_as_active = self._get_bool_param("setAsActive")
+ registration_config = self._get_param("registrationConfig")
+
+ cert = self.iot_backend.register_ca_certificate(
+ ca_certificate=ca_certificate,
+ set_as_active=set_as_active,
+ registration_config=registration_config,
+ )
+ return json.dumps(
+ dict(certificateId=cert.certificate_id, certificateArn=cert.arn)
+ )
+
+ def register_certificate(self):
+ certificate_pem = self._get_param("certificatePem")
+ ca_certificate_pem = self._get_param("caCertificatePem")
+ set_as_active = self._get_bool_param("setAsActive")
+ status = self._get_param("status")
+
+ cert = self.iot_backend.register_certificate(
+ certificate_pem=certificate_pem,
+ ca_certificate_pem=ca_certificate_pem,
+ set_as_active=set_as_active,
+ status=status,
+ )
+ return json.dumps(
+ dict(certificateId=cert.certificate_id, certificateArn=cert.arn)
+ )
+
+ def register_certificate_without_ca(self):
+ certificate_pem = self._get_param("certificatePem")
+ status = self._get_param("status")
+
+ cert = self.iot_backend.register_certificate_without_ca(
+ certificate_pem=certificate_pem, status=status
+ )
+ return json.dumps(
+ dict(certificateId=cert.certificate_id, certificateArn=cert.arn)
+ )
+
+ def update_ca_certificate(self):
+ certificate_id = self.path.split("/")[-1]
+ new_status = self._get_param("newStatus")
+ config = self._get_param("registrationConfig")
+ self.iot_backend.update_ca_certificate(
+ certificate_id=certificate_id, new_status=new_status, config=config
+ )
+ return json.dumps(dict())
+
+ def update_certificate(self):
+ certificate_id = self._get_param("certificateId")
+ new_status = self._get_param("newStatus")
+ self.iot_backend.update_certificate(
+ certificate_id=certificate_id, new_status=new_status
+ )
+ return json.dumps(dict())
+
+ def create_policy(self):
+ policy_name = self._get_param("policyName")
+ policy_document = self._get_param("policyDocument")
+ policy = self.iot_backend.create_policy(
+ policy_name=policy_name, policy_document=policy_document
+ )
+ return json.dumps(policy.to_dict_at_creation())
+
+ def list_policies(self):
+ # marker = self._get_param("marker")
+ # page_size = self._get_int_param("pageSize")
+ # ascending_order = self._get_param("ascendingOrder")
+ policies = self.iot_backend.list_policies()
+
+ # TODO: implement pagination in the future
+ return json.dumps(dict(policies=[_.to_dict() for _ in policies]))
+
+ def get_policy(self):
+ policy_name = self._get_param("policyName")
+ policy = self.iot_backend.get_policy(policy_name=policy_name)
+ return json.dumps(policy.to_get_dict())
+
+ def delete_policy(self):
+ policy_name = self._get_param("policyName")
+ self.iot_backend.delete_policy(policy_name=policy_name)
+ return json.dumps(dict())
+
+ def create_policy_version(self):
+ policy_name = self._get_param("policyName")
+ policy_document = self._get_param("policyDocument")
+ set_as_default = self._get_bool_param("setAsDefault")
+ policy_version = self.iot_backend.create_policy_version(
+ policy_name, policy_document, set_as_default
+ )
+
+ return json.dumps(dict(policy_version.to_dict_at_creation()))
+
+ def set_default_policy_version(self):
+ policy_name = self._get_param("policyName")
+ version_id = self._get_param("policyVersionId")
+ self.iot_backend.set_default_policy_version(policy_name, version_id)
+
+ return json.dumps(dict())
+
+ def get_policy_version(self):
+ policy_name = self._get_param("policyName")
+ version_id = self._get_param("policyVersionId")
+ policy_version = self.iot_backend.get_policy_version(policy_name, version_id)
+ return json.dumps(dict(policy_version.to_get_dict()))
+
+ def list_policy_versions(self):
+ policy_name = self._get_param("policyName")
+ policiy_versions = self.iot_backend.list_policy_versions(
+ policy_name=policy_name
+ )
+
+ return json.dumps(dict(policyVersions=[_.to_dict() for _ in policiy_versions]))
+
+ def delete_policy_version(self):
+ policy_name = self._get_param("policyName")
+ version_id = self._get_param("policyVersionId")
+ self.iot_backend.delete_policy_version(policy_name, version_id)
+
+ return json.dumps(dict())
+
+ def attach_policy(self):
+ policy_name = self._get_param("policyName")
+ target = self._get_param("target")
+ self.iot_backend.attach_policy(policy_name=policy_name, target=target)
+ return json.dumps(dict())
+
+ def dispatch_attached_policies(self, request, full_url, headers):
+ # This endpoint requires specialized handling because it has
+ # a uri parameter containing forward slashes that is not
+ # correctly url encoded when we're running in server mode.
+ # https://github.com/pallets/flask/issues/900
+ self.setup_class(request, full_url, headers)
+ self.querystring["Action"] = ["ListAttachedPolicies"]
+ target = self.path.partition("/attached-policies/")[-1]
+ self.querystring["target"] = [unquote(target)] if "%" in target else [target]
+ return self.call_action()
+
+ def list_attached_policies(self):
+ principal = self._get_param("target")
+ # marker = self._get_param("marker")
+ # page_size = self._get_int_param("pageSize")
+ policies = self.iot_backend.list_attached_policies(target=principal)
+ # TODO: implement pagination in the future
+ next_marker = None
+ return json.dumps(
+ dict(policies=[_.to_dict() for _ in policies], nextMarker=next_marker)
+ )
+
+ def attach_principal_policy(self):
+ policy_name = self._get_param("policyName")
+ principal = self.headers.get("x-amzn-iot-principal")
+ self.iot_backend.attach_principal_policy(
+ policy_name=policy_name, principal_arn=principal
+ )
+ return json.dumps(dict())
+
+ def detach_policy(self):
+ policy_name = self._get_param("policyName")
+ target = self._get_param("target")
+ self.iot_backend.detach_policy(policy_name=policy_name, target=target)
+ return json.dumps(dict())
+
+ def detach_principal_policy(self):
+ policy_name = self._get_param("policyName")
+ principal = self.headers.get("x-amzn-iot-principal")
+ self.iot_backend.detach_principal_policy(
+ policy_name=policy_name, principal_arn=principal
+ )
+ return json.dumps(dict())
+
+ def list_principal_policies(self):
+ principal = self.headers.get("x-amzn-iot-principal")
+ # marker = self._get_param("marker")
+ # page_size = self._get_int_param("pageSize")
+ # ascending_order = self._get_param("ascendingOrder")
+ policies = self.iot_backend.list_principal_policies(principal_arn=principal)
+ # TODO: implement pagination in the future
+ next_marker = None
+ return json.dumps(
+ dict(policies=[_.to_dict() for _ in policies], nextMarker=next_marker)
+ )
+
+ def list_policy_principals(self):
+ policy_name = self.headers.get("x-amzn-iot-policy")
+ # marker = self._get_param("marker")
+ # page_size = self._get_int_param("pageSize")
+ # ascending_order = self._get_param("ascendingOrder")
+ principals = self.iot_backend.list_policy_principals(policy_name=policy_name)
+ # TODO: implement pagination in the future
+ next_marker = None
+ return json.dumps(dict(principals=principals, nextMarker=next_marker))
+
+ def attach_thing_principal(self):
+ thing_name = self._get_param("thingName")
+ principal = self.headers.get("x-amzn-principal")
+ self.iot_backend.attach_thing_principal(
+ thing_name=thing_name, principal_arn=principal
+ )
+ return json.dumps(dict())
+
+ def detach_thing_principal(self):
+ thing_name = self._get_param("thingName")
+ principal = self.headers.get("x-amzn-principal")
+ self.iot_backend.detach_thing_principal(
+ thing_name=thing_name, principal_arn=principal
+ )
+ return json.dumps(dict())
+
+ def list_principal_things(self):
+ next_token = self._get_param("nextToken")
+ # max_results = self._get_int_param("maxResults")
+ principal = self.headers.get("x-amzn-principal")
+ things = self.iot_backend.list_principal_things(principal_arn=principal)
+ # TODO: implement pagination in the future
+ next_token = None
+ return json.dumps(dict(things=things, nextToken=next_token))
+
+ def list_thing_principals(self):
+ thing_name = self._get_param("thingName")
+ principals = self.iot_backend.list_thing_principals(thing_name=thing_name)
+ return json.dumps(dict(principals=principals))
+
+ def describe_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ thing_group = self.iot_backend.describe_thing_group(
+ thing_group_name=thing_group_name
+ )
+ return json.dumps(thing_group.to_dict())
+
+ def create_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ parent_group_name = self._get_param("parentGroupName")
+ thing_group_properties = self._get_param("thingGroupProperties")
+ (
+ thing_group_name,
+ thing_group_arn,
+ thing_group_id,
+ ) = self.iot_backend.create_thing_group(
+ thing_group_name=thing_group_name,
+ parent_group_name=parent_group_name,
+ thing_group_properties=thing_group_properties,
+ )
+ return json.dumps(
+ dict(
+ thingGroupName=thing_group_name,
+ thingGroupArn=thing_group_arn,
+ thingGroupId=thing_group_id,
+ )
+ )
+
+ def delete_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ self.iot_backend.delete_thing_group(thing_group_name=thing_group_name)
+ return json.dumps(dict())
+
+ def list_thing_groups(self):
+ # next_token = self._get_param("nextToken")
+ # max_results = self._get_int_param("maxResults")
+ parent_group = self._get_param("parentGroup")
+ name_prefix_filter = self._get_param("namePrefixFilter")
+ recursive = self._get_bool_param("recursive")
+ thing_groups = self.iot_backend.list_thing_groups(
+ parent_group=parent_group,
+ name_prefix_filter=name_prefix_filter,
+ recursive=recursive,
+ )
+ next_token = None
+ rets = [
+ {"groupName": _.thing_group_name, "groupArn": _.arn} for _ in thing_groups
+ ]
+ # TODO: implement pagination in the future
+ return json.dumps(dict(thingGroups=rets, nextToken=next_token))
+
+ def update_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ thing_group_properties = self._get_param("thingGroupProperties")
+ expected_version = self._get_param("expectedVersion")
+ version = self.iot_backend.update_thing_group(
+ thing_group_name=thing_group_name,
+ thing_group_properties=thing_group_properties,
+ expected_version=expected_version,
+ )
+ return json.dumps(dict(version=version))
+
+ def add_thing_to_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ thing_group_arn = self._get_param("thingGroupArn")
+ thing_name = self._get_param("thingName")
+ thing_arn = self._get_param("thingArn")
+ self.iot_backend.add_thing_to_thing_group(
+ thing_group_name=thing_group_name,
+ thing_group_arn=thing_group_arn,
+ thing_name=thing_name,
+ thing_arn=thing_arn,
+ )
+ return json.dumps(dict())
+
+ def remove_thing_from_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ thing_group_arn = self._get_param("thingGroupArn")
+ thing_name = self._get_param("thingName")
+ thing_arn = self._get_param("thingArn")
+ self.iot_backend.remove_thing_from_thing_group(
+ thing_group_name=thing_group_name,
+ thing_group_arn=thing_group_arn,
+ thing_name=thing_name,
+ thing_arn=thing_arn,
+ )
+ return json.dumps(dict())
+
+ def list_things_in_thing_group(self):
+ thing_group_name = self._get_param("thingGroupName")
+ things = self.iot_backend.list_things_in_thing_group(
+ thing_group_name=thing_group_name
+ )
+ next_token = None
+ thing_names = [_.thing_name for _ in things]
+ return json.dumps(dict(things=thing_names, nextToken=next_token))
+
+ def list_thing_groups_for_thing(self):
+ thing_name = self._get_param("thingName")
+ # next_token = self._get_param("nextToken")
+ # max_results = self._get_int_param("maxResults")
+ thing_groups = self.iot_backend.list_thing_groups_for_thing(
+ thing_name=thing_name
+ )
+ next_token = None
+ return json.dumps(dict(thingGroups=thing_groups, nextToken=next_token))
+
+ def update_thing_groups_for_thing(self):
+ thing_name = self._get_param("thingName")
+ thing_groups_to_add = self._get_param("thingGroupsToAdd") or []
+ thing_groups_to_remove = self._get_param("thingGroupsToRemove") or []
+ self.iot_backend.update_thing_groups_for_thing(
+ thing_name=thing_name,
+ thing_groups_to_add=thing_groups_to_add,
+ thing_groups_to_remove=thing_groups_to_remove,
+ )
+ return json.dumps(dict())
+
+ def list_topic_rules(self):
+ return json.dumps(dict(rules=self.iot_backend.list_topic_rules()))
+
+ def get_topic_rule(self):
+ return json.dumps(
+ self.iot_backend.get_topic_rule(rule_name=self._get_param("ruleName"))
+ )
+
+ def create_topic_rule(self):
+ self.iot_backend.create_topic_rule(
+ rule_name=self._get_param("ruleName"),
+ description=self._get_param("description"),
+ rule_disabled=self._get_param("ruleDisabled"),
+ actions=self._get_param("actions"),
+ error_action=self._get_param("errorAction"),
+ sql=self._get_param("sql"),
+ aws_iot_sql_version=self._get_param("awsIotSqlVersion"),
+ )
+ return json.dumps(dict())
+
+ def replace_topic_rule(self):
+ self.iot_backend.replace_topic_rule(
+ rule_name=self._get_param("ruleName"),
+ description=self._get_param("description"),
+ rule_disabled=self._get_param("ruleDisabled"),
+ actions=self._get_param("actions"),
+ error_action=self._get_param("errorAction"),
+ sql=self._get_param("sql"),
+ aws_iot_sql_version=self._get_param("awsIotSqlVersion"),
+ )
+ return json.dumps(dict())
+
+ def delete_topic_rule(self):
+ self.iot_backend.delete_topic_rule(rule_name=self._get_param("ruleName"))
+ return json.dumps(dict())
+
+ def enable_topic_rule(self):
+ self.iot_backend.enable_topic_rule(rule_name=self._get_param("ruleName"))
+ return json.dumps(dict())
+
+ def disable_topic_rule(self):
+ self.iot_backend.disable_topic_rule(rule_name=self._get_param("ruleName"))
+ return json.dumps(dict())
+
+ def create_domain_configuration(self):
+ domain_configuration = self.iot_backend.create_domain_configuration(
+ domain_configuration_name=self._get_param("domainConfigurationName"),
+ domain_name=self._get_param("domainName"),
+ server_certificate_arns=self._get_param("serverCertificateArns"),
+ authorizer_config=self._get_param("authorizerConfig"),
+ service_type=self._get_param("serviceType"),
+ )
+ return json.dumps(domain_configuration.to_dict())
+
+ def delete_domain_configuration(self):
+ self.iot_backend.delete_domain_configuration(
+ domain_configuration_name=self._get_param("domainConfigurationName")
+ )
+ return json.dumps(dict())
+
+ def describe_domain_configuration(self):
+ domain_configuration = self.iot_backend.describe_domain_configuration(
+ domain_configuration_name=self._get_param("domainConfigurationName")
+ )
+ return json.dumps(domain_configuration.to_description_dict())
+
+ def list_domain_configurations(self):
+ return json.dumps(
+ dict(domainConfigurations=self.iot_backend.list_domain_configurations())
+ )
+
+ def update_domain_configuration(self):
+ domain_configuration = self.iot_backend.update_domain_configuration(
+ domain_configuration_name=self._get_param("domainConfigurationName"),
+ authorizer_config=self._get_param("authorizerConfig"),
+ domain_configuration_status=self._get_param("domainConfigurationStatus"),
+ remove_authorizer_config=self._get_bool_param("removeAuthorizerConfig"),
+ )
+ return json.dumps(domain_configuration.to_dict())
+
+ def search_index(self):
+ query = self._get_param("queryString")
+ things, groups = self.iot_backend.search_index(query)
+ return json.dumps({"things": things, "thingGroups": groups})
diff --git a/contrib/python/moto/py3/moto/iot/urls.py b/contrib/python/moto/py3/moto/iot/urls.py
new file mode 100644
index 0000000000..1425e28181
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/urls.py
@@ -0,0 +1,24 @@
+from .responses import IoTResponse
+
+url_bases = [r"https?://iot\.(.+)\.amazonaws\.com"]
+
+
+response = IoTResponse()
+
+
+url_paths = {
+ #
+ # Paths for :class:`moto.core.models.MockAWS`
+ #
+ # This route requires special handling.
+ "{0}/attached-policies/(?P<target>.*)$": response.dispatch_attached_policies,
+ # The remaining routes can be handled by the default dispatcher.
+ "{0}/.*$": response.dispatch,
+ #
+ # (Flask) Paths for :class:`moto.core.models.ServerModeMockAWS`
+ #
+ # This route requires special handling.
+ "{0}/attached-policies/<path:target>$": response.dispatch_attached_policies,
+ # The remaining routes can be handled by the default dispatcher.
+ "{0}/<path:route>$": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/iot/utils.py b/contrib/python/moto/py3/moto/iot/utils.py
new file mode 100644
index 0000000000..1a08f56b0e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iot/utils.py
@@ -0,0 +1,8 @@
+PAGINATION_MODEL = {
+ "list_job_executions_for_thing": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "jobId",
+ }
+}
diff --git a/contrib/python/moto/py3/moto/iotdata/__init__.py b/contrib/python/moto/py3/moto/iotdata/__init__.py
new file mode 100644
index 0000000000..48d9649798
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iotdata/__init__.py
@@ -0,0 +1,4 @@
+from .models import iotdata_backends
+from ..core.models import base_decorator
+
+mock_iotdata = base_decorator(iotdata_backends)
diff --git a/contrib/python/moto/py3/moto/iotdata/exceptions.py b/contrib/python/moto/py3/moto/iotdata/exceptions.py
new file mode 100644
index 0000000000..04c37edfc8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iotdata/exceptions.py
@@ -0,0 +1,25 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class IoTDataPlaneClientError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFoundException(IoTDataPlaneClientError):
+ def __init__(self):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException", "The specified resource does not exist"
+ )
+
+
+class InvalidRequestException(IoTDataPlaneClientError):
+ def __init__(self, message):
+ self.code = 400
+ super().__init__("InvalidRequestException", message)
+
+
+class ConflictException(IoTDataPlaneClientError):
+ def __init__(self, message):
+ self.code = 409
+ super().__init__("ConflictException", message)
diff --git a/contrib/python/moto/py3/moto/iotdata/models.py b/contrib/python/moto/py3/moto/iotdata/models.py
new file mode 100644
index 0000000000..02cc11d34a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iotdata/models.py
@@ -0,0 +1,197 @@
+import json
+import time
+import jsondiff
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import merge_dicts, BackendDict
+from moto.iot import iot_backends
+from .exceptions import (
+ ConflictException,
+ ResourceNotFoundException,
+ InvalidRequestException,
+)
+
+
+class FakeShadow(BaseModel):
+ """See the specification:
+ http://docs.aws.amazon.com/iot/latest/developerguide/thing-shadow-document-syntax.html
+ """
+
+ def __init__(self, desired, reported, requested_payload, version, deleted=False):
+ self.desired = desired
+ self.reported = reported
+ self.requested_payload = requested_payload
+ self.version = version
+ self.timestamp = int(time.time())
+ self.deleted = deleted
+
+ self.metadata_desired = self._create_metadata_from_state(
+ self.desired, self.timestamp
+ )
+ self.metadata_reported = self._create_metadata_from_state(
+ self.reported, self.timestamp
+ )
+
+ @classmethod
+ def create_from_previous_version(cls, previous_shadow, payload):
+ """
+ set None to payload when you want to delete shadow
+ """
+ version, previous_payload = (
+ (previous_shadow.version + 1, previous_shadow.to_dict(include_delta=False))
+ if previous_shadow
+ else (1, {})
+ )
+
+ if payload is None:
+ # if given payload is None, delete existing payload
+ # this means the request was delete_thing_shadow
+ shadow = FakeShadow(None, None, None, version, deleted=True)
+ return shadow
+
+ # Updates affect only the fields specified in the request state document.
+ # Any field with a value of None is removed from the device's shadow.
+ state_document = previous_payload.copy()
+ merge_dicts(state_document, payload, remove_nulls=True)
+ desired = state_document.get("state", {}).get("desired")
+ reported = state_document.get("state", {}).get("reported")
+ shadow = FakeShadow(desired, reported, payload, version)
+ return shadow
+
+ @classmethod
+ def parse_payload(cls, desired, reported):
+ if desired is None:
+ delta = reported
+ elif reported is None:
+ delta = desired
+ else:
+ delta = jsondiff.diff(desired, reported)
+ return delta
+
+ def _create_metadata_from_state(self, state, ts):
+ """
+ state must be disired or reported stype dict object
+ replces primitive type with {"timestamp": ts} in dict
+ """
+ if state is None:
+ return None
+
+ def _f(elem, ts):
+ if isinstance(elem, dict):
+ return {_: _f(elem[_], ts) for _ in elem.keys()}
+ if isinstance(elem, list):
+ return [_f(_, ts) for _ in elem]
+ return {"timestamp": ts}
+
+ return _f(state, ts)
+
+ def to_response_dict(self):
+ desired = self.requested_payload["state"].get("desired", None)
+ reported = self.requested_payload["state"].get("reported", None)
+
+ payload = {}
+ if desired is not None:
+ payload["desired"] = desired
+ if reported is not None:
+ payload["reported"] = reported
+
+ metadata = {}
+ if desired is not None:
+ metadata["desired"] = self._create_metadata_from_state(
+ desired, self.timestamp
+ )
+ if reported is not None:
+ metadata["reported"] = self._create_metadata_from_state(
+ reported, self.timestamp
+ )
+ return {
+ "state": payload,
+ "metadata": metadata,
+ "timestamp": self.timestamp,
+ "version": self.version,
+ }
+
+ def to_dict(self, include_delta=True):
+ """returning nothing except for just top-level keys for now."""
+ if self.deleted:
+ return {"timestamp": self.timestamp, "version": self.version}
+ delta = self.parse_payload(self.desired, self.reported)
+ payload = {}
+ if self.desired is not None:
+ payload["desired"] = self.desired
+ if self.reported is not None:
+ payload["reported"] = self.reported
+ if include_delta and (delta is not None and len(delta.keys()) != 0):
+ payload["delta"] = delta
+
+ metadata = {}
+ if self.metadata_desired is not None:
+ metadata["desired"] = self.metadata_desired
+ if self.metadata_reported is not None:
+ metadata["reported"] = self.metadata_reported
+
+ return {
+ "state": payload,
+ "metadata": metadata,
+ "timestamp": self.timestamp,
+ "version": self.version,
+ }
+
+
+class IoTDataPlaneBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.published_payloads = list()
+
+ def update_thing_shadow(self, thing_name, payload):
+ """
+ spec of payload:
+ - need node `state`
+ - state node must be an Object
+ - State contains an invalid node: 'foo'
+ """
+ thing = iot_backends[self.region_name].describe_thing(thing_name)
+
+ # validate
+ try:
+ payload = json.loads(payload)
+ except ValueError:
+ raise InvalidRequestException("invalid json")
+ if "state" not in payload:
+ raise InvalidRequestException("need node `state`")
+ if not isinstance(payload["state"], dict):
+ raise InvalidRequestException("state node must be an Object")
+ if any(_ for _ in payload["state"].keys() if _ not in ["desired", "reported"]):
+ raise InvalidRequestException("State contains an invalid node")
+
+ if "version" in payload and thing.thing_shadow.version != payload["version"]:
+ raise ConflictException("Version conflict")
+ new_shadow = FakeShadow.create_from_previous_version(
+ thing.thing_shadow, payload
+ )
+ thing.thing_shadow = new_shadow
+ return thing.thing_shadow
+
+ def get_thing_shadow(self, thing_name):
+ thing = iot_backends[self.region_name].describe_thing(thing_name)
+
+ if thing.thing_shadow is None or thing.thing_shadow.deleted:
+ raise ResourceNotFoundException()
+ return thing.thing_shadow
+
+ def delete_thing_shadow(self, thing_name):
+ thing = iot_backends[self.region_name].describe_thing(thing_name)
+ if thing.thing_shadow is None:
+ raise ResourceNotFoundException()
+ payload = None
+ new_shadow = FakeShadow.create_from_previous_version(
+ thing.thing_shadow, payload
+ )
+ thing.thing_shadow = new_shadow
+ return thing.thing_shadow
+
+ def publish(self, topic, payload):
+ self.published_payloads.append((topic, payload))
+
+
+iotdata_backends = BackendDict(IoTDataPlaneBackend, "iot")
diff --git a/contrib/python/moto/py3/moto/iotdata/responses.py b/contrib/python/moto/py3/moto/iotdata/responses.py
new file mode 100644
index 0000000000..02b8d6ea83
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iotdata/responses.py
@@ -0,0 +1,46 @@
+from moto.core.responses import BaseResponse
+from .models import iotdata_backends
+import json
+from urllib.parse import unquote
+
+
+class IoTDataPlaneResponse(BaseResponse):
+ SERVICE_NAME = "iot-data"
+
+ @property
+ def iotdata_backend(self):
+ return iotdata_backends[self.region]
+
+ def update_thing_shadow(self):
+ thing_name = self._get_param("thingName")
+ payload = self.body
+ payload = self.iotdata_backend.update_thing_shadow(
+ thing_name=thing_name, payload=payload
+ )
+ return json.dumps(payload.to_response_dict())
+
+ def get_thing_shadow(self):
+ thing_name = self._get_param("thingName")
+ payload = self.iotdata_backend.get_thing_shadow(thing_name=thing_name)
+ return json.dumps(payload.to_dict())
+
+ def delete_thing_shadow(self):
+ thing_name = self._get_param("thingName")
+ payload = self.iotdata_backend.delete_thing_shadow(thing_name=thing_name)
+ return json.dumps(payload.to_dict())
+
+ def dispatch_publish(self, request, full_url, headers):
+ # This endpoint requires specialized handling because it has
+ # a uri parameter containing forward slashes that is not
+ # correctly url encoded when we're running in server mode.
+ # https://github.com/pallets/flask/issues/900
+ self.setup_class(request, full_url, headers)
+ self.querystring["Action"] = ["Publish"]
+ topic = self.path.partition("/topics/")[-1]
+ self.querystring["target"] = [unquote(topic)] if "%" in topic else [topic]
+ return self.call_action()
+
+ def publish(self):
+ topic = self._get_param("target")
+ self.iotdata_backend.publish(topic=topic, payload=self.body)
+ return json.dumps(dict())
diff --git a/contrib/python/moto/py3/moto/iotdata/urls.py b/contrib/python/moto/py3/moto/iotdata/urls.py
new file mode 100644
index 0000000000..6e1adbbb9e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/iotdata/urls.py
@@ -0,0 +1,27 @@
+from .responses import IoTDataPlaneResponse
+
+url_bases = [
+ r"https?://data\.iot\.(.+)\.amazonaws.com",
+ r"https?://data-ats\.iot\.(.+)\.amazonaws.com",
+]
+
+
+response = IoTDataPlaneResponse()
+
+
+url_paths = {
+ #
+ # Paths for :class:`moto.core.models.MockAWS`
+ #
+ # This route requires special handling.
+ "{0}/topics/(?P<topic>.*)$": response.dispatch_publish,
+ # The remaining routes can be handled by the default dispatcher.
+ "{0}/.*$": response.dispatch,
+ #
+ # (Flask) Paths for :class:`moto.core.models.ServerModeMockAWS`
+ #
+ # This route requires special handling.
+ "{0}/topics/<path:topic>$": response.dispatch_publish,
+ # The remaining routes can be handled by the default dispatcher.
+ "{0}/<path:route>$": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/kinesis/__init__.py b/contrib/python/moto/py3/moto/kinesis/__init__.py
new file mode 100644
index 0000000000..a706a0101c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/__init__.py
@@ -0,0 +1,5 @@
+from .models import kinesis_backends
+from ..core.models import base_decorator
+
+kinesis_backend = kinesis_backends["us-east-1"]
+mock_kinesis = base_decorator(kinesis_backends)
diff --git a/contrib/python/moto/py3/moto/kinesis/exceptions.py b/contrib/python/moto/py3/moto/kinesis/exceptions.py
new file mode 100644
index 0000000000..9dbf1f0a20
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/exceptions.py
@@ -0,0 +1,80 @@
+import json
+from werkzeug.exceptions import BadRequest
+from moto.core import get_account_id
+
+
+class ResourceNotFoundError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceNotFoundException"}
+ )
+
+
+class ResourceInUseError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceInUseException"}
+ )
+
+
+class StreamNotFoundError(ResourceNotFoundError):
+ def __init__(self, stream_name):
+ super().__init__(
+ "Stream {0} under account {1} not found.".format(
+ stream_name, get_account_id()
+ )
+ )
+
+
+class ShardNotFoundError(ResourceNotFoundError):
+ def __init__(self, shard_id, stream):
+ super().__init__(
+ f"Could not find shard {shard_id} in stream {stream} under account {get_account_id()}."
+ )
+
+
+class ConsumerNotFound(ResourceNotFoundError):
+ def __init__(self, consumer):
+ super().__init__(f"Consumer {consumer}, account {get_account_id()} not found.")
+
+
+class InvalidArgumentError(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "InvalidArgumentException"}
+ )
+
+
+class InvalidRetentionPeriod(InvalidArgumentError):
+ def __init__(self, hours, too_short):
+ if too_short:
+ msg = f"Minimum allowed retention period is 24 hours. Requested retention period ({hours} hours) is too short."
+ else:
+ msg = f"Maximum allowed retention period is 8760 hours. Requested retention period ({hours} hours) is too long."
+ super().__init__(msg)
+
+
+class InvalidDecreaseRetention(InvalidArgumentError):
+ def __init__(self, name, requested, existing):
+ msg = f"Requested retention period ({requested} hours) for stream {name} can not be longer than existing retention period ({existing} hours). Use IncreaseRetentionPeriod API."
+ super().__init__(msg)
+
+
+class InvalidIncreaseRetention(InvalidArgumentError):
+ def __init__(self, name, requested, existing):
+ msg = f"Requested retention period ({requested} hours) for stream {name} can not be shorter than existing retention period ({existing} hours). Use DecreaseRetentionPeriod API."
+ super().__init__(msg)
+
+
+class ValidationException(BadRequest):
+ def __init__(self, value, position, regex_to_match):
+ super().__init__()
+ self.description = json.dumps(
+ {
+ "message": f"1 validation error detected: Value '{value}' at '{position}' failed to satisfy constraint: Member must satisfy regular expression pattern: {regex_to_match}",
+ "__type": "ValidationException",
+ }
+ )
diff --git a/contrib/python/moto/py3/moto/kinesis/models.py b/contrib/python/moto/py3/moto/kinesis/models.py
new file mode 100644
index 0000000000..a6f4955193
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/models.py
@@ -0,0 +1,793 @@
+from collections import OrderedDict
+import datetime
+import re
+import itertools
+
+from operator import attrgetter
+
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import unix_time, BackendDict
+from moto.core import get_account_id
+from moto.utilities.paginator import paginate
+from moto.utilities.utils import md5_hash
+from .exceptions import (
+ ConsumerNotFound,
+ StreamNotFoundError,
+ ShardNotFoundError,
+ ResourceInUseError,
+ ResourceNotFoundError,
+ InvalidArgumentError,
+ InvalidRetentionPeriod,
+ InvalidDecreaseRetention,
+ InvalidIncreaseRetention,
+ ValidationException,
+)
+from .utils import (
+ compose_shard_iterator,
+ compose_new_shard_iterator,
+ decompose_shard_iterator,
+ PAGINATION_MODEL,
+)
+
+
+class Consumer(BaseModel):
+ def __init__(self, consumer_name, region_name, stream_arn):
+ self.consumer_name = consumer_name
+ self.created = unix_time()
+ self.stream_arn = stream_arn
+ stream_name = stream_arn.split("/")[-1]
+ self.consumer_arn = f"arn:aws:kinesis:{region_name}:{get_account_id()}:stream/{stream_name}/consumer/{consumer_name}"
+
+ def to_json(self, include_stream_arn=False):
+ resp = {
+ "ConsumerName": self.consumer_name,
+ "ConsumerARN": self.consumer_arn,
+ "ConsumerStatus": "ACTIVE",
+ "ConsumerCreationTimestamp": self.created,
+ }
+ if include_stream_arn:
+ resp["StreamARN"] = self.stream_arn
+ return resp
+
+
+class Record(BaseModel):
+ def __init__(self, partition_key, data, sequence_number, explicit_hash_key):
+ self.partition_key = partition_key
+ self.data = data
+ self.sequence_number = sequence_number
+ self.explicit_hash_key = explicit_hash_key
+ self.created_at_datetime = datetime.datetime.utcnow()
+ self.created_at = unix_time(self.created_at_datetime)
+
+ def to_json(self):
+ return {
+ "Data": self.data,
+ "PartitionKey": self.partition_key,
+ "SequenceNumber": str(self.sequence_number),
+ "ApproximateArrivalTimestamp": self.created_at,
+ }
+
+
+class Shard(BaseModel):
+ def __init__(
+ self, shard_id, starting_hash, ending_hash, parent=None, adjacent_parent=None
+ ):
+ self._shard_id = shard_id
+ self.starting_hash = starting_hash
+ self.ending_hash = ending_hash
+ self.records = OrderedDict()
+ self.is_open = True
+ self.parent = parent
+ self.adjacent_parent = adjacent_parent
+
+ @property
+ def shard_id(self):
+ return "shardId-{0}".format(str(self._shard_id).zfill(12))
+
+ def get_records(self, last_sequence_id, limit):
+ last_sequence_id = int(last_sequence_id)
+ results = []
+ secs_behind_latest = 0
+
+ for sequence_number, record in self.records.items():
+ if sequence_number > last_sequence_id:
+ results.append(record)
+ last_sequence_id = sequence_number
+
+ very_last_record = self.records[next(reversed(self.records))]
+ secs_behind_latest = very_last_record.created_at - record.created_at
+
+ if len(results) == limit:
+ break
+
+ millis_behind_latest = int(secs_behind_latest * 1000)
+ return results, last_sequence_id, millis_behind_latest
+
+ def put_record(self, partition_key, data, explicit_hash_key):
+ # Note: this function is not safe for concurrency
+ if self.records:
+ last_sequence_number = self.get_max_sequence_number()
+ else:
+ last_sequence_number = 0
+ sequence_number = last_sequence_number + 1
+ self.records[sequence_number] = Record(
+ partition_key, data, sequence_number, explicit_hash_key
+ )
+ return str(sequence_number)
+
+ def get_min_sequence_number(self):
+ if self.records:
+ return list(self.records.keys())[0]
+ return 0
+
+ def get_max_sequence_number(self):
+ if self.records:
+ return list(self.records.keys())[-1]
+ return 0
+
+ def get_sequence_number_at(self, at_timestamp):
+ if not self.records or at_timestamp < list(self.records.values())[0].created_at:
+ return 0
+ else:
+ # find the last item in the list that was created before
+ # at_timestamp
+ r = next(
+ (
+ r
+ for r in reversed(self.records.values())
+ if r.created_at < at_timestamp
+ ),
+ None,
+ )
+ return r.sequence_number
+
+ def to_json(self):
+ response = {
+ "HashKeyRange": {
+ "EndingHashKey": str(self.ending_hash),
+ "StartingHashKey": str(self.starting_hash),
+ },
+ "SequenceNumberRange": {
+ "StartingSequenceNumber": str(self.get_min_sequence_number()),
+ },
+ "ShardId": self.shard_id,
+ }
+ if self.parent:
+ response["ParentShardId"] = self.parent
+ if self.adjacent_parent:
+ response["AdjacentParentShardId"] = self.adjacent_parent
+ if not self.is_open:
+ response["SequenceNumberRange"]["EndingSequenceNumber"] = str(
+ self.get_max_sequence_number()
+ )
+ return response
+
+
+class Stream(CloudFormationModel):
+ def __init__(self, stream_name, shard_count, retention_period_hours, region_name):
+ self.stream_name = stream_name
+ self.creation_datetime = datetime.datetime.now().strftime(
+ "%Y-%m-%dT%H:%M:%S.%f000"
+ )
+ self.region = region_name
+ self.account_number = get_account_id()
+ self.shards = {}
+ self.tags = {}
+ self.status = "ACTIVE"
+ self.shard_count = None
+ self.init_shards(shard_count)
+ self.retention_period_hours = (
+ retention_period_hours if retention_period_hours else 24
+ )
+ self.shard_level_metrics = []
+ self.encryption_type = "NONE"
+ self.key_id = None
+ self.consumers = []
+
+ def delete_consumer(self, consumer_arn):
+ self.consumers = [c for c in self.consumers if c.consumer_arn != consumer_arn]
+
+ def get_consumer_by_arn(self, consumer_arn):
+ return next((c for c in self.consumers if c.consumer_arn == consumer_arn), None)
+
+ def init_shards(self, shard_count):
+ self.shard_count = shard_count
+
+ step = 2**128 // shard_count
+ hash_ranges = itertools.chain(
+ map(lambda i: (i, i * step, (i + 1) * step - 1), range(shard_count - 1)),
+ [(shard_count - 1, (shard_count - 1) * step, 2**128)],
+ )
+ for index, start, end in hash_ranges:
+ shard = Shard(index, start, end)
+ self.shards[shard.shard_id] = shard
+
+ def split_shard(self, shard_to_split, new_starting_hash_key):
+ new_starting_hash_key = int(new_starting_hash_key)
+
+ shard = self.shards[shard_to_split]
+
+ if shard.starting_hash < new_starting_hash_key < shard.ending_hash:
+ pass
+ else:
+ raise InvalidArgumentError(
+ message=f"NewStartingHashKey {new_starting_hash_key} used in SplitShard() on shard {shard_to_split} in stream {self.stream_name} under account {get_account_id()} is not both greater than one plus the shard's StartingHashKey {shard.starting_hash} and less than the shard's EndingHashKey {(shard.ending_hash - 1)}."
+ )
+
+ if not shard.is_open:
+ raise InvalidArgumentError(
+ message=f"Shard {shard.shard_id} in stream {self.stream_name} under account {get_account_id()} has already been merged or split, and thus is not eligible for merging or splitting."
+ )
+
+ last_id = sorted(self.shards.values(), key=attrgetter("_shard_id"))[
+ -1
+ ]._shard_id
+
+ # Create two new shards
+ new_shard_1 = Shard(
+ last_id + 1,
+ starting_hash=shard.starting_hash,
+ ending_hash=new_starting_hash_key - 1,
+ parent=shard.shard_id,
+ )
+ new_shard_2 = Shard(
+ last_id + 2,
+ starting_hash=new_starting_hash_key,
+ ending_hash=shard.ending_hash,
+ parent=shard.shard_id,
+ )
+ self.shards[new_shard_1.shard_id] = new_shard_1
+ self.shards[new_shard_2.shard_id] = new_shard_2
+ shard.is_open = False
+
+ records = shard.records
+ shard.records = OrderedDict()
+
+ for index in records:
+ record = records[index]
+ self.put_record(record.partition_key, record.explicit_hash_key, record.data)
+
+ def merge_shards(self, shard_to_merge, adjacent_shard_to_merge):
+ shard1 = self.shards[shard_to_merge]
+ shard2 = self.shards[adjacent_shard_to_merge]
+
+ # Validate the two shards are adjacent
+ if shard1.ending_hash == (shard2.starting_hash - 1):
+ pass
+ elif shard2.ending_hash == (shard1.starting_hash + 1):
+ pass
+ else:
+ raise InvalidArgumentError(adjacent_shard_to_merge)
+
+ # Create a new shard
+ last_id = sorted(self.shards.values(), key=attrgetter("_shard_id"))[
+ -1
+ ]._shard_id
+ new_shard = Shard(
+ last_id + 1,
+ starting_hash=shard1.starting_hash,
+ ending_hash=shard2.ending_hash,
+ parent=shard1.shard_id,
+ adjacent_parent=shard2.shard_id,
+ )
+ self.shards[new_shard.shard_id] = new_shard
+
+ # Close the merged shards
+ shard1.is_open = False
+ shard2.is_open = False
+
+ # Move all data across
+ for record in shard1.records.values():
+ new_shard.put_record(
+ record.partition_key, record.data, record.explicit_hash_key
+ )
+ for record in shard2.records.values():
+ new_shard.put_record(
+ record.partition_key, record.data, record.explicit_hash_key
+ )
+
+ def update_shard_count(self, target_shard_count):
+ current_shard_count = len([s for s in self.shards.values() if s.is_open])
+ if current_shard_count == target_shard_count:
+ return
+
+ # Split shards until we have enough shards
+ # AWS seems to split until we have (current * 2) shards, and then merge until we reach the target
+ # That's what observable at least - the actual algorithm is probably more advanced
+ #
+ if current_shard_count < target_shard_count:
+ open_shards = [
+ (shard_id, shard)
+ for shard_id, shard in self.shards.items()
+ if shard.is_open
+ ]
+ for shard_id, shard in open_shards:
+ # Split the current shard
+ new_starting_hash_key = str(
+ int((shard.ending_hash + shard.starting_hash) / 2)
+ )
+ self.split_shard(shard_id, new_starting_hash_key)
+
+ current_shard_count = len([s for s in self.shards.values() if s.is_open])
+
+ # If we need to reduce the shard count, merge shards until we get there
+ while current_shard_count > target_shard_count:
+ # Keep track of how often we need to merge to get to the target shard count
+ required_shard_merges = current_shard_count - target_shard_count
+ # Get a list of pairs of adjacent shards
+ shard_list = sorted(
+ [s for s in self.shards.values() if s.is_open],
+ key=lambda x: x.starting_hash,
+ )
+ adjacent_shards = zip(
+ [s for s in shard_list[0:-1:2]], [s for s in shard_list[1::2]]
+ )
+
+ for (shard, adjacent) in adjacent_shards:
+ self.merge_shards(shard.shard_id, adjacent.shard_id)
+ required_shard_merges -= 1
+ if required_shard_merges == 0:
+ break
+
+ current_shard_count = len([s for s in self.shards.values() if s.is_open])
+
+ self.shard_count = target_shard_count
+
+ @property
+ def arn(self):
+ return "arn:aws:kinesis:{region}:{account_number}:stream/{stream_name}".format(
+ region=self.region,
+ account_number=self.account_number,
+ stream_name=self.stream_name,
+ )
+
+ def get_shard(self, shard_id):
+ if shard_id in self.shards:
+ return self.shards[shard_id]
+ else:
+ raise ShardNotFoundError(shard_id, stream="")
+
+ def get_shard_for_key(self, partition_key, explicit_hash_key):
+ if not isinstance(partition_key, str):
+ raise InvalidArgumentError("partition_key")
+ if len(partition_key) > 256:
+ raise InvalidArgumentError("partition_key")
+
+ if explicit_hash_key:
+ if not isinstance(explicit_hash_key, str):
+ raise InvalidArgumentError("explicit_hash_key")
+
+ key = int(explicit_hash_key)
+
+ if key >= 2**128:
+ raise InvalidArgumentError("explicit_hash_key")
+
+ else:
+ key = int(md5_hash(partition_key.encode("utf-8")).hexdigest(), 16)
+
+ for shard in self.shards.values():
+ if shard.starting_hash <= key < shard.ending_hash:
+ return shard
+
+ def put_record(self, partition_key, explicit_hash_key, data):
+ shard = self.get_shard_for_key(partition_key, explicit_hash_key)
+
+ sequence_number = shard.put_record(partition_key, data, explicit_hash_key)
+ return sequence_number, shard.shard_id
+
+ def to_json(self, shard_limit=None):
+ all_shards = list(self.shards.values())
+ requested_shards = all_shards[0 : shard_limit or len(all_shards)]
+ return {
+ "StreamDescription": {
+ "StreamARN": self.arn,
+ "StreamName": self.stream_name,
+ "StreamCreationTimestamp": self.creation_datetime,
+ "StreamStatus": self.status,
+ "HasMoreShards": len(requested_shards) != len(all_shards),
+ "RetentionPeriodHours": self.retention_period_hours,
+ "EnhancedMonitoring": [{"ShardLevelMetrics": self.shard_level_metrics}],
+ "EncryptionType": self.encryption_type,
+ "KeyId": self.key_id,
+ "Shards": [shard.to_json() for shard in requested_shards],
+ }
+ }
+
+ def to_json_summary(self):
+ return {
+ "StreamDescriptionSummary": {
+ "StreamARN": self.arn,
+ "StreamName": self.stream_name,
+ "StreamStatus": self.status,
+ "StreamCreationTimestamp": self.creation_datetime,
+ "OpenShardCount": self.shard_count,
+ }
+ }
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html
+ return "AWS::Kinesis::Stream"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ shard_count = properties.get("ShardCount", 1)
+ retention_period_hours = properties.get("RetentionPeriodHours", resource_name)
+ tags = {
+ tag_item["Key"]: tag_item["Value"]
+ for tag_item in properties.get("Tags", [])
+ }
+
+ backend = kinesis_backends[region_name]
+ stream = backend.create_stream(
+ resource_name, shard_count, retention_period_hours
+ )
+ if any(tags):
+ backend.add_tags_to_stream(stream.stream_name, tags)
+ return stream
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ if Stream.is_replacement_update(properties):
+ resource_name_property = cls.cloudformation_name_type()
+ if resource_name_property not in properties:
+ properties[resource_name_property] = new_resource_name
+ new_resource = cls.create_from_cloudformation_json(
+ properties[resource_name_property], cloudformation_json, region_name
+ )
+ properties[resource_name_property] = original_resource.name
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else: # No Interruption
+ if "ShardCount" in properties:
+ original_resource.update_shard_count(properties["ShardCount"])
+ if "RetentionPeriodHours" in properties:
+ original_resource.retention_period_hours = properties[
+ "RetentionPeriodHours"
+ ]
+ if "Tags" in properties:
+ original_resource.tags = {
+ tag_item["Key"]: tag_item["Value"]
+ for tag_item in properties.get("Tags", [])
+ }
+ return original_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ backend = kinesis_backends[region_name]
+ backend.delete_stream(resource_name)
+
+ @staticmethod
+ def is_replacement_update(properties):
+ properties_requiring_replacement_update = ["BucketName", "ObjectLockEnabled"]
+ return any(
+ [
+ property_requiring_replacement in properties
+ for property_requiring_replacement in properties_requiring_replacement_update
+ ]
+ )
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.stream_name
+
+
+class KinesisBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.streams = OrderedDict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "kinesis", special_service_name="kinesis-streams"
+ )
+
+ def create_stream(self, stream_name, shard_count, retention_period_hours):
+ if stream_name in self.streams:
+ raise ResourceInUseError(stream_name)
+ stream = Stream(
+ stream_name, shard_count, retention_period_hours, self.region_name
+ )
+ self.streams[stream_name] = stream
+ return stream
+
+ def describe_stream(self, stream_name):
+ if stream_name in self.streams:
+ return self.streams[stream_name]
+ else:
+ raise StreamNotFoundError(stream_name)
+
+ def describe_stream_summary(self, stream_name):
+ return self.describe_stream(stream_name)
+
+ def list_streams(self):
+ return self.streams.values()
+
+ def delete_stream(self, stream_name):
+ if stream_name in self.streams:
+ return self.streams.pop(stream_name)
+ raise StreamNotFoundError(stream_name)
+
+ def get_shard_iterator(
+ self,
+ stream_name,
+ shard_id,
+ shard_iterator_type,
+ starting_sequence_number,
+ at_timestamp,
+ ):
+ # Validate params
+ stream = self.describe_stream(stream_name)
+ try:
+ shard = stream.get_shard(shard_id)
+ except ShardNotFoundError:
+ raise ResourceNotFoundError(
+ message=f"Shard {shard_id} in stream {stream_name} under account {get_account_id()} does not exist"
+ )
+
+ shard_iterator = compose_new_shard_iterator(
+ stream_name,
+ shard,
+ shard_iterator_type,
+ starting_sequence_number,
+ at_timestamp,
+ )
+ return shard_iterator
+
+ def get_records(self, shard_iterator, limit):
+ decomposed = decompose_shard_iterator(shard_iterator)
+ stream_name, shard_id, last_sequence_id = decomposed
+
+ stream = self.describe_stream(stream_name)
+ shard = stream.get_shard(shard_id)
+
+ records, last_sequence_id, millis_behind_latest = shard.get_records(
+ last_sequence_id, limit
+ )
+
+ next_shard_iterator = compose_shard_iterator(
+ stream_name, shard, last_sequence_id
+ )
+
+ return next_shard_iterator, records, millis_behind_latest
+
+ def put_record(
+ self,
+ stream_name,
+ partition_key,
+ explicit_hash_key,
+ data,
+ ):
+ stream = self.describe_stream(stream_name)
+
+ sequence_number, shard_id = stream.put_record(
+ partition_key, explicit_hash_key, data
+ )
+
+ return sequence_number, shard_id
+
+ def put_records(self, stream_name, records):
+ stream = self.describe_stream(stream_name)
+
+ response = {"FailedRecordCount": 0, "Records": []}
+
+ for record in records:
+ partition_key = record.get("PartitionKey")
+ explicit_hash_key = record.get("ExplicitHashKey")
+ data = record.get("Data")
+
+ sequence_number, shard_id = stream.put_record(
+ partition_key, explicit_hash_key, data
+ )
+ response["Records"].append(
+ {"SequenceNumber": sequence_number, "ShardId": shard_id}
+ )
+
+ return response
+
+ def split_shard(self, stream_name, shard_to_split, new_starting_hash_key):
+ stream = self.describe_stream(stream_name)
+
+ if not re.match("[a-zA-Z0-9_.-]+", shard_to_split):
+ raise ValidationException(
+ value=shard_to_split,
+ position="shardToSplit",
+ regex_to_match="[a-zA-Z0-9_.-]+",
+ )
+
+ if shard_to_split not in stream.shards:
+ raise ShardNotFoundError(shard_id=shard_to_split, stream=stream_name)
+
+ if not re.match(r"0|([1-9]\d{0,38})", new_starting_hash_key):
+ raise ValidationException(
+ value=new_starting_hash_key,
+ position="newStartingHashKey",
+ regex_to_match=r"0|([1-9]\d{0,38})",
+ )
+
+ stream.split_shard(shard_to_split, new_starting_hash_key)
+
+ def merge_shards(self, stream_name, shard_to_merge, adjacent_shard_to_merge):
+ stream = self.describe_stream(stream_name)
+
+ if shard_to_merge not in stream.shards:
+ raise ShardNotFoundError(shard_to_merge, stream=stream_name)
+
+ if adjacent_shard_to_merge not in stream.shards:
+ raise ShardNotFoundError(adjacent_shard_to_merge, stream=stream_name)
+
+ stream.merge_shards(shard_to_merge, adjacent_shard_to_merge)
+
+ def update_shard_count(self, stream_name, target_shard_count):
+ stream = self.describe_stream(stream_name)
+ current_shard_count = len([s for s in stream.shards.values() if s.is_open])
+
+ stream.update_shard_count(target_shard_count)
+
+ return current_shard_count
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_shards(self, stream_name):
+ stream = self.describe_stream(stream_name)
+ shards = sorted(stream.shards.values(), key=lambda x: x.shard_id)
+ return [shard.to_json() for shard in shards]
+
+ def increase_stream_retention_period(self, stream_name, retention_period_hours):
+ stream = self.describe_stream(stream_name)
+ if retention_period_hours < 24:
+ raise InvalidRetentionPeriod(retention_period_hours, too_short=True)
+ if retention_period_hours > 8760:
+ raise InvalidRetentionPeriod(retention_period_hours, too_short=False)
+ if retention_period_hours < stream.retention_period_hours:
+ raise InvalidIncreaseRetention(
+ name=stream_name,
+ requested=retention_period_hours,
+ existing=stream.retention_period_hours,
+ )
+ stream.retention_period_hours = retention_period_hours
+
+ def decrease_stream_retention_period(self, stream_name, retention_period_hours):
+ stream = self.describe_stream(stream_name)
+ if retention_period_hours < 24:
+ raise InvalidRetentionPeriod(retention_period_hours, too_short=True)
+ if retention_period_hours > 8760:
+ raise InvalidRetentionPeriod(retention_period_hours, too_short=False)
+ if retention_period_hours > stream.retention_period_hours:
+ raise InvalidDecreaseRetention(
+ name=stream_name,
+ requested=retention_period_hours,
+ existing=stream.retention_period_hours,
+ )
+ stream.retention_period_hours = retention_period_hours
+
+ def list_tags_for_stream(
+ self, stream_name, exclusive_start_tag_key=None, limit=None
+ ):
+ stream = self.describe_stream(stream_name)
+
+ tags = []
+ result = {"HasMoreTags": False, "Tags": tags}
+ for key, val in sorted(stream.tags.items(), key=lambda x: x[0]):
+ if limit and len(tags) >= limit:
+ result["HasMoreTags"] = True
+ break
+ if exclusive_start_tag_key and key < exclusive_start_tag_key:
+ continue
+
+ tags.append({"Key": key, "Value": val})
+
+ return result
+
+ def add_tags_to_stream(self, stream_name, tags):
+ stream = self.describe_stream(stream_name)
+ stream.tags.update(tags)
+
+ def remove_tags_from_stream(self, stream_name, tag_keys):
+ stream = self.describe_stream(stream_name)
+ for key in tag_keys:
+ if key in stream.tags:
+ del stream.tags[key]
+
+ def enable_enhanced_monitoring(self, stream_name, shard_level_metrics):
+ stream = self.describe_stream(stream_name)
+ current_shard_level_metrics = stream.shard_level_metrics
+ desired_metrics = list(set(current_shard_level_metrics + shard_level_metrics))
+ stream.shard_level_metrics = desired_metrics
+ return current_shard_level_metrics, desired_metrics
+
+ def disable_enhanced_monitoring(self, stream_name, to_be_disabled):
+ stream = self.describe_stream(stream_name)
+ current_metrics = stream.shard_level_metrics
+ if "ALL" in to_be_disabled:
+ desired_metrics = []
+ else:
+ desired_metrics = [
+ metric for metric in current_metrics if metric not in to_be_disabled
+ ]
+ stream.shard_level_metrics = desired_metrics
+ return current_metrics, desired_metrics
+
+ def _find_stream_by_arn(self, stream_arn):
+ for stream in self.streams.values():
+ if stream.arn == stream_arn:
+ return stream
+
+ def list_stream_consumers(self, stream_arn):
+ """
+ Pagination is not yet implemented
+ """
+ stream = self._find_stream_by_arn(stream_arn)
+ return stream.consumers
+
+ def register_stream_consumer(self, stream_arn, consumer_name):
+ consumer = Consumer(consumer_name, self.region_name, stream_arn)
+ stream = self._find_stream_by_arn(stream_arn)
+ stream.consumers.append(consumer)
+ return consumer
+
+ def describe_stream_consumer(self, stream_arn, consumer_name, consumer_arn):
+ if stream_arn:
+ stream = self._find_stream_by_arn(stream_arn)
+ for consumer in stream.consumers:
+ if consumer_name and consumer.consumer_name == consumer_name:
+ return consumer
+ if consumer_arn:
+ for stream in self.streams.values():
+ consumer = stream.get_consumer_by_arn(consumer_arn)
+ if consumer:
+ return consumer
+ raise ConsumerNotFound(consumer=consumer_name or consumer_arn)
+
+ def deregister_stream_consumer(self, stream_arn, consumer_name, consumer_arn):
+ if stream_arn:
+ stream = self._find_stream_by_arn(stream_arn)
+ stream.consumers = [
+ c for c in stream.consumers if c.consumer_name == consumer_name
+ ]
+ if consumer_arn:
+ for stream in self.streams.values():
+ # Only one stream will actually have this consumer
+ # It will be a noop for other streams
+ stream.delete_consumer(consumer_arn)
+
+ def start_stream_encryption(self, stream_name, encryption_type, key_id):
+ stream = self.describe_stream(stream_name)
+ stream.encryption_type = encryption_type
+ stream.key_id = key_id
+
+ def stop_stream_encryption(self, stream_name):
+ stream = self.describe_stream(stream_name)
+ stream.encryption_type = "NONE"
+ stream.key_id = None
+
+
+kinesis_backends = BackendDict(KinesisBackend, "kinesis")
diff --git a/contrib/python/moto/py3/moto/kinesis/responses.py b/contrib/python/moto/py3/moto/kinesis/responses.py
new file mode 100644
index 0000000000..f8e3214094
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/responses.py
@@ -0,0 +1,278 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import kinesis_backends
+
+
+class KinesisResponse(BaseResponse):
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ @property
+ def kinesis_backend(self):
+ return kinesis_backends[self.region]
+
+ def create_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_count = self.parameters.get("ShardCount")
+ retention_period_hours = self.parameters.get("RetentionPeriodHours")
+ self.kinesis_backend.create_stream(
+ stream_name, shard_count, retention_period_hours
+ )
+ return ""
+
+ def describe_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ limit = self.parameters.get("Limit")
+ stream = self.kinesis_backend.describe_stream(stream_name)
+ return json.dumps(stream.to_json(shard_limit=limit))
+
+ def describe_stream_summary(self):
+ stream_name = self.parameters.get("StreamName")
+ stream = self.kinesis_backend.describe_stream_summary(stream_name)
+ return json.dumps(stream.to_json_summary())
+
+ def list_streams(self):
+ streams = self.kinesis_backend.list_streams()
+ stream_names = [stream.stream_name for stream in streams]
+ max_streams = self._get_param("Limit", 10)
+ try:
+ token = self.parameters.get("ExclusiveStartStreamName")
+ except ValueError:
+ token = self._get_param("ExclusiveStartStreamName")
+ if token:
+ start = stream_names.index(token) + 1
+ else:
+ start = 0
+ streams_resp = stream_names[start : start + max_streams]
+ has_more_streams = False
+ if start + max_streams < len(stream_names):
+ has_more_streams = True
+
+ return json.dumps(
+ {"HasMoreStreams": has_more_streams, "StreamNames": streams_resp}
+ )
+
+ def delete_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ self.kinesis_backend.delete_stream(stream_name)
+ return ""
+
+ def get_shard_iterator(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_id = self.parameters.get("ShardId")
+ shard_iterator_type = self.parameters.get("ShardIteratorType")
+ starting_sequence_number = self.parameters.get("StartingSequenceNumber")
+ at_timestamp = self.parameters.get("Timestamp")
+
+ shard_iterator = self.kinesis_backend.get_shard_iterator(
+ stream_name,
+ shard_id,
+ shard_iterator_type,
+ starting_sequence_number,
+ at_timestamp,
+ )
+
+ return json.dumps({"ShardIterator": shard_iterator})
+
+ def get_records(self):
+ shard_iterator = self.parameters.get("ShardIterator")
+ limit = self.parameters.get("Limit")
+
+ (
+ next_shard_iterator,
+ records,
+ millis_behind_latest,
+ ) = self.kinesis_backend.get_records(shard_iterator, limit)
+
+ return json.dumps(
+ {
+ "NextShardIterator": next_shard_iterator,
+ "Records": [record.to_json() for record in records],
+ "MillisBehindLatest": millis_behind_latest,
+ }
+ )
+
+ def put_record(self):
+ stream_name = self.parameters.get("StreamName")
+ partition_key = self.parameters.get("PartitionKey")
+ explicit_hash_key = self.parameters.get("ExplicitHashKey")
+ data = self.parameters.get("Data")
+
+ sequence_number, shard_id = self.kinesis_backend.put_record(
+ stream_name,
+ partition_key,
+ explicit_hash_key,
+ data,
+ )
+
+ return json.dumps({"SequenceNumber": sequence_number, "ShardId": shard_id})
+
+ def put_records(self):
+ stream_name = self.parameters.get("StreamName")
+ records = self.parameters.get("Records")
+
+ response = self.kinesis_backend.put_records(stream_name, records)
+
+ return json.dumps(response)
+
+ def split_shard(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_to_split = self.parameters.get("ShardToSplit")
+ new_starting_hash_key = self.parameters.get("NewStartingHashKey")
+ self.kinesis_backend.split_shard(
+ stream_name, shard_to_split, new_starting_hash_key
+ )
+ return ""
+
+ def merge_shards(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_to_merge = self.parameters.get("ShardToMerge")
+ adjacent_shard_to_merge = self.parameters.get("AdjacentShardToMerge")
+ self.kinesis_backend.merge_shards(
+ stream_name, shard_to_merge, adjacent_shard_to_merge
+ )
+ return ""
+
+ def list_shards(self):
+ stream_name = self.parameters.get("StreamName")
+ next_token = self.parameters.get("NextToken")
+ max_results = self.parameters.get("MaxResults", 10000)
+ shards, token = self.kinesis_backend.list_shards(
+ stream_name=stream_name, limit=max_results, next_token=next_token
+ )
+ res = {"Shards": shards}
+ if token:
+ res["NextToken"] = token
+ return json.dumps(res)
+
+ def update_shard_count(self):
+ stream_name = self.parameters.get("StreamName")
+ target_shard_count = self.parameters.get("TargetShardCount")
+ current_shard_count = self.kinesis_backend.update_shard_count(
+ stream_name=stream_name, target_shard_count=target_shard_count
+ )
+ return json.dumps(
+ dict(
+ StreamName=stream_name,
+ CurrentShardCount=current_shard_count,
+ TargetShardCount=target_shard_count,
+ )
+ )
+
+ def increase_stream_retention_period(self):
+ stream_name = self.parameters.get("StreamName")
+ retention_period_hours = self.parameters.get("RetentionPeriodHours")
+ self.kinesis_backend.increase_stream_retention_period(
+ stream_name, retention_period_hours
+ )
+ return ""
+
+ def decrease_stream_retention_period(self):
+ stream_name = self.parameters.get("StreamName")
+ retention_period_hours = self.parameters.get("RetentionPeriodHours")
+ self.kinesis_backend.decrease_stream_retention_period(
+ stream_name, retention_period_hours
+ )
+ return ""
+
+ def add_tags_to_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ tags = self.parameters.get("Tags")
+ self.kinesis_backend.add_tags_to_stream(stream_name, tags)
+ return json.dumps({})
+
+ def list_tags_for_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ exclusive_start_tag_key = self.parameters.get("ExclusiveStartTagKey")
+ limit = self.parameters.get("Limit")
+ response = self.kinesis_backend.list_tags_for_stream(
+ stream_name, exclusive_start_tag_key, limit
+ )
+ return json.dumps(response)
+
+ def remove_tags_from_stream(self):
+ stream_name = self.parameters.get("StreamName")
+ tag_keys = self.parameters.get("TagKeys")
+ self.kinesis_backend.remove_tags_from_stream(stream_name, tag_keys)
+ return json.dumps({})
+
+ def enable_enhanced_monitoring(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_level_metrics = self.parameters.get("ShardLevelMetrics")
+ current, desired = self.kinesis_backend.enable_enhanced_monitoring(
+ stream_name=stream_name, shard_level_metrics=shard_level_metrics
+ )
+ return json.dumps(
+ dict(
+ StreamName=stream_name,
+ CurrentShardLevelMetrics=current,
+ DesiredShardLevelMetrics=desired,
+ )
+ )
+
+ def disable_enhanced_monitoring(self):
+ stream_name = self.parameters.get("StreamName")
+ shard_level_metrics = self.parameters.get("ShardLevelMetrics")
+ current, desired = self.kinesis_backend.disable_enhanced_monitoring(
+ stream_name=stream_name, to_be_disabled=shard_level_metrics
+ )
+ return json.dumps(
+ dict(
+ StreamName=stream_name,
+ CurrentShardLevelMetrics=current,
+ DesiredShardLevelMetrics=desired,
+ )
+ )
+
+ def list_stream_consumers(self):
+ stream_arn = self.parameters.get("StreamARN")
+ consumers = self.kinesis_backend.list_stream_consumers(stream_arn=stream_arn)
+ return json.dumps(dict(Consumers=[c.to_json() for c in consumers]))
+
+ def register_stream_consumer(self):
+ stream_arn = self.parameters.get("StreamARN")
+ consumer_name = self.parameters.get("ConsumerName")
+ consumer = self.kinesis_backend.register_stream_consumer(
+ stream_arn=stream_arn, consumer_name=consumer_name
+ )
+ return json.dumps(dict(Consumer=consumer.to_json()))
+
+ def describe_stream_consumer(self):
+ stream_arn = self.parameters.get("StreamARN")
+ consumer_name = self.parameters.get("ConsumerName")
+ consumer_arn = self.parameters.get("ConsumerARN")
+ consumer = self.kinesis_backend.describe_stream_consumer(
+ stream_arn=stream_arn,
+ consumer_name=consumer_name,
+ consumer_arn=consumer_arn,
+ )
+ return json.dumps(
+ dict(ConsumerDescription=consumer.to_json(include_stream_arn=True))
+ )
+
+ def deregister_stream_consumer(self):
+ stream_arn = self.parameters.get("StreamARN")
+ consumer_name = self.parameters.get("ConsumerName")
+ consumer_arn = self.parameters.get("ConsumerARN")
+ self.kinesis_backend.deregister_stream_consumer(
+ stream_arn=stream_arn,
+ consumer_name=consumer_name,
+ consumer_arn=consumer_arn,
+ )
+ return json.dumps(dict())
+
+ def start_stream_encryption(self):
+ stream_name = self.parameters.get("StreamName")
+ encryption_type = self.parameters.get("EncryptionType")
+ key_id = self.parameters.get("KeyId")
+ self.kinesis_backend.start_stream_encryption(
+ stream_name=stream_name, encryption_type=encryption_type, key_id=key_id
+ )
+ return json.dumps(dict())
+
+ def stop_stream_encryption(self):
+ stream_name = self.parameters.get("StreamName")
+ self.kinesis_backend.stop_stream_encryption(stream_name=stream_name)
+ return json.dumps(dict())
diff --git a/contrib/python/moto/py3/moto/kinesis/urls.py b/contrib/python/moto/py3/moto/kinesis/urls.py
new file mode 100644
index 0000000000..cc7dec0b5f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/urls.py
@@ -0,0 +1,8 @@
+from .responses import KinesisResponse
+
+url_bases = [
+ # Need to avoid conflicting with kinesisvideo
+ r"https?://kinesis\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {"{0}/$": KinesisResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/kinesis/utils.py b/contrib/python/moto/py3/moto/kinesis/utils.py
new file mode 100644
index 0000000000..9de8052a1a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesis/utils.py
@@ -0,0 +1,61 @@
+import base64
+
+from .exceptions import InvalidArgumentError
+
+
+encode_method = base64.encodebytes
+decode_method = base64.decodebytes
+
+
+PAGINATION_MODEL = {
+ "list_shards": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 10000,
+ "unique_attribute": "ShardId",
+ "fail_on_invalid_token": False,
+ },
+}
+
+
+PAGINATION_MODEL = {
+ "list_shards": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 10000,
+ "unique_attribute": "ShardId",
+ "fail_on_invalid_token": False,
+ },
+}
+
+
+def compose_new_shard_iterator(
+ stream_name, shard, shard_iterator_type, starting_sequence_number, at_timestamp
+):
+ if shard_iterator_type == "AT_SEQUENCE_NUMBER":
+ last_sequence_id = int(starting_sequence_number) - 1
+ elif shard_iterator_type == "AFTER_SEQUENCE_NUMBER":
+ last_sequence_id = int(starting_sequence_number)
+ elif shard_iterator_type == "TRIM_HORIZON":
+ last_sequence_id = 0
+ elif shard_iterator_type == "LATEST":
+ last_sequence_id = shard.get_max_sequence_number()
+ elif shard_iterator_type == "AT_TIMESTAMP":
+ last_sequence_id = shard.get_sequence_number_at(at_timestamp)
+ else:
+ raise InvalidArgumentError(
+ "Invalid ShardIteratorType: {0}".format(shard_iterator_type)
+ )
+ return compose_shard_iterator(stream_name, shard, last_sequence_id)
+
+
+def compose_shard_iterator(stream_name, shard, last_sequence_id):
+ return encode_method(
+ "{0}:{1}:{2}".format(stream_name, shard.shard_id, last_sequence_id).encode(
+ "utf-8"
+ )
+ ).decode("utf-8")
+
+
+def decompose_shard_iterator(shard_iterator):
+ return decode_method(shard_iterator.encode("utf-8")).decode("utf-8").split(":")
diff --git a/contrib/python/moto/py3/moto/kinesisvideo/__init__.py b/contrib/python/moto/py3/moto/kinesisvideo/__init__.py
new file mode 100644
index 0000000000..ac1bfc6a56
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideo/__init__.py
@@ -0,0 +1,5 @@
+from .models import kinesisvideo_backends
+from ..core.models import base_decorator
+
+kinesisvideo_backend = kinesisvideo_backends["us-east-1"]
+mock_kinesisvideo = base_decorator(kinesisvideo_backends)
diff --git a/contrib/python/moto/py3/moto/kinesisvideo/exceptions.py b/contrib/python/moto/py3/moto/kinesisvideo/exceptions.py
new file mode 100644
index 0000000000..423b10556e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideo/exceptions.py
@@ -0,0 +1,20 @@
+from moto.core.exceptions import RESTError
+
+
+class KinesisvideoClientError(RESTError):
+ code = 400
+
+
+class ResourceNotFoundException(KinesisvideoClientError):
+ def __init__(self):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException",
+ "The requested stream is not found or not active.",
+ )
+
+
+class ResourceInUseException(KinesisvideoClientError):
+ def __init__(self, message):
+ self.code = 400
+ super().__init__("ResourceInUseException", message)
diff --git a/contrib/python/moto/py3/moto/kinesisvideo/models.py b/contrib/python/moto/py3/moto/kinesisvideo/models.py
new file mode 100644
index 0000000000..179a59fd65
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideo/models.py
@@ -0,0 +1,134 @@
+from moto.core import BaseBackend, BaseModel
+from datetime import datetime
+from .exceptions import ResourceNotFoundException, ResourceInUseException
+import random
+import string
+from moto.core.utils import get_random_hex, BackendDict
+from moto.core import get_account_id
+
+
+class Stream(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ device_name,
+ stream_name,
+ media_type,
+ kms_key_id,
+ data_retention_in_hours,
+ tags,
+ ):
+ self.region_name = region_name
+ self.stream_name = stream_name
+ self.device_name = device_name
+ self.media_type = media_type
+ self.kms_key_id = kms_key_id
+ self.data_retention_in_hours = data_retention_in_hours
+ self.tags = tags
+ self.status = "ACTIVE"
+ self.version = self._get_random_string()
+ self.creation_time = datetime.utcnow()
+ stream_arn = "arn:aws:kinesisvideo:{}:{}:stream/{}/1598784211076".format(
+ self.region_name, get_account_id(), self.stream_name
+ )
+ self.data_endpoint_number = get_random_hex()
+ self.arn = stream_arn
+
+ def _get_random_string(self, length=20):
+ letters = string.ascii_lowercase
+ result_str = "".join([random.choice(letters) for _ in range(length)])
+ return result_str
+
+ def get_data_endpoint(self, api_name):
+ data_endpoint_prefix = "s-" if api_name in ("PUT_MEDIA", "GET_MEDIA") else "b-"
+ return "https://{}{}.kinesisvideo.{}.amazonaws.com".format(
+ data_endpoint_prefix, self.data_endpoint_number, self.region_name
+ )
+
+ def to_dict(self):
+ return {
+ "DeviceName": self.device_name,
+ "StreamName": self.stream_name,
+ "StreamARN": self.arn,
+ "MediaType": self.media_type,
+ "KmsKeyId": self.kms_key_id,
+ "Version": self.version,
+ "Status": self.status,
+ "CreationTime": self.creation_time.isoformat(),
+ "DataRetentionInHours": self.data_retention_in_hours,
+ }
+
+
+class KinesisVideoBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.streams = {}
+
+ def create_stream(
+ self,
+ device_name,
+ stream_name,
+ media_type,
+ kms_key_id,
+ data_retention_in_hours,
+ tags,
+ ):
+ streams = [_ for _ in self.streams.values() if _.stream_name == stream_name]
+ if len(streams) > 0:
+ raise ResourceInUseException(
+ "The stream {} already exists.".format(stream_name)
+ )
+ stream = Stream(
+ self.region_name,
+ device_name,
+ stream_name,
+ media_type,
+ kms_key_id,
+ data_retention_in_hours,
+ tags,
+ )
+ self.streams[stream.arn] = stream
+ return stream.arn
+
+ def _get_stream(self, stream_name, stream_arn):
+ if stream_name:
+ streams = [_ for _ in self.streams.values() if _.stream_name == stream_name]
+ if len(streams) == 0:
+ raise ResourceNotFoundException()
+ stream = streams[0]
+ elif stream_arn:
+ stream = self.streams.get(stream_arn)
+ if stream is None:
+ raise ResourceNotFoundException()
+ return stream
+
+ def describe_stream(self, stream_name, stream_arn):
+ stream = self._get_stream(stream_name, stream_arn)
+ stream_info = stream.to_dict()
+ return stream_info
+
+ def list_streams(self):
+ """
+ Pagination and the StreamNameCondition-parameter are not yet implemented
+ """
+ stream_info_list = [_.to_dict() for _ in self.streams.values()]
+ next_token = None
+ return stream_info_list, next_token
+
+ def delete_stream(self, stream_arn):
+ """
+ The CurrentVersion-parameter is not yet implemented
+ """
+ stream = self.streams.get(stream_arn)
+ if stream is None:
+ raise ResourceNotFoundException()
+ del self.streams[stream_arn]
+
+ def get_data_endpoint(self, stream_name, stream_arn, api_name):
+ stream = self._get_stream(stream_name, stream_arn)
+ return stream.get_data_endpoint(api_name)
+
+ # add methods from here
+
+
+kinesisvideo_backends = BackendDict(KinesisVideoBackend, "kinesisvideo")
diff --git a/contrib/python/moto/py3/moto/kinesisvideo/responses.py b/contrib/python/moto/py3/moto/kinesisvideo/responses.py
new file mode 100644
index 0000000000..41d9546273
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideo/responses.py
@@ -0,0 +1,54 @@
+from moto.core.responses import BaseResponse
+from .models import kinesisvideo_backends
+import json
+
+
+class KinesisVideoResponse(BaseResponse):
+ SERVICE_NAME = "kinesisvideo"
+
+ @property
+ def kinesisvideo_backend(self):
+ return kinesisvideo_backends[self.region]
+
+ def create_stream(self):
+ device_name = self._get_param("DeviceName")
+ stream_name = self._get_param("StreamName")
+ media_type = self._get_param("MediaType")
+ kms_key_id = self._get_param("KmsKeyId")
+ data_retention_in_hours = self._get_int_param("DataRetentionInHours")
+ tags = self._get_param("Tags")
+ stream_arn = self.kinesisvideo_backend.create_stream(
+ device_name=device_name,
+ stream_name=stream_name,
+ media_type=media_type,
+ kms_key_id=kms_key_id,
+ data_retention_in_hours=data_retention_in_hours,
+ tags=tags,
+ )
+ return json.dumps(dict(StreamARN=stream_arn))
+
+ def describe_stream(self):
+ stream_name = self._get_param("StreamName")
+ stream_arn = self._get_param("StreamARN")
+ stream_info = self.kinesisvideo_backend.describe_stream(
+ stream_name=stream_name, stream_arn=stream_arn
+ )
+ return json.dumps(dict(StreamInfo=stream_info))
+
+ def list_streams(self):
+ stream_info_list, next_token = self.kinesisvideo_backend.list_streams()
+ return json.dumps(dict(StreamInfoList=stream_info_list, NextToken=next_token))
+
+ def delete_stream(self):
+ stream_arn = self._get_param("StreamARN")
+ self.kinesisvideo_backend.delete_stream(stream_arn=stream_arn)
+ return json.dumps(dict())
+
+ def get_data_endpoint(self):
+ stream_name = self._get_param("StreamName")
+ stream_arn = self._get_param("StreamARN")
+ api_name = self._get_param("APIName")
+ data_endpoint = self.kinesisvideo_backend.get_data_endpoint(
+ stream_name=stream_name, stream_arn=stream_arn, api_name=api_name
+ )
+ return json.dumps(dict(DataEndpoint=data_endpoint))
diff --git a/contrib/python/moto/py3/moto/kinesisvideo/urls.py b/contrib/python/moto/py3/moto/kinesisvideo/urls.py
new file mode 100644
index 0000000000..895120f687
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideo/urls.py
@@ -0,0 +1,17 @@
+from .responses import KinesisVideoResponse
+
+url_bases = [
+ r"https?://kinesisvideo\.(.+)\.amazonaws.com",
+]
+
+
+response = KinesisVideoResponse()
+
+
+url_paths = {
+ "{0}/createStream$": response.dispatch,
+ "{0}/describeStream$": response.dispatch,
+ "{0}/deleteStream$": response.dispatch,
+ "{0}/listStreams$": response.dispatch,
+ "{0}/getDataEndpoint$": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/__init__.py b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/__init__.py
new file mode 100644
index 0000000000..21412ffeab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/__init__.py
@@ -0,0 +1,5 @@
+from .models import kinesisvideoarchivedmedia_backends
+from ..core.models import base_decorator
+
+kinesisvideoarchivedmedia_backend = kinesisvideoarchivedmedia_backends["us-east-1"]
+mock_kinesisvideoarchivedmedia = base_decorator(kinesisvideoarchivedmedia_backends)
diff --git a/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/exceptions.py b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/exceptions.py
new file mode 100644
index 0000000000..a03fd62cb3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/exceptions.py
@@ -0,0 +1 @@
+# Not implemented exceptions for now
diff --git a/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/models.py b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/models.py
new file mode 100644
index 0000000000..6cdd469ef3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/models.py
@@ -0,0 +1,43 @@
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+from moto.kinesisvideo import kinesisvideo_backends
+from moto.sts.utils import random_session_token
+
+
+class KinesisVideoArchivedMediaBackend(BaseBackend):
+ def _get_streaming_url(self, stream_name, stream_arn, api_name):
+ stream = kinesisvideo_backends[self.region_name]._get_stream(
+ stream_name, stream_arn
+ )
+ data_endpoint = stream.get_data_endpoint(api_name)
+ session_token = random_session_token()
+ api_to_relative_path = {
+ "GET_HLS_STREAMING_SESSION_URL": "/hls/v1/getHLSMasterPlaylist.m3u8",
+ "GET_DASH_STREAMING_SESSION_URL": "/dash/v1/getDASHManifest.mpd",
+ }
+ relative_path = api_to_relative_path[api_name]
+ url = "{}{}?SessionToken={}".format(data_endpoint, relative_path, session_token)
+ return url
+
+ def get_hls_streaming_session_url(self, stream_name, stream_arn):
+ # Ignore option paramters as the format of hls_url does't depends on them
+ api_name = "GET_HLS_STREAMING_SESSION_URL"
+ url = self._get_streaming_url(stream_name, stream_arn, api_name)
+ return url
+
+ def get_dash_streaming_session_url(self, stream_name, stream_arn):
+ # Ignore option paramters as the format of hls_url does't depends on them
+ api_name = "GET_DASH_STREAMING_SESSION_URL"
+ url = self._get_streaming_url(stream_name, stream_arn, api_name)
+ return url
+
+ def get_clip(self, stream_name, stream_arn):
+ kinesisvideo_backends[self.region_name]._get_stream(stream_name, stream_arn)
+ content_type = "video/mp4" # Fixed content_type as it depends on input stream
+ payload = b"sample-mp4-video"
+ return content_type, payload
+
+
+kinesisvideoarchivedmedia_backends = BackendDict(
+ KinesisVideoArchivedMediaBackend, "kinesis-video-archived-media"
+)
diff --git a/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/responses.py b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/responses.py
new file mode 100644
index 0000000000..caa10ca549
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/responses.py
@@ -0,0 +1,40 @@
+from moto.core.responses import BaseResponse
+from .models import kinesisvideoarchivedmedia_backends
+import json
+
+
+class KinesisVideoArchivedMediaResponse(BaseResponse):
+ SERVICE_NAME = "kinesis-video-archived-media"
+
+ @property
+ def kinesisvideoarchivedmedia_backend(self):
+ return kinesisvideoarchivedmedia_backends[self.region]
+
+ def get_hls_streaming_session_url(self):
+ stream_name = self._get_param("StreamName")
+ stream_arn = self._get_param("StreamARN")
+ hls_streaming_session_url = (
+ self.kinesisvideoarchivedmedia_backend.get_hls_streaming_session_url(
+ stream_name=stream_name, stream_arn=stream_arn
+ )
+ )
+ return json.dumps(dict(HLSStreamingSessionURL=hls_streaming_session_url))
+
+ def get_dash_streaming_session_url(self):
+ stream_name = self._get_param("StreamName")
+ stream_arn = self._get_param("StreamARN")
+ dash_streaming_session_url = (
+ self.kinesisvideoarchivedmedia_backend.get_dash_streaming_session_url(
+ stream_name=stream_name, stream_arn=stream_arn
+ )
+ )
+ return json.dumps(dict(DASHStreamingSessionURL=dash_streaming_session_url))
+
+ def get_clip(self):
+ stream_name = self._get_param("StreamName")
+ stream_arn = self._get_param("StreamARN")
+ content_type, payload = self.kinesisvideoarchivedmedia_backend.get_clip(
+ stream_name=stream_name, stream_arn=stream_arn
+ )
+ new_headers = {"Content-Type": content_type}
+ return payload, new_headers
diff --git a/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/urls.py b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/urls.py
new file mode 100644
index 0000000000..5dc4576f77
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kinesisvideoarchivedmedia/urls.py
@@ -0,0 +1,13 @@
+from .responses import KinesisVideoArchivedMediaResponse
+
+url_bases = [
+ r"https?://.*\.kinesisvideo\.(.+)\.amazonaws.com",
+]
+
+
+response = KinesisVideoArchivedMediaResponse()
+
+
+url_paths = {
+ "{0}/.*$": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/kms/__init__.py b/contrib/python/moto/py3/moto/kms/__init__.py
new file mode 100644
index 0000000000..cb055437c3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/__init__.py
@@ -0,0 +1,5 @@
+from .models import kms_backends
+from ..core.models import base_decorator
+
+kms_backend = kms_backends["us-east-1"]
+mock_kms = base_decorator(kms_backends)
diff --git a/contrib/python/moto/py3/moto/kms/exceptions.py b/contrib/python/moto/py3/moto/kms/exceptions.py
new file mode 100644
index 0000000000..8808693a7f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/exceptions.py
@@ -0,0 +1,49 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class NotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("NotFoundException", message)
+
+
+class ValidationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
+
+
+class AlreadyExistsException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("AlreadyExistsException", message)
+
+
+class NotAuthorizedException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("NotAuthorizedException", None)
+
+ self.description = '{"__type":"NotAuthorizedException"}'
+
+
+class AccessDeniedException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("AccessDeniedException", message)
+
+ self.description = '{"__type":"AccessDeniedException"}'
+
+
+class InvalidCiphertextException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidCiphertextException", None)
+
+ self.description = '{"__type":"InvalidCiphertextException"}'
diff --git a/contrib/python/moto/py3/moto/kms/models.py b/contrib/python/moto/py3/moto/kms/models.py
new file mode 100644
index 0000000000..b60b32dde4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/models.py
@@ -0,0 +1,520 @@
+import json
+import os
+from collections import defaultdict
+from datetime import datetime, timedelta
+
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import get_random_hex, unix_time, BackendDict
+from moto.utilities.tagging_service import TaggingService
+from moto.core.exceptions import JsonRESTError
+
+from .utils import (
+ RESERVED_ALIASES,
+ decrypt,
+ encrypt,
+ generate_key_id,
+ generate_master_key,
+)
+
+
+class Grant(BaseModel):
+ def __init__(
+ self,
+ key_id,
+ name,
+ grantee_principal,
+ operations,
+ constraints,
+ retiring_principal,
+ ):
+ self.key_id = key_id
+ self.name = name
+ self.grantee_principal = grantee_principal
+ self.retiring_principal = retiring_principal
+ self.operations = operations
+ self.constraints = constraints
+ self.id = get_random_hex()
+ self.token = get_random_hex()
+
+ def to_json(self):
+ return {
+ "KeyId": self.key_id,
+ "GrantId": self.id,
+ "Name": self.name,
+ "GranteePrincipal": self.grantee_principal,
+ "RetiringPrincipal": self.retiring_principal,
+ "Operations": self.operations,
+ "Constraints": self.constraints,
+ }
+
+
+class Key(CloudFormationModel):
+ def __init__(
+ self, policy, key_usage, customer_master_key_spec, description, region
+ ):
+ self.id = generate_key_id()
+ self.creation_date = unix_time()
+ self.policy = policy or self.generate_default_policy()
+ self.key_usage = key_usage
+ self.key_state = "Enabled"
+ self.description = description or ""
+ self.enabled = True
+ self.region = region
+ self.account_id = get_account_id()
+ self.key_rotation_status = False
+ self.deletion_date = None
+ self.key_material = generate_master_key()
+ self.origin = "AWS_KMS"
+ self.key_manager = "CUSTOMER"
+ self.customer_master_key_spec = customer_master_key_spec or "SYMMETRIC_DEFAULT"
+
+ self.grants = dict()
+
+ def add_grant(
+ self, name, grantee_principal, operations, constraints, retiring_principal
+ ) -> Grant:
+ grant = Grant(
+ self.id,
+ name,
+ grantee_principal,
+ operations,
+ constraints=constraints,
+ retiring_principal=retiring_principal,
+ )
+ self.grants[grant.id] = grant
+ return grant
+
+ def list_grants(self, grant_id) -> [Grant]:
+ grant_ids = [grant_id] if grant_id else self.grants.keys()
+ return [grant for _id, grant in self.grants.items() if _id in grant_ids]
+
+ def list_retirable_grants(self, retiring_principal) -> [Grant]:
+ return [
+ grant
+ for grant in self.grants.values()
+ if grant.retiring_principal == retiring_principal
+ ]
+
+ def revoke_grant(self, grant_id) -> None:
+ self.grants.pop(grant_id, None)
+
+ def retire_grant(self, grant_id) -> None:
+ self.grants.pop(grant_id, None)
+
+ def retire_grant_by_token(self, grant_token) -> None:
+ self.grants = {
+ _id: grant
+ for _id, grant in self.grants.items()
+ if grant.token != grant_token
+ }
+
+ def generate_default_policy(self):
+ return json.dumps(
+ {
+ "Version": "2012-10-17",
+ "Id": "key-default-1",
+ "Statement": [
+ {
+ "Sid": "Enable IAM User Permissions",
+ "Effect": "Allow",
+ "Principal": {"AWS": f"arn:aws:iam::{get_account_id()}:root"},
+ "Action": "kms:*",
+ "Resource": "*",
+ }
+ ],
+ }
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @property
+ def arn(self):
+ return "arn:aws:kms:{0}:{1}:key/{2}".format(
+ self.region, self.account_id, self.id
+ )
+
+ @property
+ def encryption_algorithms(self):
+ if self.key_usage == "SIGN_VERIFY":
+ return None
+ elif self.customer_master_key_spec == "SYMMETRIC_DEFAULT":
+ return ["SYMMETRIC_DEFAULT"]
+ else:
+ return ["RSAES_OAEP_SHA_1", "RSAES_OAEP_SHA_256"]
+
+ @property
+ def signing_algorithms(self):
+ if self.key_usage == "ENCRYPT_DECRYPT":
+ return None
+ elif self.customer_master_key_spec in ["ECC_NIST_P256", "ECC_SECG_P256K1"]:
+ return ["ECDSA_SHA_256"]
+ elif self.customer_master_key_spec == "ECC_NIST_P384":
+ return ["ECDSA_SHA_384"]
+ elif self.customer_master_key_spec == "ECC_NIST_P521":
+ return ["ECDSA_SHA_512"]
+ else:
+ return [
+ "RSASSA_PKCS1_V1_5_SHA_256",
+ "RSASSA_PKCS1_V1_5_SHA_384",
+ "RSASSA_PKCS1_V1_5_SHA_512",
+ "RSASSA_PSS_SHA_256",
+ "RSASSA_PSS_SHA_384",
+ "RSASSA_PSS_SHA_512",
+ ]
+
+ def to_dict(self):
+ key_dict = {
+ "KeyMetadata": {
+ "AWSAccountId": self.account_id,
+ "Arn": self.arn,
+ "CreationDate": self.creation_date,
+ "CustomerMasterKeySpec": self.customer_master_key_spec,
+ "Description": self.description,
+ "Enabled": self.enabled,
+ "EncryptionAlgorithms": self.encryption_algorithms,
+ "KeyId": self.id,
+ "KeyManager": self.key_manager,
+ "KeyUsage": self.key_usage,
+ "KeyState": self.key_state,
+ "Origin": self.origin,
+ "SigningAlgorithms": self.signing_algorithms,
+ }
+ }
+ if self.key_state == "PendingDeletion":
+ key_dict["KeyMetadata"]["DeletionDate"] = unix_time(self.deletion_date)
+ return key_dict
+
+ def delete(self, region_name):
+ kms_backends[region_name].delete_key(self.id)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html
+ return "AWS::KMS::Key"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ kms_backend = kms_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ key = kms_backend.create_key(
+ policy=properties["KeyPolicy"],
+ key_usage="ENCRYPT_DECRYPT",
+ customer_master_key_spec="SYMMETRIC_DEFAULT",
+ description=properties["Description"],
+ tags=properties.get("Tags", []),
+ region=region_name,
+ )
+ key.key_rotation_status = properties["EnableKeyRotation"]
+ key.enabled = properties["Enabled"]
+
+ return key
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ raise UnformattedGetAttTemplateException()
+
+
+class KmsBackend(BaseBackend):
+ def __init__(self, region_name, account_id=None):
+ super().__init__(region_name=region_name, account_id=account_id)
+ self.keys = {}
+ self.key_to_aliases = defaultdict(set)
+ self.tagger = TaggingService(key_name="TagKey", value_name="TagValue")
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "kms"
+ )
+
+ def _generate_default_keys(self, alias_name):
+ """Creates default kms keys"""
+ if alias_name in RESERVED_ALIASES:
+ key = self.create_key(
+ None,
+ "ENCRYPT_DECRYPT",
+ "SYMMETRIC_DEFAULT",
+ "Default key",
+ None,
+ self.region_name,
+ )
+ self.add_alias(key.id, alias_name)
+ return key.id
+
+ def create_key(
+ self, policy, key_usage, customer_master_key_spec, description, tags, region
+ ):
+ key = Key(policy, key_usage, customer_master_key_spec, description, region)
+ self.keys[key.id] = key
+ if tags is not None and len(tags) > 0:
+ self.tag_resource(key.id, tags)
+ return key
+
+ def update_key_description(self, key_id, description):
+ key = self.keys[self.get_key_id(key_id)]
+ key.description = description
+
+ def delete_key(self, key_id):
+ if key_id in self.keys:
+ if key_id in self.key_to_aliases:
+ self.key_to_aliases.pop(key_id)
+ self.tagger.delete_all_tags_for_resource(key_id)
+
+ return self.keys.pop(key_id)
+
+ def describe_key(self, key_id) -> Key:
+ # allow the different methods (alias, ARN :key/, keyId, ARN alias) to
+ # describe key not just KeyId
+ key_id = self.get_key_id(key_id)
+ if r"alias/" in str(key_id).lower():
+ key_id = self.get_key_id_from_alias(key_id)
+ return self.keys[self.get_key_id(key_id)]
+
+ def list_keys(self):
+ return self.keys.values()
+
+ @staticmethod
+ def get_key_id(key_id):
+ # Allow use of ARN as well as pure KeyId
+ if key_id.startswith("arn:") and ":key/" in key_id:
+ return key_id.split(":key/")[1]
+
+ return key_id
+
+ @staticmethod
+ def get_alias_name(alias_name):
+ # Allow use of ARN as well as alias name
+ if alias_name.startswith("arn:") and ":alias/" in alias_name:
+ return alias_name.split(":alias/")[1]
+
+ return alias_name
+
+ def any_id_to_key_id(self, key_id):
+ """Go from any valid key ID to the raw key ID.
+
+ Acceptable inputs:
+ - raw key ID
+ - key ARN
+ - alias name
+ - alias ARN
+ """
+ key_id = self.get_alias_name(key_id)
+ key_id = self.get_key_id(key_id)
+ if key_id.startswith("alias/"):
+ key_id = self.get_key_id_from_alias(key_id)
+ return key_id
+
+ def alias_exists(self, alias_name):
+ for aliases in self.key_to_aliases.values():
+ if alias_name in aliases:
+ return True
+
+ return False
+
+ def add_alias(self, target_key_id, alias_name):
+ self.key_to_aliases[target_key_id].add(alias_name)
+
+ def delete_alias(self, alias_name):
+ """Delete the alias."""
+ for aliases in self.key_to_aliases.values():
+ if alias_name in aliases:
+ aliases.remove(alias_name)
+
+ def get_all_aliases(self):
+ return self.key_to_aliases
+
+ def get_key_id_from_alias(self, alias_name):
+ for key_id, aliases in dict(self.key_to_aliases).items():
+ if alias_name in ",".join(aliases):
+ return key_id
+ if alias_name in RESERVED_ALIASES:
+ key_id = self._generate_default_keys(alias_name)
+ return key_id
+ return None
+
+ def enable_key_rotation(self, key_id):
+ self.keys[self.get_key_id(key_id)].key_rotation_status = True
+
+ def disable_key_rotation(self, key_id):
+ self.keys[self.get_key_id(key_id)].key_rotation_status = False
+
+ def get_key_rotation_status(self, key_id):
+ return self.keys[self.get_key_id(key_id)].key_rotation_status
+
+ def put_key_policy(self, key_id, policy):
+ self.keys[self.get_key_id(key_id)].policy = policy
+
+ def get_key_policy(self, key_id):
+ return self.keys[self.get_key_id(key_id)].policy
+
+ def disable_key(self, key_id):
+ self.keys[key_id].enabled = False
+ self.keys[key_id].key_state = "Disabled"
+
+ def enable_key(self, key_id):
+ self.keys[key_id].enabled = True
+ self.keys[key_id].key_state = "Enabled"
+
+ def cancel_key_deletion(self, key_id):
+ self.keys[key_id].key_state = "Disabled"
+ self.keys[key_id].deletion_date = None
+
+ def schedule_key_deletion(self, key_id, pending_window_in_days):
+ if 7 <= pending_window_in_days <= 30:
+ self.keys[key_id].enabled = False
+ self.keys[key_id].key_state = "PendingDeletion"
+ self.keys[key_id].deletion_date = datetime.now() + timedelta(
+ days=pending_window_in_days
+ )
+ return unix_time(self.keys[key_id].deletion_date)
+
+ def encrypt(self, key_id, plaintext, encryption_context):
+ key_id = self.any_id_to_key_id(key_id)
+
+ ciphertext_blob = encrypt(
+ master_keys=self.keys,
+ key_id=key_id,
+ plaintext=plaintext,
+ encryption_context=encryption_context,
+ )
+ arn = self.keys[key_id].arn
+ return ciphertext_blob, arn
+
+ def decrypt(self, ciphertext_blob, encryption_context):
+ plaintext, key_id = decrypt(
+ master_keys=self.keys,
+ ciphertext_blob=ciphertext_blob,
+ encryption_context=encryption_context,
+ )
+ arn = self.keys[key_id].arn
+ return plaintext, arn
+
+ def re_encrypt(
+ self,
+ ciphertext_blob,
+ source_encryption_context,
+ destination_key_id,
+ destination_encryption_context,
+ ):
+ destination_key_id = self.any_id_to_key_id(destination_key_id)
+
+ plaintext, decrypting_arn = self.decrypt(
+ ciphertext_blob=ciphertext_blob,
+ encryption_context=source_encryption_context,
+ )
+ new_ciphertext_blob, encrypting_arn = self.encrypt(
+ key_id=destination_key_id,
+ plaintext=plaintext,
+ encryption_context=destination_encryption_context,
+ )
+ return new_ciphertext_blob, decrypting_arn, encrypting_arn
+
+ def generate_data_key(self, key_id, encryption_context, number_of_bytes, key_spec):
+ key_id = self.any_id_to_key_id(key_id)
+
+ if key_spec:
+ # Note: Actual validation of key_spec is done in kms.responses
+ if key_spec == "AES_128":
+ plaintext_len = 16
+ else:
+ plaintext_len = 32
+ else:
+ plaintext_len = number_of_bytes
+
+ plaintext = os.urandom(plaintext_len)
+
+ ciphertext_blob, arn = self.encrypt(
+ key_id=key_id, plaintext=plaintext, encryption_context=encryption_context
+ )
+
+ return plaintext, ciphertext_blob, arn
+
+ def list_resource_tags(self, key_id_or_arn):
+ key_id = self.get_key_id(key_id_or_arn)
+ if key_id in self.keys:
+ return self.tagger.list_tags_for_resource(key_id)
+ raise JsonRESTError(
+ "NotFoundException",
+ "The request was rejected because the specified entity or resource could not be found.",
+ )
+
+ def tag_resource(self, key_id_or_arn, tags):
+ key_id = self.get_key_id(key_id_or_arn)
+ if key_id in self.keys:
+ self.tagger.tag_resource(key_id, tags)
+ return {}
+ raise JsonRESTError(
+ "NotFoundException",
+ "The request was rejected because the specified entity or resource could not be found.",
+ )
+
+ def untag_resource(self, key_id_or_arn, tag_names):
+ key_id = self.get_key_id(key_id_or_arn)
+ if key_id in self.keys:
+ self.tagger.untag_resource_using_names(key_id, tag_names)
+ return {}
+ raise JsonRESTError(
+ "NotFoundException",
+ "The request was rejected because the specified entity or resource could not be found.",
+ )
+
+ def create_grant(
+ self,
+ key_id,
+ grantee_principal,
+ operations,
+ name,
+ constraints,
+ retiring_principal,
+ ):
+ key = self.describe_key(key_id)
+ grant = key.add_grant(
+ name,
+ grantee_principal,
+ operations,
+ constraints=constraints,
+ retiring_principal=retiring_principal,
+ )
+ return grant.id, grant.token
+
+ def list_grants(self, key_id, grant_id) -> [Grant]:
+ key = self.describe_key(key_id)
+ return key.list_grants(grant_id)
+
+ def list_retirable_grants(self, retiring_principal):
+ grants = []
+ for key in self.keys.values():
+ grants.extend(key.list_retirable_grants(retiring_principal))
+ return grants
+
+ def revoke_grant(self, key_id, grant_id) -> None:
+ key = self.describe_key(key_id)
+ key.revoke_grant(grant_id)
+
+ def retire_grant(self, key_id, grant_id, grant_token) -> None:
+ if grant_token:
+ for key in self.keys.values():
+ key.retire_grant_by_token(grant_token)
+ else:
+ key = self.describe_key(key_id)
+ key.retire_grant(grant_id)
+
+
+kms_backends = BackendDict(KmsBackend, "kms")
diff --git a/contrib/python/moto/py3/moto/kms/responses.py b/contrib/python/moto/py3/moto/kms/responses.py
new file mode 100644
index 0000000000..97bd26e6c3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/responses.py
@@ -0,0 +1,605 @@
+import base64
+import json
+import os
+import re
+
+from moto.core import get_account_id
+from moto.core.responses import BaseResponse
+from moto.kms.utils import RESERVED_ALIASES
+from .models import kms_backends
+from .exceptions import (
+ NotFoundException,
+ ValidationException,
+ AlreadyExistsException,
+ NotAuthorizedException,
+)
+
+
+class KmsResponse(BaseResponse):
+ @property
+ def parameters(self):
+ params = json.loads(self.body)
+
+ for key in ("Plaintext", "CiphertextBlob"):
+ if key in params:
+ params[key] = base64.b64decode(params[key].encode("utf-8"))
+
+ return params
+
+ @property
+ def kms_backend(self):
+ return kms_backends[self.region]
+
+ def _display_arn(self, key_id):
+ if key_id.startswith("arn:"):
+ return key_id
+
+ if key_id.startswith("alias/"):
+ id_type = ""
+ else:
+ id_type = "key/"
+
+ return "arn:aws:kms:{region}:{account}:{id_type}{key_id}".format(
+ region=self.region, account=get_account_id(), id_type=id_type, key_id=key_id
+ )
+
+ def _validate_cmk_id(self, key_id):
+ """Determine whether a CMK ID exists.
+
+ - raw key ID
+ - key ARN
+ """
+ is_arn = key_id.startswith("arn:") and ":key/" in key_id
+ is_raw_key_id = re.match(
+ r"^[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}$",
+ key_id,
+ re.IGNORECASE,
+ )
+
+ if not is_arn and not is_raw_key_id:
+ raise NotFoundException("Invalid keyId {key_id}".format(key_id=key_id))
+
+ cmk_id = self.kms_backend.get_key_id(key_id)
+
+ if cmk_id not in self.kms_backend.keys:
+ raise NotFoundException(
+ "Key '{key_id}' does not exist".format(key_id=self._display_arn(key_id))
+ )
+
+ def _validate_alias(self, key_id):
+ """Determine whether an alias exists.
+
+ - alias name
+ - alias ARN
+ """
+ error = NotFoundException(
+ "Alias {key_id} is not found.".format(key_id=self._display_arn(key_id))
+ )
+
+ is_arn = key_id.startswith("arn:") and ":alias/" in key_id
+ is_name = key_id.startswith("alias/")
+
+ if not is_arn and not is_name:
+ raise error
+
+ alias_name = self.kms_backend.get_alias_name(key_id)
+ cmk_id = self.kms_backend.get_key_id_from_alias(alias_name)
+ if cmk_id is None:
+ raise error
+
+ def _validate_key_id(self, key_id):
+ """Determine whether or not a key ID exists.
+
+ - raw key ID
+ - key ARN
+ - alias name
+ - alias ARN
+ """
+ is_alias_arn = key_id.startswith("arn:") and ":alias/" in key_id
+ is_alias_name = key_id.startswith("alias/")
+
+ if is_alias_arn or is_alias_name:
+ self._validate_alias(key_id)
+ return
+
+ self._validate_cmk_id(key_id)
+
+ def create_key(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html"""
+ policy = self.parameters.get("Policy")
+ key_usage = self.parameters.get("KeyUsage")
+ customer_master_key_spec = self.parameters.get("CustomerMasterKeySpec")
+ description = self.parameters.get("Description")
+ tags = self.parameters.get("Tags")
+
+ key = self.kms_backend.create_key(
+ policy, key_usage, customer_master_key_spec, description, tags, self.region
+ )
+ return json.dumps(key.to_dict())
+
+ def update_key_description(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateKeyDescription.html"""
+ key_id = self.parameters.get("KeyId")
+ description = self.parameters.get("Description")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.update_key_description(key_id, description)
+ return json.dumps(None)
+
+ def tag_resource(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html"""
+ key_id = self.parameters.get("KeyId")
+ tags = self.parameters.get("Tags")
+
+ self._validate_cmk_id(key_id)
+
+ result = self.kms_backend.tag_resource(key_id, tags)
+ return json.dumps(result)
+
+ def untag_resource(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_UntagResource.html"""
+ key_id = self.parameters.get("KeyId")
+ tag_names = self.parameters.get("TagKeys")
+
+ self._validate_cmk_id(key_id)
+
+ result = self.kms_backend.untag_resource(key_id, tag_names)
+ return json.dumps(result)
+
+ def list_resource_tags(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ListResourceTags.html"""
+ key_id = self.parameters.get("KeyId")
+ self._validate_cmk_id(key_id)
+
+ tags = self.kms_backend.list_resource_tags(key_id)
+ tags.update({"NextMarker": None, "Truncated": False})
+ return json.dumps(tags)
+
+ def describe_key(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_key_id(key_id)
+
+ key = self.kms_backend.describe_key(self.kms_backend.get_key_id(key_id))
+
+ return json.dumps(key.to_dict())
+
+ def list_keys(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html"""
+ keys = self.kms_backend.list_keys()
+
+ return json.dumps(
+ {
+ "Keys": [{"KeyArn": key.arn, "KeyId": key.id} for key in keys],
+ "NextMarker": None,
+ "Truncated": False,
+ }
+ )
+
+ def create_alias(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html"""
+ return self._set_alias()
+
+ def update_alias(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html"""
+ return self._set_alias(update=True)
+
+ def _set_alias(self, update=False):
+ alias_name = self.parameters["AliasName"]
+ target_key_id = self.parameters["TargetKeyId"]
+
+ if not alias_name.startswith("alias/"):
+ raise ValidationException("Invalid identifier")
+
+ if alias_name in RESERVED_ALIASES:
+ raise NotAuthorizedException()
+
+ if ":" in alias_name:
+ raise ValidationException(
+ "{alias_name} contains invalid characters for an alias".format(
+ alias_name=alias_name
+ )
+ )
+
+ if not re.match(r"^[a-zA-Z0-9:/_-]+$", alias_name):
+ raise ValidationException(
+ "1 validation error detected: Value '{alias_name}' at 'aliasName' "
+ "failed to satisfy constraint: Member must satisfy regular "
+ "expression pattern: ^[a-zA-Z0-9:/_-]+$".format(alias_name=alias_name)
+ )
+
+ if self.kms_backend.alias_exists(target_key_id):
+ raise ValidationException("Aliases must refer to keys. Not aliases")
+
+ if update:
+ # delete any existing aliases with that name (should be a no-op if none exist)
+ self.kms_backend.delete_alias(alias_name)
+
+ if self.kms_backend.alias_exists(alias_name):
+ raise AlreadyExistsException(
+ "An alias with the name arn:aws:kms:{region}:{account_id}:{alias_name} "
+ "already exists".format(
+ region=self.region,
+ account_id=get_account_id(),
+ alias_name=alias_name,
+ )
+ )
+
+ self._validate_cmk_id(target_key_id)
+
+ self.kms_backend.add_alias(target_key_id, alias_name)
+
+ return json.dumps(None)
+
+ def delete_alias(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html"""
+ alias_name = self.parameters["AliasName"]
+
+ if not alias_name.startswith("alias/"):
+ raise ValidationException("Invalid identifier")
+
+ self._validate_alias(alias_name)
+
+ self.kms_backend.delete_alias(alias_name)
+
+ return json.dumps(None)
+
+ def list_aliases(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html"""
+ region = self.region
+ response_aliases = []
+
+ backend_aliases = self.kms_backend.get_all_aliases()
+ for target_key_id, aliases in backend_aliases.items():
+ for alias_name in aliases:
+ # TODO: add creation date and last updated in response_aliases
+ response_aliases.append(
+ {
+ "AliasArn": "arn:aws:kms:{region}:{account_id}:{alias_name}".format(
+ region=region,
+ account_id=get_account_id(),
+ alias_name=alias_name,
+ ),
+ "AliasName": alias_name,
+ "TargetKeyId": target_key_id,
+ }
+ )
+ for reserved_alias in RESERVED_ALIASES:
+ exsisting = [
+ a for a in response_aliases if a["AliasName"] == reserved_alias
+ ]
+ if not exsisting:
+ response_aliases.append(
+ {
+ "AliasArn": "arn:aws:kms:{region}:{account_id}:{reserved_alias}".format(
+ region=region,
+ account_id=get_account_id(),
+ reserved_alias=reserved_alias,
+ ),
+ "AliasName": reserved_alias,
+ }
+ )
+
+ return json.dumps({"Truncated": False, "Aliases": response_aliases})
+
+ def create_grant(self):
+ key_id = self.parameters.get("KeyId")
+ grantee_principal = self.parameters.get("GranteePrincipal")
+ retiring_principal = self.parameters.get("RetiringPrincipal")
+ operations = self.parameters.get("Operations")
+ name = self.parameters.get("Name")
+ constraints = self.parameters.get("Constraints")
+
+ grant_id, grant_token = self.kms_backend.create_grant(
+ key_id,
+ grantee_principal,
+ operations,
+ name,
+ constraints=constraints,
+ retiring_principal=retiring_principal,
+ )
+ return json.dumps({"GrantId": grant_id, "GrantToken": grant_token})
+
+ def list_grants(self):
+ key_id = self.parameters.get("KeyId")
+ grant_id = self.parameters.get("GrantId")
+
+ grants = self.kms_backend.list_grants(key_id=key_id, grant_id=grant_id)
+ return json.dumps(
+ {
+ "Grants": [gr.to_json() for gr in grants],
+ "GrantCount": len(grants),
+ "Truncated": False,
+ }
+ )
+
+ def list_retirable_grants(self):
+ retiring_principal = self.parameters.get("RetiringPrincipal")
+
+ grants = self.kms_backend.list_retirable_grants(retiring_principal)
+ return json.dumps(
+ {
+ "Grants": [gr.to_json() for gr in grants],
+ "GrantCount": len(grants),
+ "Truncated": False,
+ }
+ )
+
+ def revoke_grant(self):
+ key_id = self.parameters.get("KeyId")
+ grant_id = self.parameters.get("GrantId")
+
+ self.kms_backend.revoke_grant(key_id, grant_id)
+ return "{}"
+
+ def retire_grant(self):
+ key_id = self.parameters.get("KeyId")
+ grant_id = self.parameters.get("GrantId")
+ grant_token = self.parameters.get("GrantToken")
+
+ self.kms_backend.retire_grant(key_id, grant_id, grant_token)
+ return "{}"
+
+ def enable_key_rotation(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_EnableKeyRotation.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.enable_key_rotation(key_id)
+
+ return json.dumps(None)
+
+ def disable_key_rotation(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_EnableKeyRotation.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.disable_key_rotation(key_id)
+
+ return json.dumps(None)
+
+ def get_key_rotation_status(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyRotationStatus.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ rotation_enabled = self.kms_backend.get_key_rotation_status(key_id)
+
+ return json.dumps({"KeyRotationEnabled": rotation_enabled})
+
+ def put_key_policy(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html"""
+ key_id = self.parameters.get("KeyId")
+ policy_name = self.parameters.get("PolicyName")
+ policy = self.parameters.get("Policy")
+ _assert_default_policy(policy_name)
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.put_key_policy(key_id, policy)
+
+ return json.dumps(None)
+
+ def get_key_policy(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyPolicy.html"""
+ key_id = self.parameters.get("KeyId")
+ policy_name = self.parameters.get("PolicyName")
+ _assert_default_policy(policy_name)
+
+ self._validate_cmk_id(key_id)
+
+ policy = self.kms_backend.get_key_policy(key_id) or "{}"
+ return json.dumps({"Policy": policy})
+
+ def list_key_policies(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeyPolicies.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.describe_key(key_id)
+
+ return json.dumps({"Truncated": False, "PolicyNames": ["default"]})
+
+ def encrypt(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html"""
+ key_id = self.parameters.get("KeyId")
+ encryption_context = self.parameters.get("EncryptionContext", {})
+ plaintext = self.parameters.get("Plaintext")
+
+ self._validate_key_id(key_id)
+
+ if isinstance(plaintext, str):
+ plaintext = plaintext.encode("utf-8")
+
+ ciphertext_blob, arn = self.kms_backend.encrypt(
+ key_id=key_id, plaintext=plaintext, encryption_context=encryption_context
+ )
+ ciphertext_blob_response = base64.b64encode(ciphertext_blob).decode("utf-8")
+
+ return json.dumps({"CiphertextBlob": ciphertext_blob_response, "KeyId": arn})
+
+ def decrypt(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html"""
+ ciphertext_blob = self.parameters.get("CiphertextBlob")
+ encryption_context = self.parameters.get("EncryptionContext", {})
+
+ plaintext, arn = self.kms_backend.decrypt(
+ ciphertext_blob=ciphertext_blob, encryption_context=encryption_context
+ )
+
+ plaintext_response = base64.b64encode(plaintext).decode("utf-8")
+
+ return json.dumps({"Plaintext": plaintext_response, "KeyId": arn})
+
+ def re_encrypt(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html"""
+ ciphertext_blob = self.parameters.get("CiphertextBlob")
+ source_encryption_context = self.parameters.get("SourceEncryptionContext", {})
+ destination_key_id = self.parameters.get("DestinationKeyId")
+ destination_encryption_context = self.parameters.get(
+ "DestinationEncryptionContext", {}
+ )
+
+ self._validate_cmk_id(destination_key_id)
+
+ (
+ new_ciphertext_blob,
+ decrypting_arn,
+ encrypting_arn,
+ ) = self.kms_backend.re_encrypt(
+ ciphertext_blob=ciphertext_blob,
+ source_encryption_context=source_encryption_context,
+ destination_key_id=destination_key_id,
+ destination_encryption_context=destination_encryption_context,
+ )
+
+ response_ciphertext_blob = base64.b64encode(new_ciphertext_blob).decode("utf-8")
+
+ return json.dumps(
+ {
+ "CiphertextBlob": response_ciphertext_blob,
+ "KeyId": encrypting_arn,
+ "SourceKeyId": decrypting_arn,
+ }
+ )
+
+ def disable_key(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_DisableKey.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.disable_key(key_id)
+
+ return json.dumps(None)
+
+ def enable_key(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_EnableKey.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.enable_key(key_id)
+
+ return json.dumps(None)
+
+ def cancel_key_deletion(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_CancelKeyDeletion.html"""
+ key_id = self.parameters.get("KeyId")
+
+ self._validate_cmk_id(key_id)
+
+ self.kms_backend.cancel_key_deletion(key_id)
+
+ return json.dumps({"KeyId": key_id})
+
+ def schedule_key_deletion(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html"""
+ key_id = self.parameters.get("KeyId")
+ if self.parameters.get("PendingWindowInDays") is None:
+ pending_window_in_days = 30
+ else:
+ pending_window_in_days = self.parameters.get("PendingWindowInDays")
+
+ self._validate_cmk_id(key_id)
+
+ return json.dumps(
+ {
+ "KeyId": key_id,
+ "DeletionDate": self.kms_backend.schedule_key_deletion(
+ key_id, pending_window_in_days
+ ),
+ }
+ )
+
+ def generate_data_key(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html"""
+ key_id = self.parameters.get("KeyId")
+ encryption_context = self.parameters.get("EncryptionContext", {})
+ number_of_bytes = self.parameters.get("NumberOfBytes")
+ key_spec = self.parameters.get("KeySpec")
+
+ # Param validation
+ self._validate_key_id(key_id)
+
+ if number_of_bytes and (number_of_bytes > 1024 or number_of_bytes < 1):
+ raise ValidationException(
+ (
+ "1 validation error detected: Value '{number_of_bytes:d}' at 'numberOfBytes' failed "
+ "to satisfy constraint: Member must have value less than or "
+ "equal to 1024"
+ ).format(number_of_bytes=number_of_bytes)
+ )
+
+ if key_spec and key_spec not in ("AES_256", "AES_128"):
+ raise ValidationException(
+ (
+ "1 validation error detected: Value '{key_spec}' at 'keySpec' failed "
+ "to satisfy constraint: Member must satisfy enum value set: "
+ "[AES_256, AES_128]"
+ ).format(key_spec=key_spec)
+ )
+ if not key_spec and not number_of_bytes:
+ raise ValidationException(
+ "Please specify either number of bytes or key spec."
+ )
+
+ if key_spec and number_of_bytes:
+ raise ValidationException(
+ "Please specify either number of bytes or key spec."
+ )
+
+ plaintext, ciphertext_blob, key_arn = self.kms_backend.generate_data_key(
+ key_id=key_id,
+ encryption_context=encryption_context,
+ number_of_bytes=number_of_bytes,
+ key_spec=key_spec,
+ )
+
+ plaintext_response = base64.b64encode(plaintext).decode("utf-8")
+ ciphertext_blob_response = base64.b64encode(ciphertext_blob).decode("utf-8")
+
+ return json.dumps(
+ {
+ "CiphertextBlob": ciphertext_blob_response,
+ "Plaintext": plaintext_response,
+ "KeyId": key_arn, # not alias
+ }
+ )
+
+ def generate_data_key_without_plaintext(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html"""
+ result = json.loads(self.generate_data_key())
+ del result["Plaintext"]
+
+ return json.dumps(result)
+
+ def generate_random(self):
+ """https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateRandom.html"""
+ number_of_bytes = self.parameters.get("NumberOfBytes")
+
+ if number_of_bytes and (number_of_bytes > 1024 or number_of_bytes < 1):
+ raise ValidationException(
+ (
+ "1 validation error detected: Value '{number_of_bytes:d}' at 'numberOfBytes' failed "
+ "to satisfy constraint: Member must have value less than or "
+ "equal to 1024"
+ ).format(number_of_bytes=number_of_bytes)
+ )
+
+ entropy = os.urandom(number_of_bytes)
+
+ response_entropy = base64.b64encode(entropy).decode("utf-8")
+
+ return json.dumps({"Plaintext": response_entropy})
+
+
+def _assert_default_policy(policy_name):
+ if policy_name != "default":
+ raise NotFoundException("No such policy exists")
diff --git a/contrib/python/moto/py3/moto/kms/urls.py b/contrib/python/moto/py3/moto/kms/urls.py
new file mode 100644
index 0000000000..b91772c64b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/urls.py
@@ -0,0 +1,5 @@
+from .responses import KmsResponse
+
+url_bases = [r"https?://kms\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": KmsResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/kms/utils.py b/contrib/python/moto/py3/moto/kms/utils.py
new file mode 100644
index 0000000000..61b568388b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/kms/utils.py
@@ -0,0 +1,182 @@
+from collections import namedtuple
+import io
+import os
+import struct
+import uuid
+
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
+
+from .exceptions import (
+ InvalidCiphertextException,
+ AccessDeniedException,
+ NotFoundException,
+ ValidationException,
+)
+
+
+MASTER_KEY_LEN = 32
+KEY_ID_LEN = 36
+IV_LEN = 12
+TAG_LEN = 16
+HEADER_LEN = KEY_ID_LEN + IV_LEN + TAG_LEN
+# NOTE: This is just a simple binary format. It is not what KMS actually does.
+CIPHERTEXT_HEADER_FORMAT = ">{key_id_len}s{iv_len}s{tag_len}s".format(
+ key_id_len=KEY_ID_LEN, iv_len=IV_LEN, tag_len=TAG_LEN
+)
+Ciphertext = namedtuple("Ciphertext", ("key_id", "iv", "ciphertext", "tag"))
+
+RESERVED_ALIASES = [
+ "alias/aws/acm",
+ "alias/aws/dynamodb",
+ "alias/aws/ebs",
+ "alias/aws/elasticfilesystem",
+ "alias/aws/es",
+ "alias/aws/glue",
+ "alias/aws/kinesisvideo",
+ "alias/aws/lambda",
+ "alias/aws/rds",
+ "alias/aws/redshift",
+ "alias/aws/s3",
+ "alias/aws/secretsmanager",
+ "alias/aws/ssm",
+ "alias/aws/xray",
+]
+
+
+def generate_key_id():
+ return str(uuid.uuid4())
+
+
+def generate_data_key(number_of_bytes):
+ """Generate a data key."""
+ return os.urandom(number_of_bytes)
+
+
+def generate_master_key():
+ """Generate a master key."""
+ return generate_data_key(MASTER_KEY_LEN)
+
+
+def _serialize_ciphertext_blob(ciphertext):
+ """Serialize Ciphertext object into a ciphertext blob.
+
+ NOTE: This is just a simple binary format. It is not what KMS actually does.
+ """
+ header = struct.pack(
+ CIPHERTEXT_HEADER_FORMAT,
+ ciphertext.key_id.encode("utf-8"),
+ ciphertext.iv,
+ ciphertext.tag,
+ )
+ return header + ciphertext.ciphertext
+
+
+def _deserialize_ciphertext_blob(ciphertext_blob):
+ """Deserialize ciphertext blob into a Ciphertext object.
+
+ NOTE: This is just a simple binary format. It is not what KMS actually does.
+ """
+ header = ciphertext_blob[:HEADER_LEN]
+ ciphertext = ciphertext_blob[HEADER_LEN:]
+ key_id, iv, tag = struct.unpack(CIPHERTEXT_HEADER_FORMAT, header)
+ return Ciphertext(
+ key_id=key_id.decode("utf-8"), iv=iv, ciphertext=ciphertext, tag=tag
+ )
+
+
+def _serialize_encryption_context(encryption_context):
+ """Serialize encryption context for use a AAD.
+
+ NOTE: This is not necessarily what KMS does, but it retains the same properties.
+ """
+ aad = io.BytesIO()
+ for key, value in sorted(encryption_context.items(), key=lambda x: x[0]):
+ aad.write(key.encode("utf-8"))
+ aad.write(value.encode("utf-8"))
+ return aad.getvalue()
+
+
+def encrypt(master_keys, key_id, plaintext, encryption_context):
+ """Encrypt data using a master key material.
+
+ NOTE: This is not necessarily what KMS does, but it retains the same properties.
+
+ NOTE: This function is NOT compatible with KMS APIs.
+ :param dict master_keys: Mapping of a KmsBackend's known master keys
+ :param str key_id: Key ID of moto master key
+ :param bytes plaintext: Plaintext data to encrypt
+ :param dict[str, str] encryption_context: KMS-style encryption context
+ :returns: Moto-structured ciphertext blob encrypted under a moto master key in master_keys
+ :rtype: bytes
+ """
+ try:
+ key = master_keys[key_id]
+ except KeyError:
+ is_alias = key_id.startswith("alias/") or ":alias/" in key_id
+ raise NotFoundException(
+ "{id_type} {key_id} is not found.".format(
+ id_type="Alias" if is_alias else "keyId", key_id=key_id
+ )
+ )
+
+ if plaintext == b"":
+ raise ValidationException(
+ "1 validation error detected: Value at 'plaintext' failed to satisfy constraint: Member must have length greater than or equal to 1"
+ )
+
+ iv = os.urandom(IV_LEN)
+ aad = _serialize_encryption_context(encryption_context=encryption_context)
+
+ encryptor = Cipher(
+ algorithms.AES(key.key_material), modes.GCM(iv), backend=default_backend()
+ ).encryptor()
+ encryptor.authenticate_additional_data(aad)
+ ciphertext = encryptor.update(plaintext) + encryptor.finalize()
+ return _serialize_ciphertext_blob(
+ ciphertext=Ciphertext(
+ key_id=key_id, iv=iv, ciphertext=ciphertext, tag=encryptor.tag
+ )
+ )
+
+
+def decrypt(master_keys, ciphertext_blob, encryption_context):
+ """Decrypt a ciphertext blob using a master key material.
+
+ NOTE: This is not necessarily what KMS does, but it retains the same properties.
+
+ NOTE: This function is NOT compatible with KMS APIs.
+
+ :param dict master_keys: Mapping of a KmsBackend's known master keys
+ :param bytes ciphertext_blob: moto-structured ciphertext blob encrypted under a moto master key in master_keys
+ :param dict[str, str] encryption_context: KMS-style encryption context
+ :returns: plaintext bytes and moto key ID
+ :rtype: bytes and str
+ """
+ try:
+ ciphertext = _deserialize_ciphertext_blob(ciphertext_blob=ciphertext_blob)
+ except Exception:
+ raise InvalidCiphertextException()
+
+ aad = _serialize_encryption_context(encryption_context=encryption_context)
+
+ try:
+ key = master_keys[ciphertext.key_id]
+ except KeyError:
+ raise AccessDeniedException(
+ "The ciphertext refers to a customer master key that does not exist, "
+ "does not exist in this region, or you are not allowed to access."
+ )
+
+ try:
+ decryptor = Cipher(
+ algorithms.AES(key.key_material),
+ modes.GCM(ciphertext.iv, ciphertext.tag),
+ backend=default_backend(),
+ ).decryptor()
+ decryptor.authenticate_additional_data(aad)
+ plaintext = decryptor.update(ciphertext.ciphertext) + decryptor.finalize()
+ except Exception:
+ raise InvalidCiphertextException()
+
+ return plaintext, ciphertext.key_id
diff --git a/contrib/python/moto/py3/moto/logs/__init__.py b/contrib/python/moto/py3/moto/logs/__init__.py
new file mode 100644
index 0000000000..bbe77cd9dd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/__init__.py
@@ -0,0 +1,4 @@
+from .models import logs_backends
+from ..core.models import base_decorator
+
+mock_logs = base_decorator(logs_backends)
diff --git a/contrib/python/moto/py3/moto/logs/exceptions.py b/contrib/python/moto/py3/moto/logs/exceptions.py
new file mode 100644
index 0000000000..c34f462f16
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/exceptions.py
@@ -0,0 +1,39 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class LogsClientError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFoundException(LogsClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__(
+ "ResourceNotFoundException", msg or "The specified log group does not exist"
+ )
+
+
+class InvalidParameterException(LogsClientError):
+ def __init__(self, msg=None, constraint=None, parameter=None, value=None):
+ self.code = 400
+ if constraint:
+ msg = "1 validation error detected: Value '{}' at '{}' failed to satisfy constraint: {}".format(
+ value, parameter, constraint
+ )
+ super().__init__(
+ "InvalidParameterException", msg or "A parameter is specified incorrectly."
+ )
+
+
+class ResourceAlreadyExistsException(LogsClientError):
+ def __init__(self):
+ self.code = 400
+ super().__init__(
+ "ResourceAlreadyExistsException", "The specified log group already exists"
+ )
+
+
+class LimitExceededException(LogsClientError):
+ def __init__(self):
+ self.code = 400
+ super().__init__("LimitExceededException", "Resource limit exceeded.")
diff --git a/contrib/python/moto/py3/moto/logs/metric_filters.py b/contrib/python/moto/py3/moto/logs/metric_filters.py
new file mode 100644
index 0000000000..383a7046c3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/metric_filters.py
@@ -0,0 +1,65 @@
+def find_metric_transformation_by_name(metric_transformations, metric_name):
+ for metric in metric_transformations:
+ if metric["metricName"] == metric_name:
+ return metric
+
+
+def find_metric_transformation_by_namespace(metric_transformations, metric_namespace):
+ for metric in metric_transformations:
+ if metric["metricNamespace"] == metric_namespace:
+ return metric
+
+
+class MetricFilters:
+ def __init__(self):
+ self.metric_filters = []
+
+ def add_filter(
+ self, filter_name, filter_pattern, log_group_name, metric_transformations
+ ):
+ self.metric_filters.append(
+ {
+ "filterName": filter_name,
+ "filterPattern": filter_pattern,
+ "logGroupName": log_group_name,
+ "metricTransformations": metric_transformations,
+ }
+ )
+
+ def get_matching_filters(
+ self, prefix=None, log_group_name=None, metric_name=None, metric_namespace=None
+ ):
+ result = []
+ for f in self.metric_filters:
+ prefix_matches = prefix is None or f["filterName"].startswith(prefix)
+ log_group_matches = (
+ log_group_name is None or f["logGroupName"] == log_group_name
+ )
+ metric_name_matches = (
+ metric_name is None
+ or find_metric_transformation_by_name(
+ f["metricTransformations"], metric_name
+ )
+ )
+ namespace_matches = (
+ metric_namespace is None
+ or find_metric_transformation_by_namespace(
+ f["metricTransformations"], metric_namespace
+ )
+ )
+
+ if (
+ prefix_matches
+ and log_group_matches
+ and metric_name_matches
+ and namespace_matches
+ ):
+ result.append(f)
+
+ return result
+
+ def delete_filter(self, filter_name=None, log_group_name=None):
+ for f in self.metric_filters:
+ if f["filterName"] == filter_name and f["logGroupName"] == log_group_name:
+ self.metric_filters.remove(f)
+ return self.metric_filters
diff --git a/contrib/python/moto/py3/moto/logs/models.py b/contrib/python/moto/py3/moto/logs/models.py
new file mode 100644
index 0000000000..2436496ee2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/models.py
@@ -0,0 +1,950 @@
+import uuid
+
+from datetime import datetime, timedelta
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core import CloudFormationModel
+from moto.core.utils import unix_time_millis, BackendDict
+from moto.utilities.paginator import paginate
+from moto.logs.metric_filters import MetricFilters
+from moto.logs.exceptions import (
+ ResourceNotFoundException,
+ ResourceAlreadyExistsException,
+ InvalidParameterException,
+ LimitExceededException,
+)
+from moto.s3.models import s3_backend
+from .utils import PAGINATION_MODEL
+
+MAX_RESOURCE_POLICIES_PER_REGION = 10
+
+
+class LogQuery(BaseModel):
+ def __init__(self, query_id, start_time, end_time, query):
+ self.query_id = query_id
+ self.start_time = start_time
+ self.end_time = end_time
+ self.query = query
+
+
+class LogEvent(BaseModel):
+ _event_id = 0
+
+ def __init__(self, ingestion_time, log_event):
+ self.ingestion_time = ingestion_time
+ self.timestamp = log_event["timestamp"]
+ self.message = log_event["message"]
+ self.event_id = self.__class__._event_id
+ self.__class__._event_id += 1
+ ""
+
+ def to_filter_dict(self):
+ return {
+ "eventId": str(self.event_id),
+ "ingestionTime": self.ingestion_time,
+ # "logStreamName":
+ "message": self.message,
+ "timestamp": self.timestamp,
+ }
+
+ def to_response_dict(self):
+ return {
+ "ingestionTime": self.ingestion_time,
+ "message": self.message,
+ "timestamp": self.timestamp,
+ }
+
+
+class LogStream(BaseModel):
+ _log_ids = 0
+
+ def __init__(self, region, log_group, name):
+ self.region = region
+ self.arn = f"arn:aws:logs:{region}:{get_account_id()}:log-group:{log_group}:log-stream:{name}"
+ self.creation_time = int(unix_time_millis())
+ self.first_event_timestamp = None
+ self.last_event_timestamp = None
+ self.last_ingestion_time = None
+ self.log_stream_name = name
+ self.stored_bytes = 0
+ self.upload_sequence_token = (
+ 0 # I'm guessing this is token needed for sequenceToken by put_events
+ )
+ self.events = []
+ self.destination_arn = None
+ self.filter_name = None
+
+ self.__class__._log_ids += 1
+
+ def _update(self):
+ # events can be empty when stream is described soon after creation
+ self.first_event_timestamp = (
+ min([x.timestamp for x in self.events]) if self.events else None
+ )
+ self.last_event_timestamp = (
+ max([x.timestamp for x in self.events]) if self.events else None
+ )
+
+ def to_describe_dict(self):
+ # Compute start and end times
+ self._update()
+
+ res = {
+ "arn": self.arn,
+ "creationTime": self.creation_time,
+ "logStreamName": self.log_stream_name,
+ "storedBytes": self.stored_bytes,
+ }
+ if self.events:
+ rest = {
+ "firstEventTimestamp": self.first_event_timestamp,
+ "lastEventTimestamp": self.last_event_timestamp,
+ "lastIngestionTime": self.last_ingestion_time,
+ "uploadSequenceToken": str(self.upload_sequence_token),
+ }
+ res.update(rest)
+ return res
+
+ def put_log_events(self, log_group_name, log_stream_name, log_events):
+ # TODO: ensure sequence_token
+ # TODO: to be thread safe this would need a lock
+ self.last_ingestion_time = int(unix_time_millis())
+ # TODO: make this match AWS if possible
+ self.stored_bytes += sum(
+ [len(log_event["message"]) for log_event in log_events]
+ )
+ events = [
+ LogEvent(self.last_ingestion_time, log_event) for log_event in log_events
+ ]
+ self.events += events
+ self.upload_sequence_token += 1
+
+ service = None
+ if self.destination_arn:
+ service = self.destination_arn.split(":")[2]
+ formatted_log_events = [
+ {
+ "id": event.event_id,
+ "timestamp": event.timestamp,
+ "message": event.message,
+ }
+ for event in events
+ ]
+
+ if service == "lambda":
+ from moto.awslambda import lambda_backends # due to circular dependency
+
+ lambda_backends[self.region].send_log_event(
+ self.destination_arn,
+ self.filter_name,
+ log_group_name,
+ log_stream_name,
+ formatted_log_events,
+ )
+ elif service == "firehose":
+ from moto.firehose import ( # pylint: disable=import-outside-toplevel
+ firehose_backends,
+ )
+
+ firehose_backends[self.region].send_log_event(
+ self.destination_arn,
+ self.filter_name,
+ log_group_name,
+ log_stream_name,
+ formatted_log_events,
+ )
+
+ return "{:056d}".format(self.upload_sequence_token)
+
+ def get_log_events(
+ self,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ start_from_head,
+ ):
+ if limit is None:
+ limit = 10000
+
+ def filter_func(event):
+ if start_time and event.timestamp < start_time:
+ return False
+
+ if end_time and event.timestamp > end_time:
+ return False
+
+ return True
+
+ def get_index_and_direction_from_token(token):
+ if token is not None:
+ try:
+ return token[0], int(token[2:])
+ except Exception:
+ raise InvalidParameterException(
+ "The specified nextToken is invalid."
+ )
+ return None, 0
+
+ events = sorted(
+ filter(filter_func, self.events), key=lambda event: event.timestamp
+ )
+
+ direction, index = get_index_and_direction_from_token(next_token)
+ limit_index = limit - 1
+ final_index = len(events) - 1
+
+ if direction is None:
+ if start_from_head:
+ start_index = 0
+ end_index = start_index + limit_index
+ else:
+ end_index = final_index
+ start_index = end_index - limit_index
+ elif direction == "f":
+ start_index = index + 1
+ end_index = start_index + limit_index
+ elif direction == "b":
+ end_index = index - 1
+ start_index = end_index - limit_index
+ else:
+ raise InvalidParameterException("The specified nextToken is invalid.")
+
+ if start_index < 0:
+ start_index = 0
+ elif start_index > final_index:
+ return (
+ [],
+ "b/{:056d}".format(final_index),
+ "f/{:056d}".format(final_index),
+ )
+
+ if end_index > final_index:
+ end_index = final_index
+ elif end_index < 0:
+ return ([], "b/{:056d}".format(0), "f/{:056d}".format(0))
+
+ events_page = [
+ event.to_response_dict() for event in events[start_index : end_index + 1]
+ ]
+
+ return (
+ events_page,
+ "b/{:056d}".format(start_index),
+ "f/{:056d}".format(end_index),
+ )
+
+ def filter_log_events(self, start_time, end_time, filter_pattern):
+ if filter_pattern:
+ raise NotImplementedError("filter_pattern is not yet implemented")
+
+ def filter_func(event):
+ if start_time and event.timestamp < start_time:
+ return False
+
+ if end_time and event.timestamp > end_time:
+ return False
+
+ return True
+
+ events = []
+ for event in sorted(
+ filter(filter_func, self.events), key=lambda x: x.timestamp
+ ):
+ event_obj = event.to_filter_dict()
+ event_obj["logStreamName"] = self.log_stream_name
+ events.append(event_obj)
+ return events
+
+
+class LogGroup(CloudFormationModel):
+ def __init__(self, region, name, tags, **kwargs):
+ self.name = name
+ self.region = region
+ self.arn = f"arn:aws:logs:{region}:{get_account_id()}:log-group:{name}"
+ self.creation_time = int(unix_time_millis())
+ self.tags = tags
+ self.streams = dict() # {name: LogStream}
+ self.retention_in_days = kwargs.get(
+ "RetentionInDays"
+ ) # AWS defaults to Never Expire for log group retention
+ self.subscription_filters = []
+
+ # The Amazon Resource Name (ARN) of the CMK to use when encrypting log data. It is optional.
+ # Docs:
+ # https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html
+ self.kms_key_id = kwargs.get("kmsKeyId")
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "LogGroupName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html
+ return "AWS::Logs::LogGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ tags = properties.get("Tags", {})
+ return logs_backends[region_name].create_log_group(
+ resource_name, tags, **properties
+ )
+
+ def create_log_stream(self, log_stream_name):
+ if log_stream_name in self.streams:
+ raise ResourceAlreadyExistsException()
+ stream = LogStream(self.region, self.name, log_stream_name)
+ filters = self.describe_subscription_filters()
+
+ if filters:
+ stream.destination_arn = filters[0]["destinationArn"]
+ stream.filter_name = filters[0]["filterName"]
+ self.streams[log_stream_name] = stream
+
+ def delete_log_stream(self, log_stream_name):
+ if log_stream_name not in self.streams:
+ raise ResourceNotFoundException()
+ del self.streams[log_stream_name]
+
+ def describe_log_streams(
+ self,
+ descending,
+ log_group_name,
+ log_stream_name_prefix,
+ order_by,
+ next_token=None,
+ limit=None,
+ ):
+ # responses only log_stream_name, creation_time, arn, stored_bytes when no events are stored.
+
+ log_streams = [
+ (name, stream.to_describe_dict())
+ for name, stream in self.streams.items()
+ if name.startswith(log_stream_name_prefix)
+ ]
+
+ def sorter(item):
+ return (
+ item[0]
+ if order_by == "LogStreamName"
+ else item[1].get("lastEventTimestamp", 0)
+ )
+
+ log_streams = sorted(log_streams, key=sorter, reverse=descending)
+ first_index = 0
+ if next_token:
+ try:
+ group, stream = next_token.split("@")
+ if group != log_group_name:
+ raise ValueError()
+ first_index = (
+ next(
+ index
+ for (index, e) in enumerate(log_streams)
+ if e[1]["logStreamName"] == stream
+ )
+ + 1
+ )
+ except (ValueError, StopIteration):
+ first_index = 0
+ log_streams = []
+
+ last_index = first_index + limit
+ if last_index > len(log_streams):
+ last_index = len(log_streams)
+ log_streams_page = [x[1] for x in log_streams[first_index:last_index]]
+ new_token = None
+ if log_streams_page and last_index < len(log_streams):
+ new_token = "{}@{}".format(
+ log_group_name, log_streams_page[-1]["logStreamName"]
+ )
+
+ return log_streams_page, new_token
+
+ def put_log_events(self, log_group_name, log_stream_name, log_events):
+ if log_stream_name not in self.streams:
+ raise ResourceNotFoundException("The specified log stream does not exist.")
+ stream = self.streams[log_stream_name]
+ return stream.put_log_events(log_group_name, log_stream_name, log_events)
+
+ def get_log_events(
+ self,
+ log_stream_name,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ start_from_head,
+ ):
+ if log_stream_name not in self.streams:
+ raise ResourceNotFoundException()
+ stream = self.streams[log_stream_name]
+ return stream.get_log_events(
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ start_from_head,
+ )
+
+ def filter_log_events(
+ self,
+ log_group_name,
+ log_stream_names,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ filter_pattern,
+ interleaved,
+ ):
+ if not limit:
+ limit = 10000
+ streams = [
+ stream
+ for name, stream in self.streams.items()
+ if not log_stream_names or name in log_stream_names
+ ]
+
+ events = []
+ for stream in streams:
+ events += stream.filter_log_events(start_time, end_time, filter_pattern)
+
+ if interleaved:
+ events = sorted(events, key=lambda event: event["timestamp"])
+
+ first_index = 0
+ if next_token:
+ try:
+ group, stream, event_id = next_token.split("@")
+ if group != log_group_name:
+ raise ValueError()
+ first_index = (
+ next(
+ index
+ for (index, e) in enumerate(events)
+ if e["logStreamName"] == stream and e["eventId"] == event_id
+ )
+ + 1
+ )
+ except (ValueError, StopIteration):
+ first_index = 0
+ # AWS returns an empty list if it receives an invalid token.
+ events = []
+
+ last_index = first_index + limit
+ if last_index > len(events):
+ last_index = len(events)
+ events_page = events[first_index:last_index]
+ next_token = None
+ if events_page and last_index < len(events):
+ last_event = events_page[-1]
+ next_token = "{}@{}@{}".format(
+ log_group_name, last_event["logStreamName"], last_event["eventId"]
+ )
+
+ searched_streams = [
+ {"logStreamName": stream.log_stream_name, "searchedCompletely": True}
+ for stream in streams
+ ]
+ return events_page, next_token, searched_streams
+
+ def to_describe_dict(self):
+ log_group = {
+ "arn": self.arn,
+ "creationTime": self.creation_time,
+ "logGroupName": self.name,
+ "metricFilterCount": 0,
+ "storedBytes": sum(s.stored_bytes for s in self.streams.values()),
+ }
+ # AWS only returns retentionInDays if a value is set for the log group (ie. not Never Expire)
+ if self.retention_in_days:
+ log_group["retentionInDays"] = self.retention_in_days
+ if self.kms_key_id:
+ log_group["kmsKeyId"] = self.kms_key_id
+ return log_group
+
+ def set_retention_policy(self, retention_in_days):
+ self.retention_in_days = retention_in_days
+
+ def list_tags(self):
+ return self.tags if self.tags else {}
+
+ def tag(self, tags):
+ if self.tags:
+ self.tags.update(tags)
+ else:
+ self.tags = tags
+
+ def untag(self, tags_to_remove):
+ if self.tags:
+ self.tags = {
+ k: v for (k, v) in self.tags.items() if k not in tags_to_remove
+ }
+
+ def describe_subscription_filters(self):
+ return self.subscription_filters
+
+ def put_subscription_filter(
+ self, filter_name, filter_pattern, destination_arn, role_arn
+ ):
+ creation_time = int(unix_time_millis())
+
+ # only one subscription filter can be associated with a log group
+ if self.subscription_filters:
+ if self.subscription_filters[0]["filterName"] == filter_name:
+ creation_time = self.subscription_filters[0]["creationTime"]
+ else:
+ raise LimitExceededException()
+
+ for stream in self.streams.values():
+ stream.destination_arn = destination_arn
+ stream.filter_name = filter_name
+
+ self.subscription_filters = [
+ {
+ "filterName": filter_name,
+ "logGroupName": self.name,
+ "filterPattern": filter_pattern,
+ "destinationArn": destination_arn,
+ "roleArn": role_arn,
+ "distribution": "ByLogStream",
+ "creationTime": creation_time,
+ }
+ ]
+
+ def delete_subscription_filter(self, filter_name):
+ if (
+ not self.subscription_filters
+ or self.subscription_filters[0]["filterName"] != filter_name
+ ):
+ raise ResourceNotFoundException(
+ "The specified subscription filter does not exist."
+ )
+
+ self.subscription_filters = []
+
+
+class LogResourcePolicy(CloudFormationModel):
+ def __init__(self, policy_name, policy_document):
+ self.policy_name = policy_name
+ self.policy_document = policy_document
+ self.last_updated_time = int(unix_time_millis())
+
+ def update(self, policy_document):
+ self.policy_document = policy_document
+ self.last_updated_time = int(unix_time_millis())
+
+ def describe(self):
+ return {
+ "policyName": self.policy_name,
+ "policyDocument": self.policy_document,
+ "lastUpdatedTime": self.last_updated_time,
+ }
+
+ @property
+ def physical_resource_id(self):
+ return self.policy_name
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "PolicyName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-resourcepolicy.html
+ return "AWS::Logs::ResourcePolicy"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ policy_name = properties["PolicyName"]
+ policy_document = properties["PolicyDocument"]
+ return logs_backends[region_name].put_resource_policy(
+ policy_name, policy_document
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ policy_name = properties["PolicyName"]
+ policy_document = properties["PolicyDocument"]
+
+ updated = logs_backends[region_name].put_resource_policy(
+ policy_name, policy_document
+ )
+ # TODO: move `update by replacement logic` to cloudformation. this is required for implementing rollbacks
+ if original_resource.policy_name != policy_name:
+ logs_backends[region_name].delete_resource_policy(
+ original_resource.policy_name
+ )
+ return updated
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ return logs_backends[region_name].delete_resource_policy(resource_name)
+
+
+class LogsBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.groups = dict() # { logGroupName: LogGroup}
+ self.filters = MetricFilters()
+ self.queries = dict()
+ self.resource_policies = dict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "logs"
+ )
+
+ def create_log_group(self, log_group_name, tags, **kwargs):
+ if log_group_name in self.groups:
+ raise ResourceAlreadyExistsException()
+ if len(log_group_name) > 512:
+ raise InvalidParameterException(
+ constraint="Member must have length less than or equal to 512",
+ parameter="logGroupName",
+ value=log_group_name,
+ )
+ self.groups[log_group_name] = LogGroup(
+ self.region_name, log_group_name, tags, **kwargs
+ )
+ return self.groups[log_group_name]
+
+ def ensure_log_group(self, log_group_name, tags):
+ if log_group_name in self.groups:
+ return
+ self.groups[log_group_name] = LogGroup(self.region_name, log_group_name, tags)
+
+ def delete_log_group(self, log_group_name):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ del self.groups[log_group_name]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def describe_log_groups(self, log_group_name_prefix=None):
+ if log_group_name_prefix is None:
+ log_group_name_prefix = ""
+
+ groups = [
+ group.to_describe_dict()
+ for name, group in self.groups.items()
+ if name.startswith(log_group_name_prefix)
+ ]
+ groups = sorted(groups, key=lambda x: x["logGroupName"])
+
+ return groups
+
+ def create_log_stream(self, log_group_name, log_stream_name):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ return log_group.create_log_stream(log_stream_name)
+
+ def delete_log_stream(self, log_group_name, log_stream_name):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ return log_group.delete_log_stream(log_stream_name)
+
+ def describe_log_streams(
+ self,
+ descending,
+ limit,
+ log_group_name,
+ log_stream_name_prefix,
+ next_token,
+ order_by,
+ ):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ if limit > 50:
+ raise InvalidParameterException(
+ constraint="Member must have value less than or equal to 50",
+ parameter="limit",
+ value=limit,
+ )
+ if order_by not in ["LogStreamName", "LastEventTime"]:
+ raise InvalidParameterException(
+ constraint="Member must satisfy enum value set: [LogStreamName, LastEventTime]",
+ parameter="orderBy",
+ value=order_by,
+ )
+ if order_by == "LastEventTime" and log_stream_name_prefix:
+ raise InvalidParameterException(
+ msg="Cannot order by LastEventTime with a logStreamNamePrefix."
+ )
+ log_group = self.groups[log_group_name]
+ return log_group.describe_log_streams(
+ descending=descending,
+ limit=limit,
+ log_group_name=log_group_name,
+ log_stream_name_prefix=log_stream_name_prefix,
+ next_token=next_token,
+ order_by=order_by,
+ )
+
+ def put_log_events(self, log_group_name, log_stream_name, log_events):
+ """
+ The SequenceToken-parameter is not yet implemented
+ """
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+
+ # Only events from the last 14 days or 2 hours in the future are accepted
+ rejected_info = {}
+ allowed_events = []
+ last_timestamp = None
+ oldest = int(unix_time_millis(datetime.utcnow() - timedelta(days=14)))
+ newest = int(unix_time_millis(datetime.utcnow() + timedelta(hours=2)))
+ for idx, event in enumerate(log_events):
+ if last_timestamp and last_timestamp > event["timestamp"]:
+ raise InvalidParameterException(
+ "Log events in a single PutLogEvents request must be in chronological order."
+ )
+ if event["timestamp"] < oldest:
+ rejected_info["tooOldLogEventEndIndex"] = idx
+ elif event["timestamp"] > newest:
+ rejected_info["tooNewLogEventStartIndex"] = idx
+ else:
+ allowed_events.append(event)
+ last_timestamp = event["timestamp"]
+
+ token = log_group.put_log_events(
+ log_group_name, log_stream_name, allowed_events
+ )
+ return token, rejected_info
+
+ def get_log_events(
+ self,
+ log_group_name,
+ log_stream_name,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ start_from_head,
+ ):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ if limit and limit > 1000:
+ raise InvalidParameterException(
+ constraint="Member must have value less than or equal to 10000",
+ parameter="limit",
+ value=limit,
+ )
+ log_group = self.groups[log_group_name]
+ return log_group.get_log_events(
+ log_stream_name, start_time, end_time, limit, next_token, start_from_head
+ )
+
+ def filter_log_events(
+ self,
+ log_group_name,
+ log_stream_names,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ filter_pattern,
+ interleaved,
+ ):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ if limit and limit > 1000:
+ raise InvalidParameterException(
+ constraint="Member must have value less than or equal to 10000",
+ parameter="limit",
+ value=limit,
+ )
+ log_group = self.groups[log_group_name]
+ return log_group.filter_log_events(
+ log_group_name,
+ log_stream_names,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ filter_pattern,
+ interleaved,
+ )
+
+ def put_retention_policy(self, log_group_name, retention_in_days):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ return log_group.set_retention_policy(retention_in_days)
+
+ def delete_retention_policy(self, log_group_name):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ return log_group.set_retention_policy(None)
+
+ def describe_resource_policies(
+ self, next_token, limit
+ ): # pylint: disable=unused-argument
+ """Return list of resource policies.
+
+ The next_token and limit arguments are ignored. The maximum
+ number of resource policies per region is a small number (less
+ than 50), so pagination isn't needed.
+ """
+ limit = limit or MAX_RESOURCE_POLICIES_PER_REGION
+
+ return list(self.resource_policies.values())
+
+ def put_resource_policy(self, policy_name, policy_doc):
+ """Creates/updates resource policy and return policy object"""
+ if policy_name in self.resource_policies:
+ policy = self.resource_policies[policy_name]
+ policy.update(policy_doc)
+ return policy
+ if len(self.resource_policies) == MAX_RESOURCE_POLICIES_PER_REGION:
+ raise LimitExceededException()
+ policy = LogResourcePolicy(policy_name, policy_doc)
+ self.resource_policies[policy_name] = policy
+ return policy
+
+ def delete_resource_policy(self, policy_name):
+ """Remove resource policy with a policy name matching given name."""
+ if policy_name not in self.resource_policies:
+ raise ResourceNotFoundException(
+ msg=f"Policy with name [{policy_name}] does not exist"
+ )
+ del self.resource_policies[policy_name]
+ return ""
+
+ def list_tags_log_group(self, log_group_name):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ return log_group.list_tags()
+
+ def tag_log_group(self, log_group_name, tags):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ log_group.tag(tags)
+
+ def untag_log_group(self, log_group_name, tags):
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ log_group = self.groups[log_group_name]
+ log_group.untag(tags)
+
+ def put_metric_filter(
+ self, filter_name, filter_pattern, log_group_name, metric_transformations
+ ):
+ self.filters.add_filter(
+ filter_name, filter_pattern, log_group_name, metric_transformations
+ )
+
+ def describe_metric_filters(
+ self, prefix=None, log_group_name=None, metric_name=None, metric_namespace=None
+ ):
+ filters = self.filters.get_matching_filters(
+ prefix, log_group_name, metric_name, metric_namespace
+ )
+ return filters
+
+ def delete_metric_filter(self, filter_name=None, log_group_name=None):
+ self.filters.delete_filter(filter_name, log_group_name)
+
+ def describe_subscription_filters(self, log_group_name):
+ log_group = self.groups.get(log_group_name)
+
+ if not log_group:
+ raise ResourceNotFoundException()
+
+ return log_group.describe_subscription_filters()
+
+ def put_subscription_filter(
+ self, log_group_name, filter_name, filter_pattern, destination_arn, role_arn
+ ):
+ log_group = self.groups.get(log_group_name)
+
+ if not log_group:
+ raise ResourceNotFoundException()
+
+ service = destination_arn.split(":")[2]
+ if service == "lambda":
+ from moto.awslambda import ( # pylint: disable=import-outside-toplevel
+ lambda_backends,
+ )
+
+ try:
+ lambda_backends[self.region_name].get_function(destination_arn)
+ # no specific permission check implemented
+ except Exception:
+ raise InvalidParameterException(
+ "Could not execute the lambda function. Make sure you "
+ "have given CloudWatch Logs permission to execute your "
+ "function."
+ )
+ elif service == "firehose":
+ from moto.firehose import ( # pylint: disable=import-outside-toplevel
+ firehose_backends,
+ )
+
+ firehose = firehose_backends[self.region_name].lookup_name_from_arn(
+ destination_arn
+ )
+ if not firehose:
+ raise InvalidParameterException(
+ "Could not deliver test message to specified Firehose "
+ "stream. Check if the given Firehose stream is in ACTIVE "
+ "state."
+ )
+ else:
+ # TODO: support Kinesis stream destinations
+ raise InvalidParameterException(
+ f"Service '{service}' has not implemented for "
+ f"put_subscription_filter()"
+ )
+
+ log_group.put_subscription_filter(
+ filter_name, filter_pattern, destination_arn, role_arn
+ )
+
+ def delete_subscription_filter(self, log_group_name, filter_name):
+ log_group = self.groups.get(log_group_name)
+
+ if not log_group:
+ raise ResourceNotFoundException()
+
+ log_group.delete_subscription_filter(filter_name)
+
+ def start_query(self, log_group_names, start_time, end_time, query_string):
+
+ for log_group_name in log_group_names:
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+
+ query_id = uuid.uuid1()
+ self.queries[query_id] = LogQuery(query_id, start_time, end_time, query_string)
+ return query_id
+
+ def create_export_task(self, log_group_name, destination):
+ s3_backend.get_bucket(destination)
+ if log_group_name not in self.groups:
+ raise ResourceNotFoundException()
+ task_id = uuid.uuid4()
+ return task_id
+
+
+logs_backends = BackendDict(LogsBackend, "logs")
diff --git a/contrib/python/moto/py3/moto/logs/responses.py b/contrib/python/moto/py3/moto/logs/responses.py
new file mode 100644
index 0000000000..fe8900c8c2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/responses.py
@@ -0,0 +1,391 @@
+import json
+import re
+
+from .exceptions import InvalidParameterException
+
+from moto.core.responses import BaseResponse
+from .models import logs_backends
+
+# See http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html
+
+
+REGEX_LOG_GROUP_NAME = r"[-._\/#A-Za-z0-9]+"
+
+
+def validate_param(
+ param_name, param_value, constraint, constraint_expression, pattern=None
+):
+ try:
+ assert constraint_expression(param_value)
+ except (AssertionError, TypeError):
+ raise InvalidParameterException(
+ constraint=constraint, parameter=param_name, value=param_value
+ )
+ if pattern and param_value:
+ try:
+ assert re.fullmatch(pattern, param_value)
+ except (AssertionError, TypeError):
+ raise InvalidParameterException(
+ constraint=f"Must match pattern: {pattern}",
+ parameter=param_name,
+ value=param_value,
+ )
+
+
+class LogsResponse(BaseResponse):
+ @property
+ def logs_backend(self):
+ return logs_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def _get_validated_param(
+ self, param, constraint, constraint_expression, pattern=None
+ ):
+ param_value = self._get_param(param)
+ validate_param(param, param_value, constraint, constraint_expression, pattern)
+ return param_value
+
+ def put_metric_filter(self):
+ filter_name = self._get_validated_param(
+ "filterName",
+ "Minimum length of 1. Maximum length of 512.",
+ lambda x: 1 <= len(x) <= 512,
+ pattern="[^:*]*",
+ )
+ filter_pattern = self._get_validated_param(
+ "filterPattern",
+ "Minimum length of 0. Maximum length of 1024.",
+ lambda x: 0 <= len(x) <= 1024,
+ )
+ log_group_name = self._get_validated_param(
+ "logGroupName",
+ "Minimum length of 1. Maximum length of 512.",
+ lambda x: 1 <= len(x) <= 512,
+ pattern=REGEX_LOG_GROUP_NAME,
+ )
+ metric_transformations = self._get_validated_param(
+ "metricTransformations", "Fixed number of 1 item.", lambda x: len(x) == 1
+ )
+
+ self.logs_backend.put_metric_filter(
+ filter_name, filter_pattern, log_group_name, metric_transformations
+ )
+
+ return ""
+
+ def describe_metric_filters(self):
+ filter_name_prefix = self._get_validated_param(
+ "filterNamePrefix",
+ "Minimum length of 1. Maximum length of 512.",
+ lambda x: x is None or 1 <= len(x) <= 512,
+ pattern="[^:*]*",
+ )
+ log_group_name = self._get_validated_param(
+ "logGroupName",
+ "Minimum length of 1. Maximum length of 512",
+ lambda x: x is None or 1 <= len(x) <= 512,
+ pattern=REGEX_LOG_GROUP_NAME,
+ )
+ metric_name = self._get_validated_param(
+ "metricName",
+ "Maximum length of 255.",
+ lambda x: x is None or len(x) <= 255,
+ pattern="[^:*$]*",
+ )
+ metric_namespace = self._get_validated_param(
+ "metricNamespace",
+ "Maximum length of 255.",
+ lambda x: x is None or len(x) <= 255,
+ pattern="[^:*$]*",
+ )
+ next_token = self._get_validated_param(
+ "nextToken", "Minimum length of 1.", lambda x: x is None or 1 <= len(x)
+ )
+
+ if metric_name and not metric_namespace:
+ raise InvalidParameterException(
+ constraint=f'{"If you include the metricName parameter in your request, "}'
+ f'{"you must also include the metricNamespace parameter."}',
+ parameter="metricNamespace",
+ value=metric_namespace,
+ )
+ if metric_namespace and not metric_name:
+ raise InvalidParameterException(
+ constraint=f'{"If you include the metricNamespace parameter in your request, "}'
+ f'{"you must also include the metricName parameter."}',
+ parameter="metricName",
+ value=metric_name,
+ )
+
+ filters = self.logs_backend.describe_metric_filters(
+ filter_name_prefix, log_group_name, metric_name, metric_namespace
+ )
+ return json.dumps({"metricFilters": filters, "nextToken": next_token})
+
+ def delete_metric_filter(self):
+ filter_name = self._get_validated_param(
+ "filterName",
+ "Minimum length of 1. Maximum length of 512.",
+ lambda x: 1 <= len(x) <= 512,
+ pattern="[^:*]*$",
+ )
+ log_group_name = self._get_validated_param(
+ "logGroupName",
+ "Minimum length of 1. Maximum length of 512.",
+ lambda x: 1 <= len(x) <= 512,
+ pattern=REGEX_LOG_GROUP_NAME,
+ )
+
+ self.logs_backend.delete_metric_filter(filter_name, log_group_name)
+ return ""
+
+ def create_log_group(self):
+ log_group_name = self._get_param("logGroupName")
+ tags = self._get_param("tags")
+ kms_key_id = self._get_param("kmsKeyId")
+
+ self.logs_backend.create_log_group(log_group_name, tags, kmsKeyId=kms_key_id)
+ return ""
+
+ def delete_log_group(self):
+ log_group_name = self._get_param("logGroupName")
+ self.logs_backend.delete_log_group(log_group_name)
+ return ""
+
+ def describe_log_groups(self):
+ log_group_name_prefix = self._get_param("logGroupNamePrefix")
+ next_token = self._get_param("nextToken")
+ limit = self._get_param("limit", 50)
+ if limit > 50:
+ raise InvalidParameterException(
+ constraint="Member must have value less than or equal to 50",
+ parameter="limit",
+ value=limit,
+ )
+ groups, next_token = self.logs_backend.describe_log_groups(
+ limit=limit,
+ log_group_name_prefix=log_group_name_prefix,
+ next_token=next_token,
+ )
+ result = {"logGroups": groups}
+ if next_token:
+ result["nextToken"] = next_token
+ return json.dumps(result)
+
+ def create_log_stream(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_name = self._get_param("logStreamName")
+ self.logs_backend.create_log_stream(log_group_name, log_stream_name)
+ return ""
+
+ def delete_log_stream(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_name = self._get_param("logStreamName")
+ self.logs_backend.delete_log_stream(log_group_name, log_stream_name)
+ return ""
+
+ def describe_log_streams(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_name_prefix = self._get_param("logStreamNamePrefix", "")
+ descending = self._get_param("descending", False)
+ limit = self._get_param("limit", 50)
+ next_token = self._get_param("nextToken")
+ order_by = self._get_param("orderBy", "LogStreamName")
+
+ streams, next_token = self.logs_backend.describe_log_streams(
+ descending,
+ limit,
+ log_group_name,
+ log_stream_name_prefix,
+ next_token,
+ order_by,
+ )
+ return json.dumps({"logStreams": streams, "nextToken": next_token})
+
+ def put_log_events(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_name = self._get_param("logStreamName")
+ log_events = self._get_param("logEvents")
+
+ next_sequence_token, rejected_info = self.logs_backend.put_log_events(
+ log_group_name, log_stream_name, log_events
+ )
+ if rejected_info:
+ return json.dumps(
+ {
+ "nextSequenceToken": next_sequence_token,
+ "rejectedLogEventsInfo": rejected_info,
+ }
+ )
+ else:
+ return json.dumps({"nextSequenceToken": next_sequence_token})
+
+ def get_log_events(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_name = self._get_param("logStreamName")
+ start_time = self._get_param("startTime")
+ end_time = self._get_param("endTime")
+ limit = self._get_param("limit")
+ next_token = self._get_param("nextToken")
+ start_from_head = self._get_param("startFromHead", False)
+
+ (
+ events,
+ next_backward_token,
+ next_forward_token,
+ ) = self.logs_backend.get_log_events(
+ log_group_name,
+ log_stream_name,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ start_from_head,
+ )
+ return json.dumps(
+ {
+ "events": events,
+ "nextBackwardToken": next_backward_token,
+ "nextForwardToken": next_forward_token,
+ }
+ )
+
+ def filter_log_events(self):
+ log_group_name = self._get_param("logGroupName")
+ log_stream_names = self._get_param("logStreamNames", [])
+ start_time = self._get_param("startTime")
+ # impl, see: http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
+ filter_pattern = self._get_param("filterPattern")
+ interleaved = self._get_param("interleaved", False)
+ end_time = self._get_param("endTime")
+ limit = self._get_param("limit")
+ next_token = self._get_param("nextToken")
+
+ events, next_token, searched_streams = self.logs_backend.filter_log_events(
+ log_group_name,
+ log_stream_names,
+ start_time,
+ end_time,
+ limit,
+ next_token,
+ filter_pattern,
+ interleaved,
+ )
+ return json.dumps(
+ {
+ "events": events,
+ "nextToken": next_token,
+ "searchedLogStreams": searched_streams,
+ }
+ )
+
+ def put_retention_policy(self):
+ log_group_name = self._get_param("logGroupName")
+ retention_in_days = self._get_param("retentionInDays")
+ self.logs_backend.put_retention_policy(log_group_name, retention_in_days)
+ return ""
+
+ def delete_retention_policy(self):
+ log_group_name = self._get_param("logGroupName")
+ self.logs_backend.delete_retention_policy(log_group_name)
+ return ""
+
+ def describe_resource_policies(self):
+ next_token = self._get_param("nextToken")
+ limit = self._get_param("limit")
+ policies = self.logs_backend.describe_resource_policies(next_token, limit)
+ return json.dumps({"resourcePolicies": [p.describe() for p in policies]})
+
+ def put_resource_policy(self):
+ policy_name = self._get_param("policyName")
+ policy_doc = self._get_param("policyDocument")
+ policy = self.logs_backend.put_resource_policy(policy_name, policy_doc)
+ return json.dumps({"resourcePolicy": policy.describe()})
+
+ def delete_resource_policy(self):
+ policy_name = self._get_param("policyName")
+ self.logs_backend.delete_resource_policy(policy_name)
+ return ""
+
+ def list_tags_log_group(self):
+ log_group_name = self._get_param("logGroupName")
+ tags = self.logs_backend.list_tags_log_group(log_group_name)
+ return json.dumps({"tags": tags})
+
+ def tag_log_group(self):
+ log_group_name = self._get_param("logGroupName")
+ tags = self._get_param("tags")
+ self.logs_backend.tag_log_group(log_group_name, tags)
+ return ""
+
+ def untag_log_group(self):
+ log_group_name = self._get_param("logGroupName")
+ tags = self._get_param("tags")
+ self.logs_backend.untag_log_group(log_group_name, tags)
+ return ""
+
+ def describe_subscription_filters(self):
+ log_group_name = self._get_param("logGroupName")
+
+ subscription_filters = self.logs_backend.describe_subscription_filters(
+ log_group_name
+ )
+
+ return json.dumps({"subscriptionFilters": subscription_filters})
+
+ def put_subscription_filter(self):
+ log_group_name = self._get_param("logGroupName")
+ filter_name = self._get_param("filterName")
+ filter_pattern = self._get_param("filterPattern")
+ destination_arn = self._get_param("destinationArn")
+ role_arn = self._get_param("roleArn")
+
+ self.logs_backend.put_subscription_filter(
+ log_group_name, filter_name, filter_pattern, destination_arn, role_arn
+ )
+
+ return ""
+
+ def delete_subscription_filter(self):
+ log_group_name = self._get_param("logGroupName")
+ filter_name = self._get_param("filterName")
+
+ self.logs_backend.delete_subscription_filter(log_group_name, filter_name)
+
+ return ""
+
+ def start_query(self):
+ log_group_name = self._get_param("logGroupName")
+ log_group_names = self._get_param("logGroupNames")
+ start_time = self._get_param("startTime")
+ end_time = self._get_param("endTime")
+ query_string = self._get_param("queryString")
+
+ if log_group_name and log_group_names:
+ raise InvalidParameterException()
+
+ if log_group_name:
+ log_group_names = [log_group_name]
+
+ query_id = self.logs_backend.start_query(
+ log_group_names, start_time, end_time, query_string
+ )
+
+ return json.dumps({"queryId": "{0}".format(query_id)})
+
+ def create_export_task(self):
+ log_group_name = self._get_param("logGroupName")
+ destination = self._get_param("destination")
+ task_id = self.logs_backend.create_export_task(
+ log_group_name=log_group_name, destination=destination
+ )
+ return json.dumps(dict(taskId=str(task_id)))
diff --git a/contrib/python/moto/py3/moto/logs/urls.py b/contrib/python/moto/py3/moto/logs/urls.py
new file mode 100644
index 0000000000..74cfcaef00
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/urls.py
@@ -0,0 +1,5 @@
+from .responses import LogsResponse
+
+url_bases = [r"https?://logs\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": LogsResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/logs/utils.py b/contrib/python/moto/py3/moto/logs/utils.py
new file mode 100644
index 0000000000..74d8328830
--- /dev/null
+++ b/contrib/python/moto/py3/moto/logs/utils.py
@@ -0,0 +1,15 @@
+PAGINATION_MODEL = {
+ "describe_log_groups": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 50,
+ "unique_attribute": "arn",
+ "fail_on_invalid_token": False,
+ },
+ "describe_log_streams": {
+ "input_token": "next_token",
+ "limit_key": "limit",
+ "limit_default": 50,
+ "unique_attribute": "arn",
+ },
+}
diff --git a/contrib/python/moto/py3/moto/managedblockchain/__init__.py b/contrib/python/moto/py3/moto/managedblockchain/__init__.py
new file mode 100644
index 0000000000..3199f4fb76
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/__init__.py
@@ -0,0 +1,5 @@
+from .models import managedblockchain_backends
+from ..core.models import base_decorator
+
+managedblockchain_backend = managedblockchain_backends["us-east-1"]
+mock_managedblockchain = base_decorator(managedblockchain_backends)
diff --git a/contrib/python/moto/py3/moto/managedblockchain/exceptions.py b/contrib/python/moto/py3/moto/managedblockchain/exceptions.py
new file mode 100644
index 0000000000..71cf4ff4c5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/exceptions.py
@@ -0,0 +1,89 @@
+import json
+from functools import wraps
+from werkzeug.exceptions import HTTPException
+
+
+def exception_handler(f):
+ @wraps(f)
+ def _wrapper(*args, **kwargs):
+ try:
+ return f(*args, **kwargs)
+ except ManagedBlockchainClientError as err:
+ return err.code, err.get_headers(), err.description
+
+ return _wrapper
+
+
+class ManagedBlockchainClientError(HTTPException):
+ code = 400
+
+ def __init__(self, error_type, message):
+ self.error_type = error_type
+ self.message = message
+ self.description = json.dumps({"message": self.message})
+
+ def get_headers(self, *args, **kwargs): # pylint: disable=unused-argument
+ return [
+ ("Content-Type", "application/json"),
+ ("x-amzn-ErrorType", self.error_type),
+ ]
+
+ @property
+ def response(self):
+ return self.get_body()
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ return self.description
+
+
+class BadRequestException(ManagedBlockchainClientError):
+ def __init__(self, pretty_called_method, operation_error):
+ super().__init__(
+ "BadRequestException",
+ "An error occurred (BadRequestException) when calling the {0} operation: {1}".format(
+ pretty_called_method, operation_error
+ ),
+ )
+
+
+class InvalidRequestException(ManagedBlockchainClientError):
+ def __init__(self, pretty_called_method, operation_error):
+ super().__init__(
+ "InvalidRequestException",
+ "An error occurred (InvalidRequestException) when calling the {0} operation: {1}".format(
+ pretty_called_method, operation_error
+ ),
+ )
+
+
+class ResourceNotFoundException(ManagedBlockchainClientError):
+ def __init__(self, pretty_called_method, operation_error):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException",
+ "An error occurred (ResourceNotFoundException) when calling the {0} operation: {1}".format(
+ pretty_called_method, operation_error
+ ),
+ )
+
+
+class ResourceAlreadyExistsException(ManagedBlockchainClientError):
+ def __init__(self, pretty_called_method, operation_error):
+ self.code = 409
+ super().__init__(
+ "ResourceAlreadyExistsException",
+ "An error occurred (ResourceAlreadyExistsException) when calling the {0} operation: {1}".format(
+ pretty_called_method, operation_error
+ ),
+ )
+
+
+class ResourceLimitExceededException(ManagedBlockchainClientError):
+ def __init__(self, pretty_called_method, operation_error):
+ self.code = 429
+ super().__init__(
+ "ResourceLimitExceededException",
+ "An error occurred (ResourceLimitExceededException) when calling the {0} operation: {1}".format(
+ pretty_called_method, operation_error
+ ),
+ )
diff --git a/contrib/python/moto/py3/moto/managedblockchain/models.py b/contrib/python/moto/py3/moto/managedblockchain/models.py
new file mode 100644
index 0000000000..9966f29fb6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/models.py
@@ -0,0 +1,1084 @@
+from __future__ import division
+
+import datetime
+import re
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import (
+ BadRequestException,
+ ResourceNotFoundException,
+ InvalidRequestException,
+ ResourceLimitExceededException,
+ ResourceAlreadyExistsException,
+)
+
+from .utils import (
+ get_network_id,
+ get_member_id,
+ get_proposal_id,
+ get_invitation_id,
+ member_name_exist_in_network,
+ number_of_members_in_network,
+ admin_password_ok,
+ get_node_id,
+ number_of_nodes_in_member,
+ nodes_in_member,
+)
+
+FRAMEWORKS = [
+ "HYPERLEDGER_FABRIC",
+]
+
+FRAMEWORKVERSIONS = [
+ "1.2",
+]
+
+EDITIONS = {
+ "STARTER": {
+ "MaxMembers": 5,
+ "MaxNodesPerMember": 2,
+ "AllowedNodeInstanceTypes": ["bc.t3.small", "bc.t3.medium"],
+ },
+ "STANDARD": {
+ "MaxMembers": 14,
+ "MaxNodesPerMember": 3,
+ "AllowedNodeInstanceTypes": ["bc.t3", "bc.m5", "bc.c5"],
+ },
+}
+
+VOTEVALUES = ["YES", "NO"]
+
+
+class ManagedBlockchainNetwork(BaseModel):
+ def __init__(
+ self,
+ network_id,
+ name,
+ framework,
+ frameworkversion,
+ frameworkconfiguration,
+ voting_policy,
+ member_configuration,
+ region,
+ description=None,
+ ):
+ self.creationdate = datetime.datetime.utcnow()
+ self.id = network_id
+ self.name = name
+ self.description = description
+ self.framework = framework
+ self.frameworkversion = frameworkversion
+ self.frameworkconfiguration = frameworkconfiguration
+ self.voting_policy = voting_policy
+ self.member_configuration = member_configuration
+ self.region = region
+
+ @property
+ def network_name(self):
+ return self.name
+
+ @property
+ def network_framework(self):
+ return self.framework
+
+ @property
+ def network_framework_version(self):
+ return self.frameworkversion
+
+ @property
+ def network_creationdate(self):
+ return self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
+
+ @property
+ def network_description(self):
+ return self.description
+
+ @property
+ def network_edition(self):
+ return self.frameworkconfiguration["Fabric"]["Edition"]
+
+ @property
+ def vote_pol_proposal_duration(self):
+ return self.voting_policy["ApprovalThresholdPolicy"]["ProposalDurationInHours"]
+
+ @property
+ def vote_pol_threshold_percentage(self):
+ return self.voting_policy["ApprovalThresholdPolicy"]["ThresholdPercentage"]
+
+ @property
+ def vote_pol_threshold_comparator(self):
+ return self.voting_policy["ApprovalThresholdPolicy"]["ThresholdComparator"]
+
+ def to_dict(self):
+ # Format for list_networks
+ d = {
+ "Id": self.id,
+ "Name": self.name,
+ "Framework": self.framework,
+ "FrameworkVersion": self.frameworkversion,
+ "Status": "AVAILABLE",
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ }
+ if self.description is not None:
+ d["Description"] = self.description
+ return d
+
+ def get_format(self):
+ # Format for get_network
+ frameworkattributes = {
+ "Fabric": {
+ "OrderingServiceEndpoint": "orderer.{0}.managedblockchain.{1}.amazonaws.com:30001".format(
+ self.id.lower(), self.region
+ ),
+ "Edition": self.frameworkconfiguration["Fabric"]["Edition"],
+ }
+ }
+
+ vpcendpointname = "com.amazonaws.{0}.managedblockchain.{1}".format(
+ self.region, self.id.lower()
+ )
+
+ d = {
+ "Id": self.id,
+ "Name": self.name,
+ "Framework": self.framework,
+ "FrameworkVersion": self.frameworkversion,
+ "FrameworkAttributes": frameworkattributes,
+ "VpcEndpointServiceName": vpcendpointname,
+ "VotingPolicy": self.voting_policy,
+ "Status": "AVAILABLE",
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ }
+ if self.description is not None:
+ d["Description"] = self.description
+ return d
+
+
+class ManagedBlockchainProposal(BaseModel):
+ def __init__(
+ self,
+ proposal_id,
+ networkid,
+ memberid,
+ membername,
+ numofmembers,
+ actions,
+ network_expirtation,
+ network_threshold,
+ network_threshold_comp,
+ description=None,
+ ):
+ # In general, passing all values instead of creating
+ # an apparatus to look them up
+ self.id = proposal_id
+ self.networkid = networkid
+ self.memberid = memberid
+ self.membername = membername
+ self.numofmembers = numofmembers
+ self.actions = actions
+ self.network_expirtation = network_expirtation
+ self.network_threshold = network_threshold
+ self.network_threshold_comp = network_threshold_comp
+ self.description = description
+
+ self.creationdate = datetime.datetime.utcnow()
+ self.expirtationdate = self.creationdate + datetime.timedelta(
+ hours=network_expirtation
+ )
+ self.yes_vote_count = 0
+ self.no_vote_count = 0
+ self.outstanding_vote_count = self.numofmembers
+ self.status = "IN_PROGRESS"
+ self.votes = {}
+
+ @property
+ def network_id(self):
+ return self.networkid
+
+ @property
+ def proposal_status(self):
+ return self.status
+
+ @property
+ def proposal_votes(self):
+ return self.votes
+
+ def proposal_actions(self, action_type):
+ default_return = []
+ if action_type.lower() == "invitations":
+ if "Invitations" in self.actions:
+ return self.actions["Invitations"]
+ elif action_type.lower() == "removals":
+ if "Removals" in self.actions:
+ return self.actions["Removals"]
+ return default_return
+
+ def check_to_expire_proposal(self):
+ if datetime.datetime.utcnow() > self.expirtationdate:
+ self.status = "EXPIRED"
+
+ def to_dict(self):
+ # Format for list_proposals
+ d = {
+ "ProposalId": self.id,
+ "ProposedByMemberId": self.memberid,
+ "ProposedByMemberName": self.membername,
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "ExpirationDate": self.expirtationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ }
+ return d
+
+ def get_format(self):
+ # Format for get_proposal
+ d = {
+ "ProposalId": self.id,
+ "NetworkId": self.networkid,
+ "Actions": self.actions,
+ "ProposedByMemberId": self.memberid,
+ "ProposedByMemberName": self.membername,
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "ExpirationDate": self.expirtationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "YesVoteCount": self.yes_vote_count,
+ "NoVoteCount": self.no_vote_count,
+ "OutstandingVoteCount": self.outstanding_vote_count,
+ }
+ if self.description is not None:
+ d["Description"] = self.description
+ return d
+
+ def set_vote(self, votermemberid, votermembername, vote):
+ if vote.upper() == "YES":
+ self.yes_vote_count += 1
+ else:
+ self.no_vote_count += 1
+ self.outstanding_vote_count -= 1
+
+ perct_yes = (self.yes_vote_count / self.numofmembers) * 100
+ perct_no = (self.no_vote_count / self.numofmembers) * 100
+ self.votes[votermemberid] = {
+ "MemberId": votermemberid,
+ "MemberName": votermembername,
+ "Vote": vote.upper(),
+ }
+
+ if self.network_threshold_comp == "GREATER_THAN_OR_EQUAL_TO":
+ if perct_yes >= self.network_threshold:
+ self.status = "APPROVED"
+ elif perct_no >= self.network_threshold:
+ self.status = "REJECTED"
+ else:
+ if perct_yes > self.network_threshold:
+ self.status = "APPROVED"
+ elif perct_no > self.network_threshold:
+ self.status = "REJECTED"
+
+ # It is a tie - reject
+ if (
+ self.status == "IN_PROGRESS"
+ and self.network_threshold_comp == "GREATER_THAN"
+ and self.outstanding_vote_count == 0
+ and perct_yes == perct_no
+ ):
+ self.status = "REJECTED"
+
+
+class ManagedBlockchainInvitation(BaseModel):
+ def __init__(
+ self,
+ invitation_id,
+ networkid,
+ networkname,
+ networkframework,
+ networkframeworkversion,
+ networkcreationdate,
+ region,
+ networkdescription=None,
+ ):
+ self.id = invitation_id
+ self.networkid = networkid
+ self.networkname = networkname
+ self.networkdescription = networkdescription
+ self.networkframework = networkframework
+ self.networkframeworkversion = networkframeworkversion
+ self.networkstatus = "AVAILABLE"
+ self.networkcreationdate = networkcreationdate
+ self.status = "PENDING"
+ self.region = region
+
+ self.creationdate = datetime.datetime.utcnow()
+ self.expirtationdate = self.creationdate + datetime.timedelta(days=7)
+
+ @property
+ def invitation_status(self):
+ return self.status
+
+ @property
+ def invitation_networkid(self):
+ return self.networkid
+
+ def to_dict(self):
+ d = {
+ "InvitationId": self.id,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "ExpirationDate": self.expirtationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "Status": self.status,
+ "NetworkSummary": {
+ "Id": self.networkid,
+ "Name": self.networkname,
+ "Framework": self.networkframework,
+ "FrameworkVersion": self.networkframeworkversion,
+ "Status": self.networkstatus,
+ "CreationDate": self.networkcreationdate,
+ },
+ }
+ if self.networkdescription is not None:
+ d["NetworkSummary"]["Description"] = self.networkdescription
+ return d
+
+ def accept_invitation(self):
+ self.status = "ACCEPTED"
+
+ def reject_invitation(self):
+ self.status = "REJECTED"
+
+ def set_network_status(self, network_status):
+ self.networkstatus = network_status
+
+
+class ManagedBlockchainMember(BaseModel):
+ def __init__(self, member_id, networkid, member_configuration, region):
+ self.creationdate = datetime.datetime.utcnow()
+ self.id = member_id
+ self.networkid = networkid
+ self.member_configuration = member_configuration
+ self.status = "AVAILABLE"
+ self.region = region
+ self.description = None
+
+ @property
+ def network_id(self):
+ return self.networkid
+
+ @property
+ def name(self):
+ return self.member_configuration["Name"]
+
+ @property
+ def member_status(self):
+ return self.status
+
+ def to_dict(self):
+ # Format for list_members
+ d = {
+ "Id": self.id,
+ "Name": self.member_configuration["Name"],
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "IsOwned": True,
+ }
+ if "Description" in self.member_configuration:
+ self.description = self.member_configuration["Description"]
+ return d
+
+ def get_format(self):
+ # Format for get_member
+ frameworkattributes = {
+ "Fabric": {
+ "AdminUsername": self.member_configuration["FrameworkConfiguration"][
+ "Fabric"
+ ]["AdminUsername"],
+ "CaEndpoint": "ca.{0}.{1}.managedblockchain.{2}.amazonaws.com:30002".format(
+ self.id.lower(), self.networkid.lower(), self.region
+ ),
+ }
+ }
+
+ d = {
+ "NetworkId": self.networkid,
+ "Id": self.id,
+ "Name": self.name,
+ "FrameworkAttributes": frameworkattributes,
+ "LogPublishingConfiguration": self.member_configuration[
+ "LogPublishingConfiguration"
+ ],
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ }
+ if "Description" in self.member_configuration:
+ d["Description"] = self.description
+ return d
+
+ def delete(self):
+ self.status = "DELETED"
+
+ def update(self, logpublishingconfiguration):
+ self.member_configuration[
+ "LogPublishingConfiguration"
+ ] = logpublishingconfiguration
+
+
+class ManagedBlockchainNode(BaseModel):
+ def __init__(
+ self,
+ node_id,
+ networkid,
+ memberid,
+ availabilityzone,
+ instancetype,
+ logpublishingconfiguration,
+ region,
+ ):
+ self.creationdate = datetime.datetime.utcnow()
+ self.id = node_id
+ self.instancetype = instancetype
+ self.networkid = networkid
+ self.memberid = memberid
+ self.logpublishingconfiguration = logpublishingconfiguration
+ self.region = region
+ self.status = "AVAILABLE"
+ self.availabilityzone = availabilityzone
+
+ @property
+ def member_id(self):
+ return self.memberid
+
+ @property
+ def node_status(self):
+ return self.status
+
+ def to_dict(self):
+ # Format for list_nodes
+ d = {
+ "Id": self.id,
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ "AvailabilityZone": self.availabilityzone,
+ "InstanceType": self.instancetype,
+ }
+ return d
+
+ def get_format(self):
+ # Format for get_node
+ frameworkattributes = {
+ "Fabric": {
+ "PeerEndpoint": "{0}.{1}.{2}.managedblockchain.{3}.amazonaws.com:30003".format(
+ self.id.lower(),
+ self.networkid.lower(),
+ self.memberid.lower(),
+ self.region,
+ ),
+ "PeerEventEndpoint": "{0}.{1}.{2}.managedblockchain.{3}.amazonaws.com:30004".format(
+ self.id.lower(),
+ self.networkid.lower(),
+ self.memberid.lower(),
+ self.region,
+ ),
+ }
+ }
+
+ d = {
+ "NetworkId": self.networkid,
+ "MemberId": self.memberid,
+ "Id": self.id,
+ "InstanceType": self.instancetype,
+ "AvailabilityZone": self.availabilityzone,
+ "FrameworkAttributes": frameworkattributes,
+ "LogPublishingConfiguration": self.logpublishingconfiguration,
+ "Status": self.status,
+ "CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
+ }
+ return d
+
+ def delete(self):
+ self.status = "DELETED"
+
+ def update(self, logpublishingconfiguration):
+ self.logpublishingconfiguration = logpublishingconfiguration
+
+
+class ManagedBlockchainBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.networks = {}
+ self.members = {}
+ self.proposals = {}
+ self.invitations = {}
+ self.nodes = {}
+
+ def create_network(
+ self,
+ name,
+ framework,
+ frameworkversion,
+ frameworkconfiguration,
+ voting_policy,
+ member_configuration,
+ description=None,
+ ):
+ # Check framework
+ if framework not in FRAMEWORKS:
+ raise BadRequestException("CreateNetwork", "Invalid request body")
+
+ # Check framework version
+ if frameworkversion not in FRAMEWORKVERSIONS:
+ raise BadRequestException(
+ "CreateNetwork",
+ "Invalid version {0} requested for framework HYPERLEDGER_FABRIC".format(
+ frameworkversion
+ ),
+ )
+
+ # Check edition
+ if frameworkconfiguration["Fabric"]["Edition"] not in EDITIONS:
+ raise BadRequestException("CreateNetwork", "Invalid request body")
+
+ # Generate network ID
+ network_id = get_network_id()
+
+ # Generate memberid ID and initial member
+ member_id = get_member_id()
+ self.members[member_id] = ManagedBlockchainMember(
+ member_id=member_id,
+ networkid=network_id,
+ member_configuration=member_configuration,
+ region=self.region_name,
+ )
+
+ self.networks[network_id] = ManagedBlockchainNetwork(
+ network_id=network_id,
+ name=name,
+ framework=framework,
+ frameworkversion=frameworkversion,
+ frameworkconfiguration=frameworkconfiguration,
+ voting_policy=voting_policy,
+ member_configuration=member_configuration,
+ region=self.region_name,
+ description=description,
+ )
+
+ # Return the network and member ID
+ d = {"NetworkId": network_id, "MemberId": member_id}
+ return d
+
+ def list_networks(self):
+ return self.networks.values()
+
+ def get_network(self, network_id):
+ if network_id not in self.networks:
+ raise ResourceNotFoundException(
+ "GetNetwork", "Network {0} not found.".format(network_id)
+ )
+ return self.networks.get(network_id)
+
+ def create_proposal(self, networkid, memberid, actions, description=None):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "CreateProposal", "Network {0} not found.".format(networkid)
+ )
+
+ # Check if member exists
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "CreateProposal", "Member {0} not found.".format(memberid)
+ )
+
+ # CLI docs say that Invitations and Removals cannot both be passed - but it does
+ # not throw an error and can be performed
+ if "Invitations" in actions:
+ for propinvitation in actions["Invitations"]:
+ if re.match("[0-9]{12}", propinvitation["Principal"]) is None:
+ raise InvalidRequestException(
+ "CreateProposal",
+ "Account ID format specified in proposal is not valid.",
+ )
+
+ if "Removals" in actions:
+ for propmember in actions["Removals"]:
+ if propmember["MemberId"] not in self.members:
+ raise InvalidRequestException(
+ "CreateProposal",
+ "Member ID format specified in proposal is not valid.",
+ )
+
+ # Generate proposal ID
+ proposal_id = get_proposal_id()
+
+ self.proposals[proposal_id] = ManagedBlockchainProposal(
+ proposal_id=proposal_id,
+ networkid=networkid,
+ memberid=memberid,
+ membername=self.members.get(memberid).name,
+ numofmembers=number_of_members_in_network(self.members, networkid),
+ actions=actions,
+ network_expirtation=self.networks.get(networkid).vote_pol_proposal_duration,
+ network_threshold=self.networks.get(
+ networkid
+ ).vote_pol_threshold_percentage,
+ network_threshold_comp=self.networks.get(
+ networkid
+ ).vote_pol_threshold_comparator,
+ description=description,
+ )
+
+ # Return the proposal ID
+ d = {"ProposalId": proposal_id}
+ return d
+
+ def list_proposals(self, networkid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "ListProposals", "Network {0} not found.".format(networkid)
+ )
+
+ proposalsfornetwork = []
+ for proposal_id in self.proposals:
+ if self.proposals.get(proposal_id).network_id == networkid:
+ # See if any are expired
+ self.proposals.get(proposal_id).check_to_expire_proposal()
+ proposalsfornetwork.append(self.proposals[proposal_id])
+ return proposalsfornetwork
+
+ def get_proposal(self, networkid, proposalid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "GetProposal", "Network {0} not found.".format(networkid)
+ )
+
+ if proposalid not in self.proposals:
+ raise ResourceNotFoundException(
+ "GetProposal", "Proposal {0} not found.".format(proposalid)
+ )
+
+ # See if it needs to be set to expipred
+ self.proposals.get(proposalid).check_to_expire_proposal()
+ return self.proposals.get(proposalid)
+
+ def vote_on_proposal(self, networkid, proposalid, votermemberid, vote):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "VoteOnProposal", "Network {0} not found.".format(networkid)
+ )
+
+ if proposalid not in self.proposals:
+ raise ResourceNotFoundException(
+ "VoteOnProposal", "Proposal {0} not found.".format(proposalid)
+ )
+
+ if votermemberid not in self.members:
+ raise ResourceNotFoundException(
+ "VoteOnProposal", "Member {0} not found.".format(votermemberid)
+ )
+
+ if vote.upper() not in VOTEVALUES:
+ raise BadRequestException("VoteOnProposal", "Invalid request body")
+
+ # See if it needs to be set to expipred
+ self.proposals.get(proposalid).check_to_expire_proposal()
+
+ # Exception if EXPIRED
+ if self.proposals.get(proposalid).proposal_status == "EXPIRED":
+ raise InvalidRequestException(
+ "VoteOnProposal",
+ "Proposal {0} is expired and you cannot vote on it.".format(proposalid),
+ )
+
+ # Check if IN_PROGRESS
+ if self.proposals.get(proposalid).proposal_status != "IN_PROGRESS":
+ raise InvalidRequestException(
+ "VoteOnProposal",
+ "Proposal {0} has status {1} and you cannot vote on it.".format(
+ proposalid, self.proposals.get(proposalid).proposal_status
+ ),
+ )
+
+ # Check to see if this member already voted
+ if votermemberid in self.proposals.get(proposalid).proposal_votes:
+ raise ResourceAlreadyExistsException(
+ "VoteOnProposal",
+ "Member {0} has already voted on proposal {1}.".format(
+ votermemberid, proposalid
+ ),
+ )
+
+ # Cast vote
+ self.proposals.get(proposalid).set_vote(
+ votermemberid, self.members.get(votermemberid).name, vote.upper()
+ )
+
+ if self.proposals.get(proposalid).proposal_status == "APPROVED":
+ # Generate invitations
+ for _ in self.proposals.get(proposalid).proposal_actions("Invitations"):
+ invitation_id = get_invitation_id()
+ self.invitations[invitation_id] = ManagedBlockchainInvitation(
+ invitation_id=invitation_id,
+ networkid=networkid,
+ networkname=self.networks.get(networkid).network_name,
+ networkframework=self.networks.get(networkid).network_framework,
+ networkframeworkversion=self.networks.get(
+ networkid
+ ).network_framework_version,
+ networkcreationdate=self.networks.get(
+ networkid
+ ).network_creationdate,
+ region=self.region_name,
+ networkdescription=self.networks.get(networkid).network_description,
+ )
+
+ # Delete members
+ for propmember in self.proposals.get(proposalid).proposal_actions(
+ "Removals"
+ ):
+ self.delete_member(networkid, propmember["MemberId"])
+
+ def list_proposal_votes(self, networkid, proposalid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "ListProposalVotes", "Network {0} not found.".format(networkid)
+ )
+
+ if proposalid not in self.proposals:
+ raise ResourceNotFoundException(
+ "ListProposalVotes", "Proposal {0} not found.".format(proposalid)
+ )
+
+ # Output the vote summaries
+ proposalvotesfornetwork = []
+ for proposal_id in self.proposals:
+ if self.proposals.get(proposal_id).network_id == networkid:
+ for pvmemberid in self.proposals.get(proposal_id).proposal_votes:
+ proposalvotesfornetwork.append(
+ self.proposals.get(proposal_id).proposal_votes[pvmemberid]
+ )
+ return proposalvotesfornetwork
+
+ def list_invitations(self):
+ return self.invitations.values()
+
+ def reject_invitation(self, invitationid):
+ if invitationid not in self.invitations:
+ raise ResourceNotFoundException(
+ "RejectInvitation", "InvitationId {0} not found.".format(invitationid)
+ )
+ self.invitations.get(invitationid).reject_invitation()
+
+ def create_member(self, invitationid, networkid, member_configuration):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "CreateMember", "Network {0} not found.".format(networkid)
+ )
+
+ if invitationid not in self.invitations:
+ raise InvalidRequestException(
+ "CreateMember", "Invitation {0} not valid".format(invitationid)
+ )
+
+ if self.invitations.get(invitationid).invitation_status != "PENDING":
+ raise InvalidRequestException(
+ "CreateMember", "Invitation {0} not valid".format(invitationid)
+ )
+
+ if (
+ member_name_exist_in_network(
+ self.members, networkid, member_configuration["Name"]
+ )
+ is True
+ ):
+ raise InvalidRequestException(
+ "CreateMember",
+ "Member name {0} already exists in network {1}.".format(
+ member_configuration["Name"], networkid
+ ),
+ )
+
+ networkedition = self.networks.get(networkid).network_edition
+ if (
+ number_of_members_in_network(self.members, networkid)
+ >= EDITIONS[networkedition]["MaxMembers"]
+ ):
+ raise ResourceLimitExceededException(
+ "CreateMember",
+ "You cannot create a member in network {0}.{1} is the maximum number of members allowed in a {2} Edition network.".format(
+ networkid, EDITIONS[networkedition]["MaxMembers"], networkedition
+ ),
+ )
+
+ memberadminpassword = member_configuration["FrameworkConfiguration"]["Fabric"][
+ "AdminPassword"
+ ]
+ if admin_password_ok(memberadminpassword) is False:
+ raise BadRequestException("CreateMember", "Invalid request body")
+
+ member_id = get_member_id()
+ self.members[member_id] = ManagedBlockchainMember(
+ member_id=member_id,
+ networkid=networkid,
+ member_configuration=member_configuration,
+ region=self.region_name,
+ )
+
+ # Accept the invitaiton
+ self.invitations.get(invitationid).accept_invitation()
+
+ # Return the member ID
+ d = {"MemberId": member_id}
+ return d
+
+ def list_members(self, networkid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "ListMembers", "Network {0} not found.".format(networkid)
+ )
+
+ membersfornetwork = []
+ for member_id in self.members:
+ if self.members.get(member_id).network_id == networkid:
+ membersfornetwork.append(self.members[member_id])
+ return membersfornetwork
+
+ def get_member(self, networkid, memberid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "GetMember", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "GetMember", "Member {0} not found.".format(memberid)
+ )
+
+ # Cannot get a member than has been deleted (it does show up in the list)
+ if self.members.get(memberid).member_status == "DELETED":
+ raise ResourceNotFoundException(
+ "GetMember", "Member {0} not found.".format(memberid)
+ )
+
+ return self.members.get(memberid)
+
+ def delete_member(self, networkid, memberid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "DeleteMember", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "DeleteMember", "Member {0} not found.".format(memberid)
+ )
+
+ self.members.get(memberid).delete()
+
+ # Is this the last member in the network? (all set to DELETED)
+ if number_of_members_in_network(
+ self.members, networkid, member_status="DELETED"
+ ) == len(self.members):
+ # Set network status to DELETED for all invitations
+ for invitation_id in self.invitations:
+ if (
+ self.invitations.get(invitation_id).invitation_networkid
+ == networkid
+ ):
+ self.invitations.get(invitation_id).set_network_status("DELETED")
+
+ # Remove network
+ del self.networks[networkid]
+
+ # Remove any nodes associated
+ for nodeid in nodes_in_member(self.nodes, memberid):
+ del self.nodes[nodeid]
+
+ def update_member(self, networkid, memberid, logpublishingconfiguration):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "UpdateMember", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "UpdateMember", "Member {0} not found.".format(memberid)
+ )
+
+ self.members.get(memberid).update(logpublishingconfiguration)
+
+ def create_node(
+ self,
+ networkid,
+ memberid,
+ availabilityzone,
+ instancetype,
+ logpublishingconfiguration,
+ ):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "CreateNode", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "CreateNode", "Member {0} not found.".format(memberid)
+ )
+
+ networkedition = self.networks.get(networkid).network_edition
+ if (
+ number_of_nodes_in_member(self.nodes, memberid)
+ >= EDITIONS[networkedition]["MaxNodesPerMember"]
+ ):
+ raise ResourceLimitExceededException(
+ "CreateNode",
+ "Maximum number of nodes exceeded in member {0}. The maximum number of nodes you can have in a member in a {1} Edition network is {2}".format(
+ memberid,
+ networkedition,
+ EDITIONS[networkedition]["MaxNodesPerMember"],
+ ),
+ )
+
+ # See if the instance family is correct
+ correctinstancefamily = False
+ for chkinsttypepre in EDITIONS["STANDARD"]["AllowedNodeInstanceTypes"]:
+ chkinsttypepreregex = chkinsttypepre + ".*"
+ if re.match(chkinsttypepreregex, instancetype, re.IGNORECASE):
+ correctinstancefamily = True
+ break
+
+ if correctinstancefamily is False:
+ raise InvalidRequestException(
+ "CreateNode",
+ "Requested instance {0} isn't supported.".format(instancetype),
+ )
+
+ # Check for specific types for starter
+ if networkedition == "STARTER":
+ if instancetype not in EDITIONS["STARTER"]["AllowedNodeInstanceTypes"]:
+ raise InvalidRequestException(
+ "CreateNode",
+ "Instance type {0} is not supported with STARTER Edition networks.".format(
+ instancetype
+ ),
+ )
+
+ # Simple availability zone check
+ chkregionpreregex = self.region_name + "[a-z]"
+ if re.match(chkregionpreregex, availabilityzone, re.IGNORECASE) is None:
+ raise InvalidRequestException(
+ "CreateNode", "Availability Zone is not valid"
+ )
+
+ node_id = get_node_id()
+ self.nodes[node_id] = ManagedBlockchainNode(
+ node_id=node_id,
+ networkid=networkid,
+ memberid=memberid,
+ availabilityzone=availabilityzone,
+ instancetype=instancetype,
+ logpublishingconfiguration=logpublishingconfiguration,
+ region=self.region_name,
+ )
+
+ # Return the node ID
+ d = {"NodeId": node_id}
+ return d
+
+ def list_nodes(self, networkid, memberid, status=None):
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "ListNodes", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "ListNodes", "Member {0} not found.".format(memberid)
+ )
+
+ # If member is deleted, cannot list nodes
+ if self.members.get(memberid).member_status == "DELETED":
+ raise ResourceNotFoundException(
+ "ListNodes", "Member {0} not found.".format(memberid)
+ )
+
+ nodesformember = []
+ for node_id in self.nodes:
+ if self.nodes.get(node_id).member_id == memberid and (
+ status is None or self.nodes.get(node_id).node_status == status
+ ):
+ nodesformember.append(self.nodes[node_id])
+ return nodesformember
+
+ def get_node(self, networkid, memberid, nodeid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "GetNode", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "GetNode", "Member {0} not found.".format(memberid)
+ )
+
+ if nodeid not in self.nodes:
+ raise ResourceNotFoundException(
+ "GetNode", "Node {0} not found.".format(nodeid)
+ )
+
+ # Cannot get a node than has been deleted (it does show up in the list)
+ if self.nodes.get(nodeid).node_status == "DELETED":
+ raise ResourceNotFoundException(
+ "GetNode", "Node {0} not found.".format(nodeid)
+ )
+
+ return self.nodes.get(nodeid)
+
+ def delete_node(self, networkid, memberid, nodeid):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "DeleteNode", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "DeleteNode", "Member {0} not found.".format(memberid)
+ )
+
+ if nodeid not in self.nodes:
+ raise ResourceNotFoundException(
+ "DeleteNode", "Node {0} not found.".format(nodeid)
+ )
+
+ self.nodes.get(nodeid).delete()
+
+ def update_node(self, networkid, memberid, nodeid, logpublishingconfiguration):
+ # Check if network exists
+ if networkid not in self.networks:
+ raise ResourceNotFoundException(
+ "UpdateNode", "Network {0} not found.".format(networkid)
+ )
+
+ if memberid not in self.members:
+ raise ResourceNotFoundException(
+ "UpdateNode", "Member {0} not found.".format(memberid)
+ )
+
+ if nodeid not in self.nodes:
+ raise ResourceNotFoundException(
+ "UpdateNode", "Node {0} not found.".format(nodeid)
+ )
+
+ self.nodes.get(nodeid).update(logpublishingconfiguration)
+
+
+managedblockchain_backends = BackendDict(ManagedBlockchainBackend, "managedblockchain")
diff --git a/contrib/python/moto/py3/moto/managedblockchain/responses.py b/contrib/python/moto/py3/moto/managedblockchain/responses.py
new file mode 100644
index 0000000000..f23112bf2c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/responses.py
@@ -0,0 +1,417 @@
+import json
+from urllib.parse import urlparse, parse_qs
+
+from moto.core.responses import BaseResponse
+from .exceptions import exception_handler
+from .models import managedblockchain_backends
+from .utils import (
+ region_from_managedblckchain_url,
+ networkid_from_managedblockchain_url,
+ proposalid_from_managedblockchain_url,
+ invitationid_from_managedblockchain_url,
+ memberid_from_managedblockchain_request,
+ nodeid_from_managedblockchain_url,
+)
+
+
+class ManagedBlockchainResponse(BaseResponse):
+ def __init__(self, backend):
+ super().__init__()
+ self.backend = backend
+
+ @classmethod
+ @exception_handler
+ def network_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._network_response(request, headers)
+
+ def _network_response(self, request, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ if method == "GET":
+ return self._all_networks_response(headers)
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._network_response_post(json_body, headers)
+
+ def _all_networks_response(self, headers):
+ mbcnetworks = self.backend.list_networks()
+ response = json.dumps(
+ {"Networks": [mbcnetwork.to_dict() for mbcnetwork in mbcnetworks]}
+ )
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _network_response_post(self, json_body, headers):
+ name = json_body["Name"]
+ framework = json_body["Framework"]
+ frameworkversion = json_body["FrameworkVersion"]
+ frameworkconfiguration = json_body["FrameworkConfiguration"]
+ voting_policy = json_body["VotingPolicy"]
+ member_configuration = json_body["MemberConfiguration"]
+
+ # Optional
+ description = json_body.get("Description", None)
+
+ response = self.backend.create_network(
+ name,
+ framework,
+ frameworkversion,
+ frameworkconfiguration,
+ voting_policy,
+ member_configuration,
+ description,
+ )
+ return 200, headers, json.dumps(response)
+
+ @classmethod
+ @exception_handler
+ def networkid_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._networkid_response(request, full_url, headers)
+
+ def _networkid_response(self, request, full_url, headers):
+ method = request.method
+
+ if method == "GET":
+ network_id = networkid_from_managedblockchain_url(full_url)
+ return self._networkid_response_get(network_id, headers)
+
+ def _networkid_response_get(self, network_id, headers):
+ mbcnetwork = self.backend.get_network(network_id)
+ response = json.dumps({"Network": mbcnetwork.get_format()})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ @classmethod
+ @exception_handler
+ def proposal_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._proposal_response(request, full_url, headers)
+
+ def _proposal_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ network_id = networkid_from_managedblockchain_url(full_url)
+ if method == "GET":
+ return self._all_proposals_response(network_id, headers)
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._proposal_response_post(network_id, json_body, headers)
+
+ def _all_proposals_response(self, network_id, headers):
+ proposals = self.backend.list_proposals(network_id)
+ response = json.dumps(
+ {"Proposals": [proposal.to_dict() for proposal in proposals]}
+ )
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _proposal_response_post(self, network_id, json_body, headers):
+ memberid = json_body["MemberId"]
+ actions = json_body["Actions"]
+
+ # Optional
+ description = json_body.get("Description", None)
+
+ response = self.backend.create_proposal(
+ network_id, memberid, actions, description
+ )
+ return 200, headers, json.dumps(response)
+
+ @classmethod
+ @exception_handler
+ def proposalid_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._proposalid_response(request, full_url, headers)
+
+ def _proposalid_response(self, request, full_url, headers):
+ method = request.method
+ network_id = networkid_from_managedblockchain_url(full_url)
+ if method == "GET":
+ proposal_id = proposalid_from_managedblockchain_url(full_url)
+ return self._proposalid_response_get(network_id, proposal_id, headers)
+
+ def _proposalid_response_get(self, network_id, proposal_id, headers):
+ proposal = self.backend.get_proposal(network_id, proposal_id)
+ response = json.dumps({"Proposal": proposal.get_format()})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ @classmethod
+ @exception_handler
+ def proposal_votes_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._proposal_votes_response(request, full_url, headers)
+
+ def _proposal_votes_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ network_id = networkid_from_managedblockchain_url(full_url)
+ proposal_id = proposalid_from_managedblockchain_url(full_url)
+ if method == "GET":
+ return self._all_proposal_votes_response(network_id, proposal_id, headers)
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._proposal_votes_response_post(
+ network_id, proposal_id, json_body, headers
+ )
+
+ def _all_proposal_votes_response(self, network_id, proposal_id, headers):
+ proposalvotes = self.backend.list_proposal_votes(network_id, proposal_id)
+ response = json.dumps({"ProposalVotes": proposalvotes})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _proposal_votes_response_post(
+ self, network_id, proposal_id, json_body, headers
+ ):
+ votermemberid = json_body["VoterMemberId"]
+ vote = json_body["Vote"]
+
+ self.backend.vote_on_proposal(network_id, proposal_id, votermemberid, vote)
+ return 200, headers, ""
+
+ @classmethod
+ @exception_handler
+ def invitation_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._invitation_response(request, headers)
+
+ def _invitation_response(self, request, headers):
+ method = request.method
+ if method == "GET":
+ return self._all_invitation_response(headers)
+
+ def _all_invitation_response(self, headers):
+ invitations = self.backend.list_invitations()
+ response = json.dumps(
+ {"Invitations": [invitation.to_dict() for invitation in invitations]}
+ )
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ @classmethod
+ @exception_handler
+ def invitationid_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._invitationid_response(request, full_url, headers)
+
+ def _invitationid_response(self, request, full_url, headers):
+ method = request.method
+ if method == "DELETE":
+ invitation_id = invitationid_from_managedblockchain_url(full_url)
+ return self._invitationid_response_delete(invitation_id, headers)
+
+ def _invitationid_response_delete(self, invitation_id, headers):
+ self.backend.reject_invitation(invitation_id)
+ headers["content-type"] = "application/json"
+ return 200, headers, ""
+
+ @classmethod
+ @exception_handler
+ def member_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._member_response(request, full_url, headers)
+
+ def _member_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ network_id = networkid_from_managedblockchain_url(full_url)
+ if method == "GET":
+ return self._all_members_response(network_id, headers)
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._member_response_post(network_id, json_body, headers)
+
+ def _all_members_response(self, network_id, headers):
+ members = self.backend.list_members(network_id)
+ response = json.dumps({"Members": [member.to_dict() for member in members]})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _member_response_post(self, network_id, json_body, headers):
+ invitationid = json_body["InvitationId"]
+ member_configuration = json_body["MemberConfiguration"]
+
+ response = self.backend.create_member(
+ invitationid, network_id, member_configuration
+ )
+ return 200, headers, json.dumps(response)
+
+ @classmethod
+ @exception_handler
+ def memberid_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._memberid_response(request, full_url, headers)
+
+ def _memberid_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ network_id = networkid_from_managedblockchain_url(full_url)
+ member_id = memberid_from_managedblockchain_request(full_url, body)
+ if method == "GET":
+ return self._memberid_response_get(network_id, member_id, headers)
+ elif method == "PATCH":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._memberid_response_patch(
+ network_id, member_id, json_body, headers
+ )
+ elif method == "DELETE":
+ return self._memberid_response_delete(network_id, member_id, headers)
+
+ def _memberid_response_get(self, network_id, member_id, headers):
+ member = self.backend.get_member(network_id, member_id)
+ response = json.dumps({"Member": member.get_format()})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _memberid_response_patch(self, network_id, member_id, json_body, headers):
+ logpublishingconfiguration = json_body["LogPublishingConfiguration"]
+ self.backend.update_member(network_id, member_id, logpublishingconfiguration)
+ return 200, headers, ""
+
+ def _memberid_response_delete(self, network_id, member_id, headers):
+ self.backend.delete_member(network_id, member_id)
+ headers["content-type"] = "application/json"
+ return 200, headers, ""
+
+ @classmethod
+ @exception_handler
+ def node_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._node_response(request, full_url, headers)
+
+ def _node_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ parsed_url = urlparse(full_url)
+ querystring = parse_qs(parsed_url.query, keep_blank_values=True)
+ network_id = networkid_from_managedblockchain_url(full_url)
+ member_id = memberid_from_managedblockchain_request(full_url, body)
+ if method == "GET":
+ status = None
+ if "status" in querystring:
+ status = querystring["status"][0]
+ return self._all_nodes_response(network_id, member_id, status, headers)
+ elif method == "POST":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._node_response_post(network_id, member_id, json_body, headers)
+
+ def _all_nodes_response(self, network_id, member_id, status, headers):
+ nodes = self.backend.list_nodes(network_id, member_id, status)
+ response = json.dumps({"Nodes": [node.to_dict() for node in nodes]})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _node_response_post(self, network_id, member_id, json_body, headers):
+ instancetype = json_body["NodeConfiguration"]["InstanceType"]
+ availabilityzone = json_body["NodeConfiguration"]["AvailabilityZone"]
+ logpublishingconfiguration = json_body["NodeConfiguration"][
+ "LogPublishingConfiguration"
+ ]
+
+ response = self.backend.create_node(
+ network_id,
+ member_id,
+ availabilityzone,
+ instancetype,
+ logpublishingconfiguration,
+ )
+ return 200, headers, json.dumps(response)
+
+ @classmethod
+ @exception_handler
+ def nodeid_response(clazz, request, full_url, headers):
+ region_name = region_from_managedblckchain_url(full_url)
+ response_instance = ManagedBlockchainResponse(
+ managedblockchain_backends[region_name]
+ )
+ return response_instance._nodeid_response(request, full_url, headers)
+
+ def _nodeid_response(self, request, full_url, headers):
+ method = request.method
+ if hasattr(request, "body"):
+ body = request.body
+ else:
+ body = request.data
+ network_id = networkid_from_managedblockchain_url(full_url)
+ member_id = memberid_from_managedblockchain_request(full_url, body)
+ node_id = nodeid_from_managedblockchain_url(full_url)
+ if method == "GET":
+ return self._nodeid_response_get(network_id, member_id, node_id, headers)
+ elif method == "PATCH":
+ json_body = json.loads(body.decode("utf-8"))
+ return self._nodeid_response_patch(
+ network_id, member_id, node_id, json_body, headers
+ )
+ elif method == "DELETE":
+ return self._nodeid_response_delete(network_id, member_id, node_id, headers)
+
+ def _nodeid_response_get(self, network_id, member_id, node_id, headers):
+ node = self.backend.get_node(network_id, member_id, node_id)
+ response = json.dumps({"Node": node.get_format()})
+ headers["content-type"] = "application/json"
+ return 200, headers, response
+
+ def _nodeid_response_patch(
+ self, network_id, member_id, node_id, json_body, headers
+ ):
+ logpublishingconfiguration = json_body
+ self.backend.update_node(
+ network_id, member_id, node_id, logpublishingconfiguration
+ )
+ return 200, headers, ""
+
+ def _nodeid_response_delete(self, network_id, member_id, node_id, headers):
+ self.backend.delete_node(network_id, member_id, node_id)
+ headers["content-type"] = "application/json"
+ return 200, headers, ""
diff --git a/contrib/python/moto/py3/moto/managedblockchain/urls.py b/contrib/python/moto/py3/moto/managedblockchain/urls.py
new file mode 100644
index 0000000000..6fa1c11096
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/urls.py
@@ -0,0 +1,21 @@
+from .responses import ManagedBlockchainResponse
+
+url_bases = [r"https?://managedblockchain\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/networks$": ManagedBlockchainResponse.network_response,
+ "{0}/networks/(?P<networkid>[^/.]+)$": ManagedBlockchainResponse.networkid_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/proposals$": ManagedBlockchainResponse.proposal_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/proposals/(?P<proposalid>[^/.]+)$": ManagedBlockchainResponse.proposalid_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/proposals/(?P<proposalid>[^/.]+)/votes$": ManagedBlockchainResponse.proposal_votes_response,
+ "{0}/invitations$": ManagedBlockchainResponse.invitation_response,
+ "{0}/invitations/(?P<invitationid>[^/.]+)$": ManagedBlockchainResponse.invitationid_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/members$": ManagedBlockchainResponse.member_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/members/(?P<memberid>[^/.]+)$": ManagedBlockchainResponse.memberid_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/members/(?P<memberid>[^/.]+)/nodes$": ManagedBlockchainResponse.node_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/members/(?P<memberid>[^/.]+)/nodes?(?P<querys>[^/.]+)$": ManagedBlockchainResponse.node_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/members/(?P<memberid>[^/.]+)/nodes/(?P<nodeid>[^/.]+)$": ManagedBlockchainResponse.nodeid_response,
+ # >= botocore 1.19.41 (API change - memberId is now part of query-string or body)
+ "{0}/networks/(?P<networkid>[^/.]+)/nodes$": ManagedBlockchainResponse.node_response,
+ "{0}/networks/(?P<networkid>[^/.]+)/nodes/(?P<nodeid>[^/.]+)$": ManagedBlockchainResponse.nodeid_response,
+}
diff --git a/contrib/python/moto/py3/moto/managedblockchain/utils.py b/contrib/python/moto/py3/moto/managedblockchain/utils.py
new file mode 100644
index 0000000000..96214031fb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/managedblockchain/utils.py
@@ -0,0 +1,145 @@
+import json
+import random
+import re
+import string
+
+from urllib.parse import parse_qs, urlparse
+
+
+def region_from_managedblckchain_url(url):
+ domain = urlparse(url).netloc
+ region = "us-east-1"
+ if "." in domain:
+ region = domain.split(".")[1]
+ return region
+
+
+def networkid_from_managedblockchain_url(full_url):
+ id_search = re.search(r"\/n-[A-Z0-9]{26}", full_url, re.IGNORECASE)
+ return_id = None
+ if id_search:
+ return_id = id_search.group(0).replace("/", "")
+ return return_id
+
+
+def get_network_id():
+ return "n-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+
+
+def memberid_from_managedblockchain_request(full_url, body):
+ id_search = re.search(r"\/m-[A-Z0-9]{26}", full_url, re.IGNORECASE)
+ return_id = None
+ if id_search:
+ return_id = id_search.group(0).replace("/", "")
+ else:
+ # >= botocore 1.19.41 can add the memberId as a query parameter, or in the body
+ parsed_url = urlparse(full_url)
+ qs = parse_qs(parsed_url.query)
+ if "memberId" in qs:
+ return_id = qs.get("memberId")[0]
+ elif body:
+ body = json.loads(body)
+ return_id = body["MemberId"]
+ return return_id
+
+
+def get_member_id():
+ return "m-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+
+
+def proposalid_from_managedblockchain_url(full_url):
+ id_search = re.search(r"\/p-[A-Z0-9]{26}", full_url, re.IGNORECASE)
+ return_id = None
+ if id_search:
+ return_id = id_search.group(0).replace("/", "")
+ return return_id
+
+
+def get_proposal_id():
+ return "p-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+
+
+def invitationid_from_managedblockchain_url(full_url):
+ id_search = re.search(r"\/in-[A-Z0-9]{26}", full_url, re.IGNORECASE)
+ return_id = None
+ if id_search:
+ return_id = id_search.group(0).replace("/", "")
+ return return_id
+
+
+def get_invitation_id():
+ return "in-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+
+
+def member_name_exist_in_network(members, networkid, membername):
+ membernamexists = False
+ for member_id in members:
+ if members.get(member_id).network_id == networkid:
+ if members.get(member_id).name == membername:
+ membernamexists = True
+ break
+ return membernamexists
+
+
+def number_of_members_in_network(members, networkid, member_status=None):
+ return len(
+ [
+ membid
+ for membid in members
+ if members.get(membid).network_id == networkid
+ and (
+ member_status is None
+ or members.get(membid).member_status == member_status
+ )
+ ]
+ )
+
+
+def admin_password_ok(password):
+ if not re.search("[a-z]", password):
+ return False
+ elif not re.search("[A-Z]", password):
+ return False
+ elif not re.search("[0-9]", password):
+ return False
+ elif re.search("['\"@\\/]", password):
+ return False
+ else:
+ return True
+
+
+def nodeid_from_managedblockchain_url(full_url):
+ id_search = re.search(r"\/nd-[A-Z0-9]{26}", full_url, re.IGNORECASE)
+ return_id = None
+ if id_search:
+ return_id = id_search.group(0).replace("/", "")
+ return return_id
+
+
+def get_node_id():
+ return "nd-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+
+
+def number_of_nodes_in_member(nodes, memberid, node_status=None):
+ return len(
+ [
+ nodid
+ for nodid in nodes
+ if nodes.get(nodid).member_id == memberid
+ and (node_status is None or nodes.get(nodid).node_status == node_status)
+ ]
+ )
+
+
+def nodes_in_member(nodes, memberid):
+ return [nodid for nodid in nodes if nodes.get(nodid).member_id == memberid]
diff --git a/contrib/python/moto/py3/moto/mediaconnect/__init__.py b/contrib/python/moto/py3/moto/mediaconnect/__init__.py
new file mode 100644
index 0000000000..e930e79e64
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediaconnect/__init__.py
@@ -0,0 +1,5 @@
+from .models import mediaconnect_backends
+from ..core.models import base_decorator
+
+mediaconnect_backend = mediaconnect_backends["us-east-1"]
+mock_mediaconnect = base_decorator(mediaconnect_backends)
diff --git a/contrib/python/moto/py3/moto/mediaconnect/exceptions.py b/contrib/python/moto/py3/moto/mediaconnect/exceptions.py
new file mode 100644
index 0000000000..6b75f85d71
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediaconnect/exceptions.py
@@ -0,0 +1,8 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class NotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("NotFoundException", message)
diff --git a/contrib/python/moto/py3/moto/mediaconnect/models.py b/contrib/python/moto/py3/moto/mediaconnect/models.py
new file mode 100644
index 0000000000..55ee91e18a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediaconnect/models.py
@@ -0,0 +1,247 @@
+from collections import OrderedDict
+from uuid import uuid4
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.mediaconnect.exceptions import NotFoundException
+
+
+class Flow(BaseModel):
+ def __init__(self, **kwargs):
+ self.availability_zone = kwargs.get("availability_zone")
+ self.entitlements = kwargs.get("entitlements", [])
+ self.name = kwargs.get("name")
+ self.outputs = kwargs.get("outputs", [])
+ self.source = kwargs.get("source", {})
+ self.source_failover_config = kwargs.get("source_failover_config", {})
+ self.sources = kwargs.get("sources", [])
+ self.vpc_interfaces = kwargs.get("vpc_interfaces", [])
+ self.status = "STANDBY" # one of 'STANDBY'|'ACTIVE'|'UPDATING'|'DELETING'|'STARTING'|'STOPPING'|'ERROR'
+ self._previous_status = None
+ self.description = None
+ self.flow_arn = None
+ self.egress_ip = None
+ if self.source and not self.sources:
+ self.sources = [
+ self.source,
+ ]
+
+ def to_dict(self, include=None):
+ data = {
+ "availabilityZone": self.availability_zone,
+ "description": self.description,
+ "egressIp": self.egress_ip,
+ "entitlements": self.entitlements,
+ "flowArn": self.flow_arn,
+ "name": self.name,
+ "outputs": self.outputs,
+ "source": self.source,
+ "sourceFailoverConfig": self.source_failover_config,
+ "sources": self.sources,
+ "status": self.status,
+ "vpcInterfaces": self.vpc_interfaces,
+ }
+ if include:
+ new_data = {k: v for k, v in data.items() if k in include}
+ if "sourceType" in include:
+ new_data["sourceType"] = "OWNED"
+ return new_data
+ return data
+
+ def resolve_transient_states(self):
+ if self.status in ["STARTING"]:
+ self.status = "ACTIVE"
+ if self.status in ["STOPPING"]:
+ self.status = "STANDBY"
+ if self.status in ["UPDATING"]:
+ self.status = self._previous_status
+ self._previous_status = None
+
+
+class Resource(BaseModel):
+ def __init__(self, **kwargs):
+ self.resource_arn = kwargs.get("resource_arn")
+ self.tags = OrderedDict()
+
+ def to_dict(self):
+ data = {
+ "resourceArn": self.resource_arn,
+ "tags": self.tags,
+ }
+ return data
+
+
+class MediaConnectBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._flows = OrderedDict()
+ self._resources = OrderedDict()
+
+ def _add_source_details(self, source, flow_id, ingest_ip="127.0.0.1"):
+ if source:
+ source["sourceArn"] = (
+ f"arn:aws:mediaconnect:{self.region_name}:{get_account_id()}:source"
+ f":{flow_id}:{source['name']}"
+ )
+ if not source.get("entitlementArn"):
+ source["ingestIp"] = ingest_ip
+
+ def _create_flow_add_details(self, flow):
+ flow_id = uuid4().hex
+
+ flow.description = "A Moto test flow"
+ flow.egress_ip = "127.0.0.1"
+ flow.flow_arn = f"arn:aws:mediaconnect:{self.region_name}:{get_account_id()}:flow:{flow_id}:{flow.name}"
+
+ for index, _source in enumerate(flow.sources):
+ self._add_source_details(_source, flow_id, f"127.0.0.{index}")
+
+ for index, output in enumerate(flow.outputs or []):
+ if output.get("protocol") in ["srt-listener", "zixi-pull"]:
+ output["listenerAddress"] = f"{index}.0.0.0"
+
+ def create_flow(
+ self,
+ availability_zone,
+ entitlements,
+ name,
+ outputs,
+ source,
+ source_failover_config,
+ sources,
+ vpc_interfaces,
+ ):
+ flow = Flow(
+ availability_zone=availability_zone,
+ entitlements=entitlements,
+ name=name,
+ outputs=outputs,
+ source=source,
+ source_failover_config=source_failover_config,
+ sources=sources,
+ vpc_interfaces=vpc_interfaces,
+ )
+ self._create_flow_add_details(flow)
+ self._flows[flow.flow_arn] = flow
+ return flow
+
+ def list_flows(self, max_results, next_token):
+ flows = list(self._flows.values())
+ if max_results is not None:
+ flows = flows[:max_results]
+ response_flows = [
+ fl.to_dict(
+ include=[
+ "availabilityZone",
+ "description",
+ "flowArn",
+ "name",
+ "sourceType",
+ "status",
+ ]
+ )
+ for fl in flows
+ ]
+ return response_flows, next_token
+
+ def describe_flow(self, flow_arn=None):
+ messages = {}
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.resolve_transient_states()
+ else:
+ raise NotFoundException(message="Flow not found.")
+ return flow.to_dict(), messages
+
+ def delete_flow(self, flow_arn):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ del self._flows[flow_arn]
+ else:
+ raise NotFoundException(message="Flow not found.")
+ return flow_arn, flow.status
+
+ def start_flow(self, flow_arn):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.status = "STARTING"
+ else:
+ raise NotFoundException(message="Flow not found.")
+ return flow_arn, flow.status
+
+ def stop_flow(self, flow_arn):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.status = "STOPPING"
+ else:
+ raise NotFoundException(message="Flow not found.")
+ return flow_arn, flow.status
+
+ def tag_resource(self, resource_arn, tags):
+ if resource_arn in self._resources:
+ resource = self._resources[resource_arn]
+ else:
+ resource = Resource(resource_arn=resource_arn)
+ resource.tags.update(tags)
+ self._resources[resource_arn] = resource
+ return None
+
+ def list_tags_for_resource(self, resource_arn):
+ if resource_arn in self._resources:
+ resource = self._resources[resource_arn]
+ else:
+ raise NotFoundException(message="Resource not found.")
+ return resource.tags
+
+ def add_flow_vpc_interfaces(self, flow_arn, vpc_interfaces):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.vpc_interfaces = vpc_interfaces
+ else:
+ raise NotFoundException(
+ message="flow with arn={} not found".format(flow_arn)
+ )
+ return flow_arn, flow.vpc_interfaces
+
+ def add_flow_outputs(self, flow_arn, outputs):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.outputs = outputs
+ else:
+ raise NotFoundException(
+ message="flow with arn={} not found".format(flow_arn)
+ )
+ return flow_arn, flow.outputs
+
+ def remove_flow_vpc_interface(self, flow_arn, vpc_interface_name):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.vpc_interfaces = [
+ vpc_interface
+ for vpc_interface in self._flows[flow_arn].vpc_interfaces
+ if vpc_interface["name"] != vpc_interface_name
+ ]
+ else:
+ raise NotFoundException(
+ message="flow with arn={} not found".format(flow_arn)
+ )
+ return flow_arn, vpc_interface_name
+
+ def remove_flow_output(self, flow_arn, output_name):
+ if flow_arn in self._flows:
+ flow = self._flows[flow_arn]
+ flow.outputs = [
+ output
+ for output in self._flows[flow_arn].outputs
+ if output["name"] != output_name
+ ]
+ else:
+ raise NotFoundException(
+ message="flow with arn={} not found".format(flow_arn)
+ )
+ return flow_arn, output_name
+
+ # add methods from here
+
+
+mediaconnect_backends = BackendDict(MediaConnectBackend, "mediaconnect")
diff --git a/contrib/python/moto/py3/moto/mediaconnect/responses.py b/contrib/python/moto/py3/moto/mediaconnect/responses.py
new file mode 100644
index 0000000000..206deefae7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediaconnect/responses.py
@@ -0,0 +1,113 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import mediaconnect_backends
+
+from urllib.parse import unquote
+
+
+class MediaConnectResponse(BaseResponse):
+ SERVICE_NAME = "mediaconnect"
+
+ @property
+ def mediaconnect_backend(self):
+ return mediaconnect_backends[self.region]
+
+ def create_flow(self):
+ availability_zone = self._get_param("availabilityZone")
+ entitlements = self._get_param("entitlements")
+ name = self._get_param("name")
+ outputs = self._get_param("outputs")
+ source = self._get_param("source")
+ source_failover_config = self._get_param("sourceFailoverConfig")
+ sources = self._get_param("sources")
+ vpc_interfaces = self._get_param("vpcInterfaces")
+ flow = self.mediaconnect_backend.create_flow(
+ availability_zone=availability_zone,
+ entitlements=entitlements,
+ name=name,
+ outputs=outputs,
+ source=source,
+ source_failover_config=source_failover_config,
+ sources=sources,
+ vpc_interfaces=vpc_interfaces,
+ )
+ return json.dumps(dict(flow=flow.to_dict()))
+
+ def list_flows(self):
+ max_results = self._get_int_param("maxResults")
+ next_token = self._get_param("nextToken")
+ flows, next_token = self.mediaconnect_backend.list_flows(
+ max_results=max_results, next_token=next_token
+ )
+ return json.dumps(dict(flows=flows, nextToken=next_token))
+
+ def describe_flow(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ flow, messages = self.mediaconnect_backend.describe_flow(flow_arn=flow_arn)
+ return json.dumps(dict(flow=flow, messages=messages))
+
+ def delete_flow(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ flow_arn, status = self.mediaconnect_backend.delete_flow(flow_arn=flow_arn)
+ return json.dumps(dict(flowArn=flow_arn, status=status))
+
+ def start_flow(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ flow_arn, status = self.mediaconnect_backend.start_flow(flow_arn=flow_arn)
+ return json.dumps(dict(flowArn=flow_arn, status=status))
+
+ def stop_flow(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ flow_arn, status = self.mediaconnect_backend.stop_flow(flow_arn=flow_arn)
+ return json.dumps(dict(flowArn=flow_arn, status=status))
+
+ def tag_resource(self):
+ resource_arn = unquote(self._get_param("resourceArn"))
+ tags = self._get_param("tags")
+ self.mediaconnect_backend.tag_resource(resource_arn=resource_arn, tags=tags)
+ return json.dumps(dict())
+
+ def list_tags_for_resource(self):
+ resource_arn = unquote(self._get_param("resourceArn"))
+ tags = self.mediaconnect_backend.list_tags_for_resource(
+ resource_arn=resource_arn
+ )
+ return json.dumps(dict(tags=tags))
+
+ def add_flow_vpc_interfaces(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ vpc_interfaces = self._get_param("vpcInterfaces")
+ flow_arn, vpc_interfaces = self.mediaconnect_backend.add_flow_vpc_interfaces(
+ flow_arn=flow_arn, vpc_interfaces=vpc_interfaces
+ )
+ return json.dumps(dict(flow_arn=flow_arn, vpc_interfaces=vpc_interfaces))
+
+ def remove_flow_vpc_interface(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ vpc_interface_name = unquote(self._get_param("vpcInterfaceName"))
+ (
+ flow_arn,
+ vpc_interface_name,
+ ) = self.mediaconnect_backend.remove_flow_vpc_interface(
+ flow_arn=flow_arn, vpc_interface_name=vpc_interface_name
+ )
+ return json.dumps(
+ dict(flow_arn=flow_arn, vpc_interface_name=vpc_interface_name)
+ )
+
+ def add_flow_outputs(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ outputs = self._get_param("outputs")
+ flow_arn, outputs = self.mediaconnect_backend.add_flow_outputs(
+ flow_arn=flow_arn, outputs=outputs
+ )
+ return json.dumps(dict(flow_arn=flow_arn, outputs=outputs))
+
+ def remove_flow_output(self):
+ flow_arn = unquote(self._get_param("flowArn"))
+ output_name = unquote(self._get_param("outputArn"))
+ flow_arn, output_name = self.mediaconnect_backend.remove_flow_output(
+ flow_arn=flow_arn, output_name=output_name
+ )
+ return json.dumps(dict(flow_arn=flow_arn, output_name=output_name))
diff --git a/contrib/python/moto/py3/moto/mediaconnect/urls.py b/contrib/python/moto/py3/moto/mediaconnect/urls.py
new file mode 100644
index 0000000000..e124d25206
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediaconnect/urls.py
@@ -0,0 +1,21 @@
+from .responses import MediaConnectResponse
+
+url_bases = [
+ r"https?://mediaconnect\.(.+)\.amazonaws.com",
+]
+
+
+response = MediaConnectResponse()
+
+
+url_paths = {
+ "{0}/v1/flows": response.dispatch,
+ "{0}/v1/flows/(?P<flowarn>[^/.]+)": response.dispatch,
+ "{0}/v1/flows/(?P<flowarn>[^/.]+)/vpcInterfaces": response.dispatch,
+ "{0}/v1/flows/(?P<flowarn>[^/.]+)/vpcInterfaces/(?P<vpcinterfacename>[^/.]+)": response.dispatch,
+ "{0}/v1/flows/(?P<flowarn>[^/.]+)/outputs": response.dispatch,
+ "{0}/v1/flows/(?P<flowarn>[^/.]+)/outputs/(?P<outputarn>[^/.]+)": response.dispatch,
+ "{0}/v1/flows/start/(?P<flowarn>[^/.]+)": response.dispatch,
+ "{0}/v1/flows/stop/(?P<flowarn>[^/.]+)": response.dispatch,
+ "{0}/tags/(?P<resourcearn>[^/.]+)": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/medialive/__init__.py b/contrib/python/moto/py3/moto/medialive/__init__.py
new file mode 100644
index 0000000000..407213697b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/medialive/__init__.py
@@ -0,0 +1,4 @@
+from .models import medialive_backends
+from ..core.models import base_decorator
+
+mock_medialive = base_decorator(medialive_backends)
diff --git a/contrib/python/moto/py3/moto/medialive/exceptions.py b/contrib/python/moto/py3/moto/medialive/exceptions.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/medialive/exceptions.py
diff --git a/contrib/python/moto/py3/moto/medialive/models.py b/contrib/python/moto/py3/moto/medialive/models.py
new file mode 100644
index 0000000000..7a83e6785e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/medialive/models.py
@@ -0,0 +1,289 @@
+from collections import OrderedDict
+from uuid import uuid4
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+
+class Input(BaseModel):
+ def __init__(self, **kwargs):
+ self.arn = kwargs.get("arn")
+ self.attached_channels = kwargs.get("attached_channels", [])
+ self.destinations = kwargs.get("destinations", [])
+ self.input_id = kwargs.get("input_id")
+ self.input_class = kwargs.get("input_class", "STANDARD")
+ self.input_devices = kwargs.get("input_devices", [])
+ self.input_source_type = kwargs.get("input_source_type", "STATIC")
+ self.media_connect_flows = kwargs.get("media_connect_flows", [])
+ self.name = kwargs.get("name")
+ self.role_arn = kwargs.get("role_arn")
+ self.security_groups = kwargs.get("security_groups", [])
+ self.sources = kwargs.get("sources", [])
+ # Possible states: 'CREATING'|'DETACHED'|'ATTACHED'|'DELETING'|'DELETED'
+ self.state = kwargs.get("state")
+ self.tags = kwargs.get("tags")
+ self.input_type = kwargs.get("input_type")
+
+ def to_dict(self):
+ data = {
+ "arn": self.arn,
+ "attachedChannels": self.attached_channels,
+ "destinations": self.destinations,
+ "id": self.input_id,
+ "inputClass": self.input_class,
+ "inputDevices": self.input_devices,
+ "inputSourceType": self.input_source_type,
+ "mediaConnectFlows": self.media_connect_flows,
+ "name": self.name,
+ "roleArn": self.role_arn,
+ "securityGroups": self.security_groups,
+ "sources": self.sources,
+ "state": self.state,
+ "tags": self.tags,
+ "type": self.input_type,
+ }
+ return data
+
+ def _resolve_transient_states(self):
+ # Resolve transient states before second call
+ # (to simulate AWS taking its sweet time with these things)
+ if self.state in ["CREATING"]:
+ self.state = "DETACHED" # or ATTACHED
+ elif self.state == "DELETING":
+ self.state = "DELETED"
+
+
+class Channel(BaseModel):
+ def __init__(self, **kwargs):
+ self.arn = kwargs.get("arn")
+ self.cdi_input_specification = kwargs.get("cdi_input_specification")
+ self.channel_class = kwargs.get("channel_class", "STANDARD")
+ self.destinations = kwargs.get("destinations")
+ self.egress_endpoints = kwargs.get("egress_endpoints", [])
+ self.encoder_settings = kwargs.get("encoder_settings")
+ self.channel_id = kwargs.get("channel_id")
+ self.input_attachments = kwargs.get("input_attachments")
+ self.input_specification = kwargs.get("input_specification")
+ self.log_level = kwargs.get("log_level")
+ self.name = kwargs.get("name")
+ self.pipeline_details = kwargs.get("pipeline_details", [])
+ self.role_arn = kwargs.get("role_arn")
+ self.state = kwargs.get("state")
+ self.tags = kwargs.get("tags")
+ self._previous_state = None
+
+ def to_dict(self, exclude=None):
+ data = {
+ "arn": self.arn,
+ "cdiInputSpecification": self.cdi_input_specification,
+ "channelClass": self.channel_class,
+ "destinations": self.destinations,
+ "egressEndpoints": self.egress_endpoints,
+ "encoderSettings": self.encoder_settings,
+ "id": self.channel_id,
+ "inputAttachments": self.input_attachments,
+ "inputSpecification": self.input_specification,
+ "logLevel": self.log_level,
+ "name": self.name,
+ "pipelineDetails": self.pipeline_details,
+ "pipelinesRunningCount": 1
+ if self.channel_class == "SINGLE_PIPELINE"
+ else 2,
+ "roleArn": self.role_arn,
+ "state": self.state,
+ "tags": self.tags,
+ }
+ if exclude:
+ for key in exclude:
+ del data[key]
+ return data
+
+ def _resolve_transient_states(self):
+ # Resolve transient states before second call
+ # (to simulate AWS taking its sweet time with these things)
+ if self.state in ["CREATING", "STOPPING"]:
+ self.state = "IDLE"
+ elif self.state == "STARTING":
+ self.state = "RUNNING"
+ elif self.state == "DELETING":
+ self.state = "DELETED"
+ elif self.state == "UPDATING":
+ self.state = self._previous_state
+ self._previous_state = None
+
+
+class MediaLiveBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._channels = OrderedDict()
+ self._inputs = OrderedDict()
+
+ def create_channel(
+ self,
+ cdi_input_specification,
+ channel_class,
+ destinations,
+ encoder_settings,
+ input_attachments,
+ input_specification,
+ log_level,
+ name,
+ role_arn,
+ tags,
+ ):
+ """
+ The RequestID and Reserved parameters are not yet implemented
+ """
+ channel_id = uuid4().hex
+ arn = "arn:aws:medialive:channel:{}".format(channel_id)
+ channel = Channel(
+ arn=arn,
+ cdi_input_specification=cdi_input_specification,
+ channel_class=channel_class or "STANDARD",
+ destinations=destinations,
+ egress_endpoints=[],
+ encoder_settings=encoder_settings,
+ channel_id=channel_id,
+ input_attachments=input_attachments,
+ input_specification=input_specification,
+ log_level=log_level,
+ name=name,
+ pipeline_details=[],
+ role_arn=role_arn,
+ state="CREATING",
+ tags=tags,
+ )
+ self._channels[channel_id] = channel
+ return channel
+
+ def list_channels(self, max_results, next_token):
+ channels = list(self._channels.values())
+ if max_results is not None:
+ channels = channels[:max_results]
+ response_channels = [
+ c.to_dict(exclude=["encoderSettings", "pipelineDetails"]) for c in channels
+ ]
+ return response_channels, next_token
+
+ def describe_channel(self, channel_id):
+ channel = self._channels[channel_id]
+ channel._resolve_transient_states()
+ return channel.to_dict()
+
+ def delete_channel(self, channel_id):
+ channel = self._channels[channel_id]
+ channel.state = "DELETING"
+ return channel.to_dict()
+
+ def start_channel(self, channel_id):
+ channel = self._channels[channel_id]
+ channel.state = "STARTING"
+ return channel.to_dict()
+
+ def stop_channel(self, channel_id):
+ channel = self._channels[channel_id]
+ channel.state = "STOPPING"
+ return channel.to_dict()
+
+ def update_channel(
+ self,
+ channel_id,
+ cdi_input_specification,
+ destinations,
+ encoder_settings,
+ input_attachments,
+ input_specification,
+ log_level,
+ name,
+ role_arn,
+ ):
+ channel = self._channels[channel_id]
+ channel.cdi_input_specification = cdi_input_specification
+ channel.destinations = destinations
+ channel.encoder_settings = encoder_settings
+ channel.input_attachments = input_attachments
+ channel.input_specification = input_specification
+ channel.log_level = log_level
+ channel.name = name
+ channel.role_arn = role_arn
+
+ channel._resolve_transient_states()
+ channel._previous_state = channel.state
+ channel.state = "UPDATING"
+
+ return channel
+
+ def create_input(
+ self,
+ destinations,
+ input_devices,
+ input_security_groups,
+ media_connect_flows,
+ name,
+ role_arn,
+ sources,
+ tags,
+ input_type,
+ ):
+ """
+ The VPC and RequestId parameters are not yet implemented
+ """
+ input_id = uuid4().hex
+ arn = "arn:aws:medialive:input:{}".format(input_id)
+ a_input = Input(
+ arn=arn,
+ input_id=input_id,
+ destinations=destinations,
+ input_devices=input_devices,
+ input_security_groups=input_security_groups,
+ media_connect_flows=media_connect_flows,
+ name=name,
+ role_arn=role_arn,
+ sources=sources,
+ tags=tags,
+ input_type=input_type,
+ state="CREATING",
+ )
+ self._inputs[input_id] = a_input
+ return a_input
+
+ def describe_input(self, input_id):
+ a_input = self._inputs[input_id]
+ a_input._resolve_transient_states()
+ return a_input.to_dict()
+
+ def list_inputs(self, max_results, next_token):
+ inputs = list(self._inputs.values())
+ if max_results is not None:
+ inputs = inputs[:max_results]
+ response_inputs = [i.to_dict() for i in inputs]
+ return response_inputs, next_token
+
+ def delete_input(self, input_id):
+ a_input = self._inputs[input_id]
+ a_input.state = "DELETING"
+ return a_input.to_dict()
+
+ def update_input(
+ self,
+ destinations,
+ input_devices,
+ input_id,
+ input_security_groups,
+ media_connect_flows,
+ name,
+ role_arn,
+ sources,
+ ):
+ a_input = self._inputs[input_id]
+ a_input.destinations = destinations
+ a_input.input_devices = input_devices
+ a_input.security_groups = input_security_groups
+ a_input.media_connect_flows = media_connect_flows
+ a_input.name = name
+ a_input.role_arn = role_arn
+ a_input.sources = sources
+ return a_input
+
+
+medialive_backends = BackendDict(MediaLiveBackend, "medialive")
diff --git a/contrib/python/moto/py3/moto/medialive/responses.py b/contrib/python/moto/py3/moto/medialive/responses.py
new file mode 100644
index 0000000000..9d75eb4b80
--- /dev/null
+++ b/contrib/python/moto/py3/moto/medialive/responses.py
@@ -0,0 +1,151 @@
+from moto.core.responses import BaseResponse
+from .models import medialive_backends
+import json
+
+
+class MediaLiveResponse(BaseResponse):
+ SERVICE_NAME = "medialive"
+
+ @property
+ def medialive_backend(self):
+ return medialive_backends[self.region]
+
+ def create_channel(self):
+ cdi_input_specification = self._get_param("cdiInputSpecification")
+ channel_class = self._get_param("channelClass")
+ destinations = self._get_param("destinations")
+ encoder_settings = self._get_param("encoderSettings")
+ input_attachments = self._get_param("inputAttachments")
+ input_specification = self._get_param("inputSpecification")
+ log_level = self._get_param("logLevel")
+ name = self._get_param("name")
+ role_arn = self._get_param("roleArn")
+ tags = self._get_param("tags")
+ channel = self.medialive_backend.create_channel(
+ cdi_input_specification=cdi_input_specification,
+ channel_class=channel_class,
+ destinations=destinations,
+ encoder_settings=encoder_settings,
+ input_attachments=input_attachments,
+ input_specification=input_specification,
+ log_level=log_level,
+ name=name,
+ role_arn=role_arn,
+ tags=tags,
+ )
+
+ return json.dumps(
+ dict(channel=channel.to_dict(exclude=["pipelinesRunningCount"]))
+ )
+
+ def list_channels(self):
+ max_results = self._get_int_param("maxResults")
+ next_token = self._get_param("nextToken")
+ channels, next_token = self.medialive_backend.list_channels(
+ max_results=max_results, next_token=next_token
+ )
+
+ return json.dumps(dict(channels=channels, nextToken=next_token))
+
+ def describe_channel(self):
+ channel_id = self._get_param("channelId")
+ return json.dumps(
+ self.medialive_backend.describe_channel(channel_id=channel_id)
+ )
+
+ def delete_channel(self):
+ channel_id = self._get_param("channelId")
+ return json.dumps(self.medialive_backend.delete_channel(channel_id=channel_id))
+
+ def start_channel(self):
+ channel_id = self._get_param("channelId")
+ return json.dumps(self.medialive_backend.start_channel(channel_id=channel_id))
+
+ def stop_channel(self):
+ channel_id = self._get_param("channelId")
+ return json.dumps(self.medialive_backend.stop_channel(channel_id=channel_id))
+
+ def update_channel(self):
+ channel_id = self._get_param("channelId")
+ cdi_input_specification = self._get_param("cdiInputSpecification")
+ destinations = self._get_param("destinations")
+ encoder_settings = self._get_param("encoderSettings")
+ input_attachments = self._get_param("inputAttachments")
+ input_specification = self._get_param("inputSpecification")
+ log_level = self._get_param("logLevel")
+ name = self._get_param("name")
+ role_arn = self._get_param("roleArn")
+ channel = self.medialive_backend.update_channel(
+ channel_id=channel_id,
+ cdi_input_specification=cdi_input_specification,
+ destinations=destinations,
+ encoder_settings=encoder_settings,
+ input_attachments=input_attachments,
+ input_specification=input_specification,
+ log_level=log_level,
+ name=name,
+ role_arn=role_arn,
+ )
+ return json.dumps(dict(channel=channel.to_dict()))
+
+ def create_input(self):
+ destinations = self._get_param("destinations")
+ input_devices = self._get_param("inputDevices")
+ input_security_groups = self._get_param("inputSecurityGroups")
+ media_connect_flows = self._get_param("mediaConnectFlows")
+ name = self._get_param("name")
+ role_arn = self._get_param("roleArn")
+ sources = self._get_param("sources")
+ tags = self._get_param("tags")
+ input_type = self._get_param("type")
+ a_input = self.medialive_backend.create_input(
+ destinations=destinations,
+ input_devices=input_devices,
+ input_security_groups=input_security_groups,
+ media_connect_flows=media_connect_flows,
+ name=name,
+ role_arn=role_arn,
+ sources=sources,
+ tags=tags,
+ input_type=input_type,
+ )
+ return json.dumps({"input": a_input.to_dict()})
+
+ def describe_input(self):
+ input_id = self._get_param("inputId")
+ return json.dumps(self.medialive_backend.describe_input(input_id=input_id))
+
+ def list_inputs(self):
+ max_results = self._get_int_param("maxResults")
+ next_token = self._get_param("nextToken")
+ inputs, next_token = self.medialive_backend.list_inputs(
+ max_results=max_results, next_token=next_token
+ )
+
+ return json.dumps(dict(inputs=inputs, nextToken=next_token))
+
+ def delete_input(self):
+ input_id = self._get_param("inputId")
+ self.medialive_backend.delete_input(input_id=input_id)
+ return json.dumps({})
+
+ def update_input(self):
+ destinations = self._get_param("destinations")
+ input_devices = self._get_param("inputDevices")
+ input_id = self._get_param("inputId")
+ input_security_groups = self._get_param("inputSecurityGroups")
+ media_connect_flows = self._get_param("mediaConnectFlows")
+ name = self._get_param("name")
+ role_arn = self._get_param("roleArn")
+ sources = self._get_param("sources")
+ a_input = self.medialive_backend.update_input(
+ destinations=destinations,
+ input_devices=input_devices,
+ input_id=input_id,
+ input_security_groups=input_security_groups,
+ media_connect_flows=media_connect_flows,
+ name=name,
+ role_arn=role_arn,
+ sources=sources,
+ )
+ return json.dumps(dict(input=a_input.to_dict()))
diff --git a/contrib/python/moto/py3/moto/medialive/urls.py b/contrib/python/moto/py3/moto/medialive/urls.py
new file mode 100644
index 0000000000..62e89eb80f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/medialive/urls.py
@@ -0,0 +1,18 @@
+from .responses import MediaLiveResponse
+
+url_bases = [
+ r"https?://medialive\.(.+)\.amazonaws.com",
+]
+
+
+response = MediaLiveResponse()
+
+
+url_paths = {
+ "{0}/prod/channels": response.dispatch,
+ "{0}/prod/channels/(?P<channelid>[^/.]+)": response.dispatch,
+ "{0}/prod/channels/(?P<channelid>[^/.]+)/start": response.dispatch,
+ "{0}/prod/channels/(?P<channelid>[^/.]+)/stop": response.dispatch,
+ "{0}/prod/inputs": response.dispatch,
+ "{0}/prod/inputs/(?P<inputid>[^/.]+)": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/mediapackage/__init__.py b/contrib/python/moto/py3/moto/mediapackage/__init__.py
new file mode 100644
index 0000000000..e7561de2b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediapackage/__init__.py
@@ -0,0 +1,5 @@
+from .models import mediapackage_backends
+from ..core.models import base_decorator
+
+mediapackage_backend = mediapackage_backends["us-east-1"]
+mock_mediapackage = base_decorator(mediapackage_backends)
diff --git a/contrib/python/moto/py3/moto/mediapackage/exceptions.py b/contrib/python/moto/py3/moto/mediapackage/exceptions.py
new file mode 100644
index 0000000000..c52de621fe
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediapackage/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class MediaPackageClientError(JsonRESTError):
+ code = 400
+
+
+# AWS service exceptions are caught with the underlying botocore exception, ClientError
+class ClientError(MediaPackageClientError):
+ def __init__(self, error, message):
+ super().__init__(error, message)
diff --git a/contrib/python/moto/py3/moto/mediapackage/models.py b/contrib/python/moto/py3/moto/mediapackage/models.py
new file mode 100644
index 0000000000..53b3347a57
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediapackage/models.py
@@ -0,0 +1,218 @@
+from collections import OrderedDict
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import ClientError
+
+
+class Channel(BaseModel):
+ def __init__(self, **kwargs):
+ self.arn = kwargs.get("arn")
+ self.channel_id = kwargs.get("channel_id")
+ self.description = kwargs.get("description")
+ self.tags = kwargs.get("tags")
+
+ def to_dict(self, exclude=None):
+ data = {
+ "arn": self.arn,
+ "id": self.channel_id,
+ "description": self.description,
+ "tags": self.tags,
+ }
+ if exclude:
+ for key in exclude:
+ del data[key]
+ return data
+
+
+class OriginEndpoint(BaseModel):
+ def __init__(self, **kwargs):
+ self.arn = kwargs.get("arn")
+ self.authorization = kwargs.get("authorization")
+ self.channel_id = kwargs.get("channel_id")
+ self.cmaf_package = kwargs.get("cmaf_package")
+ self.dash_package = kwargs.get("dash_package")
+ self.description = kwargs.get("description")
+ self.hls_package = kwargs.get("hls_package")
+ self.id = kwargs.get("endpoint_id")
+ self.manifest_name = kwargs.get("manifest_name")
+ self.mss_package = kwargs.get("mss_package")
+ self.origination = kwargs.get("origination")
+ self.startover_window_seconds = kwargs.get("startover_window_seconds")
+ self.tags = kwargs.get("tags")
+ self.time_delay_seconds = kwargs.get("time_delay_seconds")
+ self.url = kwargs.get("url")
+ self.whitelist = kwargs.get("whitelist")
+
+ def to_dict(self):
+ data = {
+ "arn": self.arn,
+ "authorization": self.authorization,
+ "channelId": self.channel_id,
+ "cmafPackage": self.cmaf_package,
+ "dashPackage": self.dash_package,
+ "description": self.description,
+ "hlsPackage": self.hls_package,
+ "id": self.id,
+ "manifestName": self.manifest_name,
+ "mssPackage": self.mss_package,
+ "origination": self.origination,
+ "startoverWindowSeconds": self.startover_window_seconds,
+ "tags": self.tags,
+ "timeDelaySeconds": self.time_delay_seconds,
+ "url": self.url,
+ "whitelist": self.whitelist,
+ }
+ return data
+
+
+class MediaPackageBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._channels = OrderedDict()
+ self._origin_endpoints = OrderedDict()
+
+ def create_channel(self, description, channel_id, tags):
+ arn = "arn:aws:mediapackage:channel:{}".format(channel_id)
+ channel = Channel(
+ arn=arn,
+ description=description,
+ egress_access_logs={},
+ hls_ingest={},
+ channel_id=channel_id,
+ ingress_access_logs={},
+ tags=tags,
+ )
+ self._channels[channel_id] = channel
+ return channel
+
+ def list_channels(self):
+ channels = list(self._channels.values())
+ response_channels = [c.to_dict() for c in channels]
+ return response_channels
+
+ def describe_channel(self, channel_id):
+ try:
+ channel = self._channels[channel_id]
+ return channel.to_dict()
+ except KeyError:
+ error = "NotFoundException"
+ raise ClientError(error, "channel with id={} not found".format(channel_id))
+
+ def delete_channel(self, channel_id):
+ try:
+ channel = self._channels[channel_id]
+ del self._channels[channel_id]
+ return channel.to_dict()
+
+ except KeyError:
+ error = "NotFoundException"
+ raise ClientError(error, "channel with id={} not found".format(channel_id))
+
+ def create_origin_endpoint(
+ self,
+ authorization,
+ channel_id,
+ cmaf_package,
+ dash_package,
+ description,
+ hls_package,
+ endpoint_id,
+ manifest_name,
+ mss_package,
+ origination,
+ startover_window_seconds,
+ tags,
+ time_delay_seconds,
+ whitelist,
+ ):
+ arn = "arn:aws:mediapackage:origin_endpoint:{}".format(endpoint_id)
+ url = "https://origin-endpoint.mediapackage.{}.amazonaws.com/{}".format(
+ self.region_name, endpoint_id
+ )
+ origin_endpoint = OriginEndpoint(
+ arn=arn,
+ authorization=authorization,
+ channel_id=channel_id,
+ cmaf_package=cmaf_package,
+ dash_package=dash_package,
+ description=description,
+ hls_package=hls_package,
+ endpoint_id=endpoint_id,
+ manifest_name=manifest_name,
+ mss_package=mss_package,
+ origination=origination,
+ startover_window_seconds=startover_window_seconds,
+ tags=tags,
+ time_delay_seconds=time_delay_seconds,
+ url=url,
+ whitelist=whitelist,
+ )
+ self._origin_endpoints[endpoint_id] = origin_endpoint
+ return origin_endpoint
+
+ def describe_origin_endpoint(self, endpoint_id):
+ try:
+ origin_endpoint = self._origin_endpoints[endpoint_id]
+ return origin_endpoint.to_dict()
+ except KeyError:
+ error = "NotFoundException"
+ raise ClientError(
+ error, "origin endpoint with id={} not found".format(endpoint_id)
+ )
+
+ def list_origin_endpoints(self):
+ origin_endpoints = list(self._origin_endpoints.values())
+ response_origin_endpoints = [o.to_dict() for o in origin_endpoints]
+ return response_origin_endpoints
+
+ def delete_origin_endpoint(self, endpoint_id):
+ try:
+ origin_endpoint = self._origin_endpoints[endpoint_id]
+ del self._origin_endpoints[endpoint_id]
+ return origin_endpoint.to_dict()
+ except KeyError:
+ error = "NotFoundException"
+ raise ClientError(
+ error, "origin endpoint with id={} not found".format(endpoint_id)
+ )
+
+ def update_origin_endpoint(
+ self,
+ authorization,
+ cmaf_package,
+ dash_package,
+ description,
+ hls_package,
+ endpoint_id,
+ manifest_name,
+ mss_package,
+ origination,
+ startover_window_seconds,
+ time_delay_seconds,
+ whitelist,
+ ):
+ try:
+ origin_endpoint = self._origin_endpoints[endpoint_id]
+ origin_endpoint.authorization = authorization
+ origin_endpoint.cmaf_package = cmaf_package
+ origin_endpoint.dash_package = dash_package
+ origin_endpoint.description = description
+ origin_endpoint.hls_package = hls_package
+ origin_endpoint.manifest_name = manifest_name
+ origin_endpoint.mss_package = mss_package
+ origin_endpoint.origination = origination
+ origin_endpoint.startover_window_seconds = startover_window_seconds
+ origin_endpoint.time_delay_seconds = time_delay_seconds
+ origin_endpoint.whitelist = whitelist
+ return origin_endpoint
+
+ except KeyError:
+ error = "NotFoundException"
+ raise ClientError(
+ error, "origin endpoint with id={} not found".format(endpoint_id)
+ )
+
+
+mediapackage_backends = BackendDict(MediaPackageBackend, "mediapackage")
diff --git a/contrib/python/moto/py3/moto/mediapackage/responses.py b/contrib/python/moto/py3/moto/mediapackage/responses.py
new file mode 100644
index 0000000000..27384dc393
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediapackage/responses.py
@@ -0,0 +1,114 @@
+from moto.core.responses import BaseResponse
+from .models import mediapackage_backends
+import json
+
+
+class MediaPackageResponse(BaseResponse):
+ SERVICE_NAME = "mediapackage"
+
+ @property
+ def mediapackage_backend(self):
+ return mediapackage_backends[self.region]
+
+ def create_channel(self):
+ description = self._get_param("description")
+ channel_id = self._get_param("id")
+ tags = self._get_param("tags")
+ channel = self.mediapackage_backend.create_channel(
+ description=description, channel_id=channel_id, tags=tags
+ )
+ return json.dumps(channel.to_dict())
+
+ def list_channels(self):
+ channels = self.mediapackage_backend.list_channels()
+ return json.dumps(dict(channels=channels))
+
+ def describe_channel(self):
+ channel_id = self._get_param("id")
+ return json.dumps(
+ self.mediapackage_backend.describe_channel(channel_id=channel_id)
+ )
+
+ def delete_channel(self):
+ channel_id = self._get_param("id")
+ return json.dumps(
+ self.mediapackage_backend.delete_channel(channel_id=channel_id)
+ )
+
+ def create_origin_endpoint(self):
+ authorization = self._get_param("authorization")
+ channel_id = self._get_param("channelId")
+ cmaf_package = self._get_param("cmafPackage")
+ dash_package = self._get_param("dashPackage")
+ description = self._get_param("description")
+ hls_package = self._get_param("hlsPackage")
+ endpoint_id = self._get_param("id")
+ manifest_name = self._get_param("manifestName")
+ mss_package = self._get_param("mssPackage")
+ origination = self._get_param("origination")
+ startover_window_seconds = self._get_int_param("startoverWindowSeconds")
+ tags = self._get_param("tags")
+ time_delay_seconds = self._get_int_param("timeDelaySeconds.member")
+ whitelist = self._get_list_prefix("whitelist.member")
+ origin_endpoint = self.mediapackage_backend.create_origin_endpoint(
+ authorization=authorization,
+ channel_id=channel_id,
+ cmaf_package=cmaf_package,
+ dash_package=dash_package,
+ description=description,
+ hls_package=hls_package,
+ endpoint_id=endpoint_id,
+ manifest_name=manifest_name,
+ mss_package=mss_package,
+ origination=origination,
+ startover_window_seconds=startover_window_seconds,
+ tags=tags,
+ time_delay_seconds=time_delay_seconds,
+ whitelist=whitelist,
+ )
+ return json.dumps(origin_endpoint.to_dict())
+
+ def list_origin_endpoints(self):
+ origin_endpoints = self.mediapackage_backend.list_origin_endpoints()
+ return json.dumps(dict(originEndpoints=origin_endpoints))
+
+ def describe_origin_endpoint(self):
+ endpoint_id = self._get_param("id")
+ return json.dumps(
+ self.mediapackage_backend.describe_origin_endpoint(endpoint_id=endpoint_id)
+ )
+
+ def delete_origin_endpoint(self):
+ endpoint_id = self._get_param("id")
+ return json.dumps(
+ self.mediapackage_backend.delete_origin_endpoint(endpoint_id=endpoint_id)
+ )
+
+ def update_origin_endpoint(self):
+ authorization = self._get_param("authorization")
+ cmaf_package = self._get_param("cmafPackage")
+ dash_package = self._get_param("dashPackage")
+ description = self._get_param("description")
+ hls_package = self._get_param("hlsPackage")
+ endpoint_id = self._get_param("id")
+ manifest_name = self._get_param("manifestName")
+ mss_package = self._get_param("mssPackage")
+ origination = self._get_param("origination")
+ startover_window_seconds = self._get_int_param("startoverWindowSeconds")
+ time_delay_seconds = self._get_int_param("timeDelaySeconds")
+ whitelist = self._get_list_prefix("whitelist.member")
+ origin_endpoint = self.mediapackage_backend.update_origin_endpoint(
+ authorization=authorization,
+ cmaf_package=cmaf_package,
+ dash_package=dash_package,
+ description=description,
+ hls_package=hls_package,
+ endpoint_id=endpoint_id,
+ manifest_name=manifest_name,
+ mss_package=mss_package,
+ origination=origination,
+ startover_window_seconds=startover_window_seconds,
+ time_delay_seconds=time_delay_seconds,
+ whitelist=whitelist,
+ )
+ return json.dumps(origin_endpoint.to_dict())
diff --git a/contrib/python/moto/py3/moto/mediapackage/urls.py b/contrib/python/moto/py3/moto/mediapackage/urls.py
new file mode 100644
index 0000000000..943e9fe555
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediapackage/urls.py
@@ -0,0 +1,16 @@
+from .responses import MediaPackageResponse
+
+url_bases = [
+ r"https?://mediapackage\.(.+)\.amazonaws.com",
+]
+
+
+response = MediaPackageResponse()
+
+
+url_paths = {
+ "{0}/channels": response.dispatch,
+ "{0}/channels/(?P<channelid>[^/.]+)": response.dispatch,
+ "{0}/origin_endpoints": response.dispatch,
+ "{0}/origin_endpoints/(?P<id>[^/.]+)": response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/mediastore/__init__.py b/contrib/python/moto/py3/moto/mediastore/__init__.py
new file mode 100644
index 0000000000..420866c4cd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastore/__init__.py
@@ -0,0 +1,5 @@
+from .models import mediastore_backends
+from ..core.models import base_decorator
+
+mediastore_backend = mediastore_backends["us-east-1"]
+mock_mediastore = base_decorator(mediastore_backends)
diff --git a/contrib/python/moto/py3/moto/mediastore/exceptions.py b/contrib/python/moto/py3/moto/mediastore/exceptions.py
new file mode 100644
index 0000000000..dffb2b6e64
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastore/exceptions.py
@@ -0,0 +1,31 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class MediaStoreClientError(JsonRESTError):
+ code = 400
+
+
+class ContainerNotFoundException(MediaStoreClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__(
+ "ContainerNotFoundException",
+ msg or "The specified container does not exist",
+ )
+
+
+class ResourceNotFoundException(MediaStoreClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__(
+ "ResourceNotFoundException", msg or "The specified container does not exist"
+ )
+
+
+class PolicyNotFoundException(MediaStoreClientError):
+ def __init__(self, msg=None):
+ self.code = 400
+ super().__init__(
+ "PolicyNotFoundException",
+ msg or "The policy does not exist within the specfied container",
+ )
diff --git a/contrib/python/moto/py3/moto/mediastore/models.py b/contrib/python/moto/py3/moto/mediastore/models.py
new file mode 100644
index 0000000000..938d8699b0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastore/models.py
@@ -0,0 +1,128 @@
+from collections import OrderedDict
+from datetime import date
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from .exceptions import (
+ ContainerNotFoundException,
+ ResourceNotFoundException,
+ PolicyNotFoundException,
+)
+
+
+class Container(BaseModel):
+ def __init__(self, **kwargs):
+ self.arn = kwargs.get("arn")
+ self.name = kwargs.get("name")
+ self.endpoint = kwargs.get("endpoint")
+ self.status = kwargs.get("status")
+ self.creation_time = kwargs.get("creation_time")
+ self.lifecycle_policy = None
+ self.policy = None
+ self.metric_policy = None
+ self.tags = kwargs.get("tags")
+
+ def to_dict(self, exclude=None):
+ data = {
+ "ARN": self.arn,
+ "Name": self.name,
+ "Endpoint": self.endpoint,
+ "Status": self.status,
+ "CreationTime": self.creation_time,
+ "Tags": self.tags,
+ }
+ if exclude:
+ for key in exclude:
+ del data[key]
+ return data
+
+
+class MediaStoreBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._containers = OrderedDict()
+
+ def create_container(self, name, tags):
+ arn = "arn:aws:mediastore:container:{}".format(name)
+ container = Container(
+ arn=arn,
+ name=name,
+ endpoint="/{}".format(name),
+ status="CREATING",
+ creation_time=date.today().strftime("%m/%d/%Y, %H:%M:%S"),
+ tags=tags,
+ )
+ self._containers[name] = container
+ return container
+
+ def delete_container(self, name):
+ if name not in self._containers:
+ raise ContainerNotFoundException()
+ del self._containers[name]
+ return {}
+
+ def describe_container(self, name):
+ if name not in self._containers:
+ raise ResourceNotFoundException()
+ container = self._containers[name]
+ container.status = "ACTIVE"
+ return container
+
+ def list_containers(self):
+ """
+ Pagination is not yet implemented
+ """
+ containers = list(self._containers.values())
+ response_containers = [c.to_dict() for c in containers]
+ return response_containers, None
+
+ def list_tags_for_resource(self, name):
+ if name not in self._containers:
+ raise ContainerNotFoundException()
+ tags = self._containers[name].tags
+ return tags
+
+ def put_lifecycle_policy(self, container_name, lifecycle_policy):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ self._containers[container_name].lifecycle_policy = lifecycle_policy
+ return {}
+
+ def get_lifecycle_policy(self, container_name):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ lifecycle_policy = self._containers[container_name].lifecycle_policy
+ if not lifecycle_policy:
+ raise PolicyNotFoundException()
+ return lifecycle_policy
+
+ def put_container_policy(self, container_name, policy):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ self._containers[container_name].policy = policy
+ return {}
+
+ def get_container_policy(self, container_name):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ policy = self._containers[container_name].policy
+ if not policy:
+ raise PolicyNotFoundException()
+ return policy
+
+ def put_metric_policy(self, container_name, metric_policy):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ self._containers[container_name].metric_policy = metric_policy
+ return {}
+
+ def get_metric_policy(self, container_name):
+ if container_name not in self._containers:
+ raise ResourceNotFoundException()
+ metric_policy = self._containers[container_name].metric_policy
+ if not metric_policy:
+ raise PolicyNotFoundException()
+ return metric_policy
+
+
+mediastore_backends = BackendDict(MediaStoreBackend, "mediastore")
diff --git a/contrib/python/moto/py3/moto/mediastore/responses.py b/contrib/python/moto/py3/moto/mediastore/responses.py
new file mode 100644
index 0000000000..5d55c179f4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastore/responses.py
@@ -0,0 +1,85 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import mediastore_backends
+
+
+class MediaStoreResponse(BaseResponse):
+ SERVICE_NAME = "mediastore"
+
+ @property
+ def mediastore_backend(self):
+ return mediastore_backends[self.region]
+
+ def create_container(self):
+ name = self._get_param("ContainerName")
+ tags = self._get_param("Tags")
+ container = self.mediastore_backend.create_container(name=name, tags=tags)
+ return json.dumps(dict(Container=container.to_dict()))
+
+ def delete_container(self):
+ name = self._get_param("ContainerName")
+ result = self.mediastore_backend.delete_container(name=name)
+ return json.dumps(result)
+
+ def describe_container(self):
+ name = self._get_param("ContainerName")
+ container = self.mediastore_backend.describe_container(name=name)
+ return json.dumps(dict(Container=container.to_dict()))
+
+ def list_containers(self):
+ containers, next_token = self.mediastore_backend.list_containers()
+ return json.dumps(dict(dict(Containers=containers), NextToken=next_token))
+
+ def list_tags_for_resource(self):
+ name = self._get_param("Resource")
+ tags = self.mediastore_backend.list_tags_for_resource(name)
+ return json.dumps(dict(Tags=tags))
+
+ def put_lifecycle_policy(self):
+ container_name = self._get_param("ContainerName")
+ lifecycle_policy = self._get_param("LifecyclePolicy")
+ policy = self.mediastore_backend.put_lifecycle_policy(
+ container_name=container_name, lifecycle_policy=lifecycle_policy
+ )
+ return json.dumps(policy)
+
+ def get_lifecycle_policy(self):
+ container_name = self._get_param("ContainerName")
+ lifecycle_policy = self.mediastore_backend.get_lifecycle_policy(
+ container_name=container_name
+ )
+ return json.dumps(dict(LifecyclePolicy=lifecycle_policy))
+
+ def put_container_policy(self):
+ container_name = self._get_param("ContainerName")
+ policy = self._get_param("Policy")
+ container_policy = self.mediastore_backend.put_container_policy(
+ container_name=container_name, policy=policy
+ )
+ return json.dumps(container_policy)
+
+ def get_container_policy(self):
+ container_name = self._get_param("ContainerName")
+ policy = self.mediastore_backend.get_container_policy(
+ container_name=container_name
+ )
+ return json.dumps(dict(Policy=policy))
+
+ def put_metric_policy(self):
+ container_name = self._get_param("ContainerName")
+ metric_policy = self._get_param("MetricPolicy")
+ self.mediastore_backend.put_metric_policy(
+ container_name=container_name, metric_policy=metric_policy
+ )
+ return json.dumps(metric_policy)
+
+ def get_metric_policy(self):
+ container_name = self._get_param("ContainerName")
+ metric_policy = self.mediastore_backend.get_metric_policy(
+ container_name=container_name
+ )
+ return json.dumps(dict(MetricPolicy=metric_policy))
+
+
+# add templates from here
diff --git a/contrib/python/moto/py3/moto/mediastore/urls.py b/contrib/python/moto/py3/moto/mediastore/urls.py
new file mode 100644
index 0000000000..90e403d86c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastore/urls.py
@@ -0,0 +1,7 @@
+from .responses import MediaStoreResponse
+
+url_bases = [r"https?://mediastore\.(.+)\.amazonaws\.com"]
+
+response = MediaStoreResponse()
+
+url_paths = {"{0}/$": response.dispatch, "{0}/(?P<Path>[^/.]+)$": response.dispatch}
diff --git a/contrib/python/moto/py3/moto/mediastoredata/__init__.py b/contrib/python/moto/py3/moto/mediastoredata/__init__.py
new file mode 100644
index 0000000000..9b8df256c6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastoredata/__init__.py
@@ -0,0 +1,5 @@
+from .models import mediastoredata_backends
+from ..core.models import base_decorator
+
+mediastoredata_backend = mediastoredata_backends["us-east-1"]
+mock_mediastoredata = base_decorator(mediastoredata_backends)
diff --git a/contrib/python/moto/py3/moto/mediastoredata/exceptions.py b/contrib/python/moto/py3/moto/mediastoredata/exceptions.py
new file mode 100644
index 0000000000..e1c3b96742
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastoredata/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class MediaStoreDataClientError(JsonRESTError):
+ code = 400
+
+
+# AWS service exceptions are caught with the underlying botocore exception, ClientError
+class ClientError(MediaStoreDataClientError):
+ def __init__(self, error, message):
+ super().__init__(error, message)
diff --git a/contrib/python/moto/py3/moto/mediastoredata/models.py b/contrib/python/moto/py3/moto/mediastoredata/models.py
new file mode 100644
index 0000000000..395faa1f95
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastoredata/models.py
@@ -0,0 +1,72 @@
+import hashlib
+from collections import OrderedDict
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from .exceptions import ClientError
+
+
+class Object(BaseModel):
+ def __init__(self, path, body, etag, storage_class="TEMPORAL"):
+ self.path = path
+ self.body = body
+ self.content_sha256 = hashlib.sha256(body.encode("utf-8")).hexdigest()
+ self.etag = etag
+ self.storage_class = storage_class
+
+ def to_dict(self):
+ data = {
+ "ETag": self.etag,
+ "Name": self.path,
+ "Type": "FILE",
+ "ContentLength": 123,
+ "StorageClass": self.storage_class,
+ "Path": self.path,
+ "ContentSHA256": self.content_sha256,
+ }
+
+ return data
+
+
+class MediaStoreDataBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._objects = OrderedDict()
+
+ def put_object(self, body, path, storage_class="TEMPORAL"):
+ """
+ The following parameters are not yet implemented: ContentType, CacheControl, UploadAvailability
+ """
+ new_object = Object(
+ path=path, body=body, etag="etag", storage_class=storage_class
+ )
+ self._objects[path] = new_object
+ return new_object
+
+ def delete_object(self, path):
+ if path not in self._objects:
+ error = "ObjectNotFoundException"
+ raise ClientError(error, "Object with id={} not found".format(path))
+ del self._objects[path]
+ return {}
+
+ def get_object(self, path):
+ """
+ The Range-parameter is not yet supported.
+ """
+ objects_found = [item for item in self._objects.values() if item.path == path]
+ if len(objects_found) == 0:
+ error = "ObjectNotFoundException"
+ raise ClientError(error, "Object with id={} not found".format(path))
+ return objects_found[0]
+
+ def list_items(self):
+ """
+ The Path- and MaxResults-parameters are not yet supported.
+ """
+ items = self._objects.values()
+ response_items = [c.to_dict() for c in items]
+ return response_items
+
+
+mediastoredata_backends = BackendDict(MediaStoreDataBackend, "mediastore-data")
diff --git a/contrib/python/moto/py3/moto/mediastoredata/responses.py b/contrib/python/moto/py3/moto/mediastoredata/responses.py
new file mode 100644
index 0000000000..2803e09130
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastoredata/responses.py
@@ -0,0 +1,34 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import mediastoredata_backends
+
+
+class MediaStoreDataResponse(BaseResponse):
+ SERVICE_NAME = "mediastore-data"
+
+ @property
+ def mediastoredata_backend(self):
+ return mediastoredata_backends[self.region]
+
+ def get_object(self):
+ path = self._get_param("Path")
+ result = self.mediastoredata_backend.get_object(path=path)
+ headers = {"Path": result.path}
+ return result.body, headers
+
+ def put_object(self):
+ body = self.body
+ path = self._get_param("Path")
+ new_object = self.mediastoredata_backend.put_object(body, path)
+ object_dict = new_object.to_dict()
+ return json.dumps(object_dict)
+
+ def delete_object(self):
+ item_id = self._get_param("Path")
+ result = self.mediastoredata_backend.delete_object(path=item_id)
+ return json.dumps(result)
+
+ def list_items(self):
+ items = self.mediastoredata_backend.list_items()
+ return json.dumps(dict(Items=items))
diff --git a/contrib/python/moto/py3/moto/mediastoredata/urls.py b/contrib/python/moto/py3/moto/mediastoredata/urls.py
new file mode 100644
index 0000000000..2180b7b082
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mediastoredata/urls.py
@@ -0,0 +1,9 @@
+from .responses import MediaStoreDataResponse
+
+url_bases = [
+ r"https?://data\.mediastore\.(.+)\.amazonaws.com",
+]
+
+response = MediaStoreDataResponse()
+
+url_paths = {"{0}/$": response.dispatch, "{0}/(?P<Path>[^/.]+)$": response.dispatch}
diff --git a/contrib/python/moto/py3/moto/moto_api/__init__.py b/contrib/python/moto/py3/moto/moto_api/__init__.py
new file mode 100644
index 0000000000..0517e8ff3c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/__init__.py
@@ -0,0 +1,7 @@
+from moto.moto_api import _internal
+
+"""
+Global StateManager that everyone uses
+Use this manager to configure how AWS models transition between states. (initializing -> starting, starting -> ready, etc.)
+"""
+state_manager = _internal.state_manager.StateManager()
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/__init__.py b/contrib/python/moto/py3/moto/moto_api/_internal/__init__.py
new file mode 100644
index 0000000000..b7efea3d88
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/__init__.py
@@ -0,0 +1,5 @@
+from .models import moto_api_backend
+from .state_manager import StateManager # noqa
+
+
+moto_api_backends = {"global": moto_api_backend}
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/managed_state_model.py b/contrib/python/moto/py3/moto/moto_api/_internal/managed_state_model.py
new file mode 100644
index 0000000000..fe43f7afe6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/managed_state_model.py
@@ -0,0 +1,67 @@
+from datetime import datetime, timedelta
+from moto.moto_api import state_manager
+
+
+class ManagedState:
+ """
+ Subclass this class to configure state-transitions
+ """
+
+ def __init__(self, model_name, transitions):
+ # Indicate the possible transitions for this model
+ # Example: [(initializing,queued), (queued, starting), (starting, ready)]
+ self._transitions = transitions
+ # Current status of this model. Implementations should call `status`
+ # The initial status is assumed to be the first transition
+ self._status, _ = transitions[0]
+ # Internal counter that keeps track of how often this model has been described
+ # Used for transition-type=manual
+ self._tick = 0
+ # Time when the status was last progressed to this model
+ # Used for transition-type=time
+ self._time_progressed = datetime.now()
+ # Name of this model. This will be used in the API
+ self.model_name = model_name
+
+ def advance(self):
+ self._tick += 1
+
+ @property
+ def status(self):
+ """
+ Transitions the status as appropriate before returning
+ """
+ transition_config = state_manager.get_transition(self.model_name)
+ if transition_config["progression"] == "immediate":
+ self._status = self._get_last_status(previous=self._status)
+
+ if transition_config["progression"] == "manual":
+ if self._tick >= transition_config["times"]:
+ self._status = self._get_next_status(previous=self._status)
+ self._tick = 0
+
+ if transition_config["progression"] == "time":
+ next_transition_at = self._time_progressed + timedelta(
+ seconds=transition_config["seconds"]
+ )
+ if datetime.now() > next_transition_at:
+ self._status = self._get_next_status(previous=self._status)
+ self._time_progressed = datetime.now()
+
+ return self._status
+
+ @status.setter
+ def status(self, value):
+ self._status = value
+
+ def _get_next_status(self, previous):
+ return next(
+ (nxt for prev, nxt in self._transitions if previous == prev), previous
+ )
+
+ def _get_last_status(self, previous):
+ next_state = self._get_next_status(previous)
+ while next_state != previous:
+ previous = next_state
+ next_state = self._get_next_status(previous)
+ return next_state
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/models.py b/contrib/python/moto/py3/moto/moto_api/_internal/models.py
new file mode 100644
index 0000000000..8002ef9eb8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/models.py
@@ -0,0 +1,34 @@
+from moto.core import BaseBackend
+
+
+class MotoAPIBackend(BaseBackend):
+ def reset(self):
+ region_name = self.region_name
+ account_id = self.account_id
+
+ import moto.backends as backends
+
+ for name, backends_ in backends.loaded_backends():
+ if name == "moto_api":
+ continue
+ for backend in backends_.values():
+ backend.reset()
+ self.__init__(region_name, account_id)
+
+ def get_transition(self, model_name):
+ from moto.moto_api import state_manager
+
+ return state_manager.get_transition(model_name)
+
+ def set_transition(self, model_name, transition):
+ from moto.moto_api import state_manager
+
+ state_manager.set_transition(model_name, transition)
+
+ def unset_transition(self, model_name):
+ from moto.moto_api import state_manager
+
+ state_manager.unset_transition(model_name)
+
+
+moto_api_backend = MotoAPIBackend(region_name="global")
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/responses.py b/contrib/python/moto/py3/moto/moto_api/_internal/responses.py
new file mode 100644
index 0000000000..21b3e2a07d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/responses.py
@@ -0,0 +1,108 @@
+import json
+
+from moto import settings
+from moto.core.responses import ActionAuthenticatorMixin, BaseResponse
+
+
+class MotoAPIResponse(BaseResponse):
+ def reset_response(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ if request.method == "POST":
+ from .models import moto_api_backend
+
+ moto_api_backend.reset()
+ return 200, {}, json.dumps({"status": "ok"})
+ return 400, {}, json.dumps({"Error": "Need to POST to reset Moto"})
+
+ def reset_auth_response(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ if request.method == "POST":
+ previous_initial_no_auth_action_count = (
+ settings.INITIAL_NO_AUTH_ACTION_COUNT
+ )
+ settings.INITIAL_NO_AUTH_ACTION_COUNT = float(request.data.decode())
+ ActionAuthenticatorMixin.request_count = 0
+ return (
+ 200,
+ {},
+ json.dumps(
+ {
+ "status": "ok",
+ "PREVIOUS_INITIAL_NO_AUTH_ACTION_COUNT": str(
+ previous_initial_no_auth_action_count
+ ),
+ }
+ ),
+ )
+ return 400, {}, json.dumps({"Error": "Need to POST to reset Moto Auth"})
+
+ def model_data(self, request, full_url, headers): # pylint: disable=unused-argument
+ from moto.core.base_backend import model_data
+
+ results = {}
+ for service in sorted(model_data):
+ models = model_data[service]
+ results[service] = {}
+ for name in sorted(models):
+ model = models[name]
+ results[service][name] = []
+ for instance in model.instances:
+ inst_result = {}
+ for attr in dir(instance):
+ if not attr.startswith("_"):
+ try:
+ json.dumps(getattr(instance, attr))
+ except TypeError:
+ pass
+ else:
+ inst_result[attr] = getattr(instance, attr)
+ results[service][name].append(inst_result)
+ return 200, {"Content-Type": "application/javascript"}, json.dumps(results)
+
+ def dashboard(self, request, full_url, headers): # pylint: disable=unused-argument
+ from flask import render_template
+
+ return render_template("dashboard.html")
+
+ def get_transition(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ from .models import moto_api_backend
+
+ qs_dict = dict(
+ x.split("=") for x in request.query_string.decode("utf-8").split("&")
+ )
+ model_name = qs_dict["model_name"]
+
+ resp = moto_api_backend.get_transition(model_name=model_name)
+
+ return 200, {}, json.dumps(resp)
+
+ def set_transition(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ from .models import moto_api_backend
+
+ request_body_size = int(headers["Content-Length"])
+ body = request.environ["wsgi.input"].read(request_body_size).decode("utf-8")
+ body = json.loads(body)
+ model_name = body["model_name"]
+ transition = body["transition"]
+
+ moto_api_backend.set_transition(model_name, transition)
+ return 201, {}, ""
+
+ def unset_transition(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ from .models import moto_api_backend
+
+ request_body_size = int(headers["Content-Length"])
+ body = request.environ["wsgi.input"].read(request_body_size).decode("utf-8")
+ body = json.loads(body)
+ model_name = body["model_name"]
+
+ moto_api_backend.unset_transition(model_name)
+ return 201, {}, ""
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/state_manager.py b/contrib/python/moto/py3/moto/moto_api/_internal/state_manager.py
new file mode 100644
index 0000000000..5c5361a081
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/state_manager.py
@@ -0,0 +1,42 @@
+DEFAULT_TRANSITION = {"progression": "immediate"}
+
+
+class StateManager:
+ def __init__(self):
+ self._default_transitions = dict()
+ self._transitions = dict()
+
+ def register_default_transition(self, model_name, transition):
+ """
+ Register the default transition for a specific model.
+ This should only be called by Moto backends - use the `set_transition` method to override this default transition in your own tests.
+ """
+ self._default_transitions[model_name] = transition
+
+ def set_transition(self, model_name, transition):
+ """
+ Set a transition for a specific model. Any transition added here will take precedence over the default transition that was registered.
+
+ See https://docs.getmoto.org/en/latest/docs/configuration/state_transition/index.html for the possible transition-configurations.
+ """
+ self._transitions[model_name] = transition
+
+ def unset_transition(self, model_name):
+ """
+ Unset (remove) a custom transition that was set. This is a safe and idempotent operation.
+ The default transition that was registered will not be altered by this operation.
+ """
+ self._transitions.pop(model_name, None)
+
+ def get_transition(self, model_name):
+ """
+ Return the configuration for a specific model. This will return a user-specified configuration, a default configuration of none exists, or the default transition if none exists.
+ """
+ if model_name in self._transitions:
+ return self._transitions[model_name]
+ if model_name in self._default_transitions:
+ return self._default_transitions[model_name]
+ return DEFAULT_TRANSITION
+
+ def get_registered_models(self):
+ return list(self._default_transitions.keys())
diff --git a/contrib/python/moto/py3/moto/moto_api/_internal/urls.py b/contrib/python/moto/py3/moto/moto_api/_internal/urls.py
new file mode 100644
index 0000000000..eaf15e9635
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_api/_internal/urls.py
@@ -0,0 +1,15 @@
+from moto.moto_api._internal.responses import MotoAPIResponse
+
+url_bases = ["https?://motoapi.amazonaws.com"]
+
+response_instance = MotoAPIResponse()
+
+url_paths = {
+ "{0}/moto-api/$": response_instance.dashboard,
+ "{0}/moto-api/data.json": response_instance.model_data,
+ "{0}/moto-api/reset": response_instance.reset_response,
+ "{0}/moto-api/reset-auth": response_instance.reset_auth_response,
+ "{0}/moto-api/state-manager/get-transition": response_instance.get_transition,
+ "{0}/moto-api/state-manager/set-transition": response_instance.set_transition,
+ "{0}/moto-api/state-manager/unset-transition": response_instance.unset_transition,
+}
diff --git a/contrib/python/moto/py3/moto/moto_server/templates/dashboard.html b/contrib/python/moto/py3/moto/moto_server/templates/dashboard.html
new file mode 100644
index 0000000000..33859101a6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_server/templates/dashboard.html
@@ -0,0 +1,188 @@
+
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>Moto</title>
+
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" rel="stylesheet">
+ <style>
+ body {
+ padding-top: 70px;
+ padding-bottom: 30px;
+ }
+
+ .theme-dropdown .dropdown-menu {
+ position: static;
+ display: block;
+ margin-bottom: 20px;
+ }
+
+ .theme-showcase > p > .btn {
+ margin: 5px 0;
+ }
+
+ .theme-showcase .navbar .container {
+ width: auto;
+ }
+ </style>
+
+ </head>
+
+ <body>
+
+ <nav class="navbar navbar-inverse navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="#">Moto</a>
+ </div>
+ <div id="navbar" class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li class="active"><a href="#">Home</a></li>
+ <li><a href="#about" data-toggle="modal" data-target="#aboutModal">About</a></li>
+ </ul>
+ </div>
+ </div>
+ </nav>
+
+ <div class="container theme-showcase" role="main" id="main">
+ </div>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.js"></script>
+
+
+ {% raw %}
+ <script id="template" type="text/x-handlebars-template">
+
+ <ul id="myTab" class="nav nav-pills">
+ {{#each data}}
+ <li {{#if @first}}class="active"{{/if}}><a href="#{{this.name}}" data-toggle="tab">{{this.name}}</a></li>
+ {{/each}}
+ </ul>
+
+ <div id="myTabContent" class="tab-content">
+ {{#each data}}
+ <div class="tab-pane fade {{#if @first}}in active{{/if}}" id="{{this.name}}">
+
+ {{#each this}}
+ {{#unless @last}} <!-- Skip name key -->
+ <div class="page-header">
+ <h3>{{@key}}</h3>
+ </div>
+
+ <div class="row">
+ <div class="col-md-12">
+ <table class="table table-striped table-bordered table-condensed">
+ {{#each this}}
+ <tr>
+ {{#each this}}
+ <td>{{@key}}: {{{json this}}}</td>
+ {{/each}}
+ </tr>
+ {{else}}
+ <tr><td>[]</td></tr>
+ {{/each}}
+ </table>
+ </div>
+ </div>
+ {{/unless}}
+ {{/each}}
+ </div>
+
+ {{/each}}
+ </div>
+
+ </script>
+ <script>
+ sortObject = function(obj) {
+ if ($.isArray(obj)) {
+ var result = [];
+ $.each(obj, function(index, array_item) {
+ result.push(sortObject(array_item));
+ })
+ return result;
+ }
+
+ if (!$.isPlainObject(obj)) {
+ return obj;
+ }
+
+ var keys = $.map(obj, function(element,index) {return index});
+ keys.sort();
+ var len = keys.length;
+
+ var result = {};
+ $.each(keys, function(index, key) {
+ var val = obj[key];
+ result[key] = sortObject(val);
+ })
+ return result;
+ }
+
+
+ flattenAndSortObject = function(obj) {
+ if (!$.isPlainObject(obj)) {
+ return obj;
+ }
+
+ var keys = $.map(obj, function(element,index) {return index});
+ keys.sort();
+ var len = keys.length;
+
+ var result = [];
+ $.each(keys, function(index, key) {
+ var val = obj[key];
+ val.name = key;
+ result.push(sortObject(val));
+ })
+ return result;
+ }
+
+ $(document).ready(function (){
+ Handlebars.registerHelper("json", function (context) {
+ return JSON.stringify(context);
+ });
+ $.getJSON("/moto-api/data.json", function(data) {
+ var source = $('#template').html();
+ var template = Handlebars.compile(source);
+
+ data = flattenAndSortObject(data);
+ $('#main').append(template({"data": data}));
+ });
+
+ })
+ </script>
+ {% endraw %}
+
+ <!-- Modal -->
+ <div class="modal fade" id="aboutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ <h4 class="modal-title" id="myModalLabel">About Moto</h4>
+ </div>
+ <div class="modal-body">
+ <p>Moto was created by <a href="https://twitter.com/spulec">Steve Pulec</a> and <a href="https://github.com/spulec/moto/blob/master/AUTHORS.md">many other contributors</a>.</p>
+
+ <p>Please open any issues <a href="https://github.com/spulec/moto/issues">here</a>.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </body>
+</html>
diff --git a/contrib/python/moto/py3/moto/moto_server/threaded_moto_server.py b/contrib/python/moto/py3/moto/moto_server/threaded_moto_server.py
new file mode 100644
index 0000000000..6a176ca5f7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_server/threaded_moto_server.py
@@ -0,0 +1,48 @@
+import time
+from threading import Thread
+from werkzeug.serving import make_server
+
+from .werkzeug_app import DomainDispatcherApplication, create_backend_app
+
+
+class ThreadedMotoServer:
+ def __init__(self, ip_address="0.0.0.0", port=5000, verbose=True):
+
+ if verbose:
+ print(
+ "The ThreadedMotoServer is considered in beta for now, and the exact interface and behaviour may still change."
+ )
+ print("Please let us know if you’d like to see any changes.")
+ print("========")
+
+ self._port = port
+
+ self._thread = None
+ self._ip_address = ip_address
+ self._server = None
+ self._server_ready = False
+ self._verbose = verbose
+
+ def _server_entry(self):
+ app = DomainDispatcherApplication(create_backend_app)
+
+ self._server = make_server(self._ip_address, self._port, app, True)
+ self._server_ready = True
+ self._server.serve_forever()
+
+ def start(self):
+ if self._verbose:
+ print(
+ f"Starting a new Thread with MotoServer running on {self._ip_address}:{self._port}..."
+ )
+ self._thread = Thread(target=self._server_entry, daemon=True)
+ self._thread.start()
+ while not self._server_ready:
+ time.sleep(0.5)
+
+ def stop(self):
+ self._server_ready = False
+ if self._server:
+ self._server.shutdown()
+
+ self._thread.join()
diff --git a/contrib/python/moto/py3/moto/moto_server/utilities.py b/contrib/python/moto/py3/moto/moto_server/utilities.py
new file mode 100644
index 0000000000..27b45dcaca
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_server/utilities.py
@@ -0,0 +1,36 @@
+import json
+from flask.testing import FlaskClient
+
+from urllib.parse import urlencode
+from werkzeug.routing import BaseConverter
+
+
+class RegexConverter(BaseConverter):
+ # http://werkzeug.pocoo.org/docs/routing/#custom-converters
+
+ def __init__(self, url_map, *items):
+ super().__init__(url_map)
+ self.regex = items[0]
+
+
+class AWSTestHelper(FlaskClient):
+ def action_data(self, action_name, **kwargs):
+ """
+ Method calls resource with action_name and returns data of response.
+ """
+ opts = {"Action": action_name}
+ opts.update(kwargs)
+ res = self.get(
+ "/?{0}".format(urlencode(opts)),
+ headers={
+ "Host": "{0}.us-east-1.amazonaws.com".format(self.application.service)
+ },
+ )
+ return res.data.decode("utf-8")
+
+ def action_json(self, action_name, **kwargs):
+ """
+ Method calls resource with action_name and returns object obtained via
+ deserialization of output.
+ """
+ return json.loads(self.action_data(action_name, **kwargs))
diff --git a/contrib/python/moto/py3/moto/moto_server/werkzeug_app.py b/contrib/python/moto/py3/moto/moto_server/werkzeug_app.py
new file mode 100644
index 0000000000..6983c970c6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/moto_server/werkzeug_app.py
@@ -0,0 +1,295 @@
+import io
+import os
+import os.path
+from threading import Lock
+
+from flask import Flask
+from flask_cors import CORS
+
+import moto.backends as backends
+import moto.backend_index as backend_index
+from moto.core.utils import convert_to_flask_response
+
+from .utilities import AWSTestHelper, RegexConverter
+
+HTTP_METHODS = ["GET", "POST", "PUT", "DELETE", "HEAD", "PATCH", "OPTIONS"]
+
+
+DEFAULT_SERVICE_REGION = ("s3", "us-east-1")
+
+# Map of unsigned calls to service-region as per AWS API docs
+# https://docs.aws.amazon.com/cognito/latest/developerguide/resource-permissions.html#amazon-cognito-signed-versus-unsigned-apis
+UNSIGNED_REQUESTS = {
+ "AWSCognitoIdentityService": ("cognito-identity", "us-east-1"),
+ "AWSCognitoIdentityProviderService": ("cognito-idp", "us-east-1"),
+}
+UNSIGNED_ACTIONS = {
+ "AssumeRoleWithSAML": ("sts", "us-east-1"),
+ "AssumeRoleWithWebIdentity": ("sts", "us-east-1"),
+}
+
+# Some services have v4 signing names that differ from the backend service name/id.
+SIGNING_ALIASES = {
+ "eventbridge": "events",
+ "execute-api": "iot",
+ "iotdata": "data.iot",
+ "mobiletargeting": "pinpoint",
+}
+
+# Some services are only recognizable by the version
+SERVICE_BY_VERSION = {"2009-04-15": "sdb"}
+
+
+class DomainDispatcherApplication(object):
+ """
+ Dispatch requests to different applications based on the "Host:" header
+ value. We'll match the host header value with the url_bases of each backend.
+ """
+
+ def __init__(self, create_app, service=None):
+ self.create_app = create_app
+ self.lock = Lock()
+ self.app_instances = {}
+ self.service = service
+ self.backend_url_patterns = backend_index.backend_url_patterns
+
+ def get_backend_for_host(self, host):
+
+ if host == "moto_api":
+ return host
+
+ if self.service:
+ return self.service
+
+ if host in backends.BACKENDS:
+ return host
+
+ for backend, pattern in self.backend_url_patterns:
+ if pattern.match("http://%s" % host):
+ return backend
+
+ if "amazonaws.com" in host:
+ print(
+ "Unable to find appropriate backend for {}."
+ "Remember to add the URL to urls.py, and run scripts/update_backend_index.py to index it.".format(
+ host
+ )
+ )
+
+ def infer_service_region_host(self, body, environ):
+ auth = environ.get("HTTP_AUTHORIZATION")
+ target = environ.get("HTTP_X_AMZ_TARGET")
+ service = None
+ if auth:
+ # Signed request
+ # Parse auth header to find service assuming a SigV4 request
+ # https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html
+ # ['Credential=sdffdsa', '20170220', 'us-east-1', 'sns', 'aws4_request']
+ try:
+ credential_scope = auth.split(",")[0].split()[1]
+ _, _, region, service, _ = credential_scope.split("/")
+ service = SIGNING_ALIASES.get(service.lower(), service)
+ service = service.lower()
+ except ValueError:
+ # Signature format does not match, this is exceptional and we can't
+ # infer a service-region. A reduced set of services still use
+ # the deprecated SigV2, ergo prefer S3 as most likely default.
+ # https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html
+ service, region = DEFAULT_SERVICE_REGION
+ else:
+ # Unsigned request
+ action = self.get_action_from_body(body)
+ if target:
+ service, _ = target.split(".", 1)
+ service, region = UNSIGNED_REQUESTS.get(service, DEFAULT_SERVICE_REGION)
+ elif action and action in UNSIGNED_ACTIONS:
+ # See if we can match the Action to a known service
+ service, region = UNSIGNED_ACTIONS.get(action)
+ if not service:
+ service, region = self.get_service_from_body(body, environ)
+ if not service:
+ service, region = self.get_service_from_path(environ)
+ if not service:
+ # S3 is the last resort when the target is also unknown
+ service, region = DEFAULT_SERVICE_REGION
+
+ path = environ.get("PATH_INFO", "")
+ if service in ["budgets", "cloudfront"]:
+ # Global Services - they do not have/expect a region
+ host = f"{service}.amazonaws.com"
+ elif service == "mediastore" and not target:
+ # All MediaStore API calls have a target header
+ # If no target is set, assume we're trying to reach the mediastore-data service
+ host = "data.{service}.{region}.amazonaws.com".format(
+ service=service, region=region
+ )
+ elif service == "dynamodb":
+ if environ["HTTP_X_AMZ_TARGET"].startswith("DynamoDBStreams"):
+ host = "dynamodbstreams"
+ else:
+ dynamo_api_version = (
+ environ["HTTP_X_AMZ_TARGET"].split("_")[1].split(".")[0]
+ )
+ # Support for older API version
+ if dynamo_api_version <= "20111205":
+ host = "dynamodb_v20111205"
+ else:
+ host = "dynamodb"
+ elif service == "sagemaker":
+ host = "api.{service}.{region}.amazonaws.com".format(
+ service=service, region=region
+ )
+ elif service == "timestream":
+ host = "ingest.{service}.{region}.amazonaws.com".format(
+ service=service, region=region
+ )
+ elif service == "s3" and (
+ path.startswith("/v20180820/") or "s3-control" in environ["HTTP_HOST"]
+ ):
+ host = "s3control"
+ else:
+ host = "{service}.{region}.amazonaws.com".format(
+ service=service, region=region
+ )
+
+ return host
+
+ def get_application(self, environ):
+ path_info = environ.get("PATH_INFO", "")
+
+ # The URL path might contain non-ASCII text, for instance unicode S3 bucket names
+ if isinstance(path_info, bytes):
+ path_info = path_info.decode("utf-8")
+
+ if path_info.startswith("/moto-api") or path_info == "/favicon.ico":
+ host = "moto_api"
+ elif path_info.startswith("/latest/meta-data/"):
+ host = "instance_metadata"
+ else:
+ host = environ["HTTP_HOST"].split(":")[0]
+
+ with self.lock:
+ backend = self.get_backend_for_host(host)
+ if not backend:
+ # No regular backend found; try parsing body/other headers
+ body = self._get_body(environ)
+ host = self.infer_service_region_host(body, environ)
+ backend = self.get_backend_for_host(host)
+
+ app = self.app_instances.get(backend, None)
+ if app is None:
+ app = self.create_app(backend)
+ self.app_instances[backend] = app
+ return app
+
+ def _get_body(self, environ):
+ body = None
+ try:
+ # AWS requests use querystrings as the body (Action=x&Data=y&...)
+ simple_form = environ["CONTENT_TYPE"].startswith(
+ "application/x-www-form-urlencoded"
+ )
+ request_body_size = int(environ["CONTENT_LENGTH"])
+ if simple_form and request_body_size:
+ body = environ["wsgi.input"].read(request_body_size).decode("utf-8")
+ except (KeyError, ValueError):
+ pass
+ finally:
+ if body:
+ # We've consumed the body = need to reset it
+ environ["wsgi.input"] = io.StringIO(body)
+ return body
+
+ def get_service_from_body(self, body, environ):
+ # Some services have the SDK Version in the body
+ # If the version is unique, we can derive the service from it
+ version = self.get_version_from_body(body)
+ if version and version in SERVICE_BY_VERSION:
+ # Boto3/1.20.7 Python/3.8.10 Linux/5.11.0-40-generic Botocore/1.23.7 region/eu-west-1
+ region = environ.get("HTTP_USER_AGENT", "").split("/")[-1]
+ return SERVICE_BY_VERSION[version], region
+ return None, None
+
+ def get_version_from_body(self, body):
+ try:
+ body_dict = dict(x.split("=") for x in body.split("&"))
+ return body_dict["Version"]
+ except (AttributeError, KeyError, ValueError):
+ return None
+
+ def get_action_from_body(self, body):
+ try:
+ # AWS requests use querystrings as the body (Action=x&Data=y&...)
+ body_dict = dict(x.split("=") for x in body.split("&"))
+ return body_dict["Action"]
+ except (AttributeError, KeyError, ValueError):
+ return None
+
+ def get_service_from_path(self, environ):
+ # Moto sometimes needs to send a HTTP request to itself
+ # In which case it will send a request to 'http://localhost/service_region/whatever'
+ try:
+ path_info = environ.get("PATH_INFO", "/")
+ service, region = path_info[1 : path_info.index("/", 1)].split("_")
+ return service, region
+ except (AttributeError, KeyError, ValueError):
+ return None, None
+
+ def __call__(self, environ, start_response):
+ backend_app = self.get_application(environ)
+ return backend_app(environ, start_response)
+
+
+def create_backend_app(service):
+ from werkzeug.routing import Map
+
+ current_file = os.path.abspath(__file__)
+ current_dir = os.path.abspath(os.path.join(current_file, os.pardir))
+ template_dir = os.path.join(current_dir, "templates")
+
+ # Create the backend_app
+ backend_app = Flask("moto", template_folder=template_dir)
+ backend_app.debug = True
+ backend_app.service = service
+ CORS(backend_app)
+
+ # Reset view functions to reset the app
+ backend_app.view_functions = {}
+ backend_app.url_map = Map()
+ backend_app.url_map.converters["regex"] = RegexConverter
+
+ backend_dict = backends.get_backend(service)
+ if "us-east-1" in backend_dict:
+ backend = backend_dict["us-east-1"]
+ else:
+ backend = backend_dict["global"]
+
+ for url_path, handler in backend.flask_paths.items():
+ view_func = convert_to_flask_response(handler)
+ if handler.__name__ == "dispatch":
+ endpoint = "{0}.dispatch".format(handler.__self__.__name__)
+ else:
+ endpoint = view_func.__name__
+
+ original_endpoint = endpoint
+ index = 2
+ while endpoint in backend_app.view_functions:
+ # HACK: Sometimes we map the same view to multiple url_paths. Flask
+ # requires us to have different names.
+ endpoint = original_endpoint + str(index)
+ index += 1
+
+ # Some services do not provide a URL path
+ # I.e., boto3 sends a request to 'https://ingest.timestream.amazonaws.com'
+ # Which means we have a empty url_path to catch this request - but Flask can't handle that
+ if url_path:
+ backend_app.add_url_rule(
+ url_path,
+ endpoint=endpoint,
+ methods=HTTP_METHODS,
+ view_func=view_func,
+ strict_slashes=False,
+ )
+
+ backend_app.test_client_class = AWSTestHelper
+ return backend_app
diff --git a/contrib/python/moto/py3/moto/mq/__init__.py b/contrib/python/moto/py3/moto/mq/__init__.py
new file mode 100644
index 0000000000..cde94761c6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/__init__.py
@@ -0,0 +1,5 @@
+"""mq module initialization; sets value for base decorator."""
+from .models import mq_backends
+from ..core.models import base_decorator
+
+mock_mq = base_decorator(mq_backends)
diff --git a/contrib/python/moto/py3/moto/mq/configuration.py b/contrib/python/moto/py3/moto/mq/configuration.py
new file mode 100644
index 0000000000..6797ed2eef
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/configuration.py
@@ -0,0 +1,183 @@
+DEFAULT_CONFIGURATION_DATA = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="10000">
+ <!--
+ A configuration contains all of the settings for your ActiveMQ broker, in XML format (similar to ActiveMQ's activemq.xml file).
+ You can create a configuration before creating any brokers. You can then apply the configuration to one or more brokers.
+
+ You can use additional attributes for the broker element above. These attributes allow you to configure broker-wide settings.
+
+ For more information, see Configuration and Amazon MQ Broker Configuration Parameters in the Amazon MQ Developer Guide:
+ https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-broker-configuration-parameters.html
+ -->
+ <!--
+ Mirrored queues let you send a copy of each message to a topic with a similar name automatically.
+ For more information, see http://activemq.apache.org/mirrored-queues.html
+
+ Virtual destinations let you configure advanced routing of messages between destinations.
+ For more information, see http://activemq.apache.org/virtual-destinations.html
+ -->
+ <!--
+ <destinationInterceptors>
+ <mirroredQueue copyMessage="true" postfix=".qmirror" prefix=""/>
+ <virtualDestinationInterceptor>
+ <virtualDestinations>
+ <virtualTopic name="&gt;" prefix="VirtualTopicConsumers.*." selectorAware="false"/>
+ <compositeQueue name="MY.QUEUE">
+ <forwardTo>
+ <queue physicalName="FOO"/>
+ <topic physicalName="BAR"/>
+ </forwardTo>
+ </compositeQueue>
+ </virtualDestinations>
+ </virtualDestinationInterceptor>
+ </destinationInterceptors>
+ -->
+ <!--
+ By default, Amazon MQ optimizes for queues with fast consumers:
+ Consumers are considered fast if they are able to keep up with the rate of messages generated by producers.
+ Consumers are considered slow if a queue builds up a backlog of unacknowledged messages, potentially causing a decrease in producer throughput.
+ To instruct Amazon MQ to optimize for queues with slow consumers, set the concurrentStoreAndDispatchQueues attribute to false.
+ For more information, see https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/ensuring-effective-amazon-mq-performance.html
+ -->
+ <!--
+ <persistenceAdapter>
+ <kahaDB concurrentStoreAndDispatchQueues="false"/>
+ </persistenceAdapter>
+ -->
+ <destinationPolicy>
+ <policyMap>
+ <policyEntries>
+ <!--
+ gcInactiveDestinations is used to automatically purge inactive destinations
+ preventing them from unnecessarily using broker resources.
+
+ An 'inactive' destination is one that has no messages pending and no consumers connected.
+
+ For more information, see: http://activemq.apache.org/delete-inactive-destinations.html
+ -->
+ <policyEntry topic="&gt;" gcInactiveDestinations="true" inactiveTimoutBeforeGC="600000">
+ <!--
+ The constantPendingMessageLimitStrategy is used to prevent
+ slow topic consumers to block producers and affect other consumers
+ by limiting the number of messages that are retained
+
+ For more information, see: http://activemq.apache.org/slow-consumer-handling.html
+ -->
+ <pendingMessageLimitStrategy>
+ <constantPendingMessageLimitStrategy limit="1000"/>
+ </pendingMessageLimitStrategy>
+ </policyEntry>
+ <policyEntry queue="&gt;" gcInactiveDestinations="true" inactiveTimoutBeforeGC="600000" />
+ <!--
+ Destination policies let you configure a rich set of behaviors for your queues and topics.
+ For more information, see http://activemq.apache.org/per-destination-policies.html
+ -->
+ <!--
+ <policyEntry topic="FOO.&gt;">
+ <dispatchPolicy>
+ <roundRobinDispatchPolicy/>
+ </dispatchPolicy>
+ <subscriptionRecoveryPolicy>
+ <lastImageSubscriptionRecoveryPolicy/>
+ </subscriptionRecoveryPolicy>
+ </policyEntry>
+ <policyEntry advisoryForConsumed="true" tempTopic="true"/>
+ <policyEntry advisoryForConsumed="true" tempQueue="true"/>
+ -->
+ </policyEntries>
+ </policyMap>
+ </destinationPolicy>
+ <!--
+ Typically, destinations are created automatically when they are used. Amazon MQ lets you create destinations when the broker is started.
+ For more information, see http://activemq.apache.org/configure-startup-destinations.html
+ -->
+ <!--
+ <destinations>
+ <queue physicalName="FOO.BAR"/>
+ <topic physicalName="SOME.TOPIC"/>
+ </destinations>
+ -->
+ <!--
+ You can control advanced ActiveMQ features using plugins.
+ -->
+ <plugins>
+ <!--
+ The Authorization plugin allows you to control the groups of users that are allowed to perform certain operations on your destinations.
+ For more information, see http://activemq.apache.org/security.html
+ -->
+ <!--
+ <authorizationPlugin>
+ <map>
+ <authorizationMap>
+ <authorizationEntries>
+ <authorizationEntry admin="guests,users" queue="GUEST.&gt;" read="guests" write="guests,users"/>
+ <authorizationEntry admin="guests,users" read="guests,users" topic="ActiveMQ.Advisory.&gt;" write="guests,users"/>
+ </authorizationEntries>
+ <tempDestinationAuthorizationEntry>
+ <tempDestinationAuthorizationEntry admin="tempDestinationAdmins" read="tempDestinationAdmins" write="tempDestinationAdmins"/>
+ </tempDestinationAuthorizationEntry>
+ </authorizationMap>
+ </map>
+ </authorizationPlugin>
+ -->
+ <!--
+ The Discarding DLQ plugin simplifies the configuration of your global dead-letter queue strategy.
+ You can take advantage of a more granular per-destination control by using destination policies.
+ For more information, see http://activemq.apache.org/message-redelivery-and-dlq-handling.html
+ -->
+ <!--
+ <discardingDLQBrokerPlugin dropAll="true" dropTemporaryQueues="true" dropTemporaryTopics="true"/>
+ -->
+ <!--
+ The Force Persistency Mode plugin can override the persistency mode set on messages.
+ -->
+ <!--
+ <forcePersistencyModeBrokerPlugin persistenceFlag="true"/>
+ -->
+ <!--
+ The Redelivery plugin extends the capabilities of destination policies with respect to message redelivery.
+ For more information, see http://activemq.apache.org/message-redelivery-and-dlq-handling.html
+ -->
+ <!--
+ <redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
+ <redeliveryPolicyMap>
+ <redeliveryPolicyMap>
+ <redeliveryPolicyEntries>
+ <redeliveryPolicy maximumRedeliveries="4" queue="SpecialQueue" redeliveryDelay="10000"/>
+ </redeliveryPolicyEntries>
+ <defaultEntry>
+ <redeliveryPolicy initialRedeliveryDelay="5000" maximumRedeliveries="4" redeliveryDelay="10000"/>
+ </defaultEntry>
+ </redeliveryPolicyMap>
+ </redeliveryPolicyMap>
+ </redeliveryPlugin>
+ -->
+ <!--
+ The Statistics plugin lets you query broker or destination statistics by sending messages to the broker.
+ For more information, see http://activemq.apache.org/statisticsplugin.html
+ -->
+ <!--
+ <statisticsBrokerPlugin/>
+ -->
+ <!--
+ The Timestamping plugin lets the broker use server-side time instead of client-provided time for messages.
+ For more information, see http://activemq.apache.org/timestampplugin.html
+ -->
+ <!--
+ <timeStampingBrokerPlugin ttlCeiling="86400000" zeroExpirationOverride="86400000"/>
+ -->
+ </plugins>
+ <!--
+ Network connectors let you connect brokers into networks of brokers.
+ For more information, see Creating and Configuring an Amazon MQ Network of Brokers
+ (https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-creating-configuring-network-of-brokers.html)
+ in the Amazon MQ Developer Guide and also Networks of Brokers
+ (http://activemq.apache.org/networks-of-brokers.html) in the ActiveMQ documentation.
+ -->
+ <!--
+ <networkConnectors>
+ <networkConnector name="myNetworkConnector" userName="commonUser" uri="masterslave:(ssl://b-1a2b3c4d-1.mq.region.amazonaws.com:61617,ssl://b-1a2b3c4d-2.mq.region.amazonaws.com:61617)"/>
+ </networkConnectors>
+ -->
+</broker>
+"""
diff --git a/contrib/python/moto/py3/moto/mq/exceptions.py b/contrib/python/moto/py3/moto/mq/exceptions.py
new file mode 100644
index 0000000000..0276178cde
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/exceptions.py
@@ -0,0 +1,71 @@
+import json
+from moto.core.exceptions import JsonRESTError
+
+
+class MQError(JsonRESTError):
+ pass
+
+
+class UnknownBroker(MQError):
+ def __init__(self, broker_id):
+ super().__init__("NotFoundException", "Can't find requested broker")
+ self.broker_id = broker_id
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ body = {
+ "errorAttribute": "broker-id",
+ "message": f"Can't find requested broker [{self.broker_id}]. Make sure your broker exists.",
+ }
+ return json.dumps(body)
+
+
+class UnknownConfiguration(MQError):
+ def __init__(self, config_id):
+ super().__init__("NotFoundException", "Can't find requested configuration")
+ self.config_id = config_id
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ body = {
+ "errorAttribute": "configuration_id",
+ "message": f"Can't find requested configuration [{self.config_id}]. Make sure your configuration exists.",
+ }
+ return json.dumps(body)
+
+
+class UnknownUser(MQError):
+ def __init__(self, username):
+ super().__init__("NotFoundException", "Can't find requested user")
+ self.username = username
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ body = {
+ "errorAttribute": "username",
+ "message": f"Can't find requested user [{self.username}]. Make sure your user exists.",
+ }
+ return json.dumps(body)
+
+
+class UnsupportedEngineType(MQError):
+ def __init__(self, engine_type):
+ super().__init__("BadRequestException", "")
+ self.engine_type = engine_type
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ body = {
+ "errorAttribute": "engineType",
+ "message": f"Broker engine type [{self.engine_type}] does not support configuration.",
+ }
+ return json.dumps(body)
+
+
+class UnknownEngineType(MQError):
+ def __init__(self, engine_type):
+ super().__init__("BadRequestException", "")
+ self.engine_type = engine_type
+
+ def get_body(self, *args, **kwargs): # pylint: disable=unused-argument
+ body = {
+ "errorAttribute": "engineType",
+ "message": f"Broker engine type [{self.engine_type}] is invalid. Valid values are: [ACTIVEMQ]",
+ }
+ return json.dumps(body)
diff --git a/contrib/python/moto/py3/moto/mq/models.py b/contrib/python/moto/py3/moto/mq/models.py
new file mode 100644
index 0000000000..0ffcc27354
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/models.py
@@ -0,0 +1,521 @@
+import base64
+import xmltodict
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, get_random_hex, unix_time
+from moto.utilities.tagging_service import TaggingService
+
+from .configuration import DEFAULT_CONFIGURATION_DATA
+from .exceptions import (
+ UnknownBroker,
+ UnknownConfiguration,
+ UnknownUser,
+ UnsupportedEngineType,
+ UnknownEngineType,
+)
+
+
+class ConfigurationRevision(BaseModel):
+ def __init__(self, configuration_id, revision_id, description, data=None):
+ self.configuration_id = configuration_id
+ self.created = unix_time()
+ self.description = description
+ self.is_invalid = False
+ self.revision_id = revision_id
+
+ if data is None:
+ self.data = base64.b64encode(
+ DEFAULT_CONFIGURATION_DATA.encode("UTF-8")
+ ).decode("utf-8")
+ else:
+ self.data = data
+
+ def has_ldap_auth(self):
+ try:
+ xml = base64.b64decode(self.data)
+ dct = xmltodict.parse(xml, dict_constructor=dict)
+ return (
+ "cachedLDAPAuthorizationMap"
+ in dct["broker"]["plugins"]["authorizationPlugin"]["map"]
+ )
+ except Exception:
+ # There are many configurations to enable LDAP
+ # We're only checking for one here
+ # If anything fails, lets assume it's not LDAP
+ return False
+
+ def to_json(self, full=True):
+ resp = {
+ "created": self.created,
+ "description": self.description,
+ "revision": int(self.revision_id),
+ }
+ if full:
+ resp["configurationId"] = self.configuration_id
+ resp["data"] = self.data
+ return resp
+
+
+class Configuration(BaseModel):
+ def __init__(self, region, name, engine_type, engine_version):
+ self.id = f"c-{get_random_hex(6)}"
+ self.arn = f"arn:aws:mq:{region}:{get_account_id()}:configuration:{self.id}"
+ self.created = unix_time()
+
+ self.name = name
+ self.engine_type = engine_type
+ self.engine_version = engine_version
+
+ self.revisions = dict()
+ default_desc = (
+ f"Auto-generated default for {self.name} on {engine_type} {engine_version}"
+ )
+ latest_revision = ConfigurationRevision(
+ configuration_id=self.id, revision_id="1", description=default_desc
+ )
+ self.revisions[latest_revision.revision_id] = latest_revision
+
+ self.authentication_strategy = (
+ "ldap" if latest_revision.has_ldap_auth() else "simple"
+ )
+
+ def update(self, data, description):
+ max_revision_id, _ = sorted(self.revisions.items())[-1]
+ next_revision_id = str(int(max_revision_id) + 1)
+ latest_revision = ConfigurationRevision(
+ configuration_id=self.id,
+ revision_id=next_revision_id,
+ description=description,
+ data=data,
+ )
+ self.revisions[next_revision_id] = latest_revision
+
+ self.authentication_strategy = (
+ "ldap" if latest_revision.has_ldap_auth() else "simple"
+ )
+
+ def get_revision(self, revision_id):
+ return self.revisions[revision_id]
+
+ def to_json(self):
+ _, latest_revision = sorted(self.revisions.items())[-1]
+ return {
+ "arn": self.arn,
+ "authenticationStrategy": self.authentication_strategy,
+ "created": self.created,
+ "engineType": self.engine_type,
+ "engineVersion": self.engine_version,
+ "id": self.id,
+ "name": self.name,
+ "latestRevision": latest_revision.to_json(full=False),
+ }
+
+
+class User(BaseModel):
+ def __init__(self, broker_id, username, console_access=None, groups=None):
+ self.broker_id = broker_id
+ self.username = username
+ self.console_access = console_access or False
+ self.groups = groups or []
+
+ def update(self, console_access, groups):
+ if console_access is not None:
+ self.console_access = console_access
+ if groups:
+ self.groups = groups
+
+ def summary(self):
+ return {"username": self.username}
+
+ def to_json(self):
+ return {
+ "brokerId": self.broker_id,
+ "username": self.username,
+ "consoleAccess": self.console_access,
+ "groups": self.groups,
+ }
+
+
+class Broker(BaseModel):
+ def __init__(
+ self,
+ name,
+ region,
+ authentication_strategy,
+ auto_minor_version_upgrade,
+ configuration,
+ deployment_mode,
+ encryption_options,
+ engine_type,
+ engine_version,
+ host_instance_type,
+ ldap_server_metadata,
+ logs,
+ maintenance_window_start_time,
+ publicly_accessible,
+ security_groups,
+ storage_type,
+ subnet_ids,
+ users,
+ ):
+ self.name = name
+ self.id = get_random_hex(6)
+ self.arn = f"arn:aws:mq:{region}:{get_account_id()}:broker:{self.id}"
+ self.state = "RUNNING"
+ self.created = unix_time()
+
+ self.authentication_strategy = authentication_strategy
+ self.auto_minor_version_upgrade = auto_minor_version_upgrade
+ self.deployment_mode = deployment_mode
+ self.encryption_options = encryption_options
+ if not self.encryption_options:
+ self.encryption_options = {"useAwsOwnedKey": True}
+ self.engine_type = engine_type
+ self.engine_version = engine_version
+ self.host_instance_type = host_instance_type
+ self.ldap_server_metadata = ldap_server_metadata
+ self.logs = logs
+ if "general" not in self.logs:
+ self.logs["general"] = False
+ if "audit" not in self.logs:
+ if self.engine_type.upper() == "ACTIVEMQ":
+ self.logs["audit"] = False
+ self.maintenance_window_start_time = maintenance_window_start_time
+ if not self.maintenance_window_start_time:
+ self.maintenance_window_start_time = {
+ "dayOfWeek": "Sunday",
+ "timeOfDay": "00:00",
+ "timeZone": "UTC",
+ }
+ self.publicly_accessible = publicly_accessible
+ self.security_groups = security_groups
+ self.storage_type = storage_type
+ self.subnet_ids = subnet_ids
+ if not self.subnet_ids:
+ if self.deployment_mode == "CLUSTER_MULTI_AZ":
+ self.subnet_ids = [
+ "default-az1",
+ "default-az2",
+ "default-az3",
+ "default-az4",
+ ]
+ elif self.deployment_mode == "ACTIVE_STANDBY_MULTI_AZ":
+ self.subnet_ids = ["active-subnet", "standby-subnet"]
+ else:
+ self.subnet_ids = ["default-subnet"]
+
+ self.users = dict()
+ for user in users:
+ self.create_user(
+ username=user["username"],
+ groups=user.get("groups", []),
+ console_access=user.get("consoleAccess", False),
+ )
+
+ if self.engine_type.upper() == "RABBITMQ":
+ self.configurations = None
+ else:
+ current_config = configuration or {
+ "id": f"c-{get_random_hex(6)}",
+ "revision": 1,
+ }
+ self.configurations = {
+ "current": current_config,
+ "history": [],
+ }
+ if self.engine_type.upper() == "RABBITMQ":
+ console_url = f"https://0000.mq.{region}.amazonaws.com"
+ endpoints = ["amqps://mockmq:5671"]
+ else:
+ console_url = f"https://0000.mq.{region}.amazonaws.com:8162"
+ endpoints = [
+ "ssl://mockmq:61617",
+ "amqp+ssl://mockmq:5671",
+ "stomp+ssl://mockmq:61614",
+ "mqtt+ssl://mockmq:8883",
+ "wss://mockmq:61619",
+ ]
+ self.instances = [
+ {
+ "consoleURL": console_url,
+ "endpoints": endpoints,
+ "ipAddress": "192.168.0.1",
+ }
+ ]
+
+ if deployment_mode == "ACTIVE_STANDBY_MULTI_AZ":
+ self.instances.append(
+ {
+ "consoleURL": console_url,
+ "endpoints": endpoints,
+ "ipAddress": "192.168.0.2",
+ }
+ )
+
+ def update(
+ self,
+ authentication_strategy,
+ auto_minor_version_upgrade,
+ configuration,
+ engine_version,
+ host_instance_type,
+ ldap_server_metadata,
+ logs,
+ maintenance_window_start_time,
+ security_groups,
+ ):
+ if authentication_strategy:
+ self.authentication_strategy = authentication_strategy
+ if auto_minor_version_upgrade is not None:
+ self.auto_minor_version_upgrade = auto_minor_version_upgrade
+ if configuration:
+ self.configurations["history"].append(self.configurations["current"])
+ self.configurations["current"] = configuration
+ if engine_version:
+ self.engine_version = engine_version
+ if host_instance_type:
+ self.host_instance_type = host_instance_type
+ if ldap_server_metadata:
+ self.ldap_server_metadata = ldap_server_metadata
+ if logs:
+ self.logs = logs
+ if maintenance_window_start_time:
+ self.maintenance_window_start_time = maintenance_window_start_time
+ if security_groups:
+ self.security_groups = security_groups
+
+ def reboot(self):
+ pass
+
+ def create_user(self, username, console_access, groups):
+ user = User(self.id, username, console_access, groups)
+ self.users[username] = user
+
+ def update_user(self, username, console_access, groups):
+ user = self.get_user(username)
+ user.update(console_access, groups)
+
+ def get_user(self, username):
+ if username not in self.users:
+ raise UnknownUser(username)
+ return self.users[username]
+
+ def delete_user(self, username):
+ self.users.pop(username, None)
+
+ def list_users(self):
+ return self.users.values()
+
+ def summary(self):
+ return {
+ "brokerArn": self.arn,
+ "brokerId": self.id,
+ "brokerName": self.name,
+ "brokerState": self.state,
+ "created": self.created,
+ "deploymentMode": self.deployment_mode,
+ "engineType": self.engine_type,
+ "hostInstanceType": self.host_instance_type,
+ }
+
+ def to_json(self):
+ return {
+ "brokerId": self.id,
+ "brokerArn": self.arn,
+ "brokerName": self.name,
+ "brokerState": self.state,
+ "brokerInstances": self.instances,
+ "created": self.created,
+ "configurations": self.configurations,
+ "authenticationStrategy": self.authentication_strategy,
+ "autoMinorVersionUpgrade": self.auto_minor_version_upgrade,
+ "deploymentMode": self.deployment_mode,
+ "encryptionOptions": self.encryption_options,
+ "engineType": self.engine_type,
+ "engineVersion": self.engine_version,
+ "hostInstanceType": self.host_instance_type,
+ "ldapServerMetadata": self.ldap_server_metadata,
+ "logs": self.logs,
+ "maintenanceWindowStartTime": self.maintenance_window_start_time,
+ "publiclyAccessible": self.publicly_accessible,
+ "securityGroups": self.security_groups,
+ "storageType": self.storage_type,
+ "subnetIds": self.subnet_ids,
+ "users": [u.summary() for u in self.users.values()],
+ }
+
+
+class MQBackend(BaseBackend):
+ """
+ No EC2 integration exists yet - subnet ID's and security group values are not validated. Default values may not exist.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.brokers = dict()
+ self.configs = dict()
+ self.tagger = TaggingService()
+
+ def create_broker(
+ self,
+ authentication_strategy,
+ auto_minor_version_upgrade,
+ broker_name,
+ configuration,
+ deployment_mode,
+ encryption_options,
+ engine_type,
+ engine_version,
+ host_instance_type,
+ ldap_server_metadata,
+ logs,
+ maintenance_window_start_time,
+ publicly_accessible,
+ security_groups,
+ storage_type,
+ subnet_ids,
+ tags,
+ users,
+ ):
+ broker = Broker(
+ name=broker_name,
+ region=self.region_name,
+ authentication_strategy=authentication_strategy,
+ auto_minor_version_upgrade=auto_minor_version_upgrade,
+ configuration=configuration,
+ deployment_mode=deployment_mode,
+ encryption_options=encryption_options,
+ engine_type=engine_type,
+ engine_version=engine_version,
+ host_instance_type=host_instance_type,
+ ldap_server_metadata=ldap_server_metadata,
+ logs=logs,
+ maintenance_window_start_time=maintenance_window_start_time,
+ publicly_accessible=publicly_accessible,
+ security_groups=security_groups,
+ storage_type=storage_type,
+ subnet_ids=subnet_ids,
+ users=users,
+ )
+ self.brokers[broker.id] = broker
+ self.create_tags(broker.arn, tags)
+ return broker.arn, broker.id
+
+ def delete_broker(self, broker_id):
+ del self.brokers[broker_id]
+
+ def describe_broker(self, broker_id):
+ if broker_id not in self.brokers:
+ raise UnknownBroker(broker_id)
+ return self.brokers[broker_id]
+
+ def reboot_broker(self, broker_id):
+ self.brokers[broker_id].reboot()
+
+ def list_brokers(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.brokers.values()
+
+ def create_user(self, broker_id, username, console_access, groups):
+ broker = self.describe_broker(broker_id)
+ broker.create_user(username, console_access, groups)
+
+ def update_user(self, broker_id, console_access, groups, username):
+ broker = self.describe_broker(broker_id)
+ broker.update_user(username, console_access, groups)
+
+ def describe_user(self, broker_id, username):
+ broker = self.describe_broker(broker_id)
+ return broker.get_user(username)
+
+ def delete_user(self, broker_id, username):
+ broker = self.describe_broker(broker_id)
+ broker.delete_user(username)
+
+ def list_users(self, broker_id):
+ broker = self.describe_broker(broker_id)
+ return broker.list_users()
+
+ def create_configuration(self, name, engine_type, engine_version, tags):
+ if engine_type.upper() == "RABBITMQ":
+ raise UnsupportedEngineType(engine_type)
+ if engine_type.upper() != "ACTIVEMQ":
+ raise UnknownEngineType(engine_type)
+ config = Configuration(
+ region=self.region_name,
+ name=name,
+ engine_type=engine_type,
+ engine_version=engine_version,
+ )
+ self.configs[config.id] = config
+ self.tagger.tag_resource(
+ config.arn, self.tagger.convert_dict_to_tags_input(tags)
+ )
+ return config
+
+ def update_configuration(self, config_id, data, description):
+ """
+ No validation occurs on the provided XML. The authenticationStrategy may be changed depending on the provided configuration.
+ """
+ config = self.configs[config_id]
+ config.update(data, description)
+ return config
+
+ def describe_configuration(self, config_id):
+ if config_id not in self.configs:
+ raise UnknownConfiguration(config_id)
+ return self.configs[config_id]
+
+ def describe_configuration_revision(self, config_id, revision_id):
+ config = self.configs[config_id]
+ return config.get_revision(revision_id)
+
+ def list_configurations(self):
+ """
+ Pagination has not yet been implemented.
+ """
+ return self.configs.values()
+
+ def create_tags(self, resource_arn, tags):
+ self.tagger.tag_resource(
+ resource_arn, self.tagger.convert_dict_to_tags_input(tags)
+ )
+
+ def list_tags(self, arn):
+ return self.tagger.get_tag_dict_for_resource(arn)
+
+ def delete_tags(self, resource_arn, tag_keys):
+ if not isinstance(tag_keys, list):
+ tag_keys = [tag_keys]
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+ def update_broker(
+ self,
+ authentication_strategy,
+ auto_minor_version_upgrade,
+ broker_id,
+ configuration,
+ engine_version,
+ host_instance_type,
+ ldap_server_metadata,
+ logs,
+ maintenance_window_start_time,
+ security_groups,
+ ):
+ broker = self.describe_broker(broker_id)
+ broker.update(
+ authentication_strategy=authentication_strategy,
+ auto_minor_version_upgrade=auto_minor_version_upgrade,
+ configuration=configuration,
+ engine_version=engine_version,
+ host_instance_type=host_instance_type,
+ ldap_server_metadata=ldap_server_metadata,
+ logs=logs,
+ maintenance_window_start_time=maintenance_window_start_time,
+ security_groups=security_groups,
+ )
+
+
+mq_backends = BackendDict(MQBackend, "mq")
diff --git a/contrib/python/moto/py3/moto/mq/responses.py b/contrib/python/moto/py3/moto/mq/responses.py
new file mode 100644
index 0000000000..4cb18d60b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/responses.py
@@ -0,0 +1,262 @@
+"""Handles incoming mq requests, invokes methods, returns responses."""
+import json
+from urllib.parse import unquote
+
+from moto.core.responses import BaseResponse
+from .models import mq_backends
+
+
+class MQResponse(BaseResponse):
+ """Handler for MQ requests and responses."""
+
+ @property
+ def mq_backend(self):
+ """Return backend instance specific for this region."""
+ return mq_backends[self.region]
+
+ def broker(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.describe_broker()
+ if request.method == "DELETE":
+ return self.delete_broker()
+ if request.method == "PUT":
+ return self.update_broker()
+
+ def brokers(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_broker()
+ if request.method == "GET":
+ return self.list_brokers()
+
+ def configuration(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.describe_configuration()
+ if request.method == "PUT":
+ return self.update_configuration()
+
+ def configurations(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_configuration()
+ if request.method == "GET":
+ return self.list_configurations()
+
+ def configuration_revision(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_configuration_revision()
+
+ def tags(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_tags()
+ if request.method == "DELETE":
+ return self.delete_tags()
+
+ def user(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_user()
+ if request.method == "GET":
+ return self.describe_user()
+ if request.method == "PUT":
+ return self.update_user()
+ if request.method == "DELETE":
+ return self.delete_user()
+
+ def users(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.list_users()
+
+ def create_broker(self):
+ params = json.loads(self.body)
+ authentication_strategy = params.get("authenticationStrategy")
+ auto_minor_version_upgrade = params.get("autoMinorVersionUpgrade")
+ broker_name = params.get("brokerName")
+ configuration = params.get("configuration")
+ deployment_mode = params.get("deploymentMode")
+ encryption_options = params.get("encryptionOptions")
+ engine_type = params.get("engineType")
+ engine_version = params.get("engineVersion")
+ host_instance_type = params.get("hostInstanceType")
+ ldap_server_metadata = params.get("ldapServerMetadata")
+ logs = params.get("logs", {})
+ maintenance_window_start_time = params.get("maintenanceWindowStartTime")
+ publicly_accessible = params.get("publiclyAccessible")
+ security_groups = params.get("securityGroups")
+ storage_type = params.get("storageType")
+ subnet_ids = params.get("subnetIds", [])
+ tags = params.get("tags")
+ users = params.get("users", [])
+ broker_arn, broker_id = self.mq_backend.create_broker(
+ authentication_strategy=authentication_strategy,
+ auto_minor_version_upgrade=auto_minor_version_upgrade,
+ broker_name=broker_name,
+ configuration=configuration,
+ deployment_mode=deployment_mode,
+ encryption_options=encryption_options,
+ engine_type=engine_type,
+ engine_version=engine_version,
+ host_instance_type=host_instance_type,
+ ldap_server_metadata=ldap_server_metadata,
+ logs=logs,
+ maintenance_window_start_time=maintenance_window_start_time,
+ publicly_accessible=publicly_accessible,
+ security_groups=security_groups,
+ storage_type=storage_type,
+ subnet_ids=subnet_ids,
+ tags=tags,
+ users=users,
+ )
+ # Lowercase members - boto3 will convert it into UpperCase
+ resp = {"brokerArn": broker_arn, "brokerId": broker_id}
+ return 200, {}, json.dumps(resp)
+
+ def update_broker(self):
+ params = json.loads(self.body)
+ broker_id = self.path.split("/")[-1]
+ authentication_strategy = params.get("authenticationStrategy")
+ auto_minor_version_upgrade = params.get("autoMinorVersionUpgrade")
+ configuration = params.get("configuration")
+ engine_version = params.get("engineVersion")
+ host_instance_type = params.get("hostInstanceType")
+ ldap_server_metadata = params.get("ldapServerMetadata")
+ logs = params.get("logs")
+ maintenance_window_start_time = params.get("maintenanceWindowStartTime")
+ security_groups = params.get("securityGroups")
+ self.mq_backend.update_broker(
+ authentication_strategy=authentication_strategy,
+ auto_minor_version_upgrade=auto_minor_version_upgrade,
+ broker_id=broker_id,
+ configuration=configuration,
+ engine_version=engine_version,
+ host_instance_type=host_instance_type,
+ ldap_server_metadata=ldap_server_metadata,
+ logs=logs,
+ maintenance_window_start_time=maintenance_window_start_time,
+ security_groups=security_groups,
+ )
+ return self.describe_broker()
+
+ def delete_broker(self):
+ broker_id = self.path.split("/")[-1]
+ self.mq_backend.delete_broker(broker_id=broker_id)
+ return 200, {}, json.dumps(dict(brokerId=broker_id))
+
+ def describe_broker(self):
+ broker_id = self.path.split("/")[-1]
+ broker = self.mq_backend.describe_broker(broker_id=broker_id)
+ resp = broker.to_json()
+ resp["tags"] = self.mq_backend.list_tags(broker.arn)
+ return 200, {}, json.dumps(resp)
+
+ def list_brokers(self):
+ brokers = self.mq_backend.list_brokers()
+ return 200, {}, json.dumps(dict(brokerSummaries=[b.summary() for b in brokers]))
+
+ def create_user(self):
+ params = json.loads(self.body)
+ broker_id = self.path.split("/")[-3]
+ username = self.path.split("/")[-1]
+ console_access = params.get("consoleAccess", False)
+ groups = params.get("groups", [])
+ self.mq_backend.create_user(broker_id, username, console_access, groups)
+ return 200, {}, "{}"
+
+ def update_user(self):
+ params = json.loads(self.body)
+ broker_id = self.path.split("/")[-3]
+ username = self.path.split("/")[-1]
+ console_access = params.get("consoleAccess", False)
+ groups = params.get("groups", [])
+ self.mq_backend.update_user(
+ broker_id=broker_id,
+ console_access=console_access,
+ groups=groups,
+ username=username,
+ )
+ return 200, {}, "{}"
+
+ def describe_user(self):
+ broker_id = self.path.split("/")[-3]
+ username = self.path.split("/")[-1]
+ user = self.mq_backend.describe_user(broker_id, username)
+ return 200, {}, json.dumps(user.to_json())
+
+ def delete_user(self):
+ broker_id = self.path.split("/")[-3]
+ username = self.path.split("/")[-1]
+ self.mq_backend.delete_user(broker_id, username)
+ return 200, {}, "{}"
+
+ def list_users(self):
+ broker_id = self.path.split("/")[-2]
+ users = self.mq_backend.list_users(broker_id=broker_id)
+ resp = {
+ "brokerId": broker_id,
+ "users": [{"username": u.username} for u in users],
+ }
+ return 200, {}, json.dumps(resp)
+
+ def create_configuration(self):
+ params = json.loads(self.body)
+ name = params.get("name")
+ engine_type = params.get("engineType")
+ engine_version = params.get("engineVersion")
+ tags = params.get("tags", {})
+
+ config = self.mq_backend.create_configuration(
+ name, engine_type, engine_version, tags
+ )
+ return 200, {}, json.dumps(config.to_json())
+
+ def describe_configuration(self):
+ config_id = self.path.split("/")[-1]
+ config = self.mq_backend.describe_configuration(config_id)
+ resp = config.to_json()
+ resp["tags"] = self.mq_backend.list_tags(config.arn)
+ return 200, {}, json.dumps(resp)
+
+ def list_configurations(self):
+ configs = self.mq_backend.list_configurations()
+ resp = {"configurations": [c.to_json() for c in configs]}
+ return 200, {}, json.dumps(resp)
+
+ def update_configuration(self):
+ config_id = self.path.split("/")[-1]
+ params = json.loads(self.body)
+ data = params.get("data")
+ description = params.get("description")
+ config = self.mq_backend.update_configuration(config_id, data, description)
+ return 200, {}, json.dumps(config.to_json())
+
+ def get_configuration_revision(self):
+ revision_id = self.path.split("/")[-1]
+ config_id = self.path.split("/")[-3]
+ revision = self.mq_backend.describe_configuration_revision(
+ config_id, revision_id
+ )
+ return 200, {}, json.dumps(revision.to_json())
+
+ def create_tags(self):
+ resource_arn = unquote(self.path.split("/")[-1])
+ tags = json.loads(self.body).get("tags", {})
+ self.mq_backend.create_tags(resource_arn, tags)
+ return 200, {}, "{}"
+
+ def delete_tags(self):
+ resource_arn = unquote(self.path.split("/")[-1])
+ tag_keys = self._get_param("tagKeys")
+ self.mq_backend.delete_tags(resource_arn, tag_keys)
+ return 200, {}, "{}"
+
+ def reboot(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ broker_id = self.path.split("/")[-2]
+ self.mq_backend.reboot_broker(broker_id=broker_id)
+ return 200, {}, "{}"
diff --git a/contrib/python/moto/py3/moto/mq/urls.py b/contrib/python/moto/py3/moto/mq/urls.py
new file mode 100644
index 0000000000..26cc6cd8de
--- /dev/null
+++ b/contrib/python/moto/py3/moto/mq/urls.py
@@ -0,0 +1,22 @@
+"""mq base URL and path."""
+from .responses import MQResponse
+
+url_bases = [
+ r"https?://mq\.(.+)\.amazonaws\.com",
+]
+
+
+response = MQResponse()
+
+
+url_paths = {
+ "{0}/v1/brokers/(?P<broker_id>[^/]+)$": response.broker,
+ "{0}/v1/brokers/(?P<broker_id>[^/]+)/reboot$": response.reboot,
+ "{0}/v1/brokers/(?P<broker_id>[^/]+)/users$": response.users,
+ "{0}/v1/brokers/(?P<broker_id>[^/]+)/users/(?P<user_name>[^/]+)$": response.user,
+ "{0}/v1/brokers$": response.brokers,
+ "{0}/v1/configurations$": response.configurations,
+ "{0}/v1/configurations/(?P<config_id>[^/]+)$": response.configuration,
+ "{0}/v1/configurations/(?P<config_id>[^/]+)/revisions/(?P<revision_id>[^/]+)$": response.configuration_revision,
+ "{0}/v1/tags/(?P<resource_arn>[^/]+)$": response.tags,
+}
diff --git a/contrib/python/moto/py3/moto/opsworks/__init__.py b/contrib/python/moto/py3/moto/opsworks/__init__.py
new file mode 100644
index 0000000000..ef945994d6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/opsworks/__init__.py
@@ -0,0 +1,5 @@
+from .models import opsworks_backends
+from ..core.models import base_decorator
+
+opsworks_backend = opsworks_backends["us-east-1"]
+mock_opsworks = base_decorator(opsworks_backends)
diff --git a/contrib/python/moto/py3/moto/opsworks/exceptions.py b/contrib/python/moto/py3/moto/opsworks/exceptions.py
new file mode 100644
index 0000000000..4de6cfe92d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/opsworks/exceptions.py
@@ -0,0 +1,18 @@
+import json
+from werkzeug.exceptions import BadRequest
+
+
+class ResourceNotFoundException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceNotFoundException"}
+ )
+
+
+class ValidationException(BadRequest):
+ def __init__(self, message):
+ super().__init__()
+ self.description = json.dumps(
+ {"message": message, "__type": "ResourceNotFoundException"}
+ )
diff --git a/contrib/python/moto/py3/moto/opsworks/models.py b/contrib/python/moto/py3/moto/opsworks/models.py
new file mode 100644
index 0000000000..5bbc9590bc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/opsworks/models.py
@@ -0,0 +1,672 @@
+from moto.core import BaseBackend, BaseModel
+from moto.ec2 import ec2_backends
+from moto.core import get_account_id
+from moto.core.utils import BackendDict
+import uuid
+import datetime
+from random import choice
+
+from .exceptions import ResourceNotFoundException, ValidationException
+
+
+class OpsworkInstance(BaseModel):
+ """
+ opsworks maintains its own set of ec2 instance metadata.
+ This metadata exists before any instance reservations are made, and is
+ used to populate a reservation request when "start" is called
+ """
+
+ def __init__(
+ self,
+ stack_id,
+ layer_ids,
+ instance_type,
+ ec2_backend,
+ auto_scale_type=None,
+ hostname=None,
+ os=None,
+ ami_id="ami-08111162",
+ ssh_keyname=None,
+ availability_zone=None,
+ virtualization_type="hvm",
+ subnet_id=None,
+ architecture="x86_64",
+ root_device_type="ebs",
+ block_device_mappings=None,
+ install_updates_on_boot=True,
+ ebs_optimized=False,
+ agent_version="INHERIT",
+ instance_profile_arn=None,
+ associate_public_ip=None,
+ security_group_ids=None,
+ ):
+
+ self.ec2_backend = ec2_backend
+
+ self.instance_profile_arn = instance_profile_arn
+ self.agent_version = agent_version
+ self.ebs_optimized = ebs_optimized
+ self.install_updates_on_boot = install_updates_on_boot
+ self.architecture = architecture
+ self.virtualization_type = virtualization_type
+ self.ami_id = ami_id
+ self.auto_scale_type = auto_scale_type
+ self.instance_type = instance_type
+ self.layer_ids = layer_ids
+ self.stack_id = stack_id
+
+ # may not be totally accurate defaults; instance-type dependent
+ self.root_device_type = root_device_type
+ # todo: refactor how we track block_device_mappings to use
+ # boto.ec2.blockdevicemapping.BlockDeviceType and standardize
+ # formatting in to_dict()
+ self.block_device_mappings = block_device_mappings
+ if self.block_device_mappings is None:
+ self.block_device_mappings = [
+ {
+ "DeviceName": "ROOT_DEVICE",
+ "Ebs": {"VolumeSize": 8, "VolumeType": "gp2"},
+ }
+ ]
+ self.security_group_ids = security_group_ids
+ if self.security_group_ids is None:
+ self.security_group_ids = []
+
+ self.os = os
+ self.hostname = hostname
+ self.ssh_keyname = ssh_keyname
+ self.availability_zone = availability_zone
+ self.subnet_id = subnet_id
+ self.associate_public_ip = associate_public_ip
+
+ self.instance = None
+ self.reported_os = {}
+ self.infrastructure_class = "ec2 (fixed)"
+ self.platform = "linux (fixed)"
+
+ self.id = "{0}".format(uuid.uuid4())
+ self.created_at = datetime.datetime.utcnow()
+
+ def start(self):
+ """
+ create an ec2 reservation if one doesn't already exist and call
+ start_instance. Update instance attributes to the newly created instance
+ attributes
+ """
+ if self.instance is None:
+ reservation = self.ec2_backend.add_instances(
+ image_id=self.ami_id,
+ count=1,
+ user_data="",
+ security_group_names=[],
+ security_group_ids=self.security_group_ids,
+ instance_type=self.instance_type,
+ is_instance_type_default=not self.instance_type,
+ key_name=self.ssh_keyname,
+ ebs_optimized=self.ebs_optimized,
+ subnet_id=self.subnet_id,
+ associate_public_ip=self.associate_public_ip,
+ )
+ self.instance = reservation.instances[0]
+ self.reported_os = {
+ "Family": "rhel (fixed)",
+ "Name": "amazon (fixed)",
+ "Version": "2016.03 (fixed)",
+ }
+ self.platform = self.instance.platform
+ self.security_group_ids = self.instance.security_groups
+ self.architecture = self.instance.architecture
+ self.virtualization_type = self.instance.virtualization_type
+ self.subnet_id = self.instance.subnet_id
+ self.root_device_type = self.instance.root_device_type
+
+ self.ec2_backend.start_instances([self.instance.id])
+
+ @property
+ def status(self):
+ if self.instance is None:
+ return "stopped"
+ # OpsWorks reports the "running" state as "online"
+ elif self.instance._state.name == "running":
+ return "online"
+ return self.instance._state.name
+
+ def to_dict(self):
+ d = {
+ "AgentVersion": self.agent_version,
+ "Architecture": self.architecture,
+ "AvailabilityZone": self.availability_zone,
+ "BlockDeviceMappings": self.block_device_mappings,
+ "CreatedAt": self.created_at.isoformat(),
+ "EbsOptimized": self.ebs_optimized,
+ "InstanceId": self.id,
+ "Hostname": self.hostname,
+ "InfrastructureClass": self.infrastructure_class,
+ "InstallUpdatesOnBoot": self.install_updates_on_boot,
+ "InstanceProfileArn": self.instance_profile_arn,
+ "InstanceType": self.instance_type,
+ "LayerIds": self.layer_ids,
+ "Os": self.os,
+ "Platform": self.platform,
+ "ReportedOs": self.reported_os,
+ "RootDeviceType": self.root_device_type,
+ "SecurityGroupIds": self.security_group_ids,
+ "AmiId": self.ami_id,
+ "Status": self.status,
+ }
+ if self.ssh_keyname is not None:
+ d.update({"SshKeyName": self.ssh_keyname})
+
+ if self.auto_scale_type is not None:
+ d.update({"AutoScaleType": self.auto_scale_type})
+
+ if self.instance is not None:
+ d.update({"Ec2InstanceId": self.instance.id})
+ d.update({"ReportedAgentVersion": "2425-20160406102508 (fixed)"})
+ d.update({"RootDeviceVolumeId": "vol-a20e450a (fixed)"})
+ if self.ssh_keyname is not None:
+ d.update(
+ {
+ "SshHostDsaKeyFingerprint": "24:36:32:fe:d8:5f:9c:18:b1:ad:37:e9:eb:e8:69:58 (fixed)"
+ }
+ )
+ d.update(
+ {
+ "SshHostRsaKeyFingerprint": "3c:bd:37:52:d7:ca:67:e1:6e:4b:ac:31:86:79:f5:6c (fixed)"
+ }
+ )
+ d.update({"PrivateDns": self.instance.private_dns})
+ d.update({"PrivateIp": self.instance.private_ip})
+ d.update({"PublicDns": getattr(self.instance, "public_dns", None)})
+ d.update({"PublicIp": getattr(self.instance, "public_ip", None)})
+ return d
+
+
+class Layer(BaseModel):
+ def __init__(
+ self,
+ stack_id,
+ layer_type,
+ name,
+ shortname,
+ attributes=None,
+ custom_instance_profile_arn=None,
+ custom_json=None,
+ custom_security_group_ids=None,
+ packages=None,
+ volume_configurations=None,
+ enable_autohealing=None,
+ auto_assign_elastic_ips=None,
+ auto_assign_public_ips=None,
+ custom_recipes=None,
+ install_updates_on_boot=None,
+ use_ebs_optimized_instances=None,
+ lifecycle_event_configuration=None,
+ ):
+ self.stack_id = stack_id
+ self.type = layer_type
+ self.name = name
+ self.shortname = shortname
+
+ self.attributes = attributes
+ if attributes is None:
+ self.attributes = {
+ "BundlerVersion": None,
+ "EcsClusterArn": None,
+ "EnableHaproxyStats": None,
+ "GangliaPassword": None,
+ "GangliaUrl": None,
+ "GangliaUser": None,
+ "HaproxyHealthCheckMethod": None,
+ "HaproxyHealthCheckUrl": None,
+ "HaproxyStatsPassword": None,
+ "HaproxyStatsUrl": None,
+ "HaproxyStatsUser": None,
+ "JavaAppServer": None,
+ "JavaAppServerVersion": None,
+ "Jvm": None,
+ "JvmOptions": None,
+ "JvmVersion": None,
+ "ManageBundler": None,
+ "MemcachedMemory": None,
+ "MysqlRootPassword": None,
+ "MysqlRootPasswordUbiquitous": None,
+ "NodejsVersion": None,
+ "PassengerVersion": None,
+ "RailsStack": None,
+ "RubyVersion": None,
+ "RubygemsVersion": None,
+ } # May not be accurate
+
+ self.packages = packages
+ if packages is None:
+ self.packages = packages
+
+ self.custom_recipes = custom_recipes
+ if custom_recipes is None:
+ self.custom_recipes = {
+ "Configure": [],
+ "Deploy": [],
+ "Setup": [],
+ "Shutdown": [],
+ "Undeploy": [],
+ }
+
+ self.custom_security_group_ids = custom_security_group_ids
+ if custom_security_group_ids is None:
+ self.custom_security_group_ids = []
+
+ self.lifecycle_event_configuration = lifecycle_event_configuration
+ if lifecycle_event_configuration is None:
+ self.lifecycle_event_configuration = {
+ "Shutdown": {"DelayUntilElbConnectionsDrained": False}
+ }
+
+ self.volume_configurations = volume_configurations
+ if volume_configurations is None:
+ self.volume_configurations = []
+
+ self.custom_instance_profile_arn = custom_instance_profile_arn
+ self.custom_json = custom_json
+ self.enable_autohealing = enable_autohealing
+ self.auto_assign_elastic_ips = auto_assign_elastic_ips
+ self.auto_assign_public_ips = auto_assign_public_ips
+ self.install_updates_on_boot = install_updates_on_boot
+ self.use_ebs_optimized_instances = use_ebs_optimized_instances
+
+ self.id = "{0}".format(uuid.uuid4())
+ self.created_at = datetime.datetime.utcnow()
+
+ def __eq__(self, other):
+ return self.id == other.id
+
+ def to_dict(self):
+ d = {
+ "Attributes": self.attributes,
+ "AutoAssignElasticIps": self.auto_assign_elastic_ips,
+ "AutoAssignPublicIps": self.auto_assign_public_ips,
+ "CreatedAt": self.created_at.isoformat(),
+ "CustomRecipes": self.custom_recipes,
+ "CustomSecurityGroupIds": self.custom_security_group_ids,
+ "DefaultRecipes": {
+ "Configure": [],
+ "Setup": [],
+ "Shutdown": [],
+ "Undeploy": [],
+ }, # May not be accurate
+ "DefaultSecurityGroupNames": ["AWS-OpsWorks-Custom-Server"],
+ "EnableAutoHealing": self.enable_autohealing,
+ "LayerId": self.id,
+ "LifecycleEventConfiguration": self.lifecycle_event_configuration,
+ "Name": self.name,
+ "Shortname": self.shortname,
+ "StackId": self.stack_id,
+ "Type": self.type,
+ "UseEbsOptimizedInstances": self.use_ebs_optimized_instances,
+ "VolumeConfigurations": self.volume_configurations,
+ }
+ if self.custom_json is not None:
+ d.update({"CustomJson": self.custom_json})
+ if self.custom_instance_profile_arn is not None:
+ d.update({"CustomInstanceProfileArn": self.custom_instance_profile_arn})
+ return d
+
+
+class Stack(BaseModel):
+ def __init__(
+ self,
+ name,
+ region,
+ service_role_arn,
+ default_instance_profile_arn,
+ vpcid="vpc-1f99bf7a",
+ attributes=None,
+ default_os="Ubuntu 12.04 LTS",
+ hostname_theme="Layer_Dependent",
+ default_availability_zone="us-east-1a",
+ default_subnet_id="subnet-73981004",
+ custom_json=None,
+ configuration_manager=None,
+ chef_configuration=None,
+ use_custom_cookbooks=False,
+ use_opsworks_security_groups=True,
+ custom_cookbooks_source=None,
+ default_ssh_keyname=None,
+ default_root_device_type="instance-store",
+ agent_version="LATEST",
+ ):
+
+ self.name = name
+ self.region = region
+ self.service_role_arn = service_role_arn
+ self.default_instance_profile_arn = default_instance_profile_arn
+
+ self.vpcid = vpcid
+ self.attributes = attributes
+ if attributes is None:
+ self.attributes = {"Color": None}
+
+ self.configuration_manager = configuration_manager
+ if configuration_manager is None:
+ self.configuration_manager = {"Name": "Chef", "Version": "11.4"}
+
+ self.chef_configuration = chef_configuration
+ if chef_configuration is None:
+ self.chef_configuration = {}
+
+ self.custom_cookbooks_source = custom_cookbooks_source
+ if custom_cookbooks_source is None:
+ self.custom_cookbooks_source = {}
+
+ self.custom_json = custom_json
+ self.default_ssh_keyname = default_ssh_keyname
+ self.default_os = default_os
+ self.hostname_theme = hostname_theme
+ self.default_availability_zone = default_availability_zone
+ self.default_subnet_id = default_subnet_id
+ self.use_custom_cookbooks = use_custom_cookbooks
+ self.use_opsworks_security_groups = use_opsworks_security_groups
+ self.default_root_device_type = default_root_device_type
+ self.agent_version = agent_version
+
+ self.id = "{0}".format(uuid.uuid4())
+ self.layers = []
+ self.apps = []
+ self.account_number = get_account_id()
+ self.created_at = datetime.datetime.utcnow()
+
+ def __eq__(self, other):
+ return self.id == other.id
+
+ def generate_hostname(self):
+ # this doesn't match amazon's implementation
+ return "{theme}-{rand}-(moto)".format(
+ theme=self.hostname_theme, rand=[choice("abcdefghijhk") for _ in range(4)]
+ )
+
+ @property
+ def arn(self):
+ return "arn:aws:opsworks:{region}:{account_number}:stack/{id}".format(
+ region=self.region, account_number=self.account_number, id=self.id
+ )
+
+ def to_dict(self):
+ response = {
+ "AgentVersion": self.agent_version,
+ "Arn": self.arn,
+ "Attributes": self.attributes,
+ "ChefConfiguration": self.chef_configuration,
+ "ConfigurationManager": self.configuration_manager,
+ "CreatedAt": self.created_at.isoformat(),
+ "CustomCookbooksSource": self.custom_cookbooks_source,
+ "DefaultAvailabilityZone": self.default_availability_zone,
+ "DefaultInstanceProfileArn": self.default_instance_profile_arn,
+ "DefaultOs": self.default_os,
+ "DefaultRootDeviceType": self.default_root_device_type,
+ "DefaultSshKeyName": self.default_ssh_keyname,
+ "DefaultSubnetId": self.default_subnet_id,
+ "HostnameTheme": self.hostname_theme,
+ "Name": self.name,
+ "Region": self.region,
+ "ServiceRoleArn": self.service_role_arn,
+ "StackId": self.id,
+ "UseCustomCookbooks": self.use_custom_cookbooks,
+ "UseOpsworksSecurityGroups": self.use_opsworks_security_groups,
+ "VpcId": self.vpcid,
+ }
+ if self.custom_json is not None:
+ response.update({"CustomJson": self.custom_json})
+ if self.default_ssh_keyname is not None:
+ response.update({"DefaultSshKeyName": self.default_ssh_keyname})
+ return response
+
+
+class App(BaseModel):
+ def __init__(
+ self,
+ stack_id,
+ name,
+ app_type,
+ shortname=None,
+ description=None,
+ datasources=None,
+ app_source=None,
+ domains=None,
+ enable_ssl=False,
+ ssl_configuration=None,
+ attributes=None,
+ environment=None,
+ ):
+ self.stack_id = stack_id
+ self.name = name
+ self.type = app_type
+ self.shortname = shortname
+ self.description = description
+
+ self.datasources = datasources
+ if datasources is None:
+ self.datasources = []
+
+ self.app_source = app_source
+ if app_source is None:
+ self.app_source = {}
+
+ self.domains = domains
+ if domains is None:
+ self.domains = []
+
+ self.enable_ssl = enable_ssl
+
+ self.ssl_configuration = ssl_configuration
+ if ssl_configuration is None:
+ self.ssl_configuration = {}
+
+ self.attributes = attributes
+ if attributes is None:
+ self.attributes = {}
+
+ self.environment = environment
+ if environment is None:
+ self.environment = {}
+
+ self.id = "{0}".format(uuid.uuid4())
+ self.created_at = datetime.datetime.utcnow()
+
+ def __eq__(self, other):
+ return self.id == other.id
+
+ def to_dict(self):
+ d = {
+ "AppId": self.id,
+ "AppSource": self.app_source,
+ "Attributes": self.attributes,
+ "CreatedAt": self.created_at.isoformat(),
+ "Datasources": self.datasources,
+ "Description": self.description,
+ "Domains": self.domains,
+ "EnableSsl": self.enable_ssl,
+ "Environment": self.environment,
+ "Name": self.name,
+ "Shortname": self.shortname,
+ "SslConfiguration": self.ssl_configuration,
+ "StackId": self.stack_id,
+ "Type": self.type,
+ }
+ return d
+
+
+class OpsWorksBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.stacks = {}
+ self.layers = {}
+ self.apps = {}
+ self.instances = {}
+ self.ec2_backend = ec2_backends[region_name]
+
+ def create_stack(self, **kwargs):
+ stack = Stack(**kwargs)
+ self.stacks[stack.id] = stack
+ return stack
+
+ def create_layer(self, **kwargs):
+ name = kwargs["name"]
+ shortname = kwargs["shortname"]
+ stackid = kwargs["stack_id"]
+ if stackid not in self.stacks:
+ raise ResourceNotFoundException(stackid)
+ if name in [layer.name for layer in self.stacks[stackid].layers]:
+ raise ValidationException(
+ 'There is already a layer named "{0}" ' "for this stack".format(name)
+ )
+ if shortname in [layer.shortname for layer in self.stacks[stackid].layers]:
+ raise ValidationException(
+ 'There is already a layer with shortname "{0}" '
+ "for this stack".format(shortname)
+ )
+ layer = Layer(**kwargs)
+ self.layers[layer.id] = layer
+ self.stacks[stackid].layers.append(layer)
+ return layer
+
+ def create_app(self, **kwargs):
+ name = kwargs["name"]
+ stackid = kwargs["stack_id"]
+ if stackid not in self.stacks:
+ raise ResourceNotFoundException(stackid)
+ if name in [a.name for a in self.stacks[stackid].apps]:
+ raise ValidationException(
+ 'There is already an app named "{0}" ' "for this stack".format(name)
+ )
+ app = App(**kwargs)
+ self.apps[app.id] = app
+ self.stacks[stackid].apps.append(app)
+ return app
+
+ def create_instance(self, **kwargs):
+ stack_id = kwargs["stack_id"]
+ layer_ids = kwargs["layer_ids"]
+
+ if stack_id not in self.stacks:
+ raise ResourceNotFoundException(
+ "Unable to find stack with ID {0}".format(stack_id)
+ )
+
+ unknown_layers = set(layer_ids) - set(self.layers.keys())
+ if unknown_layers:
+ raise ResourceNotFoundException(", ".join(unknown_layers))
+
+ layers = [self.layers[id] for id in layer_ids]
+ if len(set([layer.stack_id for layer in layers])) != 1 or any(
+ [layer.stack_id != stack_id for layer in layers]
+ ):
+ raise ValidationException(
+ "Please only provide layer IDs from the same stack"
+ )
+
+ stack = self.stacks[stack_id]
+ # pick the first to set default instance_profile_arn and
+ # security_group_ids on the instance.
+ layer = layers[0]
+
+ kwargs.setdefault("hostname", stack.generate_hostname())
+ kwargs.setdefault("ssh_keyname", stack.default_ssh_keyname)
+ kwargs.setdefault("availability_zone", stack.default_availability_zone)
+ kwargs.setdefault("subnet_id", stack.default_subnet_id)
+ kwargs.setdefault("root_device_type", stack.default_root_device_type)
+ if layer.custom_instance_profile_arn:
+ kwargs.setdefault("instance_profile_arn", layer.custom_instance_profile_arn)
+ kwargs.setdefault("instance_profile_arn", stack.default_instance_profile_arn)
+ kwargs.setdefault("security_group_ids", layer.custom_security_group_ids)
+ kwargs.setdefault("associate_public_ip", layer.auto_assign_public_ips)
+ kwargs.setdefault("ebs_optimized", layer.use_ebs_optimized_instances)
+ kwargs.update({"ec2_backend": self.ec2_backend})
+ opsworks_instance = OpsworkInstance(**kwargs)
+ self.instances[opsworks_instance.id] = opsworks_instance
+ return opsworks_instance
+
+ def describe_stacks(self, stack_ids):
+ if stack_ids is None:
+ return [stack.to_dict() for stack in self.stacks.values()]
+
+ unknown_stacks = set(stack_ids) - set(self.stacks.keys())
+ if unknown_stacks:
+ raise ResourceNotFoundException(", ".join(unknown_stacks))
+ return [self.stacks[id].to_dict() for id in stack_ids]
+
+ def describe_layers(self, stack_id, layer_ids):
+ if stack_id is not None and layer_ids is not None:
+ raise ValidationException(
+ "Please provide one or more layer IDs or a stack ID"
+ )
+ if stack_id is not None:
+ if stack_id not in self.stacks:
+ raise ResourceNotFoundException(
+ "Unable to find stack with ID {0}".format(stack_id)
+ )
+ return [layer.to_dict() for layer in self.stacks[stack_id].layers]
+
+ unknown_layers = set(layer_ids) - set(self.layers.keys())
+ if unknown_layers:
+ raise ResourceNotFoundException(", ".join(unknown_layers))
+ return [self.layers[id].to_dict() for id in layer_ids]
+
+ def describe_apps(self, stack_id, app_ids):
+ if stack_id is not None and app_ids is not None:
+ raise ValidationException(
+ "Please provide one or more app IDs or a stack ID"
+ )
+ if stack_id is not None:
+ if stack_id not in self.stacks:
+ raise ResourceNotFoundException(
+ "Unable to find stack with ID {0}".format(stack_id)
+ )
+ return [app.to_dict() for app in self.stacks[stack_id].apps]
+
+ unknown_apps = set(app_ids) - set(self.apps.keys())
+ if unknown_apps:
+ raise ResourceNotFoundException(", ".join(unknown_apps))
+ return [self.apps[id].to_dict() for id in app_ids]
+
+ def describe_instances(self, instance_ids, layer_id, stack_id):
+ if len(list(filter(None, (instance_ids, layer_id, stack_id)))) != 1:
+ raise ValidationException(
+ "Please provide either one or more "
+ "instance IDs or one stack ID or one "
+ "layer ID"
+ )
+ if instance_ids:
+ unknown_instances = set(instance_ids) - set(self.instances.keys())
+ if unknown_instances:
+ raise ResourceNotFoundException(", ".join(unknown_instances))
+ return [self.instances[id].to_dict() for id in instance_ids]
+
+ if layer_id:
+ if layer_id not in self.layers:
+ raise ResourceNotFoundException(
+ "Unable to find layer with ID {0}".format(layer_id)
+ )
+ instances = [
+ i.to_dict() for i in self.instances.values() if layer_id in i.layer_ids
+ ]
+ return instances
+
+ if stack_id:
+ if stack_id not in self.stacks:
+ raise ResourceNotFoundException(
+ "Unable to find stack with ID {0}".format(stack_id)
+ )
+ instances = [
+ i.to_dict() for i in self.instances.values() if stack_id == i.stack_id
+ ]
+ return instances
+
+ def start_instance(self, instance_id):
+ if instance_id not in self.instances:
+ raise ResourceNotFoundException(
+ "Unable to find instance with ID {0}".format(instance_id)
+ )
+ self.instances[instance_id].start()
+
+
+opsworks_backends = BackendDict(OpsWorksBackend, "ec2")
diff --git a/contrib/python/moto/py3/moto/opsworks/responses.py b/contrib/python/moto/py3/moto/opsworks/responses.py
new file mode 100644
index 0000000000..fb8db25983
--- /dev/null
+++ b/contrib/python/moto/py3/moto/opsworks/responses.py
@@ -0,0 +1,140 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import opsworks_backends
+
+
+class OpsWorksResponse(BaseResponse):
+ @property
+ def parameters(self):
+ return json.loads(self.body)
+
+ @property
+ def opsworks_backend(self):
+ return opsworks_backends[self.region]
+
+ def create_stack(self):
+ kwargs = dict(
+ name=self.parameters.get("Name"),
+ region=self.parameters.get("Region"),
+ vpcid=self.parameters.get("VpcId"),
+ attributes=self.parameters.get("Attributes"),
+ default_instance_profile_arn=self.parameters.get(
+ "DefaultInstanceProfileArn"
+ ),
+ default_os=self.parameters.get("DefaultOs"),
+ hostname_theme=self.parameters.get("HostnameTheme"),
+ default_availability_zone=self.parameters.get("DefaultAvailabilityZone"),
+ default_subnet_id=self.parameters.get("DefaultInstanceProfileArn"),
+ custom_json=self.parameters.get("CustomJson"),
+ configuration_manager=self.parameters.get("ConfigurationManager"),
+ chef_configuration=self.parameters.get("ChefConfiguration"),
+ use_custom_cookbooks=self.parameters.get("UseCustomCookbooks"),
+ use_opsworks_security_groups=self.parameters.get(
+ "UseOpsworksSecurityGroups"
+ ),
+ custom_cookbooks_source=self.parameters.get("CustomCookbooksSource"),
+ default_ssh_keyname=self.parameters.get("DefaultSshKeyName"),
+ default_root_device_type=self.parameters.get("DefaultRootDeviceType"),
+ service_role_arn=self.parameters.get("ServiceRoleArn"),
+ agent_version=self.parameters.get("AgentVersion"),
+ )
+ stack = self.opsworks_backend.create_stack(**kwargs)
+ return json.dumps({"StackId": stack.id}, indent=1)
+
+ def create_layer(self):
+ kwargs = dict(
+ stack_id=self.parameters.get("StackId"),
+ layer_type=self.parameters.get("Type"),
+ name=self.parameters.get("Name"),
+ shortname=self.parameters.get("Shortname"),
+ attributes=self.parameters.get("Attributes"),
+ custom_instance_profile_arn=self.parameters.get("CustomInstanceProfileArn"),
+ custom_json=self.parameters.get("CustomJson"),
+ custom_security_group_ids=self.parameters.get("CustomSecurityGroupIds"),
+ packages=self.parameters.get("Packages"),
+ volume_configurations=self.parameters.get("VolumeConfigurations"),
+ enable_autohealing=self.parameters.get("EnableAutoHealing"),
+ auto_assign_elastic_ips=self.parameters.get("AutoAssignElasticIps"),
+ auto_assign_public_ips=self.parameters.get("AutoAssignPublicIps"),
+ custom_recipes=self.parameters.get("CustomRecipes"),
+ install_updates_on_boot=self.parameters.get("InstallUpdatesOnBoot"),
+ use_ebs_optimized_instances=self.parameters.get("UseEbsOptimizedInstances"),
+ lifecycle_event_configuration=self.parameters.get(
+ "LifecycleEventConfiguration"
+ ),
+ )
+ layer = self.opsworks_backend.create_layer(**kwargs)
+ return json.dumps({"LayerId": layer.id}, indent=1)
+
+ def create_app(self):
+ kwargs = dict(
+ stack_id=self.parameters.get("StackId"),
+ name=self.parameters.get("Name"),
+ app_type=self.parameters.get("Type"),
+ shortname=self.parameters.get("Shortname"),
+ description=self.parameters.get("Description"),
+ datasources=self.parameters.get("DataSources"),
+ app_source=self.parameters.get("AppSource"),
+ domains=self.parameters.get("Domains"),
+ enable_ssl=self.parameters.get("EnableSsl"),
+ ssl_configuration=self.parameters.get("SslConfiguration"),
+ attributes=self.parameters.get("Attributes"),
+ environment=self.parameters.get("Environment"),
+ )
+ app = self.opsworks_backend.create_app(**kwargs)
+ return json.dumps({"AppId": app.id}, indent=1)
+
+ def create_instance(self):
+ kwargs = dict(
+ stack_id=self.parameters.get("StackId"),
+ layer_ids=self.parameters.get("LayerIds"),
+ instance_type=self.parameters.get("InstanceType"),
+ auto_scale_type=self.parameters.get("AutoScalingType"),
+ hostname=self.parameters.get("Hostname"),
+ os=self.parameters.get("Os"),
+ ami_id=self.parameters.get("AmiId"),
+ ssh_keyname=self.parameters.get("SshKeyName"),
+ availability_zone=self.parameters.get("AvailabilityZone"),
+ virtualization_type=self.parameters.get("VirtualizationType"),
+ subnet_id=self.parameters.get("SubnetId"),
+ architecture=self.parameters.get("Architecture"),
+ root_device_type=self.parameters.get("RootDeviceType"),
+ block_device_mappings=self.parameters.get("BlockDeviceMappings"),
+ install_updates_on_boot=self.parameters.get("InstallUpdatesOnBoot"),
+ ebs_optimized=self.parameters.get("EbsOptimized"),
+ agent_version=self.parameters.get("AgentVersion"),
+ )
+ opsworks_instance = self.opsworks_backend.create_instance(**kwargs)
+ return json.dumps({"InstanceId": opsworks_instance.id}, indent=1)
+
+ def describe_stacks(self):
+ stack_ids = self.parameters.get("StackIds")
+ stacks = self.opsworks_backend.describe_stacks(stack_ids)
+ return json.dumps({"Stacks": stacks}, indent=1)
+
+ def describe_layers(self):
+ stack_id = self.parameters.get("StackId")
+ layer_ids = self.parameters.get("LayerIds")
+ layers = self.opsworks_backend.describe_layers(stack_id, layer_ids)
+ return json.dumps({"Layers": layers}, indent=1)
+
+ def describe_apps(self):
+ stack_id = self.parameters.get("StackId")
+ app_ids = self.parameters.get("AppIds")
+ apps = self.opsworks_backend.describe_apps(stack_id, app_ids)
+ return json.dumps({"Apps": apps}, indent=1)
+
+ def describe_instances(self):
+ instance_ids = self.parameters.get("InstanceIds")
+ layer_id = self.parameters.get("LayerId")
+ stack_id = self.parameters.get("StackId")
+ instances = self.opsworks_backend.describe_instances(
+ instance_ids, layer_id, stack_id
+ )
+ return json.dumps({"Instances": instances}, indent=1)
+
+ def start_instance(self):
+ instance_id = self.parameters.get("InstanceId")
+ self.opsworks_backend.start_instance(instance_id)
+ return ""
diff --git a/contrib/python/moto/py3/moto/opsworks/urls.py b/contrib/python/moto/py3/moto/opsworks/urls.py
new file mode 100644
index 0000000000..6b448d418e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/opsworks/urls.py
@@ -0,0 +1,7 @@
+from .responses import OpsWorksResponse
+
+# AWS OpsWorks has a single endpoint: opsworks.us-east-1.amazonaws.com
+# and only supports HTTPS requests.
+url_bases = [r"https?://opsworks\.us-east-1\.amazonaws.com"]
+
+url_paths = {"{0}/$": OpsWorksResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/organizations/__init__.py b/contrib/python/moto/py3/moto/organizations/__init__.py
new file mode 100644
index 0000000000..0b163ad172
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/__init__.py
@@ -0,0 +1,4 @@
+from .models import organizations_backends
+from ..core.models import base_decorator
+
+mock_organizations = base_decorator(organizations_backends)
diff --git a/contrib/python/moto/py3/moto/organizations/exceptions.py b/contrib/python/moto/py3/moto/organizations/exceptions.py
new file mode 100644
index 0000000000..713d847759
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/exceptions.py
@@ -0,0 +1,111 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class AccountAlreadyRegisteredException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "AccountAlreadyRegisteredException",
+ "The provided account is already a delegated administrator for your organization.",
+ )
+
+
+class AccountNotRegisteredException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "AccountNotRegisteredException",
+ "The provided account is not a registered delegated administrator for your organization.",
+ )
+
+
+class AccountNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "AccountNotFoundException", "You specified an account that doesn't exist."
+ )
+
+
+class AWSOrganizationsNotInUseException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "AWSOrganizationsNotInUseException",
+ "Your account is not a member of an organization.",
+ )
+
+
+class ConstraintViolationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ConstraintViolationException", message)
+
+
+class InvalidInputException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidInputException", message)
+
+
+class DuplicateOrganizationalUnitException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "DuplicateOrganizationalUnitException",
+ "An OU with the same name already exists.",
+ )
+
+
+class DuplicatePolicyException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "DuplicatePolicyException", "A policy with the same name already exists."
+ )
+
+
+class PolicyTypeAlreadyEnabledException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "PolicyTypeAlreadyEnabledException",
+ "The specified policy type is already enabled.",
+ )
+
+
+class PolicyTypeNotEnabledException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "PolicyTypeNotEnabledException",
+ "This operation can be performed only for enabled policy types.",
+ )
+
+
+class RootNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "RootNotFoundException", "You specified a root that doesn't exist."
+ )
+
+
+class TargetNotFoundException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "TargetNotFoundException", "You specified a target that doesn't exist."
+ )
diff --git a/contrib/python/moto/py3/moto/organizations/models.py b/contrib/python/moto/py3/moto/organizations/models.py
new file mode 100644
index 0000000000..7aa9c09f66
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/models.py
@@ -0,0 +1,923 @@
+import datetime
+import re
+import json
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.exceptions import RESTError
+from moto.core.utils import unix_time, BackendDict
+from moto.organizations import utils
+from moto.organizations.exceptions import (
+ InvalidInputException,
+ DuplicateOrganizationalUnitException,
+ DuplicatePolicyException,
+ AccountNotFoundException,
+ ConstraintViolationException,
+ AccountAlreadyRegisteredException,
+ AWSOrganizationsNotInUseException,
+ AccountNotRegisteredException,
+ RootNotFoundException,
+ PolicyTypeAlreadyEnabledException,
+ PolicyTypeNotEnabledException,
+ TargetNotFoundException,
+)
+from moto.utilities.paginator import paginate
+from .utils import PAGINATION_MODEL
+
+
+class FakeOrganization(BaseModel):
+ def __init__(self, feature_set):
+ self.id = utils.make_random_org_id()
+ self.root_id = utils.make_random_root_id()
+ self.feature_set = feature_set
+ self.master_account_id = utils.MASTER_ACCOUNT_ID
+ self.master_account_email = utils.MASTER_ACCOUNT_EMAIL
+ self.available_policy_types = [
+ # This policy is available, but not applied
+ # User should use enable_policy_type/disable_policy_type to do anything else
+ # This field is deprecated in AWS, but we'll return it for old time's sake
+ {"Type": "SERVICE_CONTROL_POLICY", "Status": "ENABLED"}
+ ]
+
+ @property
+ def arn(self):
+ return utils.ORGANIZATION_ARN_FORMAT.format(self.master_account_id, self.id)
+
+ @property
+ def master_account_arn(self):
+ return utils.MASTER_ACCOUNT_ARN_FORMAT.format(self.master_account_id, self.id)
+
+ def describe(self):
+ return {
+ "Organization": {
+ "Id": self.id,
+ "Arn": self.arn,
+ "FeatureSet": self.feature_set,
+ "MasterAccountArn": self.master_account_arn,
+ "MasterAccountId": self.master_account_id,
+ "MasterAccountEmail": self.master_account_email,
+ "AvailablePolicyTypes": self.available_policy_types,
+ }
+ }
+
+
+class FakeAccount(BaseModel):
+ def __init__(self, organization, **kwargs):
+ self.type = "ACCOUNT"
+ self.organization_id = organization.id
+ self.master_account_id = organization.master_account_id
+ self.create_account_status_id = utils.make_random_create_account_status_id()
+ self.id = utils.make_random_account_id()
+ self.name = kwargs["AccountName"]
+ self.email = kwargs["Email"]
+ self.create_time = datetime.datetime.utcnow()
+ self.status = "ACTIVE"
+ self.joined_method = "CREATED"
+ self.parent_id = organization.root_id
+ self.attached_policies = []
+ self.tags = {tag["Key"]: tag["Value"] for tag in kwargs.get("Tags", [])}
+
+ @property
+ def arn(self):
+ return utils.ACCOUNT_ARN_FORMAT.format(
+ self.master_account_id, self.organization_id, self.id
+ )
+
+ @property
+ def create_account_status(self):
+ return {
+ "CreateAccountStatus": {
+ "Id": self.create_account_status_id,
+ "AccountName": self.name,
+ "State": "SUCCEEDED",
+ "RequestedTimestamp": unix_time(self.create_time),
+ "CompletedTimestamp": unix_time(self.create_time),
+ "AccountId": self.id,
+ }
+ }
+
+ def describe(self):
+ return {
+ "Id": self.id,
+ "Arn": self.arn,
+ "Email": self.email,
+ "Name": self.name,
+ "Status": self.status,
+ "JoinedMethod": self.joined_method,
+ "JoinedTimestamp": unix_time(self.create_time),
+ }
+
+ def close(self):
+ # TODO: The CloseAccount spec allows the account to pass through a
+ # "PENDING_CLOSURE" state before reaching the SUSPNEDED state.
+ self.status = "SUSPENDED"
+
+
+class FakeOrganizationalUnit(BaseModel):
+ def __init__(self, organization, **kwargs):
+ self.type = "ORGANIZATIONAL_UNIT"
+ self.organization_id = organization.id
+ self.master_account_id = organization.master_account_id
+ self.id = utils.make_random_ou_id(organization.root_id)
+ self.name = kwargs.get("Name")
+ self.parent_id = kwargs.get("ParentId")
+ self._arn_format = utils.OU_ARN_FORMAT
+ self.attached_policies = []
+ self.tags = {tag["Key"]: tag["Value"] for tag in kwargs.get("Tags", [])}
+
+ @property
+ def arn(self):
+ return self._arn_format.format(
+ self.master_account_id, self.organization_id, self.id
+ )
+
+ def describe(self):
+ return {
+ "OrganizationalUnit": {"Id": self.id, "Arn": self.arn, "Name": self.name}
+ }
+
+
+class FakeRoot(FakeOrganizationalUnit):
+ SUPPORTED_POLICY_TYPES = [
+ "AISERVICES_OPT_OUT_POLICY",
+ "BACKUP_POLICY",
+ "SERVICE_CONTROL_POLICY",
+ "TAG_POLICY",
+ ]
+
+ def __init__(self, organization, **kwargs):
+ super().__init__(organization, **kwargs)
+ self.type = "ROOT"
+ self.id = organization.root_id
+ self.name = "Root"
+ self.policy_types = []
+ self._arn_format = utils.ROOT_ARN_FORMAT
+ self.attached_policies = []
+ self.tags = {tag["Key"]: tag["Value"] for tag in kwargs.get("Tags", [])}
+
+ def describe(self):
+ return {
+ "Id": self.id,
+ "Arn": self.arn,
+ "Name": self.name,
+ "PolicyTypes": self.policy_types,
+ }
+
+ def add_policy_type(self, policy_type):
+ if policy_type not in self.SUPPORTED_POLICY_TYPES:
+ raise InvalidInputException("You specified an invalid value.")
+
+ if any(type["Type"] == policy_type for type in self.policy_types):
+ raise PolicyTypeAlreadyEnabledException
+
+ self.policy_types.append({"Type": policy_type, "Status": "ENABLED"})
+
+ def remove_policy_type(self, policy_type):
+ if not FakePolicy.supported_policy_type(policy_type):
+ raise InvalidInputException("You specified an invalid value.")
+
+ if all(type["Type"] != policy_type for type in self.policy_types):
+ raise PolicyTypeNotEnabledException
+
+ self.policy_types.remove({"Type": policy_type, "Status": "ENABLED"})
+
+
+class FakePolicy(BaseModel):
+ SUPPORTED_POLICY_TYPES = [
+ "AISERVICES_OPT_OUT_POLICY",
+ "BACKUP_POLICY",
+ "SERVICE_CONTROL_POLICY",
+ "TAG_POLICY",
+ ]
+
+ def __init__(self, organization, **kwargs):
+ self.content = kwargs.get("Content")
+ self.description = kwargs.get("Description")
+ self.name = kwargs.get("Name")
+ self.type = kwargs.get("Type")
+ self.id = utils.make_random_policy_id()
+ self.aws_managed = False
+ self.organization_id = organization.id
+ self.master_account_id = organization.master_account_id
+ self.attachments = []
+
+ if not FakePolicy.supported_policy_type(self.type):
+ raise InvalidInputException("You specified an invalid value.")
+ elif self.type == "AISERVICES_OPT_OUT_POLICY":
+ self._arn_format = utils.AI_POLICY_ARN_FORMAT
+ elif self.type == "SERVICE_CONTROL_POLICY":
+ self._arn_format = utils.SCP_ARN_FORMAT
+ else:
+ raise NotImplementedError(
+ "The {0} policy type has not been implemented".format(self.type)
+ )
+
+ @property
+ def arn(self):
+ return self._arn_format.format(
+ self.master_account_id, self.organization_id, self.id
+ )
+
+ def describe(self):
+ return {
+ "Policy": {
+ "PolicySummary": {
+ "Id": self.id,
+ "Arn": self.arn,
+ "Name": self.name,
+ "Description": self.description,
+ "Type": self.type,
+ "AwsManaged": self.aws_managed,
+ },
+ "Content": self.content,
+ }
+ }
+
+ @staticmethod
+ def supported_policy_type(policy_type):
+ return policy_type in FakePolicy.SUPPORTED_POLICY_TYPES
+
+
+class FakeServiceAccess(BaseModel):
+ # List of trusted services, which support trusted access with Organizations
+ # https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrated-services-list.html
+ TRUSTED_SERVICES = [
+ "aws-artifact-account-sync.amazonaws.com",
+ "backup.amazonaws.com",
+ "member.org.stacksets.cloudformation.amazonaws.com",
+ "cloudtrail.amazonaws.com",
+ "compute-optimizer.amazonaws.com",
+ "config.amazonaws.com",
+ "config-multiaccountsetup.amazonaws.com",
+ "controltower.amazonaws.com",
+ "ds.amazonaws.com",
+ "fms.amazonaws.com",
+ "guardduty.amazonaws.com",
+ "access-analyzer.amazonaws.com",
+ "license-manager.amazonaws.com",
+ "license-manager.member-account.amazonaws.com.",
+ "macie.amazonaws.com",
+ "ram.amazonaws.com",
+ "servicecatalog.amazonaws.com",
+ "servicequotas.amazonaws.com",
+ "sso.amazonaws.com",
+ "ssm.amazonaws.com",
+ "tagpolicies.tag.amazonaws.com",
+ ]
+
+ def __init__(self, **kwargs):
+ if not self.trusted_service(kwargs["ServicePrincipal"]):
+ raise InvalidInputException(
+ "You specified an unrecognized service principal."
+ )
+
+ self.service_principal = kwargs["ServicePrincipal"]
+ self.date_enabled = datetime.datetime.utcnow()
+
+ def describe(self):
+ return {
+ "ServicePrincipal": self.service_principal,
+ "DateEnabled": unix_time(self.date_enabled),
+ }
+
+ @staticmethod
+ def trusted_service(service_principal):
+ return service_principal in FakeServiceAccess.TRUSTED_SERVICES
+
+
+class FakeDelegatedAdministrator(BaseModel):
+ # List of services, which support a different Account to ba a delegated administrator
+ # https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrated-services-list.html
+ SUPPORTED_SERVICES = [
+ "config-multiaccountsetup.amazonaws.com",
+ "guardduty.amazonaws.com",
+ "access-analyzer.amazonaws.com",
+ "macie.amazonaws.com",
+ "servicecatalog.amazonaws.com",
+ "ssm.amazonaws.com",
+ ]
+
+ def __init__(self, account):
+ self.account = account
+ self.enabled_date = datetime.datetime.utcnow()
+ self.services = {}
+
+ def add_service_principal(self, service_principal):
+ if service_principal in self.services:
+ raise AccountAlreadyRegisteredException
+
+ if not self.supported_service(service_principal):
+ raise InvalidInputException(
+ "You specified an unrecognized service principal."
+ )
+
+ self.services[service_principal] = {
+ "ServicePrincipal": service_principal,
+ "DelegationEnabledDate": unix_time(datetime.datetime.utcnow()),
+ }
+
+ def remove_service_principal(self, service_principal):
+ if service_principal not in self.services:
+ raise InvalidInputException(
+ "You specified an unrecognized service principal."
+ )
+
+ self.services.pop(service_principal)
+
+ def describe(self):
+ admin = self.account.describe()
+ admin["DelegationEnabledDate"] = unix_time(self.enabled_date)
+
+ return admin
+
+ @staticmethod
+ def supported_service(service_principal):
+ return service_principal in FakeDelegatedAdministrator.SUPPORTED_SERVICES
+
+
+class OrganizationsBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._reset()
+
+ def _reset(self):
+ self.org = None
+ self.accounts = []
+ self.ou = []
+ self.policies = []
+ self.services = []
+ self.admins = []
+
+ def _get_root_by_id(self, root_id):
+ root = next((ou for ou in self.ou if ou.id == root_id), None)
+ if not root:
+ raise RootNotFoundException
+
+ return root
+
+ def create_organization(self, **kwargs):
+ self.org = FakeOrganization(kwargs["FeatureSet"])
+ root_ou = FakeRoot(self.org)
+ self.ou.append(root_ou)
+ master_account = FakeAccount(
+ self.org, AccountName="master", Email=self.org.master_account_email
+ )
+ master_account.id = self.org.master_account_id
+ self.accounts.append(master_account)
+ default_policy = FakePolicy(
+ self.org,
+ Name="FullAWSAccess",
+ Description="Allows access to every operation",
+ Type="SERVICE_CONTROL_POLICY",
+ Content=json.dumps(
+ {
+ "Version": "2012-10-17",
+ "Statement": [{"Effect": "Allow", "Action": "*", "Resource": "*"}],
+ }
+ ),
+ )
+ default_policy.id = utils.DEFAULT_POLICY_ID
+ default_policy.aws_managed = True
+ self.policies.append(default_policy)
+ self.attach_policy(PolicyId=default_policy.id, TargetId=root_ou.id)
+ self.attach_policy(PolicyId=default_policy.id, TargetId=master_account.id)
+ return self.org.describe()
+
+ def describe_organization(self):
+ if not self.org:
+ raise AWSOrganizationsNotInUseException
+ return self.org.describe()
+
+ def delete_organization(self):
+ if [account for account in self.accounts if account.name != "master"]:
+ raise RESTError(
+ "OrganizationNotEmptyException",
+ "To delete an organization you must first remove all member accounts (except the master).",
+ )
+ self._reset()
+ return {}
+
+ def list_roots(self):
+ return dict(Roots=[ou.describe() for ou in self.ou if isinstance(ou, FakeRoot)])
+
+ def create_organizational_unit(self, **kwargs):
+ new_ou = FakeOrganizationalUnit(self.org, **kwargs)
+ self.ou.append(new_ou)
+ self.attach_policy(PolicyId=utils.DEFAULT_POLICY_ID, TargetId=new_ou.id)
+ return new_ou.describe()
+
+ def update_organizational_unit(self, **kwargs):
+ for ou in self.ou:
+ if ou.name == kwargs["Name"]:
+ raise DuplicateOrganizationalUnitException
+ ou = self.get_organizational_unit_by_id(kwargs["OrganizationalUnitId"])
+ ou.name = kwargs["Name"]
+ return ou.describe()
+
+ def get_organizational_unit_by_id(self, ou_id):
+ ou = next((ou for ou in self.ou if ou.id == ou_id), None)
+ if ou is None:
+ raise RESTError(
+ "OrganizationalUnitNotFoundException",
+ "You specified an organizational unit that doesn't exist.",
+ )
+ return ou
+
+ def validate_parent_id(self, parent_id):
+ try:
+ self.get_organizational_unit_by_id(parent_id)
+ except RESTError:
+ raise RESTError(
+ "ParentNotFoundException", "You specified parent that doesn't exist."
+ )
+ return parent_id
+
+ def describe_organizational_unit(self, **kwargs):
+ ou = self.get_organizational_unit_by_id(kwargs["OrganizationalUnitId"])
+ return ou.describe()
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_organizational_units_for_parent(self, **kwargs):
+ parent_id = self.validate_parent_id(kwargs["parent_id"])
+ return [
+ {"Id": ou.id, "Arn": ou.arn, "Name": ou.name}
+ for ou in self.ou
+ if ou.parent_id == parent_id
+ ]
+
+ def create_account(self, **kwargs):
+ new_account = FakeAccount(self.org, **kwargs)
+ self.accounts.append(new_account)
+ self.attach_policy(PolicyId=utils.DEFAULT_POLICY_ID, TargetId=new_account.id)
+ return new_account.create_account_status
+
+ def close_account(self, **kwargs):
+ for account in self.accounts:
+ if account.id == kwargs["AccountId"]:
+ account.close()
+ return
+ raise AccountNotFoundException
+
+ def get_account_by_id(self, account_id):
+ account = next(
+ (account for account in self.accounts if account.id == account_id), None
+ )
+ if account is None:
+ raise AccountNotFoundException
+ return account
+
+ def get_account_by_attr(self, attr, value):
+ account = next(
+ (
+ account
+ for account in self.accounts
+ if hasattr(account, attr) and getattr(account, attr) == value
+ ),
+ None,
+ )
+ if account is None:
+ raise AccountNotFoundException
+ return account
+
+ def describe_account(self, **kwargs):
+ account = self.get_account_by_id(kwargs["AccountId"])
+ return dict(Account=account.describe())
+
+ def describe_create_account_status(self, **kwargs):
+ account = self.get_account_by_attr(
+ "create_account_status_id", kwargs["CreateAccountRequestId"]
+ )
+ return account.create_account_status
+
+ def list_create_account_status(self, **kwargs):
+ requested_states = kwargs.get("States")
+ if not requested_states:
+ requested_states = ["IN_PROGRESS", "SUCCEEDED", "FAILED"]
+ accountStatuses = []
+ for account in self.accounts:
+ create_account_status = account.create_account_status["CreateAccountStatus"]
+ if create_account_status["State"] in requested_states:
+ accountStatuses.append(create_account_status)
+ token = kwargs.get("NextToken")
+ if token:
+ start = int(token)
+ else:
+ start = 0
+ max_results = int(kwargs.get("MaxResults", 123))
+ accounts_resp = accountStatuses[start : start + max_results]
+ next_token = None
+ if max_results and len(accountStatuses) > (start + max_results):
+ next_token = str(len(accounts_resp))
+ return dict(CreateAccountStatuses=accounts_resp, NextToken=next_token)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_accounts(self):
+ accounts = [account.describe() for account in self.accounts]
+ accounts = sorted(accounts, key=lambda x: x["JoinedTimestamp"])
+ return accounts
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_accounts_for_parent(self, **kwargs):
+ parent_id = self.validate_parent_id(kwargs["parent_id"])
+ accounts = [
+ account.describe()
+ for account in self.accounts
+ if account.parent_id == parent_id
+ ]
+ accounts = sorted(accounts, key=lambda x: x["JoinedTimestamp"])
+ return accounts
+
+ def move_account(self, **kwargs):
+ new_parent_id = self.validate_parent_id(kwargs["DestinationParentId"])
+ self.validate_parent_id(kwargs["SourceParentId"])
+ account = self.get_account_by_id(kwargs["AccountId"])
+ index = self.accounts.index(account)
+ self.accounts[index].parent_id = new_parent_id
+
+ def list_parents(self, **kwargs):
+ if re.compile(r"[0-9]{12}").match(kwargs["ChildId"]):
+ child_object = self.get_account_by_id(kwargs["ChildId"])
+ else:
+ child_object = self.get_organizational_unit_by_id(kwargs["ChildId"])
+ return dict(
+ Parents=[
+ {"Id": ou.id, "Type": ou.type}
+ for ou in self.ou
+ if ou.id == child_object.parent_id
+ ]
+ )
+
+ def list_children(self, **kwargs):
+ parent_id = self.validate_parent_id(kwargs["ParentId"])
+ if kwargs["ChildType"] == "ACCOUNT":
+ obj_list = self.accounts
+ elif kwargs["ChildType"] == "ORGANIZATIONAL_UNIT":
+ obj_list = self.ou
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+ return dict(
+ Children=[
+ {"Id": obj.id, "Type": kwargs["ChildType"]}
+ for obj in obj_list
+ if obj.parent_id == parent_id
+ ]
+ )
+
+ def create_policy(self, **kwargs):
+ new_policy = FakePolicy(self.org, **kwargs)
+ for policy in self.policies:
+ if kwargs["Name"] == policy.name:
+ raise DuplicatePolicyException
+ self.policies.append(new_policy)
+ return new_policy.describe()
+
+ def describe_policy(self, **kwargs):
+ if re.compile(utils.POLICY_ID_REGEX).match(kwargs["PolicyId"]):
+ policy = next(
+ (p for p in self.policies if p.id == kwargs["PolicyId"]), None
+ )
+ if policy is None:
+ raise RESTError(
+ "PolicyNotFoundException",
+ "You specified a policy that doesn't exist.",
+ )
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+ return policy.describe()
+
+ def get_policy_by_id(self, policy_id):
+ policy = next(
+ (policy for policy in self.policies if policy.id == policy_id), None
+ )
+ if policy is None:
+ raise RESTError(
+ "PolicyNotFoundException",
+ "We can't find a policy with the PolicyId that you specified.",
+ )
+ return policy
+
+ def update_policy(self, **kwargs):
+ policy = self.get_policy_by_id(kwargs["PolicyId"])
+ policy.name = kwargs.get("Name", policy.name)
+ policy.description = kwargs.get("Description", policy.description)
+ policy.content = kwargs.get("Content", policy.content)
+ return policy.describe()
+
+ def attach_policy(self, **kwargs):
+ policy = self.get_policy_by_id(kwargs["PolicyId"])
+ if re.compile(utils.ROOT_ID_REGEX).match(kwargs["TargetId"]) or re.compile(
+ utils.OU_ID_REGEX
+ ).match(kwargs["TargetId"]):
+ ou = next((ou for ou in self.ou if ou.id == kwargs["TargetId"]), None)
+ if ou is not None:
+ if policy not in ou.attached_policies:
+ ou.attached_policies.append(policy)
+ policy.attachments.append(ou)
+ else:
+ raise RESTError(
+ "OrganizationalUnitNotFoundException",
+ "You specified an organizational unit that doesn't exist.",
+ )
+ elif re.compile(utils.ACCOUNT_ID_REGEX).match(kwargs["TargetId"]):
+ account = next(
+ (a for a in self.accounts if a.id == kwargs["TargetId"]), None
+ )
+ if account is not None:
+ if policy not in account.attached_policies:
+ account.attached_policies.append(policy)
+ policy.attachments.append(account)
+ else:
+ raise AccountNotFoundException
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+
+ def list_policies(self):
+ return dict(
+ Policies=[p.describe()["Policy"]["PolicySummary"] for p in self.policies]
+ )
+
+ def delete_policy(self, **kwargs):
+ for idx, policy in enumerate(self.policies):
+ if policy.id == kwargs["PolicyId"]:
+ if self.list_targets_for_policy(PolicyId=policy.id)["Targets"]:
+ raise RESTError(
+ "PolicyInUseException",
+ "The policy is attached to one or more entities. You must detach it from all roots, OUs, and accounts before performing this operation.",
+ )
+ del self.policies[idx]
+ return
+ raise RESTError(
+ "PolicyNotFoundException",
+ "We can't find a policy with the PolicyId that you specified.",
+ )
+
+ def list_policies_for_target(self, **kwargs):
+ _filter = kwargs["Filter"]
+
+ if re.match(utils.ROOT_ID_REGEX, kwargs["TargetId"]):
+ obj = next((ou for ou in self.ou if ou.id == kwargs["TargetId"]), None)
+ if obj is None:
+ raise TargetNotFoundException
+ elif re.compile(utils.OU_ID_REGEX).match(kwargs["TargetId"]):
+ obj = next((ou for ou in self.ou if ou.id == kwargs["TargetId"]), None)
+ if obj is None:
+ raise RESTError(
+ "OrganizationalUnitNotFoundException",
+ "You specified an organizational unit that doesn't exist.",
+ )
+ elif re.compile(utils.ACCOUNT_ID_REGEX).match(kwargs["TargetId"]):
+ obj = next((a for a in self.accounts if a.id == kwargs["TargetId"]), None)
+ if obj is None:
+ raise AccountNotFoundException
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+
+ if not FakePolicy.supported_policy_type(_filter):
+ raise InvalidInputException("You specified an invalid value.")
+
+ if _filter not in ["AISERVICES_OPT_OUT_POLICY", "SERVICE_CONTROL_POLICY"]:
+ raise NotImplementedError(
+ "The {0} policy type has not been implemented".format(_filter)
+ )
+
+ return dict(
+ Policies=[
+ p.describe()["Policy"]["PolicySummary"]
+ for p in obj.attached_policies
+ if p.type == _filter
+ ]
+ )
+
+ def _get_resource_for_tagging(self, resource_id):
+ if utils.fullmatch(
+ re.compile(utils.OU_ID_REGEX), resource_id
+ ) or utils.fullmatch(utils.ROOT_ID_REGEX, resource_id):
+ resource = next((a for a in self.ou if a.id == resource_id), None)
+ elif utils.fullmatch(re.compile(utils.ACCOUNT_ID_REGEX), resource_id):
+ resource = next((a for a in self.accounts if a.id == resource_id), None)
+ elif utils.fullmatch(re.compile(utils.POLICY_ID_REGEX), resource_id):
+ resource = next((a for a in self.policies if a.id == resource_id), None)
+ else:
+ raise InvalidInputException(
+ "You provided a value that does not match the required pattern."
+ )
+
+ if resource is None:
+ raise TargetNotFoundException
+
+ return resource
+
+ def list_targets_for_policy(self, **kwargs):
+ if re.compile(utils.POLICY_ID_REGEX).match(kwargs["PolicyId"]):
+ policy = next(
+ (p for p in self.policies if p.id == kwargs["PolicyId"]), None
+ )
+ if policy is None:
+ raise RESTError(
+ "PolicyNotFoundException",
+ "You specified a policy that doesn't exist.",
+ )
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+ objects = [
+ {"TargetId": obj.id, "Arn": obj.arn, "Name": obj.name, "Type": obj.type}
+ for obj in policy.attachments
+ ]
+ return dict(Targets=objects)
+
+ def tag_resource(self, **kwargs):
+ resource = self._get_resource_for_tagging(kwargs["ResourceId"])
+ new_tags = {tag["Key"]: tag["Value"] for tag in kwargs["Tags"]}
+ resource.tags.update(new_tags)
+
+ def list_tags_for_resource(self, **kwargs):
+ resource = self._get_resource_for_tagging(kwargs["ResourceId"])
+ tags = [{"Key": key, "Value": value} for key, value in resource.tags.items()]
+ return dict(Tags=tags)
+
+ def untag_resource(self, **kwargs):
+ resource = self._get_resource_for_tagging(kwargs["ResourceId"])
+ for key in kwargs["TagKeys"]:
+ resource.tags.pop(key, None)
+
+ def enable_aws_service_access(self, **kwargs):
+ service = FakeServiceAccess(**kwargs)
+
+ # enabling an existing service results in no changes
+ if any(
+ service["ServicePrincipal"] == kwargs["ServicePrincipal"]
+ for service in self.services
+ ):
+ return
+
+ self.services.append(service.describe())
+
+ def list_aws_service_access_for_organization(self):
+ return dict(EnabledServicePrincipals=self.services)
+
+ def disable_aws_service_access(self, **kwargs):
+ if not FakeServiceAccess.trusted_service(kwargs["ServicePrincipal"]):
+ raise InvalidInputException(
+ "You specified an unrecognized service principal."
+ )
+
+ service_principal = next(
+ (
+ service
+ for service in self.services
+ if service["ServicePrincipal"] == kwargs["ServicePrincipal"]
+ ),
+ None,
+ )
+
+ if service_principal:
+ self.services.remove(service_principal)
+
+ def register_delegated_administrator(self, **kwargs):
+ account_id = kwargs["AccountId"]
+
+ if account_id == get_account_id():
+ raise ConstraintViolationException(
+ "You cannot register master account/yourself as delegated administrator for your organization."
+ )
+
+ account = self.get_account_by_id(account_id)
+
+ admin = next(
+ (admin for admin in self.admins if admin.account.id == account_id), None
+ )
+ if admin is None:
+ admin = FakeDelegatedAdministrator(account)
+ self.admins.append(admin)
+
+ admin.add_service_principal(kwargs["ServicePrincipal"])
+
+ def list_delegated_administrators(self, **kwargs):
+ admins = self.admins
+ service = kwargs.get("ServicePrincipal")
+
+ if service:
+ if not FakeDelegatedAdministrator.supported_service(service):
+ raise InvalidInputException(
+ "You specified an unrecognized service principal."
+ )
+
+ admins = [admin for admin in admins if service in admin.services]
+
+ delegated_admins = [admin.describe() for admin in admins]
+
+ return dict(DelegatedAdministrators=delegated_admins)
+
+ def list_delegated_services_for_account(self, **kwargs):
+ admin = next(
+ (admin for admin in self.admins if admin.account.id == kwargs["AccountId"]),
+ None,
+ )
+ if admin is None:
+ account = next(
+ (
+ account
+ for account in self.accounts
+ if account.id == kwargs["AccountId"]
+ ),
+ None,
+ )
+ if account:
+ raise AccountNotRegisteredException
+
+ raise AWSOrganizationsNotInUseException
+
+ services = [service for service in admin.services.values()]
+
+ return dict(DelegatedServices=services)
+
+ def deregister_delegated_administrator(self, **kwargs):
+ account_id = kwargs["AccountId"]
+ service = kwargs["ServicePrincipal"]
+
+ if account_id == get_account_id():
+ raise ConstraintViolationException(
+ "You cannot register master account/yourself as delegated administrator for your organization."
+ )
+
+ admin = next(
+ (admin for admin in self.admins if admin.account.id == account_id), None
+ )
+ if admin is None:
+ account = next(
+ (
+ account
+ for account in self.accounts
+ if account.id == kwargs["AccountId"]
+ ),
+ None,
+ )
+ if account:
+ raise AccountNotRegisteredException
+
+ raise AccountNotFoundException
+
+ admin.remove_service_principal(service)
+
+ # remove account, when no services attached
+ if not admin.services:
+ self.admins.remove(admin)
+
+ def enable_policy_type(self, **kwargs):
+ root = self._get_root_by_id(kwargs["RootId"])
+
+ root.add_policy_type(kwargs["PolicyType"])
+
+ return dict(Root=root.describe())
+
+ def disable_policy_type(self, **kwargs):
+ root = self._get_root_by_id(kwargs["RootId"])
+
+ root.remove_policy_type(kwargs["PolicyType"])
+
+ return dict(Root=root.describe())
+
+ def detach_policy(self, **kwargs):
+ policy = self.get_policy_by_id(kwargs["PolicyId"])
+ root_id_regex = utils.ROOT_ID_REGEX
+ ou_id_regex = utils.OU_ID_REGEX
+ account_id_regex = utils.ACCOUNT_ID_REGEX
+ target_id = kwargs["TargetId"]
+
+ if re.match(root_id_regex, target_id) or re.match(ou_id_regex, target_id):
+ ou = next((ou for ou in self.ou if ou.id == target_id), None)
+ if ou is not None:
+ if policy in ou.attached_policies:
+ ou.attached_policies.remove(policy)
+ policy.attachments.remove(ou)
+ else:
+ raise RESTError(
+ "OrganizationalUnitNotFoundException",
+ "You specified an organizational unit that doesn't exist.",
+ )
+ elif re.match(account_id_regex, target_id):
+ account = next(
+ (account for account in self.accounts if account.id == target_id), None
+ )
+ if account is not None:
+ if policy in account.attached_policies:
+ account.attached_policies.remove(policy)
+ policy.attachments.remove(account)
+ else:
+ raise AccountNotFoundException
+ else:
+ raise InvalidInputException("You specified an invalid value.")
+
+ def remove_account_from_organization(self, **kwargs):
+ account = self.get_account_by_id(kwargs["AccountId"])
+ for policy in account.attached_policies:
+ policy.attachments.remove(account)
+ self.accounts.remove(account)
+
+
+organizations_backends = BackendDict(
+ OrganizationsBackend,
+ "organizations",
+ use_boto3_regions=False,
+ additional_regions=["global"],
+)
+organizations_backend = organizations_backends["global"]
diff --git a/contrib/python/moto/py3/moto/organizations/responses.py b/contrib/python/moto/py3/moto/organizations/responses.py
new file mode 100644
index 0000000000..4c0b519ad3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/responses.py
@@ -0,0 +1,248 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import organizations_backend
+
+
+class OrganizationsResponse(BaseResponse):
+ @property
+ def organizations_backend(self):
+ return organizations_backend
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def create_organization(self):
+ return json.dumps(
+ self.organizations_backend.create_organization(**self.request_params)
+ )
+
+ def describe_organization(self):
+ return json.dumps(self.organizations_backend.describe_organization())
+
+ def delete_organization(self):
+ return json.dumps(self.organizations_backend.delete_organization())
+
+ def list_roots(self):
+ return json.dumps(self.organizations_backend.list_roots())
+
+ def create_organizational_unit(self):
+ return json.dumps(
+ self.organizations_backend.create_organizational_unit(**self.request_params)
+ )
+
+ def update_organizational_unit(self):
+ return json.dumps(
+ self.organizations_backend.update_organizational_unit(**self.request_params)
+ )
+
+ def describe_organizational_unit(self):
+ return json.dumps(
+ self.organizations_backend.describe_organizational_unit(
+ **self.request_params
+ )
+ )
+
+ def list_organizational_units_for_parent(self):
+ max_results = self._get_int_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ parent_id = self._get_param("ParentId")
+ (
+ ous,
+ next_token,
+ ) = self.organizations_backend.list_organizational_units_for_parent(
+ max_results=max_results, next_token=next_token, parent_id=parent_id
+ )
+ response = {"OrganizationalUnits": ous}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_parents(self):
+ return json.dumps(
+ self.organizations_backend.list_parents(**self.request_params)
+ )
+
+ def create_account(self):
+ return json.dumps(
+ self.organizations_backend.create_account(**self.request_params)
+ )
+
+ def close_account(self):
+ return json.dumps(
+ self.organizations_backend.close_account(**self.request_params)
+ )
+
+ def describe_account(self):
+ return json.dumps(
+ self.organizations_backend.describe_account(**self.request_params)
+ )
+
+ def describe_create_account_status(self):
+ return json.dumps(
+ self.organizations_backend.describe_create_account_status(
+ **self.request_params
+ )
+ )
+
+ def list_create_account_status(self):
+ return json.dumps(
+ self.organizations_backend.list_create_account_status(**self.request_params)
+ )
+
+ def list_accounts(self):
+ max_results = self._get_int_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ accounts, next_token = self.organizations_backend.list_accounts(
+ max_results=max_results, next_token=next_token
+ )
+ response = {"Accounts": accounts}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_accounts_for_parent(self):
+ max_results = self._get_int_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ parent_id = self._get_param("ParentId")
+ accounts, next_token = self.organizations_backend.list_accounts_for_parent(
+ max_results=max_results, next_token=next_token, parent_id=parent_id
+ )
+ response = {"Accounts": accounts}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def move_account(self):
+ return json.dumps(
+ self.organizations_backend.move_account(**self.request_params)
+ )
+
+ def list_children(self):
+ return json.dumps(
+ self.organizations_backend.list_children(**self.request_params)
+ )
+
+ def create_policy(self):
+ return json.dumps(
+ self.organizations_backend.create_policy(**self.request_params)
+ )
+
+ def describe_policy(self):
+ return json.dumps(
+ self.organizations_backend.describe_policy(**self.request_params)
+ )
+
+ def update_policy(self):
+ return json.dumps(
+ self.organizations_backend.update_policy(**self.request_params)
+ )
+
+ def attach_policy(self):
+ return json.dumps(
+ self.organizations_backend.attach_policy(**self.request_params)
+ )
+
+ def list_policies(self):
+ return json.dumps(self.organizations_backend.list_policies())
+
+ def delete_policy(self):
+ self.organizations_backend.delete_policy(**self.request_params)
+ return json.dumps({})
+
+ def list_policies_for_target(self):
+ return json.dumps(
+ self.organizations_backend.list_policies_for_target(**self.request_params)
+ )
+
+ def list_targets_for_policy(self):
+ return json.dumps(
+ self.organizations_backend.list_targets_for_policy(**self.request_params)
+ )
+
+ def tag_resource(self):
+ return json.dumps(
+ self.organizations_backend.tag_resource(**self.request_params)
+ )
+
+ def list_tags_for_resource(self):
+ return json.dumps(
+ self.organizations_backend.list_tags_for_resource(**self.request_params)
+ )
+
+ def untag_resource(self):
+ return json.dumps(
+ self.organizations_backend.untag_resource(**self.request_params)
+ )
+
+ def enable_aws_service_access(self):
+ return json.dumps(
+ self.organizations_backend.enable_aws_service_access(**self.request_params)
+ )
+
+ def list_aws_service_access_for_organization(self):
+ return json.dumps(
+ self.organizations_backend.list_aws_service_access_for_organization()
+ )
+
+ def disable_aws_service_access(self):
+ return json.dumps(
+ self.organizations_backend.disable_aws_service_access(**self.request_params)
+ )
+
+ def register_delegated_administrator(self):
+ return json.dumps(
+ self.organizations_backend.register_delegated_administrator(
+ **self.request_params
+ )
+ )
+
+ def list_delegated_administrators(self):
+ return json.dumps(
+ self.organizations_backend.list_delegated_administrators(
+ **self.request_params
+ )
+ )
+
+ def list_delegated_services_for_account(self):
+ return json.dumps(
+ self.organizations_backend.list_delegated_services_for_account(
+ **self.request_params
+ )
+ )
+
+ def deregister_delegated_administrator(self):
+ return json.dumps(
+ self.organizations_backend.deregister_delegated_administrator(
+ **self.request_params
+ )
+ )
+
+ def enable_policy_type(self):
+ return json.dumps(
+ self.organizations_backend.enable_policy_type(**self.request_params)
+ )
+
+ def disable_policy_type(self):
+ return json.dumps(
+ self.organizations_backend.disable_policy_type(**self.request_params)
+ )
+
+ def detach_policy(self):
+ return json.dumps(
+ self.organizations_backend.detach_policy(**self.request_params)
+ )
+
+ def remove_account_from_organization(self):
+ return json.dumps(
+ self.organizations_backend.remove_account_from_organization(
+ **self.request_params
+ )
+ )
diff --git a/contrib/python/moto/py3/moto/organizations/urls.py b/contrib/python/moto/py3/moto/organizations/urls.py
new file mode 100644
index 0000000000..07c7ea3fac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/urls.py
@@ -0,0 +1,5 @@
+from .responses import OrganizationsResponse
+
+url_bases = [r"https?://organizations\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": OrganizationsResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/organizations/utils.py b/contrib/python/moto/py3/moto/organizations/utils.py
new file mode 100644
index 0000000000..3e9117cede
--- /dev/null
+++ b/contrib/python/moto/py3/moto/organizations/utils.py
@@ -0,0 +1,116 @@
+import random
+import re
+import string
+from moto.core import get_account_id
+
+
+MASTER_ACCOUNT_ID = get_account_id()
+MASTER_ACCOUNT_EMAIL = "master@example.com"
+DEFAULT_POLICY_ID = "p-FullAWSAccess"
+ORGANIZATION_ARN_FORMAT = "arn:aws:organizations::{0}:organization/{1}"
+MASTER_ACCOUNT_ARN_FORMAT = "arn:aws:organizations::{0}:account/{1}/{0}"
+ACCOUNT_ARN_FORMAT = "arn:aws:organizations::{0}:account/{1}/{2}"
+ROOT_ARN_FORMAT = "arn:aws:organizations::{0}:root/{1}/{2}"
+OU_ARN_FORMAT = "arn:aws:organizations::{0}:ou/{1}/{2}"
+SCP_ARN_FORMAT = "arn:aws:organizations::{0}:policy/{1}/service_control_policy/{2}"
+AI_POLICY_ARN_FORMAT = (
+ "arn:aws:organizations::{0}:policy/{1}/aiservices_opt_out_policy/{2}"
+)
+
+CHARSET = string.ascii_lowercase + string.digits
+ORG_ID_SIZE = 10
+ROOT_ID_SIZE = 4
+ACCOUNT_ID_SIZE = 12
+OU_ID_SUFFIX_SIZE = 8
+CREATE_ACCOUNT_STATUS_ID_SIZE = 8
+POLICY_ID_SIZE = 8
+
+EMAIL_REGEX = "^.+@[a-zA-Z0-9-.]+.[a-zA-Z]{2,3}|[0-9]{1,3}$"
+ORG_ID_REGEX = r"o-[a-z0-9]{%s}" % ORG_ID_SIZE
+ROOT_ID_REGEX = r"r-[a-z0-9]{%s}" % ROOT_ID_SIZE
+OU_ID_REGEX = r"ou-[a-z0-9]{%s}-[a-z0-9]{%s}" % (ROOT_ID_SIZE, OU_ID_SUFFIX_SIZE)
+ACCOUNT_ID_REGEX = r"[0-9]{%s}" % ACCOUNT_ID_SIZE
+CREATE_ACCOUNT_STATUS_ID_REGEX = r"car-[a-z0-9]{%s}" % CREATE_ACCOUNT_STATUS_ID_SIZE
+POLICY_ID_REGEX = r"%s|p-[a-z0-9]{%s}" % (DEFAULT_POLICY_ID, POLICY_ID_SIZE)
+
+PAGINATION_MODEL = {
+ "list_accounts": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "result_key": "Accounts",
+ "unique_attribute": "JoinedTimestamp",
+ },
+ "list_accounts_for_parent": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 20,
+ "result_key": "Accounts",
+ "unique_attribute": "JoinedTimestamp",
+ },
+ "list_organizational_units_for_parent": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 20,
+ "result_key": "OrganizationalUnits",
+ "unique_attribute": "Id",
+ },
+}
+
+
+def make_random_org_id():
+ # The regex pattern for an organization ID string requires "o-"
+ # followed by from 10 to 32 lower-case letters or digits.
+ # e.g. 'o-vipjnq5z86'
+ return "o-" + "".join(random.choice(CHARSET) for x in range(ORG_ID_SIZE))
+
+
+def make_random_root_id():
+ # The regex pattern for a root ID string requires "r-" followed by
+ # from 4 to 32 lower-case letters or digits.
+ # e.g. 'r-3zwx'
+ return "r-" + "".join(random.choice(CHARSET) for x in range(ROOT_ID_SIZE))
+
+
+def make_random_ou_id(root_id):
+ # The regex pattern for an organizational unit ID string requires "ou-"
+ # followed by from 4 to 32 lower-case letters or digits (the ID of the root
+ # that contains the OU) followed by a second "-" dash and from 8 to 32
+ # additional lower-case letters or digits.
+ # e.g. ou-g8sd-5oe3bjaw
+ return "-".join(
+ [
+ "ou",
+ root_id.partition("-")[2],
+ "".join(random.choice(CHARSET) for x in range(OU_ID_SUFFIX_SIZE)),
+ ]
+ )
+
+
+def make_random_account_id():
+ # The regex pattern for an account ID string requires exactly 12 digits.
+ # e.g. '488633172133'
+ return "".join([random.choice(string.digits) for n in range(ACCOUNT_ID_SIZE)])
+
+
+def make_random_create_account_status_id():
+ # The regex pattern for an create account request ID string requires
+ # "car-" followed by from 8 to 32 lower-case letters or digits.
+ # e.g. 'car-35gxzwrp'
+ return "car-" + "".join(
+ random.choice(CHARSET) for x in range(CREATE_ACCOUNT_STATUS_ID_SIZE)
+ )
+
+
+def make_random_policy_id():
+ # The regex pattern for a policy ID string requires "p-" followed by
+ # from 8 to 128 lower-case letters or digits.
+ # e.g. 'p-k2av4a8a'
+ return "p-" + "".join(random.choice(CHARSET) for x in range(POLICY_ID_SIZE))
+
+
+def fullmatch(regex, s, flags=0):
+ """Emulate python-3.4 re.fullmatch()."""
+ m = re.match(regex, s, flags=flags)
+ if m and m.span()[1] == len(s):
+ return m
diff --git a/contrib/python/moto/py3/moto/packages/__init__.py b/contrib/python/moto/py3/moto/packages/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/__init__.py
diff --git a/contrib/python/moto/py3/moto/packages/boto/__init__.py b/contrib/python/moto/py3/moto/packages/boto/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/__init__.py
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/__init__.py b/contrib/python/moto/py3/moto/packages/boto/ec2/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/__init__.py
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/blockdevicemapping.py b/contrib/python/moto/py3/moto/packages/boto/ec2/blockdevicemapping.py
new file mode 100644
index 0000000000..db85210ddd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/blockdevicemapping.py
@@ -0,0 +1,99 @@
+# Copyright (c) 2009-2012 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+#
+
+
+class BlockDeviceType(object):
+ """
+ Represents parameters for a block device.
+ """
+
+ def __init__(
+ self,
+ connection=None,
+ ephemeral_name=None,
+ no_device=False,
+ volume_id=None,
+ snapshot_id=None,
+ status=None,
+ attach_time=None,
+ delete_on_termination=False,
+ size=None,
+ volume_type=None,
+ iops=None,
+ encrypted=None,
+ ):
+ self.connection = connection
+ self.ephemeral_name = ephemeral_name
+ self.no_device = no_device
+ self.volume_id = volume_id
+ self.snapshot_id = snapshot_id
+ self.status = status
+ self.attach_time = attach_time
+ self.delete_on_termination = delete_on_termination
+ self.size = size
+ self.volume_type = volume_type
+ self.iops = iops
+ self.encrypted = encrypted
+ self.kms_key_id = None
+
+
+# for backwards compatibility
+EBSBlockDeviceType = BlockDeviceType
+
+
+class BlockDeviceMapping(dict):
+ """
+ Represents a collection of BlockDeviceTypes when creating ec2 instances.
+
+ Example:
+ dev_sda1 = BlockDeviceType()
+ dev_sda1.size = 100 # change root volume to 100GB instead of default
+ bdm = BlockDeviceMapping()
+ bdm['/dev/sda1'] = dev_sda1
+ reservation = image.run(..., block_device_map=bdm, ...)
+ """
+
+ def __init__(self, connection=None):
+ """
+ :type connection: :class:`boto.ec2.EC2Connection`
+ :param connection: Optional connection.
+ """
+ dict.__init__(self)
+ self.connection = connection
+ self.current_name = None
+ self.current_value = None
+
+ def to_source_dict(self):
+ return [
+ {
+ "DeviceName": device_name,
+ "Ebs": {
+ "DeleteOnTermination": block.delete_on_termination,
+ "Encrypted": block.encrypted,
+ "VolumeType": block.volume_type,
+ "VolumeSize": block.size,
+ },
+ "VirtualName": block.ephemeral_name,
+ }
+ for device_name, block in self.items()
+ ]
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/ec2object.py b/contrib/python/moto/py3/moto/packages/boto/ec2/ec2object.py
new file mode 100644
index 0000000000..0067f59ce8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/ec2object.py
@@ -0,0 +1,48 @@
+# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+"""
+Represents an EC2 Object
+"""
+from moto.packages.boto.ec2.tag import TagSet
+
+
+class EC2Object(object):
+ def __init__(self, connection=None):
+ self.connection = connection
+ self.region = None
+
+
+class TaggedEC2Object(EC2Object):
+ """
+ Any EC2 resource that can be tagged should be represented
+ by a Python object that subclasses this class. This class
+ has the mechanism in place to handle the tagSet element in
+ the Describe* responses. If tags are found, it will create
+ a TagSet object and allow it to parse and collect the tags
+ into a dict that is stored in the "tags" attribute of the
+ object.
+ """
+
+ def __init__(self, connection=None):
+ super(TaggedEC2Object, self).__init__(connection)
+ self.tags = TagSet()
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/image.py b/contrib/python/moto/py3/moto/packages/boto/ec2/image.py
new file mode 100644
index 0000000000..b1fba4197d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/image.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+
+class ProductCodes(list):
+ pass
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/instance.py b/contrib/python/moto/py3/moto/packages/boto/ec2/instance.py
new file mode 100644
index 0000000000..0bda6691f7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/instance.py
@@ -0,0 +1,217 @@
+# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+"""
+Represents an EC2 Instance
+"""
+from moto.packages.boto.ec2.ec2object import EC2Object, TaggedEC2Object
+from moto.packages.boto.ec2.image import ProductCodes
+
+
+class InstanceState(object):
+ """
+ The state of the instance.
+
+ :ivar code: The low byte represents the state. The high byte is an
+ opaque internal value and should be ignored. Valid values:
+
+ * 0 (pending)
+ * 16 (running)
+ * 32 (shutting-down)
+ * 48 (terminated)
+ * 64 (stopping)
+ * 80 (stopped)
+
+ :ivar name: The name of the state of the instance. Valid values:
+
+ * "pending"
+ * "running"
+ * "shutting-down"
+ * "terminated"
+ * "stopping"
+ * "stopped"
+ """
+
+ def __init__(self, code=0, name=None):
+ self.code = code
+ self.name = name
+
+ def __repr__(self):
+ return "%s(%d)" % (self.name, self.code)
+
+
+class InstancePlacement(object):
+ """
+ The location where the instance launched.
+
+ :ivar zone: The Availability Zone of the instance.
+ :ivar group_name: The name of the placement group the instance is
+ in (for cluster compute instances).
+ :ivar tenancy: The tenancy of the instance (if the instance is
+ running within a VPC). An instance with a tenancy of dedicated
+ runs on single-tenant hardware.
+ """
+
+ def __init__(self, zone=None, group_name=None, tenancy=None):
+ self.zone = zone
+ self.group_name = group_name
+ self.tenancy = tenancy
+
+ def __repr__(self):
+ return self.zone
+
+
+class Reservation(EC2Object):
+ """
+ Represents a Reservation response object.
+
+ :ivar id: The unique ID of the Reservation.
+ :ivar owner_id: The unique ID of the owner of the Reservation.
+ :ivar groups: A list of Group objects representing the security
+ groups associated with launched instances.
+ :ivar instances: A list of Instance objects launched in this
+ Reservation.
+ """
+
+ def __init__(self, connection=None):
+ super(Reservation, self).__init__(connection)
+ self.id = None
+ self.owner_id = None
+ self.groups = []
+ self.instances = []
+
+ def __repr__(self):
+ return "Reservation:%s" % self.id
+
+
+class Instance(TaggedEC2Object):
+ """
+ Represents an instance.
+
+ :ivar id: The unique ID of the Instance.
+ :ivar groups: A list of Group objects representing the security
+ groups associated with the instance.
+ :ivar public_dns_name: The public dns name of the instance.
+ :ivar private_dns_name: The private dns name of the instance.
+ :ivar state: The string representation of the instance's current state.
+ :ivar state_code: An integer representation of the instance's
+ current state.
+ :ivar previous_state: The string representation of the instance's
+ previous state.
+ :ivar previous_state_code: An integer representation of the
+ instance's current state.
+ :ivar key_name: The name of the SSH key associated with the instance.
+ :ivar instance_type: The type of instance (e.g. m1.small).
+ :ivar launch_time: The time the instance was launched.
+ :ivar image_id: The ID of the AMI used to launch this instance.
+ :ivar placement: The availability zone in which the instance is running.
+ :ivar placement_group: The name of the placement group the instance
+ is in (for cluster compute instances).
+ :ivar placement_tenancy: The tenancy of the instance, if the instance
+ is running within a VPC. An instance with a tenancy of dedicated
+ runs on a single-tenant hardware.
+ :ivar kernel: The kernel associated with the instance.
+ :ivar ramdisk: The ramdisk associated with the instance.
+ :ivar architecture: The architecture of the image (i386|x86_64).
+ :ivar hypervisor: The hypervisor used.
+ :ivar virtualization_type: The type of virtualization used.
+ :ivar product_codes: A list of product codes associated with this instance.
+ :ivar ami_launch_index: This instances position within it's launch group.
+ :ivar monitored: A boolean indicating whether monitoring is enabled or not.
+ :ivar monitoring_state: A string value that contains the actual value
+ of the monitoring element returned by EC2.
+ :ivar spot_instance_request_id: The ID of the spot instance request
+ if this is a spot instance.
+ :ivar subnet_id: The VPC Subnet ID, if running in VPC.
+ :ivar vpc_id: The VPC ID, if running in VPC.
+ :ivar private_ip_address: The private IP address of the instance.
+ :ivar ip_address: The public IP address of the instance.
+ :ivar platform: Platform of the instance (e.g. Windows)
+ :ivar root_device_name: The name of the root device.
+ :ivar root_device_type: The root device type (ebs|instance-store).
+ :ivar block_device_mapping: The Block Device Mapping for the instance.
+ :ivar state_reason: The reason for the most recent state transition.
+ :ivar interfaces: List of Elastic Network Interfaces associated with
+ this instance.
+ :ivar ebs_optimized: Whether instance is using optimized EBS volumes
+ or not.
+ :ivar instance_profile: A Python dict containing the instance
+ profile id and arn associated with this instance.
+ """
+
+ def __init__(self, connection=None):
+ super(Instance, self).__init__(connection)
+ self.id = None
+ self.dns_name = None
+ self.public_dns_name = None
+ self.private_dns_name = None
+ self.key_name = None
+ self.instance_type = None
+ self.launch_time = None
+ self.image_id = None
+ self.kernel = None
+ self.ramdisk = None
+ self.product_codes = ProductCodes()
+ self.ami_launch_index = None
+ self.monitored = False
+ self.monitoring_state = None
+ self.spot_instance_request_id = None
+ self.subnet_id = None
+ self.lifecycle = None
+ self.private_ip_address = None
+ self.ip_address = None
+ self.requester_id = None
+ self._in_monitoring_element = False
+ self.persistent = False
+ self.root_device_name = None
+ self.root_device_type = None
+ self.block_device_mapping = None
+ self.state_reason = None
+ self.group_name = None
+ self.client_token = None
+ self.eventsSet = None
+ self.groups = []
+ self.platform = None
+ self.interfaces = []
+ self.hypervisor = None
+ self.virtualization_type = None
+ self.architecture = None
+ self.instance_profile = None
+ self._previous_state = None
+ self._state = InstanceState()
+ self._placement = InstancePlacement()
+
+ def __repr__(self):
+ return "Instance:%s" % self.id
+
+ @property
+ def state(self):
+ return self._state.name
+
+ @property
+ def state_code(self):
+ return self._state.code
+
+ @property
+ def placement(self):
+ return self._placement.zone
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/instancetype.py b/contrib/python/moto/py3/moto/packages/boto/ec2/instancetype.py
new file mode 100644
index 0000000000..a84e4879e6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/instancetype.py
@@ -0,0 +1,50 @@
+# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+
+from moto.packages.boto.ec2.ec2object import EC2Object
+
+
+class InstanceType(EC2Object):
+ """
+ Represents an EC2 VM Type
+
+ :ivar name: The name of the vm type
+ :ivar cores: The number of cpu cores for this vm type
+ :ivar memory: The amount of memory in megabytes for this vm type
+ :ivar disk: The amount of disk space in gigabytes for this vm type
+ """
+
+ def __init__(self, connection=None, name=None, cores=None, memory=None, disk=None):
+ super(InstanceType, self).__init__(connection)
+ self.connection = connection
+ self.name = name
+ self.cores = cores
+ self.memory = memory
+ self.disk = disk
+
+ def __repr__(self):
+ return "InstanceType:%s-%s,%s,%s" % (
+ self.name,
+ self.cores,
+ self.memory,
+ self.disk,
+ )
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/launchspecification.py b/contrib/python/moto/py3/moto/packages/boto/ec2/launchspecification.py
new file mode 100644
index 0000000000..a667063bbf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/launchspecification.py
@@ -0,0 +1,49 @@
+# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+"""
+Represents a launch specification for Spot instances.
+"""
+
+from moto.packages.boto.ec2.ec2object import EC2Object
+
+
+class LaunchSpecification(EC2Object):
+ def __init__(self, connection=None):
+ super(LaunchSpecification, self).__init__(connection)
+ self.key_name = None
+ self.instance_type = None
+ self.image_id = None
+ self.groups = []
+ self.placement = None
+ self.kernel = None
+ self.ramdisk = None
+ self.monitored = False
+ self.subnet_id = None
+ self.lifecycle = None
+ self._in_monitoring_element = False
+ self.block_device_mapping = None
+ self.instance_profile = None
+ self.ebs_optimized = False
+
+ def __repr__(self):
+ return "LaunchSpecification(%s)" % self.image_id
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/spotinstancerequest.py b/contrib/python/moto/py3/moto/packages/boto/ec2/spotinstancerequest.py
new file mode 100644
index 0000000000..c8630e74ab
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/spotinstancerequest.py
@@ -0,0 +1,85 @@
+# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+"""
+Represents an EC2 Spot Instance Request
+"""
+
+from moto.packages.boto.ec2.ec2object import TaggedEC2Object
+
+
+class SpotInstanceRequest(TaggedEC2Object):
+ """
+
+ :ivar id: The ID of the Spot Instance Request.
+ :ivar price: The maximum hourly price for any Spot Instance launched to
+ fulfill the request.
+ :ivar type: The Spot Instance request type.
+ :ivar state: The state of the Spot Instance request.
+ :ivar fault: The fault codes for the Spot Instance request, if any.
+ :ivar valid_from: The start date of the request. If this is a one-time
+ request, the request becomes active at this date and time and remains
+ active until all instances launch, the request expires, or the request is
+ canceled. If the request is persistent, the request becomes active at this
+ date and time and remains active until it expires or is canceled.
+ :ivar valid_until: The end date of the request. If this is a one-time
+ request, the request remains active until all instances launch, the request
+ is canceled, or this date is reached. If the request is persistent, it
+ remains active until it is canceled or this date is reached.
+ :ivar launch_group: The instance launch group. Launch groups are Spot
+ Instances that launch together and terminate together.
+ :ivar launched_availability_zone: foo
+ :ivar product_description: The Availability Zone in which the bid is
+ launched.
+ :ivar availability_zone_group: The Availability Zone group. If you specify
+ the same Availability Zone group for all Spot Instance requests, all Spot
+ Instances are launched in the same Availability Zone.
+ :ivar create_time: The time stamp when the Spot Instance request was
+ created.
+ :ivar launch_specification: Additional information for launching instances.
+ :ivar instance_id: The instance ID, if an instance has been launched to
+ fulfill the Spot Instance request.
+ :ivar status: The status code and status message describing the Spot
+ Instance request.
+
+ """
+
+ def __init__(self, connection=None):
+ super(SpotInstanceRequest, self).__init__(connection)
+ self.id = None
+ self.price = None
+ self.type = None
+ self.state = None
+ self.fault = None
+ self.valid_from = None
+ self.valid_until = None
+ self.launch_group = None
+ self.launched_availability_zone = None
+ self.product_description = None
+ self.availability_zone_group = None
+ self.create_time = None
+ self.launch_specification = None
+ self.instance_id = None
+ self.status = None
+
+ def __repr__(self):
+ return "SpotInstanceRequest:%s" % self.id
diff --git a/contrib/python/moto/py3/moto/packages/boto/ec2/tag.py b/contrib/python/moto/py3/moto/packages/boto/ec2/tag.py
new file mode 100644
index 0000000000..9f5c2ef889
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/boto/ec2/tag.py
@@ -0,0 +1,35 @@
+# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+
+class TagSet(dict):
+ """
+ A TagSet is used to collect the tags associated with a particular
+ EC2 resource. Not all resources can be tagged but for those that
+ can, this dict object will be used to collect those values. See
+ :class:`boto.ec2.ec2object.TaggedEC2Object` for more details.
+ """
+
+ def __init__(self, connection=None):
+ self.connection = connection
+ self._current_key = None
+ self._current_value = None
diff --git a/contrib/python/moto/py3/moto/packages/cfnresponse/__init__.py b/contrib/python/moto/py3/moto/packages/cfnresponse/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/cfnresponse/__init__.py
diff --git a/contrib/python/moto/py3/moto/packages/cfnresponse/cfnresponse.py b/contrib/python/moto/py3/moto/packages/cfnresponse/cfnresponse.py
new file mode 100644
index 0000000000..151bc8a213
--- /dev/null
+++ b/contrib/python/moto/py3/moto/packages/cfnresponse/cfnresponse.py
@@ -0,0 +1,59 @@
+# Sourced from https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html
+# 01/Nov/2021
+
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+# SPDX-License-Identifier: MIT-0
+
+from __future__ import print_function
+import urllib3
+import json
+
+SUCCESS = "SUCCESS"
+FAILED = "FAILED"
+
+http = urllib3.PoolManager()
+
+
+def send(
+ event,
+ context,
+ responseStatus,
+ responseData,
+ physicalResourceId=None,
+ noEcho=False,
+ reason=None,
+):
+ responseUrl = event["ResponseURL"]
+
+ print(responseUrl)
+
+ responseBody = {
+ "Status": responseStatus,
+ "Reason": reason
+ or "See the details in CloudWatch Log Stream: {}".format(
+ context.log_stream_name
+ ),
+ "PhysicalResourceId": physicalResourceId or context.log_stream_name,
+ "StackId": event["StackId"],
+ "RequestId": event["RequestId"],
+ "LogicalResourceId": event["LogicalResourceId"],
+ "NoEcho": noEcho,
+ "Data": responseData,
+ }
+
+ json_responseBody = json.dumps(responseBody)
+
+ print("Response body:")
+ print(json_responseBody)
+
+ headers = {"content-type": "", "content-length": str(len(json_responseBody))}
+
+ try:
+ response = http.request(
+ "PUT", responseUrl, headers=headers, body=json_responseBody
+ )
+ print("Status code:", response.status)
+
+ except Exception as e:
+
+ print("send(..) failed executing http.request(..):", e)
diff --git a/contrib/python/moto/py3/moto/pinpoint/__init__.py b/contrib/python/moto/py3/moto/pinpoint/__init__.py
new file mode 100644
index 0000000000..106031bed7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/pinpoint/__init__.py
@@ -0,0 +1,5 @@
+"""pinpoint module initialization; sets value for base decorator."""
+from .models import pinpoint_backends
+from ..core.models import base_decorator
+
+mock_pinpoint = base_decorator(pinpoint_backends)
diff --git a/contrib/python/moto/py3/moto/pinpoint/exceptions.py b/contrib/python/moto/py3/moto/pinpoint/exceptions.py
new file mode 100644
index 0000000000..4deebe3595
--- /dev/null
+++ b/contrib/python/moto/py3/moto/pinpoint/exceptions.py
@@ -0,0 +1,20 @@
+"""Exceptions raised by the pinpoint service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class PinpointExceptions(JsonRESTError):
+ pass
+
+
+class ApplicationNotFound(PinpointExceptions):
+ code = 404
+
+ def __init__(self):
+ super().__init__("NotFoundException", "Application not found")
+
+
+class EventStreamNotFound(PinpointExceptions):
+ code = 404
+
+ def __init__(self):
+ super().__init__("NotFoundException", "Resource not found")
diff --git a/contrib/python/moto/py3/moto/pinpoint/models.py b/contrib/python/moto/py3/moto/pinpoint/models.py
new file mode 100644
index 0000000000..1149f6ff84
--- /dev/null
+++ b/contrib/python/moto/py3/moto/pinpoint/models.py
@@ -0,0 +1,147 @@
+from datetime import datetime
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from moto.utilities.tagging_service import TaggingService
+from uuid import uuid4
+
+from .exceptions import ApplicationNotFound, EventStreamNotFound
+
+
+class App(BaseModel):
+ def __init__(self, name):
+ self.application_id = str(uuid4()).replace("-", "")
+ self.arn = f"arn:aws:mobiletargeting:us-east-1:{get_account_id()}:apps/{self.application_id}"
+ self.name = name
+ self.created = unix_time()
+ self.settings = AppSettings()
+ self.event_stream = None
+
+ def get_settings(self):
+ return self.settings
+
+ def update_settings(self, settings):
+ self.settings.update(settings)
+ return self.settings
+
+ def delete_event_stream(self):
+ stream = self.event_stream
+ self.event_stream = None
+ return stream
+
+ def get_event_stream(self):
+ if self.event_stream is None:
+ raise EventStreamNotFound()
+ return self.event_stream
+
+ def put_event_stream(self, stream_arn, role_arn):
+ self.event_stream = EventStream(stream_arn, role_arn)
+ return self.event_stream
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "Id": self.application_id,
+ "Name": self.name,
+ "CreationDate": self.created,
+ }
+
+
+class AppSettings(BaseModel):
+ def __init__(self):
+ self.settings = dict()
+ self.last_modified = unix_time()
+
+ def update(self, settings):
+ self.settings = settings
+ self.last_modified = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")
+
+ def to_json(self):
+ return {
+ "CampaignHook": self.settings.get("CampaignHook", {}),
+ "CloudWatchMetricsEnabled": self.settings.get(
+ "CloudWatchMetricsEnabled", False
+ ),
+ "LastModifiedDate": self.last_modified,
+ "Limits": self.settings.get("Limits", {}),
+ "QuietTime": self.settings.get("QuietTime", {}),
+ }
+
+
+class EventStream(BaseModel):
+ def __init__(self, stream_arn, role_arn):
+ self.stream_arn = stream_arn
+ self.role_arn = role_arn
+ self.last_modified = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")
+
+ def to_json(self):
+ return {
+ "DestinationStreamArn": self.stream_arn,
+ "RoleArn": self.role_arn,
+ "LastModifiedDate": self.last_modified,
+ }
+
+
+class PinpointBackend(BaseBackend):
+ """Implementation of Pinpoint APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.apps = {}
+ self.tagger = TaggingService()
+
+ def create_app(self, name, tags):
+ app = App(name)
+ self.apps[app.application_id] = app
+ tags = self.tagger.convert_dict_to_tags_input(tags)
+ self.tagger.tag_resource(app.arn, tags)
+ return app
+
+ def delete_app(self, application_id):
+ self.get_app(application_id)
+ return self.apps.pop(application_id)
+
+ def get_app(self, application_id):
+ if application_id not in self.apps:
+ raise ApplicationNotFound()
+ return self.apps[application_id]
+
+ def get_apps(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.apps.values()
+
+ def update_application_settings(self, application_id, settings):
+ app = self.get_app(application_id)
+ return app.update_settings(settings)
+
+ def get_application_settings(self, application_id):
+ app = self.get_app(application_id)
+ return app.get_settings()
+
+ def list_tags_for_resource(self, resource_arn):
+ tags = self.tagger.get_tag_dict_for_resource(resource_arn)
+ return {"tags": tags}
+
+ def tag_resource(self, resource_arn, tags):
+ tags = TaggingService.convert_dict_to_tags_input(tags)
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+ return
+
+ def put_event_stream(self, application_id, stream_arn, role_arn):
+ app = self.get_app(application_id)
+ return app.put_event_stream(stream_arn, role_arn)
+
+ def get_event_stream(self, application_id):
+ app = self.get_app(application_id)
+ return app.get_event_stream()
+
+ def delete_event_stream(self, application_id):
+ app = self.get_app(application_id)
+ return app.delete_event_stream()
+
+
+pinpoint_backends = BackendDict(PinpointBackend, "pinpoint")
diff --git a/contrib/python/moto/py3/moto/pinpoint/responses.py b/contrib/python/moto/py3/moto/pinpoint/responses.py
new file mode 100644
index 0000000000..3d6b1aa3db
--- /dev/null
+++ b/contrib/python/moto/py3/moto/pinpoint/responses.py
@@ -0,0 +1,144 @@
+"""Handles incoming pinpoint requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from urllib.parse import unquote
+from .models import pinpoint_backends
+
+
+class PinpointResponse(BaseResponse):
+ """Handler for Pinpoint requests and responses."""
+
+ @property
+ def pinpoint_backend(self):
+ """Return backend instance specific for this region."""
+ return pinpoint_backends[self.region]
+
+ def app(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self.delete_app()
+ if request.method == "GET":
+ return self.get_app()
+
+ def apps(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_apps()
+ if request.method == "POST":
+ return self.create_app()
+
+ def app_settings(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.get_application_settings()
+ if request.method == "PUT":
+ return self.update_application_settings()
+
+ def eventstream(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self.delete_event_stream()
+ if request.method == "GET":
+ return self.get_event_stream()
+ if request.method == "POST":
+ return self.put_event_stream()
+
+ def tags(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "DELETE":
+ return self.untag_resource()
+ if request.method == "GET":
+ return self.list_tags_for_resource()
+ if request.method == "POST":
+ return self.tag_resource()
+
+ def create_app(self):
+ params = json.loads(self.body)
+ name = params.get("Name")
+ tags = params.get("tags", {})
+ app = self.pinpoint_backend.create_app(name=name, tags=tags)
+ return 201, {}, json.dumps(app.to_json())
+
+ def delete_app(self):
+ application_id = self.path.split("/")[-1]
+ app = self.pinpoint_backend.delete_app(application_id=application_id)
+ return 200, {}, json.dumps(app.to_json())
+
+ def get_app(self):
+ application_id = self.path.split("/")[-1]
+ app = self.pinpoint_backend.get_app(application_id=application_id)
+ return 200, {}, json.dumps(app.to_json())
+
+ def get_apps(self):
+ apps = self.pinpoint_backend.get_apps()
+ resp = {"Item": [a.to_json() for a in apps]}
+ return 200, {}, json.dumps(resp)
+
+ def update_application_settings(self):
+ application_id = self.path.split("/")[-2]
+ settings = json.loads(self.body)
+ app_settings = self.pinpoint_backend.update_application_settings(
+ application_id=application_id, settings=settings
+ )
+ app_settings = app_settings.to_json()
+ app_settings["ApplicationId"] = application_id
+ return 200, {}, json.dumps(app_settings)
+
+ def get_application_settings(self):
+ application_id = self.path.split("/")[-2]
+ app_settings = self.pinpoint_backend.get_application_settings(
+ application_id=application_id
+ )
+ app_settings = app_settings.to_json()
+ app_settings["ApplicationId"] = application_id
+ return 200, {}, json.dumps(app_settings)
+
+ def list_tags_for_resource(self):
+ resource_arn = unquote(self.path).split("/tags/")[-1]
+ tags = self.pinpoint_backend.list_tags_for_resource(resource_arn=resource_arn)
+ return 200, {}, json.dumps(tags)
+
+ def tag_resource(self):
+ resource_arn = unquote(self.path).split("/tags/")[-1]
+ tags = json.loads(self.body).get("tags", {})
+ self.pinpoint_backend.tag_resource(resource_arn=resource_arn, tags=tags)
+ return 200, {}, "{}"
+
+ def untag_resource(self):
+ resource_arn = unquote(self.path).split("/tags/")[-1]
+ tag_keys = self.querystring.get("tagKeys")
+ self.pinpoint_backend.untag_resource(
+ resource_arn=resource_arn, tag_keys=tag_keys
+ )
+ return 200, {}, "{}"
+
+ def put_event_stream(self):
+ application_id = self.path.split("/")[-2]
+ params = json.loads(self.body)
+ stream_arn = params.get("DestinationStreamArn")
+ role_arn = params.get("RoleArn")
+ event_stream = self.pinpoint_backend.put_event_stream(
+ application_id=application_id, stream_arn=stream_arn, role_arn=role_arn
+ )
+ resp = event_stream.to_json()
+ resp["ApplicationId"] = application_id
+ return 200, {}, json.dumps(resp)
+
+ def get_event_stream(self):
+ application_id = self.path.split("/")[-2]
+ event_stream = self.pinpoint_backend.get_event_stream(
+ application_id=application_id
+ )
+ resp = event_stream.to_json()
+ resp["ApplicationId"] = application_id
+ return 200, {}, json.dumps(resp)
+
+ def delete_event_stream(self):
+ application_id = self.path.split("/")[-2]
+ event_stream = self.pinpoint_backend.delete_event_stream(
+ application_id=application_id
+ )
+ resp = event_stream.to_json()
+ resp["ApplicationId"] = application_id
+ return 200, {}, json.dumps(resp)
diff --git a/contrib/python/moto/py3/moto/pinpoint/urls.py b/contrib/python/moto/py3/moto/pinpoint/urls.py
new file mode 100644
index 0000000000..58e801af50
--- /dev/null
+++ b/contrib/python/moto/py3/moto/pinpoint/urls.py
@@ -0,0 +1,18 @@
+"""pinpoint base URL and path."""
+from .responses import PinpointResponse
+
+url_bases = [
+ r"https?://pinpoint\.(.+)\.amazonaws\.com",
+]
+
+
+response = PinpointResponse()
+
+
+url_paths = {
+ "{0}/v1/apps$": response.apps,
+ "{0}/v1/apps/(?P<app_id>[^/]+)$": response.app,
+ "{0}/v1/apps/(?P<app_id>[^/]+)/eventstream": response.eventstream,
+ "{0}/v1/apps/(?P<app_id>[^/]+)/settings$": response.app_settings,
+ "{0}/v1/tags/(?P<app_arn>.+)$": response.tags,
+}
diff --git a/contrib/python/moto/py3/moto/polly/__init__.py b/contrib/python/moto/py3/moto/polly/__init__.py
new file mode 100644
index 0000000000..3bce14d129
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/__init__.py
@@ -0,0 +1,5 @@
+from .models import polly_backends
+from ..core.models import base_decorator
+
+polly_backend = polly_backends["us-east-1"]
+mock_polly = base_decorator(polly_backends)
diff --git a/contrib/python/moto/py3/moto/polly/models.py b/contrib/python/moto/py3/moto/polly/models.py
new file mode 100644
index 0000000000..1e4ad64ba5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/models.py
@@ -0,0 +1,114 @@
+from xml.etree import ElementTree as ET
+import datetime
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .resources import VOICE_DATA
+from .utils import make_arn_for_lexicon
+
+from moto.core import get_account_id
+
+
+class Lexicon(BaseModel):
+ def __init__(self, name, content, region_name):
+ self.name = name
+ self.content = content
+ self.size = 0
+ self.alphabet = None
+ self.last_modified = None
+ self.language_code = None
+ self.lexemes_count = 0
+ self.arn = make_arn_for_lexicon(get_account_id(), name, region_name)
+
+ self.update()
+
+ def update(self, content=None):
+ if content is not None:
+ self.content = content
+
+ # Probably a very naive approach, but it'll do for now.
+ try:
+ root = ET.fromstring(self.content)
+ self.size = len(self.content)
+ self.last_modified = int(
+ (
+ datetime.datetime.now() - datetime.datetime(1970, 1, 1)
+ ).total_seconds()
+ )
+ self.lexemes_count = len(root.findall("."))
+
+ for key, value in root.attrib.items():
+ if key.endswith("alphabet"):
+ self.alphabet = value
+ elif key.endswith("lang"):
+ self.language_code = value
+
+ except Exception as err:
+ raise ValueError("Failure parsing XML: {0}".format(err))
+
+ def to_dict(self):
+ return {
+ "Attributes": {
+ "Alphabet": self.alphabet,
+ "LanguageCode": self.language_code,
+ "LastModified": self.last_modified,
+ "LexemesCount": self.lexemes_count,
+ "LexiconArn": self.arn,
+ "Size": self.size,
+ }
+ }
+
+ def __repr__(self):
+ return "<Lexicon {0}>".format(self.name)
+
+
+class PollyBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._lexicons = {}
+
+ def describe_voices(self, language_code):
+ """
+ Pagination is not yet implemented
+ """
+ if language_code is None:
+ return VOICE_DATA
+
+ return [item for item in VOICE_DATA if item["LanguageCode"] == language_code]
+
+ def delete_lexicon(self, name):
+ # implement here
+ del self._lexicons[name]
+
+ def get_lexicon(self, name):
+ # Raises KeyError
+ return self._lexicons[name]
+
+ def list_lexicons(self):
+ """
+ Pagination is not yet implemented
+ """
+
+ result = []
+
+ for name, lexicon in self._lexicons.items():
+ lexicon_dict = lexicon.to_dict()
+ lexicon_dict["Name"] = name
+
+ result.append(lexicon_dict)
+
+ return result
+
+ def put_lexicon(self, name, content):
+ # If lexicon content is bad, it will raise ValueError
+ if name in self._lexicons:
+ # Regenerated all the stats from the XML
+ # but keeps the ARN
+ self._lexicons.update(content)
+ else:
+ lexicon = Lexicon(name, content, region_name=self.region_name)
+ self._lexicons[name] = lexicon
+
+
+polly_backends = BackendDict(PollyBackend, "polly")
diff --git a/contrib/python/moto/py3/moto/polly/resources.py b/contrib/python/moto/py3/moto/polly/resources.py
new file mode 100644
index 0000000000..560e62b7bc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/resources.py
@@ -0,0 +1,418 @@
+# -*- coding: utf-8 -*-
+
+VOICE_DATA = [
+ {
+ "Id": "Joanna",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Female",
+ "Name": "Joanna",
+ },
+ {
+ "Id": "Mizuki",
+ "LanguageCode": "ja-JP",
+ "LanguageName": "Japanese",
+ "Gender": "Female",
+ "Name": "Mizuki",
+ },
+ {
+ "Id": "Filiz",
+ "LanguageCode": "tr-TR",
+ "LanguageName": "Turkish",
+ "Gender": "Female",
+ "Name": "Filiz",
+ },
+ {
+ "Id": "Astrid",
+ "LanguageCode": "sv-SE",
+ "LanguageName": "Swedish",
+ "Gender": "Female",
+ "Name": "Astrid",
+ },
+ {
+ "Id": "Tatyana",
+ "LanguageCode": "ru-RU",
+ "LanguageName": "Russian",
+ "Gender": "Female",
+ "Name": "Tatyana",
+ },
+ {
+ "Id": "Maxim",
+ "LanguageCode": "ru-RU",
+ "LanguageName": "Russian",
+ "Gender": "Male",
+ "Name": "Maxim",
+ },
+ {
+ "Id": "Carmen",
+ "LanguageCode": "ro-RO",
+ "LanguageName": "Romanian",
+ "Gender": "Female",
+ "Name": "Carmen",
+ },
+ {
+ "Id": "Ines",
+ "LanguageCode": "pt-PT",
+ "LanguageName": "Portuguese",
+ "Gender": "Female",
+ "Name": "Inês",
+ },
+ {
+ "Id": "Cristiano",
+ "LanguageCode": "pt-PT",
+ "LanguageName": "Portuguese",
+ "Gender": "Male",
+ "Name": "Cristiano",
+ },
+ {
+ "Id": "Vitoria",
+ "LanguageCode": "pt-BR",
+ "LanguageName": "Brazilian Portuguese",
+ "Gender": "Female",
+ "Name": "Vitória",
+ },
+ {
+ "Id": "Ricardo",
+ "LanguageCode": "pt-BR",
+ "LanguageName": "Brazilian Portuguese",
+ "Gender": "Male",
+ "Name": "Ricardo",
+ },
+ {
+ "Id": "Maja",
+ "LanguageCode": "pl-PL",
+ "LanguageName": "Polish",
+ "Gender": "Female",
+ "Name": "Maja",
+ },
+ {
+ "Id": "Jan",
+ "LanguageCode": "pl-PL",
+ "LanguageName": "Polish",
+ "Gender": "Male",
+ "Name": "Jan",
+ },
+ {
+ "Id": "Ewa",
+ "LanguageCode": "pl-PL",
+ "LanguageName": "Polish",
+ "Gender": "Female",
+ "Name": "Ewa",
+ },
+ {
+ "Id": "Ruben",
+ "LanguageCode": "nl-NL",
+ "LanguageName": "Dutch",
+ "Gender": "Male",
+ "Name": "Ruben",
+ },
+ {
+ "Id": "Lotte",
+ "LanguageCode": "nl-NL",
+ "LanguageName": "Dutch",
+ "Gender": "Female",
+ "Name": "Lotte",
+ },
+ {
+ "Id": "Liv",
+ "LanguageCode": "nb-NO",
+ "LanguageName": "Norwegian",
+ "Gender": "Female",
+ "Name": "Liv",
+ },
+ {
+ "Id": "Giorgio",
+ "LanguageCode": "it-IT",
+ "LanguageName": "Italian",
+ "Gender": "Male",
+ "Name": "Giorgio",
+ },
+ {
+ "Id": "Carla",
+ "LanguageCode": "it-IT",
+ "LanguageName": "Italian",
+ "Gender": "Female",
+ "Name": "Carla",
+ },
+ {
+ "Id": "Karl",
+ "LanguageCode": "is-IS",
+ "LanguageName": "Icelandic",
+ "Gender": "Male",
+ "Name": "Karl",
+ },
+ {
+ "Id": "Dora",
+ "LanguageCode": "is-IS",
+ "LanguageName": "Icelandic",
+ "Gender": "Female",
+ "Name": "Dóra",
+ },
+ {
+ "Id": "Mathieu",
+ "LanguageCode": "fr-FR",
+ "LanguageName": "French",
+ "Gender": "Male",
+ "Name": "Mathieu",
+ },
+ {
+ "Id": "Celine",
+ "LanguageCode": "fr-FR",
+ "LanguageName": "French",
+ "Gender": "Female",
+ "Name": "Céline",
+ },
+ {
+ "Id": "Chantal",
+ "LanguageCode": "fr-CA",
+ "LanguageName": "Canadian French",
+ "Gender": "Female",
+ "Name": "Chantal",
+ },
+ {
+ "Id": "Penelope",
+ "LanguageCode": "es-US",
+ "LanguageName": "US Spanish",
+ "Gender": "Female",
+ "Name": "Penélope",
+ },
+ {
+ "Id": "Miguel",
+ "LanguageCode": "es-US",
+ "LanguageName": "US Spanish",
+ "Gender": "Male",
+ "Name": "Miguel",
+ },
+ {
+ "Id": "Enrique",
+ "LanguageCode": "es-ES",
+ "LanguageName": "Castilian Spanish",
+ "Gender": "Male",
+ "Name": "Enrique",
+ },
+ {
+ "Id": "Conchita",
+ "LanguageCode": "es-ES",
+ "LanguageName": "Castilian Spanish",
+ "Gender": "Female",
+ "Name": "Conchita",
+ },
+ {
+ "Id": "Geraint",
+ "LanguageCode": "en-GB-WLS",
+ "LanguageName": "Welsh English",
+ "Gender": "Male",
+ "Name": "Geraint",
+ },
+ {
+ "Id": "Salli",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Female",
+ "Name": "Salli",
+ },
+ {
+ "Id": "Kimberly",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Female",
+ "Name": "Kimberly",
+ },
+ {
+ "Id": "Kendra",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Female",
+ "Name": "Kendra",
+ },
+ {
+ "Id": "Justin",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Male",
+ "Name": "Justin",
+ },
+ {
+ "Id": "Joey",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Male",
+ "Name": "Joey",
+ },
+ {
+ "Id": "Ivy",
+ "LanguageCode": "en-US",
+ "LanguageName": "US English",
+ "Gender": "Female",
+ "Name": "Ivy",
+ },
+ {
+ "Id": "Raveena",
+ "LanguageCode": "en-IN",
+ "LanguageName": "Indian English",
+ "Gender": "Female",
+ "Name": "Raveena",
+ },
+ {
+ "Id": "Emma",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Gender": "Female",
+ "Name": "Emma",
+ },
+ {
+ "Id": "Brian",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Gender": "Male",
+ "Name": "Brian",
+ },
+ {
+ "Id": "Amy",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Gender": "Female",
+ "Name": "Amy",
+ },
+ {
+ "Id": "Russell",
+ "LanguageCode": "en-AU",
+ "LanguageName": "Australian English",
+ "Gender": "Male",
+ "Name": "Russell",
+ },
+ {
+ "Id": "Nicole",
+ "LanguageCode": "en-AU",
+ "LanguageName": "Australian English",
+ "Gender": "Female",
+ "Name": "Nicole",
+ },
+ {
+ "Id": "Vicki",
+ "LanguageCode": "de-DE",
+ "LanguageName": "German",
+ "Gender": "Female",
+ "Name": "Vicki",
+ },
+ {
+ "Id": "Marlene",
+ "LanguageCode": "de-DE",
+ "LanguageName": "German",
+ "Gender": "Female",
+ "Name": "Marlene",
+ },
+ {
+ "Id": "Hans",
+ "LanguageCode": "de-DE",
+ "LanguageName": "German",
+ "Gender": "Male",
+ "Name": "Hans",
+ },
+ {
+ "Id": "Naja",
+ "LanguageCode": "da-DK",
+ "LanguageName": "Danish",
+ "Gender": "Female",
+ "Name": "Naja",
+ },
+ {
+ "Id": "Mads",
+ "LanguageCode": "da-DK",
+ "LanguageName": "Danish",
+ "Gender": "Male",
+ "Name": "Mads",
+ },
+ {
+ "Id": "Gwyneth",
+ "LanguageCode": "cy-GB",
+ "LanguageName": "Welsh",
+ "Gender": "Female",
+ "Name": "Gwyneth",
+ },
+ {
+ "Id": "Jacek",
+ "LanguageCode": "pl-PL",
+ "LanguageName": "Polish",
+ "Gender": "Male",
+ "Name": "Jacek",
+ },
+]
+
+# {...} is also shorthand set syntax
+LANGUAGE_CODES = {
+ "cy-GB",
+ "da-DK",
+ "de-DE",
+ "en-AU",
+ "en-GB",
+ "en-GB-WLS",
+ "en-IN",
+ "en-US",
+ "es-ES",
+ "es-US",
+ "fr-CA",
+ "fr-FR",
+ "is-IS",
+ "it-IT",
+ "ja-JP",
+ "nb-NO",
+ "nl-NL",
+ "pl-PL",
+ "pt-BR",
+ "pt-PT",
+ "ro-RO",
+ "ru-RU",
+ "sv-SE",
+ "tr-TR",
+}
+
+VOICE_IDS = {
+ "Geraint",
+ "Gwyneth",
+ "Mads",
+ "Naja",
+ "Hans",
+ "Marlene",
+ "Nicole",
+ "Russell",
+ "Amy",
+ "Brian",
+ "Emma",
+ "Raveena",
+ "Ivy",
+ "Joanna",
+ "Joey",
+ "Justin",
+ "Kendra",
+ "Kimberly",
+ "Salli",
+ "Conchita",
+ "Enrique",
+ "Miguel",
+ "Penelope",
+ "Chantal",
+ "Celine",
+ "Mathieu",
+ "Dora",
+ "Karl",
+ "Carla",
+ "Giorgio",
+ "Mizuki",
+ "Liv",
+ "Lotte",
+ "Ruben",
+ "Ewa",
+ "Jacek",
+ "Jan",
+ "Maja",
+ "Ricardo",
+ "Vitoria",
+ "Cristiano",
+ "Ines",
+ "Carmen",
+ "Maxim",
+ "Tatyana",
+ "Astrid",
+ "Filiz",
+}
diff --git a/contrib/python/moto/py3/moto/polly/responses.py b/contrib/python/moto/py3/moto/polly/responses.py
new file mode 100644
index 0000000000..39ecc7385d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/responses.py
@@ -0,0 +1,198 @@
+import json
+import re
+
+from urllib.parse import urlsplit
+
+from moto.core.responses import BaseResponse
+from .models import polly_backends
+from .resources import LANGUAGE_CODES, VOICE_IDS
+
+LEXICON_NAME_REGEX = re.compile(r"^[0-9A-Za-z]{1,20}$")
+
+
+class PollyResponse(BaseResponse):
+ @property
+ def polly_backend(self):
+ return polly_backends[self.region]
+
+ @property
+ def json(self):
+ if not hasattr(self, "_json"):
+ self._json = json.loads(self.body)
+ return self._json
+
+ def _error(self, code, message):
+ return json.dumps({"__type": code, "message": message}), dict(status=400)
+
+ def _get_action(self):
+ # Amazon is now naming things /v1/api_name
+ url_parts = urlsplit(self.uri).path.lstrip("/").split("/")
+ # [0] = 'v1'
+
+ return url_parts[1]
+
+ # DescribeVoices
+ def voices(self):
+ language_code = self._get_param("LanguageCode")
+
+ if language_code is not None and language_code not in LANGUAGE_CODES:
+ msg = (
+ "1 validation error detected: Value '{0}' at 'languageCode' failed to satisfy constraint: "
+ "Member must satisfy enum value set: [{1}]".format(
+ language_code, ", ".join(LANGUAGE_CODES)
+ )
+ )
+ return msg, dict(status=400)
+
+ voices = self.polly_backend.describe_voices(language_code)
+
+ return json.dumps({"Voices": voices})
+
+ def lexicons(self):
+ # Dish out requests based on methods
+
+ # anything after the /v1/lexicons/
+ args = urlsplit(self.uri).path.lstrip("/").split("/")[2:]
+
+ if self.method == "GET":
+ if len(args) == 0:
+ return self._get_lexicons_list()
+ else:
+ return self._get_lexicon(*args)
+ elif self.method == "PUT":
+ return self._put_lexicons(*args)
+ elif self.method == "DELETE":
+ return self._delete_lexicon(*args)
+
+ return self._error("InvalidAction", "Bad route")
+
+ # PutLexicon
+ def _put_lexicons(self, lexicon_name):
+ if LEXICON_NAME_REGEX.match(lexicon_name) is None:
+ return self._error(
+ "InvalidParameterValue", "Lexicon name must match [0-9A-Za-z]{1,20}"
+ )
+
+ if "Content" not in self.json:
+ return self._error("MissingParameter", "Content is missing from the body")
+
+ self.polly_backend.put_lexicon(lexicon_name, self.json["Content"])
+
+ return ""
+
+ # ListLexicons
+ def _get_lexicons_list(self):
+ result = {"Lexicons": self.polly_backend.list_lexicons()}
+
+ return json.dumps(result)
+
+ # GetLexicon
+ def _get_lexicon(self, lexicon_name):
+ try:
+ lexicon = self.polly_backend.get_lexicon(lexicon_name)
+ except KeyError:
+ return self._error("LexiconNotFoundException", "Lexicon not found")
+
+ result = {
+ "Lexicon": {"Name": lexicon_name, "Content": lexicon.content},
+ "LexiconAttributes": lexicon.to_dict()["Attributes"],
+ }
+
+ return json.dumps(result)
+
+ # DeleteLexicon
+ def _delete_lexicon(self, lexicon_name):
+ try:
+ self.polly_backend.delete_lexicon(lexicon_name)
+ except KeyError:
+ return self._error("LexiconNotFoundException", "Lexicon not found")
+
+ return ""
+
+ # SynthesizeSpeech
+ def speech(self):
+ # Sanity check params
+ args = {
+ "lexicon_names": None,
+ "sample_rate": 22050,
+ "speech_marks": None,
+ "text": None,
+ "text_type": "text",
+ }
+
+ if "LexiconNames" in self.json:
+ for lex in self.json["LexiconNames"]:
+ try:
+ self.polly_backend.get_lexicon(lex)
+ except KeyError:
+ return self._error("LexiconNotFoundException", "Lexicon not found")
+
+ args["lexicon_names"] = self.json["LexiconNames"]
+
+ if "OutputFormat" not in self.json:
+ return self._error("MissingParameter", "Missing parameter OutputFormat")
+ if self.json["OutputFormat"] not in ("json", "mp3", "ogg_vorbis", "pcm"):
+ return self._error(
+ "InvalidParameterValue", "Not one of json, mp3, ogg_vorbis, pcm"
+ )
+ args["output_format"] = self.json["OutputFormat"]
+
+ if "SampleRate" in self.json:
+ sample_rate = int(self.json["SampleRate"])
+ if sample_rate not in (8000, 16000, 22050):
+ return self._error(
+ "InvalidSampleRateException",
+ "The specified sample rate is not valid.",
+ )
+ args["sample_rate"] = sample_rate
+
+ if "SpeechMarkTypes" in self.json:
+ for value in self.json["SpeechMarkTypes"]:
+ if value not in ("sentance", "ssml", "viseme", "word"):
+ return self._error(
+ "InvalidParameterValue",
+ "Not one of sentance, ssml, viseme, word",
+ )
+ args["speech_marks"] = self.json["SpeechMarkTypes"]
+
+ if "Text" not in self.json:
+ return self._error("MissingParameter", "Missing parameter Text")
+ args["text"] = self.json["Text"]
+
+ if "TextType" in self.json:
+ if self.json["TextType"] not in ("ssml", "text"):
+ return self._error("InvalidParameterValue", "Not one of ssml, text")
+ args["text_type"] = self.json["TextType"]
+
+ if "VoiceId" not in self.json:
+ return self._error("MissingParameter", "Missing parameter VoiceId")
+ if self.json["VoiceId"] not in VOICE_IDS:
+ return self._error(
+ "InvalidParameterValue", "Not one of {0}".format(", ".join(VOICE_IDS))
+ )
+ args["voice_id"] = self.json["VoiceId"]
+
+ # More validation
+ if len(args["text"]) > 3000:
+ return self._error("TextLengthExceededException", "Text too long")
+
+ if args["speech_marks"] is not None and args["output_format"] != "json":
+ return self._error(
+ "MarksNotSupportedForFormatException", "OutputFormat must be json"
+ )
+ if args["speech_marks"] is not None and args["text_type"] == "text":
+ return self._error(
+ "SsmlMarksNotSupportedForTextTypeException", "TextType must be ssml"
+ )
+
+ content_type = "audio/json"
+ if args["output_format"] == "mp3":
+ content_type = "audio/mpeg"
+ elif args["output_format"] == "ogg_vorbis":
+ content_type = "audio/ogg"
+ elif args["output_format"] == "pcm":
+ content_type = "audio/pcm"
+
+ headers = {"Content-Type": content_type}
+
+ return "\x00\x00\x00\x00\x00\x00\x00\x00", headers
diff --git a/contrib/python/moto/py3/moto/polly/urls.py b/contrib/python/moto/py3/moto/polly/urls.py
new file mode 100644
index 0000000000..d826e33dea
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/urls.py
@@ -0,0 +1,10 @@
+from .responses import PollyResponse
+
+url_bases = [r"https?://polly\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/v1/voices": PollyResponse.dispatch,
+ "{0}/v1/lexicons/(?P<lexicon>[^/]+)": PollyResponse.dispatch,
+ "{0}/v1/lexicons": PollyResponse.dispatch,
+ "{0}/v1/speech": PollyResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/polly/utils.py b/contrib/python/moto/py3/moto/polly/utils.py
new file mode 100644
index 0000000000..c13404109d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/polly/utils.py
@@ -0,0 +1,2 @@
+def make_arn_for_lexicon(account_id, name, region_name):
+ return "arn:aws:polly:{0}:{1}:lexicon/{2}".format(region_name, account_id, name)
diff --git a/contrib/python/moto/py3/moto/quicksight/__init__.py b/contrib/python/moto/py3/moto/quicksight/__init__.py
new file mode 100644
index 0000000000..c58340038f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/quicksight/__init__.py
@@ -0,0 +1,5 @@
+"""quicksight module initialization; sets value for base decorator."""
+from .models import quicksight_backends
+from ..core.models import base_decorator
+
+mock_quicksight = base_decorator(quicksight_backends)
diff --git a/contrib/python/moto/py3/moto/quicksight/exceptions.py b/contrib/python/moto/py3/moto/quicksight/exceptions.py
new file mode 100644
index 0000000000..045cf4c7e7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/quicksight/exceptions.py
@@ -0,0 +1,7 @@
+"""Exceptions raised by the quicksight service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFoundException(JsonRESTError):
+ def __init__(self, msg):
+ super().__init__("ResourceNotFoundException", msg)
diff --git a/contrib/python/moto/py3/moto/quicksight/models.py b/contrib/python/moto/py3/moto/quicksight/models.py
new file mode 100644
index 0000000000..c915afe210
--- /dev/null
+++ b/contrib/python/moto/py3/moto/quicksight/models.py
@@ -0,0 +1,216 @@
+"""QuickSightBackend class with methods for supported APIs."""
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from .exceptions import ResourceNotFoundException
+
+
+def _create_id(aws_account_id, namespace, _id):
+ return f"{aws_account_id}:{namespace}:{_id}"
+
+
+class QuicksightDataSet(BaseModel):
+ def __init__(self, region, _id, name):
+ self.arn = f"arn:aws:quicksight:{region}:{get_account_id()}:data-set/{_id}"
+ self._id = _id
+ self.name = name
+ self.region = region
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "DataSetId": self._id,
+ "IngestionArn": f"arn:aws:quicksight:{self.region}:{get_account_id()}:ingestion/tbd",
+ }
+
+
+class QuicksightIngestion(BaseModel):
+ def __init__(self, region, data_set_id, ingestion_id):
+ self.arn = f"arn:aws:quicksight:{region}:{get_account_id()}:data-set/{data_set_id}/ingestions/{ingestion_id}"
+ self.ingestion_id = ingestion_id
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "IngestionId": self.ingestion_id,
+ "IngestionStatus": "INITIALIZED",
+ }
+
+
+class QuicksightMembership(BaseModel):
+ def __init__(self, region, group, user):
+ self.group = group
+ self.user = user
+ self.arn = f"arn:aws:quicksight:{region}:{get_account_id()}:group/default/{group}/{user}"
+
+ def to_json(self):
+ return {"Arn": self.arn, "MemberName": self.user}
+
+
+class QuicksightGroup(BaseModel):
+ def __init__(self, region, group_name, description, aws_account_id, namespace):
+ self.arn = (
+ f"arn:aws:quicksight:{region}:{get_account_id()}:group/default/{group_name}"
+ )
+ self.group_name = group_name
+ self.description = description
+ self.aws_account_id = aws_account_id
+ self.namespace = namespace
+ self.region = region
+
+ self.members = dict()
+
+ def add_member(self, user_name):
+ membership = QuicksightMembership(self.region, self.group_name, user_name)
+ self.members[user_name] = membership
+ return membership
+
+ def delete_member(self, user_name):
+ self.members.pop(user_name, None)
+
+ def get_member(self, user_name):
+ return self.members[user_name]
+
+ def list_members(self):
+ return self.members.values()
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "GroupName": self.group_name,
+ "Description": self.description,
+ "PrincipalId": self.aws_account_id,
+ "Namespace": self.namespace,
+ }
+
+
+class QuicksightUser(BaseModel):
+ def __init__(self, region, email, identity_type, username, user_role):
+ self.arn = (
+ f"arn:aws:quicksight:{region}:{get_account_id()}:user/default/{username}"
+ )
+ self.email = email
+ self.identity_type = identity_type
+ self.username = username
+ self.user_role = user_role
+ self.active = False
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "Email": self.email,
+ "IdentityType": self.identity_type,
+ "Role": self.user_role,
+ "UserName": self.username,
+ "Active": self.active,
+ }
+
+
+class QuickSightBackend(BaseBackend):
+ """Implementation of QuickSight APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.groups = dict()
+ self.users = dict()
+
+ def create_data_set(self, data_set_id, name):
+ return QuicksightDataSet(self.region_name, data_set_id, name=name)
+
+ def create_group(self, group_name, description, aws_account_id, namespace):
+ group = QuicksightGroup(
+ region=self.region_name,
+ group_name=group_name,
+ description=description,
+ aws_account_id=aws_account_id,
+ namespace=namespace,
+ )
+ _id = _create_id(aws_account_id, namespace, group_name)
+ self.groups[_id] = group
+ return group
+
+ def create_group_membership(self, aws_account_id, namespace, group_name, user_name):
+ group = self.describe_group(aws_account_id, namespace, group_name)
+ return group.add_member(user_name)
+
+ def create_ingestion(self, data_set_id, ingestion_id):
+ return QuicksightIngestion(self.region_name, data_set_id, ingestion_id)
+
+ def delete_group(self, aws_account_id, namespace, group_name):
+ _id = _create_id(aws_account_id, namespace, group_name)
+ self.groups.pop(_id, None)
+
+ def delete_user(self, aws_account_id, namespace, user_name):
+ # Delete users from all groups
+ for group in self.groups.values():
+ group.delete_member(user_name)
+ # Delete user itself
+ _id = _create_id(aws_account_id, namespace, user_name)
+ self.users.pop(_id, None)
+
+ def describe_group(self, aws_account_id, namespace, group_name):
+ _id = _create_id(aws_account_id, namespace, group_name)
+ if _id not in self.groups:
+ raise ResourceNotFoundException(f"Group {group_name} not found")
+ return self.groups[_id]
+
+ def describe_group_membership(
+ self, aws_account_id, namespace, group_name, user_name
+ ):
+ group = self.describe_group(aws_account_id, namespace, group_name)
+ return group.get_member(user_name)
+
+ def describe_user(self, aws_account_id, namespace, user_name):
+ _id = _create_id(aws_account_id, namespace, user_name)
+ if _id not in self.users:
+ raise ResourceNotFoundException(f"User {user_name} not found")
+ return self.users[_id]
+
+ def list_groups(self, aws_account_id, namespace):
+ """
+ The NextToken and MaxResults parameters are not yet implemented
+ """
+ id_for_ns = _create_id(aws_account_id, namespace, _id="")
+ return [
+ group for _id, group in self.groups.items() if _id.startswith(id_for_ns)
+ ]
+
+ def list_group_memberships(self, aws_account_id, namespace, group_name):
+ """
+ The NextToken and MaxResults parameters are not yet implemented
+ """
+ group = self.describe_group(aws_account_id, namespace, group_name)
+ return group.list_members()
+
+ def list_users(self, aws_account_id, namespace):
+ """
+ The NextToken and MaxResults parameters are not yet implemented
+ """
+ id_for_ns = _create_id(aws_account_id, namespace, _id="")
+ return [user for _id, user in self.users.items() if _id.startswith(id_for_ns)]
+
+ def register_user(
+ self, identity_type, email, user_role, aws_account_id, namespace, user_name
+ ):
+ """
+ The following parameters are not yet implemented:
+ IamArn, SessionName, CustomsPermissionsName, ExternalLoginFederationProviderType, CustomFederationProviderUrl, ExternalLoginId
+ """
+ user = QuicksightUser(
+ region=self.region_name,
+ email=email,
+ identity_type=identity_type,
+ user_role=user_role,
+ username=user_name,
+ )
+ _id = _create_id(aws_account_id, namespace, user_name)
+ self.users[_id] = user
+ return user
+
+ def update_group(self, aws_account_id, namespace, group_name, description):
+ group = self.describe_group(aws_account_id, namespace, group_name)
+ group.description = description
+ return group
+
+
+quicksight_backends = BackendDict(QuickSightBackend, "quicksight")
diff --git a/contrib/python/moto/py3/moto/quicksight/responses.py b/contrib/python/moto/py3/moto/quicksight/responses.py
new file mode 100644
index 0000000000..91cc0bd310
--- /dev/null
+++ b/contrib/python/moto/py3/moto/quicksight/responses.py
@@ -0,0 +1,199 @@
+"""Handles incoming quicksight requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import quicksight_backends
+
+
+class QuickSightResponse(BaseResponse):
+ """Handler for QuickSight requests and responses."""
+
+ @property
+ def quicksight_backend(self):
+ """Return backend instance specific for this region."""
+ return quicksight_backends[self.region]
+
+ def dataset(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_data_set()
+
+ def groups(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.create_group()
+ if request.method == "GET":
+ return self.list_groups()
+
+ def group(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.describe_group()
+ if request.method == "DELETE":
+ return self.delete_group()
+ if request.method == "PUT":
+ return self.update_group()
+
+ def group_member(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.create_group_membership()
+ if request.method == "GET":
+ return self.describe_group_membership()
+
+ def group_members(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.list_group_memberships()
+
+ def ingestion(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.create_ingestion()
+
+ def users(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "POST":
+ return self.register_user()
+ if request.method == "GET":
+ return self.list_users()
+
+ def user(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ return self.describe_user()
+ if request.method == "DELETE":
+ return self.delete_user()
+
+ def create_data_set(self):
+ params = json.loads(self.body)
+ data_set_id = params.get("DataSetId")
+ name = params.get("Name")
+ data_set = self.quicksight_backend.create_data_set(data_set_id, name)
+ return 200, {}, json.dumps(data_set.to_json())
+
+ def create_group(self):
+ params = json.loads(self.body)
+ group_name = params.get("GroupName")
+ description = params.get("Description")
+ aws_account_id = self.path.split("/")[-4]
+ namespace = self.path.split("/")[-2]
+ group = self.quicksight_backend.create_group(
+ group_name=group_name,
+ description=description,
+ aws_account_id=aws_account_id,
+ namespace=namespace,
+ )
+ return 200, {}, json.dumps(dict(Group=group.to_json()))
+
+ def create_group_membership(self):
+ aws_account_id = self.path.split("/")[-7]
+ namespace = self.path.split("/")[-5]
+ group_name = self.path.split("/")[-3]
+ user_name = self.path.split("/")[-1]
+ member = self.quicksight_backend.create_group_membership(
+ aws_account_id, namespace, group_name, user_name
+ )
+ return 200, {}, json.dumps({"GroupMember": member.to_json()})
+
+ def create_ingestion(self):
+ data_set_id = self.path.split("/")[-3]
+ ingestion_id = self.path.split("/")[-1]
+ ingestion = self.quicksight_backend.create_ingestion(data_set_id, ingestion_id)
+ return 200, {}, json.dumps(ingestion.to_json())
+
+ def describe_group_membership(self):
+ aws_account_id = self.path.split("/")[-7]
+ namespace = self.path.split("/")[-5]
+ group_name = self.path.split("/")[-3]
+ user_name = self.path.split("/")[-1]
+ member = self.quicksight_backend.describe_group_membership(
+ aws_account_id, namespace, group_name, user_name
+ )
+ return 200, {}, json.dumps({"GroupMember": member.to_json()})
+
+ def list_groups(self):
+ aws_account_id = self.path.split("/")[-4]
+ namespace = self.path.split("/")[-2]
+ groups = self.quicksight_backend.list_groups(aws_account_id, namespace)
+ return 200, {}, json.dumps(dict(GroupList=[g.to_json() for g in groups]))
+
+ def list_group_memberships(self):
+ aws_account_id = self.path.split("/")[-6]
+ namespace = self.path.split("/")[-4]
+ group_name = self.path.split("/")[-2]
+ members = self.quicksight_backend.list_group_memberships(
+ aws_account_id, namespace, group_name
+ )
+ return 200, {}, json.dumps({"GroupMemberList": [m.to_json() for m in members]})
+
+ def list_users(self):
+ aws_account_id = self.path.split("/")[-4]
+ namespace = self.path.split("/")[-2]
+ users = self.quicksight_backend.list_users(aws_account_id, namespace)
+ return 200, {}, json.dumps(dict(UserList=[u.to_json() for u in users]))
+
+ def register_user(self):
+ params = json.loads(self.body)
+ identity_type = params.get("IdentityType")
+ email = params.get("Email")
+ user_role = params.get("UserRole")
+ aws_account_id = self.path.split("/")[-4]
+ namespace = self.path.split("/")[-2]
+ user_name = params.get("UserName")
+ user = self.quicksight_backend.register_user(
+ identity_type=identity_type,
+ email=email,
+ user_role=user_role,
+ aws_account_id=aws_account_id,
+ namespace=namespace,
+ user_name=user_name,
+ )
+ return 200, {}, json.dumps(dict(User=user.to_json(), UserInvitationUrl="TBD"))
+
+ def describe_group(self):
+ aws_account_id = self.path.split("/")[-5]
+ namespace = self.path.split("/")[-3]
+ group_name = self.path.split("/")[-1]
+
+ group = self.quicksight_backend.describe_group(
+ aws_account_id, namespace, group_name
+ )
+ return 200, {}, json.dumps(dict(Group=group.to_json()))
+
+ def describe_user(self):
+ aws_account_id = self.path.split("/")[-5]
+ namespace = self.path.split("/")[-3]
+ user_name = self.path.split("/")[-1]
+
+ user = self.quicksight_backend.describe_user(
+ aws_account_id, namespace, user_name
+ )
+ return 200, {}, json.dumps(dict(User=user.to_json()))
+
+ def delete_group(self):
+ aws_account_id = self.path.split("/")[-5]
+ namespace = self.path.split("/")[-3]
+ group_name = self.path.split("/")[-1]
+
+ self.quicksight_backend.delete_group(aws_account_id, namespace, group_name)
+ return 204, {}, json.dumps({"Status": 204})
+
+ def delete_user(self):
+ aws_account_id = self.path.split("/")[-5]
+ namespace = self.path.split("/")[-3]
+ user_name = self.path.split("/")[-1]
+
+ self.quicksight_backend.delete_user(aws_account_id, namespace, user_name)
+ return 204, {}, json.dumps({"Status": 204})
+
+ def update_group(self):
+ aws_account_id = self.path.split("/")[-5]
+ namespace = self.path.split("/")[-3]
+ group_name = self.path.split("/")[-1]
+ description = json.loads(self.body).get("Description")
+
+ group = self.quicksight_backend.update_group(
+ aws_account_id, namespace, group_name, description
+ )
+ return 200, {}, json.dumps(dict(Group=group.to_json()))
diff --git a/contrib/python/moto/py3/moto/quicksight/urls.py b/contrib/python/moto/py3/moto/quicksight/urls.py
new file mode 100644
index 0000000000..ad2d5b45b8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/quicksight/urls.py
@@ -0,0 +1,21 @@
+"""quicksight base URL and path."""
+from .responses import QuickSightResponse
+
+url_bases = [
+ r"https?://quicksight\.(.+)\.amazonaws\.com",
+]
+
+
+response = QuickSightResponse()
+
+
+url_paths = {
+ r"{0}/accounts/(?P<account_id>[\d]+)/data-sets$": response.dataset,
+ r"{0}/accounts/(?P<account_id>[\d]+)/data-sets/(?P<datasetid>[^/.]+)/ingestions/(?P<ingestionid>[^/.]+)$": response.ingestion,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/groups$": response.groups,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/groups/(?P<groupname>[^/]+)$": response.group,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/groups/(?P<groupname>[^/]+)/members$": response.group_members,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/groups/(?P<groupname>[^/]+)/members/(?P<username>[^/]+)$": response.group_member,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/users$": response.users,
+ r"{0}/accounts/(?P<account_id>[\d]+)/namespaces/(?P<namespace>[a-zA-Z0-9._-]+)/users/(?P<username>[^/]+)$": response.user,
+}
diff --git a/contrib/python/moto/py3/moto/ram/__init__.py b/contrib/python/moto/py3/moto/ram/__init__.py
new file mode 100644
index 0000000000..a4925944f0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ram/__init__.py
@@ -0,0 +1,5 @@
+from .models import ram_backends
+from ..core.models import base_decorator
+
+ram_backend = ram_backends["us-east-1"]
+mock_ram = base_decorator(ram_backends)
diff --git a/contrib/python/moto/py3/moto/ram/exceptions.py b/contrib/python/moto/py3/moto/ram/exceptions.py
new file mode 100644
index 0000000000..4cc549a31f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ram/exceptions.py
@@ -0,0 +1,34 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidParameterException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterException", message)
+
+
+class MalformedArnException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("MalformedArnException", message)
+
+
+class OperationNotPermittedException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "OperationNotPermittedException",
+ "Unable to enable sharing with AWS Organizations. "
+ "Received AccessDeniedException from AWSOrganizations with the following error message: "
+ "You don't have permissions to access this resource.",
+ )
+
+
+class UnknownResourceException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("UnknownResourceException", message)
diff --git a/contrib/python/moto/py3/moto/ram/models.py b/contrib/python/moto/py3/moto/ram/models.py
new file mode 100644
index 0000000000..6d589be7e1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ram/models.py
@@ -0,0 +1,235 @@
+import re
+import string
+from datetime import datetime
+import random
+from uuid import uuid4
+
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import unix_time, BackendDict
+from moto.organizations import organizations_backends
+from moto.ram.exceptions import (
+ MalformedArnException,
+ InvalidParameterException,
+ UnknownResourceException,
+ OperationNotPermittedException,
+)
+
+
+def random_resource_id(size):
+ return "".join(random.choice(string.digits + "abcdef") for _ in range(size))
+
+
+class ResourceShare(BaseModel):
+ # List of shareable resources can be found here
+ # https://docs.aws.amazon.com/ram/latest/userguide/shareable.html
+ SHAREABLE_RESOURCES = [
+ "cluster", # Amazon Aurora cluster
+ "component", # Amazon EC2 Image Builder component
+ "group", # AWS Resource Groups
+ "image", # Amazon EC2 Image Builder image
+ "image-recipe", # Amazon EC2 Image Builder image recipe
+ "license-configuration", # AWS License Manager configuration
+ "mesh", # AWS App Mesh
+ "prefix-list", # Amazon EC2 prefix list
+ "project", # AWS CodeBuild project
+ "report-group", # AWS CodeBuild report group
+ "resolver-rule", # Amazon Route 53 forwarding rule
+ "subnet", # Amazon EC2 subnet
+ "transit-gateway", # Amazon EC2 transit gateway
+ ]
+
+ def __init__(self, region, **kwargs):
+ self.region = region
+
+ self.allow_external_principals = kwargs.get("allowExternalPrincipals", True)
+ self.arn = "arn:aws:ram:{0}:{1}:resource-share/{2}".format(
+ self.region, get_account_id(), uuid4()
+ )
+ self.creation_time = datetime.utcnow()
+ self.feature_set = "STANDARD"
+ self.last_updated_time = datetime.utcnow()
+ self.name = kwargs["name"]
+ self.owning_account_id = get_account_id()
+ self.principals = []
+ self.resource_arns = []
+ self.status = "ACTIVE"
+
+ @property
+ def organizations_backend(self):
+ return organizations_backends["global"]
+
+ def add_principals(self, principals):
+ for principal in principals:
+ match = re.search(
+ r"^arn:aws:organizations::\d{12}:organization/(o-\w+)$", principal
+ )
+ if match:
+ organization = self.organizations_backend.describe_organization()
+ if principal == organization["Organization"]["Arn"]:
+ continue
+ else:
+ raise UnknownResourceException(
+ "Organization {} could not be found.".format(match.group(1))
+ )
+
+ match = re.search(
+ r"^arn:aws:organizations::\d{12}:ou/(o-\w+)/(ou-[\w-]+)$", principal
+ )
+ if match:
+ roots = self.organizations_backend.list_roots()
+ root_id = next(
+ (
+ root["Id"]
+ for root in roots["Roots"]
+ if root["Name"] == "Root" and match.group(1) in root["Arn"]
+ ),
+ None,
+ )
+
+ if root_id:
+ (
+ ous,
+ _,
+ ) = self.organizations_backend.list_organizational_units_for_parent(
+ parent_id=root_id
+ )
+ if any(principal == ou["Arn"] for ou in ous):
+ continue
+
+ raise UnknownResourceException(
+ "OrganizationalUnit {} in unknown organization could not be found.".format(
+ match.group(2)
+ )
+ )
+
+ if not re.match(r"^\d{12}$", principal):
+ raise InvalidParameterException(
+ "Principal ID {} is malformed. "
+ "Verify the ID and try again.".format(principal)
+ )
+
+ for principal in principals:
+ self.principals.append(principal)
+
+ def add_resources(self, resource_arns):
+ for resource in resource_arns:
+ match = re.search(
+ r"^arn:aws:[a-z0-9-]+:[a-z0-9-]*:[0-9]{12}:([a-z-]+)[/:].*$", resource
+ )
+ if not match:
+ raise MalformedArnException(
+ "The specified resource ARN {} is not valid. "
+ "Verify the ARN and try again.".format(resource)
+ )
+
+ if match.group(1) not in self.SHAREABLE_RESOURCES:
+ raise MalformedArnException(
+ "You cannot share the selected resource type."
+ )
+
+ for resource in resource_arns:
+ self.resource_arns.append(resource)
+
+ def delete(self):
+ self.last_updated_time = datetime.utcnow()
+ self.status = "DELETED"
+
+ def describe(self):
+ return {
+ "allowExternalPrincipals": self.allow_external_principals,
+ "creationTime": unix_time(self.creation_time),
+ "featureSet": self.feature_set,
+ "lastUpdatedTime": unix_time(self.last_updated_time),
+ "name": self.name,
+ "owningAccountId": self.owning_account_id,
+ "resourceShareArn": self.arn,
+ "status": self.status,
+ }
+
+ def update(self, **kwargs):
+ self.allow_external_principals = kwargs.get(
+ "allowExternalPrincipals", self.allow_external_principals
+ )
+ self.last_updated_time = datetime.utcnow()
+ self.name = kwargs.get("name", self.name)
+
+
+class ResourceAccessManagerBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.resource_shares = []
+
+ @property
+ def organizations_backend(self):
+ return organizations_backends["global"]
+
+ def create_resource_share(self, **kwargs):
+ resource = ResourceShare(self.region_name, **kwargs)
+ resource.add_principals(kwargs.get("principals", []))
+ resource.add_resources(kwargs.get("resourceArns", []))
+
+ self.resource_shares.append(resource)
+
+ response = resource.describe()
+ response.pop("featureSet")
+
+ return dict(resourceShare=response)
+
+ def get_resource_shares(self, **kwargs):
+ owner = kwargs["resourceOwner"]
+
+ if owner not in ["SELF", "OTHER-ACCOUNTS"]:
+ raise InvalidParameterException(
+ "{} is not a valid resource owner. "
+ "Specify either SELF or OTHER-ACCOUNTS and try again.".format(owner)
+ )
+
+ if owner == "OTHER-ACCOUNTS":
+ raise NotImplementedError(
+ "Value 'OTHER-ACCOUNTS' for parameter 'resourceOwner' not implemented."
+ )
+
+ resouces = [resource.describe() for resource in self.resource_shares]
+
+ return dict(resourceShares=resouces)
+
+ def update_resource_share(self, **kwargs):
+ arn = kwargs["resourceShareArn"]
+
+ resource = next(
+ (resource for resource in self.resource_shares if arn == resource.arn), None
+ )
+
+ if not resource:
+ raise UnknownResourceException(
+ "ResourceShare {} could not be found.".format(arn)
+ )
+
+ resource.update(**kwargs)
+ response = resource.describe()
+ response.pop("featureSet")
+
+ return dict(resourceShare=response)
+
+ def delete_resource_share(self, arn):
+ resource = next(
+ (resource for resource in self.resource_shares if arn == resource.arn), None
+ )
+
+ if not resource:
+ raise UnknownResourceException(
+ "ResourceShare {} could not be found.".format(arn)
+ )
+
+ resource.delete()
+
+ return dict(returnValue=True)
+
+ def enable_sharing_with_aws_organization(self):
+ if not self.organizations_backend.org:
+ raise OperationNotPermittedException
+
+ return dict(returnValue=True)
+
+
+ram_backends = BackendDict(ResourceAccessManagerBackend, "ram")
diff --git a/contrib/python/moto/py3/moto/ram/responses.py b/contrib/python/moto/py3/moto/ram/responses.py
new file mode 100644
index 0000000000..fbc0d351de
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ram/responses.py
@@ -0,0 +1,38 @@
+from moto.core.responses import BaseResponse
+from .models import ram_backends
+import json
+
+
+class ResourceAccessManagerResponse(BaseResponse):
+ SERVICE_NAME = "ram"
+
+ @property
+ def ram_backend(self):
+ return ram_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ if self.method == "DELETE":
+ return None
+
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def create_resource_share(self):
+ return json.dumps(self.ram_backend.create_resource_share(**self.request_params))
+
+ def get_resource_shares(self):
+ return json.dumps(self.ram_backend.get_resource_shares(**self.request_params))
+
+ def update_resource_share(self):
+ return json.dumps(self.ram_backend.update_resource_share(**self.request_params))
+
+ def delete_resource_share(self):
+ return json.dumps(
+ self.ram_backend.delete_resource_share(self._get_param("resourceShareArn"))
+ )
+
+ def enable_sharing_with_aws_organization(self):
+ return json.dumps(self.ram_backend.enable_sharing_with_aws_organization())
diff --git a/contrib/python/moto/py3/moto/ram/urls.py b/contrib/python/moto/py3/moto/ram/urls.py
new file mode 100644
index 0000000000..09d782e6b6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ram/urls.py
@@ -0,0 +1,11 @@
+from .responses import ResourceAccessManagerResponse
+
+url_bases = [r"https?://ram\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/createresourceshare$": ResourceAccessManagerResponse.dispatch,
+ "{0}/deleteresourceshare/?$": ResourceAccessManagerResponse.dispatch,
+ "{0}/enablesharingwithawsorganization$": ResourceAccessManagerResponse.dispatch,
+ "{0}/getresourceshares$": ResourceAccessManagerResponse.dispatch,
+ "{0}/updateresourceshare$": ResourceAccessManagerResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/rds/__init__.py b/contrib/python/moto/py3/moto/rds/__init__.py
new file mode 100644
index 0000000000..f4ad5814a8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/__init__.py
@@ -0,0 +1,5 @@
+from .models import rds_backends
+from ..core.models import base_decorator
+
+rds_backend = rds_backends["us-west-1"]
+mock_rds = base_decorator(rds_backends)
diff --git a/contrib/python/moto/py3/moto/rds/exceptions.py b/contrib/python/moto/py3/moto/rds/exceptions.py
new file mode 100644
index 0000000000..4512df86ea
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/exceptions.py
@@ -0,0 +1,193 @@
+from jinja2 import Template
+from werkzeug.exceptions import BadRequest
+
+
+class RDSClientError(BadRequest):
+ def __init__(self, code, message):
+ super().__init__()
+ template = Template(
+ """
+ <ErrorResponse>
+ <Error>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ <Type>Sender</Type>
+ </Error>
+ <RequestId>6876f774-7273-11e4-85dc-39e55ca848d1</RequestId>
+ </ErrorResponse>"""
+ )
+ self.description = template.render(code=code, message=message)
+
+
+class DBInstanceNotFoundError(RDSClientError):
+ def __init__(self, database_identifier):
+ super().__init__(
+ "DBInstanceNotFound",
+ "DBInstance {0} not found.".format(database_identifier),
+ )
+
+
+class DBSnapshotNotFoundError(RDSClientError):
+ def __init__(self, snapshot_identifier):
+ super().__init__(
+ "DBSnapshotNotFound", f"DBSnapshot {snapshot_identifier} not found."
+ )
+
+
+class DBSecurityGroupNotFoundError(RDSClientError):
+ def __init__(self, security_group_name):
+ super().__init__(
+ "DBSecurityGroupNotFound",
+ f"Security Group {security_group_name} not found.",
+ )
+
+
+class DBSubnetGroupNotFoundError(RDSClientError):
+ def __init__(self, subnet_group_name):
+ super().__init__(
+ "DBSubnetGroupNotFound", f"Subnet Group {subnet_group_name} not found."
+ )
+
+
+class DBParameterGroupNotFoundError(RDSClientError):
+ def __init__(self, db_parameter_group_name):
+ super().__init__(
+ "DBParameterGroupNotFound",
+ f"DB Parameter Group {db_parameter_group_name} not found.",
+ )
+
+
+class OptionGroupNotFoundFaultError(RDSClientError):
+ def __init__(self, option_group_name):
+ super().__init__(
+ "OptionGroupNotFoundFault",
+ f"Specified OptionGroupName: {option_group_name} not found.",
+ )
+
+
+class InvalidDBClusterStateFaultError(RDSClientError):
+ def __init__(self, database_identifier):
+ super().__init__(
+ "InvalidDBClusterStateFault",
+ "Invalid DB type, when trying to perform StopDBInstance on {0}e. See AWS RDS documentation on rds.stop_db_instance".format(
+ database_identifier
+ ),
+ )
+
+
+class InvalidDBInstanceStateError(RDSClientError):
+ def __init__(self, database_identifier, istate):
+ estate = (
+ "in available state"
+ if istate == "stop"
+ else "stopped, it cannot be started"
+ )
+ super().__init__(
+ "InvalidDBInstanceState",
+ "Instance {} is not {}.".format(database_identifier, estate),
+ )
+
+
+class SnapshotQuotaExceededError(RDSClientError):
+ def __init__(self):
+ super().__init__(
+ "SnapshotQuotaExceeded",
+ "The request cannot be processed because it would exceed the maximum number of snapshots.",
+ )
+
+
+class DBSnapshotAlreadyExistsError(RDSClientError):
+ def __init__(self, database_snapshot_identifier):
+ super().__init__(
+ "DBSnapshotAlreadyExists",
+ "Cannot create the snapshot because a snapshot with the identifier {} already exists.".format(
+ database_snapshot_identifier
+ ),
+ )
+
+
+class InvalidParameterValue(RDSClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class InvalidParameterCombination(RDSClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterCombination", message)
+
+
+class InvalidDBClusterStateFault(RDSClientError):
+ def __init__(self, message):
+ super().__init__("InvalidDBClusterStateFault", message)
+
+
+class DBClusterNotFoundError(RDSClientError):
+ def __init__(self, cluster_identifier):
+ super().__init__(
+ "DBClusterNotFoundFault",
+ "DBCluster {} not found.".format(cluster_identifier),
+ )
+
+
+class DBClusterSnapshotNotFoundError(RDSClientError):
+ def __init__(self, snapshot_identifier):
+ super().__init__(
+ "DBClusterSnapshotNotFoundFault",
+ "DBClusterSnapshot {} not found.".format(snapshot_identifier),
+ )
+
+
+class DBClusterSnapshotAlreadyExistsError(RDSClientError):
+ def __init__(self, database_snapshot_identifier):
+ super().__init__(
+ "DBClusterSnapshotAlreadyExistsFault",
+ "Cannot create the snapshot because a snapshot with the identifier {} already exists.".format(
+ database_snapshot_identifier
+ ),
+ )
+
+
+class ExportTaskAlreadyExistsError(RDSClientError):
+ def __init__(self, export_task_identifier):
+ super().__init__(
+ "ExportTaskAlreadyExistsFault",
+ "Cannot start export task because a task with the identifier {} already exists.".format(
+ export_task_identifier
+ ),
+ )
+
+
+class ExportTaskNotFoundError(RDSClientError):
+ def __init__(self, export_task_identifier):
+ super().__init__(
+ "ExportTaskNotFoundFault",
+ "Cannot cancel export task because a task with the identifier {} is not exist.".format(
+ export_task_identifier
+ ),
+ )
+
+
+class InvalidExportSourceStateError(RDSClientError):
+ def __init__(self, status):
+ super().__init__(
+ "InvalidExportSourceStateFault",
+ "Export source should be 'available' but current status is {}.".format(
+ status
+ ),
+ )
+
+
+class SubscriptionAlreadyExistError(RDSClientError):
+ def __init__(self, subscription_name):
+ super().__init__(
+ "SubscriptionAlreadyExistFault",
+ "Subscription {} already exists.".format(subscription_name),
+ )
+
+
+class SubscriptionNotFoundError(RDSClientError):
+ def __init__(self, subscription_name):
+ super().__init__(
+ "SubscriptionNotFoundFault",
+ "Subscription {} not found.".format(subscription_name),
+ )
diff --git a/contrib/python/moto/py3/moto/rds/models.py b/contrib/python/moto/py3/moto/rds/models.py
new file mode 100644
index 0000000000..ddb799a17e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/models.py
@@ -0,0 +1,2218 @@
+import copy
+import datetime
+import os
+import random
+import string
+
+from collections import defaultdict
+from jinja2 import Template
+from re import compile as re_compile
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel, get_account_id
+
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from moto.ec2.models import ec2_backends
+from .exceptions import (
+ RDSClientError,
+ DBClusterNotFoundError,
+ DBClusterSnapshotAlreadyExistsError,
+ DBClusterSnapshotNotFoundError,
+ DBInstanceNotFoundError,
+ DBSnapshotNotFoundError,
+ DBSecurityGroupNotFoundError,
+ DBSubnetGroupNotFoundError,
+ DBParameterGroupNotFoundError,
+ OptionGroupNotFoundFaultError,
+ InvalidDBClusterStateFaultError,
+ InvalidDBInstanceStateError,
+ SnapshotQuotaExceededError,
+ DBSnapshotAlreadyExistsError,
+ InvalidParameterValue,
+ InvalidParameterCombination,
+ InvalidDBClusterStateFault,
+ ExportTaskNotFoundError,
+ ExportTaskAlreadyExistsError,
+ InvalidExportSourceStateError,
+ SubscriptionNotFoundError,
+ SubscriptionAlreadyExistError,
+)
+from .utils import FilterDef, apply_filter, merge_filters, validate_filters
+
+
+class Cluster:
+ def __init__(self, **kwargs):
+ self.db_name = kwargs.get("db_name")
+ self.db_cluster_identifier = kwargs.get("db_cluster_identifier")
+ self.db_cluster_instance_class = kwargs.get("db_cluster_instance_class")
+ self.deletion_protection = kwargs.get("deletion_protection")
+ self.engine = kwargs.get("engine")
+ self.engine_version = kwargs.get("engine_version")
+ if not self.engine_version:
+ self.engine_version = Cluster.default_engine_version(self.engine)
+ self.engine_mode = kwargs.get("engine_mode") or "provisioned"
+ self.iops = kwargs.get("iops")
+ self.status = "active"
+ self.region_name = kwargs.get("region")
+ self.cluster_create_time = iso_8601_datetime_with_milliseconds(
+ datetime.datetime.now()
+ )
+ self.copy_tags_to_snapshot = kwargs.get("copy_tags_to_snapshot")
+ if self.copy_tags_to_snapshot is None:
+ self.copy_tags_to_snapshot = True
+ self.storage_type = kwargs.get("storage_type")
+ if self.storage_type is None:
+ self.storage_type = Cluster.default_storage_type(iops=self.iops)
+ self.allocated_storage = kwargs.get("allocated_storage")
+ if self.allocated_storage is None:
+ self.allocated_storage = Cluster.default_allocated_storage(
+ engine=self.engine, storage_type=self.storage_type
+ )
+ self.master_username = kwargs.get("master_username")
+ if not self.master_username:
+ raise InvalidParameterValue(
+ "The parameter MasterUsername must be provided and must not be blank."
+ )
+ self.master_user_password = kwargs.get("master_user_password")
+ if not self.master_user_password:
+ raise InvalidParameterValue(
+ "The parameter MasterUserPassword must be provided and must not be blank."
+ )
+ if len(self.master_user_password) < 8:
+ raise InvalidParameterValue(
+ "The parameter MasterUserPassword is not a valid password because it is shorter than 8 characters."
+ )
+ self.availability_zones = kwargs.get("availability_zones")
+ if not self.availability_zones:
+ self.availability_zones = [
+ f"{self.region_name}a",
+ f"{self.region_name}b",
+ f"{self.region_name}c",
+ ]
+ self.parameter_group = kwargs.get("parameter_group") or "default.aurora8.0"
+ self.subnet_group = "default"
+ self.status = "creating"
+ self.url_identifier = "".join(
+ random.choice(string.ascii_lowercase + string.digits) for _ in range(12)
+ )
+ self.endpoint = f"{self.db_cluster_identifier}.cluster-{self.url_identifier}.{self.region_name}.rds.amazonaws.com"
+ self.reader_endpoint = f"{self.db_cluster_identifier}.cluster-ro-{self.url_identifier}.{self.region_name}.rds.amazonaws.com"
+ self.port = kwargs.get("port")
+ if self.port is None:
+ self.port = Cluster.default_port(self.engine)
+ self.preferred_backup_window = "01:37-02:07"
+ self.preferred_maintenance_window = "wed:02:40-wed:03:10"
+ # This should default to the default security group
+ self.vpc_security_groups = []
+ self.hosted_zone_id = "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(14)
+ )
+ self.resource_id = "cluster-" + "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
+ )
+ self.tags = kwargs.get("tags", [])
+ self.enabled_cloudwatch_logs_exports = (
+ kwargs.get("enable_cloudwatch_logs_exports") or []
+ )
+
+ @property
+ def db_cluster_arn(self):
+ return "arn:aws:rds:{0}:{1}:cluster:{2}".format(
+ self.region_name, get_account_id(), self.db_cluster_identifier
+ )
+
+ def to_xml(self):
+ template = Template(
+ """<DBCluster>
+ <AllocatedStorage>1</AllocatedStorage>
+ <AvailabilityZones>
+ {% for zone in cluster.availability_zones %}
+ <AvailabilityZone>{{ zone }}</AvailabilityZone>
+ {% endfor %}
+ </AvailabilityZones>
+ <BackupRetentionPeriod>1</BackupRetentionPeriod>
+ <DBInstanceStatus>{{ cluster.status }}</DBInstanceStatus>
+ {% if cluster.db_name %}<DatabaseName>{{ cluster.db_name }}</DatabaseName>{% endif %}
+ <DBClusterIdentifier>{{ cluster.db_cluster_identifier }}</DBClusterIdentifier>
+ <DBClusterParameterGroup>{{ cluster.parameter_group }}</DBClusterParameterGroup>
+ <DBSubnetGroup>{{ cluster.subnet_group }}</DBSubnetGroup>
+ <ClusterCreateTime>{{ cluster.cluster_create_time }}</ClusterCreateTime>
+ <Engine>{{ cluster.engine }}</Engine>
+ <Status>{{ cluster.status }}</Status>
+ <Endpoint>{{ cluster.endpoint }}</Endpoint>
+ <ReaderEndpoint>{{ cluster.reader_endpoint }}</ReaderEndpoint>
+ <MultiAZ>false</MultiAZ>
+ <EngineVersion>{{ cluster.engine_version }}</EngineVersion>
+ <Port>{{ cluster.port }}</Port>
+ {% if cluster.iops %}
+ <Iops>{{ cluster.iops }}</Iops>
+ <StorageType>io1</StorageType>
+ {% else %}
+ <StorageType>{{ cluster.storage_type }}</StorageType>
+ {% endif %}
+ <DBClusterInstanceClass>{{ cluster.db_cluster_instance_class }}</DBClusterInstanceClass>
+ <MasterUsername>{{ cluster.master_username }}</MasterUsername>
+ <PreferredBackupWindow>{{ cluster.preferred_backup_window }}</PreferredBackupWindow>
+ <PreferredMaintenanceWindow>{{ cluster.preferred_maintenance_window }}</PreferredMaintenanceWindow>
+ <ReadReplicaIdentifiers></ReadReplicaIdentifiers>
+ <DBClusterMembers></DBClusterMembers>
+ <VpcSecurityGroups>
+ {% for id in cluster.vpc_security_groups %}
+ <VpcSecurityGroup>
+ <VpcSecurityGroupId>{{ id }}</VpcSecurityGroupId>
+ <Status>active</Status>
+ </VpcSecurityGroup>
+ {% endfor %}
+ </VpcSecurityGroups>
+ <HostedZoneId>{{ cluster.hosted_zone_id }}</HostedZoneId>
+ <StorageEncrypted>false</StorageEncrypted>
+ <DbClusterResourceId>{{ cluster.resource_id }}</DbClusterResourceId>
+ <DBClusterArn>{{ cluster.db_cluster_arn }}</DBClusterArn>
+ <AssociatedRoles></AssociatedRoles>
+ <IAMDatabaseAuthenticationEnabled>false</IAMDatabaseAuthenticationEnabled>
+ <EngineMode>{{ cluster.engine_mode }}</EngineMode>
+ <DeletionProtection>{{ 'true' if cluster.deletion_protection else 'false' }}</DeletionProtection>
+ <HttpEndpointEnabled>false</HttpEndpointEnabled>
+ <CopyTagsToSnapshot>{{ cluster.copy_tags_to_snapshot }}</CopyTagsToSnapshot>
+ <CrossAccountClone>false</CrossAccountClone>
+ <DomainMemberships></DomainMemberships>
+ <EnabledCloudwatchLogsExports>
+ {% for export in cluster.enabled_cloudwatch_logs_exports %}
+ <member>{{ export }}</member>
+ {% endfor %}
+ </EnabledCloudwatchLogsExports>
+ <TagList>
+ {%- for tag in cluster.tags -%}
+ <Tag>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </Tag>
+ {%- endfor -%}
+ </TagList>
+ </DBCluster>"""
+ )
+ return template.render(cluster=self)
+
+ @staticmethod
+ def default_engine_version(engine):
+ return {
+ "aurora": "5.6.mysql_aurora.1.22.5",
+ "aurora-mysql": "5.7.mysql_aurora.2.07.2",
+ "aurora-postgresql": "12.7",
+ "mysql": "8.0.23",
+ "postgres": "13.4",
+ }[engine]
+
+ @staticmethod
+ def default_port(engine):
+ return {
+ "aurora": 3306,
+ "aurora-mysql": 3306,
+ "aurora-postgresql": 5432,
+ "mysql": 3306,
+ "postgres": 5432,
+ }[engine]
+
+ @staticmethod
+ def default_storage_type(iops):
+ if iops is None:
+ return "gp2"
+ else:
+ return "io1"
+
+ @staticmethod
+ def default_allocated_storage(engine, storage_type):
+ return {
+ "aurora": {"gp2": 0, "io1": 0, "standard": 0},
+ "aurora-mysql": {"gp2": 20, "io1": 100, "standard": 10},
+ "aurora-postgresql": {"gp2": 20, "io1": 100, "standard": 10},
+ "mysql": {"gp2": 20, "io1": 100, "standard": 5},
+ "postgres": {"gp2": 20, "io1": 100, "standard": 5},
+ }[engine][storage_type]
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+
+class ClusterSnapshot(BaseModel):
+
+ SUPPORTED_FILTERS = {
+ "db-cluster-id": FilterDef(
+ ["cluster.db_cluster_arn", "cluster.db_cluster_identifier"],
+ "DB Cluster Identifiers",
+ ),
+ "db-cluster-snapshot-id": FilterDef(
+ ["snapshot_id"], "DB Cluster Snapshot Identifiers"
+ ),
+ "snapshot-type": FilterDef(None, "Snapshot Types"),
+ "engine": FilterDef(["cluster.engine"], "Engine Names"),
+ }
+
+ def __init__(self, cluster, snapshot_id, tags):
+ self.cluster = cluster
+ self.snapshot_id = snapshot_id
+ self.tags = tags
+ self.status = "available"
+ self.created_at = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+
+ @property
+ def snapshot_arn(self):
+ return "arn:aws:rds:{0}:{1}:cluster-snapshot:{2}".format(
+ self.cluster.region_name, get_account_id(), self.snapshot_id
+ )
+
+ def to_xml(self):
+ template = Template(
+ """
+ <DBClusterSnapshot>
+ <DBClusterSnapshotIdentifier>{{ snapshot.snapshot_id }}</DBClusterSnapshotIdentifier>
+ <SnapshotCreateTime>{{ snapshot.created_at }}</SnapshotCreateTime>
+ <DBClusterIdentifier>{{ cluster.db_cluster_identifier }}</DBClusterIdentifier>
+ <ClusterCreateTime>{{ snapshot.created_at }}</ClusterCreateTime>
+ <PercentProgress>{{ 100 }}</PercentProgress>
+ <AllocatedStorage>{{ cluster.allocated_storage }}</AllocatedStorage>
+ <MasterUsername>{{ cluster.master_username }}</MasterUsername>
+ <Port>{{ cluster.port }}</Port>
+ <Engine>{{ cluster.engine }}</Engine>
+ <Status>{{ snapshot.status }}</Status>
+ <SnapshotType>manual</SnapshotType>
+ <DBClusterSnapshotArn>{{ snapshot.snapshot_arn }}</DBClusterSnapshotArn>
+ <SourceRegion>{{ cluster.region }}</SourceRegion>
+ {% if cluster.iops %}
+ <Iops>{{ cluster.iops }}</Iops>
+ <StorageType>io1</StorageType>
+ {% else %}
+ <StorageType>{{ cluster.storage_type }}</StorageType>
+ {% endif %}
+ <Timezone></Timezone>
+ <LicenseModel>{{ cluster.license_model }}</LicenseModel>
+ </DBClusterSnapshot>
+ """
+ )
+ return template.render(snapshot=self, cluster=self.cluster)
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+
+class Database(CloudFormationModel):
+
+ SUPPORTED_FILTERS = {
+ "db-cluster-id": FilterDef(["db_cluster_identifier"], "DB Cluster Identifiers"),
+ "db-instance-id": FilterDef(
+ ["db_instance_arn", "db_instance_identifier"], "DB Instance Identifiers"
+ ),
+ "dbi-resource-id": FilterDef(["dbi_resource_id"], "Dbi Resource Ids"),
+ "domain": FilterDef(None, ""),
+ "engine": FilterDef(["engine"], "Engine Names"),
+ }
+
+ default_engine_versions = {
+ "MySQL": "5.6.21",
+ "mysql": "5.6.21",
+ "oracle-se1": "11.2.0.4.v3",
+ "oracle-se": "11.2.0.4.v3",
+ "oracle-ee": "11.2.0.4.v3",
+ "sqlserver-ee": "11.00.2100.60.v1",
+ "sqlserver-se": "11.00.2100.60.v1",
+ "sqlserver-ex": "11.00.2100.60.v1",
+ "sqlserver-web": "11.00.2100.60.v1",
+ "postgres": "9.3.3",
+ }
+
+ def __init__(self, **kwargs):
+ self.status = "available"
+ self.is_replica = False
+ self.replicas = []
+ self.region_name = kwargs.get("region")
+ self.engine = kwargs.get("engine")
+ self.engine_version = kwargs.get("engine_version", None)
+ if not self.engine_version and self.engine in self.default_engine_versions:
+ self.engine_version = self.default_engine_versions[self.engine]
+ self.iops = kwargs.get("iops")
+ self.storage_encrypted = kwargs.get("storage_encrypted", False)
+ if self.storage_encrypted:
+ self.kms_key_id = kwargs.get("kms_key_id", "default_kms_key_id")
+ else:
+ self.kms_key_id = kwargs.get("kms_key_id")
+ self.storage_type = kwargs.get("storage_type")
+ if self.storage_type is None:
+ self.storage_type = Database.default_storage_type(iops=self.iops)
+ self.master_username = kwargs.get("master_username")
+ self.master_user_password = kwargs.get("master_user_password")
+ self.auto_minor_version_upgrade = kwargs.get("auto_minor_version_upgrade")
+ if self.auto_minor_version_upgrade is None:
+ self.auto_minor_version_upgrade = True
+ self.allocated_storage = kwargs.get("allocated_storage")
+ if self.allocated_storage is None:
+ self.allocated_storage = Database.default_allocated_storage(
+ engine=self.engine, storage_type=self.storage_type
+ )
+ self.db_cluster_identifier = kwargs.get("db_cluster_identifier")
+ self.db_instance_identifier = kwargs.get("db_instance_identifier")
+ self.source_db_identifier = kwargs.get("source_db_identifier")
+ self.db_instance_class = kwargs.get("db_instance_class")
+ self.port = kwargs.get("port")
+ if self.port is None:
+ self.port = Database.default_port(self.engine)
+ self.db_instance_identifier = kwargs.get("db_instance_identifier")
+ self.db_name = kwargs.get("db_name")
+ self.instance_create_time = iso_8601_datetime_with_milliseconds(
+ datetime.datetime.now()
+ )
+ self.publicly_accessible = kwargs.get("publicly_accessible")
+ if self.publicly_accessible is None:
+ self.publicly_accessible = True
+ self.copy_tags_to_snapshot = kwargs.get("copy_tags_to_snapshot")
+ if self.copy_tags_to_snapshot is None:
+ self.copy_tags_to_snapshot = False
+ self.backup_retention_period = kwargs.get("backup_retention_period")
+ if self.backup_retention_period is None:
+ self.backup_retention_period = 1
+ self.availability_zone = kwargs.get("availability_zone")
+ self.multi_az = kwargs.get("multi_az")
+ self.db_subnet_group_name = kwargs.get("db_subnet_group_name")
+ if self.db_subnet_group_name:
+ self.db_subnet_group = rds_backends[
+ self.region_name
+ ].describe_subnet_groups(self.db_subnet_group_name)[0]
+ else:
+ self.db_subnet_group = None
+ self.security_groups = kwargs.get("security_groups", [])
+ self.vpc_security_group_ids = kwargs.get("vpc_security_group_ids", [])
+ self.preferred_maintenance_window = kwargs.get(
+ "preferred_maintenance_window", "wed:06:38-wed:07:08"
+ )
+ self.db_parameter_group_name = kwargs.get("db_parameter_group_name")
+ if (
+ self.db_parameter_group_name
+ and not self.is_default_parameter_group(self.db_parameter_group_name)
+ and self.db_parameter_group_name
+ not in rds_backends[self.region_name].db_parameter_groups
+ ):
+ raise DBParameterGroupNotFoundError(self.db_parameter_group_name)
+
+ self.preferred_backup_window = kwargs.get(
+ "preferred_backup_window", "13:14-13:44"
+ )
+ self.license_model = kwargs.get("license_model", "general-public-license")
+ self.option_group_name = kwargs.get("option_group_name", None)
+ self.option_group_supplied = self.option_group_name is not None
+ if (
+ self.option_group_name
+ and self.option_group_name
+ not in rds_backends[self.region_name].option_groups
+ ):
+ raise OptionGroupNotFoundFaultError(self.option_group_name)
+ self.default_option_groups = {
+ "MySQL": "default.mysql5.6",
+ "mysql": "default.mysql5.6",
+ "postgres": "default.postgres9.3",
+ }
+ if not self.option_group_name and self.engine in self.default_option_groups:
+ self.option_group_name = self.default_option_groups[self.engine]
+ self.character_set_name = kwargs.get("character_set_name", None)
+ self.enable_iam_database_authentication = kwargs.get(
+ "enable_iam_database_authentication", False
+ )
+ self.dbi_resource_id = "db-M5ENSHXFPU6XHZ4G4ZEI5QIO2U"
+ self.tags = kwargs.get("tags", [])
+ self.deletion_protection = kwargs.get("deletion_protection", False)
+ self.enabled_cloudwatch_logs_exports = (
+ kwargs.get("enable_cloudwatch_logs_exports") or []
+ )
+
+ @property
+ def db_instance_arn(self):
+ return "arn:aws:rds:{0}:{1}:db:{2}".format(
+ self.region_name, get_account_id(), self.db_instance_identifier
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.db_instance_identifier
+
+ def db_parameter_groups(self):
+ if not self.db_parameter_group_name or self.is_default_parameter_group(
+ self.db_parameter_group_name
+ ):
+ (
+ db_family,
+ db_parameter_group_name,
+ ) = self.default_db_parameter_group_details()
+ description = "Default parameter group for {0}".format(db_family)
+ return [
+ DBParameterGroup(
+ name=db_parameter_group_name,
+ family=db_family,
+ description=description,
+ tags={},
+ region=self.region_name,
+ )
+ ]
+ else:
+ if (
+ self.db_parameter_group_name
+ not in rds_backends[self.region_name].db_parameter_groups
+ ):
+ raise DBParameterGroupNotFoundError(self.db_parameter_group_name)
+
+ return [
+ rds_backends[self.region_name].db_parameter_groups[
+ self.db_parameter_group_name
+ ]
+ ]
+
+ def is_default_parameter_group(self, param_group_name):
+ return param_group_name.startswith("default.%s" % self.engine.lower())
+
+ def default_db_parameter_group_details(self):
+ if not self.engine_version:
+ return (None, None)
+
+ minor_engine_version = ".".join(str(self.engine_version).rsplit(".")[:-1])
+ db_family = "{0}{1}".format(self.engine.lower(), minor_engine_version)
+
+ return db_family, "default.{0}".format(db_family)
+
+ def to_xml(self):
+ template = Template(
+ """<DBInstance>
+ <BackupRetentionPeriod>{{ database.backup_retention_period }}</BackupRetentionPeriod>
+ <DBInstanceStatus>{{ database.status }}</DBInstanceStatus>
+ {% if database.db_name %}<DBName>{{ database.db_name }}</DBName>{% endif %}
+ <MultiAZ>{{ 'true' if database.multi_az else 'false' }}</MultiAZ>
+ <VpcSecurityGroups>
+ {% for vpc_security_group_id in database.vpc_security_group_ids %}
+ <VpcSecurityGroupMembership>
+ <Status>active</Status>
+ <VpcSecurityGroupId>{{ vpc_security_group_id }}</VpcSecurityGroupId>
+ </VpcSecurityGroupMembership>
+ {% endfor %}
+ </VpcSecurityGroups>
+ {% if database.db_cluster_identifier %}<DBClusterIdentifier>{{ database.db_cluster_identifier }}</DBClusterIdentifier>{% endif %}
+ <DBInstanceIdentifier>{{ database.db_instance_identifier }}</DBInstanceIdentifier>
+ <DbiResourceId>{{ database.dbi_resource_id }}</DbiResourceId>
+ <InstanceCreateTime>{{ database.instance_create_time }}</InstanceCreateTime>
+ <PreferredBackupWindow>03:50-04:20</PreferredBackupWindow>
+ <PreferredMaintenanceWindow>wed:06:38-wed:07:08</PreferredMaintenanceWindow>
+ <ReadReplicaDBInstanceIdentifiers>
+ {% for replica_id in database.replicas %}
+ <ReadReplicaDBInstanceIdentifier>{{ replica_id }}</ReadReplicaDBInstanceIdentifier>
+ {% endfor %}
+ </ReadReplicaDBInstanceIdentifiers>
+ <StatusInfos>
+ {% if database.is_replica %}
+ <DBInstanceStatusInfo>
+ <StatusType>read replication</StatusType>
+ <Status>replicating</Status>
+ <Normal>true</Normal>
+ <Message></Message>
+ </DBInstanceStatusInfo>
+ {% endif %}
+ </StatusInfos>
+ <EnabledCloudwatchLogsExports>
+ {% for export in database.enabled_cloudwatch_logs_exports %}
+ <member>{{ export }}</member>
+ {% endfor %}
+ </EnabledCloudwatchLogsExports>
+ {% if database.is_replica %}
+ <ReadReplicaSourceDBInstanceIdentifier>{{ database.source_db_identifier }}</ReadReplicaSourceDBInstanceIdentifier>
+ {% endif %}
+ <Engine>{{ database.engine }}</Engine>
+ <IAMDatabaseAuthenticationEnabled>{{'true' if database.enable_iam_database_authentication else 'false' }}</IAMDatabaseAuthenticationEnabled>
+ <LicenseModel>{{ database.license_model }}</LicenseModel>
+ <EngineVersion>{{ database.engine_version }}</EngineVersion>
+ <OptionGroupMemberships>
+ <OptionGroupMembership>
+ <OptionGroupName>{{ database.option_group_name }}</OptionGroupName>
+ <Status>in-sync</Status>
+ </OptionGroupMembership>
+ </OptionGroupMemberships>
+ <DBParameterGroups>
+ {% for db_parameter_group in database.db_parameter_groups() %}
+ <DBParameterGroup>
+ <ParameterApplyStatus>in-sync</ParameterApplyStatus>
+ <DBParameterGroupName>{{ db_parameter_group.name }}</DBParameterGroupName>
+ </DBParameterGroup>
+ {% endfor %}
+ </DBParameterGroups>
+ <DBSecurityGroups>
+ {% for security_group in database.security_groups %}
+ <DBSecurityGroup>
+ <Status>active</Status>
+ <DBSecurityGroupName>{{ security_group }}</DBSecurityGroupName>
+ </DBSecurityGroup>
+ {% endfor %}
+ </DBSecurityGroups>
+ {% if database.db_subnet_group %}
+ <DBSubnetGroup>
+ <DBSubnetGroupName>{{ database.db_subnet_group.subnet_name }}</DBSubnetGroupName>
+ <DBSubnetGroupDescription>{{ database.db_subnet_group.description }}</DBSubnetGroupDescription>
+ <SubnetGroupStatus>{{ database.db_subnet_group.status }}</SubnetGroupStatus>
+ <Subnets>
+ {% for subnet in database.db_subnet_group.subnets %}
+ <Subnet>
+ <SubnetStatus>Active</SubnetStatus>
+ <SubnetIdentifier>{{ subnet.id }}</SubnetIdentifier>
+ <SubnetAvailabilityZone>
+ <Name>{{ subnet.availability_zone }}</Name>
+ <ProvisionedIopsCapable>false</ProvisionedIopsCapable>
+ </SubnetAvailabilityZone>
+ </Subnet>
+ {% endfor %}
+ </Subnets>
+ <VpcId>{{ database.db_subnet_group.vpc_id }}</VpcId>
+ </DBSubnetGroup>
+ {% endif %}
+ <PubliclyAccessible>{{ database.publicly_accessible }}</PubliclyAccessible>
+ <CopyTagsToSnapshot>{{ database.copy_tags_to_snapshot }}</CopyTagsToSnapshot>
+ <AutoMinorVersionUpgrade>{{ database.auto_minor_version_upgrade }}</AutoMinorVersionUpgrade>
+ <AllocatedStorage>{{ database.allocated_storage }}</AllocatedStorage>
+ <StorageEncrypted>{{ database.storage_encrypted }}</StorageEncrypted>
+ {% if database.kms_key_id %}
+ <KmsKeyId>{{ database.kms_key_id }}</KmsKeyId>
+ {% endif %}
+ {% if database.iops %}
+ <Iops>{{ database.iops }}</Iops>
+ <StorageType>io1</StorageType>
+ {% else %}
+ <StorageType>{{ database.storage_type }}</StorageType>
+ {% endif %}
+ <DBInstanceClass>{{ database.db_instance_class }}</DBInstanceClass>
+ <MasterUsername>{{ database.master_username }}</MasterUsername>
+ <Endpoint>
+ <Address>{{ database.address }}</Address>
+ <Port>{{ database.port }}</Port>
+ </Endpoint>
+ <DBInstanceArn>{{ database.db_instance_arn }}</DBInstanceArn>
+ <TagList>
+ {%- for tag in database.tags -%}
+ <Tag>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </Tag>
+ {%- endfor -%}
+ </TagList>
+ <DeletionProtection>{{ 'true' if database.deletion_protection else 'false' }}</DeletionProtection>
+ </DBInstance>"""
+ )
+ return template.render(database=self)
+
+ @property
+ def address(self):
+ return "{0}.aaaaaaaaaa.{1}.rds.amazonaws.com".format(
+ self.db_instance_identifier, self.region_name
+ )
+
+ def add_replica(self, replica):
+ self.replicas.append(replica.db_instance_identifier)
+
+ def remove_replica(self, replica):
+ self.replicas.remove(replica.db_instance_identifier)
+
+ def set_as_replica(self):
+ self.is_replica = True
+ self.replicas = []
+
+ def update(self, db_kwargs):
+ for key, value in db_kwargs.items():
+ if value is not None:
+ setattr(self, key, value)
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Endpoint.Address", "Endpoint.Port"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # Local import to avoid circular dependency with cloudformation.parsing
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Endpoint.Address":
+ return self.address
+ elif attribute_name == "Endpoint.Port":
+ return self.port
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def default_port(engine):
+ return {
+ "mysql": 3306,
+ "mariadb": 3306,
+ "postgres": 5432,
+ "oracle-ee": 1521,
+ "oracle-se2": 1521,
+ "oracle-se1": 1521,
+ "oracle-se": 1521,
+ "sqlserver-ee": 1433,
+ "sqlserver-ex": 1433,
+ "sqlserver-se": 1433,
+ "sqlserver-web": 1433,
+ }[engine]
+
+ @staticmethod
+ def default_storage_type(iops):
+ if iops is None:
+ return "gp2"
+ else:
+ return "io1"
+
+ @staticmethod
+ def default_allocated_storage(engine, storage_type):
+ return {
+ "aurora": {"gp2": 0, "io1": 0, "standard": 0},
+ "mysql": {"gp2": 20, "io1": 100, "standard": 5},
+ "mariadb": {"gp2": 20, "io1": 100, "standard": 5},
+ "postgres": {"gp2": 20, "io1": 100, "standard": 5},
+ "oracle-ee": {"gp2": 20, "io1": 100, "standard": 10},
+ "oracle-se2": {"gp2": 20, "io1": 100, "standard": 10},
+ "oracle-se1": {"gp2": 20, "io1": 100, "standard": 10},
+ "oracle-se": {"gp2": 20, "io1": 100, "standard": 10},
+ "sqlserver-ee": {"gp2": 200, "io1": 200, "standard": 200},
+ "sqlserver-ex": {"gp2": 20, "io1": 100, "standard": 20},
+ "sqlserver-se": {"gp2": 200, "io1": 200, "standard": 200},
+ "sqlserver-web": {"gp2": 20, "io1": 100, "standard": 20},
+ }[engine][storage_type]
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "DBInstanceIdentifier"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html
+ return "AWS::RDS::DBInstance"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ db_security_groups = properties.get("DBSecurityGroups")
+ if not db_security_groups:
+ db_security_groups = []
+ security_groups = [group.group_name for group in db_security_groups]
+ db_subnet_group = properties.get("DBSubnetGroupName")
+ db_subnet_group_name = db_subnet_group.subnet_name if db_subnet_group else None
+ db_kwargs = {
+ "auto_minor_version_upgrade": properties.get("AutoMinorVersionUpgrade"),
+ "allocated_storage": properties.get("AllocatedStorage"),
+ "availability_zone": properties.get("AvailabilityZone"),
+ "backup_retention_period": properties.get("BackupRetentionPeriod"),
+ "db_instance_class": properties.get("DBInstanceClass"),
+ "db_instance_identifier": resource_name,
+ "db_name": properties.get("DBName"),
+ "db_subnet_group_name": db_subnet_group_name,
+ "engine": properties.get("Engine"),
+ "engine_version": properties.get("EngineVersion"),
+ "iops": properties.get("Iops"),
+ "kms_key_id": properties.get("KmsKeyId"),
+ "master_user_password": properties.get("MasterUserPassword"),
+ "master_username": properties.get("MasterUsername"),
+ "multi_az": properties.get("MultiAZ"),
+ "db_parameter_group_name": properties.get("DBParameterGroupName"),
+ "port": properties.get("Port", 3306),
+ "publicly_accessible": properties.get("PubliclyAccessible"),
+ "copy_tags_to_snapshot": properties.get("CopyTagsToSnapshot"),
+ "region": region_name,
+ "security_groups": security_groups,
+ "storage_encrypted": properties.get("StorageEncrypted"),
+ "storage_type": properties.get("StorageType"),
+ "tags": properties.get("Tags"),
+ "vpc_security_group_ids": properties.get("VpcSecurityGroupIds", []),
+ }
+
+ rds_backend = rds_backends[region_name]
+ source_db_identifier = properties.get("SourceDBInstanceIdentifier")
+ if source_db_identifier:
+ # Replica
+ db_kwargs["source_db_identifier"] = source_db_identifier
+ database = rds_backend.create_database_replica(db_kwargs)
+ else:
+ database = rds_backend.create_db_instance(db_kwargs)
+ return database
+
+ def to_json(self):
+ template = Template(
+ """{
+ "AllocatedStorage": 10,
+ "AutoMinorVersionUpgrade": "{{ database.auto_minor_version_upgrade }}",
+ "AvailabilityZone": "{{ database.availability_zone }}",
+ "BackupRetentionPeriod": "{{ database.backup_retention_period }}",
+ "CharacterSetName": {%- if database.character_set_name -%}{{ database.character_set_name }}{%- else %} null{%- endif -%},
+ "DBInstanceClass": "{{ database.db_instance_class }}",
+ {%- if database.db_cluster_identifier -%}"DBClusterIdentifier": "{{ database.db_cluster_identifier }}",{%- endif -%}
+ "DBInstanceIdentifier": "{{ database.db_instance_identifier }}",
+ "DBInstanceStatus": "{{ database.status }}",
+ "DBName": {%- if database.db_name -%}"{{ database.db_name }}"{%- else %} null{%- endif -%},
+ {% if database.db_parameter_group_name -%}"DBParameterGroups": {
+ "DBParameterGroup": {
+ "ParameterApplyStatus": "in-sync",
+ "DBParameterGroupName": "{{ database.db_parameter_group_name }}"
+ }
+ },{%- endif %}
+ "DBSecurityGroups": [
+ {% for security_group in database.security_groups -%}{%- if loop.index != 1 -%},{%- endif -%}
+ {"DBSecurityGroup": {
+ "Status": "active",
+ "DBSecurityGroupName": "{{ security_group }}"
+ }}{% endfor %}
+ ],
+ {%- if database.db_subnet_group -%}{{ database.db_subnet_group.to_json() }},{%- endif %}
+ "Engine": "{{ database.engine }}",
+ "EngineVersion": "{{ database.engine_version }}",
+ "LatestRestorableTime": null,
+ "LicenseModel": "{{ database.license_model }}",
+ "MasterUsername": "{{ database.master_username }}",
+ "MultiAZ": "{{ database.multi_az }}",{% if database.option_group_name %}
+ "OptionGroupMemberships": [{
+ "OptionGroupMembership": {
+ "OptionGroupName": "{{ database.option_group_name }}",
+ "Status": "in-sync"
+ }
+ }],{%- endif %}
+ "PendingModifiedValues": { "MasterUserPassword": "****" },
+ "PreferredBackupWindow": "{{ database.preferred_backup_window }}",
+ "PreferredMaintenanceWindow": "{{ database.preferred_maintenance_window }}",
+ "PubliclyAccessible": "{{ database.publicly_accessible }}",
+ "CopyTagsToSnapshot": "{{ database.copy_tags_to_snapshot }}",
+ "AllocatedStorage": "{{ database.allocated_storage }}",
+ "Endpoint": {
+ "Address": "{{ database.address }}",
+ "Port": "{{ database.port }}"
+ },
+ "InstanceCreateTime": "{{ database.instance_create_time }}",
+ "Iops": null,
+ "ReadReplicaDBInstanceIdentifiers": [{%- for replica in database.replicas -%}
+ {%- if not loop.first -%},{%- endif -%}
+ "{{ replica }}"
+ {%- endfor -%}
+ ],
+ {%- if database.source_db_identifier -%}
+ "ReadReplicaSourceDBInstanceIdentifier": "{{ database.source_db_identifier }}",
+ {%- else -%}
+ "ReadReplicaSourceDBInstanceIdentifier": null,
+ {%- endif -%}
+ "SecondaryAvailabilityZone": null,
+ "StatusInfos": null,
+ "VpcSecurityGroups": [
+ {% for vpc_security_group_id in database.vpc_security_group_ids %}
+ {
+ "Status": "active",
+ "VpcSecurityGroupId": "{{ vpc_security_group_id }}"
+ }
+ {% endfor %}
+ ],
+ "DBInstanceArn": "{{ database.db_instance_arn }}"
+ }"""
+ )
+ return template.render(database=self)
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+ def delete(self, region_name):
+ backend = rds_backends[region_name]
+ backend.delete_db_instance(self.db_instance_identifier)
+
+
+class DatabaseSnapshot(BaseModel):
+
+ SUPPORTED_FILTERS = {
+ "db-instance-id": FilterDef(
+ ["database.db_instance_arn", "database.db_instance_identifier"],
+ "DB Instance Identifiers",
+ ),
+ "db-snapshot-id": FilterDef(["snapshot_id"], "DB Snapshot Identifiers"),
+ "dbi-resource-id": FilterDef(["database.dbi_resource_id"], "Dbi Resource Ids"),
+ "snapshot-type": FilterDef(None, "Snapshot Types"),
+ "engine": FilterDef(["database.engine"], "Engine Names"),
+ }
+
+ def __init__(self, database, snapshot_id, tags):
+ self.database = database
+ self.snapshot_id = snapshot_id
+ self.tags = tags
+ self.status = "available"
+ self.created_at = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+
+ @property
+ def snapshot_arn(self):
+ return "arn:aws:rds:{0}:{1}:snapshot:{2}".format(
+ self.database.region_name, get_account_id(), self.snapshot_id
+ )
+
+ def to_xml(self):
+ template = Template(
+ """<DBSnapshot>
+ <DBSnapshotIdentifier>{{ snapshot.snapshot_id }}</DBSnapshotIdentifier>
+ <DBInstanceIdentifier>{{ database.db_instance_identifier }}</DBInstanceIdentifier>
+ <DbiResourceId>{{ database.dbi_resource_id }}</DbiResourceId>
+ <SnapshotCreateTime>{{ snapshot.created_at }}</SnapshotCreateTime>
+ <Engine>{{ database.engine }}</Engine>
+ <AllocatedStorage>{{ database.allocated_storage }}</AllocatedStorage>
+ <Status>{{ snapshot.status }}</Status>
+ <Port>{{ database.port }}</Port>
+ <AvailabilityZone>{{ database.availability_zone }}</AvailabilityZone>
+ <VpcId>{{ database.db_subnet_group.vpc_id }}</VpcId>
+ <InstanceCreateTime>{{ snapshot.created_at }}</InstanceCreateTime>
+ <MasterUsername>{{ database.master_username }}</MasterUsername>
+ <EngineVersion>{{ database.engine_version }}</EngineVersion>
+ <LicenseModel>{{ database.license_model }}</LicenseModel>
+ <SnapshotType>manual</SnapshotType>
+ {% if database.iops %}
+ <Iops>{{ database.iops }}</Iops>
+ <StorageType>io1</StorageType>
+ {% else %}
+ <StorageType>{{ database.storage_type }}</StorageType>
+ {% endif %}
+ <OptionGroupName>{{ database.option_group_name }}</OptionGroupName>
+ <PercentProgress>{{ 100 }}</PercentProgress>
+ <SourceRegion>{{ database.region }}</SourceRegion>
+ <SourceDBSnapshotIdentifier></SourceDBSnapshotIdentifier>
+ <TdeCredentialArn></TdeCredentialArn>
+ <Encrypted>{{ database.storage_encrypted }}</Encrypted>
+ <KmsKeyId>{{ database.kms_key_id }}</KmsKeyId>
+ <DBSnapshotArn>{{ snapshot.snapshot_arn }}</DBSnapshotArn>
+ <Timezone></Timezone>
+ <IAMDatabaseAuthenticationEnabled>{{ database.enable_iam_database_authentication|lower }}</IAMDatabaseAuthenticationEnabled>
+ </DBSnapshot>"""
+ )
+ return template.render(snapshot=self, database=self.database)
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+
+class ExportTask(BaseModel):
+ def __init__(self, snapshot, kwargs):
+ self.snapshot = snapshot
+
+ self.export_task_identifier = kwargs.get("export_task_identifier")
+ self.kms_key_id = kwargs.get("kms_key_id", "default_kms_key_id")
+ self.source_arn = kwargs.get("source_arn")
+ self.iam_role_arn = kwargs.get("iam_role_arn")
+ self.s3_bucket_name = kwargs.get("s3_bucket_name")
+ self.s3_prefix = kwargs.get("s3_prefix", "")
+ self.export_only = kwargs.get("export_only", [])
+
+ self.status = "complete"
+ self.created_at = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+
+ def to_xml(self):
+ template = Template(
+ """
+ <ExportTaskIdentifier>{{ task.export_task_identifier }}</ExportTaskIdentifier>
+ <SourceArn>{{ snapshot.snapshot_arn }}</SourceArn>
+ <TaskStartTime>{{ task.created_at }}</TaskStartTime>
+ <TaskEndTime>{{ task.created_at }}</TaskEndTime>
+ <SnapshotTime>{{ snapshot.created_at }}</SnapshotTime>
+ <S3Bucket>{{ task.s3_bucket_name }}</S3Bucket>
+ <S3Prefix>{{ task.s3_prefix }}</S3Prefix>
+ <IamRoleArn>{{ task.iam_role_arn }}</IamRoleArn>
+ <KmsKeyId>{{ task.kms_key_id }}</KmsKeyId>
+ {%- if task.export_only -%}
+ <ExportOnly>
+ {%- for table in task.export_only -%}
+ <member>{{ table }}</member>
+ {%- endfor -%}
+ </ExportOnly>
+ {%- endif -%}
+ <Status>{{ task.status }}</Status>
+ <PercentProgress>{{ 100 }}</PercentProgress>
+ <TotalExtractedDataInGB>{{ 1 }}</TotalExtractedDataInGB>
+ <FailureCause></FailureCause>
+ <WarningMessage></WarningMessage>
+ """
+ )
+ return template.render(task=self, snapshot=self.snapshot)
+
+
+class EventSubscription(BaseModel):
+ def __init__(self, kwargs):
+ self.subscription_name = kwargs.get("subscription_name")
+ self.sns_topic_arn = kwargs.get("sns_topic_arn")
+ self.source_type = kwargs.get("source_type")
+ self.event_categories = kwargs.get("event_categories", [])
+ self.source_ids = kwargs.get("source_ids", [])
+ self.enabled = kwargs.get("enabled", True)
+ self.tags = kwargs.get("tags", True)
+
+ self.region_name = ""
+ self.customer_aws_id = copy.copy(get_account_id())
+ self.status = "active"
+ self.created_at = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+
+ @property
+ def es_arn(self):
+ return "arn:aws:rds:{0}:{1}:es:{2}".format(
+ self.region_name, get_account_id(), self.subscription_name
+ )
+
+ def to_xml(self):
+ template = Template(
+ """
+ <EventSubscription>
+ <CustomerAwsId>{{ subscription.customer_aws_id }}</CustomerAwsId>
+ <CustSubscriptionId>{{ subscription.subscription_name }}</CustSubscriptionId>
+ <SnsTopicArn>{{ subscription.sns_topic_arn }}</SnsTopicArn>
+ <SubscriptionCreationTime>{{ subscription.created_at }}</SubscriptionCreationTime>
+ <SourceType>{{ subscription.source_type }}</SourceType>
+ <SourceIdsList>
+ {%- for source_id in subscription.source_ids -%}
+ <SourceId>{{ source_id }}</SourceId>
+ {%- endfor -%}
+ </SourceIdsList>
+ <EventCategoriesList>
+ {%- for category in subscription.event_categories -%}
+ <EventCategory>{{ category }}</EventCategory>
+ {%- endfor -%}
+ </EventCategoriesList>
+ <Status>{{ subscription.status }}</Status>
+ <Enabled>{{ subscription.enabled }}</Enabled>
+ <EventSubscriptionArn>{{ subscription.es_arn }}</EventSubscriptionArn>
+ <TagList>
+ {%- for tag in subscription.tags -%}
+ <Tag><Key>{{ tag['Key'] }}</Key><Value>{{ tag['Value'] }}</Value></Tag>
+ {%- endfor -%}
+ </TagList>
+ </EventSubscription>
+ """
+ )
+ return template.render(subscription=self)
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+
+class SecurityGroup(CloudFormationModel):
+ def __init__(self, group_name, description, tags):
+ self.group_name = group_name
+ self.description = description
+ self.status = "authorized"
+ self.ip_ranges = []
+ self.ec2_security_groups = []
+ self.tags = tags
+ self.owner_id = get_account_id()
+ self.vpc_id = None
+
+ def to_xml(self):
+ template = Template(
+ """<DBSecurityGroup>
+ <EC2SecurityGroups>
+ {% for security_group in security_group.ec2_security_groups %}
+ <EC2SecurityGroup>
+ <EC2SecurityGroupId>{{ security_group.id }}</EC2SecurityGroupId>
+ <EC2SecurityGroupName>{{ security_group.name }}</EC2SecurityGroupName>
+ <EC2SecurityGroupOwnerId>{{ security_group.owner_id }}</EC2SecurityGroupOwnerId>
+ <Status>authorized</Status>
+ </EC2SecurityGroup>
+ {% endfor %}
+ </EC2SecurityGroups>
+
+ <DBSecurityGroupDescription>{{ security_group.description }}</DBSecurityGroupDescription>
+ <IPRanges>
+ {% for ip_range in security_group.ip_ranges %}
+ <IPRange>
+ <CIDRIP>{{ ip_range }}</CIDRIP>
+ <Status>authorized</Status>
+ </IPRange>
+ {% endfor %}
+ </IPRanges>
+ <OwnerId>{{ security_group.ownder_id }}</OwnerId>
+ <DBSecurityGroupName>{{ security_group.group_name }}</DBSecurityGroupName>
+ </DBSecurityGroup>"""
+ )
+ return template.render(security_group=self)
+
+ def to_json(self):
+ template = Template(
+ """{
+ "DBSecurityGroupDescription": "{{ security_group.description }}",
+ "DBSecurityGroupName": "{{ security_group.group_name }}",
+ "EC2SecurityGroups": {{ security_group.ec2_security_groups }},
+ "IPRanges": [{%- for ip in security_group.ip_ranges -%}
+ {%- if loop.index != 1 -%},{%- endif -%}
+ "{{ ip }}"
+ {%- endfor -%}
+ ],
+ "OwnerId": "{{ security_group.owner_id }}",
+ "VpcId": "{{ security_group.vpc_id }}"
+ }"""
+ )
+ return template.render(security_group=self)
+
+ def authorize_cidr(self, cidr_ip):
+ self.ip_ranges.append(cidr_ip)
+
+ def authorize_security_group(self, security_group):
+ self.ec2_security_groups.append(security_group)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsecuritygroup.html
+ return "AWS::RDS::DBSecurityGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ group_name = resource_name.lower()
+ description = properties["GroupDescription"]
+ security_group_ingress_rules = properties.get("DBSecurityGroupIngress", [])
+ tags = properties.get("Tags")
+
+ ec2_backend = ec2_backends[region_name]
+ rds_backend = rds_backends[region_name]
+ security_group = rds_backend.create_db_security_group(
+ group_name, description, tags
+ )
+ for security_group_ingress in security_group_ingress_rules:
+ for ingress_type, ingress_value in security_group_ingress.items():
+ if ingress_type == "CIDRIP":
+ security_group.authorize_cidr(ingress_value)
+ elif ingress_type == "EC2SecurityGroupName":
+ subnet = ec2_backend.get_security_group_from_name(ingress_value)
+ security_group.authorize_security_group(subnet)
+ elif ingress_type == "EC2SecurityGroupId":
+ subnet = ec2_backend.get_security_group_from_id(ingress_value)
+ security_group.authorize_security_group(subnet)
+ return security_group
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+ def delete(self, region_name):
+ backend = rds_backends[region_name]
+ backend.delete_security_group(self.group_name)
+
+
+class SubnetGroup(CloudFormationModel):
+ def __init__(self, subnet_name, description, subnets, tags):
+ self.subnet_name = subnet_name
+ self.description = description
+ self.subnets = subnets
+ self.status = "Complete"
+ self.tags = tags
+ self.vpc_id = self.subnets[0].vpc_id
+
+ def to_xml(self):
+ template = Template(
+ """<DBSubnetGroup>
+ <VpcId>{{ subnet_group.vpc_id }}</VpcId>
+ <SubnetGroupStatus>{{ subnet_group.status }}</SubnetGroupStatus>
+ <DBSubnetGroupDescription>{{ subnet_group.description }}</DBSubnetGroupDescription>
+ <DBSubnetGroupName>{{ subnet_group.subnet_name }}</DBSubnetGroupName>
+ <Subnets>
+ {% for subnet in subnet_group.subnets %}
+ <Subnet>
+ <SubnetStatus>Active</SubnetStatus>
+ <SubnetIdentifier>{{ subnet.id }}</SubnetIdentifier>
+ <SubnetAvailabilityZone>
+ <Name>{{ subnet.availability_zone }}</Name>
+ <ProvisionedIopsCapable>false</ProvisionedIopsCapable>
+ </SubnetAvailabilityZone>
+ </Subnet>
+ {% endfor %}
+ </Subnets>
+ </DBSubnetGroup>"""
+ )
+ return template.render(subnet_group=self)
+
+ def to_json(self):
+ template = Template(
+ """"DBSubnetGroup": {
+ "VpcId": "{{ subnet_group.vpc_id }}",
+ "SubnetGroupStatus": "{{ subnet_group.status }}",
+ "DBSubnetGroupDescription": "{{ subnet_group.description }}",
+ "DBSubnetGroupName": "{{ subnet_group.subnet_name }}",
+ "Subnets": {
+ "Subnet": [
+ {% for subnet in subnet_group.subnets %}{
+ "SubnetStatus": "Active",
+ "SubnetIdentifier": "{{ subnet.id }}",
+ "SubnetAvailabilityZone": {
+ "Name": "{{ subnet.availability_zone }}",
+ "ProvisionedIopsCapable": "false"
+ }
+ }{%- if not loop.last -%},{%- endif -%}{% endfor %}
+ ]
+ }
+ }"""
+ )
+ return template.render(subnet_group=self)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "DBSubnetGroupName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html
+ return "AWS::RDS::DBSubnetGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ description = properties["DBSubnetGroupDescription"]
+ subnet_ids = properties["SubnetIds"]
+ tags = properties.get("Tags")
+
+ ec2_backend = ec2_backends[region_name]
+ subnets = [ec2_backend.get_subnet(subnet_id) for subnet_id in subnet_ids]
+ rds_backend = rds_backends[region_name]
+ subnet_group = rds_backend.create_subnet_group(
+ resource_name, description, subnets, tags
+ )
+ return subnet_group
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+ def delete(self, region_name):
+ backend = rds_backends[region_name]
+ backend.delete_subnet_group(self.subnet_name)
+
+
+class RDSBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.arn_regex = re_compile(
+ r"^arn:aws:rds:.*:[0-9]*:(db|cluster|es|og|pg|ri|secgrp|snapshot|cluster-snapshot|subgrp):.*$"
+ )
+ self.clusters = OrderedDict()
+ self.databases = OrderedDict()
+ self.database_snapshots = OrderedDict()
+ self.cluster_snapshots = OrderedDict()
+ self.export_tasks = OrderedDict()
+ self.event_subscriptions = OrderedDict()
+ self.db_parameter_groups = {}
+ self.option_groups = {}
+ self.security_groups = {}
+ self.subnet_groups = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "rds"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "rds-data"
+ )
+
+ def create_db_instance(self, db_kwargs):
+ database_id = db_kwargs["db_instance_identifier"]
+ database = Database(**db_kwargs)
+ self.databases[database_id] = database
+ return database
+
+ def create_db_snapshot(
+ self, db_instance_identifier, db_snapshot_identifier, tags=None
+ ):
+ database = self.databases.get(db_instance_identifier)
+ if not database:
+ raise DBInstanceNotFoundError(db_instance_identifier)
+ if db_snapshot_identifier in self.database_snapshots:
+ raise DBSnapshotAlreadyExistsError(db_snapshot_identifier)
+ if len(self.database_snapshots) >= int(
+ os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
+ ):
+ raise SnapshotQuotaExceededError()
+ if tags is None:
+ tags = list()
+ if database.copy_tags_to_snapshot and not tags:
+ tags = database.get_tags()
+ snapshot = DatabaseSnapshot(database, db_snapshot_identifier, tags)
+ self.database_snapshots[db_snapshot_identifier] = snapshot
+ return snapshot
+
+ def copy_database_snapshot(
+ self, source_snapshot_identifier, target_snapshot_identifier, tags=None
+ ):
+ if source_snapshot_identifier not in self.database_snapshots:
+ raise DBSnapshotNotFoundError(source_snapshot_identifier)
+ if target_snapshot_identifier in self.database_snapshots:
+ raise DBSnapshotAlreadyExistsError(target_snapshot_identifier)
+ if len(self.database_snapshots) >= int(
+ os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
+ ):
+ raise SnapshotQuotaExceededError()
+
+ source_snapshot = self.database_snapshots[source_snapshot_identifier]
+ if tags is None:
+ tags = source_snapshot.tags
+ else:
+ tags = self._merge_tags(source_snapshot.tags, tags)
+ target_snapshot = DatabaseSnapshot(
+ source_snapshot.database, target_snapshot_identifier, tags
+ )
+ self.database_snapshots[target_snapshot_identifier] = target_snapshot
+
+ return target_snapshot
+
+ def delete_db_snapshot(self, db_snapshot_identifier):
+ if db_snapshot_identifier not in self.database_snapshots:
+ raise DBSnapshotNotFoundError(db_snapshot_identifier)
+
+ return self.database_snapshots.pop(db_snapshot_identifier)
+
+ def create_database_replica(self, db_kwargs):
+ database_id = db_kwargs["db_instance_identifier"]
+ source_database_id = db_kwargs["source_db_identifier"]
+ primary = self.find_db_from_id(source_database_id)
+ if self.arn_regex.match(source_database_id):
+ db_kwargs["region"] = self.region_name
+
+ # Shouldn't really copy here as the instance is duplicated. RDS replicas have different instances.
+ replica = copy.copy(primary)
+ replica.update(db_kwargs)
+ replica.set_as_replica()
+ self.databases[database_id] = replica
+ primary.add_replica(replica)
+ return replica
+
+ def describe_db_instances(self, db_instance_identifier=None, filters=None):
+ databases = self.databases
+ if db_instance_identifier:
+ filters = merge_filters(
+ filters, {"db-instance-id": [db_instance_identifier]}
+ )
+ if filters:
+ databases = self._filter_resources(databases, filters, Database)
+ if db_instance_identifier and not databases:
+ raise DBInstanceNotFoundError(db_instance_identifier)
+ return list(databases.values())
+
+ def describe_database_snapshots(
+ self, db_instance_identifier, db_snapshot_identifier, filters=None
+ ):
+ snapshots = self.database_snapshots
+ if db_instance_identifier:
+ filters = merge_filters(
+ filters, {"db-instance-id": [db_instance_identifier]}
+ )
+ if db_snapshot_identifier:
+ filters = merge_filters(
+ filters, {"db-snapshot-id": [db_snapshot_identifier]}
+ )
+ if filters:
+ snapshots = self._filter_resources(snapshots, filters, DatabaseSnapshot)
+ if db_snapshot_identifier and not snapshots and not db_instance_identifier:
+ raise DBSnapshotNotFoundError(db_snapshot_identifier)
+ return list(snapshots.values())
+
+ def modify_db_instance(self, db_instance_identifier, db_kwargs):
+ database = self.describe_db_instances(db_instance_identifier)[0]
+ if "new_db_instance_identifier" in db_kwargs:
+ del self.databases[db_instance_identifier]
+ db_instance_identifier = db_kwargs[
+ "db_instance_identifier"
+ ] = db_kwargs.pop("new_db_instance_identifier")
+ self.databases[db_instance_identifier] = database
+ database.update(db_kwargs)
+ return database
+
+ def reboot_db_instance(self, db_instance_identifier):
+ database = self.describe_db_instances(db_instance_identifier)[0]
+ return database
+
+ def restore_db_instance_from_db_snapshot(self, from_snapshot_id, overrides):
+ snapshot = self.describe_database_snapshots(
+ db_instance_identifier=None, db_snapshot_identifier=from_snapshot_id
+ )[0]
+ original_database = snapshot.database
+ new_instance_props = copy.deepcopy(original_database.__dict__)
+ if not original_database.option_group_supplied:
+ # If the option group is not supplied originally, the 'option_group_name' will receive a default value
+ # Force this reconstruction, and prevent any validation on the default value
+ del new_instance_props["option_group_name"]
+
+ for key, value in overrides.items():
+ if value:
+ new_instance_props[key] = value
+
+ return self.create_db_instance(new_instance_props)
+
+ def stop_db_instance(self, db_instance_identifier, db_snapshot_identifier=None):
+ database = self.describe_db_instances(db_instance_identifier)[0]
+ # todo: certain rds types not allowed to be stopped at this time.
+ # https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_StopInstance.html#USER_StopInstance.Limitations
+ if database.is_replica or (
+ database.multi_az and database.engine.lower().startswith("sqlserver")
+ ):
+ # todo: more db types not supported by stop/start instance api
+ raise InvalidDBClusterStateFaultError(db_instance_identifier)
+ if database.status != "available":
+ raise InvalidDBInstanceStateError(db_instance_identifier, "stop")
+ if db_snapshot_identifier:
+ self.create_db_snapshot(db_instance_identifier, db_snapshot_identifier)
+ database.status = "stopped"
+ return database
+
+ def start_db_instance(self, db_instance_identifier):
+ database = self.describe_db_instances(db_instance_identifier)[0]
+ # todo: bunch of different error messages to be generated from this api call
+ if database.status != "stopped":
+ raise InvalidDBInstanceStateError(db_instance_identifier, "start")
+ database.status = "available"
+ return database
+
+ def find_db_from_id(self, db_id):
+ if self.arn_regex.match(db_id):
+ arn_breakdown = db_id.split(":")
+ region = arn_breakdown[3]
+ backend = rds_backends[region]
+ db_name = arn_breakdown[-1]
+ else:
+ backend = self
+ db_name = db_id
+
+ return backend.describe_db_instances(db_name)[0]
+
+ def delete_db_instance(self, db_instance_identifier, db_snapshot_name=None):
+ if db_instance_identifier in self.databases:
+ if self.databases[db_instance_identifier].deletion_protection:
+ raise InvalidParameterValue(
+ "Can't delete Instance with protection enabled"
+ )
+ if db_snapshot_name:
+ self.create_db_snapshot(db_instance_identifier, db_snapshot_name)
+ database = self.databases.pop(db_instance_identifier)
+ if database.is_replica:
+ primary = self.find_db_from_id(database.source_db_identifier)
+ primary.remove_replica(database)
+ database.status = "deleting"
+ return database
+ else:
+ raise DBInstanceNotFoundError(db_instance_identifier)
+
+ def create_db_security_group(self, group_name, description, tags):
+ security_group = SecurityGroup(group_name, description, tags)
+ self.security_groups[group_name] = security_group
+ return security_group
+
+ def describe_security_groups(self, security_group_name):
+ if security_group_name:
+ if security_group_name in self.security_groups:
+ return [self.security_groups[security_group_name]]
+ else:
+ raise DBSecurityGroupNotFoundError(security_group_name)
+ return self.security_groups.values()
+
+ def delete_security_group(self, security_group_name):
+ if security_group_name in self.security_groups:
+ return self.security_groups.pop(security_group_name)
+ else:
+ raise DBSecurityGroupNotFoundError(security_group_name)
+
+ def delete_db_parameter_group(self, db_parameter_group_name):
+ if db_parameter_group_name in self.db_parameter_groups:
+ return self.db_parameter_groups.pop(db_parameter_group_name)
+ else:
+ raise DBParameterGroupNotFoundError(db_parameter_group_name)
+
+ def authorize_security_group(self, security_group_name, cidr_ip):
+ security_group = self.describe_security_groups(security_group_name)[0]
+ security_group.authorize_cidr(cidr_ip)
+ return security_group
+
+ def create_subnet_group(self, subnet_name, description, subnets, tags):
+ subnet_group = SubnetGroup(subnet_name, description, subnets, tags)
+ self.subnet_groups[subnet_name] = subnet_group
+ return subnet_group
+
+ def describe_subnet_groups(self, subnet_group_name):
+ if subnet_group_name:
+ if subnet_group_name in self.subnet_groups:
+ return [self.subnet_groups[subnet_group_name]]
+ else:
+ raise DBSubnetGroupNotFoundError(subnet_group_name)
+ return self.subnet_groups.values()
+
+ def modify_db_subnet_group(self, subnet_name, description, subnets):
+ subnet_group = self.subnet_groups.pop(subnet_name)
+ if not subnet_group:
+ raise DBSubnetGroupNotFoundError(subnet_name)
+ subnet_group.subnet_name = subnet_name
+ subnet_group.subnets = subnets
+ if description is not None:
+ subnet_group.description = description
+ return subnet_group
+
+ def delete_subnet_group(self, subnet_name):
+ if subnet_name in self.subnet_groups:
+ return self.subnet_groups.pop(subnet_name)
+ else:
+ raise DBSubnetGroupNotFoundError(subnet_name)
+
+ def create_option_group(self, option_group_kwargs):
+ option_group_id = option_group_kwargs["name"]
+ valid_option_group_engines = {
+ "mariadb": ["10.0", "10.1", "10.2", "10.3"],
+ "mysql": ["5.5", "5.6", "5.7", "8.0"],
+ "oracle-se2": ["11.2", "12.1", "12.2"],
+ "oracle-se1": ["11.2", "12.1", "12.2"],
+ "oracle-se": ["11.2", "12.1", "12.2"],
+ "oracle-ee": ["11.2", "12.1", "12.2"],
+ "sqlserver-se": ["10.50", "11.00"],
+ "sqlserver-ee": ["10.50", "11.00"],
+ "sqlserver-ex": ["10.50", "11.00"],
+ "sqlserver-web": ["10.50", "11.00"],
+ }
+ if option_group_kwargs["name"] in self.option_groups:
+ raise RDSClientError(
+ "OptionGroupAlreadyExistsFault",
+ "An option group named {0} already exists.".format(
+ option_group_kwargs["name"]
+ ),
+ )
+ if (
+ "description" not in option_group_kwargs
+ or not option_group_kwargs["description"]
+ ):
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "The parameter OptionGroupDescription must be provided and must not be blank.",
+ )
+ if option_group_kwargs["engine_name"] not in valid_option_group_engines.keys():
+ raise RDSClientError(
+ "InvalidParameterValue", "Invalid DB engine: non-existent"
+ )
+ if (
+ option_group_kwargs["major_engine_version"]
+ not in valid_option_group_engines[option_group_kwargs["engine_name"]]
+ ):
+ raise RDSClientError(
+ "InvalidParameterCombination",
+ "Cannot find major version {0} for {1}".format(
+ option_group_kwargs["major_engine_version"],
+ option_group_kwargs["engine_name"],
+ ),
+ )
+ option_group = OptionGroup(**option_group_kwargs)
+ self.option_groups[option_group_id] = option_group
+ return option_group
+
+ def delete_option_group(self, option_group_name):
+ if option_group_name in self.option_groups:
+ return self.option_groups.pop(option_group_name)
+ else:
+ raise OptionGroupNotFoundFaultError(option_group_name)
+
+ def describe_option_groups(self, option_group_kwargs):
+ option_group_list = []
+
+ if option_group_kwargs["marker"]:
+ marker = option_group_kwargs["marker"]
+ else:
+ marker = 0
+ if option_group_kwargs["max_records"]:
+ if (
+ option_group_kwargs["max_records"] < 20
+ or option_group_kwargs["max_records"] > 100
+ ):
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "Invalid value for max records. Must be between 20 and 100",
+ )
+ max_records = option_group_kwargs["max_records"]
+ else:
+ max_records = 100
+
+ for option_group in self.option_groups.values():
+ if (
+ option_group_kwargs["name"]
+ and option_group.name != option_group_kwargs["name"]
+ ):
+ continue
+ elif (
+ option_group_kwargs["engine_name"]
+ and option_group.engine_name != option_group_kwargs["engine_name"]
+ ):
+ continue
+ elif (
+ option_group_kwargs["major_engine_version"]
+ and option_group.major_engine_version
+ != option_group_kwargs["major_engine_version"]
+ ):
+ continue
+ else:
+ option_group_list.append(option_group)
+ if not len(option_group_list):
+ raise OptionGroupNotFoundFaultError(option_group_kwargs["name"])
+ return option_group_list[marker : max_records + marker]
+
+ @staticmethod
+ def describe_option_group_options(engine_name, major_engine_version=None):
+ default_option_group_options = {
+ "mysql": {
+ "5.6": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>5.6</MajorEngineVersion><DefaultPort>11211</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Innodb Memcached for MySQL</Description><Name>MEMCACHED</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>1-4294967295</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how many memcached read operations (get) to perform before doing a COMMIT to start a new transaction</SettingDescription><SettingName>DAEMON_MEMCACHED_R_BATCH_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-4294967295</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how many memcached write operations, such as add, set, or incr, to perform before doing a COMMIT to start a new transaction</SettingDescription><SettingName>DAEMON_MEMCACHED_W_BATCH_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-1073741824</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how often to auto-commit idle connections that use the InnoDB memcached interface.</SettingDescription><SettingName>INNODB_API_BK_COMMIT_INTERVAL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Disables the use of row locks when using the InnoDB memcached interface.</SettingDescription><SettingName>INNODB_API_DISABLE_ROWLOCK</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Locks the table used by the InnoDB memcached plugin, so that it cannot be dropped or altered by DDL through the SQL interface.</SettingDescription><SettingName>INNODB_API_ENABLE_MDL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0-3</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Lets you control the transaction isolation level on queries processed by the memcached interface.</SettingDescription><SettingName>INNODB_API_TRX_LEVEL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>auto,ascii,binary</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>auto</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>The binding protocol to use which can be either auto, ascii, or binary. The default is auto which means the server automatically negotiates the protocol with the client.</SettingDescription><SettingName>BINDING_PROTOCOL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-2048</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1024</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>The backlog queue configures how many network connections can be waiting to be processed by memcached</SettingDescription><SettingName>BACKLOG_QUEUE_LIMIT</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Disable the use of compare and swap (CAS) which reduces the per-item size by 8 bytes.</SettingDescription><SettingName>CAS_DISABLED</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-48</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>48</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Minimum chunk size in bytes to allocate for the smallest item\'s key, value, and flags. The default is 48 and you can get a significant memory efficiency gain with a lower value.</SettingDescription><SettingName>CHUNK_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-2</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1.25</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Chunk size growth factor that controls the size of each successive chunk with each chunk growing times this amount larger than the previous chunk.</SettingDescription><SettingName>CHUNK_SIZE_GROWTH_FACTOR</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>If enabled when there is no more memory to store items, memcached will return an error rather than evicting items.</SettingDescription><SettingName>ERROR_ON_MEMORY_EXHAUSTED</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>10-1024</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1024</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Maximum number of concurrent connections. Setting this value to anything less than 10 prevents MySQL from starting.</SettingDescription><SettingName>MAX_SIMULTANEOUS_CONNECTIONS</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>v,vv,vvv</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>v</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Verbose level for memcached.</SettingDescription><SettingName>VERBOSITY</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>mysql</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "all": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>5.6</MajorEngineVersion><DefaultPort>11211</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Innodb Memcached for MySQL</Description><Name>MEMCACHED</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>1-4294967295</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how many memcached read operations (get) to perform before doing a COMMIT to start a new transaction</SettingDescription><SettingName>DAEMON_MEMCACHED_R_BATCH_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-4294967295</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how many memcached write operations, such as add, set, or incr, to perform before doing a COMMIT to start a new transaction</SettingDescription><SettingName>DAEMON_MEMCACHED_W_BATCH_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-1073741824</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies how often to auto-commit idle connections that use the InnoDB memcached interface.</SettingDescription><SettingName>INNODB_API_BK_COMMIT_INTERVAL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Disables the use of row locks when using the InnoDB memcached interface.</SettingDescription><SettingName>INNODB_API_DISABLE_ROWLOCK</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Locks the table used by the InnoDB memcached plugin, so that it cannot be dropped or altered by DDL through the SQL interface.</SettingDescription><SettingName>INNODB_API_ENABLE_MDL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0-3</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Lets you control the transaction isolation level on queries processed by the memcached interface.</SettingDescription><SettingName>INNODB_API_TRX_LEVEL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>auto,ascii,binary</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>auto</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>The binding protocol to use which can be either auto, ascii, or binary. The default is auto which means the server automatically negotiates the protocol with the client.</SettingDescription><SettingName>BINDING_PROTOCOL</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-2048</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1024</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>The backlog queue configures how many network connections can be waiting to be processed by memcached</SettingDescription><SettingName>BACKLOG_QUEUE_LIMIT</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Disable the use of compare and swap (CAS) which reduces the per-item size by 8 bytes.</SettingDescription><SettingName>CAS_DISABLED</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-48</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>48</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Minimum chunk size in bytes to allocate for the smallest item\'s key, value, and flags. The default is 48 and you can get a significant memory efficiency gain with a lower value.</SettingDescription><SettingName>CHUNK_SIZE</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>1-2</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1.25</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Chunk size growth factor that controls the size of each successive chunk with each chunk growing times this amount larger than the previous chunk.</SettingDescription><SettingName>CHUNK_SIZE_GROWTH_FACTOR</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>0,1</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>0</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>If enabled when there is no more memory to store items, memcached will return an error rather than evicting items.</SettingDescription><SettingName>ERROR_ON_MEMORY_EXHAUSTED</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>10-1024</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>1024</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Maximum number of concurrent connections. Setting this value to anything less than 10 prevents MySQL from starting.</SettingDescription><SettingName>MAX_SIMULTANEOUS_CONNECTIONS</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>v,vv,vvv</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>v</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Verbose level for memcached.</SettingDescription><SettingName>VERBOSITY</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>mysql</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ },
+ "oracle-ee": {
+ "11.2": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "all": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ },
+ "oracle-sa": {
+ "11.2": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "all": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ },
+ "oracle-sa1": {
+ "11.2": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "all": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>XMLDB</OptionName></OptionsDependedOn><Description>Oracle Application Express Runtime Environment</Description><Name>APEX</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn><OptionName>APEX</OptionName></OptionsDependedOn><Description>Oracle Application Express Development Environment</Description><Name>APEX-DEV</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Advanced Security - Native Network Encryption</Description><Name>NATIVE_NETWORK_ENCRYPTION</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired encryption behavior</SettingDescription><SettingName>SQLNET.ENCRYPTION_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>ACCEPTED,REJECTED,REQUESTED,REQUIRED</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>REQUESTED</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the desired data integrity behavior</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>RC4_256,AES256,AES192,3DES168,RC4_128,AES128,3DES112,RC4_56,DES,RC4_40,DES40</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of encryption algorithms in order of intended use</SettingDescription><SettingName>SQLNET.ENCRYPTION_TYPES_SERVER</SettingName></OptionGroupOptionSetting><OptionGroupOptionSetting><AllowedValues>SHA1,MD5</AllowedValues><ApplyType>STATIC</ApplyType><DefaultValue>SHA1,MD5</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies list of checksumming algorithms in order of intended use</SettingDescription><SettingName>SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><DefaultPort>1158</DefaultPort><PortRequired>True</PortRequired><OptionsDependedOn></OptionsDependedOn><Description>Oracle Enterprise Manager (Database Control only)</Description><Name>OEM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle Statspack</Description><Name>STATSPACK</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Oracle Advanced Security - TDE with HSM</Description><Name>TDE_HSM</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Permanent>True</Permanent><Description>Change time zone</Description><Name>Timezone</Name><OptionGroupOptionSettings><OptionGroupOptionSetting><AllowedValues>Africa/Cairo,Africa/Casablanca,Africa/Harare,Africa/Monrovia,Africa/Nairobi,Africa/Tripoli,Africa/Windhoek,America/Araguaina,America/Asuncion,America/Bogota,America/Caracas,America/Chihuahua,America/Cuiaba,America/Denver,America/Fortaleza,America/Guatemala,America/Halifax,America/Manaus,America/Matamoros,America/Monterrey,America/Montevideo,America/Phoenix,America/Santiago,America/Tijuana,Asia/Amman,Asia/Ashgabat,Asia/Baghdad,Asia/Baku,Asia/Bangkok,Asia/Beirut,Asia/Calcutta,Asia/Damascus,Asia/Dhaka,Asia/Irkutsk,Asia/Jerusalem,Asia/Kabul,Asia/Karachi,Asia/Kathmandu,Asia/Krasnoyarsk,Asia/Magadan,Asia/Muscat,Asia/Novosibirsk,Asia/Riyadh,Asia/Seoul,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Tehran,Asia/Tokyo,Asia/Ulaanbaatar,Asia/Vladivostok,Asia/Yakutsk,Asia/Yerevan,Atlantic/Azores,Australia/Adelaide,Australia/Brisbane,Australia/Darwin,Australia/Hobart,Australia/Perth,Australia/Sydney,Brazil/East,Canada/Newfoundland,Canada/Saskatchewan,Europe/Amsterdam,Europe/Athens,Europe/Dublin,Europe/Helsinki,Europe/Istanbul,Europe/Kaliningrad,Europe/Moscow,Europe/Paris,Europe/Prague,Europe/Sarajevo,Pacific/Auckland,Pacific/Fiji,Pacific/Guam,Pacific/Honolulu,Pacific/Samoa,US/Alaska,US/Central,US/Eastern,US/East-Indiana,US/Pacific,UTC</AllowedValues><ApplyType>DYNAMIC</ApplyType><DefaultValue>UTC</DefaultValue><IsModifiable>True</IsModifiable><SettingDescription>Specifies the timezone the user wants to change the system time to</SettingDescription><SettingName>TIME_ZONE</SettingName></OptionGroupOptionSetting></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.2</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>Oracle XMLDB Repository</Description><Name>XMLDB</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>oracle-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ },
+ "sqlserver-ee": {
+ "10.50": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>10.50</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>SQLServer Database Mirroring</Description><Name>Mirroring</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>10.50</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Description>SQL Server - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "11.00": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>11.00</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>SQLServer Database Mirroring</Description><Name>Mirroring</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.00</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Description>SQL Server - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ "all": '<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">\n <DescribeOptionGroupOptionsResult>\n <OptionGroupOptions>\n \n <OptionGroupOption><MajorEngineVersion>10.50</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>SQLServer Database Mirroring</Description><Name>Mirroring</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>10.50</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Description>SQL Server - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.00</MajorEngineVersion><OptionsDependedOn></OptionsDependedOn><Description>SQLServer Database Mirroring</Description><Name>Mirroring</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n <OptionGroupOption><MajorEngineVersion>11.00</MajorEngineVersion><Persistent>True</Persistent><OptionsDependedOn></OptionsDependedOn><Description>SQL Server - Transparent Data Encryption</Description><Name>TDE</Name><OptionGroupOptionSettings></OptionGroupOptionSettings><EngineName>sqlserver-ee</EngineName></OptionGroupOption>\n \n </OptionGroupOptions>\n </DescribeOptionGroupOptionsResult>\n <ResponseMetadata>\n <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>\n </ResponseMetadata>\n</DescribeOptionGroupOptionsResponse>',
+ },
+ }
+
+ if engine_name not in default_option_group_options:
+ raise RDSClientError(
+ "InvalidParameterValue", "Invalid DB engine: {0}".format(engine_name)
+ )
+ if (
+ major_engine_version
+ and major_engine_version not in default_option_group_options[engine_name]
+ ):
+ raise RDSClientError(
+ "InvalidParameterCombination",
+ "Cannot find major version {0} for {1}".format(
+ major_engine_version, engine_name
+ ),
+ )
+ if major_engine_version:
+ return default_option_group_options[engine_name][major_engine_version]
+ return default_option_group_options[engine_name]["all"]
+
+ def modify_option_group(
+ self, option_group_name, options_to_include=None, options_to_remove=None
+ ):
+ if option_group_name not in self.option_groups:
+ raise OptionGroupNotFoundFaultError(option_group_name)
+ if not options_to_include and not options_to_remove:
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "At least one option must be added, modified, or removed.",
+ )
+ if options_to_remove:
+ self.option_groups[option_group_name].remove_options(options_to_remove)
+ if options_to_include:
+ self.option_groups[option_group_name].add_options(options_to_include)
+ return self.option_groups[option_group_name]
+
+ def create_db_parameter_group(self, db_parameter_group_kwargs):
+ db_parameter_group_id = db_parameter_group_kwargs["name"]
+ if db_parameter_group_kwargs["name"] in self.db_parameter_groups:
+ raise RDSClientError(
+ "DBParameterGroupAlreadyExistsFault",
+ "A DB parameter group named {0} already exists.".format(
+ db_parameter_group_kwargs["name"]
+ ),
+ )
+ if not db_parameter_group_kwargs.get("description"):
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "The parameter Description must be provided and must not be blank.",
+ )
+ if not db_parameter_group_kwargs.get("family"):
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "The parameter DBParameterGroupName must be provided and must not be blank.",
+ )
+ db_parameter_group_kwargs["region"] = self.region_name
+ db_parameter_group = DBParameterGroup(**db_parameter_group_kwargs)
+ self.db_parameter_groups[db_parameter_group_id] = db_parameter_group
+ return db_parameter_group
+
+ def describe_db_parameter_groups(self, db_parameter_group_kwargs):
+ db_parameter_group_list = []
+
+ if db_parameter_group_kwargs.get("marker"):
+ marker = db_parameter_group_kwargs["marker"]
+ else:
+ marker = 0
+ if db_parameter_group_kwargs.get("max_records"):
+ if (
+ db_parameter_group_kwargs["max_records"] < 20
+ or db_parameter_group_kwargs["max_records"] > 100
+ ):
+ raise RDSClientError(
+ "InvalidParameterValue",
+ "Invalid value for max records. Must be between 20 and 100",
+ )
+ max_records = db_parameter_group_kwargs["max_records"]
+ else:
+ max_records = 100
+
+ for db_parameter_group in self.db_parameter_groups.values():
+ if not db_parameter_group_kwargs.get(
+ "name"
+ ) or db_parameter_group.name == db_parameter_group_kwargs.get("name"):
+ db_parameter_group_list.append(db_parameter_group)
+ else:
+ continue
+
+ return db_parameter_group_list[marker : max_records + marker]
+
+ def modify_db_parameter_group(
+ self, db_parameter_group_name, db_parameter_group_parameters
+ ):
+ if db_parameter_group_name not in self.db_parameter_groups:
+ raise DBParameterGroupNotFoundError(db_parameter_group_name)
+
+ db_parameter_group = self.db_parameter_groups[db_parameter_group_name]
+ db_parameter_group.update_parameters(db_parameter_group_parameters)
+
+ return db_parameter_group
+
+ def create_db_cluster(self, kwargs):
+ cluster_id = kwargs["db_cluster_identifier"]
+ cluster = Cluster(**kwargs)
+ self.clusters[cluster_id] = cluster
+ initial_state = copy.deepcopy(cluster) # Return status=creating
+ cluster.status = "available" # Already set the final status in the background
+ return initial_state
+
+ def create_db_cluster_snapshot(
+ self, db_cluster_identifier, db_snapshot_identifier, tags=None
+ ):
+ cluster = self.clusters.get(db_cluster_identifier)
+ if cluster is None:
+ raise DBClusterNotFoundError(db_cluster_identifier)
+ if db_snapshot_identifier in self.cluster_snapshots:
+ raise DBClusterSnapshotAlreadyExistsError(db_snapshot_identifier)
+ if len(self.cluster_snapshots) >= int(
+ os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
+ ):
+ raise SnapshotQuotaExceededError()
+ if tags is None:
+ tags = list()
+ if cluster.copy_tags_to_snapshot:
+ tags += cluster.get_tags()
+ snapshot = ClusterSnapshot(cluster, db_snapshot_identifier, tags)
+ self.cluster_snapshots[db_snapshot_identifier] = snapshot
+ return snapshot
+
+ def copy_cluster_snapshot(
+ self, source_snapshot_identifier, target_snapshot_identifier, tags=None
+ ):
+ if source_snapshot_identifier not in self.cluster_snapshots:
+ raise DBClusterSnapshotNotFoundError(source_snapshot_identifier)
+ if target_snapshot_identifier in self.cluster_snapshots:
+ raise DBClusterSnapshotAlreadyExistsError(target_snapshot_identifier)
+ if len(self.cluster_snapshots) >= int(
+ os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
+ ):
+ raise SnapshotQuotaExceededError()
+ source_snapshot = self.cluster_snapshots[source_snapshot_identifier]
+ if tags is None:
+ tags = source_snapshot.tags
+ else:
+ tags = self._merge_tags(source_snapshot.tags, tags)
+ target_snapshot = ClusterSnapshot(
+ source_snapshot.cluster, target_snapshot_identifier, tags
+ )
+ self.cluster_snapshots[target_snapshot_identifier] = target_snapshot
+ return target_snapshot
+
+ def delete_db_cluster_snapshot(self, db_snapshot_identifier):
+ if db_snapshot_identifier not in self.cluster_snapshots:
+ raise DBClusterSnapshotNotFoundError(db_snapshot_identifier)
+
+ return self.cluster_snapshots.pop(db_snapshot_identifier)
+
+ def describe_db_clusters(self, cluster_identifier):
+ if cluster_identifier:
+ return [self.clusters[cluster_identifier]]
+ return self.clusters.values()
+
+ def describe_db_cluster_snapshots(
+ self, db_cluster_identifier, db_snapshot_identifier, filters=None
+ ):
+ snapshots = self.cluster_snapshots
+ if db_cluster_identifier:
+ filters = merge_filters(filters, {"db-cluster-id": [db_cluster_identifier]})
+ if db_snapshot_identifier:
+ filters = merge_filters(
+ filters, {"db-cluster-snapshot-id": [db_snapshot_identifier]}
+ )
+ if filters:
+ snapshots = self._filter_resources(snapshots, filters, ClusterSnapshot)
+ if db_snapshot_identifier and not snapshots and not db_cluster_identifier:
+ raise DBClusterSnapshotNotFoundError(db_snapshot_identifier)
+ return list(snapshots.values())
+
+ def delete_db_cluster(self, cluster_identifier, snapshot_name=None):
+ if cluster_identifier in self.clusters:
+ if self.clusters[cluster_identifier].deletion_protection:
+ raise InvalidParameterValue(
+ "Can't delete Cluster with protection enabled"
+ )
+ if snapshot_name:
+ self.create_db_cluster_snapshot(cluster_identifier, snapshot_name)
+ return self.clusters.pop(cluster_identifier)
+ raise DBClusterNotFoundError(cluster_identifier)
+
+ def start_db_cluster(self, cluster_identifier):
+ if cluster_identifier not in self.clusters:
+ raise DBClusterNotFoundError(cluster_identifier)
+ cluster = self.clusters[cluster_identifier]
+ if cluster.status != "stopped":
+ raise InvalidDBClusterStateFault(
+ "DbCluster cluster-id is not in stopped state."
+ )
+ temp_state = copy.deepcopy(cluster)
+ temp_state.status = "started"
+ cluster.status = "available" # This is the final status - already setting it in the background
+ return temp_state
+
+ def restore_db_cluster_from_snapshot(self, from_snapshot_id, overrides):
+ snapshot = self.describe_db_cluster_snapshots(
+ db_cluster_identifier=None, db_snapshot_identifier=from_snapshot_id
+ )[0]
+ original_cluster = snapshot.cluster
+ new_cluster_props = copy.deepcopy(original_cluster.__dict__)
+ for key, value in overrides.items():
+ if value:
+ new_cluster_props[key] = value
+
+ return self.create_db_cluster(new_cluster_props)
+
+ def stop_db_cluster(self, cluster_identifier):
+ if cluster_identifier not in self.clusters:
+ raise DBClusterNotFoundError(cluster_identifier)
+ cluster = self.clusters[cluster_identifier]
+ if cluster.status not in ["available"]:
+ raise InvalidDBClusterStateFault(
+ "DbCluster cluster-id is not in available state."
+ )
+ previous_state = copy.deepcopy(cluster)
+ cluster.status = "stopped"
+ return previous_state
+
+ def start_export_task(self, kwargs):
+ export_task_id = kwargs["export_task_identifier"]
+ source_arn = kwargs["source_arn"]
+ snapshot_id = source_arn.split(":")[-1]
+ snapshot_type = source_arn.split(":")[-2]
+
+ if export_task_id in self.export_tasks:
+ raise ExportTaskAlreadyExistsError(export_task_id)
+ if snapshot_type == "snapshot" and snapshot_id not in self.database_snapshots:
+ raise DBSnapshotNotFoundError(snapshot_id)
+ elif (
+ snapshot_type == "cluster-snapshot"
+ and snapshot_id not in self.cluster_snapshots
+ ):
+ raise DBClusterSnapshotNotFoundError(snapshot_id)
+
+ if snapshot_type == "snapshot":
+ snapshot = self.database_snapshots[snapshot_id]
+ else:
+ snapshot = self.cluster_snapshots[snapshot_id]
+
+ if snapshot.status not in ["available"]:
+ raise InvalidExportSourceStateError(snapshot.status)
+
+ export_task = ExportTask(snapshot, kwargs)
+ self.export_tasks[export_task_id] = export_task
+
+ return export_task
+
+ def cancel_export_task(self, export_task_identifier):
+ if export_task_identifier in self.export_tasks:
+ export_task = self.export_tasks[export_task_identifier]
+ export_task.status = "canceled"
+ self.export_tasks[export_task_identifier] = export_task
+ return export_task
+ raise ExportTaskNotFoundError(export_task_identifier)
+
+ def describe_export_tasks(self, export_task_identifier):
+ if export_task_identifier:
+ if export_task_identifier in self.export_tasks:
+ return [self.export_tasks[export_task_identifier]]
+ else:
+ raise ExportTaskNotFoundError(export_task_identifier)
+ return self.export_tasks.values()
+
+ def create_event_subscription(self, kwargs):
+ subscription_name = kwargs["subscription_name"]
+
+ if subscription_name in self.event_subscriptions:
+ raise SubscriptionAlreadyExistError(subscription_name)
+
+ subscription = EventSubscription(kwargs)
+ self.event_subscriptions[subscription_name] = subscription
+
+ return subscription
+
+ def delete_event_subscription(self, subscription_name):
+ if subscription_name in self.event_subscriptions:
+ return self.event_subscriptions.pop(subscription_name)
+ raise SubscriptionNotFoundError(subscription_name)
+
+ def describe_event_subscriptions(self, subscription_name):
+ if subscription_name:
+ if subscription_name in self.event_subscriptions:
+ return [self.event_subscriptions[subscription_name]]
+ else:
+ raise SubscriptionNotFoundError(subscription_name)
+ return self.event_subscriptions.values()
+
+ def list_tags_for_resource(self, arn):
+ if self.arn_regex.match(arn):
+ arn_breakdown = arn.split(":")
+ resource_type = arn_breakdown[len(arn_breakdown) - 2]
+ resource_name = arn_breakdown[len(arn_breakdown) - 1]
+ if resource_type == "db": # Database
+ if resource_name in self.databases:
+ return self.databases[resource_name].get_tags()
+ elif resource_type == "cluster": # Cluster
+ if resource_name in self.clusters:
+ return self.clusters[resource_name].get_tags()
+ elif resource_type == "es": # Event Subscription
+ if resource_name in self.event_subscriptions:
+ return self.event_subscriptions[resource_name].get_tags()
+ elif resource_type == "og": # Option Group
+ if resource_name in self.option_groups:
+ return self.option_groups[resource_name].get_tags()
+ elif resource_type == "pg": # Parameter Group
+ if resource_name in self.db_parameter_groups:
+ return self.db_parameter_groups[resource_name].get_tags()
+ elif resource_type == "ri": # Reserved DB instance
+ # TODO: Complete call to tags on resource type Reserved DB
+ # instance
+ return []
+ elif resource_type == "secgrp": # DB security group
+ if resource_name in self.security_groups:
+ return self.security_groups[resource_name].get_tags()
+ elif resource_type == "snapshot": # DB Snapshot
+ if resource_name in self.database_snapshots:
+ return self.database_snapshots[resource_name].get_tags()
+ elif resource_type == "cluster-snapshot": # DB Cluster Snapshot
+ if resource_name in self.cluster_snapshots:
+ return self.cluster_snapshots[resource_name].get_tags()
+ elif resource_type == "subgrp": # DB subnet group
+ if resource_name in self.subnet_groups:
+ return self.subnet_groups[resource_name].get_tags()
+ else:
+ raise RDSClientError(
+ "InvalidParameterValue", "Invalid resource name: {0}".format(arn)
+ )
+ return []
+
+ def remove_tags_from_resource(self, arn, tag_keys):
+ if self.arn_regex.match(arn):
+ arn_breakdown = arn.split(":")
+ resource_type = arn_breakdown[len(arn_breakdown) - 2]
+ resource_name = arn_breakdown[len(arn_breakdown) - 1]
+ if resource_type == "db": # Database
+ if resource_name in self.databases:
+ return self.databases[resource_name].remove_tags(tag_keys)
+ elif resource_type == "es": # Event Subscription
+ if resource_name in self.event_subscriptions:
+ return self.event_subscriptions[resource_name].remove_tags(tag_keys)
+ elif resource_type == "og": # Option Group
+ if resource_name in self.option_groups:
+ return self.option_groups[resource_name].remove_tags(tag_keys)
+ elif resource_type == "pg": # Parameter Group
+ if resource_name in self.db_parameter_groups:
+ return self.db_parameter_groups[resource_name].remove_tags(tag_keys)
+ elif resource_type == "ri": # Reserved DB instance
+ return None
+ elif resource_type == "secgrp": # DB security group
+ if resource_name in self.security_groups:
+ return self.security_groups[resource_name].remove_tags(tag_keys)
+ elif resource_type == "snapshot": # DB Snapshot
+ if resource_name in self.database_snapshots:
+ return self.database_snapshots[resource_name].remove_tags(tag_keys)
+ elif resource_type == "cluster":
+ if resource_name in self.clusters:
+ return self.clusters[resource_name].remove_tags(tag_keys)
+ elif resource_type == "cluster-snapshot": # DB Cluster Snapshot
+ if resource_name in self.cluster_snapshots:
+ return self.cluster_snapshots[resource_name].remove_tags(tag_keys)
+ elif resource_type == "subgrp": # DB subnet group
+ if resource_name in self.subnet_groups:
+ return self.subnet_groups[resource_name].remove_tags(tag_keys)
+ else:
+ raise RDSClientError(
+ "InvalidParameterValue", "Invalid resource name: {0}".format(arn)
+ )
+
+ def add_tags_to_resource(self, arn, tags):
+ if self.arn_regex.match(arn):
+ arn_breakdown = arn.split(":")
+ resource_type = arn_breakdown[-2]
+ resource_name = arn_breakdown[-1]
+ if resource_type == "db": # Database
+ if resource_name in self.databases:
+ return self.databases[resource_name].add_tags(tags)
+ elif resource_type == "es": # Event Subscription
+ if resource_name in self.event_subscriptions:
+ return self.event_subscriptions[resource_name].add_tags(tags)
+ elif resource_type == "og": # Option Group
+ if resource_name in self.option_groups:
+ return self.option_groups[resource_name].add_tags(tags)
+ elif resource_type == "pg": # Parameter Group
+ if resource_name in self.db_parameter_groups:
+ return self.db_parameter_groups[resource_name].add_tags(tags)
+ elif resource_type == "ri": # Reserved DB instance
+ return []
+ elif resource_type == "secgrp": # DB security group
+ if resource_name in self.security_groups:
+ return self.security_groups[resource_name].add_tags(tags)
+ elif resource_type == "snapshot": # DB Snapshot
+ if resource_name in self.database_snapshots:
+ return self.database_snapshots[resource_name].add_tags(tags)
+ elif resource_type == "cluster":
+ if resource_name in self.clusters:
+ return self.clusters[resource_name].add_tags(tags)
+ elif resource_type == "cluster-snapshot": # DB Cluster Snapshot
+ if resource_name in self.cluster_snapshots:
+ return self.cluster_snapshots[resource_name].add_tags(tags)
+ elif resource_type == "subgrp": # DB subnet group
+ if resource_name in self.subnet_groups:
+ return self.subnet_groups[resource_name].add_tags(tags)
+ else:
+ raise RDSClientError(
+ "InvalidParameterValue", "Invalid resource name: {0}".format(arn)
+ )
+
+ @staticmethod
+ def _filter_resources(resources, filters, resource_class):
+ try:
+ filter_defs = resource_class.SUPPORTED_FILTERS
+ validate_filters(filters, filter_defs)
+ return apply_filter(resources, filters, filter_defs)
+ except KeyError as e:
+ # https://stackoverflow.com/questions/24998968/why-does-strkeyerror-add-extra-quotes
+ raise InvalidParameterValue(e.args[0])
+ except ValueError as e:
+ raise InvalidParameterCombination(str(e))
+
+ @staticmethod
+ def _merge_tags(old_tags: list, new_tags: list):
+ tags_dict = dict()
+ tags_dict.update({d["Key"]: d["Value"] for d in old_tags})
+ tags_dict.update({d["Key"]: d["Value"] for d in new_tags})
+ return [{"Key": k, "Value": v} for k, v in tags_dict.items()]
+
+
+class OptionGroup(object):
+ def __init__(self, name, engine_name, major_engine_version, description=None):
+ self.engine_name = engine_name
+ self.major_engine_version = major_engine_version
+ self.description = description
+ self.name = name
+ self.vpc_and_non_vpc_instance_memberships = False
+ self.options = {}
+ self.vpcId = "null"
+ self.tags = []
+
+ def to_json(self):
+ template = Template(
+ """{
+ "VpcId": null,
+ "MajorEngineVersion": "{{ option_group.major_engine_version }}",
+ "OptionGroupDescription": "{{ option_group.description }}",
+ "AllowsVpcAndNonVpcInstanceMemberships": "{{ option_group.vpc_and_non_vpc_instance_memberships }}",
+ "EngineName": "{{ option_group.engine_name }}",
+ "Options": [],
+ "OptionGroupName": "{{ option_group.name }}"
+}"""
+ )
+ return template.render(option_group=self)
+
+ def to_xml(self):
+ template = Template(
+ """<OptionGroup>
+ <OptionGroupName>{{ option_group.name }}</OptionGroupName>
+ <AllowsVpcAndNonVpcInstanceMemberships>{{ option_group.vpc_and_non_vpc_instance_memberships }}</AllowsVpcAndNonVpcInstanceMemberships>
+ <MajorEngineVersion>{{ option_group.major_engine_version }}</MajorEngineVersion>
+ <EngineName>{{ option_group.engine_name }}</EngineName>
+ <OptionGroupDescription>{{ option_group.description }}</OptionGroupDescription>
+ <Options/>
+ </OptionGroup>"""
+ )
+ return template.render(option_group=self)
+
+ def remove_options(self, options_to_remove): # pylint: disable=unused-argument
+ # TODO: Check for option in self.options and remove if exists. Raise
+ # error otherwise
+ return
+
+ def add_options(self, options_to_add): # pylint: disable=unused-argument
+ # TODO: Validate option and add it to self.options. If invalid raise
+ # error
+ return
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+
+def make_rds_arn(region, name):
+ return "arn:aws:rds:{0}:{1}:pg:{2}".format(region, get_account_id(), name)
+
+
+class DBParameterGroup(CloudFormationModel):
+ def __init__(self, name, description, family, tags, region):
+ self.name = name
+ self.description = description
+ self.family = family
+ self.tags = tags
+ self.parameters = defaultdict(dict)
+ self.arn = make_rds_arn(region, name)
+
+ def to_xml(self):
+ template = Template(
+ """<DBParameterGroup>
+ <DBParameterGroupName>{{ param_group.name }}</DBParameterGroupName>
+ <DBParameterGroupFamily>{{ param_group.family }}</DBParameterGroupFamily>
+ <Description>{{ param_group.description }}</Description>
+ <DBParameterGroupArn>{{ param_group.arn }}</DBParameterGroupArn>
+ </DBParameterGroup>"""
+ )
+ return template.render(param_group=self)
+
+ def get_tags(self):
+ return self.tags
+
+ def add_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+
+ def update_parameters(self, new_parameters):
+ for new_parameter in new_parameters:
+ parameter = self.parameters[new_parameter["ParameterName"]]
+ parameter.update(new_parameter)
+
+ def delete(self, region_name):
+ backend = rds_backends[region_name]
+ backend.delete_db_parameter_group(self.name)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html
+ return "AWS::RDS::DBParameterGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ db_parameter_group_kwargs = {
+ "description": properties["Description"],
+ "family": properties["Family"],
+ "name": resource_name.lower(),
+ "tags": properties.get("Tags"),
+ }
+ db_parameter_group_parameters = []
+ for db_parameter, db_parameter_value in properties.get(
+ "Parameters", {}
+ ).items():
+ db_parameter_group_parameters.append(
+ {"ParameterName": db_parameter, "ParameterValue": db_parameter_value}
+ )
+
+ rds_backend = rds_backends[region_name]
+ db_parameter_group = rds_backend.create_db_parameter_group(
+ db_parameter_group_kwargs
+ )
+ db_parameter_group.update_parameters(db_parameter_group_parameters)
+ return db_parameter_group
+
+
+rds_backends = BackendDict(RDSBackend, "rds")
diff --git a/contrib/python/moto/py3/moto/rds/responses.py b/contrib/python/moto/py3/moto/rds/responses.py
new file mode 100644
index 0000000000..77f01bb517
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/responses.py
@@ -0,0 +1,1143 @@
+from collections import defaultdict
+
+from moto.core.responses import BaseResponse
+from moto.ec2.models import ec2_backends
+from .models import rds_backends
+from .exceptions import DBParameterGroupNotFoundError
+
+
+class RDSResponse(BaseResponse):
+ @property
+ def backend(self):
+ return rds_backends[self.region]
+
+ def _get_db_kwargs(self):
+ args = {
+ "auto_minor_version_upgrade": self._get_param("AutoMinorVersionUpgrade"),
+ "allocated_storage": self._get_int_param("AllocatedStorage"),
+ "availability_zone": self._get_param("AvailabilityZone"),
+ "backup_retention_period": self._get_param("BackupRetentionPeriod"),
+ "copy_tags_to_snapshot": self._get_param("CopyTagsToSnapshot"),
+ "db_instance_class": self._get_param("DBInstanceClass"),
+ "db_cluster_identifier": self._get_param("DBClusterIdentifier"),
+ "db_instance_identifier": self._get_param("DBInstanceIdentifier"),
+ "db_name": self._get_param("DBName"),
+ "db_parameter_group_name": self._get_param("DBParameterGroupName"),
+ "db_snapshot_identifier": self._get_param("DBSnapshotIdentifier"),
+ "db_subnet_group_name": self._get_param("DBSubnetGroupName"),
+ "engine": self._get_param("Engine"),
+ "engine_version": self._get_param("EngineVersion"),
+ "enable_cloudwatch_logs_exports": self._get_params().get(
+ "EnableCloudwatchLogsExports"
+ ),
+ "enable_iam_database_authentication": self._get_bool_param(
+ "EnableIAMDatabaseAuthentication"
+ ),
+ "license_model": self._get_param("LicenseModel"),
+ "iops": self._get_int_param("Iops"),
+ "kms_key_id": self._get_param("KmsKeyId"),
+ "master_user_password": self._get_param("MasterUserPassword"),
+ "master_username": self._get_param("MasterUsername"),
+ "multi_az": self._get_bool_param("MultiAZ"),
+ "option_group_name": self._get_param("OptionGroupName"),
+ "port": self._get_param("Port"),
+ # PreferredBackupWindow
+ # PreferredMaintenanceWindow
+ "publicly_accessible": self._get_param("PubliclyAccessible"),
+ "region": self.region,
+ "security_groups": self._get_multi_param(
+ "DBSecurityGroups.DBSecurityGroupName"
+ ),
+ "storage_encrypted": self._get_param("StorageEncrypted"),
+ "storage_type": self._get_param("StorageType", None),
+ "vpc_security_group_ids": self._get_multi_param(
+ "VpcSecurityGroupIds.VpcSecurityGroupId"
+ ),
+ "tags": list(),
+ "deletion_protection": self._get_bool_param("DeletionProtection"),
+ }
+ args["tags"] = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ return args
+
+ def _get_db_replica_kwargs(self):
+ return {
+ "auto_minor_version_upgrade": self._get_param("AutoMinorVersionUpgrade"),
+ "availability_zone": self._get_param("AvailabilityZone"),
+ "db_instance_class": self._get_param("DBInstanceClass"),
+ "db_instance_identifier": self._get_param("DBInstanceIdentifier"),
+ "db_subnet_group_name": self._get_param("DBSubnetGroupName"),
+ "iops": self._get_int_param("Iops"),
+ # OptionGroupName
+ "port": self._get_param("Port"),
+ "publicly_accessible": self._get_param("PubliclyAccessible"),
+ "source_db_identifier": self._get_param("SourceDBInstanceIdentifier"),
+ "storage_type": self._get_param("StorageType"),
+ }
+
+ def _get_option_group_kwargs(self):
+ return {
+ "major_engine_version": self._get_param("MajorEngineVersion"),
+ "description": self._get_param("OptionGroupDescription"),
+ "engine_name": self._get_param("EngineName"),
+ "name": self._get_param("OptionGroupName"),
+ }
+
+ def _get_db_parameter_group_kwargs(self):
+ return {
+ "description": self._get_param("Description"),
+ "family": self._get_param("DBParameterGroupFamily"),
+ "name": self._get_param("DBParameterGroupName"),
+ "tags": self.unpack_complex_list_params("Tags.Tag", ("Key", "Value")),
+ }
+
+ def _get_db_cluster_kwargs(self):
+ return {
+ "availability_zones": self._get_multi_param(
+ "AvailabilityZones.AvailabilityZone"
+ ),
+ "enable_cloudwatch_logs_exports": self._get_params().get(
+ "EnableCloudwatchLogsExports"
+ ),
+ "db_name": self._get_param("DatabaseName"),
+ "db_cluster_identifier": self._get_param("DBClusterIdentifier"),
+ "deletion_protection": self._get_bool_param("DeletionProtection"),
+ "engine": self._get_param("Engine"),
+ "engine_version": self._get_param("EngineVersion"),
+ "engine_mode": self._get_param("EngineMode"),
+ "allocated_storage": self._get_param("AllocatedStorage"),
+ "iops": self._get_param("Iops"),
+ "storage_type": self._get_param("StorageType"),
+ "master_username": self._get_param("MasterUsername"),
+ "master_user_password": self._get_param("MasterUserPassword"),
+ "port": self._get_param("Port"),
+ "parameter_group": self._get_param("DBClusterParameterGroup"),
+ "region": self.region,
+ "db_cluster_instance_class": self._get_param("DBClusterInstanceClass"),
+ "copy_tags_to_snapshot": self._get_param("CopyTagsToSnapshot"),
+ "tags": self.unpack_complex_list_params("Tags.Tag", ("Key", "Value")),
+ }
+
+ def _get_export_task_kwargs(self):
+ return {
+ "export_task_identifier": self._get_param("ExportTaskIdentifier"),
+ "source_arn": self._get_param("SourceArn"),
+ "s3_bucket_name": self._get_param("S3BucketName"),
+ "iam_role_arn": self._get_param("IamRoleArn"),
+ "kms_key_id": self._get_param("KmsKeyId"),
+ "s3_prefix": self._get_param("S3Prefix"),
+ "export_only": self.unpack_list_params("ExportOnly.member"),
+ }
+
+ def _get_event_subscription_kwargs(self):
+ return {
+ "subscription_name": self._get_param("SubscriptionName"),
+ "sns_topic_arn": self._get_param("SnsTopicArn"),
+ "source_type": self._get_param("SourceType"),
+ "event_categories": self.unpack_list_params(
+ "EventCategories.EventCategory"
+ ),
+ "source_ids": self.unpack_list_params("SourceIds.SourceId"),
+ "enabled": self._get_param("Enabled"),
+ "tags": self.unpack_complex_list_params("Tags.Tag", ("Key", "Value")),
+ }
+
+ def unpack_complex_list_params(self, label, names):
+ unpacked_list = list()
+ count = 1
+ while self._get_param("{0}.{1}.{2}".format(label, count, names[0])):
+ param = dict()
+ for i in range(len(names)):
+ param[names[i]] = self._get_param(
+ "{0}.{1}.{2}".format(label, count, names[i])
+ )
+ unpacked_list.append(param)
+ count += 1
+ return unpacked_list
+
+ def unpack_list_params(self, label):
+ unpacked_list = list()
+ count = 1
+ while self._get_param("{0}.{1}".format(label, count)):
+ unpacked_list.append(self._get_param("{0}.{1}".format(label, count)))
+ count += 1
+ return unpacked_list
+
+ def create_db_instance(self):
+ db_kwargs = self._get_db_kwargs()
+ database = self.backend.create_db_instance(db_kwargs)
+ template = self.response_template(CREATE_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def create_db_instance_read_replica(self):
+ db_kwargs = self._get_db_replica_kwargs()
+
+ database = self.backend.create_database_replica(db_kwargs)
+ template = self.response_template(CREATE_DATABASE_REPLICA_TEMPLATE)
+ return template.render(database=database)
+
+ def describe_db_instances(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ filters = self._get_multi_param("Filters.Filter.")
+ filters = {f["Name"]: f["Values"] for f in filters}
+ all_instances = list(
+ self.backend.describe_db_instances(db_instance_identifier, filters=filters)
+ )
+ marker = self._get_param("Marker")
+ all_ids = [instance.db_instance_identifier for instance in all_instances]
+ if marker:
+ start = all_ids.index(marker) + 1
+ else:
+ start = 0
+ page_size = self._get_int_param(
+ "MaxRecords", 50
+ ) # the default is 100, but using 50 to make testing easier
+ instances_resp = all_instances[start : start + page_size]
+ next_marker = None
+ if len(all_instances) > start + page_size:
+ next_marker = instances_resp[-1].db_instance_identifier
+
+ template = self.response_template(DESCRIBE_DATABASES_TEMPLATE)
+ return template.render(databases=instances_resp, marker=next_marker)
+
+ def modify_db_instance(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ db_kwargs = self._get_db_kwargs()
+ # NOTE modify_db_instance does not support tags
+ del db_kwargs["tags"]
+ new_db_instance_identifier = self._get_param("NewDBInstanceIdentifier")
+ if new_db_instance_identifier:
+ db_kwargs["new_db_instance_identifier"] = new_db_instance_identifier
+ database = self.backend.modify_db_instance(db_instance_identifier, db_kwargs)
+ template = self.response_template(MODIFY_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def delete_db_instance(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ db_snapshot_name = self._get_param("FinalDBSnapshotIdentifier")
+ database = self.backend.delete_db_instance(
+ db_instance_identifier, db_snapshot_name
+ )
+ template = self.response_template(DELETE_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def reboot_db_instance(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ database = self.backend.reboot_db_instance(db_instance_identifier)
+ template = self.response_template(REBOOT_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def create_db_snapshot(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ snapshot = self.backend.create_db_snapshot(
+ db_instance_identifier, db_snapshot_identifier, tags
+ )
+ template = self.response_template(CREATE_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def copy_db_snapshot(self):
+ source_snapshot_identifier = self._get_param("SourceDBSnapshotIdentifier")
+ target_snapshot_identifier = self._get_param("TargetDBSnapshotIdentifier")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ snapshot = self.backend.copy_database_snapshot(
+ source_snapshot_identifier, target_snapshot_identifier, tags
+ )
+ template = self.response_template(COPY_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def describe_db_snapshots(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
+ filters = self._get_multi_param("Filters.Filter.")
+ filters = {f["Name"]: f["Values"] for f in filters}
+ snapshots = self.backend.describe_database_snapshots(
+ db_instance_identifier, db_snapshot_identifier, filters
+ )
+ template = self.response_template(DESCRIBE_SNAPSHOTS_TEMPLATE)
+ return template.render(snapshots=snapshots)
+
+ def delete_db_snapshot(self):
+ db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
+ snapshot = self.backend.delete_db_snapshot(db_snapshot_identifier)
+ template = self.response_template(DELETE_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def restore_db_instance_from_db_snapshot(self):
+ db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
+ db_kwargs = self._get_db_kwargs()
+ new_instance = self.backend.restore_db_instance_from_db_snapshot(
+ db_snapshot_identifier, db_kwargs
+ )
+ template = self.response_template(RESTORE_INSTANCE_FROM_SNAPSHOT_TEMPLATE)
+ return template.render(database=new_instance)
+
+ def list_tags_for_resource(self):
+ arn = self._get_param("ResourceName")
+ template = self.response_template(LIST_TAGS_FOR_RESOURCE_TEMPLATE)
+ tags = self.backend.list_tags_for_resource(arn)
+ return template.render(tags=tags)
+
+ def add_tags_to_resource(self):
+ arn = self._get_param("ResourceName")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ tags = self.backend.add_tags_to_resource(arn, tags)
+ template = self.response_template(ADD_TAGS_TO_RESOURCE_TEMPLATE)
+ return template.render(tags=tags)
+
+ def remove_tags_from_resource(self):
+ arn = self._get_param("ResourceName")
+ tag_keys = self.unpack_list_params("TagKeys.member")
+ self.backend.remove_tags_from_resource(arn, tag_keys)
+ template = self.response_template(REMOVE_TAGS_FROM_RESOURCE_TEMPLATE)
+ return template.render()
+
+ def stop_db_instance(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
+ database = self.backend.stop_db_instance(
+ db_instance_identifier, db_snapshot_identifier
+ )
+ template = self.response_template(STOP_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def start_db_instance(self):
+ db_instance_identifier = self._get_param("DBInstanceIdentifier")
+ database = self.backend.start_db_instance(db_instance_identifier)
+ template = self.response_template(START_DATABASE_TEMPLATE)
+ return template.render(database=database)
+
+ def create_db_security_group(self):
+ group_name = self._get_param("DBSecurityGroupName")
+ description = self._get_param("DBSecurityGroupDescription")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ security_group = self.backend.create_db_security_group(
+ group_name, description, tags
+ )
+ template = self.response_template(CREATE_SECURITY_GROUP_TEMPLATE)
+ return template.render(security_group=security_group)
+
+ def describe_db_security_groups(self):
+ security_group_name = self._get_param("DBSecurityGroupName")
+ security_groups = self.backend.describe_security_groups(security_group_name)
+ template = self.response_template(DESCRIBE_SECURITY_GROUPS_TEMPLATE)
+ return template.render(security_groups=security_groups)
+
+ def delete_db_security_group(self):
+ security_group_name = self._get_param("DBSecurityGroupName")
+ security_group = self.backend.delete_security_group(security_group_name)
+ template = self.response_template(DELETE_SECURITY_GROUP_TEMPLATE)
+ return template.render(security_group=security_group)
+
+ def authorize_db_security_group_ingress(self):
+ security_group_name = self._get_param("DBSecurityGroupName")
+ cidr_ip = self._get_param("CIDRIP")
+ security_group = self.backend.authorize_security_group(
+ security_group_name, cidr_ip
+ )
+ template = self.response_template(AUTHORIZE_SECURITY_GROUP_TEMPLATE)
+ return template.render(security_group=security_group)
+
+ def create_db_subnet_group(self):
+ subnet_name = self._get_param("DBSubnetGroupName")
+ description = self._get_param("DBSubnetGroupDescription")
+ subnet_ids = self._get_multi_param("SubnetIds.SubnetIdentifier")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ subnets = [
+ ec2_backends[self.region].get_subnet(subnet_id) for subnet_id in subnet_ids
+ ]
+ subnet_group = self.backend.create_subnet_group(
+ subnet_name, description, subnets, tags
+ )
+ template = self.response_template(CREATE_SUBNET_GROUP_TEMPLATE)
+ return template.render(subnet_group=subnet_group)
+
+ def describe_db_subnet_groups(self):
+ subnet_name = self._get_param("DBSubnetGroupName")
+ subnet_groups = self.backend.describe_subnet_groups(subnet_name)
+ template = self.response_template(DESCRIBE_SUBNET_GROUPS_TEMPLATE)
+ return template.render(subnet_groups=subnet_groups)
+
+ def modify_db_subnet_group(self):
+ subnet_name = self._get_param("DBSubnetGroupName")
+ description = self._get_param("DBSubnetGroupDescription")
+ subnet_ids = self._get_multi_param("SubnetIds.SubnetIdentifier")
+ subnets = [
+ ec2_backends[self.region].get_subnet(subnet_id) for subnet_id in subnet_ids
+ ]
+ subnet_group = self.backend.modify_db_subnet_group(
+ subnet_name, description, subnets
+ )
+ template = self.response_template(MODIFY_SUBNET_GROUPS_TEMPLATE)
+ return template.render(subnet_group=subnet_group)
+
+ def delete_db_subnet_group(self):
+ subnet_name = self._get_param("DBSubnetGroupName")
+ subnet_group = self.backend.delete_subnet_group(subnet_name)
+ template = self.response_template(DELETE_SUBNET_GROUP_TEMPLATE)
+ return template.render(subnet_group=subnet_group)
+
+ def create_option_group(self):
+ kwargs = self._get_option_group_kwargs()
+ option_group = self.backend.create_option_group(kwargs)
+ template = self.response_template(CREATE_OPTION_GROUP_TEMPLATE)
+ return template.render(option_group=option_group)
+
+ def delete_option_group(self):
+ kwargs = self._get_option_group_kwargs()
+ option_group = self.backend.delete_option_group(kwargs["name"])
+ template = self.response_template(DELETE_OPTION_GROUP_TEMPLATE)
+ return template.render(option_group=option_group)
+
+ def describe_option_groups(self):
+ kwargs = self._get_option_group_kwargs()
+ kwargs["max_records"] = self._get_int_param("MaxRecords")
+ kwargs["marker"] = self._get_param("Marker")
+ option_groups = self.backend.describe_option_groups(kwargs)
+ template = self.response_template(DESCRIBE_OPTION_GROUP_TEMPLATE)
+ return template.render(option_groups=option_groups)
+
+ def describe_option_group_options(self):
+ engine_name = self._get_param("EngineName")
+ major_engine_version = self._get_param("MajorEngineVersion")
+ option_group_options = self.backend.describe_option_group_options(
+ engine_name, major_engine_version
+ )
+ return option_group_options
+
+ def modify_option_group(self):
+ option_group_name = self._get_param("OptionGroupName")
+ count = 1
+ options_to_include = []
+ while self._get_param("OptionsToInclude.member.{0}.OptionName".format(count)):
+ options_to_include.append(
+ {
+ "Port": self._get_param(
+ "OptionsToInclude.member.{0}.Port".format(count)
+ ),
+ "OptionName": self._get_param(
+ "OptionsToInclude.member.{0}.OptionName".format(count)
+ ),
+ "DBSecurityGroupMemberships": self._get_param(
+ "OptionsToInclude.member.{0}.DBSecurityGroupMemberships".format(
+ count
+ )
+ ),
+ "OptionSettings": self._get_param(
+ "OptionsToInclude.member.{0}.OptionSettings".format(count)
+ ),
+ "VpcSecurityGroupMemberships": self._get_param(
+ "OptionsToInclude.member.{0}.VpcSecurityGroupMemberships".format(
+ count
+ )
+ ),
+ }
+ )
+ count += 1
+
+ count = 1
+ options_to_remove = []
+ while self._get_param("OptionsToRemove.member.{0}".format(count)):
+ options_to_remove.append(
+ self._get_param("OptionsToRemove.member.{0}".format(count))
+ )
+ count += 1
+ option_group = self.backend.modify_option_group(
+ option_group_name, options_to_include, options_to_remove
+ )
+ template = self.response_template(MODIFY_OPTION_GROUP_TEMPLATE)
+ return template.render(option_group=option_group)
+
+ def create_db_parameter_group(self):
+ kwargs = self._get_db_parameter_group_kwargs()
+ db_parameter_group = self.backend.create_db_parameter_group(kwargs)
+ template = self.response_template(CREATE_DB_PARAMETER_GROUP_TEMPLATE)
+ return template.render(db_parameter_group=db_parameter_group)
+
+ def describe_db_parameter_groups(self):
+ kwargs = self._get_db_parameter_group_kwargs()
+ kwargs["max_records"] = self._get_int_param("MaxRecords")
+ kwargs["marker"] = self._get_param("Marker")
+ db_parameter_groups = self.backend.describe_db_parameter_groups(kwargs)
+ template = self.response_template(DESCRIBE_DB_PARAMETER_GROUPS_TEMPLATE)
+ return template.render(db_parameter_groups=db_parameter_groups)
+
+ def modify_db_parameter_group(self):
+ db_parameter_group_name = self._get_param("DBParameterGroupName")
+ db_parameter_group_parameters = self._get_db_parameter_group_parameters()
+ db_parameter_group = self.backend.modify_db_parameter_group(
+ db_parameter_group_name, db_parameter_group_parameters
+ )
+ template = self.response_template(MODIFY_DB_PARAMETER_GROUP_TEMPLATE)
+ return template.render(db_parameter_group=db_parameter_group)
+
+ def _get_db_parameter_group_parameters(self):
+ parameter_group_parameters = defaultdict(dict)
+ for param_name, value in self.querystring.items():
+ if not param_name.startswith("Parameters.Parameter"):
+ continue
+
+ split_param_name = param_name.split(".")
+ param_id = split_param_name[2]
+ param_setting = split_param_name[3]
+
+ parameter_group_parameters[param_id][param_setting] = value[0]
+
+ return parameter_group_parameters.values()
+
+ def describe_db_parameters(self):
+ db_parameter_group_name = self._get_param("DBParameterGroupName")
+ db_parameter_groups = self.backend.describe_db_parameter_groups(
+ {"name": db_parameter_group_name}
+ )
+ if not db_parameter_groups:
+ raise DBParameterGroupNotFoundError(db_parameter_group_name)
+
+ template = self.response_template(DESCRIBE_DB_PARAMETERS_TEMPLATE)
+ return template.render(db_parameter_group=db_parameter_groups[0])
+
+ def delete_db_parameter_group(self):
+ kwargs = self._get_db_parameter_group_kwargs()
+ db_parameter_group = self.backend.delete_db_parameter_group(kwargs["name"])
+ template = self.response_template(DELETE_DB_PARAMETER_GROUP_TEMPLATE)
+ return template.render(db_parameter_group=db_parameter_group)
+
+ def create_db_cluster(self):
+ kwargs = self._get_db_cluster_kwargs()
+ cluster = self.backend.create_db_cluster(kwargs)
+ template = self.response_template(CREATE_DB_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ def describe_db_clusters(self):
+ _id = self._get_param("DBClusterIdentifier")
+ clusters = self.backend.describe_db_clusters(cluster_identifier=_id)
+ template = self.response_template(DESCRIBE_CLUSTERS_TEMPLATE)
+ return template.render(clusters=clusters)
+
+ def delete_db_cluster(self):
+ _id = self._get_param("DBClusterIdentifier")
+ snapshot_name = self._get_param("FinalDBSnapshotIdentifier")
+ cluster = self.backend.delete_db_cluster(
+ cluster_identifier=_id, snapshot_name=snapshot_name
+ )
+ template = self.response_template(DELETE_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ def start_db_cluster(self):
+ _id = self._get_param("DBClusterIdentifier")
+ cluster = self.backend.start_db_cluster(cluster_identifier=_id)
+ template = self.response_template(START_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ def stop_db_cluster(self):
+ _id = self._get_param("DBClusterIdentifier")
+ cluster = self.backend.stop_db_cluster(cluster_identifier=_id)
+ template = self.response_template(STOP_CLUSTER_TEMPLATE)
+ return template.render(cluster=cluster)
+
+ def create_db_cluster_snapshot(self):
+ db_cluster_identifier = self._get_param("DBClusterIdentifier")
+ db_snapshot_identifier = self._get_param("DBClusterSnapshotIdentifier")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ snapshot = self.backend.create_db_cluster_snapshot(
+ db_cluster_identifier, db_snapshot_identifier, tags
+ )
+ template = self.response_template(CREATE_CLUSTER_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def copy_db_cluster_snapshot(self):
+ source_snapshot_identifier = self._get_param(
+ "SourceDBClusterSnapshotIdentifier"
+ )
+ target_snapshot_identifier = self._get_param(
+ "TargetDBClusterSnapshotIdentifier"
+ )
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+ snapshot = self.backend.copy_cluster_snapshot(
+ source_snapshot_identifier, target_snapshot_identifier, tags
+ )
+ template = self.response_template(COPY_CLUSTER_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def describe_db_cluster_snapshots(self):
+ db_cluster_identifier = self._get_param("DBClusterIdentifier")
+ db_snapshot_identifier = self._get_param("DBClusterSnapshotIdentifier")
+ filters = self._get_multi_param("Filters.Filter.")
+ filters = {f["Name"]: f["Values"] for f in filters}
+ snapshots = self.backend.describe_db_cluster_snapshots(
+ db_cluster_identifier, db_snapshot_identifier, filters
+ )
+ template = self.response_template(DESCRIBE_CLUSTER_SNAPSHOTS_TEMPLATE)
+ return template.render(snapshots=snapshots)
+
+ def delete_db_cluster_snapshot(self):
+ db_snapshot_identifier = self._get_param("DBClusterSnapshotIdentifier")
+ snapshot = self.backend.delete_db_cluster_snapshot(db_snapshot_identifier)
+ template = self.response_template(DELETE_CLUSTER_SNAPSHOT_TEMPLATE)
+ return template.render(snapshot=snapshot)
+
+ def restore_db_cluster_from_snapshot(self):
+ db_snapshot_identifier = self._get_param("SnapshotIdentifier")
+ db_kwargs = self._get_db_cluster_kwargs()
+ new_cluster = self.backend.restore_db_cluster_from_snapshot(
+ db_snapshot_identifier, db_kwargs
+ )
+ template = self.response_template(RESTORE_CLUSTER_FROM_SNAPSHOT_TEMPLATE)
+ return template.render(cluster=new_cluster)
+
+ def start_export_task(self):
+ kwargs = self._get_export_task_kwargs()
+ export_task = self.backend.start_export_task(kwargs)
+ template = self.response_template(START_EXPORT_TASK_TEMPLATE)
+ return template.render(task=export_task)
+
+ def cancel_export_task(self):
+ export_task_identifier = self._get_param("ExportTaskIdentifier")
+ export_task = self.backend.cancel_export_task(export_task_identifier)
+ template = self.response_template(CANCEL_EXPORT_TASK_TEMPLATE)
+ return template.render(task=export_task)
+
+ def describe_export_tasks(self):
+ export_task_identifier = self._get_param("ExportTaskIdentifier")
+ tasks = self.backend.describe_export_tasks(export_task_identifier)
+ template = self.response_template(DESCRIBE_EXPORT_TASKS_TEMPLATE)
+ return template.render(tasks=tasks)
+
+ def create_event_subscription(self):
+ kwargs = self._get_event_subscription_kwargs()
+ subscription = self.backend.create_event_subscription(kwargs)
+ template = self.response_template(CREATE_EVENT_SUBSCRIPTION_TEMPLATE)
+ return template.render(subscription=subscription)
+
+ def delete_event_subscription(self):
+ subscription_name = self._get_param("SubscriptionName")
+ subscription = self.backend.delete_event_subscription(subscription_name)
+ template = self.response_template(DELETE_EVENT_SUBSCRIPTION_TEMPLATE)
+ return template.render(subscription=subscription)
+
+ def describe_event_subscriptions(self):
+ subscription_name = self._get_param("SubscriptionName")
+ subscriptions = self.backend.describe_event_subscriptions(subscription_name)
+ template = self.response_template(DESCRIBE_EVENT_SUBSCRIPTIONS_TEMPLATE)
+ return template.render(subscriptions=subscriptions)
+
+
+CREATE_DATABASE_TEMPLATE = """<CreateDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBInstanceResult>
+ {{ database.to_xml() }}
+ </CreateDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CreateDBInstanceResponse>"""
+
+CREATE_DATABASE_REPLICA_TEMPLATE = """<CreateDBInstanceReadReplicaResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBInstanceReadReplicaResult>
+ {{ database.to_xml() }}
+ </CreateDBInstanceReadReplicaResult>
+ <ResponseMetadata>
+ <RequestId>5e60c46d-a844-11e4-bb68-17f36418e58f</RequestId>
+ </ResponseMetadata>
+</CreateDBInstanceReadReplicaResponse>"""
+
+DESCRIBE_DATABASES_TEMPLATE = """<DescribeDBInstancesResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBInstancesResult>
+ <DBInstances>
+ {%- for database in databases -%}
+ {{ database.to_xml() }}
+ {%- endfor -%}
+ </DBInstances>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </DescribeDBInstancesResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeDBInstancesResponse>"""
+
+MODIFY_DATABASE_TEMPLATE = """<ModifyDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ModifyDBInstanceResult>
+ {{ database.to_xml() }}
+ </ModifyDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>bb58476c-a1a8-11e4-99cf-55e92d4bbada</RequestId>
+ </ResponseMetadata>
+</ModifyDBInstanceResponse>"""
+
+REBOOT_DATABASE_TEMPLATE = """<RebootDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <RebootDBInstanceResult>
+ {{ database.to_xml() }}
+ </RebootDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>d55711cb-a1ab-11e4-99cf-55e92d4bbada</RequestId>
+ </ResponseMetadata>
+</RebootDBInstanceResponse>"""
+
+START_DATABASE_TEMPLATE = """<StartDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <StartDBInstanceResult>
+ {{ database.to_xml() }}
+ </StartDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab9</RequestId>
+ </ResponseMetadata>
+</StartDBInstanceResponse>"""
+
+STOP_DATABASE_TEMPLATE = """<StopDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <StopDBInstanceResult>
+ {{ database.to_xml() }}
+ </StopDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab8</RequestId>
+ </ResponseMetadata>
+</StopDBInstanceResponse>"""
+
+DELETE_DATABASE_TEMPLATE = """<DeleteDBInstanceResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DeleteDBInstanceResult>
+ {{ database.to_xml() }}
+ </DeleteDBInstanceResult>
+ <ResponseMetadata>
+ <RequestId>7369556f-b70d-11c3-faca-6ba18376ea1b</RequestId>
+ </ResponseMetadata>
+</DeleteDBInstanceResponse>"""
+
+DELETE_CLUSTER_TEMPLATE = """<DeleteDBClusterResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DeleteDBClusterResult>
+ {{ cluster.to_xml() }}
+ </DeleteDBClusterResult>
+ <ResponseMetadata>
+ <RequestId>7369556f-b70d-11c3-faca-6ba18376ea1b</RequestId>
+ </ResponseMetadata>
+</DeleteDBClusterResponse>"""
+
+RESTORE_INSTANCE_FROM_SNAPSHOT_TEMPLATE = """<RestoreDBInstanceFromDBSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <RestoreDBInstanceFromDBSnapshotResult>
+ {{ database.to_xml() }}
+ </RestoreDBInstanceFromDBSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</RestoreDBInstanceFromDBSnapshotResponse>"""
+
+CREATE_SNAPSHOT_TEMPLATE = """<CreateDBSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </CreateDBSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CreateDBSnapshotResponse>
+"""
+
+COPY_SNAPSHOT_TEMPLATE = """<CopyDBSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CopyDBSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </CopyDBSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CopyDBSnapshotResponse>
+"""
+
+DESCRIBE_SNAPSHOTS_TEMPLATE = """<DescribeDBSnapshotsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBSnapshotsResult>
+ <DBSnapshots>
+ {%- for snapshot in snapshots -%}
+ {{ snapshot.to_xml() }}
+ {%- endfor -%}
+ </DBSnapshots>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </DescribeDBSnapshotsResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeDBSnapshotsResponse>"""
+
+DELETE_SNAPSHOT_TEMPLATE = """<DeleteDBSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DeleteDBSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </DeleteDBSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DeleteDBSnapshotResponse>
+"""
+
+CREATE_SECURITY_GROUP_TEMPLATE = """<CreateDBSecurityGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBSecurityGroupResult>
+ {{ security_group.to_xml() }}
+ </CreateDBSecurityGroupResult>
+ <ResponseMetadata>
+ <RequestId>462165d0-a77a-11e4-a5fa-75b30c556f97</RequestId>
+ </ResponseMetadata>
+</CreateDBSecurityGroupResponse>"""
+
+DESCRIBE_SECURITY_GROUPS_TEMPLATE = """<DescribeDBSecurityGroupsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBSecurityGroupsResult>
+ <DBSecurityGroups>
+ {% for security_group in security_groups %}
+ {{ security_group.to_xml() }}
+ {% endfor %}
+ </DBSecurityGroups>
+ </DescribeDBSecurityGroupsResult>
+ <ResponseMetadata>
+ <RequestId>5df2014e-a779-11e4-bdb0-594def064d0c</RequestId>
+ </ResponseMetadata>
+</DescribeDBSecurityGroupsResponse>"""
+
+DELETE_SECURITY_GROUP_TEMPLATE = """<DeleteDBSecurityGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ResponseMetadata>
+ <RequestId>97e846bd-a77d-11e4-ac58-91351c0f3426</RequestId>
+ </ResponseMetadata>
+</DeleteDBSecurityGroupResponse>"""
+
+AUTHORIZE_SECURITY_GROUP_TEMPLATE = """<AuthorizeDBSecurityGroupIngressResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <AuthorizeDBSecurityGroupIngressResult>
+ {{ security_group.to_xml() }}
+ </AuthorizeDBSecurityGroupIngressResult>
+ <ResponseMetadata>
+ <RequestId>75d32fd5-a77e-11e4-8892-b10432f7a87d</RequestId>
+ </ResponseMetadata>
+</AuthorizeDBSecurityGroupIngressResponse>"""
+
+CREATE_SUBNET_GROUP_TEMPLATE = """<CreateDBSubnetGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBSubnetGroupResult>
+ {{ subnet_group.to_xml() }}
+ </CreateDBSubnetGroupResult>
+ <ResponseMetadata>
+ <RequestId>3a401b3f-bb9e-11d3-f4c6-37db295f7674</RequestId>
+ </ResponseMetadata>
+</CreateDBSubnetGroupResponse>"""
+
+DESCRIBE_SUBNET_GROUPS_TEMPLATE = """<DescribeDBSubnetGroupsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBSubnetGroupsResult>
+ <DBSubnetGroups>
+ {% for subnet_group in subnet_groups %}
+ {{ subnet_group.to_xml() }}
+ {% endfor %}
+ </DBSubnetGroups>
+ </DescribeDBSubnetGroupsResult>
+ <ResponseMetadata>
+ <RequestId>b783db3b-b98c-11d3-fbc7-5c0aad74da7c</RequestId>
+ </ResponseMetadata>
+</DescribeDBSubnetGroupsResponse>"""
+
+MODIFY_SUBNET_GROUPS_TEMPLATE = """<ModifyDBSubnetGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ModifyDBSubnetGroupResult>
+ {{ subnet_group.to_xml() }}
+ </ModifyDBSubnetGroupResult>
+ <ResponseMetadata>
+ <RequestId>b783db3b-b98c-11d3-fbc7-5c0aad74da7c</RequestId>
+ </ResponseMetadata>
+</ModifyDBSubnetGroupResponse>"""
+
+DELETE_SUBNET_GROUP_TEMPLATE = """<DeleteDBSubnetGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ResponseMetadata>
+ <RequestId>13785dd5-a7fc-11e4-bb9c-7f371d0859b0</RequestId>
+ </ResponseMetadata>
+</DeleteDBSubnetGroupResponse>"""
+
+CREATE_OPTION_GROUP_TEMPLATE = """<CreateOptionGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateOptionGroupResult>
+ {{ option_group.to_xml() }}
+ </CreateOptionGroupResult>
+ <ResponseMetadata>
+ <RequestId>1e38dad4-9f50-11e4-87ea-a31c60ed2e36</RequestId>
+ </ResponseMetadata>
+</CreateOptionGroupResponse>"""
+
+DELETE_OPTION_GROUP_TEMPLATE = """<DeleteOptionGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ResponseMetadata>
+ <RequestId>e2590367-9fa2-11e4-99cf-55e92d41c60e</RequestId>
+ </ResponseMetadata>
+</DeleteOptionGroupResponse>"""
+
+DESCRIBE_OPTION_GROUP_TEMPLATE = """<DescribeOptionGroupsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeOptionGroupsResult>
+ <OptionGroupsList>
+ {%- for option_group in option_groups -%}
+ {{ option_group.to_xml() }}
+ {%- endfor -%}
+ </OptionGroupsList>
+ </DescribeOptionGroupsResult>
+ <ResponseMetadata>
+ <RequestId>4caf445d-9fbc-11e4-87ea-a31c60ed2e36</RequestId>
+ </ResponseMetadata>
+</DescribeOptionGroupsResponse>"""
+
+DESCRIBE_OPTION_GROUP_OPTIONS_TEMPLATE = """<DescribeOptionGroupOptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeOptionGroupOptionsResult>
+ <OptionGroupOptions>
+ {%- for option_group_option in option_group_options -%}
+ {{ option_group_option.to_xml() }}
+ {%- endfor -%}
+ </OptionGroupOptions>
+ </DescribeOptionGroupOptionsResult>
+ <ResponseMetadata>
+ <RequestId>457f7bb8-9fbf-11e4-9084-5754f80d5144</RequestId>
+ </ResponseMetadata>
+</DescribeOptionGroupOptionsResponse>"""
+
+MODIFY_OPTION_GROUP_TEMPLATE = """<ModifyOptionGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ModifyOptionGroupResult>
+ {{ option_group.to_xml() }}
+ </ModifyOptionGroupResult>
+ <ResponseMetadata>
+ <RequestId>ce9284a5-a0de-11e4-b984-a11a53e1f328</RequestId>
+ </ResponseMetadata>
+</ModifyOptionGroupResponse>"""
+
+CREATE_DB_PARAMETER_GROUP_TEMPLATE = """<CreateDBParameterGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBParameterGroupResult>
+ {{ db_parameter_group.to_xml() }}
+ </CreateDBParameterGroupResult>
+ <ResponseMetadata>
+ <RequestId>7805c127-af22-11c3-96ac-6999cc5f7e72</RequestId>
+ </ResponseMetadata>
+</CreateDBParameterGroupResponse>"""
+
+DESCRIBE_DB_PARAMETER_GROUPS_TEMPLATE = """<DescribeDBParameterGroupsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBParameterGroupsResult>
+ <DBParameterGroups>
+ {%- for db_parameter_group in db_parameter_groups -%}
+ {{ db_parameter_group.to_xml() }}
+ {%- endfor -%}
+ </DBParameterGroups>
+ </DescribeDBParameterGroupsResult>
+ <ResponseMetadata>
+ <RequestId>b75d527a-b98c-11d3-f272-7cd6cce12cc5</RequestId>
+ </ResponseMetadata>
+</DescribeDBParameterGroupsResponse>"""
+
+MODIFY_DB_PARAMETER_GROUP_TEMPLATE = """<ModifyDBParameterGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ModifyDBParameterGroupResult>
+ <DBParameterGroupName>{{ db_parameter_group.name }}</DBParameterGroupName>
+ </ModifyDBParameterGroupResult>
+ <ResponseMetadata>
+ <RequestId>12d7435e-bba0-11d3-fe11-33d33a9bb7e3</RequestId>
+ </ResponseMetadata>
+</ModifyDBParameterGroupResponse>"""
+
+DELETE_DB_PARAMETER_GROUP_TEMPLATE = """<DeleteDBParameterGroupResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <ResponseMetadata>
+ <RequestId>cad6c267-ba25-11d3-fe11-33d33a9bb7e3</RequestId>
+ </ResponseMetadata>
+</DeleteDBParameterGroupResponse>"""
+
+DESCRIBE_DB_PARAMETERS_TEMPLATE = """<DescribeDBParametersResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBParametersResult>
+ <Parameters>
+ {%- for db_parameter_name, db_parameter in db_parameter_group.parameters.items() -%}
+ <Parameter>
+ {%- for parameter_name, parameter_value in db_parameter.items() -%}
+ <{{ parameter_name }}>{{ parameter_value }}</{{ parameter_name }}>
+ {%- endfor -%}
+ </Parameter>
+ {%- endfor -%}
+ </Parameters>
+ </DescribeDBParametersResult>
+ <ResponseMetadata>
+ <RequestId>8c40488f-b9ff-11d3-a15e-7ac49293f4fa</RequestId>
+ </ResponseMetadata>
+</DescribeDBParametersResponse>
+"""
+
+LIST_TAGS_FOR_RESOURCE_TEMPLATE = """<ListTagsForResourceResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <ListTagsForResourceResult>
+ <TagList>
+ {%- for tag in tags -%}
+ <Tag>
+ <Key>{{ tag['Key'] }}</Key>
+ <Value>{{ tag['Value'] }}</Value>
+ </Tag>
+ {%- endfor -%}
+ </TagList>
+ </ListTagsForResourceResult>
+ <ResponseMetadata>
+ <RequestId>8c21ba39-a598-11e4-b688-194eaf8658fa</RequestId>
+ </ResponseMetadata>
+</ListTagsForResourceResponse>"""
+
+ADD_TAGS_TO_RESOURCE_TEMPLATE = """<AddTagsToResourceResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <ResponseMetadata>
+ <RequestId>b194d9ca-a664-11e4-b688-194eaf8658fa</RequestId>
+ </ResponseMetadata>
+</AddTagsToResourceResponse>"""
+
+REMOVE_TAGS_FROM_RESOURCE_TEMPLATE = """<RemoveTagsFromResourceResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <ResponseMetadata>
+ <RequestId>b194d9ca-a664-11e4-b688-194eaf8658fa</RequestId>
+ </ResponseMetadata>
+</RemoveTagsFromResourceResponse>"""
+
+CREATE_DB_CLUSTER_TEMPLATE = """<CreateDBClusterResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBClusterResult>
+ {{ cluster.to_xml() }}
+ </CreateDBClusterResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CreateDBClusterResponse>"""
+
+DESCRIBE_CLUSTERS_TEMPLATE = """<DescribeDBClustersResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBClustersResult>
+ <DBClusters>
+ {%- for cluster in clusters -%}
+ {{ cluster.to_xml() }}
+ {%- endfor -%}
+ </DBClusters>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </DescribeDBClustersResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeDBClustersResponse>"""
+
+START_CLUSTER_TEMPLATE = """<StartDBClusterResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <StartDBClusterResult>
+ {{ cluster.to_xml() }}
+ </StartDBClusterResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab9</RequestId>
+ </ResponseMetadata>
+</StartDBClusterResponse>"""
+
+STOP_CLUSTER_TEMPLATE = """<StopDBClusterResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">
+ <StopDBClusterResult>
+ {{ cluster.to_xml() }}
+ </StopDBClusterResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab8</RequestId>
+ </ResponseMetadata>
+</StopDBClusterResponse>"""
+
+RESTORE_CLUSTER_FROM_SNAPSHOT_TEMPLATE = """<RestoreDBClusterFromDBSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <RestoreDBClusterFromSnapshotResult>
+ {{ cluster.to_xml() }}
+ </RestoreDBClusterFromSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</RestoreDBClusterFromDBSnapshotResponse>
+"""
+
+CREATE_CLUSTER_SNAPSHOT_TEMPLATE = """<CreateDBClusterSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateDBClusterSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </CreateDBClusterSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CreateDBClusterSnapshotResponse>
+"""
+
+COPY_CLUSTER_SNAPSHOT_TEMPLATE = """<CopyDBClusterSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CopyDBClusterSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </CopyDBClusterSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CopyDBClusterSnapshotResponse>
+"""
+
+DESCRIBE_CLUSTER_SNAPSHOTS_TEMPLATE = """<DescribeDBClusterSnapshotsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeDBClusterSnapshotsResult>
+ <DBClusterSnapshots>
+ {%- for snapshot in snapshots -%}
+ {{ snapshot.to_xml() }}
+ {%- endfor -%}
+ </DBClusterSnapshots>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </DescribeDBClusterSnapshotsResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeDBClusterSnapshotsResponse>"""
+
+DELETE_CLUSTER_SNAPSHOT_TEMPLATE = """<DeleteDBClusterSnapshotResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DeleteDBClusterSnapshotResult>
+ {{ snapshot.to_xml() }}
+ </DeleteDBClusterSnapshotResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DeleteDBClusterSnapshotResponse>
+"""
+
+START_EXPORT_TASK_TEMPLATE = """<StartExportTaskResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <StartExportTaskResult>
+ {{ task.to_xml() }}
+ </StartExportTaskResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</StartExportTaskResponse>
+"""
+
+CANCEL_EXPORT_TASK_TEMPLATE = """<CancelExportTaskResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CancelExportTaskResult>
+ {{ task.to_xml() }}
+ </CancelExportTaskResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CancelExportTaskResponse>
+"""
+
+DESCRIBE_EXPORT_TASKS_TEMPLATE = """<DescribeExportTasksResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeExportTasksResult>
+ <ExportTasks>
+ {%- for task in tasks -%}
+ <ExportTask>{{ task.to_xml() }}</ExportTask>
+ {%- endfor -%}
+ </ExportTasks>
+ {% if marker %}
+ <Marker>{{ marker }}</Marker>
+ {% endif %}
+ </DescribeExportTasksResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeExportTasksResponse>
+"""
+
+CREATE_EVENT_SUBSCRIPTION_TEMPLATE = """<CreateEventSubscriptionResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <CreateEventSubscriptionResult>
+ {{ subscription.to_xml() }}
+ </CreateEventSubscriptionResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</CreateEventSubscriptionResponse>
+"""
+
+DELETE_EVENT_SUBSCRIPTION_TEMPLATE = """<DeleteEventSubscriptionResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DeleteEventSubscriptionResult>
+ {{ subscription.to_xml() }}
+ </DeleteEventSubscriptionResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DeleteEventSubscriptionResponse>
+"""
+
+DESCRIBE_EVENT_SUBSCRIPTIONS_TEMPLATE = """<DescribeEventSubscriptionsResponse xmlns="http://rds.amazonaws.com/doc/2014-09-01/">
+ <DescribeEventSubscriptionsResult>
+ <EventSubscriptionsList>
+ {%- for subscription in subscriptions -%}
+ {{ subscription.to_xml() }}
+ {%- endfor -%}
+ </EventSubscriptionsList>
+ </DescribeEventSubscriptionsResult>
+ <ResponseMetadata>
+ <RequestId>523e3218-afc7-11c3-90f5-f90431260ab4</RequestId>
+ </ResponseMetadata>
+</DescribeEventSubscriptionsResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/rds/urls.py b/contrib/python/moto/py3/moto/rds/urls.py
new file mode 100644
index 0000000000..3bca6b1cfa
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/urls.py
@@ -0,0 +1,5 @@
+from .responses import RDSResponse
+
+url_bases = [r"https?://rds\.(.+)\.amazonaws\.com", r"https?://rds\.amazonaws\.com"]
+
+url_paths = {"{0}/$": RDSResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/rds/utils.py b/contrib/python/moto/py3/moto/rds/utils.py
new file mode 100644
index 0000000000..07569c9626
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rds/utils.py
@@ -0,0 +1,137 @@
+from collections import namedtuple
+
+from botocore.utils import merge_dicts
+
+from collections import OrderedDict
+
+FilterDef = namedtuple(
+ "FilterDef",
+ [
+ # A list of object attributes to check against the filter values.
+ # Set to None if filter is not yet implemented in `moto`.
+ "attrs_to_check",
+ # Description of the filter, e.g. 'Object Identifiers'.
+ # Used in filter error messaging.
+ "description",
+ ],
+)
+
+
+def get_object_value(obj, attr):
+ """Retrieves an arbitrary attribute value from an object.
+
+ Nested attributes can be specified using dot notation,
+ e.g. 'parent.child'.
+
+ :param object obj:
+ A valid Python object.
+ :param str attr:
+ The attribute name of the value to retrieve from the object.
+ :returns:
+ The attribute value, if it exists, or None.
+ :rtype:
+ any
+ """
+ keys = attr.split(".")
+ val = obj
+ for key in keys:
+ if hasattr(val, key):
+ val = getattr(val, key)
+ else:
+ return None
+ return val
+
+
+def merge_filters(filters_to_update, filters_to_merge):
+ """Given two groups of filters, merge the second into the first.
+
+ List values are appended instead of overwritten:
+
+ >>> merge_filters({'filter-name': ['value1']}, {'filter-name':['value2']})
+ >>> {'filter-name': ['value1', 'value2']}
+
+ :param filters_to_update:
+ The filters to update.
+ :type filters_to_update:
+ dict[str, list] or None
+ :param filters_to_merge:
+ The filters to merge.
+ :type filters_to_merge:
+ dict[str, list] or None
+ :returns:
+ The updated filters.
+ :rtype:
+ dict[str, list]
+ """
+ if filters_to_update is None:
+ filters_to_update = {}
+ if filters_to_merge is None:
+ filters_to_merge = {}
+ merge_dicts(filters_to_update, filters_to_merge, append_lists=True)
+ return filters_to_update
+
+
+def validate_filters(filters, filter_defs):
+ """Validates filters against a set of filter definitions.
+
+ Raises standard Python exceptions which should be caught
+ and translated to an appropriate AWS/Moto exception higher
+ up the call stack.
+
+ :param dict[str, list] filters:
+ The filters to validate.
+ :param dict[str, FilterDef] filter_defs:
+ The filter definitions to validate against.
+ :returns: None
+ :rtype: None
+ :raises KeyError:
+ if filter name not found in the filter definitions.
+ :raises ValueError:
+ if filter values is an empty list.
+ :raises NotImplementedError:
+ if `moto` does not yet support this filter.
+ """
+ for filter_name, filter_values in filters.items():
+ filter_def = filter_defs.get(filter_name)
+ if filter_def is None:
+ raise KeyError("Unrecognized filter name: {}".format(filter_name))
+ if not filter_values:
+ raise ValueError(
+ "The list of {} must not be empty.".format(filter_def.description)
+ )
+ if filter_def.attrs_to_check is None:
+ raise NotImplementedError(
+ "{} filter has not been implemented in Moto yet.".format(filter_name)
+ )
+
+
+def apply_filter(resources, filters, filter_defs):
+ """Apply an arbitrary filter to a group of resources.
+
+ :param dict[str, object] resources:
+ A dictionary mapping resource identifiers to resource objects.
+ :param dict[str, list] filters:
+ The filters to apply.
+ :param dict[str, FilterDef] filter_defs:
+ The supported filter definitions for the resource type.
+ :returns:
+ The filtered collection of resources.
+ :rtype:
+ dict[str, object]
+ """
+ resources_filtered = OrderedDict()
+ for identifier, obj in resources.items():
+ matches_filter = False
+ for filter_name, filter_values in filters.items():
+ filter_def = filter_defs.get(filter_name)
+ for attr in filter_def.attrs_to_check:
+ if get_object_value(obj, attr) in filter_values:
+ matches_filter = True
+ break
+ else:
+ matches_filter = False
+ if not matches_filter:
+ break
+ if matches_filter:
+ resources_filtered[identifier] = obj
+ return resources_filtered
diff --git a/contrib/python/moto/py3/moto/redshift/__init__.py b/contrib/python/moto/py3/moto/redshift/__init__.py
new file mode 100644
index 0000000000..0bd3d0b8e0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/__init__.py
@@ -0,0 +1,4 @@
+from .models import redshift_backends
+from ..core.models import base_decorator
+
+mock_redshift = base_decorator(redshift_backends)
diff --git a/contrib/python/moto/py3/moto/redshift/exceptions.py b/contrib/python/moto/py3/moto/redshift/exceptions.py
new file mode 100644
index 0000000000..b3c5e914f3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/exceptions.py
@@ -0,0 +1,167 @@
+import json
+from werkzeug.exceptions import BadRequest
+
+
+class RedshiftClientError(BadRequest):
+ def __init__(self, code, message):
+ super().__init__()
+ self.description = json.dumps(
+ {
+ "Error": {"Code": code, "Message": message, "Type": "Sender"},
+ "RequestId": "6876f774-7273-11e4-85dc-39e55ca848d1",
+ }
+ )
+
+
+class ClusterNotFoundError(RedshiftClientError):
+ def __init__(self, cluster_identifier):
+ super().__init__(
+ "ClusterNotFound", "Cluster {0} not found.".format(cluster_identifier)
+ )
+
+
+class ClusterSubnetGroupNotFoundError(RedshiftClientError):
+ def __init__(self, subnet_identifier):
+ super().__init__(
+ "ClusterSubnetGroupNotFound",
+ "Subnet group {0} not found.".format(subnet_identifier),
+ )
+
+
+class ClusterSecurityGroupNotFoundError(RedshiftClientError):
+ def __init__(self, group_identifier):
+ super().__init__(
+ "ClusterSecurityGroupNotFound",
+ "Security group {0} not found.".format(group_identifier),
+ )
+
+
+class ClusterParameterGroupNotFoundError(RedshiftClientError):
+ def __init__(self, group_identifier):
+ super().__init__(
+ "ClusterParameterGroupNotFound",
+ "Parameter group {0} not found.".format(group_identifier),
+ )
+
+
+class InvalidSubnetError(RedshiftClientError):
+ def __init__(self, subnet_identifier):
+ super().__init__(
+ "InvalidSubnet", "Subnet {0} not found.".format(subnet_identifier)
+ )
+
+
+class SnapshotCopyGrantAlreadyExistsFaultError(RedshiftClientError):
+ def __init__(self, snapshot_copy_grant_name):
+ super().__init__(
+ "SnapshotCopyGrantAlreadyExistsFault",
+ "Cannot create the snapshot copy grant because a grant "
+ "with the identifier '{0}' already exists".format(snapshot_copy_grant_name),
+ )
+
+
+class SnapshotCopyGrantNotFoundFaultError(RedshiftClientError):
+ def __init__(self, snapshot_copy_grant_name):
+ super().__init__(
+ "SnapshotCopyGrantNotFoundFault",
+ "Snapshot copy grant not found: {0}".format(snapshot_copy_grant_name),
+ )
+
+
+class ClusterSnapshotNotFoundError(RedshiftClientError):
+ def __init__(self, snapshot_identifier):
+ super().__init__(
+ "ClusterSnapshotNotFound",
+ "Snapshot {0} not found.".format(snapshot_identifier),
+ )
+
+
+class ClusterSnapshotAlreadyExistsError(RedshiftClientError):
+ def __init__(self, snapshot_identifier):
+ super().__init__(
+ "ClusterSnapshotAlreadyExists",
+ "Cannot create the snapshot because a snapshot with the "
+ "identifier {0} already exists".format(snapshot_identifier),
+ )
+
+
+class InvalidParameterValueError(RedshiftClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class ResourceNotFoundFaultError(RedshiftClientError):
+
+ code = 404
+
+ def __init__(self, resource_type=None, resource_name=None, message=None):
+ if resource_type and not resource_name:
+ msg = "resource of type '{0}' not found.".format(resource_type)
+ else:
+ msg = "{0} ({1}) not found.".format(resource_type, resource_name)
+ if message:
+ msg = message
+ super().__init__("ResourceNotFoundFault", msg)
+
+
+class SnapshotCopyDisabledFaultError(RedshiftClientError):
+ def __init__(self, cluster_identifier):
+ super().__init__(
+ "SnapshotCopyDisabledFault",
+ "Cannot modify retention period because snapshot copy is disabled on Cluster {0}.".format(
+ cluster_identifier
+ ),
+ )
+
+
+class SnapshotCopyAlreadyDisabledFaultError(RedshiftClientError):
+ def __init__(self, cluster_identifier):
+ super().__init__(
+ "SnapshotCopyAlreadyDisabledFault",
+ "Snapshot Copy is already disabled on Cluster {0}.".format(
+ cluster_identifier
+ ),
+ )
+
+
+class SnapshotCopyAlreadyEnabledFaultError(RedshiftClientError):
+ def __init__(self, cluster_identifier):
+ super().__init__(
+ "SnapshotCopyAlreadyEnabledFault",
+ "Snapshot Copy is already enabled on Cluster {0}.".format(
+ cluster_identifier
+ ),
+ )
+
+
+class ClusterAlreadyExistsFaultError(RedshiftClientError):
+ def __init__(self):
+ super().__init__("ClusterAlreadyExists", "Cluster already exists")
+
+
+class InvalidParameterCombinationError(RedshiftClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterCombination", message)
+
+
+class UnknownSnapshotCopyRegionFaultError(RedshiftClientError):
+ def __init__(self, message):
+ super().__init__("UnknownSnapshotCopyRegionFault", message)
+
+
+class ClusterSecurityGroupNotFoundFaultError(RedshiftClientError):
+ def __init__(self):
+ super().__init__(
+ "ClusterSecurityGroupNotFoundFault",
+ "The cluster security group name does not refer to an existing cluster security group.",
+ )
+
+
+class InvalidClusterSnapshotStateFaultError(RedshiftClientError):
+ def __init__(self, snapshot_identifier):
+ super().__init__(
+ "InvalidClusterSnapshotStateFault",
+ "Cannot delete the snapshot {0} because only manual snapshots may be deleted".format(
+ snapshot_identifier
+ ),
+ )
diff --git a/contrib/python/moto/py3/moto/redshift/models.py b/contrib/python/moto/py3/moto/redshift/models.py
new file mode 100644
index 0000000000..e29e8a98a4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/models.py
@@ -0,0 +1,1045 @@
+import copy
+import datetime
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from moto.utilities.utils import random_string
+from moto.ec2 import ec2_backends
+from .exceptions import (
+ ClusterAlreadyExistsFaultError,
+ ClusterNotFoundError,
+ ClusterParameterGroupNotFoundError,
+ ClusterSecurityGroupNotFoundError,
+ ClusterSnapshotAlreadyExistsError,
+ ClusterSnapshotNotFoundError,
+ ClusterSubnetGroupNotFoundError,
+ InvalidParameterCombinationError,
+ InvalidParameterValueError,
+ InvalidSubnetError,
+ ResourceNotFoundFaultError,
+ SnapshotCopyAlreadyDisabledFaultError,
+ SnapshotCopyAlreadyEnabledFaultError,
+ SnapshotCopyDisabledFaultError,
+ SnapshotCopyGrantAlreadyExistsFaultError,
+ SnapshotCopyGrantNotFoundFaultError,
+ UnknownSnapshotCopyRegionFaultError,
+ ClusterSecurityGroupNotFoundFaultError,
+ InvalidClusterSnapshotStateFaultError,
+)
+
+
+from moto.core import get_account_id
+
+
+class TaggableResourceMixin(object):
+
+ resource_type = None
+
+ def __init__(self, region_name, tags):
+ self.region = region_name
+ self.tags = tags or []
+
+ @property
+ def resource_id(self):
+ return None
+
+ @property
+ def arn(self):
+ return "arn:aws:redshift:{region}:{account_id}:{resource_type}:{resource_id}".format(
+ region=self.region,
+ account_id=get_account_id(),
+ resource_type=self.resource_type,
+ resource_id=self.resource_id,
+ )
+
+ def create_tags(self, tags):
+ new_keys = [tag_set["Key"] for tag_set in tags]
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in new_keys]
+ self.tags.extend(tags)
+ return self.tags
+
+ def delete_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["Key"] not in tag_keys]
+ return self.tags
+
+
+class Cluster(TaggableResourceMixin, CloudFormationModel):
+
+ resource_type = "cluster"
+
+ def __init__(
+ self,
+ redshift_backend,
+ cluster_identifier,
+ node_type,
+ master_username,
+ master_user_password,
+ db_name,
+ cluster_type,
+ cluster_security_groups,
+ vpc_security_group_ids,
+ cluster_subnet_group_name,
+ availability_zone,
+ preferred_maintenance_window,
+ cluster_parameter_group_name,
+ automated_snapshot_retention_period,
+ port,
+ cluster_version,
+ allow_version_upgrade,
+ number_of_nodes,
+ publicly_accessible,
+ encrypted,
+ region_name,
+ tags=None,
+ iam_roles_arn=None,
+ enhanced_vpc_routing=None,
+ restored_from_snapshot=False,
+ kms_key_id=None,
+ ):
+ super().__init__(region_name, tags)
+ self.redshift_backend = redshift_backend
+ self.cluster_identifier = cluster_identifier
+ self.create_time = iso_8601_datetime_with_milliseconds(
+ datetime.datetime.utcnow()
+ )
+ self.status = "available"
+ self.node_type = node_type
+ self.master_username = master_username
+ self.master_user_password = master_user_password
+ self.db_name = db_name if db_name else "dev"
+ self.vpc_security_group_ids = vpc_security_group_ids
+ self.enhanced_vpc_routing = (
+ enhanced_vpc_routing if enhanced_vpc_routing is not None else False
+ )
+ self.cluster_subnet_group_name = cluster_subnet_group_name
+ self.publicly_accessible = publicly_accessible
+ self.encrypted = encrypted
+
+ self.allow_version_upgrade = (
+ allow_version_upgrade if allow_version_upgrade is not None else True
+ )
+ self.cluster_version = cluster_version if cluster_version else "1.0"
+ self.port = int(port) if port else 5439
+ self.automated_snapshot_retention_period = (
+ int(automated_snapshot_retention_period)
+ if automated_snapshot_retention_period
+ else 1
+ )
+ self.preferred_maintenance_window = (
+ preferred_maintenance_window
+ if preferred_maintenance_window
+ else "Mon:03:00-Mon:03:30"
+ )
+
+ if cluster_parameter_group_name:
+ self.cluster_parameter_group_name = [cluster_parameter_group_name]
+ else:
+ self.cluster_parameter_group_name = ["default.redshift-1.0"]
+
+ if cluster_security_groups:
+ self.cluster_security_groups = cluster_security_groups
+ else:
+ self.cluster_security_groups = ["Default"]
+
+ if availability_zone:
+ self.availability_zone = availability_zone
+ else:
+ # This could probably be smarter, but there doesn't appear to be a
+ # way to pull AZs for a region in boto
+ self.availability_zone = region_name + "a"
+
+ if cluster_type == "single-node":
+ self.number_of_nodes = 1
+ elif number_of_nodes:
+ self.number_of_nodes = int(number_of_nodes)
+ else:
+ self.number_of_nodes = 1
+
+ self.iam_roles_arn = iam_roles_arn or []
+ self.restored_from_snapshot = restored_from_snapshot
+ self.kms_key_id = kms_key_id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html
+ return "AWS::Redshift::Cluster"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ redshift_backend = redshift_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ if "ClusterSubnetGroupName" in properties:
+ subnet_group_name = properties[
+ "ClusterSubnetGroupName"
+ ].cluster_subnet_group_name
+ else:
+ subnet_group_name = None
+
+ cluster = redshift_backend.create_cluster(
+ cluster_identifier=resource_name,
+ node_type=properties.get("NodeType"),
+ master_username=properties.get("MasterUsername"),
+ master_user_password=properties.get("MasterUserPassword"),
+ db_name=properties.get("DBName"),
+ cluster_type=properties.get("ClusterType"),
+ cluster_security_groups=properties.get("ClusterSecurityGroups", []),
+ vpc_security_group_ids=properties.get("VpcSecurityGroupIds", []),
+ cluster_subnet_group_name=subnet_group_name,
+ availability_zone=properties.get("AvailabilityZone"),
+ preferred_maintenance_window=properties.get("PreferredMaintenanceWindow"),
+ cluster_parameter_group_name=properties.get("ClusterParameterGroupName"),
+ automated_snapshot_retention_period=properties.get(
+ "AutomatedSnapshotRetentionPeriod"
+ ),
+ port=properties.get("Port"),
+ cluster_version=properties.get("ClusterVersion"),
+ allow_version_upgrade=properties.get("AllowVersionUpgrade"),
+ enhanced_vpc_routing=properties.get("EnhancedVpcRouting"),
+ number_of_nodes=properties.get("NumberOfNodes"),
+ publicly_accessible=properties.get("PubliclyAccessible"),
+ encrypted=properties.get("Encrypted"),
+ region_name=region_name,
+ kms_key_id=properties.get("KmsKeyId"),
+ )
+ return cluster
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Endpoint.Address", "Endpoint.Port"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Endpoint.Address":
+ return self.endpoint
+ elif attribute_name == "Endpoint.Port":
+ return self.port
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def endpoint(self):
+ return "{0}.cg034hpkmmjt.{1}.redshift.amazonaws.com".format(
+ self.cluster_identifier, self.region
+ )
+
+ @property
+ def security_groups(self):
+ return [
+ security_group
+ for security_group in self.redshift_backend.describe_cluster_security_groups()
+ if security_group.cluster_security_group_name
+ in self.cluster_security_groups
+ ]
+
+ @property
+ def vpc_security_groups(self):
+ return [
+ security_group
+ for security_group in self.redshift_backend.ec2_backend.describe_security_groups()
+ if security_group.id in self.vpc_security_group_ids
+ ]
+
+ @property
+ def parameter_groups(self):
+ return [
+ parameter_group
+ for parameter_group in self.redshift_backend.describe_cluster_parameter_groups()
+ if parameter_group.cluster_parameter_group_name
+ in self.cluster_parameter_group_name
+ ]
+
+ @property
+ def resource_id(self):
+ return self.cluster_identifier
+
+ def pause(self):
+ self.status = "paused"
+
+ def resume(self):
+ self.status = "available"
+
+ def to_json(self):
+ json_response = {
+ "MasterUsername": self.master_username,
+ "MasterUserPassword": "****",
+ "ClusterVersion": self.cluster_version,
+ "VpcSecurityGroups": [
+ {"Status": "active", "VpcSecurityGroupId": group.id}
+ for group in self.vpc_security_groups
+ ],
+ "ClusterSubnetGroupName": self.cluster_subnet_group_name,
+ "AvailabilityZone": self.availability_zone,
+ "ClusterStatus": self.status,
+ "NumberOfNodes": self.number_of_nodes,
+ "AutomatedSnapshotRetentionPeriod": self.automated_snapshot_retention_period,
+ "PubliclyAccessible": self.publicly_accessible,
+ "Encrypted": self.encrypted,
+ "DBName": self.db_name,
+ "PreferredMaintenanceWindow": self.preferred_maintenance_window,
+ "ClusterParameterGroups": [
+ {
+ "ParameterApplyStatus": "in-sync",
+ "ParameterGroupName": group.cluster_parameter_group_name,
+ }
+ for group in self.parameter_groups
+ ],
+ "ClusterSecurityGroups": [
+ {
+ "Status": "active",
+ "ClusterSecurityGroupName": group.cluster_security_group_name,
+ }
+ for group in self.security_groups
+ ],
+ "Port": self.port,
+ "NodeType": self.node_type,
+ "ClusterIdentifier": self.cluster_identifier,
+ "AllowVersionUpgrade": self.allow_version_upgrade,
+ "Endpoint": {"Address": self.endpoint, "Port": self.port},
+ "ClusterCreateTime": self.create_time,
+ "PendingModifiedValues": [],
+ "Tags": self.tags,
+ "EnhancedVpcRouting": self.enhanced_vpc_routing,
+ "IamRoles": [
+ {"ApplyStatus": "in-sync", "IamRoleArn": iam_role_arn}
+ for iam_role_arn in self.iam_roles_arn
+ ],
+ "KmsKeyId": self.kms_key_id,
+ }
+ if self.restored_from_snapshot:
+ json_response["RestoreStatus"] = {
+ "Status": "completed",
+ "CurrentRestoreRateInMegaBytesPerSecond": 123.0,
+ "SnapshotSizeInMegaBytes": 123,
+ "ProgressInMegaBytes": 123,
+ "ElapsedTimeInSeconds": 123,
+ "EstimatedTimeToCompletionInSeconds": 123,
+ }
+ try:
+ json_response[
+ "ClusterSnapshotCopyStatus"
+ ] = self.cluster_snapshot_copy_status
+ except AttributeError:
+ pass
+ return json_response
+
+
+class SnapshotCopyGrant(TaggableResourceMixin, BaseModel):
+
+ resource_type = "snapshotcopygrant"
+
+ def __init__(self, snapshot_copy_grant_name, kms_key_id):
+ self.snapshot_copy_grant_name = snapshot_copy_grant_name
+ self.kms_key_id = kms_key_id
+
+ def to_json(self):
+ return {
+ "SnapshotCopyGrantName": self.snapshot_copy_grant_name,
+ "KmsKeyId": self.kms_key_id,
+ }
+
+
+class SubnetGroup(TaggableResourceMixin, CloudFormationModel):
+
+ resource_type = "subnetgroup"
+
+ def __init__(
+ self,
+ ec2_backend,
+ cluster_subnet_group_name,
+ description,
+ subnet_ids,
+ region_name,
+ tags=None,
+ ):
+ super().__init__(region_name, tags)
+ self.ec2_backend = ec2_backend
+ self.cluster_subnet_group_name = cluster_subnet_group_name
+ self.description = description
+ self.subnet_ids = subnet_ids
+ if not self.subnets:
+ raise InvalidSubnetError(subnet_ids)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersubnetgroup.html
+ return "AWS::Redshift::ClusterSubnetGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ redshift_backend = redshift_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ subnet_group = redshift_backend.create_cluster_subnet_group(
+ cluster_subnet_group_name=resource_name,
+ description=properties.get("Description"),
+ subnet_ids=properties.get("SubnetIds", []),
+ region_name=region_name,
+ )
+ return subnet_group
+
+ @property
+ def subnets(self):
+ return self.ec2_backend.get_all_subnets(filters={"subnet-id": self.subnet_ids})
+
+ @property
+ def vpc_id(self):
+ return self.subnets[0].vpc_id
+
+ @property
+ def resource_id(self):
+ return self.cluster_subnet_group_name
+
+ def to_json(self):
+ return {
+ "VpcId": self.vpc_id,
+ "Description": self.description,
+ "ClusterSubnetGroupName": self.cluster_subnet_group_name,
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetStatus": "Active",
+ "SubnetIdentifier": subnet.id,
+ "SubnetAvailabilityZone": {"Name": subnet.availability_zone},
+ }
+ for subnet in self.subnets
+ ],
+ "Tags": self.tags,
+ }
+
+
+class SecurityGroup(TaggableResourceMixin, BaseModel):
+
+ resource_type = "securitygroup"
+
+ def __init__(
+ self, cluster_security_group_name, description, region_name, tags=None
+ ):
+ super().__init__(region_name, tags)
+ self.cluster_security_group_name = cluster_security_group_name
+ self.description = description
+ self.ingress_rules = []
+
+ @property
+ def resource_id(self):
+ return self.cluster_security_group_name
+
+ def to_json(self):
+ return {
+ "EC2SecurityGroups": [],
+ "IPRanges": [],
+ "Description": self.description,
+ "ClusterSecurityGroupName": self.cluster_security_group_name,
+ "Tags": self.tags,
+ }
+
+
+class ParameterGroup(TaggableResourceMixin, CloudFormationModel):
+
+ resource_type = "parametergroup"
+
+ def __init__(
+ self,
+ cluster_parameter_group_name,
+ group_family,
+ description,
+ region_name,
+ tags=None,
+ ):
+ super().__init__(region_name, tags)
+ self.cluster_parameter_group_name = cluster_parameter_group_name
+ self.group_family = group_family
+ self.description = description
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html
+ return "AWS::Redshift::ClusterParameterGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ redshift_backend = redshift_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ parameter_group = redshift_backend.create_cluster_parameter_group(
+ cluster_parameter_group_name=resource_name,
+ description=properties.get("Description"),
+ group_family=properties.get("ParameterGroupFamily"),
+ region_name=region_name,
+ )
+ return parameter_group
+
+ @property
+ def resource_id(self):
+ return self.cluster_parameter_group_name
+
+ def to_json(self):
+ return {
+ "ParameterGroupFamily": self.group_family,
+ "Description": self.description,
+ "ParameterGroupName": self.cluster_parameter_group_name,
+ "Tags": self.tags,
+ }
+
+
+class Snapshot(TaggableResourceMixin, BaseModel):
+
+ resource_type = "snapshot"
+
+ def __init__(
+ self,
+ cluster,
+ snapshot_identifier,
+ region_name,
+ tags=None,
+ iam_roles_arn=None,
+ snapshot_type="manual",
+ ):
+ super().__init__(region_name, tags)
+ self.cluster = copy.copy(cluster)
+ self.snapshot_identifier = snapshot_identifier
+ self.snapshot_type = snapshot_type
+ self.status = "available"
+ self.create_time = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+ self.iam_roles_arn = iam_roles_arn or []
+
+ @property
+ def resource_id(self):
+ return "{cluster_id}/{snapshot_id}".format(
+ cluster_id=self.cluster.cluster_identifier,
+ snapshot_id=self.snapshot_identifier,
+ )
+
+ def to_json(self):
+ return {
+ "SnapshotIdentifier": self.snapshot_identifier,
+ "ClusterIdentifier": self.cluster.cluster_identifier,
+ "SnapshotCreateTime": self.create_time,
+ "Status": self.status,
+ "Port": self.cluster.port,
+ "AvailabilityZone": self.cluster.availability_zone,
+ "MasterUsername": self.cluster.master_username,
+ "ClusterVersion": self.cluster.cluster_version,
+ "SnapshotType": self.snapshot_type,
+ "NodeType": self.cluster.node_type,
+ "NumberOfNodes": self.cluster.number_of_nodes,
+ "DBName": self.cluster.db_name,
+ "Tags": self.tags,
+ "EnhancedVpcRouting": self.cluster.enhanced_vpc_routing,
+ "IamRoles": [
+ {"ApplyStatus": "in-sync", "IamRoleArn": iam_role_arn}
+ for iam_role_arn in self.iam_roles_arn
+ ],
+ }
+
+
+class RedshiftBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.clusters = {}
+ self.subnet_groups = {}
+ self.security_groups = {
+ "Default": SecurityGroup(
+ "Default", "Default Redshift Security Group", self.region_name
+ )
+ }
+ self.parameter_groups = {
+ "default.redshift-1.0": ParameterGroup(
+ "default.redshift-1.0",
+ "redshift-1.0",
+ "Default Redshift parameter group",
+ self.region_name,
+ )
+ }
+ self.ec2_backend = ec2_backends[self.region_name]
+ self.snapshots = OrderedDict()
+ self.RESOURCE_TYPE_MAP = {
+ "cluster": self.clusters,
+ "parametergroup": self.parameter_groups,
+ "securitygroup": self.security_groups,
+ "snapshot": self.snapshots,
+ "subnetgroup": self.subnet_groups,
+ }
+ self.snapshot_copy_grants = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "redshift"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "redshift-data", policy_supported=False
+ )
+
+ def enable_snapshot_copy(self, **kwargs):
+ cluster_identifier = kwargs["cluster_identifier"]
+ cluster = self.clusters[cluster_identifier]
+ if not hasattr(cluster, "cluster_snapshot_copy_status"):
+ if (
+ cluster.encrypted == "true"
+ and kwargs["snapshot_copy_grant_name"] is None
+ ):
+ raise InvalidParameterValueError(
+ "SnapshotCopyGrantName is required for Snapshot Copy on KMS encrypted clusters."
+ )
+ if kwargs["destination_region"] == self.region_name:
+ raise UnknownSnapshotCopyRegionFaultError(
+ "Invalid region {}".format(self.region_name)
+ )
+ status = {
+ "DestinationRegion": kwargs["destination_region"],
+ "RetentionPeriod": kwargs["retention_period"],
+ "SnapshotCopyGrantName": kwargs["snapshot_copy_grant_name"],
+ }
+ cluster.cluster_snapshot_copy_status = status
+ return cluster
+ else:
+ raise SnapshotCopyAlreadyEnabledFaultError(cluster_identifier)
+
+ def disable_snapshot_copy(self, **kwargs):
+ cluster_identifier = kwargs["cluster_identifier"]
+ cluster = self.clusters[cluster_identifier]
+ if hasattr(cluster, "cluster_snapshot_copy_status"):
+ del cluster.cluster_snapshot_copy_status
+ return cluster
+ else:
+ raise SnapshotCopyAlreadyDisabledFaultError(cluster_identifier)
+
+ def modify_snapshot_copy_retention_period(
+ self, cluster_identifier, retention_period
+ ):
+ cluster = self.clusters[cluster_identifier]
+ if hasattr(cluster, "cluster_snapshot_copy_status"):
+ cluster.cluster_snapshot_copy_status["RetentionPeriod"] = retention_period
+ return cluster
+ else:
+ raise SnapshotCopyDisabledFaultError(cluster_identifier)
+
+ def create_cluster(self, **cluster_kwargs):
+ cluster_identifier = cluster_kwargs["cluster_identifier"]
+ if cluster_identifier in self.clusters:
+ raise ClusterAlreadyExistsFaultError()
+ cluster = Cluster(self, **cluster_kwargs)
+ self.clusters[cluster_identifier] = cluster
+ snapshot_id = "rs:{}-{}".format(
+ cluster_identifier, datetime.datetime.utcnow().strftime("%Y-%m-%d-%H-%M")
+ )
+ # Automated snapshots don't copy over the tags
+ self.create_cluster_snapshot(
+ cluster_identifier,
+ snapshot_id,
+ cluster.region,
+ None,
+ snapshot_type="automated",
+ )
+ return cluster
+
+ def pause_cluster(self, cluster_id):
+ if cluster_id not in self.clusters:
+ raise ClusterNotFoundError(cluster_identifier=cluster_id)
+ self.clusters[cluster_id].pause()
+ return self.clusters[cluster_id]
+
+ def resume_cluster(self, cluster_id):
+ if cluster_id not in self.clusters:
+ raise ClusterNotFoundError(cluster_identifier=cluster_id)
+ self.clusters[cluster_id].resume()
+ return self.clusters[cluster_id]
+
+ def describe_clusters(self, cluster_identifier=None):
+ clusters = self.clusters.values()
+ if cluster_identifier:
+ if cluster_identifier in self.clusters:
+ return [self.clusters[cluster_identifier]]
+ else:
+ raise ClusterNotFoundError(cluster_identifier)
+ return clusters
+
+ def modify_cluster(self, **cluster_kwargs):
+ cluster_identifier = cluster_kwargs.pop("cluster_identifier")
+ new_cluster_identifier = cluster_kwargs.pop("new_cluster_identifier", None)
+
+ cluster_type = cluster_kwargs.get("cluster_type")
+ if cluster_type and cluster_type not in ["multi-node", "single-node"]:
+ raise InvalidParameterValueError(
+ "Invalid cluster type. Cluster type can be one of multi-node or single-node"
+ )
+ if cluster_type == "single-node":
+ # AWS will always silently override this value for single-node clusters.
+ cluster_kwargs["number_of_nodes"] = 1
+ elif cluster_type == "multi-node":
+ if cluster_kwargs.get("number_of_nodes", 0) < 2:
+ raise InvalidParameterCombinationError(
+ "Number of nodes for cluster type multi-node must be greater than or equal to 2"
+ )
+
+ cluster = self.describe_clusters(cluster_identifier)[0]
+
+ for key, value in cluster_kwargs.items():
+ setattr(cluster, key, value)
+
+ if new_cluster_identifier:
+ dic = {
+ "cluster_identifier": cluster_identifier,
+ "skip_final_snapshot": True,
+ "final_cluster_snapshot_identifier": None,
+ }
+ self.delete_cluster(**dic)
+ cluster.cluster_identifier = new_cluster_identifier
+ self.clusters[new_cluster_identifier] = cluster
+
+ return cluster
+
+ def delete_automated_snapshots(self, cluster_identifier):
+ snapshots = self.describe_cluster_snapshots(
+ cluster_identifier=cluster_identifier
+ )
+ for snapshot in snapshots:
+ if snapshot.snapshot_type == "automated":
+ self.snapshots.pop(snapshot.snapshot_identifier)
+
+ def delete_cluster(self, **cluster_kwargs):
+ cluster_identifier = cluster_kwargs.pop("cluster_identifier")
+ cluster_skip_final_snapshot = cluster_kwargs.pop("skip_final_snapshot")
+ cluster_snapshot_identifer = cluster_kwargs.pop(
+ "final_cluster_snapshot_identifier"
+ )
+
+ if cluster_identifier in self.clusters:
+ if (
+ cluster_skip_final_snapshot is False
+ and cluster_snapshot_identifer is None
+ ):
+ raise InvalidParameterCombinationError(
+ "FinalClusterSnapshotIdentifier is required unless SkipFinalClusterSnapshot is specified."
+ )
+ elif (
+ cluster_skip_final_snapshot is False
+ and cluster_snapshot_identifer is not None
+ ): # create snapshot
+ cluster = self.describe_clusters(cluster_identifier)[0]
+ self.create_cluster_snapshot(
+ cluster_identifier,
+ cluster_snapshot_identifer,
+ cluster.region,
+ cluster.tags,
+ )
+ self.delete_automated_snapshots(cluster_identifier)
+ return self.clusters.pop(cluster_identifier)
+ raise ClusterNotFoundError(cluster_identifier)
+
+ def create_cluster_subnet_group(
+ self, cluster_subnet_group_name, description, subnet_ids, region_name, tags=None
+ ):
+ subnet_group = SubnetGroup(
+ self.ec2_backend,
+ cluster_subnet_group_name,
+ description,
+ subnet_ids,
+ region_name,
+ tags,
+ )
+ self.subnet_groups[cluster_subnet_group_name] = subnet_group
+ return subnet_group
+
+ def describe_cluster_subnet_groups(self, subnet_identifier=None):
+ subnet_groups = self.subnet_groups.values()
+ if subnet_identifier:
+ if subnet_identifier in self.subnet_groups:
+ return [self.subnet_groups[subnet_identifier]]
+ else:
+ raise ClusterSubnetGroupNotFoundError(subnet_identifier)
+ return subnet_groups
+
+ def delete_cluster_subnet_group(self, subnet_identifier):
+ if subnet_identifier in self.subnet_groups:
+ return self.subnet_groups.pop(subnet_identifier)
+ raise ClusterSubnetGroupNotFoundError(subnet_identifier)
+
+ def create_cluster_security_group(
+ self, cluster_security_group_name, description, region_name, tags=None
+ ):
+ security_group = SecurityGroup(
+ cluster_security_group_name, description, region_name, tags
+ )
+ self.security_groups[cluster_security_group_name] = security_group
+ return security_group
+
+ def describe_cluster_security_groups(self, security_group_name=None):
+ security_groups = self.security_groups.values()
+ if security_group_name:
+ if security_group_name in self.security_groups:
+ return [self.security_groups[security_group_name]]
+ else:
+ raise ClusterSecurityGroupNotFoundError(security_group_name)
+ return security_groups
+
+ def delete_cluster_security_group(self, security_group_identifier):
+ if security_group_identifier in self.security_groups:
+ return self.security_groups.pop(security_group_identifier)
+ raise ClusterSecurityGroupNotFoundError(security_group_identifier)
+
+ def authorize_cluster_security_group_ingress(self, security_group_name, cidr_ip):
+ security_group = self.security_groups.get(security_group_name)
+ if not security_group:
+ raise ClusterSecurityGroupNotFoundFaultError()
+
+ # just adding the cidr_ip as ingress rule for now as there is no security rule
+ security_group.ingress_rules.append(cidr_ip)
+
+ return security_group
+
+ def create_cluster_parameter_group(
+ self,
+ cluster_parameter_group_name,
+ group_family,
+ description,
+ region_name,
+ tags=None,
+ ):
+ parameter_group = ParameterGroup(
+ cluster_parameter_group_name, group_family, description, region_name, tags
+ )
+ self.parameter_groups[cluster_parameter_group_name] = parameter_group
+
+ return parameter_group
+
+ def describe_cluster_parameter_groups(self, parameter_group_name=None):
+ parameter_groups = self.parameter_groups.values()
+ if parameter_group_name:
+ if parameter_group_name in self.parameter_groups:
+ return [self.parameter_groups[parameter_group_name]]
+ else:
+ raise ClusterParameterGroupNotFoundError(parameter_group_name)
+ return parameter_groups
+
+ def delete_cluster_parameter_group(self, parameter_group_name):
+ if parameter_group_name in self.parameter_groups:
+ return self.parameter_groups.pop(parameter_group_name)
+ raise ClusterParameterGroupNotFoundError(parameter_group_name)
+
+ def create_cluster_snapshot(
+ self,
+ cluster_identifier,
+ snapshot_identifier,
+ region_name,
+ tags,
+ snapshot_type="manual",
+ ):
+ cluster = self.clusters.get(cluster_identifier)
+ if not cluster:
+ raise ClusterNotFoundError(cluster_identifier)
+ if self.snapshots.get(snapshot_identifier) is not None:
+ raise ClusterSnapshotAlreadyExistsError(snapshot_identifier)
+ snapshot = Snapshot(
+ cluster, snapshot_identifier, region_name, tags, snapshot_type=snapshot_type
+ )
+ self.snapshots[snapshot_identifier] = snapshot
+ return snapshot
+
+ def describe_cluster_snapshots(
+ self, cluster_identifier=None, snapshot_identifier=None, snapshot_type=None
+ ):
+ snapshot_types = (
+ ["automated", "manual"] if snapshot_type is None else [snapshot_type]
+ )
+ if cluster_identifier:
+ cluster_snapshots = []
+ for snapshot in self.snapshots.values():
+ if snapshot.cluster.cluster_identifier == cluster_identifier:
+ if snapshot.snapshot_type in snapshot_types:
+ cluster_snapshots.append(snapshot)
+ if cluster_snapshots:
+ return cluster_snapshots
+
+ if snapshot_identifier:
+ if snapshot_identifier in self.snapshots:
+ if self.snapshots[snapshot_identifier].snapshot_type in snapshot_types:
+ return [self.snapshots[snapshot_identifier]]
+ raise ClusterSnapshotNotFoundError(snapshot_identifier)
+
+ return self.snapshots.values()
+
+ def delete_cluster_snapshot(self, snapshot_identifier):
+ if snapshot_identifier not in self.snapshots:
+ raise ClusterSnapshotNotFoundError(snapshot_identifier)
+
+ snapshot = self.describe_cluster_snapshots(
+ snapshot_identifier=snapshot_identifier
+ )[0]
+ if snapshot.snapshot_type == "automated":
+ raise InvalidClusterSnapshotStateFaultError(snapshot_identifier)
+ deleted_snapshot = self.snapshots.pop(snapshot_identifier)
+ deleted_snapshot.status = "deleted"
+ return deleted_snapshot
+
+ def restore_from_cluster_snapshot(self, **kwargs):
+ snapshot_identifier = kwargs.pop("snapshot_identifier")
+ snapshot = self.describe_cluster_snapshots(
+ snapshot_identifier=snapshot_identifier
+ )[0]
+ create_kwargs = {
+ "node_type": snapshot.cluster.node_type,
+ "master_username": snapshot.cluster.master_username,
+ "master_user_password": snapshot.cluster.master_user_password,
+ "db_name": snapshot.cluster.db_name,
+ "cluster_type": "multi-node"
+ if snapshot.cluster.number_of_nodes > 1
+ else "single-node",
+ "availability_zone": snapshot.cluster.availability_zone,
+ "port": snapshot.cluster.port,
+ "cluster_version": snapshot.cluster.cluster_version,
+ "number_of_nodes": snapshot.cluster.number_of_nodes,
+ "encrypted": snapshot.cluster.encrypted,
+ "tags": snapshot.cluster.tags,
+ "restored_from_snapshot": True,
+ "enhanced_vpc_routing": snapshot.cluster.enhanced_vpc_routing,
+ }
+ create_kwargs.update(kwargs)
+ return self.create_cluster(**create_kwargs)
+
+ def create_snapshot_copy_grant(self, **kwargs):
+ snapshot_copy_grant_name = kwargs["snapshot_copy_grant_name"]
+ kms_key_id = kwargs["kms_key_id"]
+ if snapshot_copy_grant_name not in self.snapshot_copy_grants:
+ snapshot_copy_grant = SnapshotCopyGrant(
+ snapshot_copy_grant_name, kms_key_id
+ )
+ self.snapshot_copy_grants[snapshot_copy_grant_name] = snapshot_copy_grant
+ return snapshot_copy_grant
+ raise SnapshotCopyGrantAlreadyExistsFaultError(snapshot_copy_grant_name)
+
+ def delete_snapshot_copy_grant(self, **kwargs):
+ snapshot_copy_grant_name = kwargs["snapshot_copy_grant_name"]
+ if snapshot_copy_grant_name in self.snapshot_copy_grants:
+ return self.snapshot_copy_grants.pop(snapshot_copy_grant_name)
+ raise SnapshotCopyGrantNotFoundFaultError(snapshot_copy_grant_name)
+
+ def describe_snapshot_copy_grants(self, **kwargs):
+ copy_grants = self.snapshot_copy_grants.values()
+ snapshot_copy_grant_name = kwargs["snapshot_copy_grant_name"]
+ if snapshot_copy_grant_name:
+ if snapshot_copy_grant_name in self.snapshot_copy_grants:
+ return [self.snapshot_copy_grants[snapshot_copy_grant_name]]
+ else:
+ raise SnapshotCopyGrantNotFoundFaultError(snapshot_copy_grant_name)
+ return copy_grants
+
+ def _get_resource_from_arn(self, arn):
+ try:
+ arn_breakdown = arn.split(":")
+ resource_type = arn_breakdown[5]
+ if resource_type == "snapshot":
+ resource_id = arn_breakdown[6].split("/")[1]
+ else:
+ resource_id = arn_breakdown[6]
+ except IndexError:
+ resource_type = resource_id = arn
+ resources = self.RESOURCE_TYPE_MAP.get(resource_type)
+ if resources is None:
+ message = (
+ "Tagging is not supported for this type of resource: '{0}' "
+ "(the ARN is potentially malformed, please check the ARN "
+ "documentation for more information)".format(resource_type)
+ )
+ raise ResourceNotFoundFaultError(message=message)
+ try:
+ resource = resources[resource_id]
+ except KeyError:
+ raise ResourceNotFoundFaultError(resource_type, resource_id)
+ else:
+ return resource
+
+ @staticmethod
+ def _describe_tags_for_resources(resources):
+ tagged_resources = []
+ for resource in resources:
+ for tag in resource.tags:
+ data = {
+ "ResourceName": resource.arn,
+ "ResourceType": resource.resource_type,
+ "Tag": {"Key": tag["Key"], "Value": tag["Value"]},
+ }
+ tagged_resources.append(data)
+ return tagged_resources
+
+ def _describe_tags_for_resource_type(self, resource_type):
+ resources = self.RESOURCE_TYPE_MAP.get(resource_type)
+ if not resources:
+ raise ResourceNotFoundFaultError(resource_type=resource_type)
+ return self._describe_tags_for_resources(resources.values())
+
+ def _describe_tags_for_resource_name(self, resource_name):
+ resource = self._get_resource_from_arn(resource_name)
+ return self._describe_tags_for_resources([resource])
+
+ def create_tags(self, resource_name, tags):
+ resource = self._get_resource_from_arn(resource_name)
+ resource.create_tags(tags)
+
+ def describe_tags(self, resource_name, resource_type):
+ if resource_name and resource_type:
+ raise InvalidParameterValueError(
+ "You cannot filter a list of resources using an Amazon "
+ "Resource Name (ARN) and a resource type together in the "
+ "same request. Retry the request using either an ARN or "
+ "a resource type, but not both."
+ )
+ if resource_type:
+ return self._describe_tags_for_resource_type(resource_type.lower())
+ if resource_name:
+ return self._describe_tags_for_resource_name(resource_name)
+ # If name and type are not specified, return all tagged resources.
+ # TODO: Implement aws marker pagination
+ tagged_resources = []
+ for resource_type in self.RESOURCE_TYPE_MAP:
+ try:
+ tagged_resources += self._describe_tags_for_resource_type(resource_type)
+ except ResourceNotFoundFaultError:
+ pass
+ return tagged_resources
+
+ def delete_tags(self, resource_name, tag_keys):
+ resource = self._get_resource_from_arn(resource_name)
+ resource.delete_tags(tag_keys)
+
+ def get_cluster_credentials(
+ self, cluster_identifier, db_user, auto_create, duration_seconds
+ ):
+ if duration_seconds < 900 or duration_seconds > 3600:
+ raise InvalidParameterValueError(
+ "Token duration must be between 900 and 3600 seconds"
+ )
+ expiration = datetime.datetime.now() + datetime.timedelta(0, duration_seconds)
+ if cluster_identifier in self.clusters:
+ user_prefix = "IAM:" if auto_create is False else "IAMA:"
+ db_user = user_prefix + db_user
+ return {
+ "DbUser": db_user,
+ "DbPassword": random_string(32),
+ "Expiration": expiration,
+ }
+ else:
+ raise ClusterNotFoundError(cluster_identifier)
+
+
+redshift_backends = BackendDict(RedshiftBackend, "redshift")
diff --git a/contrib/python/moto/py3/moto/redshift/responses.py b/contrib/python/moto/py3/moto/redshift/responses.py
new file mode 100644
index 0000000000..f3422c034e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/responses.py
@@ -0,0 +1,778 @@
+import json
+
+import xmltodict
+
+from jinja2 import Template
+
+from moto.core.responses import BaseResponse
+from .models import redshift_backends
+
+
+def convert_json_error_to_xml(json_error):
+ error = json.loads(json_error)
+ code = error["Error"]["Code"]
+ message = error["Error"]["Message"]
+ template = Template(
+ """
+ <RedshiftClientError>
+ <Error>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ <Type>Sender</Type>
+ </Error>
+ <RequestId>6876f774-7273-11e4-85dc-39e55ca848d1</RequestId>
+ </RedshiftClientError>"""
+ )
+ return template.render(code=code, message=message)
+
+
+def itemize(data):
+ """
+ The xmltodict.unparse requires we modify the shape of the input dictionary slightly. Instead of a dict of the form:
+ {'key': ['value1', 'value2']}
+ We must provide:
+ {'key': {'item': ['value1', 'value2']}}
+ """
+ if isinstance(data, dict):
+ ret = {}
+ for key in data:
+ ret[key] = itemize(data[key])
+ return ret
+ elif isinstance(data, list):
+ return {"item": [itemize(value) for value in data]}
+ else:
+ return data
+
+
+class RedshiftResponse(BaseResponse):
+ @property
+ def redshift_backend(self):
+ return redshift_backends[self.region]
+
+ def get_response(self, response):
+ if self.request_json:
+ return json.dumps(response)
+ else:
+ xml = xmltodict.unparse(itemize(response), full_document=False)
+ if hasattr(xml, "decode"):
+ xml = xml.decode("utf-8")
+ return xml
+
+ def call_action(self):
+ status, headers, body = super().call_action()
+ if status >= 400 and not self.request_json:
+ body = convert_json_error_to_xml(body)
+ return status, headers, body
+
+ def unpack_complex_list_params(self, label, names):
+ unpacked_list = list()
+ count = 1
+ while self._get_param("{0}.{1}.{2}".format(label, count, names[0])):
+ param = dict()
+ for i in range(len(names)):
+ param[names[i]] = self._get_param(
+ "{0}.{1}.{2}".format(label, count, names[i])
+ )
+ unpacked_list.append(param)
+ count += 1
+ return unpacked_list
+
+ def unpack_list_params(self, label):
+ unpacked_list = list()
+ count = 1
+ while self._get_param("{0}.{1}".format(label, count)):
+ unpacked_list.append(self._get_param("{0}.{1}".format(label, count)))
+ count += 1
+ return unpacked_list
+
+ def _get_cluster_security_groups(self):
+ cluster_security_groups = self._get_multi_param("ClusterSecurityGroups.member")
+ if not cluster_security_groups:
+ cluster_security_groups = self._get_multi_param(
+ "ClusterSecurityGroups.ClusterSecurityGroupName"
+ )
+ return cluster_security_groups
+
+ def _get_vpc_security_group_ids(self):
+ vpc_security_group_ids = self._get_multi_param("VpcSecurityGroupIds.member")
+ if not vpc_security_group_ids:
+ vpc_security_group_ids = self._get_multi_param(
+ "VpcSecurityGroupIds.VpcSecurityGroupId"
+ )
+ return vpc_security_group_ids
+
+ def _get_iam_roles(self):
+ iam_roles = self._get_multi_param("IamRoles.member")
+ if not iam_roles:
+ iam_roles = self._get_multi_param("IamRoles.IamRoleArn")
+ return iam_roles
+
+ def _get_subnet_ids(self):
+ subnet_ids = self._get_multi_param("SubnetIds.member")
+ if not subnet_ids:
+ subnet_ids = self._get_multi_param("SubnetIds.SubnetIdentifier")
+ return subnet_ids
+
+ def create_cluster(self):
+ cluster_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "node_type": self._get_param("NodeType"),
+ "master_username": self._get_param("MasterUsername"),
+ "master_user_password": self._get_param("MasterUserPassword"),
+ "db_name": self._get_param("DBName"),
+ "cluster_type": self._get_param("ClusterType"),
+ "cluster_security_groups": self._get_cluster_security_groups(),
+ "vpc_security_group_ids": self._get_vpc_security_group_ids(),
+ "cluster_subnet_group_name": self._get_param("ClusterSubnetGroupName"),
+ "availability_zone": self._get_param("AvailabilityZone"),
+ "preferred_maintenance_window": self._get_param(
+ "PreferredMaintenanceWindow"
+ ),
+ "cluster_parameter_group_name": self._get_param(
+ "ClusterParameterGroupName"
+ ),
+ "automated_snapshot_retention_period": self._get_int_param(
+ "AutomatedSnapshotRetentionPeriod"
+ ),
+ "port": self._get_int_param("Port"),
+ "cluster_version": self._get_param("ClusterVersion"),
+ "allow_version_upgrade": self._get_bool_param("AllowVersionUpgrade"),
+ "number_of_nodes": self._get_int_param("NumberOfNodes"),
+ "publicly_accessible": self._get_param("PubliclyAccessible"),
+ "encrypted": self._get_param("Encrypted"),
+ "region_name": self.region,
+ "tags": self.unpack_complex_list_params("Tags.Tag", ("Key", "Value")),
+ "iam_roles_arn": self._get_iam_roles(),
+ "enhanced_vpc_routing": self._get_param("EnhancedVpcRouting"),
+ "kms_key_id": self._get_param("KmsKeyId"),
+ }
+ cluster = self.redshift_backend.create_cluster(**cluster_kwargs).to_json()
+ cluster["ClusterStatus"] = "creating"
+ return self.get_response(
+ {
+ "CreateClusterResponse": {
+ "CreateClusterResult": {"Cluster": cluster},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def pause_cluster(self):
+ cluster_id = self._get_param("ClusterIdentifier")
+ cluster = self.redshift_backend.pause_cluster(cluster_id).to_json()
+ return self.get_response(
+ {
+ "PauseClusterResponse": {
+ "PauseClusterResult": {"Cluster": cluster},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def resume_cluster(self):
+ cluster_id = self._get_param("ClusterIdentifier")
+ cluster = self.redshift_backend.resume_cluster(cluster_id).to_json()
+ return self.get_response(
+ {
+ "ResumeClusterResponse": {
+ "ResumeClusterResult": {"Cluster": cluster},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def restore_from_cluster_snapshot(self):
+ enhanced_vpc_routing = self._get_bool_param("EnhancedVpcRouting")
+ node_type = self._get_param("NodeType")
+ number_of_nodes = self._get_int_param("NumberOfNodes")
+ restore_kwargs = {
+ "snapshot_identifier": self._get_param("SnapshotIdentifier"),
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "port": self._get_int_param("Port"),
+ "availability_zone": self._get_param("AvailabilityZone"),
+ "allow_version_upgrade": self._get_bool_param("AllowVersionUpgrade"),
+ "cluster_subnet_group_name": self._get_param("ClusterSubnetGroupName"),
+ "publicly_accessible": self._get_param("PubliclyAccessible"),
+ "cluster_parameter_group_name": self._get_param(
+ "ClusterParameterGroupName"
+ ),
+ "cluster_security_groups": self._get_cluster_security_groups(),
+ "vpc_security_group_ids": self._get_vpc_security_group_ids(),
+ "preferred_maintenance_window": self._get_param(
+ "PreferredMaintenanceWindow"
+ ),
+ "automated_snapshot_retention_period": self._get_int_param(
+ "AutomatedSnapshotRetentionPeriod"
+ ),
+ "region_name": self.region,
+ "iam_roles_arn": self._get_iam_roles(),
+ }
+ if enhanced_vpc_routing is not None:
+ restore_kwargs["enhanced_vpc_routing"] = enhanced_vpc_routing
+ if node_type is not None:
+ restore_kwargs["node_type"] = node_type
+ if number_of_nodes is not None:
+ restore_kwargs["number_of_nodes"] = number_of_nodes
+ cluster = self.redshift_backend.restore_from_cluster_snapshot(
+ **restore_kwargs
+ ).to_json()
+ cluster["ClusterStatus"] = "creating"
+ return self.get_response(
+ {
+ "RestoreFromClusterSnapshotResponse": {
+ "RestoreFromClusterSnapshotResult": {"Cluster": cluster},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def describe_clusters(self):
+ cluster_identifier = self._get_param("ClusterIdentifier")
+ clusters = self.redshift_backend.describe_clusters(cluster_identifier)
+
+ return self.get_response(
+ {
+ "DescribeClustersResponse": {
+ "DescribeClustersResult": {
+ "Clusters": [cluster.to_json() for cluster in clusters]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def modify_cluster(self):
+ request_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "new_cluster_identifier": self._get_param("NewClusterIdentifier"),
+ "node_type": self._get_param("NodeType"),
+ "master_user_password": self._get_param("MasterUserPassword"),
+ "cluster_type": self._get_param("ClusterType"),
+ "cluster_security_groups": self._get_cluster_security_groups(),
+ "vpc_security_group_ids": self._get_vpc_security_group_ids(),
+ "cluster_subnet_group_name": self._get_param("ClusterSubnetGroupName"),
+ "preferred_maintenance_window": self._get_param(
+ "PreferredMaintenanceWindow"
+ ),
+ "cluster_parameter_group_name": self._get_param(
+ "ClusterParameterGroupName"
+ ),
+ "automated_snapshot_retention_period": self._get_int_param(
+ "AutomatedSnapshotRetentionPeriod"
+ ),
+ "cluster_version": self._get_param("ClusterVersion"),
+ "allow_version_upgrade": self._get_bool_param("AllowVersionUpgrade"),
+ "number_of_nodes": self._get_int_param("NumberOfNodes"),
+ "publicly_accessible": self._get_param("PubliclyAccessible"),
+ "encrypted": self._get_param("Encrypted"),
+ "iam_roles_arn": self._get_iam_roles(),
+ "enhanced_vpc_routing": self._get_param("EnhancedVpcRouting"),
+ }
+ cluster_kwargs = {}
+ # We only want parameters that were actually passed in, otherwise
+ # we'll stomp all over our cluster metadata with None values.
+ for (key, value) in request_kwargs.items():
+ if value is not None and value != []:
+ cluster_kwargs[key] = value
+
+ cluster = self.redshift_backend.modify_cluster(**cluster_kwargs)
+
+ return self.get_response(
+ {
+ "ModifyClusterResponse": {
+ "ModifyClusterResult": {"Cluster": cluster.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_cluster(self):
+ request_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "final_cluster_snapshot_identifier": self._get_param(
+ "FinalClusterSnapshotIdentifier"
+ ),
+ "skip_final_snapshot": self._get_bool_param("SkipFinalClusterSnapshot"),
+ }
+
+ cluster = self.redshift_backend.delete_cluster(**request_kwargs)
+
+ return self.get_response(
+ {
+ "DeleteClusterResponse": {
+ "DeleteClusterResult": {"Cluster": cluster.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def create_cluster_subnet_group(self):
+ cluster_subnet_group_name = self._get_param("ClusterSubnetGroupName")
+ description = self._get_param("Description")
+ subnet_ids = self._get_subnet_ids()
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+
+ subnet_group = self.redshift_backend.create_cluster_subnet_group(
+ cluster_subnet_group_name=cluster_subnet_group_name,
+ description=description,
+ subnet_ids=subnet_ids,
+ region_name=self.region,
+ tags=tags,
+ )
+
+ return self.get_response(
+ {
+ "CreateClusterSubnetGroupResponse": {
+ "CreateClusterSubnetGroupResult": {
+ "ClusterSubnetGroup": subnet_group.to_json()
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def describe_cluster_subnet_groups(self):
+ subnet_identifier = self._get_param("ClusterSubnetGroupName")
+ subnet_groups = self.redshift_backend.describe_cluster_subnet_groups(
+ subnet_identifier
+ )
+
+ return self.get_response(
+ {
+ "DescribeClusterSubnetGroupsResponse": {
+ "DescribeClusterSubnetGroupsResult": {
+ "ClusterSubnetGroups": [
+ subnet_group.to_json() for subnet_group in subnet_groups
+ ]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_cluster_subnet_group(self):
+ subnet_identifier = self._get_param("ClusterSubnetGroupName")
+ self.redshift_backend.delete_cluster_subnet_group(subnet_identifier)
+
+ return self.get_response(
+ {
+ "DeleteClusterSubnetGroupResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def create_cluster_security_group(self):
+ cluster_security_group_name = self._get_param("ClusterSecurityGroupName")
+ description = self._get_param("Description")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+
+ security_group = self.redshift_backend.create_cluster_security_group(
+ cluster_security_group_name=cluster_security_group_name,
+ description=description,
+ region_name=self.region,
+ tags=tags,
+ )
+
+ return self.get_response(
+ {
+ "CreateClusterSecurityGroupResponse": {
+ "CreateClusterSecurityGroupResult": {
+ "ClusterSecurityGroup": security_group.to_json()
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def describe_cluster_security_groups(self):
+ cluster_security_group_name = self._get_param("ClusterSecurityGroupName")
+ security_groups = self.redshift_backend.describe_cluster_security_groups(
+ cluster_security_group_name
+ )
+
+ return self.get_response(
+ {
+ "DescribeClusterSecurityGroupsResponse": {
+ "DescribeClusterSecurityGroupsResult": {
+ "ClusterSecurityGroups": [
+ security_group.to_json()
+ for security_group in security_groups
+ ]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_cluster_security_group(self):
+ security_group_identifier = self._get_param("ClusterSecurityGroupName")
+ self.redshift_backend.delete_cluster_security_group(security_group_identifier)
+
+ return self.get_response(
+ {
+ "DeleteClusterSecurityGroupResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def authorize_cluster_security_group_ingress(self):
+ cluster_security_group_name = self._get_param("ClusterSecurityGroupName")
+ cidr_ip = self._get_param("CIDRIP")
+
+ security_group = self.redshift_backend.authorize_cluster_security_group_ingress(
+ cluster_security_group_name, cidr_ip
+ )
+
+ return self.get_response(
+ {
+ "AuthorizeClusterSecurityGroupIngressResponse": {
+ "AuthorizeClusterSecurityGroupIngressResult": {
+ "ClusterSecurityGroup": {
+ "ClusterSecurityGroupName": cluster_security_group_name,
+ "Description": security_group.description,
+ "IPRanges": [
+ {
+ "Status": "authorized",
+ "CIDRIP": cidr_ip,
+ "Tags": security_group.tags,
+ },
+ ],
+ }
+ }
+ }
+ }
+ )
+
+ def create_cluster_parameter_group(self):
+ cluster_parameter_group_name = self._get_param("ParameterGroupName")
+ group_family = self._get_param("ParameterGroupFamily")
+ description = self._get_param("Description")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+
+ parameter_group = self.redshift_backend.create_cluster_parameter_group(
+ cluster_parameter_group_name, group_family, description, self.region, tags
+ )
+
+ return self.get_response(
+ {
+ "CreateClusterParameterGroupResponse": {
+ "CreateClusterParameterGroupResult": {
+ "ClusterParameterGroup": parameter_group.to_json()
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def describe_cluster_parameter_groups(self):
+ cluster_parameter_group_name = self._get_param("ParameterGroupName")
+ parameter_groups = self.redshift_backend.describe_cluster_parameter_groups(
+ cluster_parameter_group_name
+ )
+
+ return self.get_response(
+ {
+ "DescribeClusterParameterGroupsResponse": {
+ "DescribeClusterParameterGroupsResult": {
+ "ParameterGroups": [
+ parameter_group.to_json()
+ for parameter_group in parameter_groups
+ ]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_cluster_parameter_group(self):
+ cluster_parameter_group_name = self._get_param("ParameterGroupName")
+ self.redshift_backend.delete_cluster_parameter_group(
+ cluster_parameter_group_name
+ )
+
+ return self.get_response(
+ {
+ "DeleteClusterParameterGroupResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def create_cluster_snapshot(self):
+ cluster_identifier = self._get_param("ClusterIdentifier")
+ snapshot_identifier = self._get_param("SnapshotIdentifier")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+
+ snapshot = self.redshift_backend.create_cluster_snapshot(
+ cluster_identifier, snapshot_identifier, self.region, tags
+ )
+ return self.get_response(
+ {
+ "CreateClusterSnapshotResponse": {
+ "CreateClusterSnapshotResult": {"Snapshot": snapshot.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def describe_cluster_snapshots(self):
+ cluster_identifier = self._get_param("ClusterIdentifier")
+ snapshot_identifier = self._get_param("SnapshotIdentifier")
+ snapshot_type = self._get_param("SnapshotType")
+ snapshots = self.redshift_backend.describe_cluster_snapshots(
+ cluster_identifier, snapshot_identifier, snapshot_type
+ )
+ return self.get_response(
+ {
+ "DescribeClusterSnapshotsResponse": {
+ "DescribeClusterSnapshotsResult": {
+ "Snapshots": [snapshot.to_json() for snapshot in snapshots]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_cluster_snapshot(self):
+ snapshot_identifier = self._get_param("SnapshotIdentifier")
+ snapshot = self.redshift_backend.delete_cluster_snapshot(snapshot_identifier)
+
+ return self.get_response(
+ {
+ "DeleteClusterSnapshotResponse": {
+ "DeleteClusterSnapshotResult": {"Snapshot": snapshot.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def create_snapshot_copy_grant(self):
+ copy_grant_kwargs = {
+ "snapshot_copy_grant_name": self._get_param("SnapshotCopyGrantName"),
+ "kms_key_id": self._get_param("KmsKeyId"),
+ "region_name": self._get_param("Region"),
+ }
+
+ copy_grant = self.redshift_backend.create_snapshot_copy_grant(
+ **copy_grant_kwargs
+ )
+ return self.get_response(
+ {
+ "CreateSnapshotCopyGrantResponse": {
+ "CreateSnapshotCopyGrantResult": {
+ "SnapshotCopyGrant": copy_grant.to_json()
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_snapshot_copy_grant(self):
+ copy_grant_kwargs = {
+ "snapshot_copy_grant_name": self._get_param("SnapshotCopyGrantName")
+ }
+ self.redshift_backend.delete_snapshot_copy_grant(**copy_grant_kwargs)
+ return self.get_response(
+ {
+ "DeleteSnapshotCopyGrantResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def describe_snapshot_copy_grants(self):
+ copy_grant_kwargs = {
+ "snapshot_copy_grant_name": self._get_param("SnapshotCopyGrantName")
+ }
+
+ copy_grants = self.redshift_backend.describe_snapshot_copy_grants(
+ **copy_grant_kwargs
+ )
+ return self.get_response(
+ {
+ "DescribeSnapshotCopyGrantsResponse": {
+ "DescribeSnapshotCopyGrantsResult": {
+ "SnapshotCopyGrants": [
+ copy_grant.to_json() for copy_grant in copy_grants
+ ]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def create_tags(self):
+ resource_name = self._get_param("ResourceName")
+ tags = self.unpack_complex_list_params("Tags.Tag", ("Key", "Value"))
+
+ self.redshift_backend.create_tags(resource_name, tags)
+
+ return self.get_response(
+ {
+ "CreateTagsResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def describe_tags(self):
+ resource_name = self._get_param("ResourceName")
+ resource_type = self._get_param("ResourceType")
+
+ tagged_resources = self.redshift_backend.describe_tags(
+ resource_name, resource_type
+ )
+ return self.get_response(
+ {
+ "DescribeTagsResponse": {
+ "DescribeTagsResult": {"TaggedResources": tagged_resources},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def delete_tags(self):
+ resource_name = self._get_param("ResourceName")
+ tag_keys = self.unpack_list_params("TagKeys.TagKey")
+
+ self.redshift_backend.delete_tags(resource_name, tag_keys)
+
+ return self.get_response(
+ {
+ "DeleteTagsResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ def enable_snapshot_copy(self):
+ snapshot_copy_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "destination_region": self._get_param("DestinationRegion"),
+ "retention_period": self._get_param("RetentionPeriod", 7),
+ "snapshot_copy_grant_name": self._get_param("SnapshotCopyGrantName"),
+ }
+ cluster = self.redshift_backend.enable_snapshot_copy(**snapshot_copy_kwargs)
+
+ return self.get_response(
+ {
+ "EnableSnapshotCopyResponse": {
+ "EnableSnapshotCopyResult": {"Cluster": cluster.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def disable_snapshot_copy(self):
+ snapshot_copy_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier")
+ }
+ cluster = self.redshift_backend.disable_snapshot_copy(**snapshot_copy_kwargs)
+
+ return self.get_response(
+ {
+ "DisableSnapshotCopyResponse": {
+ "DisableSnapshotCopyResult": {"Cluster": cluster.to_json()},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def modify_snapshot_copy_retention_period(self):
+ snapshot_copy_kwargs = {
+ "cluster_identifier": self._get_param("ClusterIdentifier"),
+ "retention_period": self._get_param("RetentionPeriod"),
+ }
+ cluster = self.redshift_backend.modify_snapshot_copy_retention_period(
+ **snapshot_copy_kwargs
+ )
+
+ return self.get_response(
+ {
+ "ModifySnapshotCopyRetentionPeriodResponse": {
+ "ModifySnapshotCopyRetentionPeriodResult": {
+ "Clusters": [cluster.to_json()]
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ def get_cluster_credentials(self):
+ cluster_identifier = self._get_param("ClusterIdentifier")
+ db_user = self._get_param("DbUser")
+ auto_create = self._get_bool_param("AutoCreate", False)
+ duration_seconds = self._get_int_param("DurationSeconds", 900)
+
+ cluster_credentials = self.redshift_backend.get_cluster_credentials(
+ cluster_identifier, db_user, auto_create, duration_seconds
+ )
+
+ return self.get_response(
+ {
+ "GetClusterCredentialsResponse": {
+ "GetClusterCredentialsResult": cluster_credentials,
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
diff --git a/contrib/python/moto/py3/moto/redshift/urls.py b/contrib/python/moto/py3/moto/redshift/urls.py
new file mode 100644
index 0000000000..fba2541fdd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/urls.py
@@ -0,0 +1,5 @@
+from .responses import RedshiftResponse
+
+url_bases = [r"https?://redshift\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": RedshiftResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/redshift/utils.py b/contrib/python/moto/py3/moto/redshift/utils.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshift/utils.py
diff --git a/contrib/python/moto/py3/moto/redshiftdata/__init__.py b/contrib/python/moto/py3/moto/redshiftdata/__init__.py
new file mode 100644
index 0000000000..57a6535210
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshiftdata/__init__.py
@@ -0,0 +1,4 @@
+from .models import redshiftdata_backends
+from ..core.models import base_decorator
+
+mock_redshiftdata = base_decorator(redshiftdata_backends)
diff --git a/contrib/python/moto/py3/moto/redshiftdata/exceptions.py b/contrib/python/moto/py3/moto/redshiftdata/exceptions.py
new file mode 100644
index 0000000000..e3b7212230
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshiftdata/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFoundException(JsonRESTError):
+ def __init__(self):
+ super().__init__("ResourceNotFoundException", "Query does not exist.")
+
+
+class ValidationException(JsonRESTError):
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/redshiftdata/models.py b/contrib/python/moto/py3/moto/redshiftdata/models.py
new file mode 100644
index 0000000000..30a9ea1703
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshiftdata/models.py
@@ -0,0 +1,208 @@
+import re
+import uuid
+from datetime import datetime
+import random
+
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict, iso_8601_datetime_without_milliseconds
+from moto.redshiftdata.exceptions import ValidationException, ResourceNotFoundException
+
+
+class Statement:
+ def __init__(
+ self,
+ cluster_identifier,
+ database,
+ db_user,
+ query_parameters,
+ query_string,
+ secret_arn,
+ ):
+ now = iso_8601_datetime_without_milliseconds(datetime.now())
+
+ self.id = str(uuid.uuid4())
+ self.cluster_identifier = cluster_identifier
+ self.created_at = now
+ self.database = database
+ self.db_user = db_user
+ self.duration = 0
+ self.has_result_set = False
+ self.query_parameters = query_parameters
+ self.query_string = query_string
+ self.redshift_pid = random.randint(0, 99999)
+ self.redshift_query_id = random.randint(0, 99999)
+ self.result_rows = -1
+ self.result_size = -1
+ self.secret_arn = secret_arn
+ self.status = "STARTED"
+ self.sub_statements = []
+ self.updated_at = now
+
+ def __iter__(self):
+ yield "Id", self.id
+ yield "ClusterIdentifier", self.cluster_identifier
+ yield "CreatedAt", self.created_at
+ yield "Database", self.database
+ yield "DbUser", self.db_user
+ yield "Duration", self.duration
+ yield "HasResultSet", self.has_result_set
+ yield "QueryParameters", self.query_parameters
+ yield "QueryString", self.query_string
+ yield "RedshiftPid", self.redshift_pid
+ yield "RedshiftQueryId", self.redshift_query_id
+ yield "ResultRows", self.result_rows
+ yield "ResultSize", self.result_size
+ yield "SecretArn", self.secret_arn
+ yield "Status", self.status
+ yield "SubStatements", self.sub_statements
+ yield "UpdatedAt", self.updated_at
+
+
+class StatementResult:
+ def __init__(self, column_metadata, records, total_number_rows, next_token=None):
+ self.column_metadata = column_metadata
+ self.records = records
+ self.total_number_rows = total_number_rows
+ self.next_token = next_token
+
+ def __iter__(self):
+ yield "ColumnMetadata", self.column_metadata
+ yield "Records", self.records
+ yield "TotalNumberRows", self.total_number_rows
+ yield "NextToken", self.next_token
+
+
+class ColumnMetadata:
+ def __init__(self, column_default, is_case_sensitive, is_signed, name, nullable):
+ self.column_default = column_default
+ self.is_case_sensitive = is_case_sensitive
+ self.is_signed = is_signed
+ self.name = name
+ self.nullable = nullable
+
+ def __iter__(self):
+ yield "columnDefault", self.column_default
+ yield "isCaseSensitive", self.is_case_sensitive
+ yield "isSigned", self.is_signed
+ yield "name", self.name
+ yield "nullable", self.nullable
+
+
+class Record:
+ def __init__(self, **kwargs):
+ self.kwargs = kwargs
+
+ def __iter__(self):
+ if "long_value" in self.kwargs:
+ yield "longValue", self.kwargs["long_value"]
+ elif "string_value" in self.kwargs:
+ yield "stringValue", self.kwargs["string_value"]
+
+
+class RedshiftDataAPIServiceBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.statements = {}
+
+ def cancel_statement(self, statement_id):
+ _validate_uuid(statement_id)
+
+ try:
+ # Statement exists
+ statement = self.statements[statement_id]
+
+ if statement.status != "STARTED":
+ raise ValidationException(
+ "Could not cancel a query that is already in %s state with ID: %s"
+ % (statement.status, statement_id)
+ )
+
+ statement.status = "ABORTED"
+ self.statements[statement_id] = statement
+ except KeyError:
+ # Statement does not exist.
+ raise ResourceNotFoundException()
+
+ return True
+
+ def describe_statement(self, statement_id):
+ _validate_uuid(statement_id)
+
+ try:
+ # Statement exists
+ return self.statements[statement_id]
+ except KeyError:
+ # Statement does not exist.
+ raise ResourceNotFoundException()
+
+ def execute_statement(
+ self, cluster_identifier, database, db_user, parameters, secret_arn, sql
+ ):
+ """
+ Runs an SQL statement
+ Validation of parameters is very limited because there is no redshift integration
+ """
+ statement = Statement(
+ cluster_identifier=cluster_identifier,
+ database=database,
+ db_user=db_user,
+ query_parameters=parameters,
+ query_string=sql,
+ secret_arn=secret_arn,
+ )
+ self.statements[statement.id] = statement
+ return statement
+
+ def get_statement_result(self, statement_id):
+ """
+ Return static statement result
+ StatementResult is the result of the SQL query "sql" passed as parameter when calling "execute_statement"
+ As such, it cannot be mocked
+ """
+ _validate_uuid(statement_id)
+
+ if statement_id not in self.statements:
+ raise ResourceNotFoundException()
+
+ return StatementResult(
+ [
+ dict(ColumnMetadata(None, False, True, "Number", False)),
+ dict(ColumnMetadata(None, True, False, "Street", False)),
+ dict(ColumnMetadata(None, True, False, "City", False)),
+ ],
+ [
+ [
+ dict(Record(long_value=10)),
+ dict(Record(string_value="Alpha st")),
+ dict(Record(string_value="Vancouver")),
+ ],
+ [
+ dict(Record(long_value=50)),
+ dict(Record(string_value="Beta st")),
+ dict(Record(string_value="Toronto")),
+ ],
+ [
+ dict(Record(long_value=100)),
+ dict(Record(string_value="Gamma av")),
+ dict(Record(string_value="Seattle")),
+ ],
+ ],
+ 3,
+ )
+
+
+def _validate_uuid(uuid):
+ match = re.search(r"^[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}(:\d+)?$", uuid)
+ if not match:
+ raise ValidationException(
+ "id must satisfy regex pattern: ^[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}(:\\d+)?$"
+ )
+
+
+# For unknown reasons I cannot use the service name "redshift-data" as I should
+# It seems boto3 is unable to get the list of available regions for "redshift-data"
+# See code here https://github.com/spulec/moto/blob/master/moto/core/utils.py#L407
+# sess.get_available_regions("redshift-data") returns an empty list
+# Then I use the service redshift since they share the same regions
+# See https://docs.aws.amazon.com/general/latest/gr/redshift-service.html
+redshiftdata_backends = BackendDict(RedshiftDataAPIServiceBackend, "redshift")
diff --git a/contrib/python/moto/py3/moto/redshiftdata/responses.py b/contrib/python/moto/py3/moto/redshiftdata/responses.py
new file mode 100644
index 0000000000..d73e7c2054
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshiftdata/responses.py
@@ -0,0 +1,60 @@
+import json
+from moto.core.responses import BaseResponse
+from .models import redshiftdata_backends
+
+
+class RedshiftDataAPIServiceResponse(BaseResponse):
+ @property
+ def redshiftdata_backend(self):
+ return redshiftdata_backends[self.region]
+
+ def cancel_statement(self):
+ statement_id = self._get_param("Id")
+ status = self.redshiftdata_backend.cancel_statement(statement_id=statement_id)
+ return 200, {}, json.dumps({"Status": status})
+
+ def describe_statement(self):
+ statement_id = self._get_param("Id")
+ statement = self.redshiftdata_backend.describe_statement(
+ statement_id=statement_id
+ )
+ return 200, {}, json.dumps(dict(statement))
+
+ def execute_statement(self):
+ cluster_identifier = self._get_param("ClusterIdentifier")
+ database = self._get_param("Database")
+ db_user = self._get_param("DbUser")
+ parameters = self._get_param("Parameters")
+ secret_arn = self._get_param("SecretArn")
+ sql = self._get_param("Sql")
+ statement = self.redshiftdata_backend.execute_statement(
+ cluster_identifier=cluster_identifier,
+ database=database,
+ db_user=db_user,
+ parameters=parameters,
+ secret_arn=secret_arn,
+ sql=sql,
+ )
+
+ return (
+ 200,
+ {},
+ json.dumps(
+ {
+ "ClusterIdentifier": statement.cluster_identifier,
+ "CreatedAt": statement.created_at,
+ "Database": statement.database,
+ "DbUser": statement.db_user,
+ "Id": statement.id,
+ "SecretArn": statement.secret_arn,
+ }
+ ),
+ )
+
+ def get_statement_result(self):
+ statement_id = self._get_param("Id")
+ statement_result = self.redshiftdata_backend.get_statement_result(
+ statement_id=statement_id
+ )
+
+ return 200, {}, json.dumps(dict(statement_result))
diff --git a/contrib/python/moto/py3/moto/redshiftdata/urls.py b/contrib/python/moto/py3/moto/redshiftdata/urls.py
new file mode 100644
index 0000000000..f1b8a3de48
--- /dev/null
+++ b/contrib/python/moto/py3/moto/redshiftdata/urls.py
@@ -0,0 +1,10 @@
+from .responses import RedshiftDataAPIServiceResponse
+
+url_bases = [
+ r"https?://redshift-data\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": RedshiftDataAPIServiceResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/rekognition/__init__.py b/contrib/python/moto/py3/moto/rekognition/__init__.py
new file mode 100644
index 0000000000..cfa43786b5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rekognition/__init__.py
@@ -0,0 +1,5 @@
+"""rekognition module initialization; sets value for base decorator."""
+from .models import rekognition_backends
+from ..core.models import base_decorator
+
+mock_rekognition = base_decorator(rekognition_backends)
diff --git a/contrib/python/moto/py3/moto/rekognition/exceptions.py b/contrib/python/moto/py3/moto/rekognition/exceptions.py
new file mode 100644
index 0000000000..898e9321be
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rekognition/exceptions.py
@@ -0,0 +1 @@
+"""Exceptions raised by the rekognition service."""
diff --git a/contrib/python/moto/py3/moto/rekognition/models.py b/contrib/python/moto/py3/moto/rekognition/models.py
new file mode 100644
index 0000000000..59e8fe5d55
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rekognition/models.py
@@ -0,0 +1,339 @@
+"""RekognitionBackend class with methods for supported APIs."""
+
+import random
+import string
+
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+
+
+class RekognitionBackend(BaseBackend):
+ """Implementation of Rekognition APIs."""
+
+ def start_face_search(self):
+ return self._job_id()
+
+ def start_text_detection(self):
+ return self._job_id()
+
+ def get_face_search(self):
+ """
+ This returns hardcoded values and none of the parameters are taken into account.
+ """
+ return (
+ self._job_status(),
+ self._status_message(),
+ self._video_metadata(),
+ self._persons(),
+ self._next_token(),
+ self._text_model_version(),
+ )
+
+ def get_text_detection(self):
+ """
+ This returns hardcoded values and none of the parameters are taken into account.
+ """
+ return (
+ self._job_status(),
+ self._status_message(),
+ self._video_metadata(),
+ self._text_detections(),
+ self._next_token(),
+ self._text_model_version(),
+ )
+
+ # private
+
+ def _job_id(self):
+ return "".join(
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(64)
+ )
+
+ def _job_status(self):
+ return "SUCCEEDED"
+
+ def _next_token(self):
+ return ""
+
+ def _status_message(self):
+ return ""
+
+ def _text_model_version(self):
+ return "3.1"
+
+ def _video_metadata(self):
+ return {
+ "Codec": "h264",
+ "DurationMillis": 15020,
+ "Format": "QuickTime / MOV",
+ "FrameRate": 24.0,
+ "FrameHeight": 720,
+ "FrameWidth": 1280,
+ "ColorRange": "LIMITED",
+ }
+
+ def _persons(self):
+ return [
+ {
+ "Timestamp": 0,
+ "Person": {
+ "Index": 0,
+ "Face": {
+ "BoundingBox": {
+ "Width": 0.42217350006103516,
+ "Height": 0.9352386593818665,
+ "Left": 0.31870967149734497,
+ "Top": -0.0049947104416787624,
+ },
+ "Landmarks": [
+ {
+ "Type": "eyeLeft",
+ "X": 0.4800040125846863,
+ "Y": 0.23425640165805817,
+ },
+ {
+ "Type": "eyeRight",
+ "X": 0.63795405626297,
+ "Y": 0.19219470024108887,
+ },
+ {
+ "Type": "mouthLeft",
+ "X": 0.5283276438713074,
+ "Y": 0.6190487146377563,
+ },
+ {
+ "Type": "mouthRight",
+ "X": 0.660395085811615,
+ "Y": 0.5830448269844055,
+ },
+ {
+ "Type": "nose",
+ "X": 0.619724690914154,
+ "Y": 0.3800361752510071,
+ },
+ ],
+ "Pose": {
+ "Roll": -5.063229084014893,
+ "Yaw": 18.038856506347656,
+ "Pitch": 12.567241668701172,
+ },
+ "Quality": {
+ "Brightness": 83.42264556884766,
+ "Sharpness": 67.22731018066406,
+ },
+ "Confidence": 99.99860382080078,
+ },
+ },
+ "FaceMatches": [
+ {
+ "Similarity": 99.99994659423828,
+ "Face": {
+ "FaceId": "f2489050-020e-4c14-8693-63339847a59d",
+ "BoundingBox": {
+ "Width": 0.7136539816856384,
+ "Height": 0.9471719861030579,
+ "Left": 0.19036999344825745,
+ "Top": -0.012074699625372887,
+ },
+ "ImageId": "f3b180d3-f5ad-39c1-b825-ba30b170a90d",
+ "ExternalImageId": "Dave_Bloggs",
+ "Confidence": 99.99970245361328,
+ },
+ },
+ {
+ "Similarity": 99.9986572265625,
+ "Face": {
+ "FaceId": "f0d22a6a-3436-4d23-ae5b-c5cb2e795581",
+ "BoundingBox": {
+ "Width": 0.7198730111122131,
+ "Height": 1.003640055656433,
+ "Left": 0.1844159960746765,
+ "Top": -0.00142729002982378,
+ },
+ "ImageId": "738d14f3-26be-3066-b1a9-7f4f6bb3ffc6",
+ "ExternalImageId": "Dave_Bloggs",
+ "Confidence": 99.99939727783203,
+ },
+ },
+ {
+ "Similarity": 99.99791717529297,
+ "Face": {
+ "FaceId": "c48162bd-a16a-4e04-ad3c-967761895295",
+ "BoundingBox": {
+ "Width": 0.7364680171012878,
+ "Height": 1.0104399919509888,
+ "Left": 0.1361449956893921,
+ "Top": -0.009593159891664982,
+ },
+ "ImageId": "eae3565c-741b-342c-8e73-379a09ae5346",
+ "ExternalImageId": "Dave_Bloggs",
+ "Confidence": 99.99949645996094,
+ },
+ },
+ {
+ "Similarity": 99.37212371826172,
+ "Face": {
+ "FaceId": "651314bb-28d4-405d-9b13-c32e9ff28299",
+ "BoundingBox": {
+ "Width": 0.3711090087890625,
+ "Height": 0.3609749972820282,
+ "Left": 0.2571589946746826,
+ "Top": 0.21493400633335114,
+ },
+ "ImageId": "068700f5-0b2e-39c0-874b-2c58fa10d833",
+ "ExternalImageId": "Dave_Bloggs",
+ "Confidence": 99.99300384521484,
+ },
+ },
+ ],
+ }
+ ]
+
+ def _text_detections(self):
+ return [
+ {
+ "Timestamp": 0,
+ "TextDetection": {
+ "DetectedText": "Hello world",
+ "Type": "LINE",
+ "Id": 0,
+ "Confidence": 97.89398956298828,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.1364741027355194,
+ "Height": 0.0318513885140419,
+ "Left": 0.4310702085494995,
+ "Top": 0.876121461391449,
+ },
+ "Polygon": [
+ {"X": 0.4310702085494995, "Y": 0.8769540190696716},
+ {"X": 0.5673548579216003, "Y": 0.876121461391449},
+ {"X": 0.5675443410873413, "Y": 0.90714031457901},
+ {"X": 0.4312596917152405, "Y": 0.9079728722572327},
+ ],
+ },
+ },
+ },
+ {
+ "Timestamp": 0,
+ "TextDetection": {
+ "DetectedText": "Hello",
+ "Type": "WORD",
+ "Id": 1,
+ "ParentId": 0,
+ "Confidence": 99.1568832397461,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.0648193359375,
+ "Height": 0.0234375,
+ "Left": 0.43121337890625,
+ "Top": 0.876953125,
+ },
+ "Polygon": [
+ {"X": 0.43121337890625, "Y": 0.876953125},
+ {"X": 0.49603271484375, "Y": 0.876953125},
+ {"X": 0.49603271484375, "Y": 0.900390625},
+ {"X": 0.43121337890625, "Y": 0.900390625},
+ ],
+ },
+ },
+ },
+ {
+ "Timestamp": 0,
+ "TextDetection": {
+ "DetectedText": "world",
+ "Type": "WORD",
+ "Id": 2,
+ "ParentId": 0,
+ "Confidence": 96.63108825683594,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.07103776931762695,
+ "Height": 0.02804870530962944,
+ "Left": 0.4965003430843353,
+ "Top": 0.8795245885848999,
+ },
+ "Polygon": [
+ {"X": 0.4965003430843353, "Y": 0.8809727430343628},
+ {"X": 0.5673661231994629, "Y": 0.8795245885848999},
+ {"X": 0.5675381422042847, "Y": 0.9061251282691956},
+ {"X": 0.4966723322868347, "Y": 0.9075732827186584},
+ ],
+ },
+ },
+ },
+ {
+ "Timestamp": 1000,
+ "TextDetection": {
+ "DetectedText": "Goodbye world",
+ "Type": "LINE",
+ "Id": 0,
+ "Confidence": 98.9729995727539,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.13677978515625,
+ "Height": 0.0302734375,
+ "Left": 0.43121337890625,
+ "Top": 0.876953125,
+ },
+ "Polygon": [
+ {"X": 0.43121337890625, "Y": 0.876953125},
+ {"X": 0.5679931640625, "Y": 0.876953125},
+ {"X": 0.5679931640625, "Y": 0.9072265625},
+ {"X": 0.43121337890625, "Y": 0.9072265625},
+ ],
+ },
+ },
+ },
+ {
+ "Timestamp": 1000,
+ "TextDetection": {
+ "DetectedText": "Goodbye",
+ "Type": "WORD",
+ "Id": 1,
+ "ParentId": 0,
+ "Confidence": 99.7258529663086,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.0648193359375,
+ "Height": 0.0234375,
+ "Left": 0.43121337890625,
+ "Top": 0.876953125,
+ },
+ "Polygon": [
+ {"X": 0.43121337890625, "Y": 0.876953125},
+ {"X": 0.49603271484375, "Y": 0.876953125},
+ {"X": 0.49603271484375, "Y": 0.900390625},
+ {"X": 0.43121337890625, "Y": 0.900390625},
+ ],
+ },
+ },
+ },
+ {
+ "Timestamp": 1000,
+ "TextDetection": {
+ "DetectedText": "world",
+ "Type": "WORD",
+ "Id": 2,
+ "ParentId": 0,
+ "Confidence": 98.22015380859375,
+ "Geometry": {
+ "BoundingBox": {
+ "Width": 0.0703125,
+ "Height": 0.0263671875,
+ "Left": 0.4976806640625,
+ "Top": 0.880859375,
+ },
+ "Polygon": [
+ {"X": 0.4976806640625, "Y": 0.880859375},
+ {"X": 0.5679931640625, "Y": 0.880859375},
+ {"X": 0.5679931640625, "Y": 0.9072265625},
+ {"X": 0.4976806640625, "Y": 0.9072265625},
+ ],
+ },
+ },
+ },
+ ]
+
+
+rekognition_backends = BackendDict(RekognitionBackend, "rekognition")
diff --git a/contrib/python/moto/py3/moto/rekognition/responses.py b/contrib/python/moto/py3/moto/rekognition/responses.py
new file mode 100644
index 0000000000..fcb767a5ed
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rekognition/responses.py
@@ -0,0 +1,73 @@
+"""Handles incoming rekognition requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import rekognition_backends
+
+
+class RekognitionResponse(BaseResponse):
+ """Handler for Rekognition requests and responses."""
+
+ @property
+ def rekognition_backend(self):
+ """Return backend instance specific for this region."""
+ return rekognition_backends[self.region]
+
+ def get_face_search(self):
+ (
+ job_status,
+ status_message,
+ video_metadata,
+ persons,
+ next_token,
+ text_model_version,
+ ) = self.rekognition_backend.get_face_search()
+
+ return json.dumps(
+ dict(
+ JobStatus=job_status,
+ StatusMessage=status_message,
+ VideoMetadata=video_metadata,
+ Persons=persons,
+ NextToken=next_token,
+ TextModelVersion=text_model_version,
+ )
+ )
+
+ def get_text_detection(self):
+ (
+ job_status,
+ status_message,
+ video_metadata,
+ text_detections,
+ next_token,
+ text_model_version,
+ ) = self.rekognition_backend.get_text_detection()
+
+ return json.dumps(
+ dict(
+ JobStatus=job_status,
+ StatusMessage=status_message,
+ VideoMetadata=video_metadata,
+ TextDetections=text_detections,
+ NextToken=next_token,
+ TextModelVersion=text_model_version,
+ )
+ )
+
+ def start_face_search(self):
+ headers = {"Content-Type": "application/x-amz-json-1.1"}
+ job_id = self.rekognition_backend.start_face_search()
+ response = ('{"JobId":"' + job_id + '"}').encode()
+
+ return 200, headers, response
+
+ def start_text_detection(self):
+ headers = {"Content-Type": "application/x-amz-json-1.1"}
+ job_id = self.rekognition_backend.start_text_detection()
+ response = ('{"JobId":"' + job_id + '"}').encode()
+
+ return 200, headers, response
+
+
+# add templates from here
diff --git a/contrib/python/moto/py3/moto/rekognition/urls.py b/contrib/python/moto/py3/moto/rekognition/urls.py
new file mode 100644
index 0000000000..ce23694721
--- /dev/null
+++ b/contrib/python/moto/py3/moto/rekognition/urls.py
@@ -0,0 +1,10 @@
+"""rekognition base URL and path."""
+from .responses import RekognitionResponse
+
+url_bases = [
+ r"https?://rekognition\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {
+ "{0}/$": RekognitionResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/resourcegroups/__init__.py b/contrib/python/moto/py3/moto/resourcegroups/__init__.py
new file mode 100644
index 0000000000..35153ade5e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroups/__init__.py
@@ -0,0 +1,5 @@
+from .models import resourcegroups_backends
+from ..core.models import base_decorator
+
+resourcegroups_backend = resourcegroups_backends["us-east-1"]
+mock_resourcegroups = base_decorator(resourcegroups_backends)
diff --git a/contrib/python/moto/py3/moto/resourcegroups/exceptions.py b/contrib/python/moto/py3/moto/resourcegroups/exceptions.py
new file mode 100644
index 0000000000..25ea832259
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroups/exceptions.py
@@ -0,0 +1,13 @@
+import json
+
+from werkzeug.exceptions import HTTPException
+
+
+class BadRequestException(HTTPException):
+ code = 400
+
+ def __init__(self, message, **kwargs):
+ super().__init__(
+ description=json.dumps({"Message": message, "Code": "BadRequestException"}),
+ **kwargs
+ )
diff --git a/contrib/python/moto/py3/moto/resourcegroups/models.py b/contrib/python/moto/py3/moto/resourcegroups/models.py
new file mode 100644
index 0000000000..72fb2d16ba
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroups/models.py
@@ -0,0 +1,369 @@
+from builtins import str
+
+import json
+import re
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from .exceptions import BadRequestException
+
+
+class FakeResourceGroup(BaseModel):
+ def __init__(
+ self, name, resource_query, description=None, tags=None, configuration=None
+ ):
+ self.errors = []
+ description = description or ""
+ tags = tags or {}
+ if self._validate_description(value=description):
+ self._description = description
+ if self._validate_name(value=name):
+ self._name = name
+ if self._validate_resource_query(value=resource_query):
+ self._resource_query = resource_query
+ if self._validate_tags(value=tags):
+ self._tags = tags
+ self._raise_errors()
+ self.arn = "arn:aws:resource-groups:us-west-1:{AccountId}:{name}".format(
+ name=name, AccountId=get_account_id()
+ )
+ self.configuration = configuration
+
+ @staticmethod
+ def _format_error(key, value, constraint):
+ return "Value '{value}' at '{key}' failed to satisfy constraint: {constraint}".format(
+ constraint=constraint, key=key, value=value
+ )
+
+ def _raise_errors(self):
+ if self.errors:
+ errors_len = len(self.errors)
+ plural = "s" if len(self.errors) > 1 else ""
+ errors = "; ".join(self.errors)
+ raise BadRequestException(
+ "{errors_len} validation error{plural} detected: {errors}".format(
+ errors_len=errors_len, plural=plural, errors=errors
+ )
+ )
+
+ def _validate_description(self, value):
+ errors = []
+ if len(value) > 511:
+ errors.append(
+ self._format_error(
+ key="description",
+ value=value,
+ constraint="Member must have length less than or equal to 512",
+ )
+ )
+ if not re.match(r"^[\sa-zA-Z0-9_.-]*$", value):
+ errors.append(
+ self._format_error(
+ key="name",
+ value=value,
+ constraint=r"Member must satisfy regular expression pattern: [\sa-zA-Z0-9_\.-]*",
+ )
+ )
+ if errors:
+ self.errors += errors
+ return False
+ return True
+
+ def _validate_name(self, value):
+ errors = []
+ if len(value) > 128:
+ errors.append(
+ self._format_error(
+ key="name",
+ value=value,
+ constraint="Member must have length less than or equal to 128",
+ )
+ )
+ # Note \ is a character to match not an escape.
+ if not re.match(r"^[a-zA-Z0-9_\\.-]+$", value):
+ errors.append(
+ self._format_error(
+ key="name",
+ value=value,
+ constraint=r"Member must satisfy regular expression pattern: [a-zA-Z0-9_\.-]+",
+ )
+ )
+ if errors:
+ self.errors += errors
+ return False
+ return True
+
+ def _validate_resource_query(self, value):
+ if not value:
+ return True
+ errors = []
+ if value["Type"] not in {"CLOUDFORMATION_STACK_1_0", "TAG_FILTERS_1_0"}:
+ errors.append(
+ self._format_error(
+ key="resourceQuery.type",
+ value=value,
+ constraint="Member must satisfy enum value set: [CLOUDFORMATION_STACK_1_0, TAG_FILTERS_1_0]",
+ )
+ )
+ if len(value["Query"]) > 2048:
+ errors.append(
+ self._format_error(
+ key="resourceQuery.query",
+ value=value,
+ constraint="Member must have length less than or equal to 2048",
+ )
+ )
+ if errors:
+ self.errors += errors
+ return False
+ return True
+
+ def _validate_tags(self, value):
+ errors = []
+ # AWS only outputs one error for all keys and one for all values.
+ error_keys = None
+ error_values = None
+ regex = re.compile(r"^([\\p{L}\\p{Z}\\p{N}_.:/=+\-@]*)$")
+ for tag_key, tag_value in value.items():
+ # Validation for len(tag_key) >= 1 is done by botocore.
+ if len(tag_key) > 128 or re.match(regex, tag_key):
+ error_keys = self._format_error(
+ key="tags",
+ value=value,
+ constraint=(
+ "Map value must satisfy constraint: ["
+ "Member must have length less than or equal to 128, "
+ "Member must have length greater than or equal to 1, "
+ r"Member must satisfy regular expression pattern: ^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$"
+ "]"
+ ),
+ )
+ # Validation for len(tag_value) >= 0 is nonsensical.
+ if len(tag_value) > 256 or re.match(regex, tag_key):
+ error_values = self._format_error(
+ key="tags",
+ value=value,
+ constraint=(
+ "Map value must satisfy constraint: ["
+ "Member must have length less than or equal to 256, "
+ "Member must have length greater than or equal to 0, "
+ r"Member must satisfy regular expression pattern: ^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$"
+ "]"
+ ),
+ )
+ if error_keys:
+ errors.append(error_keys)
+ if error_values:
+ errors.append(error_values)
+ if errors:
+ self.errors += errors
+ return False
+ return True
+
+ @property
+ def description(self):
+ return self._description
+
+ @description.setter
+ def description(self, value):
+ if not self._validate_description(value=value):
+ self._raise_errors()
+ self._description = value
+
+ @property
+ def name(self):
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ if not self._validate_name(value=value):
+ self._raise_errors()
+ self._name = value
+
+ @property
+ def resource_query(self):
+ return self._resource_query
+
+ @resource_query.setter
+ def resource_query(self, value):
+ if not self._validate_resource_query(value=value):
+ self._raise_errors()
+ self._resource_query = value
+
+ @property
+ def tags(self):
+ return self._tags
+
+ @tags.setter
+ def tags(self, value):
+ if not self._validate_tags(value=value):
+ self._raise_errors()
+ self._tags = value
+
+
+class ResourceGroups:
+ def __init__(self):
+ self.by_name = {}
+ self.by_arn = {}
+
+ def __contains__(self, item):
+ return item in self.by_name
+
+ def append(self, resource_group):
+ self.by_name[resource_group.name] = resource_group
+ self.by_arn[resource_group.arn] = resource_group
+
+ def delete(self, name):
+ group = self.by_name[name]
+ del self.by_name[name]
+ del self.by_arn[group.arn]
+ return group
+
+
+class ResourceGroupsBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.groups = ResourceGroups()
+
+ @staticmethod
+ def _validate_resource_query(resource_query):
+ if not resource_query:
+ return
+ query_type = resource_query["Type"]
+ query = json.loads(resource_query["Query"])
+ query_keys = set(query.keys())
+ invalid_json_exception = BadRequestException(
+ "Invalid query: Invalid query format: check JSON syntax"
+ )
+ if not isinstance(query["ResourceTypeFilters"], list):
+ raise invalid_json_exception
+ if query_type == "CLOUDFORMATION_STACK_1_0":
+ if query_keys != {"ResourceTypeFilters", "StackIdentifier"}:
+ raise invalid_json_exception
+ stack_identifier = query["StackIdentifier"]
+ if not isinstance(stack_identifier, str):
+ raise invalid_json_exception
+ if not re.match(
+ r"^arn:aws:cloudformation:[a-z]{2}-[a-z]+-[0-9]+:[0-9]+:stack/[-0-9A-z]+/[-0-9a-f]+$",
+ stack_identifier,
+ ):
+ raise BadRequestException(
+ "Invalid query: Verify that the specified ARN is formatted correctly."
+ )
+ # Once checking other resources is implemented.
+ # if stack_identifier not in self.cloudformation_backend.stacks:
+ # raise BadRequestException("Invalid query: The specified CloudFormation stack doesn't exist.")
+ if query_type == "TAG_FILTERS_1_0":
+ if query_keys != {"ResourceTypeFilters", "TagFilters"}:
+ raise invalid_json_exception
+ tag_filters = query["TagFilters"]
+ if not isinstance(tag_filters, list):
+ raise invalid_json_exception
+ if not tag_filters or len(tag_filters) > 50:
+ raise BadRequestException(
+ "Invalid query: The TagFilters list must contain between 1 and 50 elements"
+ )
+ for tag_filter in tag_filters:
+ if not isinstance(tag_filter, dict):
+ raise invalid_json_exception
+ if set(tag_filter.keys()) != {"Key", "Values"}:
+ raise invalid_json_exception
+ key = tag_filter["Key"]
+ if not isinstance(key, str):
+ raise invalid_json_exception
+ if not key:
+ raise BadRequestException(
+ "Invalid query: The TagFilter element cannot have empty or null Key field"
+ )
+ if len(key) > 128:
+ raise BadRequestException(
+ "Invalid query: The maximum length for a tag Key is 128"
+ )
+ values = tag_filter["Values"]
+ if not isinstance(values, list):
+ raise invalid_json_exception
+ if len(values) > 20:
+ raise BadRequestException(
+ "Invalid query: The TagFilter Values list must contain between 0 and 20 elements"
+ )
+ for value in values:
+ if not isinstance(value, str):
+ raise invalid_json_exception
+ if len(value) > 256:
+ raise BadRequestException(
+ "Invalid query: The maximum length for a tag Value is 256"
+ )
+
+ @staticmethod
+ def _validate_tags(tags):
+ for tag in tags:
+ if tag.lower().startswith("aws:"):
+ raise BadRequestException("Tag keys must not start with 'aws:'")
+
+ def create_group(
+ self, name, resource_query, description=None, tags=None, configuration=None
+ ):
+ tags = tags or {}
+ group = FakeResourceGroup(
+ name=name,
+ resource_query=resource_query,
+ description=description,
+ tags=tags,
+ configuration=configuration,
+ )
+ if name in self.groups:
+ raise BadRequestException("Cannot create group: group already exists")
+ if name.upper().startswith("AWS"):
+ raise BadRequestException("Group name must not start with 'AWS'")
+ self._validate_tags(tags)
+ self._validate_resource_query(resource_query)
+ self.groups.append(group)
+ return group
+
+ def delete_group(self, group_name):
+ return self.groups.delete(name=group_name)
+
+ def get_group(self, group_name):
+ return self.groups.by_name[group_name]
+
+ def get_tags(self, arn):
+ return self.groups.by_arn[arn].tags
+
+ def list_groups(self):
+ """
+ Pagination or the Filters-parameter is not yet implemented
+ """
+ return self.groups.by_name
+
+ def tag(self, arn, tags):
+ all_tags = self.groups.by_arn[arn].tags
+ all_tags.update(tags)
+ self._validate_tags(all_tags)
+ self.groups.by_arn[arn].tags = all_tags
+
+ def untag(self, arn, keys):
+ group = self.groups.by_arn[arn]
+ for key in keys:
+ del group.tags[key]
+
+ def update_group(self, group_name, description=None):
+ if description:
+ self.groups.by_name[group_name].description = description
+ return self.groups.by_name[group_name]
+
+ def update_group_query(self, group_name, resource_query):
+ self._validate_resource_query(resource_query)
+ self.groups.by_name[group_name].resource_query = resource_query
+ return self.groups.by_name[group_name]
+
+ def get_group_configuration(self, group_name):
+ group = self.groups.by_name.get(group_name)
+ configuration = group.configuration
+ return configuration
+
+ def put_group_configuration(self, group_name, configuration):
+ self.groups.by_name[group_name].configuration = configuration
+ return self.groups.by_name[group_name]
+
+
+resourcegroups_backends = BackendDict(ResourceGroupsBackend, "resource-groups")
diff --git a/contrib/python/moto/py3/moto/resourcegroups/responses.py b/contrib/python/moto/py3/moto/resourcegroups/responses.py
new file mode 100644
index 0000000000..19042e2fd3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroups/responses.py
@@ -0,0 +1,181 @@
+import json
+
+from urllib.parse import unquote
+
+from moto.core.responses import BaseResponse
+from .models import resourcegroups_backends
+
+
+class ResourceGroupsResponse(BaseResponse):
+ SERVICE_NAME = "resource-groups"
+
+ @property
+ def resourcegroups_backend(self):
+ return resourcegroups_backends[self.region]
+
+ def create_group(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ resource_query = self._get_param("ResourceQuery")
+ tags = self._get_param("Tags")
+ configuration = self._get_param("Configuration")
+ group = self.resourcegroups_backend.create_group(
+ name=name,
+ description=description,
+ resource_query=resource_query,
+ tags=tags,
+ configuration=configuration,
+ )
+ return json.dumps(
+ {
+ "Group": {
+ "GroupArn": group.arn,
+ "Name": group.name,
+ "Description": group.description,
+ },
+ "ResourceQuery": group.resource_query,
+ "Tags": group.tags,
+ "GroupConfiguration": {"Configuration": group.configuration},
+ }
+ )
+
+ def delete_group(self):
+ group_name = self._get_param("GroupName") or self._get_param("Group")
+ group = self.resourcegroups_backend.delete_group(group_name=group_name)
+ return json.dumps(
+ {
+ "Group": {
+ "GroupArn": group.arn,
+ "Name": group.name,
+ "Description": group.description,
+ }
+ }
+ )
+
+ def get_group(self):
+ group_name = self._get_param("GroupName")
+ group = self.resourcegroups_backend.get_group(group_name=group_name)
+ return json.dumps(
+ {
+ "Group": {
+ "GroupArn": group.arn,
+ "Name": group.name,
+ "Description": group.description,
+ }
+ }
+ )
+
+ def get_group_query(self):
+ group_name = self._get_param("GroupName")
+ group_arn = self._get_param("Group")
+ if group_arn and not group_name:
+ group_name = group_arn.split(":")[-1]
+ group = self.resourcegroups_backend.get_group(group_name=group_name)
+ return json.dumps(
+ {
+ "GroupQuery": {
+ "GroupName": group.name,
+ "ResourceQuery": group.resource_query,
+ }
+ }
+ )
+
+ def get_tags(self):
+ arn = unquote(self._get_param("Arn"))
+ return json.dumps(
+ {"Arn": arn, "Tags": self.resourcegroups_backend.get_tags(arn=arn)}
+ )
+
+ def list_group_resources(self):
+ raise NotImplementedError(
+ "ResourceGroups.list_group_resources is not yet implemented"
+ )
+
+ def list_groups(self):
+ groups = self.resourcegroups_backend.list_groups()
+ return json.dumps(
+ {
+ "GroupIdentifiers": [
+ {"GroupName": group.name, "GroupArn": group.arn}
+ for group in groups.values()
+ ],
+ "Groups": [
+ {
+ "GroupArn": group.arn,
+ "Name": group.name,
+ "Description": group.description,
+ }
+ for group in groups.values()
+ ],
+ "NextToken": None,
+ }
+ )
+
+ def search_resources(self):
+ raise NotImplementedError(
+ "ResourceGroups.search_resources is not yet implemented"
+ )
+
+ def tag(self):
+ arn = unquote(self._get_param("Arn"))
+ tags = self._get_param("Tags")
+ if arn not in self.resourcegroups_backend.groups.by_arn:
+ raise NotImplementedError(
+ "ResourceGroups.tag with non-resource-group Arn parameter is not yet implemented"
+ )
+ self.resourcegroups_backend.tag(arn=arn, tags=tags)
+ return json.dumps({"Arn": arn, "Tags": tags})
+
+ def untag(self):
+ arn = unquote(self._get_param("Arn"))
+ keys = self._get_param("Keys")
+ if arn not in self.resourcegroups_backend.groups.by_arn:
+ raise NotImplementedError(
+ "ResourceGroups.untag with non-resource-group Arn parameter is not yet implemented"
+ )
+ self.resourcegroups_backend.untag(arn=arn, keys=keys)
+ return json.dumps({"Arn": arn, "Keys": keys})
+
+ def update_group(self):
+ group_name = self._get_param("GroupName")
+ description = self._get_param("Description", "")
+ group = self.resourcegroups_backend.update_group(
+ group_name=group_name, description=description
+ )
+ return json.dumps(
+ {
+ "Group": {
+ "GroupArn": group.arn,
+ "Name": group.name,
+ "Description": group.description,
+ }
+ }
+ )
+
+ def update_group_query(self):
+ group_name = self._get_param("GroupName")
+ resource_query = self._get_param("ResourceQuery")
+ group_arn = self._get_param("Group")
+ if group_arn and not group_name:
+ group_name = group_arn.split(":")[-1]
+ group = self.resourcegroups_backend.update_group_query(
+ group_name=group_name, resource_query=resource_query
+ )
+ return json.dumps(
+ {"GroupQuery": {"GroupName": group.name, "ResourceQuery": resource_query}}
+ )
+
+ def get_group_configuration(self):
+ group_name = self._get_param("Group")
+ configuration = self.resourcegroups_backend.get_group_configuration(
+ group_name=group_name
+ )
+ return json.dumps({"GroupConfiguration": {"Configuration": configuration}})
+
+ def put_group_configuration(self):
+ group_name = self._get_param("Group")
+ configuration = self._get_param("Configuration")
+ self.resourcegroups_backend.put_group_configuration(
+ group_name=group_name, configuration=configuration
+ )
+ return json.dumps({"GroupConfiguration": {"Configuration": configuration}})
diff --git a/contrib/python/moto/py3/moto/resourcegroups/urls.py b/contrib/python/moto/py3/moto/resourcegroups/urls.py
new file mode 100644
index 0000000000..b2b33641b5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroups/urls.py
@@ -0,0 +1,18 @@
+from .responses import ResourceGroupsResponse
+
+url_bases = [r"https?://resource-groups(-fips)?\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/delete-group$": ResourceGroupsResponse.dispatch,
+ "{0}/get-group$": ResourceGroupsResponse.dispatch,
+ "{0}/get-group-configuration$": ResourceGroupsResponse.dispatch,
+ "{0}/put-group-configuration$": ResourceGroupsResponse.dispatch,
+ "{0}/get-group-query$": ResourceGroupsResponse.dispatch,
+ "{0}/groups$": ResourceGroupsResponse.dispatch,
+ "{0}/groups/(?P<resource_group_name>[^/]+)$": ResourceGroupsResponse.dispatch,
+ "{0}/groups/(?P<resource_group_name>[^/]+)/query$": ResourceGroupsResponse.dispatch,
+ "{0}/groups-list$": ResourceGroupsResponse.dispatch,
+ "{0}/resources/(?P<resource_arn>[^/]+)/tags$": ResourceGroupsResponse.dispatch,
+ "{0}/update-group$": ResourceGroupsResponse.dispatch,
+ "{0}/update-group-query$": ResourceGroupsResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/resourcegroupstaggingapi/__init__.py b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/__init__.py
new file mode 100644
index 0000000000..d28d6f6dbf
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/__init__.py
@@ -0,0 +1,5 @@
+from .models import resourcegroupstaggingapi_backends
+from ..core.models import base_decorator
+
+resourcegroupstaggingapi_backend = resourcegroupstaggingapi_backends["us-east-1"]
+mock_resourcegroupstaggingapi = base_decorator(resourcegroupstaggingapi_backends)
diff --git a/contrib/python/moto/py3/moto/resourcegroupstaggingapi/models.py b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/models.py
new file mode 100644
index 0000000000..145bd9a1cd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/models.py
@@ -0,0 +1,733 @@
+import uuid
+
+from moto.core import get_account_id
+from moto.core import BaseBackend
+from moto.core.exceptions import RESTError
+from moto.core.utils import BackendDict
+
+from moto.s3 import s3_backends
+from moto.ec2 import ec2_backends
+from moto.elb import elb_backends
+from moto.elbv2 import elbv2_backends
+from moto.kinesis import kinesis_backends
+from moto.kms import kms_backends
+from moto.rds import rds_backends
+from moto.glacier import glacier_backends
+from moto.redshift import redshift_backends
+from moto.emr import emr_backends
+from moto.awslambda import lambda_backends
+
+# Left: EC2 ElastiCache RDS ELB CloudFront WorkSpaces Lambda EMR Glacier Kinesis Redshift Route53
+# StorageGateway DynamoDB MachineLearning ACM DirectConnect DirectoryService CloudHSM
+# Inspector Elasticsearch
+
+
+class ResourceGroupsTaggingAPIBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+
+ self._pages = {}
+ # Like 'someuuid': {'gen': <generator>, 'misc': None}
+ # Misc is there for peeking from a generator and it cant
+ # fit in the current request. As we only store generators
+ # theres not really any point to clean up
+
+ @property
+ def s3_backend(self):
+ """
+ :rtype: moto.s3.models.S3Backend
+ """
+ return s3_backends["global"]
+
+ @property
+ def ec2_backend(self):
+ """
+ :rtype: moto.ec2.models.EC2Backend
+ """
+ return ec2_backends[self.region_name]
+
+ @property
+ def elb_backend(self):
+ """
+ :rtype: moto.elb.models.ELBBackend
+ """
+ return elb_backends[self.region_name]
+
+ @property
+ def elbv2_backend(self):
+ """
+ :rtype: moto.elbv2.models.ELBv2Backend
+ """
+ return elbv2_backends[self.region_name]
+
+ @property
+ def kinesis_backend(self):
+ """
+ :rtype: moto.kinesis.models.KinesisBackend
+ """
+ return kinesis_backends[self.region_name]
+
+ @property
+ def kms_backend(self):
+ """
+ :rtype: moto.kms.models.KmsBackend
+ """
+ return kms_backends[self.region_name]
+
+ @property
+ def rds_backend(self):
+ """
+ :rtype: moto.rds.models.RDSBackend
+ """
+ return rds_backends[self.region_name]
+
+ @property
+ def glacier_backend(self):
+ """
+ :rtype: moto.glacier.models.GlacierBackend
+ """
+ return glacier_backends[self.region_name]
+
+ @property
+ def emr_backend(self):
+ """
+ :rtype: moto.emr.models.ElasticMapReduceBackend
+ """
+ return emr_backends[self.region_name]
+
+ @property
+ def redshift_backend(self):
+ """
+ :rtype: moto.redshift.models.RedshiftBackend
+ """
+ return redshift_backends[self.region_name]
+
+ @property
+ def lambda_backend(self):
+ """
+ :rtype: moto.awslambda.models.LambdaBackend
+ """
+ return lambda_backends[self.region_name]
+
+ def _get_resources_generator(self, tag_filters=None, resource_type_filters=None):
+ # Look at
+ # https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
+
+ # TODO move these to their respective backends
+ filters = []
+ for tag_filter_dict in tag_filters:
+ values = tag_filter_dict.get("Values", [])
+ if len(values) == 0:
+ # Check key matches
+ filters.append(lambda t, v, key=tag_filter_dict["Key"]: t == key)
+ elif len(values) == 1:
+ # Check its exactly the same as key, value
+ filters.append(
+ lambda t, v, key=tag_filter_dict["Key"], value=values[0]: t == key
+ and v == value
+ )
+ else:
+ # Check key matches and value is one of the provided values
+ filters.append(
+ lambda t, v, key=tag_filter_dict["Key"], vl=values: t == key
+ and v in vl
+ )
+
+ def tag_filter(tag_list):
+ result = []
+ if tag_filters:
+ for f in filters:
+ temp_result = []
+ for tag in tag_list:
+ f_result = f(tag["Key"], tag["Value"])
+ temp_result.append(f_result)
+ result.append(any(temp_result))
+ return all(result)
+ else:
+ return True
+
+ # Do S3, resource type s3
+ if not resource_type_filters or "s3" in resource_type_filters:
+ for bucket in self.s3_backend.buckets.values():
+ tags = self.s3_backend.tagger.list_tags_for_resource(bucket.arn)["Tags"]
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {"ResourceARN": "arn:aws:s3:::" + bucket.name, "Tags": tags}
+
+ # EC2 tags
+ def get_ec2_tags(res_id):
+ result = []
+ for key, value in self.ec2_backend.tags.get(res_id, {}).items():
+ result.append({"Key": key, "Value": value})
+ return result
+
+ # EC2 AMI, resource type ec2:image
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:image" in resource_type_filters
+ ):
+ for ami in self.ec2_backend.amis.values():
+ tags = get_ec2_tags(ami.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::image/{1}".format(
+ self.region_name, ami.id
+ ),
+ "Tags": tags,
+ }
+
+ # EC2 Instance, resource type ec2:instance
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:instance" in resource_type_filters
+ ):
+ for reservation in self.ec2_backend.reservations.values():
+ for instance in reservation.instances:
+ tags = get_ec2_tags(instance.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::instance/{1}".format(
+ self.region_name, instance.id
+ ),
+ "Tags": tags,
+ }
+
+ # EC2 NetworkInterface, resource type ec2:network-interface
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:network-interface" in resource_type_filters
+ ):
+ for eni in self.ec2_backend.enis.values():
+ tags = get_ec2_tags(eni.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::network-interface/{1}".format(
+ self.region_name, eni.id
+ ),
+ "Tags": tags,
+ }
+
+ # TODO EC2 ReservedInstance
+
+ # EC2 SecurityGroup, resource type ec2:security-group
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:security-group" in resource_type_filters
+ ):
+ for vpc in self.ec2_backend.groups.values():
+ for sg in vpc.values():
+ tags = get_ec2_tags(sg.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::security-group/{1}".format(
+ self.region_name, sg.id
+ ),
+ "Tags": tags,
+ }
+
+ # EC2 Snapshot, resource type ec2:snapshot
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:snapshot" in resource_type_filters
+ ):
+ for snapshot in self.ec2_backend.snapshots.values():
+ tags = get_ec2_tags(snapshot.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::snapshot/{1}".format(
+ self.region_name, snapshot.id
+ ),
+ "Tags": tags,
+ }
+
+ # TODO EC2 SpotInstanceRequest
+
+ # EC2 Volume, resource type ec2:volume
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:volume" in resource_type_filters
+ ):
+ for volume in self.ec2_backend.volumes.values():
+ tags = get_ec2_tags(volume.id)
+
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}::volume/{1}".format(
+ self.region_name, volume.id
+ ),
+ "Tags": tags,
+ }
+
+ # TODO add these to the keys and values functions / combine functions
+ # ELB, resource type elasticloadbalancing:loadbalancer
+ if (
+ not resource_type_filters
+ or "elasticloadbalancing" in resource_type_filters
+ or "elasticloadbalancing:loadbalancer" in resource_type_filters
+ ):
+ for elb in self.elbv2_backend.load_balancers.values():
+ tags = self.elbv2_backend.tagging_service.list_tags_for_resource(
+ elb.arn
+ )["Tags"]
+ if not tag_filter(tags): # Skip if no tags, or invalid filter
+ continue
+
+ yield {"ResourceARN": "{0}".format(elb.arn), "Tags": tags}
+
+ # ELB Target Group, resource type elasticloadbalancing:targetgroup
+ if (
+ not resource_type_filters
+ or "elasticloadbalancing" in resource_type_filters
+ or "elasticloadbalancing:targetgroup" in resource_type_filters
+ ):
+ for target_group in self.elbv2_backend.target_groups.values():
+ tags = self.elbv2_backend.tagging_service.list_tags_for_resource(
+ target_group.arn
+ )["Tags"]
+ if not tag_filter(tags): # Skip if no tags, or invalid filter
+ continue
+
+ yield {"ResourceARN": "{0}".format(target_group.arn), "Tags": tags}
+
+ # EMR Cluster
+
+ # Glacier Vault
+
+ # Kinesis
+
+ # KMS
+ def get_kms_tags(kms_key_id):
+ result = []
+ for tag in self.kms_backend.list_resource_tags(kms_key_id).get("Tags", []):
+ result.append({"Key": tag["TagKey"], "Value": tag["TagValue"]})
+ return result
+
+ if not resource_type_filters or "kms" in resource_type_filters:
+ for kms_key in self.kms_backend.list_keys():
+ tags = get_kms_tags(kms_key.id)
+ if not tag_filter(tags): # Skip if no tags, or invalid filter
+ continue
+
+ yield {"ResourceARN": "{0}".format(kms_key.arn), "Tags": tags}
+
+ # RDS Instance
+ if (
+ not resource_type_filters
+ or "rds" in resource_type_filters
+ or "rds:db" in resource_type_filters
+ ):
+ for database in self.rds_backend.databases.values():
+ tags = database.get_tags()
+ if not tags or not tag_filter(tags):
+ continue
+ yield {
+ "ResourceARN": database.db_instance_arn,
+ "Tags": tags,
+ }
+
+ # RDS Reserved Database Instance
+ # RDS Option Group
+ # RDS Parameter Group
+ # RDS Security Group
+
+ # RDS Snapshot
+ if (
+ not resource_type_filters
+ or "rds" in resource_type_filters
+ or "rds:snapshot" in resource_type_filters
+ ):
+ for snapshot in self.rds_backend.database_snapshots.values():
+ tags = snapshot.get_tags()
+ if not tags or not tag_filter(tags):
+ continue
+ yield {
+ "ResourceARN": snapshot.snapshot_arn,
+ "Tags": tags,
+ }
+
+ # RDS Cluster Snapshot
+ if (
+ not resource_type_filters
+ or "rds" in resource_type_filters
+ or "rds:cluster-snapshot" in resource_type_filters
+ ):
+ for snapshot in self.rds_backend.cluster_snapshots.values():
+ tags = snapshot.get_tags()
+ if not tags or not tag_filter(tags):
+ continue
+ yield {
+ "ResourceARN": snapshot.snapshot_arn,
+ "Tags": tags,
+ }
+
+ # RDS Subnet Group
+ # RDS Event Subscription
+
+ # RedShift Cluster
+ # RedShift Hardware security module (HSM) client certificate
+ # RedShift HSM connection
+ # RedShift Parameter group
+ # RedShift Snapshot
+ # RedShift Subnet group
+
+ # VPC
+ if (
+ not resource_type_filters
+ or "ec2" in resource_type_filters
+ or "ec2:vpc" in resource_type_filters
+ ):
+ for vpc in self.ec2_backend.vpcs.values():
+ tags = get_ec2_tags(vpc.id)
+ if not tags or not tag_filter(
+ tags
+ ): # Skip if no tags, or invalid filter
+ continue
+ yield {
+ "ResourceARN": "arn:aws:ec2:{0}:{1}:vpc/{2}".format(
+ self.region_name, get_account_id(), vpc.id
+ ),
+ "Tags": tags,
+ }
+ # VPC Customer Gateway
+ # VPC DHCP Option Set
+ # VPC Internet Gateway
+ # VPC Network ACL
+ # VPC Route Table
+ # VPC Subnet
+ # VPC Virtual Private Gateway
+ # VPC VPN Connection
+
+ # Lambda Instance
+ def transform_lambda_tags(dictTags):
+ result = []
+ for key, value in dictTags.items():
+ result.append({"Key": key, "Value": value})
+ return result
+
+ if not resource_type_filters or "lambda" in resource_type_filters:
+ for f in self.lambda_backend.list_functions():
+ tags = transform_lambda_tags(f.tags)
+ if not tags or not tag_filter(tags):
+ continue
+ yield {
+ "ResourceARN": f.function_arn,
+ "Tags": tags,
+ }
+
+ def _get_tag_keys_generator(self):
+ # Look at
+ # https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
+
+ # Do S3, resource type s3
+ for bucket in self.s3_backend.buckets.values():
+ tags = self.s3_backend.tagger.get_tag_dict_for_resource(bucket.arn)
+ for key, _ in tags.items():
+ yield key
+
+ # EC2 tags
+ def get_ec2_keys(res_id):
+ result = []
+ for key in self.ec2_backend.tags.get(res_id, {}):
+ result.append(key)
+ return result
+
+ # EC2 AMI, resource type ec2:image
+ for ami in self.ec2_backend.amis.values():
+ for key in get_ec2_keys(ami.id):
+ yield key
+
+ # EC2 Instance, resource type ec2:instance
+ for reservation in self.ec2_backend.reservations.values():
+ for instance in reservation.instances:
+ for key in get_ec2_keys(instance.id):
+ yield key
+
+ # EC2 NetworkInterface, resource type ec2:network-interface
+ for eni in self.ec2_backend.enis.values():
+ for key in get_ec2_keys(eni.id):
+ yield key
+
+ # TODO EC2 ReservedInstance
+
+ # EC2 SecurityGroup, resource type ec2:security-group
+ for vpc in self.ec2_backend.groups.values():
+ for sg in vpc.values():
+ for key in get_ec2_keys(sg.id):
+ yield key
+
+ # EC2 Snapshot, resource type ec2:snapshot
+ for snapshot in self.ec2_backend.snapshots.values():
+ for key in get_ec2_keys(snapshot.id):
+ yield key
+
+ # TODO EC2 SpotInstanceRequest
+
+ # EC2 Volume, resource type ec2:volume
+ for volume in self.ec2_backend.volumes.values():
+ for key in get_ec2_keys(volume.id):
+ yield key
+
+ def _get_tag_values_generator(self, tag_key):
+ # Look at
+ # https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
+
+ # Do S3, resource type s3
+ for bucket in self.s3_backend.buckets.values():
+ tags = self.s3_backend.tagger.get_tag_dict_for_resource(bucket.arn)
+ for key, value in tags.items():
+ if key == tag_key:
+ yield value
+
+ # EC2 tags
+ def get_ec2_values(res_id):
+ result = []
+ for key, value in self.ec2_backend.tags.get(res_id, {}).items():
+ if key == tag_key:
+ result.append(value)
+ return result
+
+ # EC2 AMI, resource type ec2:image
+ for ami in self.ec2_backend.amis.values():
+ for value in get_ec2_values(ami.id):
+ yield value
+
+ # EC2 Instance, resource type ec2:instance
+ for reservation in self.ec2_backend.reservations.values():
+ for instance in reservation.instances:
+ for value in get_ec2_values(instance.id):
+ yield value
+
+ # EC2 NetworkInterface, resource type ec2:network-interface
+ for eni in self.ec2_backend.enis.values():
+ for value in get_ec2_values(eni.id):
+ yield value
+
+ # TODO EC2 ReservedInstance
+
+ # EC2 SecurityGroup, resource type ec2:security-group
+ for vpc in self.ec2_backend.groups.values():
+ for sg in vpc.values():
+ for value in get_ec2_values(sg.id):
+ yield value
+
+ # EC2 Snapshot, resource type ec2:snapshot
+ for snapshot in self.ec2_backend.snapshots.values():
+ for value in get_ec2_values(snapshot.id):
+ yield value
+
+ # TODO EC2 SpotInstanceRequest
+
+ # EC2 Volume, resource type ec2:volume
+ for volume in self.ec2_backend.volumes.values():
+ for value in get_ec2_values(volume.id):
+ yield value
+
+ def get_resources(
+ self,
+ pagination_token=None,
+ resources_per_page=50,
+ tags_per_page=100,
+ tag_filters=None,
+ resource_type_filters=None,
+ ):
+ # Simple range checking
+ if 100 >= tags_per_page >= 500:
+ raise RESTError(
+ "InvalidParameterException", "TagsPerPage must be between 100 and 500"
+ )
+ if 1 >= resources_per_page >= 50:
+ raise RESTError(
+ "InvalidParameterException", "ResourcesPerPage must be between 1 and 50"
+ )
+
+ # If we have a token, go and find the respective generator, or error
+ if pagination_token:
+ if pagination_token not in self._pages:
+ raise RESTError(
+ "PaginationTokenExpiredException", "Token does not exist"
+ )
+
+ generator = self._pages[pagination_token]["gen"]
+ left_over = self._pages[pagination_token]["misc"]
+ else:
+ generator = self._get_resources_generator(
+ tag_filters=tag_filters, resource_type_filters=resource_type_filters
+ )
+ left_over = None
+
+ result = []
+ current_tags = 0
+ current_resources = 0
+ if left_over:
+ result.append(left_over)
+ current_resources += 1
+ current_tags += len(left_over["Tags"])
+
+ try:
+ while True:
+ # Generator format: [{'ResourceARN': str, 'Tags': [{'Key': str, 'Value': str]}, ...]
+ next_item = next(generator)
+ resource_tags = len(next_item["Tags"])
+
+ if current_resources >= resources_per_page:
+ break
+ if current_tags + resource_tags >= tags_per_page:
+ break
+
+ current_resources += 1
+ current_tags += resource_tags
+
+ result.append(next_item)
+
+ except StopIteration:
+ # Finished generator before invalidating page limiting constraints
+ return None, result
+
+ # Didn't hit StopIteration so there's stuff left in generator
+ new_token = str(uuid.uuid4())
+ self._pages[new_token] = {"gen": generator, "misc": next_item}
+
+ # Token used up, might as well bin now, if you call it again your an idiot
+ if pagination_token:
+ del self._pages[pagination_token]
+
+ return new_token, result
+
+ def get_tag_keys(self, pagination_token=None):
+
+ if pagination_token:
+ if pagination_token not in self._pages:
+ raise RESTError(
+ "PaginationTokenExpiredException", "Token does not exist"
+ )
+
+ generator = self._pages[pagination_token]["gen"]
+ left_over = self._pages[pagination_token]["misc"]
+ else:
+ generator = self._get_tag_keys_generator()
+ left_over = None
+
+ result = []
+ current_tags = 0
+ if left_over:
+ result.append(left_over)
+ current_tags += 1
+
+ try:
+ while True:
+ # Generator format: ['tag', 'tag', 'tag', ...]
+ next_item = next(generator)
+
+ if current_tags + 1 >= 128:
+ break
+
+ current_tags += 1
+
+ result.append(next_item)
+
+ except StopIteration:
+ # Finished generator before invalidating page limiting constraints
+ return None, result
+
+ # Didn't hit StopIteration so there's stuff left in generator
+ new_token = str(uuid.uuid4())
+ self._pages[new_token] = {"gen": generator, "misc": next_item}
+
+ # Token used up, might as well bin now, if you call it again your an idiot
+ if pagination_token:
+ del self._pages[pagination_token]
+
+ return new_token, result
+
+ def get_tag_values(self, pagination_token, key):
+
+ if pagination_token:
+ if pagination_token not in self._pages:
+ raise RESTError(
+ "PaginationTokenExpiredException", "Token does not exist"
+ )
+
+ generator = self._pages[pagination_token]["gen"]
+ left_over = self._pages[pagination_token]["misc"]
+ else:
+ generator = self._get_tag_values_generator(key)
+ left_over = None
+
+ result = []
+ current_tags = 0
+ if left_over:
+ result.append(left_over)
+ current_tags += 1
+
+ try:
+ while True:
+ # Generator format: ['value', 'value', 'value', ...]
+ next_item = next(generator)
+
+ if current_tags + 1 >= 128:
+ break
+
+ current_tags += 1
+
+ result.append(next_item)
+
+ except StopIteration:
+ # Finished generator before invalidating page limiting constraints
+ return None, result
+
+ # Didn't hit StopIteration so there's stuff left in generator
+ new_token = str(uuid.uuid4())
+ self._pages[new_token] = {"gen": generator, "misc": next_item}
+
+ # Token used up, might as well bin now, if you call it again your an idiot
+ if pagination_token:
+ del self._pages[pagination_token]
+
+ return new_token, result
+
+ # These methods will be called from responses.py.
+ # They should call a tag function inside of the moto module
+ # that governs the resource, that way if the target module
+ # changes how tags are delt with theres less to change
+
+ # def tag_resources(self, resource_arn_list, tags):
+ # return failed_resources_map
+ #
+ # def untag_resources(self, resource_arn_list, tag_keys):
+ # return failed_resources_map
+
+
+resourcegroupstaggingapi_backends = BackendDict(
+ ResourceGroupsTaggingAPIBackend, "resourcegroupstaggingapi"
+)
diff --git a/contrib/python/moto/py3/moto/resourcegroupstaggingapi/responses.py b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/responses.py
new file mode 100644
index 0000000000..a153e2bdf0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/responses.py
@@ -0,0 +1,89 @@
+from moto.core.responses import BaseResponse
+from .models import resourcegroupstaggingapi_backends
+import json
+
+
+class ResourceGroupsTaggingAPIResponse(BaseResponse):
+ SERVICE_NAME = "resourcegroupstaggingapi"
+
+ @property
+ def backend(self):
+ """
+ Backend
+ :returns: Resource tagging api backend
+ :rtype: moto.resourcegroupstaggingapi.models.ResourceGroupsTaggingAPIBackend
+ """
+ return resourcegroupstaggingapi_backends[self.region]
+
+ def get_resources(self):
+ pagination_token = self._get_param("PaginationToken")
+ tag_filters = self._get_param("TagFilters", [])
+ resources_per_page = self._get_int_param("ResourcesPerPage", 50)
+ tags_per_page = self._get_int_param("TagsPerPage", 100)
+ resource_type_filters = self._get_param("ResourceTypeFilters", [])
+
+ pagination_token, resource_tag_mapping_list = self.backend.get_resources(
+ pagination_token=pagination_token,
+ tag_filters=tag_filters,
+ resources_per_page=resources_per_page,
+ tags_per_page=tags_per_page,
+ resource_type_filters=resource_type_filters,
+ )
+
+ # Format tag response
+ response = {"ResourceTagMappingList": resource_tag_mapping_list}
+ if pagination_token:
+ response["PaginationToken"] = pagination_token
+
+ return json.dumps(response)
+
+ def get_tag_keys(self):
+ pagination_token = self._get_param("PaginationToken")
+ pagination_token, tag_keys = self.backend.get_tag_keys(
+ pagination_token=pagination_token
+ )
+
+ response = {"TagKeys": tag_keys}
+ if pagination_token:
+ response["PaginationToken"] = pagination_token
+
+ return json.dumps(response)
+
+ def get_tag_values(self):
+ pagination_token = self._get_param("PaginationToken")
+ key = self._get_param("Key")
+ pagination_token, tag_values = self.backend.get_tag_values(
+ pagination_token=pagination_token, key=key
+ )
+
+ response = {"TagValues": tag_values}
+ if pagination_token:
+ response["PaginationToken"] = pagination_token
+
+ return json.dumps(response)
+
+ # These methods are all thats left to be implemented
+ # the response is already set up, all thats needed is
+ # the respective model function to be implemented.
+ #
+ # def tag_resources(self):
+ # resource_arn_list = self._get_list_prefix("ResourceARNList.member")
+ # tags = self._get_param("Tags")
+ # failed_resources_map = self.backend.tag_resources(
+ # resource_arn_list=resource_arn_list,
+ # tags=tags,
+ # )
+ #
+ # # failed_resources_map should be {'resource': {'ErrorCode': str, 'ErrorMessage': str, 'StatusCode': int}}
+ # return json.dumps({'FailedResourcesMap': failed_resources_map})
+ #
+ # def untag_resources(self):
+ # resource_arn_list = self._get_list_prefix("ResourceARNList.member")
+ # tag_keys = self._get_list_prefix("TagKeys.member")
+ # failed_resources_map = self.backend.untag_resources(
+ # resource_arn_list=resource_arn_list,
+ # tag_keys=tag_keys,
+ # )
+ #
+ # # failed_resources_map should be {'resource': {'ErrorCode': str, 'ErrorMessage': str, 'StatusCode': int}}
+ # return json.dumps({'FailedResourcesMap': failed_resources_map})
diff --git a/contrib/python/moto/py3/moto/resourcegroupstaggingapi/urls.py b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/urls.py
new file mode 100644
index 0000000000..34e343bc1f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/resourcegroupstaggingapi/urls.py
@@ -0,0 +1,5 @@
+from .responses import ResourceGroupsTaggingAPIResponse
+
+url_bases = [r"https?://tagging\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": ResourceGroupsTaggingAPIResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/route53/__init__.py b/contrib/python/moto/py3/moto/route53/__init__.py
new file mode 100644
index 0000000000..358e1ee676
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/__init__.py
@@ -0,0 +1,4 @@
+from .models import route53_backends
+from ..core.models import base_decorator
+
+mock_route53 = base_decorator(route53_backends)
diff --git a/contrib/python/moto/py3/moto/route53/exceptions.py b/contrib/python/moto/py3/moto/route53/exceptions.py
new file mode 100644
index 0000000000..a854e8ebe4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/exceptions.py
@@ -0,0 +1,102 @@
+"""Exceptions raised by the Route53 service."""
+from moto.core.exceptions import RESTError
+
+
+class Route53ClientError(RESTError):
+ """Base class for Route53 errors."""
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "single_error")
+ super().__init__(*args, **kwargs)
+
+
+class InvalidInput(Route53ClientError):
+ """Malformed ARN for the CloudWatch log group."""
+
+ code = 400
+
+ def __init__(self):
+ message = "The ARN for the CloudWatch Logs log group is invalid"
+ super().__init__("InvalidInput", message)
+
+
+class InvalidPaginationToken(Route53ClientError):
+ """Bad NextToken specified when listing query logging configs."""
+
+ code = 400
+
+ def __init__(self):
+ message = (
+ "Route 53 can't get the next page of query logging configurations "
+ "because the specified value for NextToken is invalid."
+ )
+ super().__init__("InvalidPaginationToken", message)
+
+
+class InvalidVPCId(Route53ClientError):
+ """Missing/Invalid VPC ID"""
+
+ code = 400
+
+ def __init__(self):
+ message = "Invalid or missing VPC Id."
+ super().__init__("InvalidVPCId", message)
+ self.content_type = "text/xml"
+
+
+class NoSuchCloudWatchLogsLogGroup(Route53ClientError):
+ """CloudWatch LogGroup has a permissions policy, but does not exist."""
+
+ code = 404
+
+ def __init__(self):
+ message = "The specified CloudWatch Logs log group doesn't exist."
+ super().__init__("NoSuchCloudWatchLogsLogGroup", message)
+
+
+class NoSuchHostedZone(Route53ClientError):
+ """HostedZone does not exist."""
+
+ code = 404
+
+ def __init__(self, host_zone_id):
+ message = f"No hosted zone found with ID: {host_zone_id}"
+ super().__init__("NoSuchHostedZone", message)
+ self.content_type = "text/xml"
+
+
+class NoSuchQueryLoggingConfig(Route53ClientError):
+ """Query log config does not exist."""
+
+ code = 404
+
+ def __init__(self):
+ message = "The query logging configuration does not exist"
+ super().__init__("NoSuchQueryLoggingConfig", message)
+
+
+class QueryLoggingConfigAlreadyExists(Route53ClientError):
+ """Query log config exists for the hosted zone."""
+
+ code = 409
+
+ def __init__(self):
+ message = "A query logging configuration already exists for this hosted zone"
+ super().__init__("QueryLoggingConfigAlreadyExists", message)
+
+
+class InvalidChangeBatch(Route53ClientError):
+
+ code = 400
+
+ def __init__(self):
+ message = "Number of records limit of 1000 exceeded."
+ super().__init__("InvalidChangeBatch", message)
+
+
+class NoSuchDelegationSet(Route53ClientError):
+ code = 400
+
+ def __init__(self, delegation_set_id):
+ super().__init__("NoSuchDelegationSet", delegation_set_id)
+ self.content_type = "text/xml"
diff --git a/contrib/python/moto/py3/moto/route53/models.py b/contrib/python/moto/py3/moto/route53/models.py
new file mode 100644
index 0000000000..3cd8c35265
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/models.py
@@ -0,0 +1,691 @@
+"""Route53Backend class with methods for supported APIs."""
+import itertools
+from collections import defaultdict
+import re
+
+import string
+import random
+import uuid
+from jinja2 import Template
+
+from moto.route53.exceptions import (
+ InvalidInput,
+ NoSuchCloudWatchLogsLogGroup,
+ NoSuchDelegationSet,
+ NoSuchHostedZone,
+ NoSuchQueryLoggingConfig,
+ QueryLoggingConfigAlreadyExists,
+)
+from moto.core import BaseBackend, BaseModel, CloudFormationModel, get_account_id
+from moto.core.utils import BackendDict
+from moto.utilities.paginator import paginate
+from .utils import PAGINATION_MODEL
+
+ROUTE53_ID_CHOICE = string.ascii_uppercase + string.digits
+
+
+def create_route53_zone_id():
+ # New ID's look like this Z1RWWTK7Y8UDDQ
+ return "".join([random.choice(ROUTE53_ID_CHOICE) for _ in range(0, 15)])
+
+
+class DelegationSet(BaseModel):
+ def __init__(self, caller_reference, name_servers, delegation_set_id):
+ self.caller_reference = caller_reference
+ self.name_servers = name_servers or [
+ "ns-2048.awsdns-64.com",
+ "ns-2049.awsdns-65.net",
+ "ns-2050.awsdns-66.org",
+ "ns-2051.awsdns-67.co.uk",
+ ]
+ self.id = delegation_set_id or "".join(
+ [random.choice(ROUTE53_ID_CHOICE) for _ in range(5)]
+ )
+ self.location = f"https://route53.amazonaws.com/delegationset/{self.id}"
+
+
+class HealthCheck(CloudFormationModel):
+ def __init__(self, health_check_id, caller_reference, health_check_args):
+ self.id = health_check_id
+ self.ip_address = health_check_args.get("ip_address")
+ self.port = health_check_args.get("port") or 80
+ self.type_ = health_check_args.get("type")
+ self.resource_path = health_check_args.get("resource_path")
+ self.fqdn = health_check_args.get("fqdn")
+ self.search_string = health_check_args.get("search_string")
+ self.request_interval = health_check_args.get("request_interval") or 30
+ self.failure_threshold = health_check_args.get("failure_threshold") or 3
+ self.health_threshold = health_check_args.get("health_threshold")
+ self.measure_latency = health_check_args.get("measure_latency") or False
+ self.inverted = health_check_args.get("inverted") or False
+ self.disabled = health_check_args.get("disabled") or False
+ self.enable_sni = health_check_args.get("enable_sni") or False
+ self.children = health_check_args.get("children") or None
+ self.caller_reference = caller_reference
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-healthcheck.html
+ return "AWS::Route53::HealthCheck"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]["HealthCheckConfig"]
+ health_check_args = {
+ "ip_address": properties.get("IPAddress"),
+ "port": properties.get("Port"),
+ "type": properties["Type"],
+ "resource_path": properties.get("ResourcePath"),
+ "fqdn": properties.get("FullyQualifiedDomainName"),
+ "search_string": properties.get("SearchString"),
+ "request_interval": properties.get("RequestInterval"),
+ "failure_threshold": properties.get("FailureThreshold"),
+ }
+ health_check = route53_backend.create_health_check(
+ caller_reference=resource_name, health_check_args=health_check_args
+ )
+ return health_check
+
+ def to_xml(self):
+ template = Template(
+ """<HealthCheck>
+ <Id>{{ health_check.id }}</Id>
+ <CallerReference>{{ health_check.caller_reference }}</CallerReference>
+ <HealthCheckConfig>
+ {% if health_check.type_ != "CALCULATED" %}
+ <IPAddress>{{ health_check.ip_address }}</IPAddress>
+ <Port>{{ health_check.port }}</Port>
+ {% endif %}
+ <Type>{{ health_check.type_ }}</Type>
+ {% if health_check.resource_path %}
+ <ResourcePath>{{ health_check.resource_path }}</ResourcePath>
+ {% endif %}
+ {% if health_check.fqdn %}
+ <FullyQualifiedDomainName>{{ health_check.fqdn }}</FullyQualifiedDomainName>
+ {% endif %}
+ {% if health_check.type_ != "CALCULATED" %}
+ <RequestInterval>{{ health_check.request_interval }}</RequestInterval>
+ <FailureThreshold>{{ health_check.failure_threshold }}</FailureThreshold>
+ <MeasureLatency>{{ health_check.measure_latency }}</MeasureLatency>
+ {% endif %}
+ {% if health_check.type_ == "CALCULATED" %}
+ <HealthThreshold>{{ health_check.health_threshold }}</HealthThreshold>
+ {% endif %}
+ <Inverted>{{ health_check.inverted }}</Inverted>
+ <Disabled>{{ health_check.disabled }}</Disabled>
+ <EnableSNI>{{ health_check.enable_sni }}</EnableSNI>
+ {% if health_check.search_string %}
+ <SearchString>{{ health_check.search_string }}</SearchString>
+ {% endif %}
+ {% if health_check.children %}
+ <ChildHealthChecks>
+ {% for child in health_check.children %}
+ <member>{{ child }}</member>
+ {% endfor %}
+ </ChildHealthChecks>
+ {% endif %}
+ </HealthCheckConfig>
+ <HealthCheckVersion>1</HealthCheckVersion>
+ </HealthCheck>"""
+ )
+ return template.render(health_check=self)
+
+
+class RecordSet(CloudFormationModel):
+ def __init__(self, kwargs):
+ self.name = kwargs.get("Name")
+ self.type_ = kwargs.get("Type")
+ self.ttl = kwargs.get("TTL", 0)
+ self.records = kwargs.get("ResourceRecords", [])
+ self.set_identifier = kwargs.get("SetIdentifier")
+ self.weight = kwargs.get("Weight", 0)
+ self.region = kwargs.get("Region")
+ self.health_check = kwargs.get("HealthCheckId")
+ self.hosted_zone_name = kwargs.get("HostedZoneName")
+ self.hosted_zone_id = kwargs.get("HostedZoneId")
+ self.alias_target = kwargs.get("AliasTarget")
+ self.failover = kwargs.get("Failover")
+ self.geo_location = kwargs.get("GeoLocation")
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordset.html
+ return "AWS::Route53::RecordSet"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(properties["HostedZoneId"])
+ record_set = hosted_zone.add_rrset(properties)
+ return record_set
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # this will break if you changed the zone the record is in,
+ # unfortunately
+ properties = cloudformation_json["Properties"]
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(properties["HostedZoneId"])
+
+ try:
+ hosted_zone.delete_rrset({"Name": resource_name})
+ except KeyError:
+ pass
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ def delete(self, *args, **kwargs): # pylint: disable=unused-argument
+ """Not exposed as part of the Route 53 API - used for CloudFormation. args are ignored"""
+ hosted_zone = route53_backend.get_hosted_zone_by_name(self.hosted_zone_name)
+ if not hosted_zone:
+ hosted_zone = route53_backend.get_hosted_zone(self.hosted_zone_id)
+ hosted_zone.delete_rrset({"Name": self.name, "Type": self.type_})
+
+
+def reverse_domain_name(domain_name):
+ if domain_name.endswith("."): # normalize without trailing dot
+ domain_name = domain_name[:-1]
+ return ".".join(reversed(domain_name.split(".")))
+
+
+class FakeZone(CloudFormationModel):
+ def __init__(
+ self,
+ name,
+ id_,
+ private_zone,
+ vpcid=None,
+ vpcregion=None,
+ comment=None,
+ delegation_set=None,
+ ):
+ self.name = name
+ self.id = id_
+ if comment is not None:
+ self.comment = comment
+ if vpcid is not None:
+ self.vpcid = vpcid
+ if vpcregion is not None:
+ self.vpcregion = vpcregion
+ self.private_zone = private_zone
+ self.rrsets = []
+ self.delegation_set = delegation_set
+
+ def add_rrset(self, record_set):
+ record_set = RecordSet(record_set)
+ self.rrsets.append(record_set)
+ return record_set
+
+ def upsert_rrset(self, record_set):
+ new_rrset = RecordSet(record_set)
+ for i, rrset in enumerate(self.rrsets):
+ if (
+ rrset.name == new_rrset.name
+ and rrset.type_ == new_rrset.type_
+ and rrset.set_identifier == new_rrset.set_identifier
+ ):
+ self.rrsets[i] = new_rrset
+ break
+ else:
+ self.rrsets.append(new_rrset)
+ return new_rrset
+
+ def delete_rrset(self, rrset):
+ self.rrsets = [
+ record_set
+ for record_set in self.rrsets
+ if record_set.name != rrset["Name"]
+ or (rrset.get("Type") is not None and record_set.type_ != rrset["Type"])
+ ]
+
+ def delete_rrset_by_id(self, set_identifier):
+ self.rrsets = [
+ record_set
+ for record_set in self.rrsets
+ if record_set.set_identifier != set_identifier
+ ]
+
+ def get_record_sets(self, start_type, start_name):
+ def predicate(rrset):
+ rrset_name_reversed = reverse_domain_name(rrset.name)
+ start_name_reversed = reverse_domain_name(start_name)
+ return rrset_name_reversed < start_name_reversed or (
+ rrset_name_reversed == start_name_reversed and rrset.type_ < start_type
+ )
+
+ record_sets = sorted(
+ self.rrsets,
+ key=lambda rrset: (reverse_domain_name(rrset.name), rrset.type_),
+ )
+
+ if start_name:
+ start_type = start_type or ""
+ record_sets = itertools.dropwhile(predicate, record_sets)
+
+ return record_sets
+
+ @property
+ def physical_resource_id(self):
+ return self.id
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "Name"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html
+ return "AWS::Route53::HostedZone"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ hosted_zone = route53_backend.create_hosted_zone(
+ resource_name, private_zone=False
+ )
+ return hosted_zone
+
+
+class RecordSetGroup(CloudFormationModel):
+ def __init__(self, hosted_zone_id, record_sets):
+ self.hosted_zone_id = hosted_zone_id
+ self.record_sets = record_sets
+
+ @property
+ def physical_resource_id(self):
+ return f"arn:aws:route53:::hostedzone/{self.hosted_zone_id}"
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html
+ return "AWS::Route53::RecordSetGroup"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ zone_name = properties.get("HostedZoneName")
+ if zone_name:
+ hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
+ else:
+ hosted_zone = route53_backend.get_hosted_zone(properties["HostedZoneId"])
+ record_sets = properties["RecordSets"]
+ for record_set in record_sets:
+ hosted_zone.add_rrset(record_set)
+
+ record_set_group = RecordSetGroup(hosted_zone.id, record_sets)
+ return record_set_group
+
+
+class QueryLoggingConfig(BaseModel):
+
+ """QueryLoggingConfig class; this object isn't part of Cloudformation."""
+
+ def __init__(
+ self, query_logging_config_id, hosted_zone_id, cloudwatch_logs_log_group_arn
+ ):
+ self.hosted_zone_id = hosted_zone_id
+ self.cloudwatch_logs_log_group_arn = cloudwatch_logs_log_group_arn
+ self.query_logging_config_id = query_logging_config_id
+ self.location = f"https://route53.amazonaws.com/2013-04-01/queryloggingconfig/{self.query_logging_config_id}"
+
+ def to_xml(self):
+ template = Template(
+ """<QueryLoggingConfig>
+ <CloudWatchLogsLogGroupArn>{{ query_logging_config.cloudwatch_logs_log_group_arn }}</CloudWatchLogsLogGroupArn>
+ <HostedZoneId>{{ query_logging_config.hosted_zone_id }}</HostedZoneId>
+ <Id>{{ query_logging_config.query_logging_config_id }}</Id>
+ </QueryLoggingConfig>"""
+ )
+ # The "Location" value must be put into the header; that's done in
+ # responses.py.
+ return template.render(query_logging_config=self)
+
+
+class Route53Backend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.zones = {}
+ self.health_checks = {}
+ self.resource_tags = defaultdict(dict)
+ self.query_logging_configs = {}
+ self.delegation_sets = dict()
+
+ def create_hosted_zone(
+ self,
+ name,
+ private_zone,
+ vpcid=None,
+ vpcregion=None,
+ comment=None,
+ delegation_set_id=None,
+ ):
+ new_id = create_route53_zone_id()
+ delegation_set = self.create_reusable_delegation_set(
+ caller_reference=f"DelSet_{name}", delegation_set_id=delegation_set_id
+ )
+ new_zone = FakeZone(
+ name,
+ new_id,
+ private_zone=private_zone,
+ vpcid=vpcid,
+ vpcregion=vpcregion,
+ comment=comment,
+ delegation_set=delegation_set,
+ )
+ self.zones[new_id] = new_zone
+ return new_zone
+
+ def change_tags_for_resource(self, resource_id, tags):
+ if "Tag" in tags:
+ if isinstance(tags["Tag"], list):
+ for tag in tags["Tag"]:
+ self.resource_tags[resource_id][tag["Key"]] = tag["Value"]
+ else:
+ key, value = (tags["Tag"]["Key"], tags["Tag"]["Value"])
+ self.resource_tags[resource_id][key] = value
+ else:
+ if "Key" in tags:
+ if isinstance(tags["Key"], list):
+ for key in tags["Key"]:
+ del self.resource_tags[resource_id][key]
+ else:
+ del self.resource_tags[resource_id][tags["Key"]]
+
+ def list_tags_for_resource(self, resource_id):
+ if resource_id in self.resource_tags:
+ return self.resource_tags[resource_id]
+ return {}
+
+ def list_resource_record_sets(self, zone_id, start_type, start_name, max_items):
+ """
+ The StartRecordIdentifier-parameter is not yet implemented
+ """
+ the_zone = self.get_hosted_zone(zone_id)
+ all_records = list(the_zone.get_record_sets(start_type, start_name))
+ records = all_records[0:max_items]
+ next_record = all_records[max_items] if len(all_records) > max_items else None
+ next_start_name = next_record.name if next_record else None
+ next_start_type = next_record.type_ if next_record else None
+ is_truncated = next_record is not None
+ return records, next_start_name, next_start_type, is_truncated
+
+ def change_resource_record_sets(self, zoneid, change_list):
+ the_zone = self.get_hosted_zone(zoneid)
+ for value in change_list:
+ action = value["Action"]
+ record_set = value["ResourceRecordSet"]
+
+ cleaned_record_name = record_set["Name"].strip(".")
+ cleaned_hosted_zone_name = the_zone.name.strip(".")
+
+ if not cleaned_record_name.endswith(cleaned_hosted_zone_name):
+ error_msg = f"""
+ An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation:
+ RRSet with DNS name {record_set["Name"]} is not permitted in zone {the_zone.name}
+ """
+ return error_msg
+
+ if not record_set["Name"].endswith("."):
+ record_set["Name"] += "."
+
+ if action in ("CREATE", "UPSERT"):
+ if "ResourceRecords" in record_set:
+ resource_records = list(record_set["ResourceRecords"].values())[0]
+ if not isinstance(resource_records, list):
+ # Depending on how many records there are, this may
+ # or may not be a list
+ resource_records = [resource_records]
+ record_set["ResourceRecords"] = [
+ x["Value"] for x in resource_records
+ ]
+ if action == "CREATE":
+ the_zone.add_rrset(record_set)
+ else:
+ the_zone.upsert_rrset(record_set)
+ elif action == "DELETE":
+ if "SetIdentifier" in record_set:
+ the_zone.delete_rrset_by_id(record_set["SetIdentifier"])
+ else:
+ the_zone.delete_rrset(record_set)
+ return None
+
+ def list_hosted_zones(self):
+ return self.zones.values()
+
+ def list_hosted_zones_by_name(self, dnsname):
+ if dnsname:
+ dnsname = dnsname[0]
+ if dnsname[-1] != ".":
+ dnsname += "."
+ zones = [zone for zone in self.list_hosted_zones() if zone.name == dnsname]
+ else:
+ # sort by names, but with domain components reversed
+ # see http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.list_hosted_zones_by_name
+
+ def sort_key(zone):
+ domains = zone.name.split(".")
+ if domains[-1] == "":
+ domains = domains[-1:] + domains[:-1]
+ return ".".join(reversed(domains))
+
+ zones = self.list_hosted_zones()
+ zones = sorted(zones, key=sort_key)
+ return dnsname, zones
+
+ def list_hosted_zones_by_vpc(self, vpc_id):
+ """
+ Pagination is not yet implemented
+ """
+ zone_list = []
+ for zone in self.list_hosted_zones():
+ if zone.private_zone is True:
+ this_zone = self.get_hosted_zone(zone.id)
+ if this_zone.vpcid == vpc_id:
+ this_id = f"/hostedzone/{zone.id}"
+ zone_list.append(
+ {
+ "HostedZoneId": this_id,
+ "Name": zone.name,
+ "Owner": {"OwningAccount": get_account_id()},
+ }
+ )
+
+ return zone_list
+
+ def get_hosted_zone(self, id_):
+ the_zone = self.zones.get(id_.replace("/hostedzone/", ""))
+ if not the_zone:
+ raise NoSuchHostedZone(id_)
+ return the_zone
+
+ def get_hosted_zone_count(self):
+ return len(self.list_hosted_zones())
+
+ def get_hosted_zone_by_name(self, name):
+ for zone in self.list_hosted_zones():
+ if zone.name == name:
+ return zone
+ return None
+
+ def delete_hosted_zone(self, id_):
+ # Verify it exists
+ self.get_hosted_zone(id_)
+ return self.zones.pop(id_.replace("/hostedzone/", ""), None)
+
+ def create_health_check(self, caller_reference, health_check_args):
+ health_check_id = str(uuid.uuid4())
+ health_check = HealthCheck(health_check_id, caller_reference, health_check_args)
+ self.health_checks[health_check_id] = health_check
+ return health_check
+
+ def list_health_checks(self):
+ return self.health_checks.values()
+
+ def delete_health_check(self, health_check_id):
+ return self.health_checks.pop(health_check_id, None)
+
+ @staticmethod
+ def _validate_arn(region, arn):
+ match = re.match(rf"arn:aws:logs:{region}:\d{{12}}:log-group:.+", arn)
+ if not arn or not match:
+ raise InvalidInput()
+
+ # The CloudWatch Logs log group must be in the "us-east-1" region.
+ match = re.match(r"^(?:[^:]+:){3}(?P<region>[^:]+).*", arn)
+ if match.group("region") != "us-east-1":
+ raise InvalidInput()
+
+ def create_query_logging_config(self, region, hosted_zone_id, log_group_arn):
+ """Process the create_query_logging_config request."""
+ # Does the hosted_zone_id exist?
+ response = self.list_hosted_zones()
+ zones = list(response) if response else []
+ for zone in zones:
+ if zone.id == hosted_zone_id:
+ break
+ else:
+ raise NoSuchHostedZone(hosted_zone_id)
+
+ # Ensure CloudWatch Logs log ARN is valid, otherwise raise an error.
+ self._validate_arn(region, log_group_arn)
+
+ # Note: boto3 checks the resource policy permissions before checking
+ # whether the log group exists. moto doesn't have a way of checking
+ # the resource policy, so in some instances moto will complain
+ # about a log group that doesn't exist whereas boto3 will complain
+ # that "The resource policy that you're using for Route 53 query
+ # logging doesn't grant Route 53 sufficient permission to create
+ # a log stream in the specified log group."
+
+ from moto.logs import logs_backends # pylint: disable=import-outside-toplevel
+
+ response = logs_backends[region].describe_log_groups()
+ log_groups = response[0] if response else []
+ for entry in log_groups:
+ if log_group_arn == entry["arn"]:
+ break
+ else:
+ # There is no CloudWatch Logs log group with the specified ARN.
+ raise NoSuchCloudWatchLogsLogGroup()
+
+ # Verify there is no existing query log config using the same hosted
+ # zone.
+ for query_log in self.query_logging_configs.values():
+ if query_log.hosted_zone_id == hosted_zone_id:
+ raise QueryLoggingConfigAlreadyExists()
+
+ # Create an instance of the query logging config.
+ query_logging_config_id = str(uuid.uuid4())
+ query_logging_config = QueryLoggingConfig(
+ query_logging_config_id, hosted_zone_id, log_group_arn
+ )
+ self.query_logging_configs[query_logging_config_id] = query_logging_config
+ return query_logging_config
+
+ def delete_query_logging_config(self, query_logging_config_id):
+ """Delete query logging config, if it exists."""
+ if query_logging_config_id not in self.query_logging_configs:
+ raise NoSuchQueryLoggingConfig()
+ self.query_logging_configs.pop(query_logging_config_id)
+
+ def get_query_logging_config(self, query_logging_config_id):
+ """Return query logging config, if it exists."""
+ if query_logging_config_id not in self.query_logging_configs:
+ raise NoSuchQueryLoggingConfig()
+ return self.query_logging_configs[query_logging_config_id]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_query_logging_configs(self, hosted_zone_id=None):
+ """Return a list of query logging configs."""
+ if hosted_zone_id:
+ # Does the hosted_zone_id exist?
+ response = self.list_hosted_zones()
+ zones = list(response) if response else []
+ for zone in zones:
+ if zone.id == hosted_zone_id:
+ break
+ else:
+ raise NoSuchHostedZone(hosted_zone_id)
+
+ return list(self.query_logging_configs.values())
+
+ def create_reusable_delegation_set(
+ self, caller_reference, delegation_set_id=None, hosted_zone_id=None
+ ):
+ name_servers = None
+ if hosted_zone_id:
+ hosted_zone = self.get_hosted_zone(hosted_zone_id)
+ name_servers = hosted_zone.delegation_set.name_servers
+ delegation_set = DelegationSet(
+ caller_reference, name_servers, delegation_set_id
+ )
+ self.delegation_sets[delegation_set.id] = delegation_set
+ return delegation_set
+
+ def list_reusable_delegation_sets(self):
+ """
+ Pagination is not yet implemented
+ """
+ return self.delegation_sets.values()
+
+ def delete_reusable_delegation_set(self, delegation_set_id):
+ self.delegation_sets.pop(delegation_set_id, None)
+
+ def get_reusable_delegation_set(self, delegation_set_id):
+ if delegation_set_id not in self.delegation_sets:
+ raise NoSuchDelegationSet(delegation_set_id)
+ return self.delegation_sets[delegation_set_id]
+
+
+route53_backends = BackendDict(
+ Route53Backend, "route53", use_boto3_regions=False, additional_regions=["global"]
+)
+route53_backend = route53_backends["global"]
diff --git a/contrib/python/moto/py3/moto/route53/responses.py b/contrib/python/moto/py3/moto/route53/responses.py
new file mode 100644
index 0000000000..32c9c5158f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/responses.py
@@ -0,0 +1,699 @@
+"""Handles Route53 API requests, invokes method and returns response."""
+from urllib.parse import parse_qs, urlparse
+
+from jinja2 import Template
+import xmltodict
+
+from moto.core.responses import BaseResponse
+from moto.route53.exceptions import InvalidChangeBatch
+from moto.route53.models import route53_backend
+
+XMLNS = "https://route53.amazonaws.com/doc/2013-04-01/"
+
+
+class Route53(BaseResponse):
+ """Handler for Route53 requests and responses."""
+
+ @staticmethod
+ def _convert_to_bool(bool_str):
+ if isinstance(bool_str, bool):
+ return bool_str
+
+ if isinstance(bool_str, str):
+ return str(bool_str).lower() == "true"
+
+ return False
+
+ def list_or_create_hostzone_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ # Set these here outside the scope of the try/except
+ # so they're defined later when we call create_hosted_zone()
+ vpcid = None
+ vpcregion = None
+ if request.method == "POST":
+ elements = xmltodict.parse(self.body)
+ zone_request = elements["CreateHostedZoneRequest"]
+ if "HostedZoneConfig" in zone_request:
+ zone_config = zone_request["HostedZoneConfig"]
+ comment = zone_config["Comment"]
+ if zone_request.get("VPC", {}).get("VPCId", None):
+ private_zone = True
+ else:
+ private_zone = self._convert_to_bool(
+ zone_config.get("PrivateZone", False)
+ )
+ else:
+ comment = None
+ private_zone = False
+
+ # It is possible to create a Private Hosted Zone without
+ # associating VPC at the time of creation.
+ if self._convert_to_bool(private_zone):
+ if zone_request.get("VPC", None) is not None:
+ vpcid = zone_request["VPC"].get("VPCId", None)
+ vpcregion = zone_request["VPC"].get("VPCRegion", None)
+
+ name = zone_request["Name"]
+
+ if name[-1] != ".":
+ name += "."
+ delegation_set_id = zone_request.get("DelegationSetId")
+
+ new_zone = route53_backend.create_hosted_zone(
+ name,
+ comment=comment,
+ private_zone=private_zone,
+ vpcid=vpcid,
+ vpcregion=vpcregion,
+ delegation_set_id=delegation_set_id,
+ )
+ template = Template(CREATE_HOSTED_ZONE_RESPONSE)
+ return 201, headers, template.render(zone=new_zone)
+
+ elif request.method == "GET":
+ all_zones = route53_backend.list_hosted_zones()
+ template = Template(LIST_HOSTED_ZONES_RESPONSE)
+ return 200, headers, template.render(zones=all_zones)
+
+ def list_hosted_zones_by_name_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ query_params = parse_qs(parsed_url.query)
+ dnsname = query_params.get("dnsname")
+
+ dnsname, zones = route53_backend.list_hosted_zones_by_name(dnsname)
+
+ template = Template(LIST_HOSTED_ZONES_BY_NAME_RESPONSE)
+ return 200, headers, template.render(zones=zones, dnsname=dnsname, xmlns=XMLNS)
+
+ def list_hosted_zones_by_vpc_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ query_params = parse_qs(parsed_url.query)
+ vpc_id = query_params.get("vpcid")[0]
+ zones = route53_backend.list_hosted_zones_by_vpc(vpc_id)
+ template = Template(LIST_HOSTED_ZONES_BY_VPC_RESPONSE)
+ return 200, headers, template.render(zones=zones, xmlns=XMLNS)
+
+ def get_hosted_zone_count_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ num_zones = route53_backend.get_hosted_zone_count()
+ template = Template(GET_HOSTED_ZONE_COUNT_RESPONSE)
+ return 200, headers, template.render(zone_count=num_zones, xmlns=XMLNS)
+
+ def get_or_delete_hostzone_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ zoneid = parsed_url.path.rstrip("/").rsplit("/", 1)[1]
+
+ if request.method == "GET":
+ the_zone = route53_backend.get_hosted_zone(zoneid)
+ template = Template(GET_HOSTED_ZONE_RESPONSE)
+ return 200, headers, template.render(zone=the_zone)
+ elif request.method == "DELETE":
+ route53_backend.delete_hosted_zone(zoneid)
+ return 200, headers, DELETE_HOSTED_ZONE_RESPONSE
+
+ def rrset_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ method = request.method
+
+ zoneid = parsed_url.path.rstrip("/").rsplit("/", 2)[1]
+
+ if method == "POST":
+ elements = xmltodict.parse(self.body)
+
+ change_list = elements["ChangeResourceRecordSetsRequest"]["ChangeBatch"][
+ "Changes"
+ ]["Change"]
+ if not isinstance(change_list, list):
+ change_list = [
+ elements["ChangeResourceRecordSetsRequest"]["ChangeBatch"][
+ "Changes"
+ ]["Change"]
+ ]
+
+ # Enforce quotas https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-requests-changeresourcerecordsets
+ # - A request cannot contain more than 1,000 ResourceRecord elements. When the value of the Action element is UPSERT, each ResourceRecord element is counted twice.
+ effective_rr_count = 0
+ for value in change_list:
+ record_set = value["ResourceRecordSet"]
+ if (
+ "ResourceRecords" not in record_set
+ or not record_set["ResourceRecords"]
+ ):
+ continue
+ resource_records = list(record_set["ResourceRecords"].values())[0]
+ effective_rr_count += len(resource_records)
+ if value["Action"] == "UPSERT":
+ effective_rr_count += len(resource_records)
+ if effective_rr_count > 1000:
+ raise InvalidChangeBatch
+
+ error_msg = route53_backend.change_resource_record_sets(zoneid, change_list)
+ if error_msg:
+ return 400, headers, error_msg
+
+ return 200, headers, CHANGE_RRSET_RESPONSE
+
+ elif method == "GET":
+ querystring = parse_qs(parsed_url.query)
+ template = Template(LIST_RRSET_RESPONSE)
+ start_type = querystring.get("type", [None])[0]
+ start_name = querystring.get("name", [None])[0]
+ max_items = int(querystring.get("maxitems", ["300"])[0])
+
+ if start_type and not start_name:
+ return 400, headers, "The input is not valid"
+
+ (
+ record_sets,
+ next_name,
+ next_type,
+ is_truncated,
+ ) = route53_backend.list_resource_record_sets(
+ zoneid,
+ start_type=start_type,
+ start_name=start_name,
+ max_items=max_items,
+ )
+ template = template.render(
+ record_sets=record_sets,
+ next_name=next_name,
+ next_type=next_type,
+ max_items=max_items,
+ is_truncated=is_truncated,
+ )
+ return 200, headers, template
+
+ def health_check_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ method = request.method
+
+ if method == "POST":
+ json_body = xmltodict.parse(self.body)["CreateHealthCheckRequest"]
+ caller_reference = json_body["CallerReference"]
+ config = json_body["HealthCheckConfig"]
+ health_check_args = {
+ "ip_address": config.get("IPAddress"),
+ "port": config.get("Port"),
+ "type": config["Type"],
+ "resource_path": config.get("ResourcePath"),
+ "fqdn": config.get("FullyQualifiedDomainName"),
+ "search_string": config.get("SearchString"),
+ "request_interval": config.get("RequestInterval"),
+ "failure_threshold": config.get("FailureThreshold"),
+ "health_threshold": config.get("HealthThreshold"),
+ "measure_latency": config.get("MeasureLatency"),
+ "inverted": config.get("Inverted"),
+ "disabled": config.get("Disabled"),
+ "enable_sni": config.get("EnableSNI"),
+ "children": config.get("ChildHealthChecks", {}).get("ChildHealthCheck"),
+ }
+ health_check = route53_backend.create_health_check(
+ caller_reference, health_check_args
+ )
+ template = Template(CREATE_HEALTH_CHECK_RESPONSE)
+ return 201, headers, template.render(health_check=health_check, xmlns=XMLNS)
+ elif method == "DELETE":
+ health_check_id = parsed_url.path.split("/")[-1]
+ route53_backend.delete_health_check(health_check_id)
+ template = Template(DELETE_HEALTH_CHECK_RESPONSE)
+ return 200, headers, template.render(xmlns=XMLNS)
+ elif method == "GET":
+ template = Template(LIST_HEALTH_CHECKS_RESPONSE)
+ health_checks = route53_backend.list_health_checks()
+ return (
+ 200,
+ headers,
+ template.render(health_checks=health_checks, xmlns=XMLNS),
+ )
+
+ def not_implemented_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ action = ""
+ if "tags" in full_url:
+ action = "tags"
+ elif "trafficpolicyinstances" in full_url:
+ action = "policies"
+ raise NotImplementedError(
+ f"The action for {action} has not been implemented for route 53"
+ )
+
+ def list_or_change_tags_for_resource_request(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ parsed_url = urlparse(full_url)
+ id_ = parsed_url.path.split("/")[-1]
+ type_ = parsed_url.path.split("/")[-2]
+
+ if request.method == "GET":
+ tags = route53_backend.list_tags_for_resource(id_)
+ template = Template(LIST_TAGS_FOR_RESOURCE_RESPONSE)
+ return (
+ 200,
+ headers,
+ template.render(resource_type=type_, resource_id=id_, tags=tags),
+ )
+
+ if request.method == "POST":
+ tags = xmltodict.parse(self.body)["ChangeTagsForResourceRequest"]
+
+ if "AddTags" in tags:
+ tags = tags["AddTags"]
+ elif "RemoveTagKeys" in tags:
+ tags = tags["RemoveTagKeys"]
+
+ route53_backend.change_tags_for_resource(id_, tags)
+ template = Template(CHANGE_TAGS_FOR_RESOURCE_RESPONSE)
+ return 200, headers, template.render()
+
+ def get_change(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if request.method == "GET":
+ parsed_url = urlparse(full_url)
+ change_id = parsed_url.path.rstrip("/").rsplit("/", 1)[1]
+ template = Template(GET_CHANGE_RESPONSE)
+ return 200, headers, template.render(change_id=change_id, xmlns=XMLNS)
+
+ def list_or_create_query_logging_config_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+
+ if request.method == "POST":
+ json_body = xmltodict.parse(self.body)["CreateQueryLoggingConfigRequest"]
+ hosted_zone_id = json_body["HostedZoneId"]
+ log_group_arn = json_body["CloudWatchLogsLogGroupArn"]
+
+ query_logging_config = route53_backend.create_query_logging_config(
+ self.region, hosted_zone_id, log_group_arn
+ )
+
+ template = Template(CREATE_QUERY_LOGGING_CONFIG_RESPONSE)
+ headers["Location"] = query_logging_config.location
+ return (
+ 201,
+ headers,
+ template.render(query_logging_config=query_logging_config, xmlns=XMLNS),
+ )
+
+ elif request.method == "GET":
+ hosted_zone_id = self._get_param("hostedzoneid")
+ next_token = self._get_param("nexttoken")
+ max_results = self._get_int_param("maxresults")
+
+ # The paginator picks up named arguments, returns tuple.
+ # pylint: disable=unbalanced-tuple-unpacking
+ (all_configs, next_token,) = route53_backend.list_query_logging_configs(
+ hosted_zone_id=hosted_zone_id,
+ next_token=next_token,
+ max_results=max_results,
+ )
+
+ template = Template(LIST_QUERY_LOGGING_CONFIGS_RESPONSE)
+ return (
+ 200,
+ headers,
+ template.render(
+ query_logging_configs=all_configs,
+ next_token=next_token,
+ xmlns=XMLNS,
+ ),
+ )
+
+ def get_or_delete_query_logging_config_response(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ query_logging_config_id = parsed_url.path.rstrip("/").rsplit("/", 1)[1]
+
+ if request.method == "GET":
+ query_logging_config = route53_backend.get_query_logging_config(
+ query_logging_config_id
+ )
+ template = Template(GET_QUERY_LOGGING_CONFIG_RESPONSE)
+ return (
+ 200,
+ headers,
+ template.render(query_logging_config=query_logging_config, xmlns=XMLNS),
+ )
+
+ elif request.method == "DELETE":
+ route53_backend.delete_query_logging_config(query_logging_config_id)
+ return 200, headers, ""
+
+ def reusable_delegation_sets(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "GET":
+ delegation_sets = route53_backend.list_reusable_delegation_sets()
+ template = self.response_template(LIST_REUSABLE_DELEGATION_SETS_TEMPLATE)
+ return (
+ 200,
+ {},
+ template.render(
+ delegation_sets=delegation_sets,
+ marker=None,
+ is_truncated=False,
+ max_items=100,
+ ),
+ )
+ elif request.method == "POST":
+ elements = xmltodict.parse(self.body)
+ root_elem = elements["CreateReusableDelegationSetRequest"]
+ caller_reference = root_elem.get("CallerReference")
+ hosted_zone_id = root_elem.get("HostedZoneId")
+ delegation_set = route53_backend.create_reusable_delegation_set(
+ caller_reference=caller_reference, hosted_zone_id=hosted_zone_id
+ )
+ template = self.response_template(CREATE_REUSABLE_DELEGATION_SET_TEMPLATE)
+ return (
+ 201,
+ {"Location": delegation_set.location},
+ template.render(delegation_set=delegation_set),
+ )
+
+ def reusable_delegation_set(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ parsed_url = urlparse(full_url)
+ ds_id = parsed_url.path.rstrip("/").rsplit("/")[-1]
+ if request.method == "GET":
+ delegation_set = route53_backend.get_reusable_delegation_set(
+ delegation_set_id=ds_id
+ )
+ template = self.response_template(GET_REUSABLE_DELEGATION_SET_TEMPLATE)
+ return 200, {}, template.render(delegation_set=delegation_set)
+ if request.method == "DELETE":
+ route53_backend.delete_reusable_delegation_set(delegation_set_id=ds_id)
+ template = self.response_template(DELETE_REUSABLE_DELEGATION_SET_TEMPLATE)
+ return 200, {}, template.render()
+
+
+LIST_TAGS_FOR_RESOURCE_RESPONSE = """
+<ListTagsForResourceResponse xmlns="https://route53.amazonaws.com/doc/2015-01-01/">
+ <ResourceTagSet>
+ <ResourceType>{{resource_type}}</ResourceType>
+ <ResourceId>{{resource_id}}</ResourceId>
+ <Tags>
+ {% for key, value in tags.items() %}
+ <Tag>
+ <Key>{{key}}</Key>
+ <Value>{{value}}</Value>
+ </Tag>
+ {% endfor %}
+ </Tags>
+ </ResourceTagSet>
+</ListTagsForResourceResponse>
+"""
+
+CHANGE_TAGS_FOR_RESOURCE_RESPONSE = """<ChangeTagsForResourceResponse xmlns="https://route53.amazonaws.com/doc/2015-01-01/">
+</ChangeTagsForResourceResponse>
+"""
+
+LIST_RRSET_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ResourceRecordSets>
+ {% for record in record_sets %}
+ <ResourceRecordSet>
+ <Name>{{ record.name }}</Name>
+ <Type>{{ record.type_ }}</Type>
+ {% if record.set_identifier %}
+ <SetIdentifier>{{ record.set_identifier }}</SetIdentifier>
+ {% endif %}
+ {% if record.weight %}
+ <Weight>{{ record.weight }}</Weight>
+ {% endif %}
+ {% if record.region %}
+ <Region>{{ record.region }}</Region>
+ {% endif %}
+ {% if record.ttl %}
+ <TTL>{{ record.ttl }}</TTL>
+ {% endif %}
+ {% if record.failover %}
+ <Failover>{{ record.failover }}</Failover>
+ {% endif %}
+ {% if record.geo_location %}
+ <GeoLocation>
+ {% for geo_key in ['ContinentCode','CountryCode','SubdivisionCode'] %}
+ {% if record.geo_location[geo_key] %}<{{ geo_key }}>{{ record.geo_location[geo_key] }}</{{ geo_key }}>{% endif %}
+ {% endfor %}
+ </GeoLocation>
+ {% endif %}
+ {% if record.alias_target %}
+ <AliasTarget>
+ <HostedZoneId>{{ record.alias_target['HostedZoneId'] }}</HostedZoneId>
+ <DNSName>{{ record.alias_target['DNSName'] }}</DNSName>
+ <EvaluateTargetHealth>{{ record.alias_target['EvaluateTargetHealth'] }}</EvaluateTargetHealth>
+ </AliasTarget>
+ {% else %}
+ <ResourceRecords>
+ {% for resource in record.records %}
+ <ResourceRecord>
+ <Value><![CDATA[{{ resource }}]]></Value>
+ </ResourceRecord>
+ {% endfor %}
+ </ResourceRecords>
+ {% endif %}
+ {% if record.health_check %}
+ <HealthCheckId>{{ record.health_check }}</HealthCheckId>
+ {% endif %}
+ </ResourceRecordSet>
+ {% endfor %}
+ </ResourceRecordSets>
+ {% if is_truncated %}<NextRecordName>{{ next_name }}</NextRecordName>{% endif %}
+ {% if is_truncated %}<NextRecordType>{{ next_type }}</NextRecordType>{% endif %}
+ <MaxItems>{{ max_items }}</MaxItems>
+ <IsTruncated>{{ 'true' if is_truncated else 'false' }}</IsTruncated>
+</ListResourceRecordSetsResponse>"""
+
+CHANGE_RRSET_RESPONSE = """<ChangeResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ChangeInfo>
+ <Status>INSYNC</Status>
+ <SubmittedAt>2010-09-10T01:36:41.958Z</SubmittedAt>
+ <Id>/change/C2682N5HXP0BZ4</Id>
+ </ChangeInfo>
+</ChangeResourceRecordSetsResponse>"""
+
+DELETE_HOSTED_ZONE_RESPONSE = """<DeleteHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <ChangeInfo>
+ </ChangeInfo>
+</DeleteHostedZoneResponse>"""
+
+GET_HOSTED_ZONE_COUNT_RESPONSE = """<GetHostedZoneCountResponse> xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZoneCount>{{ zone_count }}</HostedZoneCount>
+</GetHostedZoneCountResponse>"""
+
+
+GET_HOSTED_ZONE_RESPONSE = """<GetHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ 'true' if zone.private_zone else 'false' }}</PrivateZone>
+ </Config>
+ </HostedZone>
+ <DelegationSet>
+ <Id>{{ zone.delegation_set.id }}</Id>
+ <NameServers>
+ {% for name in zone.delegation_set.name_servers %}<NameServer>{{ name }}</NameServer>{% endfor %}
+ </NameServers>
+ </DelegationSet>
+ <VPCs>
+ <VPC>
+ <VPCId>{{zone.vpcid}}</VPCId>
+ <VPCRegion>{{zone.vpcregion}}</VPCRegion>
+ </VPC>
+ </VPCs>
+
+</GetHostedZoneResponse>"""
+
+CREATE_HOSTED_ZONE_RESPONSE = """<CreateHostedZoneResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <ResourceRecordSetCount>0</ResourceRecordSetCount>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ 'true' if zone.private_zone else 'false' }}</PrivateZone>
+ </Config>
+ </HostedZone>
+ <DelegationSet>
+ <Id>{{ zone.delegation_set.id }}</Id>
+ <NameServers>
+ {% for name in zone.delegation_set.name_servers %}<NameServer>{{ name }}</NameServer>{% endfor %}
+ </NameServers>
+ </DelegationSet>
+ <VPC>
+ <VPCId>{{zone.vpcid}}</VPCId>
+ <VPCRegion>{{zone.vpcregion}}</VPCRegion>
+ </VPC>
+</CreateHostedZoneResponse>"""
+
+LIST_HOSTED_ZONES_RESPONSE = """<ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
+ <HostedZones>
+ {% for zone in zones %}
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ 'true' if zone.private_zone else 'false' }}</PrivateZone>
+ </Config>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ </HostedZone>
+ {% endfor %}
+ </HostedZones>
+ <IsTruncated>false</IsTruncated>
+</ListHostedZonesResponse>"""
+
+LIST_HOSTED_ZONES_BY_NAME_RESPONSE = """<ListHostedZonesByNameResponse xmlns="{{ xmlns }}">
+ {% if dnsname %}
+ <DNSName>{{ dnsname }}</DNSName>
+ {% endif %}
+ <HostedZones>
+ {% for zone in zones %}
+ <HostedZone>
+ <Id>/hostedzone/{{ zone.id }}</Id>
+ <Name>{{ zone.name }}</Name>
+ <Config>
+ {% if zone.comment %}
+ <Comment>{{ zone.comment }}</Comment>
+ {% endif %}
+ <PrivateZone>{{ 'true' if zone.private_zone else 'false' }}</PrivateZone>
+ </Config>
+ <ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
+ </HostedZone>
+ {% endfor %}
+ </HostedZones>
+ <IsTruncated>false</IsTruncated>
+</ListHostedZonesByNameResponse>"""
+
+LIST_HOSTED_ZONES_BY_VPC_RESPONSE = """<ListHostedZonesByVpcResponse xmlns="{{xmlns}}">
+ <HostedZoneSummaries>
+ {% for zone in zones -%}
+ <HostedZoneSummary>
+ <HostedZoneId>{{zone["HostedZoneId"]}}</HostedZoneId>
+ <Name>{{zone["Name"]}}</Name>
+ <Owner>
+ {% if zone["Owner"]["OwningAccount"] -%}
+ <OwningAccount>{{zone["Owner"]["OwningAccount"]}}</OwningAccount>
+ {% endif -%}
+ {% if zone["Owner"]["OwningService"] -%}
+ <OwningService>zone["Owner"]["OwningService"]</OwningService>
+ {% endif -%}
+ </Owner>
+ </HostedZoneSummary>
+ {% endfor -%}
+ </HostedZoneSummaries>
+</ListHostedZonesByVpcResponse>"""
+
+CREATE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CreateHealthCheckResponse xmlns="{{ xmlns }}">
+ {{ health_check.to_xml() }}
+</CreateHealthCheckResponse>"""
+
+LIST_HEALTH_CHECKS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListHealthChecksResponse xmlns="{{ xmlns }}">
+ <HealthChecks>
+ {% for health_check in health_checks %}
+ {{ health_check.to_xml() }}
+ {% endfor %}
+ </HealthChecks>
+ <IsTruncated>false</IsTruncated>
+ <MaxItems>{{ health_checks|length }}</MaxItems>
+</ListHealthChecksResponse>"""
+
+DELETE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <DeleteHealthCheckResponse xmlns="{{ xmlns }}">
+</DeleteHealthCheckResponse>"""
+
+GET_CHANGE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<GetChangeResponse xmlns="{{ xmlns }}">
+ <ChangeInfo>
+ <Status>INSYNC</Status>
+ <SubmittedAt>2010-09-10T01:36:41.958Z</SubmittedAt>
+ <Id>{{ change_id }}</Id>
+ </ChangeInfo>
+</GetChangeResponse>"""
+
+CREATE_QUERY_LOGGING_CONFIG_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CreateQueryLoggingConfigResponse xmlns="{{ xmlns }}">
+ {{ query_logging_config.to_xml() }}
+</CreateQueryLoggingConfigResponse>"""
+
+GET_QUERY_LOGGING_CONFIG_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CreateQueryLoggingConfigResponse xmlns="{{ xmlns }}">
+ {{ query_logging_config.to_xml() }}
+</CreateQueryLoggingConfigResponse>"""
+
+LIST_QUERY_LOGGING_CONFIGS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListQueryLoggingConfigsResponse xmlns="{{ xmlns }}">
+ <QueryLoggingConfigs>
+ {% for query_logging_config in query_logging_configs %}
+ {{ query_logging_config.to_xml() }}
+ {% endfor %}
+ </QueryLoggingConfigs>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+</ListQueryLoggingConfigsResponse>"""
+
+
+CREATE_REUSABLE_DELEGATION_SET_TEMPLATE = """<CreateReusableDelegationSetResponse>
+ <DelegationSet>
+ <Id>{{ delegation_set.id }}</Id>
+ <CallerReference>{{ delegation_set.caller_reference }}</CallerReference>
+ <NameServers>
+ {% for name in delegation_set.name_servers %}<NameServer>{{ name }}</NameServer>{% endfor %}
+ </NameServers>
+ </DelegationSet>
+</CreateReusableDelegationSetResponse>
+"""
+
+
+LIST_REUSABLE_DELEGATION_SETS_TEMPLATE = """<ListReusableDelegationSetsResponse>
+ <DelegationSets>
+ {% for delegation in delegation_sets %}
+ <DelegationSet>
+ <Id>{{ delegation.id }}</Id>
+ <CallerReference>{{ delegation.caller_reference }}</CallerReference>
+ <NameServers>
+ {% for name in delegation.name_servers %}<NameServer>{{ name }}</NameServer>{% endfor %}
+ </NameServers>
+</DelegationSet>
+ {% endfor %}
+ </DelegationSets>
+ <Marker>{{ marker }}</Marker>
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ <MaxItems>{{ max_items }}</MaxItems>
+</ListReusableDelegationSetsResponse>
+"""
+
+
+DELETE_REUSABLE_DELEGATION_SET_TEMPLATE = """<DeleteReusableDelegationSetResponse>
+ <DeleteReusableDelegationSetResponse/>
+</DeleteReusableDelegationSetResponse>
+"""
+
+GET_REUSABLE_DELEGATION_SET_TEMPLATE = """<GetReusableDelegationSetResponse>
+<DelegationSet>
+ <Id>{{ delegation_set.id }}</Id>
+ <CallerReference>{{ delegation_set.caller_reference }}</CallerReference>
+ <NameServers>
+ {% for name in delegation_set.name_servers %}<NameServer>{{ name }}</NameServer>{% endfor %}
+ </NameServers>
+</DelegationSet>
+</GetReusableDelegationSetResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/route53/urls.py b/contrib/python/moto/py3/moto/route53/urls.py
new file mode 100644
index 0000000000..ee38c638d6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/urls.py
@@ -0,0 +1,32 @@
+"""Route53 base URL and path."""
+from .responses import Route53
+
+url_bases = [r"https?://route53(\..+)?\.amazonaws.com"]
+
+
+def tag_response1(*args, **kwargs):
+ return Route53().list_or_change_tags_for_resource_request(*args, **kwargs)
+
+
+def tag_response2(*args, **kwargs):
+ return Route53().list_or_change_tags_for_resource_request(*args, **kwargs)
+
+
+url_paths = {
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzone$": Route53().list_or_create_hostzone_response,
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$": Route53().get_or_delete_hostzone_response,
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$": Route53().rrset_response,
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname": Route53().list_hosted_zones_by_name_response,
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzonesbyvpc": Route53().list_hosted_zones_by_vpc_response,
+ r"{0}/(?P<api_version>[\d_-]+)/hostedzonecount": Route53().get_hosted_zone_count_response,
+ r"{0}/(?P<api_version>[\d_-]+)/healthcheck": Route53().health_check_response,
+ r"{0}/(?P<api_version>[\d_-]+)/healthcheck/(?P<health_check_id>[^/]+)$": Route53().health_check_response,
+ r"{0}/(?P<api_version>[\d_-]+)/tags/healthcheck/(?P<zone_id>[^/]+)$": tag_response1,
+ r"{0}/(?P<api_version>[\d_-]+)/tags/hostedzone/(?P<zone_id>[^/]+)$": tag_response2,
+ r"{0}/(?P<api_version>[\d_-]+)/trafficpolicyinstances/*": Route53().not_implemented_response,
+ r"{0}/(?P<api_version>[\d_-]+)/change/(?P<change_id>[^/]+)$": Route53().get_change,
+ r"{0}/(?P<api_version>[\d_-]+)/queryloggingconfig$": Route53().list_or_create_query_logging_config_response,
+ r"{0}/(?P<api_version>[\d_-]+)/queryloggingconfig/(?P<query_id>[^/]+)$": Route53().get_or_delete_query_logging_config_response,
+ r"{0}/(?P<api_version>[\d_-]+)/delegationset$": Route53().reusable_delegation_sets,
+ r"{0}/(?P<api_version>[\d_-]+)/delegationset/(?P<delegation_set_id>[^/]+)$": Route53().reusable_delegation_set,
+}
diff --git a/contrib/python/moto/py3/moto/route53/utils.py b/contrib/python/moto/py3/moto/route53/utils.py
new file mode 100644
index 0000000000..2e7ae43877
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53/utils.py
@@ -0,0 +1,12 @@
+"""Pagination control model for Route53."""
+from .exceptions import InvalidPaginationToken
+
+PAGINATION_MODEL = {
+ "list_query_logging_configs": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "hosted_zone_id",
+ "fail_on_invalid_token": InvalidPaginationToken,
+ },
+}
diff --git a/contrib/python/moto/py3/moto/route53resolver/__init__.py b/contrib/python/moto/py3/moto/route53resolver/__init__.py
new file mode 100644
index 0000000000..ae5d8b0003
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/__init__.py
@@ -0,0 +1,5 @@
+"""route53resolver module initialization; sets value for base decorator."""
+from .models import route53resolver_backends
+from ..core.models import base_decorator
+
+mock_route53resolver = base_decorator(route53resolver_backends)
diff --git a/contrib/python/moto/py3/moto/route53resolver/exceptions.py b/contrib/python/moto/py3/moto/route53resolver/exceptions.py
new file mode 100644
index 0000000000..8daf7efdf8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/exceptions.py
@@ -0,0 +1,104 @@
+"""Exceptions raised by the route53resolver service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class RRValidationException(JsonRESTError):
+ """Report one of more parameter validation errors."""
+
+ code = 400
+
+ def __init__(self, error_tuples):
+ """Validation errors are concatenated into one exception message.
+
+ error_tuples is a list of tuples. Each tuple contains:
+
+ - name of invalid parameter,
+ - value of invalid parameter,
+ - string describing the constraints for that parameter.
+ """
+ msg_leader = (
+ f"{len(error_tuples)} "
+ f"validation error{'s' if len(error_tuples) > 1 else ''} detected: "
+ )
+ msgs = []
+ for arg_name, arg_value, constraint in error_tuples:
+ msgs.append(
+ f"Value '{arg_value}' at '{arg_name}' failed to satisfy "
+ f"constraint: Member must {constraint}"
+ )
+ super().__init__("ValidationException", msg_leader + "; ".join(msgs))
+
+
+class InvalidNextTokenException(JsonRESTError):
+ """Invalid next token parameter used to return a list of entities."""
+
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidNextTokenException",
+ "Invalid value passed for the NextToken parameter",
+ )
+
+
+class InvalidParameterException(JsonRESTError):
+ """One or more parameters in request are not valid."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterException", message)
+
+
+class InvalidRequestException(JsonRESTError):
+ """The request is invalid."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidRequestException", message)
+
+
+class LimitExceededException(JsonRESTError):
+ """The request caused one or more limits to be exceeded."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("LimitExceededException", message)
+
+
+class ResourceExistsException(JsonRESTError):
+ """The resource already exists."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceExistsException", message)
+
+
+class ResourceInUseException(JsonRESTError):
+ """The resource has other resources associated with it."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceInUseException", message)
+
+
+class ResourceNotFoundException(JsonRESTError):
+ """The specified resource doesn't exist."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ResourceNotFoundException", message)
+
+
+class TagValidationException(JsonRESTError):
+ """Tag validation failed."""
+
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/route53resolver/models.py b/contrib/python/moto/py3/moto/route53resolver/models.py
new file mode 100644
index 0000000000..8a8dce8121
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/models.py
@@ -0,0 +1,833 @@
+"""Route53ResolverBackend class with methods for supported APIs."""
+from collections import defaultdict
+from datetime import datetime, timezone
+from ipaddress import ip_address, ip_network, IPv4Address
+import re
+
+from moto.core import get_account_id
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import get_random_hex, BackendDict
+from moto.ec2 import ec2_backends
+from moto.ec2.exceptions import InvalidSubnetIdError
+from moto.ec2.exceptions import InvalidSecurityGroupNotFoundError
+from moto.route53resolver.exceptions import (
+ InvalidParameterException,
+ InvalidRequestException,
+ LimitExceededException,
+ ResourceExistsException,
+ ResourceInUseException,
+ ResourceNotFoundException,
+ TagValidationException,
+)
+from moto.route53resolver.utils import PAGINATION_MODEL
+from moto.route53resolver.validations import validate_args
+
+from moto.utilities.paginator import paginate
+from moto.utilities.tagging_service import TaggingService
+
+CAMEL_TO_SNAKE_PATTERN = re.compile(r"(?<!^)(?=[A-Z])")
+
+
+class ResolverRuleAssociation(BaseModel): # pylint: disable=too-few-public-methods
+ """Representation of a fake Route53 Resolver Rules Association."""
+
+ MAX_TAGS_PER_RESOLVER_ENDPOINT = 200
+ MAX_RULE_ASSOCIATIONS_PER_REGION = 2000
+
+ # There are two styles of filter names and either will be transformed
+ # into lowercase snake.
+ FILTER_NAMES = [
+ "name",
+ "resolver_rule_id",
+ "status",
+ "vpc_id",
+ ]
+
+ def __init__(
+ self, region, resolver_rule_association_id, resolver_rule_id, vpc_id, name=None
+ ): # pylint: disable=too-many-arguments
+ self.region = region
+ self.resolver_rule_id = resolver_rule_id
+ self.name = name
+ self.vpc_id = vpc_id
+
+ # Constructed members.
+ self.id = resolver_rule_association_id # pylint: disable=invalid-name
+ self.status = "COMPLETE"
+ self.status_message = ""
+
+ def description(self):
+ """Return dictionary of relevant info for resolver rule association."""
+ return {
+ "Id": self.id,
+ "ResolverRuleId": self.resolver_rule_id,
+ "Name": self.name,
+ "VPCId": self.vpc_id,
+ "Status": self.status,
+ "StatusMessage": self.status_message,
+ }
+
+
+class ResolverRule(BaseModel): # pylint: disable=too-many-instance-attributes
+ """Representation of a fake Route53 Resolver Rule."""
+
+ MAX_TAGS_PER_RESOLVER_RULE = 200
+ MAX_RULES_PER_REGION = 1000
+
+ # There are two styles of filter names and either will be transformed
+ # into lowercase snake.
+ FILTER_NAMES = [
+ "creator_request_id",
+ "domain_name",
+ "name",
+ "resolver_endpoint_id",
+ "status",
+ "rule_type", # actual filter is "Type"
+ ]
+
+ def __init__(
+ self,
+ region,
+ rule_id,
+ creator_request_id,
+ rule_type,
+ domain_name,
+ target_ips=None,
+ resolver_endpoint_id=None,
+ name=None,
+ ): # pylint: disable=too-many-arguments
+ self.region = region
+ self.creator_request_id = creator_request_id
+ self.name = name
+ self.rule_id = rule_id
+ self.rule_type = rule_type
+ self.domain_name = domain_name + "."
+ self.target_ips = target_ips
+ self.resolver_endpoint_id = resolver_endpoint_id
+
+ # Constructed members.
+ self.id = rule_id # pylint: disable=invalid-name
+ self.status = "COMPLETE"
+
+ # The status message should contain a trace Id which is the value
+ # of X-Amzn-Trace-Id. We don't have that info, so a random number
+ # of similar format and length will be used.
+ self.status_message = (
+ f"[Trace id: 1-{get_random_hex(8)}-{get_random_hex(24)}] "
+ f"Successfully created Resolver Rule"
+ )
+ self.share_status = "SHARED_WITH_ME"
+ self.creation_time = datetime.now(timezone.utc).isoformat()
+ self.modification_time = datetime.now(timezone.utc).isoformat()
+
+ @property
+ def arn(self):
+ """Return ARN for this resolver rule."""
+ return f"arn:aws:route53resolver:{self.region}:{get_account_id()}:resolver-rule/{self.id}"
+
+ def description(self):
+ """Return a dictionary of relevant info for this resolver rule."""
+ return {
+ "Id": self.id,
+ "CreatorRequestId": self.creator_request_id,
+ "Arn": self.arn,
+ "DomainName": self.domain_name,
+ "Status": self.status,
+ "StatusMessage": self.status_message,
+ "RuleType": self.rule_type,
+ "Name": self.name,
+ "TargetIps": self.target_ips,
+ "ResolverEndpointId": self.resolver_endpoint_id,
+ "OwnerId": get_account_id(),
+ "ShareStatus": self.share_status,
+ "CreationTime": self.creation_time,
+ "ModificationTime": self.modification_time,
+ }
+
+
+class ResolverEndpoint(BaseModel): # pylint: disable=too-many-instance-attributes
+ """Representation of a fake Route53 Resolver Endpoint."""
+
+ MAX_TAGS_PER_RESOLVER_ENDPOINT = 200
+ MAX_ENDPOINTS_PER_REGION = 4
+
+ # There are two styles of filter names and either will be transformed
+ # into lowercase snake.
+ FILTER_NAMES = [
+ "creator_request_id",
+ "direction",
+ "host_vpc_id",
+ "ip_address_count",
+ "name",
+ "security_group_ids",
+ "status",
+ ]
+
+ def __init__(
+ self,
+ region,
+ endpoint_id,
+ creator_request_id,
+ security_group_ids,
+ direction,
+ ip_addresses,
+ name=None,
+ ): # pylint: disable=too-many-arguments
+ self.region = region
+ self.creator_request_id = creator_request_id
+ self.name = name
+ self.security_group_ids = security_group_ids
+ self.direction = direction
+ self.ip_addresses = ip_addresses
+
+ # Constructed members.
+ self.id = endpoint_id # pylint: disable=invalid-name
+
+ # NOTE; This currently doesn't reflect IPv6 addresses.
+ self.subnets = self._build_subnet_info()
+ self.eni_ids = self.create_eni()
+ self.ip_address_count = len(ip_addresses)
+
+ self.host_vpc_id = self._vpc_id_from_subnet()
+ self.status = "OPERATIONAL"
+
+ # The status message should contain a trace Id which is the value
+ # of X-Amzn-Trace-Id. We don't have that info, so a random number
+ # of similar format and length will be used.
+ self.status_message = (
+ f"[Trace id: 1-{get_random_hex(8)}-{get_random_hex(24)}] "
+ f"Successfully created Resolver Endpoint"
+ )
+ self.creation_time = datetime.now(timezone.utc).isoformat()
+ self.modification_time = datetime.now(timezone.utc).isoformat()
+
+ @property
+ def arn(self):
+ """Return ARN for this resolver endpoint."""
+ return f"arn:aws:route53resolver:{self.region}:{get_account_id()}:resolver-endpoint/{self.id}"
+
+ def _vpc_id_from_subnet(self):
+ """Return VPC Id associated with the subnet.
+
+ The assumption is that all of the subnets are associated with the
+ same VPC. We don't check that assumption, but otherwise the existence
+ of the subnets has already been checked.
+ """
+ first_subnet_id = self.ip_addresses[0]["SubnetId"]
+ subnet_info = ec2_backends[self.region].get_all_subnets(
+ subnet_ids=[first_subnet_id]
+ )[0]
+ return subnet_info.vpc_id
+
+ def _build_subnet_info(self):
+ """Create a dict of subnet info, including ip addrs and ENI ids.
+
+ self.subnets[subnet_id][ip_addr1] = eni-id1 ...
+ """
+ subnets = defaultdict(dict)
+ for entry in self.ip_addresses:
+ subnets[entry["SubnetId"]][entry["Ip"]] = f"rni-{get_random_hex(17)}"
+ return subnets
+
+ def create_eni(self):
+ """Create a VPC ENI for each combo of AZ, subnet and IP."""
+ eni_ids = []
+ for subnet, ip_info in self.subnets.items():
+ for ip_addr, eni_id in ip_info.items():
+ eni_info = ec2_backends[self.region].create_network_interface(
+ description=f"Route 53 Resolver: {self.id}:{eni_id}",
+ group_ids=self.security_group_ids,
+ interface_type="interface",
+ private_ip_address=ip_addr,
+ private_ip_addresses=[
+ {"Primary": True, "PrivateIpAddress": ip_addr}
+ ],
+ subnet=subnet,
+ )
+ eni_ids.append(eni_info.id)
+ return eni_ids
+
+ def delete_eni(self):
+ """Delete the VPC ENI created for the subnet and IP combos."""
+ for eni_id in self.eni_ids:
+ ec2_backends[self.region].delete_network_interface(eni_id)
+
+ def description(self):
+ """Return a dictionary of relevant info for this resolver endpoint."""
+ return {
+ "Id": self.id,
+ "CreatorRequestId": self.creator_request_id,
+ "Arn": self.arn,
+ "Name": self.name,
+ "SecurityGroupIds": self.security_group_ids,
+ "Direction": self.direction,
+ "IpAddressCount": self.ip_address_count,
+ "HostVPCId": self.host_vpc_id,
+ "Status": self.status,
+ "StatusMessage": self.status_message,
+ "CreationTime": self.creation_time,
+ "ModificationTime": self.modification_time,
+ }
+
+ def ip_descriptions(self):
+ """Return a list of dicts describing resolver endpoint IP addresses."""
+ description = []
+ for subnet_id, ip_info in self.subnets.items():
+ for ip_addr, eni_id in ip_info.items():
+ description.append(
+ {
+ "IpId": eni_id,
+ "SubnetId": subnet_id,
+ "Ip": ip_addr,
+ "Status": "ATTACHED",
+ "StatusMessage": "This IP address is operational.",
+ "CreationTime": self.creation_time,
+ "ModificationTime": self.modification_time,
+ }
+ )
+ return description
+
+ def update_name(self, name):
+ """Replace existing name with new name."""
+ self.name = name
+ self.modification_time = datetime.now(timezone.utc).isoformat()
+
+
+class Route53ResolverBackend(BaseBackend):
+ """Implementation of Route53Resolver APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.resolver_endpoints = {} # Key is self-generated ID (endpoint_id)
+ self.resolver_rules = {} # Key is self-generated ID (rule_id)
+ self.resolver_rule_associations = {} # Key is resolver_rule_association_id)
+ self.tagger = TaggingService()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """List of dicts representing default VPC endpoints for this service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "route53resolver"
+ )
+
+ def associate_resolver_rule(self, region, resolver_rule_id, name, vpc_id):
+ """Return description for a newly created resolver rule association."""
+ validate_args(
+ [("resolverRuleId", resolver_rule_id), ("name", name), ("vPCId", vpc_id)]
+ )
+
+ associations = [
+ x for x in self.resolver_rule_associations.values() if x.region == region
+ ]
+ if len(associations) > ResolverRuleAssociation.MAX_RULE_ASSOCIATIONS_PER_REGION:
+ # This error message was not verified to be the same for AWS.
+ raise LimitExceededException(
+ f"Account '{get_account_id()}' has exceeded 'max-rule-association'"
+ )
+
+ if resolver_rule_id not in self.resolver_rules:
+ raise ResourceNotFoundException(
+ f"Resolver rule with ID '{resolver_rule_id}' does not exist."
+ )
+
+ vpcs = ec2_backends[region].describe_vpcs()
+ if vpc_id not in [x.id for x in vpcs]:
+ raise InvalidParameterException(f"The vpc ID '{vpc_id}' does not exist")
+
+ # Can't duplicate resolver rule, vpc id associations.
+ for association in self.resolver_rule_associations.values():
+ if (
+ resolver_rule_id == association.resolver_rule_id
+ and vpc_id == association.vpc_id
+ ):
+ raise InvalidRequestException(
+ f"Cannot associate rules with same domain name with same "
+ f"VPC. Conflict with resolver rule '{resolver_rule_id}'"
+ )
+
+ rule_association_id = f"rslvr-rrassoc-{get_random_hex(17)}"
+ rule_association = ResolverRuleAssociation(
+ region, rule_association_id, resolver_rule_id, vpc_id, name
+ )
+ self.resolver_rule_associations[rule_association_id] = rule_association
+ return rule_association
+
+ @staticmethod
+ def _verify_subnet_ips(region, ip_addresses):
+ """Perform additional checks on the IPAddresses.
+
+ NOTE: This does not include IPv6 addresses.
+ """
+ if len(ip_addresses) < 2:
+ raise InvalidRequestException(
+ "Resolver endpoint needs to have at least 2 IP addresses"
+ )
+
+ subnets = defaultdict(set)
+ for subnet_id, ip_addr in [(x["SubnetId"], x["Ip"]) for x in ip_addresses]:
+ try:
+ subnet_info = ec2_backends[region].get_all_subnets(
+ subnet_ids=[subnet_id]
+ )[0]
+ except InvalidSubnetIdError as exc:
+ raise InvalidParameterException(
+ f"The subnet ID '{subnet_id}' does not exist"
+ ) from exc
+
+ # IP in IPv4 CIDR range and not reserved?
+ if ip_address(ip_addr) in subnet_info.reserved_ips or ip_address(
+ ip_addr
+ ) not in ip_network(subnet_info.cidr_block):
+ raise InvalidRequestException(
+ f"IP address '{ip_addr}' is either not in subnet "
+ f"'{subnet_id}' CIDR range or is reserved"
+ )
+
+ if ip_addr in subnets[subnet_id]:
+ raise ResourceExistsException(
+ f"The IP address '{ip_addr}' in subnet '{subnet_id}' is already in use"
+ )
+ subnets[subnet_id].add(ip_addr)
+
+ @staticmethod
+ def _verify_security_group_ids(region, security_group_ids):
+ """Perform additional checks on the security groups."""
+ if len(security_group_ids) > 10:
+ raise InvalidParameterException("Maximum of 10 security groups are allowed")
+
+ for group_id in security_group_ids:
+ if not group_id.startswith("sg-"):
+ raise InvalidParameterException(
+ f"Malformed security group ID: Invalid id: '{group_id}' "
+ f"(expecting 'sg-...')"
+ )
+ try:
+ ec2_backends[region].describe_security_groups(group_ids=[group_id])
+ except InvalidSecurityGroupNotFoundError as exc:
+ raise ResourceNotFoundException(
+ f"The security group '{group_id}' does not exist"
+ ) from exc
+
+ def create_resolver_endpoint(
+ self,
+ region,
+ creator_request_id,
+ name,
+ security_group_ids,
+ direction,
+ ip_addresses,
+ tags,
+ ): # pylint: disable=too-many-arguments
+ """Return description for a newly created resolver endpoint.
+
+ NOTE: IPv6 IPs are currently not being filtered when
+ calculating the create_resolver_endpoint() IpAddresses.
+ """
+ validate_args(
+ [
+ ("creatorRequestId", creator_request_id),
+ ("direction", direction),
+ ("ipAddresses", ip_addresses),
+ ("name", name),
+ ("securityGroupIds", security_group_ids),
+ ("ipAddresses.subnetId", ip_addresses),
+ ]
+ )
+ errmsg = self.tagger.validate_tags(
+ tags or [], limit=ResolverEndpoint.MAX_TAGS_PER_RESOLVER_ENDPOINT
+ )
+ if errmsg:
+ raise TagValidationException(errmsg)
+
+ endpoints = [x for x in self.resolver_endpoints.values() if x.region == region]
+ if len(endpoints) > ResolverEndpoint.MAX_ENDPOINTS_PER_REGION:
+ raise LimitExceededException(
+ f"Account '{get_account_id()}' has exceeded 'max-endpoints'"
+ )
+
+ self._verify_subnet_ips(region, ip_addresses)
+ self._verify_security_group_ids(region, security_group_ids)
+ if creator_request_id in [
+ x.creator_request_id for x in self.resolver_endpoints.values()
+ ]:
+ raise ResourceExistsException(
+ f"Resolver endpoint with creator request ID "
+ f"'{creator_request_id}' already exists"
+ )
+
+ endpoint_id = (
+ f"rslvr-{'in' if direction == 'INBOUND' else 'out'}-{get_random_hex(17)}"
+ )
+ resolver_endpoint = ResolverEndpoint(
+ region,
+ endpoint_id,
+ creator_request_id,
+ security_group_ids,
+ direction,
+ ip_addresses,
+ name,
+ )
+
+ self.resolver_endpoints[endpoint_id] = resolver_endpoint
+ self.tagger.tag_resource(resolver_endpoint.arn, tags or [])
+ return resolver_endpoint
+
+ def create_resolver_rule(
+ self,
+ region,
+ creator_request_id,
+ name,
+ rule_type,
+ domain_name,
+ target_ips,
+ resolver_endpoint_id,
+ tags,
+ ): # pylint: disable=too-many-arguments
+ """Return description for a newly created resolver rule."""
+ validate_args(
+ [
+ ("creatorRequestId", creator_request_id),
+ ("ruleType", rule_type),
+ ("domainName", domain_name),
+ ("name", name),
+ *[("targetIps.port", x) for x in target_ips],
+ ("resolverEndpointId", resolver_endpoint_id),
+ ]
+ )
+ errmsg = self.tagger.validate_tags(
+ tags or [], limit=ResolverRule.MAX_TAGS_PER_RESOLVER_RULE
+ )
+ if errmsg:
+ raise TagValidationException(errmsg)
+
+ rules = [x for x in self.resolver_rules.values() if x.region == region]
+ if len(rules) > ResolverRule.MAX_RULES_PER_REGION:
+ # Did not verify that this is the actual error message.
+ raise LimitExceededException(
+ f"Account '{get_account_id()}' has exceeded 'max-rules'"
+ )
+
+ # Per the AWS documentation and as seen with the AWS console, target
+ # ips are only relevant when the value of Rule is FORWARD. However,
+ # boto3 ignores this condition and so shall we.
+
+ for ip_addr in [x["Ip"] for x in target_ips]:
+ try:
+ # boto3 fails with an InternalServiceException if IPv6
+ # addresses are used, which isn't helpful.
+ if not isinstance(ip_address(ip_addr), IPv4Address):
+ raise InvalidParameterException(
+ f"Only IPv4 addresses may be used: '{ip_addr}'"
+ )
+ except ValueError as exc:
+ raise InvalidParameterException(
+ f"Invalid IP address: '{ip_addr}'"
+ ) from exc
+
+ # The boto3 documentation indicates that ResolverEndpoint is
+ # optional, as does the AWS documention. But if resolver_endpoint_id
+ # is set to None or an empty string, it results in boto3 raising
+ # a ParamValidationError either regarding the type or len of string.
+ if resolver_endpoint_id:
+ if resolver_endpoint_id not in [
+ x.id for x in self.resolver_endpoints.values()
+ ]:
+ raise ResourceNotFoundException(
+ f"Resolver endpoint with ID '{resolver_endpoint_id}' does not exist."
+ )
+
+ if rule_type == "SYSTEM":
+ raise InvalidRequestException(
+ "Cannot specify resolver endpoint ID and target IP "
+ "for SYSTEM type resolver rule"
+ )
+
+ if creator_request_id in [
+ x.creator_request_id for x in self.resolver_rules.values()
+ ]:
+ raise ResourceExistsException(
+ f"Resolver rule with creator request ID "
+ f"'{creator_request_id}' already exists"
+ )
+
+ rule_id = f"rslvr-rr-{get_random_hex(17)}"
+ resolver_rule = ResolverRule(
+ region,
+ rule_id,
+ creator_request_id,
+ rule_type,
+ domain_name,
+ target_ips,
+ resolver_endpoint_id,
+ name,
+ )
+
+ self.resolver_rules[rule_id] = resolver_rule
+ self.tagger.tag_resource(resolver_rule.arn, tags or [])
+ return resolver_rule
+
+ def _validate_resolver_endpoint_id(self, resolver_endpoint_id):
+ """Raise an exception if the id is invalid or unknown."""
+ validate_args([("resolverEndpointId", resolver_endpoint_id)])
+ if resolver_endpoint_id not in self.resolver_endpoints:
+ raise ResourceNotFoundException(
+ f"Resolver endpoint with ID '{resolver_endpoint_id}' does not exist"
+ )
+
+ def delete_resolver_endpoint(self, resolver_endpoint_id):
+ """Delete a resolver endpoint."""
+ self._validate_resolver_endpoint_id(resolver_endpoint_id)
+
+ # Can't delete an endpoint if there are rules associated with it.
+ rules = [
+ x.id
+ for x in self.resolver_rules.values()
+ if x.resolver_endpoint_id == resolver_endpoint_id
+ ]
+ if rules:
+ raise InvalidRequestException(
+ f"Cannot delete resolver endpoint unless its related resolver "
+ f"rules are deleted. The following rules still exist for "
+ f"this resolver endpoint: {','.join(rules)}"
+ )
+
+ self.tagger.delete_all_tags_for_resource(resolver_endpoint_id)
+ resolver_endpoint = self.resolver_endpoints.pop(resolver_endpoint_id)
+ resolver_endpoint.delete_eni()
+ resolver_endpoint.status = "DELETING"
+ resolver_endpoint.status_message = resolver_endpoint.status_message.replace(
+ "Successfully created", "Deleting"
+ )
+ return resolver_endpoint
+
+ def _validate_resolver_rule_id(self, resolver_rule_id):
+ """Raise an exception if the id is invalid or unknown."""
+ validate_args([("resolverRuleId", resolver_rule_id)])
+ if resolver_rule_id not in self.resolver_rules:
+ raise ResourceNotFoundException(
+ f"Resolver rule with ID '{resolver_rule_id}' does not exist"
+ )
+
+ def delete_resolver_rule(self, resolver_rule_id):
+ """Delete a resolver rule."""
+ self._validate_resolver_rule_id(resolver_rule_id)
+
+ # Can't delete an rule unless VPC's are disassociated.
+ associations = [
+ x.id
+ for x in self.resolver_rule_associations.values()
+ if x.resolver_rule_id == resolver_rule_id
+ ]
+ if associations:
+ raise ResourceInUseException(
+ "Please disassociate this resolver rule from VPC first "
+ "before deleting"
+ )
+
+ self.tagger.delete_all_tags_for_resource(resolver_rule_id)
+ resolver_rule = self.resolver_rules.pop(resolver_rule_id)
+ resolver_rule.status = "DELETING"
+ resolver_rule.status_message = resolver_rule.status_message.replace(
+ "Successfully created", "Deleting"
+ )
+ return resolver_rule
+
+ def disassociate_resolver_rule(self, resolver_rule_id, vpc_id):
+ """Removes association between a resolver rule and a VPC."""
+ validate_args([("resolverRuleId", resolver_rule_id), ("vPCId", vpc_id)])
+
+ # Non-existent rule or vpc ids?
+ if resolver_rule_id not in self.resolver_rules:
+ raise ResourceNotFoundException(
+ f"Resolver rule with ID '{resolver_rule_id}' does not exist"
+ )
+
+ # Find the matching association for this rule and vpc.
+ rule_association_id = None
+ for association in self.resolver_rule_associations.values():
+ if (
+ resolver_rule_id == association.resolver_rule_id
+ and vpc_id == association.vpc_id
+ ):
+ rule_association_id = association.id
+ break
+ else:
+ raise ResourceNotFoundException(
+ f"Resolver Rule Association between Resolver Rule "
+ f"'{resolver_rule_id}' and VPC '{vpc_id}' does not exist"
+ )
+
+ rule_association = self.resolver_rule_associations.pop(rule_association_id)
+ rule_association.status = "DELETING"
+ rule_association.status_message = "Deleting Association"
+ return rule_association
+
+ def get_resolver_endpoint(self, resolver_endpoint_id):
+ """Return info for specified resolver endpoint."""
+ self._validate_resolver_endpoint_id(resolver_endpoint_id)
+ return self.resolver_endpoints[resolver_endpoint_id]
+
+ def get_resolver_rule(self, resolver_rule_id):
+ """Return info for specified resolver rule."""
+ self._validate_resolver_rule_id(resolver_rule_id)
+ return self.resolver_rules[resolver_rule_id]
+
+ def get_resolver_rule_association(self, resolver_rule_association_id):
+ """Return info for specified resolver rule association."""
+ validate_args([("resolverRuleAssociationId", resolver_rule_association_id)])
+ if resolver_rule_association_id not in self.resolver_rule_associations:
+ raise ResourceNotFoundException(
+ f"ResolverRuleAssociation '{resolver_rule_association_id}' does not Exist"
+ )
+ return self.resolver_rule_associations[resolver_rule_association_id]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_resolver_endpoint_ip_addresses(self, resolver_endpoint_id):
+ """List IP endresses for specified resolver endpoint."""
+ self._validate_resolver_endpoint_id(resolver_endpoint_id)
+ endpoint = self.resolver_endpoints[resolver_endpoint_id]
+ return endpoint.ip_descriptions()
+
+ @staticmethod
+ def _add_field_name_to_filter(filters):
+ """Convert both styles of filter names to lowercase snake format.
+
+ "IP_ADDRESS_COUNT" or "IpAddressCount" will become "ip_address_count".
+ However, "HostVPCId" doesn't fit the pattern, so that's treated
+ special.
+ """
+ for rr_filter in filters:
+ filter_name = rr_filter["Name"]
+ if "_" not in filter_name:
+ if "Vpc" in filter_name:
+ filter_name = "WRONG"
+ elif filter_name == "HostVPCId":
+ filter_name = "host_vpc_id"
+ elif filter_name == "VPCId":
+ filter_name = "vpc_id"
+ elif filter_name in ["Type", "TYPE"]:
+ filter_name = "rule_type"
+ elif not filter_name.isupper():
+ filter_name = CAMEL_TO_SNAKE_PATTERN.sub("_", filter_name)
+ rr_filter["Field"] = filter_name.lower()
+
+ @staticmethod
+ def _validate_filters(filters, allowed_filter_names):
+ """Raise exception if filter names are not as expected."""
+ for rr_filter in filters:
+ if rr_filter["Field"] not in allowed_filter_names:
+ raise InvalidParameterException(
+ f"The filter '{rr_filter['Name']}' is invalid"
+ )
+ if "Values" not in rr_filter:
+ raise InvalidParameterException(
+ f"No values specified for filter {rr_filter['Name']}"
+ )
+
+ @staticmethod
+ def _matches_all_filters(entity, filters):
+ """Return True if this entity has fields matching all the filters."""
+ for rr_filter in filters:
+ field_value = getattr(entity, rr_filter["Field"])
+
+ if isinstance(field_value, list):
+ if not set(field_value).intersection(rr_filter["Values"]):
+ return False
+ elif isinstance(field_value, int):
+ if str(field_value) not in rr_filter["Values"]:
+ return False
+ elif field_value not in rr_filter["Values"]:
+ return False
+
+ return True
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_resolver_endpoints(self, filters):
+ """List all resolver endpoints, using filters if specified."""
+ if not filters:
+ filters = []
+
+ self._add_field_name_to_filter(filters)
+ self._validate_filters(filters, ResolverEndpoint.FILTER_NAMES)
+
+ endpoints = []
+ for endpoint in sorted(self.resolver_endpoints.values(), key=lambda x: x.name):
+ if self._matches_all_filters(endpoint, filters):
+ endpoints.append(endpoint)
+ return endpoints
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_resolver_rules(self, filters):
+ """List all resolver rules, using filters if specified."""
+ if not filters:
+ filters = []
+
+ self._add_field_name_to_filter(filters)
+ self._validate_filters(filters, ResolverRule.FILTER_NAMES)
+
+ rules = []
+ for rule in sorted(self.resolver_rules.values(), key=lambda x: x.name):
+ if self._matches_all_filters(rule, filters):
+ rules.append(rule)
+ return rules
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_resolver_rule_associations(self, filters):
+ """List all resolver rule associations, using filters if specified."""
+ if not filters:
+ filters = []
+
+ self._add_field_name_to_filter(filters)
+ self._validate_filters(filters, ResolverRuleAssociation.FILTER_NAMES)
+
+ rules = []
+ for rule in sorted(
+ self.resolver_rule_associations.values(), key=lambda x: x.name
+ ):
+ if self._matches_all_filters(rule, filters):
+ rules.append(rule)
+ return rules
+
+ def _matched_arn(self, resource_arn):
+ """Given ARN, raise exception if there is no corresponding resource."""
+ for resolver_endpoint in self.resolver_endpoints.values():
+ if resolver_endpoint.arn == resource_arn:
+ return
+ for resolver_rule in self.resolver_rules.values():
+ if resolver_rule.arn == resource_arn:
+ return
+ raise ResourceNotFoundException(
+ f"Resolver endpoint with ID '{resource_arn}' does not exist"
+ )
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_tags_for_resource(self, resource_arn):
+ """List all tags for the given resource."""
+ self._matched_arn(resource_arn)
+ return self.tagger.list_tags_for_resource(resource_arn).get("Tags")
+
+ def tag_resource(self, resource_arn, tags):
+ """Add or overwrite one or more tags for specified resource."""
+ self._matched_arn(resource_arn)
+ errmsg = self.tagger.validate_tags(
+ tags, limit=ResolverEndpoint.MAX_TAGS_PER_RESOLVER_ENDPOINT
+ )
+ if errmsg:
+ raise TagValidationException(errmsg)
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ """Removes tags from a resource."""
+ self._matched_arn(resource_arn)
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+ def update_resolver_endpoint(self, resolver_endpoint_id, name):
+ """Update name of Resolver endpoint."""
+ self._validate_resolver_endpoint_id(resolver_endpoint_id)
+ validate_args([("name", name)])
+ resolver_endpoint = self.resolver_endpoints[resolver_endpoint_id]
+ resolver_endpoint.update_name(name)
+ return resolver_endpoint
+
+
+route53resolver_backends = BackendDict(Route53ResolverBackend, "route53resolver")
diff --git a/contrib/python/moto/py3/moto/route53resolver/responses.py b/contrib/python/moto/py3/moto/route53resolver/responses.py
new file mode 100644
index 0000000000..19e155131b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/responses.py
@@ -0,0 +1,259 @@
+"""Handles incoming route53resolver requests/responses."""
+import json
+
+from moto.core.exceptions import InvalidToken
+from moto.core.responses import BaseResponse
+from moto.route53resolver.exceptions import InvalidNextTokenException
+from moto.route53resolver.models import route53resolver_backends
+from moto.route53resolver.validations import validate_args
+
+
+class Route53ResolverResponse(BaseResponse):
+ """Handler for Route53Resolver requests and responses."""
+
+ @property
+ def route53resolver_backend(self):
+ """Return backend instance specific for this region."""
+ return route53resolver_backends[self.region]
+
+ def associate_resolver_rule(self):
+ """Associate a Resolver rule with a VPC."""
+ resolver_rule_id = self._get_param("ResolverRuleId")
+ name = self._get_param("Name")
+ vpc_id = self._get_param("VPCId")
+ resolver_rule_association = (
+ self.route53resolver_backend.associate_resolver_rule(
+ region=self.region,
+ resolver_rule_id=resolver_rule_id,
+ name=name,
+ vpc_id=vpc_id,
+ )
+ )
+ return json.dumps(
+ {"ResolverRuleAssociation": resolver_rule_association.description()}
+ )
+
+ def create_resolver_endpoint(self):
+ """Create an inbound or outbound Resolver endpoint."""
+ creator_request_id = self._get_param("CreatorRequestId")
+ name = self._get_param("Name")
+ security_group_ids = self._get_param("SecurityGroupIds")
+ direction = self._get_param("Direction")
+ ip_addresses = self._get_param("IpAddresses")
+ tags = self._get_param("Tags", [])
+ resolver_endpoint = self.route53resolver_backend.create_resolver_endpoint(
+ region=self.region,
+ creator_request_id=creator_request_id,
+ name=name,
+ security_group_ids=security_group_ids,
+ direction=direction,
+ ip_addresses=ip_addresses,
+ tags=tags,
+ )
+ return json.dumps({"ResolverEndpoint": resolver_endpoint.description()})
+
+ def create_resolver_rule(self):
+ """Specify which Resolver enpoint the queries will pass through."""
+ creator_request_id = self._get_param("CreatorRequestId")
+ name = self._get_param("Name")
+ rule_type = self._get_param("RuleType")
+ domain_name = self._get_param("DomainName")
+ target_ips = self._get_param("TargetIps", [])
+ resolver_endpoint_id = self._get_param("ResolverEndpointId")
+ tags = self._get_param("Tags", [])
+ resolver_rule = self.route53resolver_backend.create_resolver_rule(
+ region=self.region,
+ creator_request_id=creator_request_id,
+ name=name,
+ rule_type=rule_type,
+ domain_name=domain_name,
+ target_ips=target_ips,
+ resolver_endpoint_id=resolver_endpoint_id,
+ tags=tags,
+ )
+ return json.dumps({"ResolverRule": resolver_rule.description()})
+
+ def delete_resolver_endpoint(self):
+ """Delete a Resolver endpoint."""
+ resolver_endpoint_id = self._get_param("ResolverEndpointId")
+ resolver_endpoint = self.route53resolver_backend.delete_resolver_endpoint(
+ resolver_endpoint_id=resolver_endpoint_id
+ )
+ return json.dumps({"ResolverEndpoint": resolver_endpoint.description()})
+
+ def delete_resolver_rule(self):
+ """Delete a Resolver rule."""
+ resolver_rule_id = self._get_param("ResolverRuleId")
+ resolver_rule = self.route53resolver_backend.delete_resolver_rule(
+ resolver_rule_id=resolver_rule_id
+ )
+ return json.dumps({"ResolverRule": resolver_rule.description()})
+
+ def disassociate_resolver_rule(self):
+ """Remove the association between a Resolver rule and a VPC."""
+ vpc_id = self._get_param("VPCId")
+ resolver_rule_id = self._get_param("ResolverRuleId")
+ resolver_rule_association = (
+ self.route53resolver_backend.disassociate_resolver_rule(
+ vpc_id=vpc_id, resolver_rule_id=resolver_rule_id
+ )
+ )
+ return json.dumps(
+ {"ResolverRuleAssociation": resolver_rule_association.description()}
+ )
+
+ def get_resolver_endpoint(self):
+ """Return info about a specific Resolver endpoint."""
+ resolver_endpoint_id = self._get_param("ResolverEndpointId")
+ resolver_endpoint = self.route53resolver_backend.get_resolver_endpoint(
+ resolver_endpoint_id=resolver_endpoint_id
+ )
+ return json.dumps({"ResolverEndpoint": resolver_endpoint.description()})
+
+ def get_resolver_rule(self):
+ """Return info about a specific Resolver rule."""
+ resolver_rule_id = self._get_param("ResolverRuleId")
+ resolver_rule = self.route53resolver_backend.get_resolver_rule(
+ resolver_rule_id=resolver_rule_id
+ )
+ return json.dumps({"ResolverRule": resolver_rule.description()})
+
+ def get_resolver_rule_association(self):
+ """Return info about association between a Resolver rule and a VPC."""
+ resolver_rule_association_id = self._get_param("ResolverRuleAssociationId")
+ resolver_rule_association = (
+ self.route53resolver_backend.get_resolver_rule_association(
+ resolver_rule_association_id=resolver_rule_association_id
+ )
+ )
+ return json.dumps(
+ {"ResolverRuleAssociation": resolver_rule_association.description()}
+ )
+
+ def list_resolver_endpoint_ip_addresses(self):
+ """Returns list of IP addresses for specified Resolver endpoint."""
+ resolver_endpoint_id = self._get_param("ResolverEndpointId")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 10)
+ validate_args([("maxResults", max_results)])
+ try:
+ (
+ ip_addresses,
+ next_token,
+ ) = self.route53resolver_backend.list_resolver_endpoint_ip_addresses(
+ resolver_endpoint_id=resolver_endpoint_id,
+ next_token=next_token,
+ max_results=max_results,
+ )
+ except InvalidToken as exc:
+ raise InvalidNextTokenException() from exc
+
+ response = {
+ "IpAddresses": ip_addresses,
+ "MaxResults": max_results,
+ }
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_resolver_endpoints(self):
+ """Returns list of all Resolver endpoints, filtered if specified."""
+ filters = self._get_param("Filters")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 10)
+ validate_args([("maxResults", max_results)])
+ endpoints, next_token = self.route53resolver_backend.list_resolver_endpoints(
+ filters, next_token=next_token, max_results=max_results
+ )
+
+ response = {
+ "ResolverEndpoints": [x.description() for x in endpoints],
+ "MaxResults": max_results,
+ }
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_resolver_rules(self):
+ """Returns list of all Resolver rules, filtered if specified."""
+ filters = self._get_param("Filters")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 10)
+ validate_args([("maxResults", max_results)])
+ try:
+ (rules, next_token) = self.route53resolver_backend.list_resolver_rules(
+ filters, next_token=next_token, max_results=max_results
+ )
+ except InvalidToken as exc:
+ raise InvalidNextTokenException() from exc
+
+ response = {
+ "ResolverRules": [x.description() for x in rules],
+ "MaxResults": max_results,
+ }
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_resolver_rule_associations(self):
+ """Returns list of all Resolver associations, filtered if specified."""
+ filters = self._get_param("Filters")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 10)
+ validate_args([("maxResults", max_results)])
+ try:
+ (
+ associations,
+ next_token,
+ ) = self.route53resolver_backend.list_resolver_rule_associations(
+ filters, next_token=next_token, max_results=max_results
+ )
+ except InvalidToken as exc:
+ raise InvalidNextTokenException() from exc
+
+ response = {
+ "ResolverRuleAssociations": [x.description() for x in associations],
+ "MaxResults": max_results,
+ }
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def list_tags_for_resource(self):
+ """Lists all tags for the given resource."""
+ resource_arn = self._get_param("ResourceArn")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults")
+ tags, next_token = self.route53resolver_backend.list_tags_for_resource(
+ resource_arn=resource_arn, next_token=next_token, max_results=max_results
+ )
+
+ response = {"Tags": tags}
+ if next_token:
+ response["NextToken"] = next_token
+ return json.dumps(response)
+
+ def tag_resource(self):
+ """Add one or more tags to a specified resource."""
+ resource_arn = self._get_param("ResourceArn")
+ tags = self._get_param("Tags")
+ self.route53resolver_backend.tag_resource(resource_arn=resource_arn, tags=tags)
+ return ""
+
+ def untag_resource(self):
+ """Removes one or more tags from the specified resource."""
+ resource_arn = self._get_param("ResourceArn")
+ tag_keys = self._get_param("TagKeys")
+ self.route53resolver_backend.untag_resource(
+ resource_arn=resource_arn, tag_keys=tag_keys
+ )
+ return ""
+
+ def update_resolver_endpoint(self):
+ """Update name of Resolver endpoint."""
+ resolver_endpoint_id = self._get_param("ResolverEndpointId")
+ name = self._get_param("Name")
+ resolver_endpoint = self.route53resolver_backend.update_resolver_endpoint(
+ resolver_endpoint_id=resolver_endpoint_id, name=name
+ )
+ return json.dumps({"ResolverEndpoint": resolver_endpoint.description()})
diff --git a/contrib/python/moto/py3/moto/route53resolver/urls.py b/contrib/python/moto/py3/moto/route53resolver/urls.py
new file mode 100644
index 0000000000..61a8ee5767
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/urls.py
@@ -0,0 +1,11 @@
+"""route53resolver base URL and path."""
+from .responses import Route53ResolverResponse
+
+url_bases = [
+ r"https?://route53resolver\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": Route53ResolverResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/route53resolver/utils.py b/contrib/python/moto/py3/moto/route53resolver/utils.py
new file mode 100644
index 0000000000..be13f2033d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/utils.py
@@ -0,0 +1,38 @@
+"""Pagination control model for Route53Resolver."""
+
+from .exceptions import InvalidNextTokenException
+
+PAGINATION_MODEL = {
+ "list_resolver_endpoint_ip_addresses": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "IpId",
+ },
+ "list_resolver_endpoints": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "id",
+ "fail_on_invalid_token": InvalidNextTokenException,
+ },
+ "list_resolver_rules": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "id",
+ },
+ "list_resolver_rule_associations": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "id",
+ },
+ "list_tags_for_resource": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": "Key",
+ "fail_on_invalid_token": InvalidNextTokenException,
+ },
+}
diff --git a/contrib/python/moto/py3/moto/route53resolver/validations.py b/contrib/python/moto/py3/moto/route53resolver/validations.py
new file mode 100644
index 0000000000..4c2f76d96d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/route53resolver/validations.py
@@ -0,0 +1,151 @@
+"""Route53ResolverBackend validations that result in ValidationException.
+
+Note that ValidationExceptions are accumulative.
+"""
+import re
+
+from moto.route53resolver.exceptions import RRValidationException
+
+
+def validate_args(validators):
+ """Raise exception if any of the validations fails.
+
+ validators is a list of tuples each containing the following:
+ (printable field name, field value)
+
+ The error messages are accumulated before the exception is raised.
+ """
+ validation_map = {
+ "creatorRequestId": validate_creator_request_id,
+ "direction": validate_direction,
+ "domainName": validate_domain_name,
+ "ipAddresses": validate_ip_addresses,
+ "ipAddresses.subnetId": validate_subnets,
+ "maxResults": validate_max_results,
+ "name": validate_name,
+ "resolverEndpointId": validate_endpoint_id,
+ "resolverRuleAssociationId": validate_rule_association_id,
+ "resolverRuleId": validate_rule_id,
+ "ruleType": validate_rule_type,
+ "securityGroupIds": validate_security_group_ids,
+ "targetIps.port": validate_target_port,
+ "vPCId": validate_vpc_id,
+ }
+
+ err_msgs = []
+ # This eventually could be a switch (python 3.10), eliminating the need
+ # for the above map and individual functions.
+ for (fieldname, value) in validators:
+ msg = validation_map[fieldname](value)
+ if msg:
+ err_msgs.append((fieldname, value, msg))
+ if err_msgs:
+ raise RRValidationException(err_msgs)
+
+
+def validate_creator_request_id(value):
+ """Raise exception if the creator_request_id has invalid length."""
+ if value and len(value) > 255:
+ return "have length less than or equal to 255"
+ return ""
+
+
+def validate_direction(value):
+ """Raise exception if direction not one of the allowed values."""
+ if value and value not in ["INBOUND", "OUTBOUND"]:
+ return "satisfy enum value set: [INBOUND, OUTBOUND]"
+ return ""
+
+
+def validate_domain_name(value):
+ """Raise exception if the domain_name has invalid length."""
+ if len(value) > 256:
+ return "have length less than or equal to 256"
+ return ""
+
+
+def validate_endpoint_id(value):
+ """Raise exception if resolver endpoint id has invalid length."""
+ if value and len(value) > 64:
+ return "have length less than or equal to 64"
+ return ""
+
+
+def validate_ip_addresses(value):
+ """Raise exception if IPs fail to match length constraint."""
+ if len(value) > 10:
+ return "have length less than or equal to 10"
+ return ""
+
+
+def validate_max_results(value):
+ """Raise exception if number of endpoints or IPs is too large."""
+ if value and value > 100:
+ return "have length less than or equal to 100"
+ return ""
+
+
+def validate_name(value):
+ """Raise exception if name fails to match constraints."""
+ if value:
+ if len(value) > 64:
+ return "have length less than or equal to 64"
+ name_pattern = r"^(?!^[0-9]+$)([a-zA-Z0-9-_' ']+)$"
+ if not re.match(name_pattern, value):
+ return rf"satisfy regular expression pattern: {name_pattern}"
+ return ""
+
+
+def validate_rule_association_id(value):
+ """Raise exception if resolver rule association id has invalid length."""
+ if value and len(value) > 64:
+ return "have length less than or equal to 64"
+ return ""
+
+
+def validate_rule_id(value):
+ """Raise exception if resolver rule id has invalid length."""
+ if value and len(value) > 64:
+ return "have length less than or equal to 64"
+ return ""
+
+
+def validate_rule_type(value):
+ """Raise exception if rule_type not one of the allowed values."""
+ if value and value not in ["FORWARD", "SYSTEM", "RECURSIVE"]:
+ return "satisfy enum value set: [FORWARD, SYSTEM, RECURSIVE]"
+ return ""
+
+
+def validate_security_group_ids(value):
+ """Raise exception if IPs fail to match length constraint."""
+ # Too many security group IDs is an InvalidParameterException.
+ for group_id in value:
+ if len(group_id) > 64:
+ return (
+ "have length less than or equal to 64 and Member must have "
+ "length greater than or equal to 1"
+ )
+ return ""
+
+
+def validate_subnets(value):
+ """Raise exception if subnets fail to match length constraint."""
+ for subnet_id in [x["SubnetId"] for x in value]:
+ if len(subnet_id) > 32:
+ return "have length less than or equal to 32"
+ return ""
+
+
+def validate_target_port(value):
+ """Raise exception if target port fails to match length constraint."""
+ if value and value["Port"] > 65535:
+ return "have value less than or equal to 65535"
+ return ""
+
+
+def validate_vpc_id(value):
+ """Raise exception if VPC id has invalid length."""
+ if len(value) > 64:
+ return "have length less than or equal to 64"
+ return ""
diff --git a/contrib/python/moto/py3/moto/s3/__init__.py b/contrib/python/moto/py3/moto/s3/__init__.py
new file mode 100644
index 0000000000..f34e495859
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/__init__.py
@@ -0,0 +1,4 @@
+from .models import s3_backends
+from ..core.models import base_decorator
+
+mock_s3 = base_decorator(s3_backends)
diff --git a/contrib/python/moto/py3/moto/s3/cloud_formation.py b/contrib/python/moto/py3/moto/s3/cloud_formation.py
new file mode 100644
index 0000000000..0bf6022ef4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/cloud_formation.py
@@ -0,0 +1,33 @@
+from collections import OrderedDict
+
+
+def cfn_to_api_encryption(bucket_encryption_properties):
+
+ sse_algorithm = bucket_encryption_properties["ServerSideEncryptionConfiguration"][
+ 0
+ ]["ServerSideEncryptionByDefault"]["SSEAlgorithm"]
+ kms_master_key_id = bucket_encryption_properties[
+ "ServerSideEncryptionConfiguration"
+ ][0]["ServerSideEncryptionByDefault"].get("KMSMasterKeyID")
+ apply_server_side_encryption_by_default = OrderedDict()
+ apply_server_side_encryption_by_default["SSEAlgorithm"] = sse_algorithm
+ if kms_master_key_id:
+ apply_server_side_encryption_by_default["KMSMasterKeyID"] = kms_master_key_id
+ rule = OrderedDict(
+ {"ApplyServerSideEncryptionByDefault": apply_server_side_encryption_by_default}
+ )
+ bucket_encryption = OrderedDict(
+ {"@xmlns": "http://s3.amazonaws.com/doc/2006-03-01/"}
+ )
+ bucket_encryption["Rule"] = rule
+ return bucket_encryption
+
+
+def is_replacement_update(properties):
+ properties_requiring_replacement_update = ["BucketName", "ObjectLockEnabled"]
+ return any(
+ [
+ property_requiring_replacement in properties
+ for property_requiring_replacement in properties_requiring_replacement_update
+ ]
+ )
diff --git a/contrib/python/moto/py3/moto/s3/config.py b/contrib/python/moto/py3/moto/s3/config.py
new file mode 100644
index 0000000000..98bdfe2ddd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/config.py
@@ -0,0 +1,122 @@
+import json
+
+from moto.core.exceptions import InvalidNextTokenException
+from moto.core.common_models import ConfigQueryModel
+from moto.s3 import s3_backends
+
+
+class S3ConfigQuery(ConfigQueryModel):
+ def list_config_service_resources(
+ self,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=None,
+ resource_region=None,
+ aggregator=None,
+ ):
+ # The resource_region only matters for aggregated queries as you can filter on bucket regions for them.
+ # For other resource types, you would need to iterate appropriately for the backend_region.
+
+ # Resource IDs are the same as S3 bucket names
+ # For aggregation -- did we get both a resource ID and a resource name?
+ if resource_ids and resource_name:
+ # If the values are different, then return an empty list:
+ if resource_name not in resource_ids:
+ return [], None
+
+ # If no filter was passed in for resource names/ids then return them all:
+ if not resource_ids and not resource_name:
+ bucket_list = list(self.backends["global"].buckets.keys())
+
+ else:
+ # Match the resource name / ID:
+ bucket_list = []
+ filter_buckets = [resource_name] if resource_name else resource_ids
+
+ for bucket in self.backends["global"].buckets.keys():
+ if bucket in filter_buckets:
+ bucket_list.append(bucket)
+
+ # Filter on the proper region if supplied:
+ region_filter = backend_region or resource_region
+ if region_filter:
+ region_buckets = []
+
+ for bucket in bucket_list:
+ if self.backends["global"].buckets[bucket].region_name == region_filter:
+ region_buckets.append(bucket)
+
+ bucket_list = region_buckets
+
+ if not bucket_list:
+ return [], None
+
+ # Pagination logic:
+ sorted_buckets = sorted(bucket_list)
+ new_token = None
+
+ # Get the start:
+ if not next_token:
+ start = 0
+ else:
+ # Tokens for this moto feature is just the bucket name:
+ # For OTHER non-global resource types, it's the region concatenated with the resource ID.
+ if next_token not in sorted_buckets:
+ raise InvalidNextTokenException()
+
+ start = sorted_buckets.index(next_token)
+
+ # Get the list of items to collect:
+ bucket_list = sorted_buckets[start : (start + limit)]
+
+ if len(sorted_buckets) > (start + limit):
+ new_token = sorted_buckets[start + limit]
+
+ return (
+ [
+ {
+ "type": "AWS::S3::Bucket",
+ "id": bucket,
+ "name": bucket,
+ "region": self.backends["global"].buckets[bucket].region_name,
+ }
+ for bucket in bucket_list
+ ],
+ new_token,
+ )
+
+ def get_config_resource(
+ self, resource_id, resource_name=None, backend_region=None, resource_region=None
+ ):
+ # Get the bucket:
+ bucket = self.backends["global"].buckets.get(resource_id, {})
+
+ if not bucket:
+ return
+
+ # Are we filtering based on region?
+ region_filter = backend_region or resource_region
+ if region_filter and bucket.region_name != region_filter:
+ return
+
+ # Are we also filtering on bucket name?
+ if resource_name and bucket.name != resource_name:
+ return
+
+ # Format the bucket to the AWS Config format:
+ config_data = bucket.to_config_dict()
+
+ # The 'configuration' field is also a JSON string:
+ config_data["configuration"] = json.dumps(config_data["configuration"])
+
+ # Supplementary config need all values converted to JSON strings if they are not strings already:
+ for field, value in config_data["supplementaryConfiguration"].items():
+ if not isinstance(value, str):
+ config_data["supplementaryConfiguration"][field] = json.dumps(value)
+
+ return config_data
+
+
+s3_config_query = S3ConfigQuery(s3_backends)
diff --git a/contrib/python/moto/py3/moto/s3/exceptions.py b/contrib/python/moto/py3/moto/s3/exceptions.py
new file mode 100644
index 0000000000..a03e9cc148
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/exceptions.py
@@ -0,0 +1,615 @@
+from moto.core.exceptions import RESTError
+
+ERROR_WITH_BUCKET_NAME = """{% extends 'single_error' %}
+{% block extra %}<BucketName>{{ bucket }}</BucketName>{% endblock %}
+"""
+
+ERROR_WITH_KEY_NAME = """{% extends 'single_error' %}
+{% block extra %}<Key>{{ key }}</Key>{% endblock %}
+"""
+
+ERROR_WITH_ARGUMENT = """{% extends 'single_error' %}
+{% block extra %}<ArgumentName>{{ name }}</ArgumentName>
+<ArgumentValue>{{ value }}</ArgumentValue>{% endblock %}
+"""
+
+ERROR_WITH_UPLOADID = """{% extends 'single_error' %}
+{% block extra %}<UploadId>{{ upload_id }}</UploadId>{% endblock %}
+"""
+
+ERROR_WITH_CONDITION_NAME = """{% extends 'single_error' %}
+{% block extra %}<Condition>{{ condition }}</Condition>{% endblock %}
+"""
+
+ERROR_WITH_RANGE = """{% extends 'single_error' %}
+{% block extra %}<ActualObjectSize>{{ actual_size }}</ActualObjectSize>
+<RangeRequested>{{ range_requested }}</RangeRequested>{% endblock %}
+"""
+
+ERROR_WITH_STORAGE_CLASS = """{% extends 'single_error' %}
+{% block extra %}<StorageClass>{{ storage_class }}</StorageClass>{% endblock %}
+"""
+
+
+class S3ClientError(RESTError):
+ # S3 API uses <RequestID> as the XML tag in response messages
+ request_id_tag_name = "RequestID"
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "single_error")
+ self.templates["bucket_error"] = ERROR_WITH_BUCKET_NAME
+ super().__init__(*args, **kwargs)
+
+
+class InvalidArgumentError(S3ClientError):
+ code = 400
+
+ def __init__(self, message, name, value, *args, **kwargs):
+ kwargs.setdefault("template", "argument_error")
+ kwargs["name"] = name
+ kwargs["value"] = value
+ self.templates["argument_error"] = ERROR_WITH_ARGUMENT
+ super().__init__("InvalidArgument", message, *args, **kwargs)
+
+
+class BucketError(S3ClientError):
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "bucket_error")
+ self.templates["bucket_error"] = ERROR_WITH_BUCKET_NAME
+ super().__init__(*args, **kwargs)
+
+
+class BucketAlreadyExists(BucketError):
+ code = 409
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "bucket_error")
+ self.templates["bucket_error"] = ERROR_WITH_BUCKET_NAME
+ super().__init__(
+ "BucketAlreadyExists",
+ (
+ "The requested bucket name is not available. The bucket "
+ "namespace is shared by all users of the system. Please "
+ "select a different name and try again"
+ ),
+ *args,
+ **kwargs,
+ )
+
+
+class MissingBucket(BucketError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "NoSuchBucket", "The specified bucket does not exist", *args, **kwargs
+ )
+
+
+class MissingKey(S3ClientError):
+ code = 404
+
+ def __init__(self, **kwargs):
+ kwargs.setdefault("template", "key_error")
+ self.templates["key_error"] = ERROR_WITH_KEY_NAME
+ super().__init__("NoSuchKey", "The specified key does not exist.", **kwargs)
+
+
+class MissingVersion(S3ClientError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "NoSuchVersion", "The specified version does not exist.", *args, **kwargs
+ )
+
+
+class InvalidVersion(S3ClientError):
+ code = 400
+
+ def __init__(self, version_id, *args, **kwargs):
+ kwargs.setdefault("template", "argument_error")
+ kwargs["name"] = "versionId"
+ kwargs["value"] = version_id
+ self.templates["argument_error"] = ERROR_WITH_ARGUMENT
+ super().__init__(
+ "InvalidArgument", "Invalid version id specified", *args, **kwargs
+ )
+
+
+class ObjectNotInActiveTierError(S3ClientError):
+ code = 403
+
+ def __init__(self, key_name):
+ super().__init__(
+ "ObjectNotInActiveTierError",
+ "The source object of the COPY operation is not in the active tier and is only stored in Amazon Glacier.",
+ Key=key_name,
+ )
+
+
+class InvalidPartOrder(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidPartOrder",
+ (
+ "The list of parts was not in ascending order. The parts "
+ "list must be specified in order by part number."
+ ),
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidPart(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidPart",
+ (
+ "One or more of the specified parts could not be found. "
+ "The part might not have been uploaded, or the specified "
+ "entity tag might not have matched the part's entity tag."
+ ),
+ *args,
+ **kwargs,
+ )
+
+
+class EntityTooSmall(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "EntityTooSmall",
+ "Your proposed upload is smaller than the minimum allowed object size.",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidRequest(S3ClientError):
+ code = 400
+
+ def __init__(self, method, *args, **kwargs):
+ super().__init__(
+ "InvalidRequest",
+ "Found unsupported HTTP method in CORS config. Unsupported method is {}".format(
+ method
+ ),
+ *args,
+ **kwargs,
+ )
+
+
+class IllegalLocationConstraintException(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "IllegalLocationConstraintException",
+ "The unspecified location constraint is incompatible for the region specific endpoint this request was sent to.",
+ *args,
+ **kwargs,
+ )
+
+
+class MalformedXML(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "MalformedXML",
+ "The XML you provided was not well-formed or did not validate against our published schema",
+ *args,
+ **kwargs,
+ )
+
+
+class MalformedACLError(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "MalformedACLError",
+ "The XML you provided was not well-formed or did not validate against our published schema",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidTargetBucketForLogging(S3ClientError):
+ code = 400
+
+ def __init__(self, msg):
+ super().__init__("InvalidTargetBucketForLogging", msg)
+
+
+class CrossLocationLoggingProhibitted(S3ClientError):
+ code = 403
+
+ def __init__(self):
+ super().__init__(
+ "CrossLocationLoggingProhibitted", "Cross S3 location logging not allowed."
+ )
+
+
+class InvalidMaxPartArgument(S3ClientError):
+ code = 400
+
+ def __init__(self, arg, min_val, max_val):
+ error = "Argument {} must be an integer between {} and {}".format(
+ arg, min_val, max_val
+ )
+ super().__init__("InvalidArgument", error)
+
+
+class InvalidMaxPartNumberArgument(InvalidArgumentError):
+ code = 400
+
+ def __init__(self, value, *args, **kwargs):
+ error = "Part number must be an integer between 1 and 10000, inclusive"
+ super().__init__(message=error, name="partNumber", value=value, *args, **kwargs)
+
+
+class NotAnIntegerException(InvalidArgumentError):
+ code = 400
+
+ def __init__(self, name, value, *args, **kwargs):
+ error = f"Provided {name} not an integer or within integer range"
+ super().__init__(message=error, name=name, value=value, *args, **kwargs)
+
+
+class InvalidNotificationARN(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidArgument", "The ARN is not well formed", *args, **kwargs
+ )
+
+
+class InvalidNotificationDestination(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidArgument",
+ "The notification destination service region is not valid for the bucket location constraint",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidNotificationEvent(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidArgument",
+ "The event is not supported for notifications",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidStorageClass(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidStorageClass",
+ "The storage class you specified is not valid",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidBucketName(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidBucketName", "The specified bucket is not valid.", *args, **kwargs
+ )
+
+
+class DuplicateTagKeys(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidTag",
+ "Cannot provide multiple Tags with the same key",
+ *args,
+ **kwargs,
+ )
+
+
+class S3AccessDeniedError(S3ClientError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__("AccessDenied", "Access Denied", *args, **kwargs)
+
+
+class BucketAccessDeniedError(BucketError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__("AccessDenied", "Access Denied", *args, **kwargs)
+
+
+class S3InvalidTokenError(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidToken",
+ "The provided token is malformed or otherwise invalid.",
+ *args,
+ **kwargs,
+ )
+
+
+class S3AclAndGrantError(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidRequest",
+ "Specifying both Canned ACLs and Header Grants is not allowed",
+ *args,
+ **kwargs,
+ )
+
+
+class BucketInvalidTokenError(BucketError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidToken",
+ "The provided token is malformed or otherwise invalid.",
+ *args,
+ **kwargs,
+ )
+
+
+class S3InvalidAccessKeyIdError(S3ClientError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidAccessKeyId",
+ "The AWS Access Key Id you provided does not exist in our records.",
+ *args,
+ **kwargs,
+ )
+
+
+class BucketInvalidAccessKeyIdError(S3ClientError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidAccessKeyId",
+ "The AWS Access Key Id you provided does not exist in our records.",
+ *args,
+ **kwargs,
+ )
+
+
+class S3SignatureDoesNotMatchError(S3ClientError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "SignatureDoesNotMatch",
+ "The request signature we calculated does not match the signature you provided. Check your key and signing method.",
+ *args,
+ **kwargs,
+ )
+
+
+class BucketSignatureDoesNotMatchError(S3ClientError):
+ code = 403
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "SignatureDoesNotMatch",
+ "The request signature we calculated does not match the signature you provided. Check your key and signing method.",
+ *args,
+ **kwargs,
+ )
+
+
+class NoSuchPublicAccessBlockConfiguration(S3ClientError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "NoSuchPublicAccessBlockConfiguration",
+ "The public access block configuration was not found",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidPublicAccessBlockConfiguration(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidRequest",
+ "Must specify at least one configuration.",
+ *args,
+ **kwargs,
+ )
+
+
+class WrongPublicAccessBlockAccountIdError(S3ClientError):
+ code = 403
+
+ def __init__(self):
+ super().__init__("AccessDenied", "Access Denied")
+
+
+class NoSystemTags(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidTag", "System tags cannot be added/updated by requester"
+ )
+
+
+class NoSuchUpload(S3ClientError):
+ code = 404
+
+ def __init__(self, upload_id, *args, **kwargs):
+ kwargs.setdefault("template", "error_uploadid")
+ kwargs["upload_id"] = upload_id
+ self.templates["error_uploadid"] = ERROR_WITH_UPLOADID
+ super().__init__(
+ "NoSuchUpload",
+ "The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.",
+ *args,
+ **kwargs,
+ )
+
+
+class PreconditionFailed(S3ClientError):
+ code = 412
+
+ def __init__(self, failed_condition, **kwargs):
+ kwargs.setdefault("template", "condition_error")
+ self.templates["condition_error"] = ERROR_WITH_CONDITION_NAME
+ super().__init__(
+ "PreconditionFailed",
+ "At least one of the pre-conditions you specified did not hold",
+ condition=failed_condition,
+ **kwargs,
+ )
+
+
+class InvalidRange(S3ClientError):
+ code = 416
+
+ def __init__(self, range_requested, actual_size, **kwargs):
+ kwargs.setdefault("template", "range_error")
+ self.templates["range_error"] = ERROR_WITH_RANGE
+ super().__init__(
+ "InvalidRange",
+ "The requested range is not satisfiable",
+ range_requested=range_requested,
+ actual_size=actual_size,
+ **kwargs,
+ )
+
+
+class InvalidContinuationToken(S3ClientError):
+ code = 400
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ "InvalidArgument",
+ "The continuation token provided is incorrect",
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidObjectState(BucketError):
+ code = 400
+
+ def __init__(self, storage_class, **kwargs):
+ kwargs.setdefault("template", "storage_error")
+ self.templates["storage_error"] = ERROR_WITH_STORAGE_CLASS
+ super().__init__(
+ error_type="InvalidObjectState",
+ message="The operation is not valid for the object's storage class",
+ storage_class=storage_class,
+ **kwargs,
+ )
+
+
+class LockNotEnabled(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidRequest", "Bucket is missing ObjectLockConfiguration")
+
+
+class AccessDeniedByLock(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("AccessDenied", "Access Denied")
+
+
+class InvalidContentMD5(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidContentMD5", "Content MD5 header is invalid")
+
+
+class BucketNeedsToBeNew(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidBucket", "Bucket needs to be empty")
+
+
+class BucketMustHaveLockeEnabled(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidBucketState",
+ "Object Lock configuration cannot be enabled on existing buckets",
+ )
+
+
+class CopyObjectMustChangeSomething(S3ClientError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidRequest",
+ "This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.",
+ )
+
+
+class InvalidFilterRuleName(InvalidArgumentError):
+ code = 400
+
+ def __init__(self, value, *args, **kwargs):
+ super().__init__(
+ "filter rule name must be either prefix or suffix",
+ "FilterRule.Name",
+ value,
+ *args,
+ **kwargs,
+ )
+
+
+class InvalidTagError(S3ClientError):
+ code = 400
+
+ def __init__(self, value, *args, **kwargs):
+ super().__init__("InvalidTag", value, *args, **kwargs)
+
+
+class ObjectLockConfigurationNotFoundError(S3ClientError):
+ code = 404
+
+ def __init__(self):
+ super().__init__(
+ "ObjectLockConfigurationNotFoundError",
+ "Object Lock configuration does not exist for this bucket",
+ )
diff --git a/contrib/python/moto/py3/moto/s3/models.py b/contrib/python/moto/py3/moto/s3/models.py
new file mode 100644
index 0000000000..aaeb500463
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/models.py
@@ -0,0 +1,2152 @@
+import json
+import os
+import base64
+import datetime
+import copy
+import itertools
+import codecs
+import random
+import string
+import tempfile
+import threading
+import pytz
+import sys
+import time
+import uuid
+import urllib.parse
+
+from bisect import insort
+from importlib import reload
+from moto.core import (
+ get_account_id,
+ BaseBackend,
+ BaseModel,
+ CloudFormationModel,
+ CloudWatchMetricProvider,
+)
+
+from moto.core.utils import (
+ iso_8601_datetime_without_milliseconds_s3,
+ rfc_1123_datetime,
+ unix_time_millis,
+ BackendDict,
+)
+from moto.cloudwatch.models import MetricDatum
+from moto.utilities.tagging_service import TaggingService
+from moto.utilities.utils import LowercaseDict, md5_hash
+from moto.s3.exceptions import (
+ AccessDeniedByLock,
+ BucketAlreadyExists,
+ BucketNeedsToBeNew,
+ CopyObjectMustChangeSomething,
+ MissingBucket,
+ InvalidBucketName,
+ InvalidPart,
+ InvalidRequest,
+ EntityTooSmall,
+ MissingKey,
+ InvalidNotificationDestination,
+ MalformedXML,
+ InvalidStorageClass,
+ InvalidTargetBucketForLogging,
+ CrossLocationLoggingProhibitted,
+ NoSuchPublicAccessBlockConfiguration,
+ InvalidPublicAccessBlockConfiguration,
+ NoSuchUpload,
+ ObjectLockConfigurationNotFoundError,
+ InvalidTagError,
+)
+from .cloud_formation import cfn_to_api_encryption, is_replacement_update
+from . import notifications
+from .utils import clean_key_name, _VersionedKeyStore, undo_clean_key_name
+from ..events.notifications import send_notification as events_send_notification
+from ..settings import get_s3_default_key_buffer_size, S3_UPLOAD_PART_MIN_SIZE
+
+MAX_BUCKET_NAME_LENGTH = 63
+MIN_BUCKET_NAME_LENGTH = 3
+UPLOAD_ID_BYTES = 43
+STORAGE_CLASS = [
+ "STANDARD",
+ "REDUCED_REDUNDANCY",
+ "STANDARD_IA",
+ "ONEZONE_IA",
+ "INTELLIGENT_TIERING",
+ "GLACIER",
+ "DEEP_ARCHIVE",
+]
+DEFAULT_TEXT_ENCODING = sys.getdefaultencoding()
+OWNER = "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a"
+
+
+def get_moto_s3_account_id():
+ """This makes it easy for mocking AWS Account IDs when using AWS Config
+ -- Simply mock.patch get_account_id() here, and Config gets it for free.
+ """
+ return get_account_id()
+
+
+class FakeDeleteMarker(BaseModel):
+ def __init__(self, key):
+ self.key = key
+ self.name = key.name
+ self.last_modified = datetime.datetime.utcnow()
+ self._version_id = str(uuid.uuid4())
+
+ @property
+ def last_modified_ISO8601(self):
+ return iso_8601_datetime_without_milliseconds_s3(self.last_modified)
+
+ @property
+ def version_id(self):
+ return self._version_id
+
+
+class FakeKey(BaseModel):
+ def __init__(
+ self,
+ name,
+ value,
+ storage="STANDARD",
+ etag=None,
+ is_versioned=False,
+ version_id=0,
+ max_buffer_size=None,
+ multipart=None,
+ bucket_name=None,
+ encryption=None,
+ kms_key_id=None,
+ bucket_key_enabled=None,
+ lock_mode=None,
+ lock_legal_status=None,
+ lock_until=None,
+ s3_backend=None,
+ ):
+ self.name = name
+ self.last_modified = datetime.datetime.utcnow()
+ self.acl = get_canned_acl("private")
+ self.website_redirect_location = None
+ self._storage_class = storage if storage else "STANDARD"
+ self._metadata = LowercaseDict()
+ self._expiry = None
+ self._etag = etag
+ self._version_id = version_id
+ self._is_versioned = is_versioned
+ self.multipart = multipart
+ self.bucket_name = bucket_name
+
+ self._max_buffer_size = (
+ max_buffer_size if max_buffer_size else get_s3_default_key_buffer_size()
+ )
+ self._value_buffer = tempfile.SpooledTemporaryFile(self._max_buffer_size)
+ self.value = value
+ self.lock = threading.Lock()
+
+ self.encryption = encryption
+ self.kms_key_id = kms_key_id
+ self.bucket_key_enabled = bucket_key_enabled
+
+ self.lock_mode = lock_mode
+ self.lock_legal_status = lock_legal_status
+ self.lock_until = lock_until
+
+ # Default metadata values
+ self._metadata["Content-Type"] = "binary/octet-stream"
+
+ self.s3_backend = s3_backend
+
+ def safe_name(self, encoding_type=None):
+ if encoding_type == "url":
+ return urllib.parse.quote(self.name, safe="")
+ return self.name
+
+ @property
+ def version_id(self):
+ return self._version_id
+
+ @property
+ def value(self):
+ self.lock.acquire()
+ self._value_buffer.seek(0)
+ r = self._value_buffer.read()
+ r = copy.copy(r)
+ self.lock.release()
+ return r
+
+ @property
+ def arn(self):
+ # S3 Objects don't have an ARN, but we do need something unique when creating tags against this resource
+ return "arn:aws:s3:::{}/{}/{}".format(
+ self.bucket_name, self.name, self.version_id
+ )
+
+ @value.setter
+ def value(self, new_value):
+ self._value_buffer.seek(0)
+ self._value_buffer.truncate()
+
+ # Hack for working around moto's own unit tests; this probably won't
+ # actually get hit in normal use.
+ if isinstance(new_value, str):
+ new_value = new_value.encode(DEFAULT_TEXT_ENCODING)
+ self._value_buffer.write(new_value)
+ self.contentsize = len(new_value)
+
+ def set_metadata(self, metadata, replace=False):
+ if replace:
+ self._metadata = {}
+ self._metadata.update(metadata)
+
+ def set_storage_class(self, storage):
+ if storage is not None and storage not in STORAGE_CLASS:
+ raise InvalidStorageClass(storage=storage)
+ self._storage_class = storage
+
+ def set_expiry(self, expiry):
+ self._expiry = expiry
+
+ def set_acl(self, acl):
+ self.acl = acl
+
+ def restore(self, days):
+ self._expiry = datetime.datetime.utcnow() + datetime.timedelta(days)
+
+ @property
+ def etag(self):
+ if self._etag is None:
+ value_md5 = md5_hash()
+ self._value_buffer.seek(0)
+ while True:
+ block = self._value_buffer.read(16 * 1024 * 1024) # read in 16MB chunks
+ if not block:
+ break
+ value_md5.update(block)
+
+ self._etag = value_md5.hexdigest()
+ return '"{0}"'.format(self._etag)
+
+ @property
+ def last_modified_ISO8601(self):
+ return iso_8601_datetime_without_milliseconds_s3(self.last_modified)
+
+ @property
+ def last_modified_RFC1123(self):
+ # Different datetime formats depending on how the key is obtained
+ # https://github.com/boto/boto/issues/466
+ return rfc_1123_datetime(self.last_modified)
+
+ @property
+ def metadata(self):
+ return self._metadata
+
+ @property
+ def response_dict(self):
+ res = {
+ "ETag": self.etag,
+ "last-modified": self.last_modified_RFC1123,
+ "content-length": str(self.size),
+ }
+ if self.encryption is not None:
+ res["x-amz-server-side-encryption"] = self.encryption
+ if self.encryption == "aws:kms" and self.kms_key_id is not None:
+ res["x-amz-server-side-encryption-aws-kms-key-id"] = self.kms_key_id
+ if self.bucket_key_enabled is not None:
+ res[
+ "x-amz-server-side-encryption-bucket-key-enabled"
+ ] = self.bucket_key_enabled
+ if self._storage_class != "STANDARD":
+ res["x-amz-storage-class"] = self._storage_class
+ if self._expiry is not None:
+ rhdr = 'ongoing-request="false", expiry-date="{0}"'
+ res["x-amz-restore"] = rhdr.format(self.expiry_date)
+
+ if self._is_versioned:
+ res["x-amz-version-id"] = str(self.version_id)
+
+ if self.website_redirect_location:
+ res["x-amz-website-redirect-location"] = self.website_redirect_location
+ if self.lock_legal_status:
+ res["x-amz-object-lock-legal-hold"] = self.lock_legal_status
+ if self.lock_until:
+ res["x-amz-object-lock-retain-until-date"] = self.lock_until
+ if self.lock_mode:
+ res["x-amz-object-lock-mode"] = self.lock_mode
+
+ if self.lock_legal_status:
+ res["x-amz-object-lock-legal-hold"] = self.lock_legal_status
+ if self.lock_until:
+ res["x-amz-object-lock-retain-until-date"] = self.lock_until
+ if self.lock_mode:
+ res["x-amz-object-lock-mode"] = self.lock_mode
+ tags = s3_backend.tagger.get_tag_dict_for_resource(self.arn)
+ if tags:
+ res["x-amz-tagging-count"] = len(tags.keys())
+
+ return res
+
+ @property
+ def size(self):
+ return self.contentsize
+
+ @property
+ def storage_class(self):
+ return self._storage_class
+
+ @property
+ def expiry_date(self):
+ if self._expiry is not None:
+ return self._expiry.strftime("%a, %d %b %Y %H:%M:%S GMT")
+
+ # Keys need to be pickleable due to some implementation details of boto3.
+ # Since file objects aren't pickleable, we need to override the default
+ # behavior. The following is adapted from the Python docs:
+ # https://docs.python.org/3/library/pickle.html#handling-stateful-objects
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ state["value"] = self.value
+ del state["_value_buffer"]
+ del state["lock"]
+ return state
+
+ def __setstate__(self, state):
+ self.__dict__.update({k: v for k, v in state.items() if k != "value"})
+
+ self._value_buffer = tempfile.SpooledTemporaryFile(
+ max_size=self._max_buffer_size
+ )
+ self.value = state["value"]
+ self.lock = threading.Lock()
+
+ @property
+ def is_locked(self):
+ if self.lock_legal_status == "ON":
+ return True
+
+ if self.lock_mode == "COMPLIANCE":
+ now = datetime.datetime.utcnow()
+ try:
+ until = datetime.datetime.strptime(
+ self.lock_until, "%Y-%m-%dT%H:%M:%SZ"
+ )
+ except ValueError:
+ until = datetime.datetime.strptime(
+ self.lock_until, "%Y-%m-%dT%H:%M:%S.%fZ"
+ )
+
+ if until > now:
+ return True
+
+ return False
+
+
+class FakeMultipart(BaseModel):
+ def __init__(self, key_name, metadata, storage=None, tags=None, acl=None):
+ self.key_name = key_name
+ self.metadata = metadata
+ self.storage = storage
+ self.tags = tags
+ self.acl = acl
+ self.parts = {}
+ self.partlist = [] # ordered list of part ID's
+ rand_b64 = base64.b64encode(os.urandom(UPLOAD_ID_BYTES))
+ self.id = (
+ rand_b64.decode("utf-8").replace("=", "").replace("+", "").replace("/", "")
+ )
+
+ def complete(self, body):
+ decode_hex = codecs.getdecoder("hex_codec")
+ total = bytearray()
+ md5s = bytearray()
+
+ last = None
+ count = 0
+ for pn, etag in body:
+ part = self.parts.get(pn)
+ part_etag = None
+ if part is not None:
+ part_etag = part.etag.replace('"', "")
+ etag = etag.replace('"', "")
+ if part is None or part_etag != etag:
+ raise InvalidPart()
+ if last is not None and last.contentsize < S3_UPLOAD_PART_MIN_SIZE:
+ raise EntityTooSmall()
+ md5s.extend(decode_hex(part_etag)[0])
+ total.extend(part.value)
+ last = part
+ count += 1
+
+ if count == 0:
+ raise MalformedXML
+
+ etag = md5_hash()
+ etag.update(bytes(md5s))
+ return total, "{0}-{1}".format(etag.hexdigest(), count)
+
+ def set_part(self, part_id, value):
+ if part_id < 1:
+ raise NoSuchUpload(upload_id=part_id)
+
+ key = FakeKey(part_id, value)
+ self.parts[part_id] = key
+ if part_id not in self.partlist:
+ insort(self.partlist, part_id)
+ return key
+
+ def list_parts(self, part_number_marker, max_parts):
+ max_marker = part_number_marker + max_parts
+ for part_id in self.partlist[part_number_marker:max_marker]:
+ yield self.parts[part_id]
+
+
+class FakeGrantee(BaseModel):
+ def __init__(self, grantee_id="", uri="", display_name=""):
+ self.id = grantee_id
+ self.uri = uri
+ self.display_name = display_name
+
+ def __eq__(self, other):
+ if not isinstance(other, FakeGrantee):
+ return False
+ return (
+ self.id == other.id
+ and self.uri == other.uri
+ and self.display_name == other.display_name
+ )
+
+ @property
+ def type(self):
+ return "Group" if self.uri else "CanonicalUser"
+
+ def __repr__(self):
+ return "FakeGrantee(display_name: '{}', id: '{}', uri: '{}')".format(
+ self.display_name, self.id, self.uri
+ )
+
+
+ALL_USERS_GRANTEE = FakeGrantee(uri="http://acs.amazonaws.com/groups/global/AllUsers")
+AUTHENTICATED_USERS_GRANTEE = FakeGrantee(
+ uri="http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
+)
+LOG_DELIVERY_GRANTEE = FakeGrantee(uri="http://acs.amazonaws.com/groups/s3/LogDelivery")
+
+PERMISSION_FULL_CONTROL = "FULL_CONTROL"
+PERMISSION_WRITE = "WRITE"
+PERMISSION_READ = "READ"
+PERMISSION_WRITE_ACP = "WRITE_ACP"
+PERMISSION_READ_ACP = "READ_ACP"
+
+CAMEL_CASED_PERMISSIONS = {
+ "FULL_CONTROL": "FullControl",
+ "WRITE": "Write",
+ "READ": "Read",
+ "WRITE_ACP": "WriteAcp",
+ "READ_ACP": "ReadAcp",
+}
+
+
+class FakeGrant(BaseModel):
+ def __init__(self, grantees, permissions):
+ self.grantees = grantees
+ self.permissions = permissions
+
+ def __repr__(self):
+ return "FakeGrant(grantees: {}, permissions: {})".format(
+ self.grantees, self.permissions
+ )
+
+
+class FakeAcl(BaseModel):
+ def __init__(self, grants=None):
+ grants = grants or []
+ self.grants = grants
+
+ @property
+ def public_read(self):
+ for grant in self.grants:
+ if ALL_USERS_GRANTEE in grant.grantees:
+ if PERMISSION_READ in grant.permissions:
+ return True
+ if PERMISSION_FULL_CONTROL in grant.permissions:
+ return True
+ return False
+
+ def __repr__(self):
+ return "FakeAcl(grants: {})".format(self.grants)
+
+ def to_config_dict(self):
+ """Returns the object into the format expected by AWS Config"""
+ data = {
+ "grantSet": None, # Always setting this to None. Feel free to change.
+ "owner": {"displayName": None, "id": OWNER},
+ }
+
+ # Add details for each Grant:
+ grant_list = []
+ for grant in self.grants:
+ permissions = (
+ grant.permissions
+ if isinstance(grant.permissions, list)
+ else [grant.permissions]
+ )
+ for permission in permissions:
+ for grantee in grant.grantees:
+ if grantee.uri:
+ grant_list.append(
+ {
+ "grantee": grantee.uri.split(
+ "http://acs.amazonaws.com/groups/s3/"
+ )[1],
+ "permission": CAMEL_CASED_PERMISSIONS[permission],
+ }
+ )
+ else:
+ grant_list.append(
+ {
+ "grantee": {
+ "id": grantee.id,
+ "displayName": None
+ if not grantee.display_name
+ else grantee.display_name,
+ },
+ "permission": CAMEL_CASED_PERMISSIONS[permission],
+ }
+ )
+
+ if grant_list:
+ data["grantList"] = grant_list
+
+ return data
+
+
+def get_canned_acl(acl):
+ owner_grantee = FakeGrantee(grantee_id=OWNER)
+ grants = [FakeGrant([owner_grantee], [PERMISSION_FULL_CONTROL])]
+ if acl == "private":
+ pass # no other permissions
+ elif acl == "public-read":
+ grants.append(FakeGrant([ALL_USERS_GRANTEE], [PERMISSION_READ]))
+ elif acl == "public-read-write":
+ grants.append(
+ FakeGrant([ALL_USERS_GRANTEE], [PERMISSION_READ, PERMISSION_WRITE])
+ )
+ elif acl == "authenticated-read":
+ grants.append(FakeGrant([AUTHENTICATED_USERS_GRANTEE], [PERMISSION_READ]))
+ elif acl == "bucket-owner-read":
+ pass # TODO: bucket owner ACL
+ elif acl == "bucket-owner-full-control":
+ pass # TODO: bucket owner ACL
+ elif acl == "aws-exec-read":
+ pass # TODO: bucket owner, EC2 Read
+ elif acl == "log-delivery-write":
+ grants.append(
+ FakeGrant([LOG_DELIVERY_GRANTEE], [PERMISSION_READ_ACP, PERMISSION_WRITE])
+ )
+ else:
+ assert False, "Unknown canned acl: %s" % (acl,)
+ return FakeAcl(grants=grants)
+
+
+class LifecycleFilter(BaseModel):
+ def __init__(self, prefix=None, tag=None, and_filter=None):
+ self.prefix = prefix
+ (self.tag_key, self.tag_value) = tag if tag else (None, None)
+ self.and_filter = and_filter
+
+ def to_config_dict(self):
+ if self.prefix is not None:
+ return {
+ "predicate": {"type": "LifecyclePrefixPredicate", "prefix": self.prefix}
+ }
+
+ elif self.tag_key:
+ return {
+ "predicate": {
+ "type": "LifecycleTagPredicate",
+ "tag": {"key": self.tag_key, "value": self.tag_value},
+ }
+ }
+
+ else:
+ return {
+ "predicate": {
+ "type": "LifecycleAndOperator",
+ "operands": self.and_filter.to_config_dict(),
+ }
+ }
+
+
+class LifecycleAndFilter(BaseModel):
+ def __init__(self, prefix=None, tags=None):
+ self.prefix = prefix
+ self.tags = tags
+
+ def to_config_dict(self):
+ data = []
+
+ if self.prefix is not None:
+ data.append({"type": "LifecyclePrefixPredicate", "prefix": self.prefix})
+
+ for key, value in self.tags.items():
+ data.append(
+ {"type": "LifecycleTagPredicate", "tag": {"key": key, "value": value}}
+ )
+
+ return data
+
+
+class LifecycleRule(BaseModel):
+ def __init__(
+ self,
+ rule_id=None,
+ prefix=None,
+ lc_filter=None,
+ status=None,
+ expiration_days=None,
+ expiration_date=None,
+ transition_days=None,
+ transition_date=None,
+ storage_class=None,
+ expired_object_delete_marker=None,
+ nve_noncurrent_days=None,
+ nvt_noncurrent_days=None,
+ nvt_storage_class=None,
+ aimu_days=None,
+ ):
+ self.id = rule_id
+ self.prefix = prefix
+ self.filter = lc_filter
+ self.status = status
+ self.expiration_days = expiration_days
+ self.expiration_date = expiration_date
+ self.transition_days = transition_days
+ self.transition_date = transition_date
+ self.storage_class = storage_class
+ self.expired_object_delete_marker = expired_object_delete_marker
+ self.nve_noncurrent_days = nve_noncurrent_days
+ self.nvt_noncurrent_days = nvt_noncurrent_days
+ self.nvt_storage_class = nvt_storage_class
+ self.aimu_days = aimu_days
+
+ def to_config_dict(self):
+ """Converts the object to the AWS Config data dict.
+
+ Note: The following are missing that should be added in the future:
+ - transitions (returns None for now)
+ - noncurrentVersionTransitions (returns None for now)
+
+ :param kwargs:
+ :return:
+ """
+
+ lifecycle_dict = {
+ "id": self.id,
+ "prefix": self.prefix,
+ "status": self.status,
+ "expirationInDays": int(self.expiration_days)
+ if self.expiration_days
+ else None,
+ "expiredObjectDeleteMarker": self.expired_object_delete_marker,
+ "noncurrentVersionExpirationInDays": -1 or int(self.nve_noncurrent_days),
+ "expirationDate": self.expiration_date,
+ "transitions": None, # Replace me with logic to fill in
+ "noncurrentVersionTransitions": None, # Replace me with logic to fill in
+ }
+
+ if self.aimu_days:
+ lifecycle_dict["abortIncompleteMultipartUpload"] = {
+ "daysAfterInitiation": self.aimu_days
+ }
+ else:
+ lifecycle_dict["abortIncompleteMultipartUpload"] = None
+
+ # Format the filter:
+ if self.prefix is None and self.filter is None:
+ lifecycle_dict["filter"] = {"predicate": None}
+
+ elif self.prefix:
+ lifecycle_dict["filter"] = None
+ else:
+ lifecycle_dict["filter"] = self.filter.to_config_dict()
+
+ return lifecycle_dict
+
+
+class CorsRule(BaseModel):
+ def __init__(
+ self,
+ allowed_methods,
+ allowed_origins,
+ allowed_headers=None,
+ expose_headers=None,
+ max_age_seconds=None,
+ ):
+ self.allowed_methods = (
+ [allowed_methods] if isinstance(allowed_methods, str) else allowed_methods
+ )
+ self.allowed_origins = (
+ [allowed_origins] if isinstance(allowed_origins, str) else allowed_origins
+ )
+ self.allowed_headers = (
+ [allowed_headers] if isinstance(allowed_headers, str) else allowed_headers
+ )
+ self.exposed_headers = (
+ [expose_headers] if isinstance(expose_headers, str) else expose_headers
+ )
+ self.max_age_seconds = max_age_seconds
+
+
+class Notification(BaseModel):
+ def __init__(self, arn, events, filters=None, notification_id=None):
+ self.id = notification_id or "".join(
+ random.choice(string.ascii_letters + string.digits) for _ in range(50)
+ )
+ self.arn = arn
+ self.events = events
+ self.filters = filters if filters else {}
+
+ def _event_matches(self, event_name):
+ if event_name in self.events:
+ return True
+ # s3:ObjectCreated:Put --> s3:ObjectCreated:*
+ wildcard = ":".join(event_name.rsplit(":")[0:2]) + ":*"
+ if wildcard in self.events:
+ return True
+ return False
+
+ def _key_matches(self, key_name):
+ if "S3Key" not in self.filters:
+ return True
+ _filters = {f["Name"]: f["Value"] for f in self.filters["S3Key"]["FilterRule"]}
+ prefix_matches = "prefix" not in _filters or key_name.startswith(
+ _filters["prefix"]
+ )
+ suffix_matches = "suffix" not in _filters or key_name.endswith(
+ _filters["suffix"]
+ )
+ return prefix_matches and suffix_matches
+
+ def matches(self, event_name, key_name):
+ if self._event_matches(event_name):
+ if self._key_matches(key_name):
+ return True
+ return False
+
+ def to_config_dict(self):
+ data = {}
+
+ # Type and ARN will be filled in by NotificationConfiguration's to_config_dict:
+ data["events"] = [event for event in self.events]
+
+ if self.filters:
+ data["filter"] = {
+ "s3KeyFilter": {
+ "filterRules": [
+ {"name": fr["Name"], "value": fr["Value"]}
+ for fr in self.filters["S3Key"]["FilterRule"]
+ ]
+ }
+ }
+ else:
+ data["filter"] = None
+
+ # Not sure why this is a thing since AWS just seems to return this as filters ¯\_(ツ)_/¯
+ data["objectPrefixes"] = []
+
+ return data
+
+
+class NotificationConfiguration(BaseModel):
+ def __init__(self, topic=None, queue=None, cloud_function=None):
+ self.topic = (
+ [
+ Notification(
+ t["Topic"],
+ t["Event"],
+ filters=t.get("Filter"),
+ notification_id=t.get("Id"),
+ )
+ for t in topic
+ ]
+ if topic
+ else []
+ )
+ self.queue = (
+ [
+ Notification(
+ q["Queue"],
+ q["Event"],
+ filters=q.get("Filter"),
+ notification_id=q.get("Id"),
+ )
+ for q in queue
+ ]
+ if queue
+ else []
+ )
+ self.cloud_function = (
+ [
+ Notification(
+ c["CloudFunction"],
+ c["Event"],
+ filters=c.get("Filter"),
+ notification_id=c.get("Id"),
+ )
+ for c in cloud_function
+ ]
+ if cloud_function
+ else []
+ )
+
+ def to_config_dict(self):
+ data = {"configurations": {}}
+
+ for topic in self.topic:
+ topic_config = topic.to_config_dict()
+ topic_config["topicARN"] = topic.arn
+ topic_config["type"] = "TopicConfiguration"
+ data["configurations"][topic.id] = topic_config
+
+ for queue in self.queue:
+ queue_config = queue.to_config_dict()
+ queue_config["queueARN"] = queue.arn
+ queue_config["type"] = "QueueConfiguration"
+ data["configurations"][queue.id] = queue_config
+
+ for cloud_function in self.cloud_function:
+ cf_config = cloud_function.to_config_dict()
+ cf_config["queueARN"] = cloud_function.arn
+ cf_config["type"] = "LambdaConfiguration"
+ data["configurations"][cloud_function.id] = cf_config
+
+ return data
+
+
+def convert_str_to_bool(item):
+ """Converts a boolean string to a boolean value"""
+ if isinstance(item, str):
+ return item.lower() == "true"
+
+ return False
+
+
+class PublicAccessBlock(BaseModel):
+ def __init__(
+ self,
+ block_public_acls,
+ ignore_public_acls,
+ block_public_policy,
+ restrict_public_buckets,
+ ):
+ # The boto XML appears to expect these values to exist as lowercase strings...
+ self.block_public_acls = block_public_acls or "false"
+ self.ignore_public_acls = ignore_public_acls or "false"
+ self.block_public_policy = block_public_policy or "false"
+ self.restrict_public_buckets = restrict_public_buckets or "false"
+
+ def to_config_dict(self):
+ # Need to make the string values booleans for Config:
+ return {
+ "blockPublicAcls": convert_str_to_bool(self.block_public_acls),
+ "ignorePublicAcls": convert_str_to_bool(self.ignore_public_acls),
+ "blockPublicPolicy": convert_str_to_bool(self.block_public_policy),
+ "restrictPublicBuckets": convert_str_to_bool(self.restrict_public_buckets),
+ }
+
+
+class FakeBucket(CloudFormationModel):
+ def __init__(self, name, region_name):
+ self.name = name
+ self.region_name = region_name
+ self.keys = _VersionedKeyStore()
+ self.multiparts = {}
+ self.versioning_status = None
+ self.rules = []
+ self.policy = None
+ self.website_configuration = None
+ self.acl = get_canned_acl("private")
+ self.cors = []
+ self.logging = {}
+ self.notification_configuration = None
+ self.accelerate_configuration = None
+ self.payer = "BucketOwner"
+ self.creation_date = datetime.datetime.now(tz=pytz.utc)
+ self.public_access_block = None
+ self.encryption = None
+ self.object_lock_enabled = False
+ self.default_lock_mode = ""
+ self.default_lock_days = 0
+ self.default_lock_years = 0
+
+ @property
+ def location(self):
+ return self.region_name
+
+ @property
+ def creation_date_ISO8601(self):
+ return iso_8601_datetime_without_milliseconds_s3(self.creation_date)
+
+ @property
+ def is_versioned(self):
+ return self.versioning_status == "Enabled"
+
+ def set_lifecycle(self, rules):
+ self.rules = []
+ for rule in rules:
+ # Extract and validate actions from Lifecycle rule
+ expiration = rule.get("Expiration")
+ transition = rule.get("Transition")
+
+ try:
+ top_level_prefix = (
+ rule["Prefix"] or ""
+ ) # If it's `None` the set to the empty string
+ except KeyError:
+ top_level_prefix = None
+
+ nve_noncurrent_days = None
+ if rule.get("NoncurrentVersionExpiration") is not None:
+ if rule["NoncurrentVersionExpiration"].get("NoncurrentDays") is None:
+ raise MalformedXML()
+ nve_noncurrent_days = rule["NoncurrentVersionExpiration"][
+ "NoncurrentDays"
+ ]
+
+ nvt_noncurrent_days = None
+ nvt_storage_class = None
+ if rule.get("NoncurrentVersionTransition") is not None:
+ if rule["NoncurrentVersionTransition"].get("NoncurrentDays") is None:
+ raise MalformedXML()
+ if rule["NoncurrentVersionTransition"].get("StorageClass") is None:
+ raise MalformedXML()
+ nvt_noncurrent_days = rule["NoncurrentVersionTransition"][
+ "NoncurrentDays"
+ ]
+ nvt_storage_class = rule["NoncurrentVersionTransition"]["StorageClass"]
+
+ aimu_days = None
+ if rule.get("AbortIncompleteMultipartUpload") is not None:
+ if (
+ rule["AbortIncompleteMultipartUpload"].get("DaysAfterInitiation")
+ is None
+ ):
+ raise MalformedXML()
+ aimu_days = rule["AbortIncompleteMultipartUpload"][
+ "DaysAfterInitiation"
+ ]
+
+ eodm = None
+ if expiration and expiration.get("ExpiredObjectDeleteMarker") is not None:
+ # This cannot be set if Date or Days is set:
+ if expiration.get("Days") or expiration.get("Date"):
+ raise MalformedXML()
+ eodm = expiration["ExpiredObjectDeleteMarker"]
+
+ # Pull out the filter:
+ lc_filter = None
+ if rule.get("Filter"):
+ # Can't have both `Filter` and `Prefix` (need to check for the presence of the key):
+ try:
+ # 'Prefix' cannot be outside of a Filter:
+ if rule["Prefix"] or not rule["Prefix"]:
+ raise MalformedXML()
+ except KeyError:
+ pass
+
+ filters = 0
+ try:
+ prefix_filter = (
+ rule["Filter"]["Prefix"] or ""
+ ) # If it's `None` the set to the empty string
+ filters += 1
+ except KeyError:
+ prefix_filter = None
+
+ and_filter = None
+ if rule["Filter"].get("And"):
+ filters += 1
+ and_tags = {}
+ if rule["Filter"]["And"].get("Tag"):
+ if not isinstance(rule["Filter"]["And"]["Tag"], list):
+ rule["Filter"]["And"]["Tag"] = [
+ rule["Filter"]["And"]["Tag"]
+ ]
+
+ for t in rule["Filter"]["And"]["Tag"]:
+ and_tags[t["Key"]] = t.get("Value", "")
+
+ try:
+ and_prefix = (
+ rule["Filter"]["And"]["Prefix"] or ""
+ ) # If it's `None` then set to the empty string
+ except KeyError:
+ and_prefix = None
+
+ and_filter = LifecycleAndFilter(prefix=and_prefix, tags=and_tags)
+
+ filter_tag = None
+ if rule["Filter"].get("Tag"):
+ filters += 1
+ filter_tag = (
+ rule["Filter"]["Tag"]["Key"],
+ rule["Filter"]["Tag"].get("Value", ""),
+ )
+
+ # Can't have more than 1 filter:
+ if filters > 1:
+ raise MalformedXML()
+
+ lc_filter = LifecycleFilter(
+ prefix=prefix_filter, tag=filter_tag, and_filter=and_filter
+ )
+
+ # If no top level prefix and no filter is present, then this is invalid:
+ if top_level_prefix is None:
+ try:
+ rule["Filter"]
+ except KeyError:
+ raise MalformedXML()
+
+ self.rules.append(
+ LifecycleRule(
+ rule_id=rule.get("ID"),
+ prefix=top_level_prefix,
+ lc_filter=lc_filter,
+ status=rule["Status"],
+ expiration_days=expiration.get("Days") if expiration else None,
+ expiration_date=expiration.get("Date") if expiration else None,
+ transition_days=transition.get("Days") if transition else None,
+ transition_date=transition.get("Date") if transition else None,
+ storage_class=transition.get("StorageClass")
+ if transition
+ else None,
+ expired_object_delete_marker=eodm,
+ nve_noncurrent_days=nve_noncurrent_days,
+ nvt_noncurrent_days=nvt_noncurrent_days,
+ nvt_storage_class=nvt_storage_class,
+ aimu_days=aimu_days,
+ )
+ )
+
+ def delete_lifecycle(self):
+ self.rules = []
+
+ def set_cors(self, rules):
+ self.cors = []
+
+ if len(rules) > 100:
+ raise MalformedXML()
+
+ for rule in rules:
+ assert isinstance(rule["AllowedMethod"], list) or isinstance(
+ rule["AllowedMethod"], str
+ )
+ assert isinstance(rule["AllowedOrigin"], list) or isinstance(
+ rule["AllowedOrigin"], str
+ )
+ assert isinstance(rule.get("AllowedHeader", []), list) or isinstance(
+ rule.get("AllowedHeader", ""), str
+ )
+ assert isinstance(rule.get("ExposeHeader", []), list) or isinstance(
+ rule.get("ExposeHeader", ""), str
+ )
+ assert isinstance(rule.get("MaxAgeSeconds", "0"), str)
+
+ if isinstance(rule["AllowedMethod"], str):
+ methods = [rule["AllowedMethod"]]
+ else:
+ methods = rule["AllowedMethod"]
+
+ for method in methods:
+ if method not in ["GET", "PUT", "HEAD", "POST", "DELETE"]:
+ raise InvalidRequest(method)
+
+ self.cors.append(
+ CorsRule(
+ rule["AllowedMethod"],
+ rule["AllowedOrigin"],
+ rule.get("AllowedHeader"),
+ rule.get("ExposeHeader"),
+ rule.get("MaxAgeSeconds"),
+ )
+ )
+
+ def delete_cors(self):
+ self.cors = []
+
+ def set_logging(self, logging_config, bucket_backend):
+ if not logging_config:
+ self.logging = {}
+ return
+
+ # Target bucket must exist in the same account (assuming all moto buckets are in the same account):
+ if not bucket_backend.buckets.get(logging_config["TargetBucket"]):
+ raise InvalidTargetBucketForLogging(
+ "The target bucket for logging does not exist."
+ )
+
+ # Does the target bucket have the log-delivery WRITE and READ_ACP permissions?
+ write = read_acp = False
+ for grant in bucket_backend.buckets[logging_config["TargetBucket"]].acl.grants:
+ # Must be granted to: http://acs.amazonaws.com/groups/s3/LogDelivery
+ for grantee in grant.grantees:
+ if grantee.uri == "http://acs.amazonaws.com/groups/s3/LogDelivery":
+ if (
+ "WRITE" in grant.permissions
+ or "FULL_CONTROL" in grant.permissions
+ ):
+ write = True
+
+ if (
+ "READ_ACP" in grant.permissions
+ or "FULL_CONTROL" in grant.permissions
+ ):
+ read_acp = True
+
+ break
+
+ if not write or not read_acp:
+ raise InvalidTargetBucketForLogging(
+ "You must give the log-delivery group WRITE and READ_ACP"
+ " permissions to the target bucket"
+ )
+
+ # Buckets must also exist within the same region:
+ if (
+ bucket_backend.buckets[logging_config["TargetBucket"]].region_name
+ != self.region_name
+ ):
+ raise CrossLocationLoggingProhibitted()
+
+ # Checks pass -- set the logging config:
+ self.logging = logging_config
+
+ def set_notification_configuration(self, notification_config):
+ if not notification_config:
+ self.notification_configuration = None
+ return
+
+ self.notification_configuration = NotificationConfiguration(
+ topic=notification_config.get("TopicConfiguration"),
+ queue=notification_config.get("QueueConfiguration"),
+ cloud_function=notification_config.get("CloudFunctionConfiguration"),
+ )
+
+ # Validate that the region is correct:
+ for thing in ["topic", "queue", "cloud_function"]:
+ for t in getattr(self.notification_configuration, thing):
+ region = t.arn.split(":")[3]
+ if region != self.region_name:
+ raise InvalidNotificationDestination()
+
+ # Send test events so the user can verify these notifications were set correctly
+ notifications.send_test_event(bucket=self)
+
+ def set_accelerate_configuration(self, accelerate_config):
+ if self.accelerate_configuration is None and accelerate_config == "Suspended":
+ # Cannot "suspend" a not active acceleration. Leaves it undefined
+ return
+
+ self.accelerate_configuration = accelerate_config
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in [
+ "Arn",
+ "DomainName",
+ "DualStackDomainName",
+ "RegionalDomainName",
+ "WebsiteURL",
+ ]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.arn
+ elif attribute_name == "DomainName":
+ return self.domain_name
+ elif attribute_name == "DualStackDomainName":
+ return self.dual_stack_domain_name
+ elif attribute_name == "RegionalDomainName":
+ return self.regional_domain_name
+ elif attribute_name == "WebsiteURL":
+ return self.website_url
+ raise UnformattedGetAttTemplateException()
+
+ def set_acl(self, acl):
+ self.acl = acl
+
+ @property
+ def arn(self):
+ return "arn:aws:s3:::{}".format(self.name)
+
+ @property
+ def domain_name(self):
+ return "{}.s3.amazonaws.com".format(self.name)
+
+ @property
+ def dual_stack_domain_name(self):
+ return "{}.s3.dualstack.{}.amazonaws.com".format(self.name, self.region_name)
+
+ @property
+ def regional_domain_name(self):
+ return "{}.s3.{}.amazonaws.com".format(self.name, self.region_name)
+
+ @property
+ def website_url(self):
+ return "http://{}.s3-website.{}.amazonaws.com".format(
+ self.name, self.region_name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.name
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "BucketName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html
+ return "AWS::S3::Bucket"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ bucket = s3_backend.create_bucket(resource_name, region_name)
+
+ properties = cloudformation_json.get("Properties", {})
+
+ if "BucketEncryption" in properties:
+ bucket_encryption = cfn_to_api_encryption(properties["BucketEncryption"])
+ s3_backend.put_bucket_encryption(
+ bucket_name=resource_name, encryption=bucket_encryption
+ )
+
+ return bucket
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+
+ if is_replacement_update(properties):
+ resource_name_property = cls.cloudformation_name_type()
+ if resource_name_property not in properties:
+ properties[resource_name_property] = new_resource_name
+ new_resource = cls.create_from_cloudformation_json(
+ properties[resource_name_property], cloudformation_json, region_name
+ )
+ properties[resource_name_property] = original_resource.name
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else: # No Interruption
+ if "BucketEncryption" in properties:
+ bucket_encryption = cfn_to_api_encryption(
+ properties["BucketEncryption"]
+ )
+ s3_backend.put_bucket_encryption(
+ bucket_name=original_resource.name, encryption=bucket_encryption
+ )
+ return original_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ s3_backend.delete_bucket(resource_name)
+
+ def to_config_dict(self):
+ """Return the AWS Config JSON format of this S3 bucket.
+
+ Note: The following features are not implemented and will need to be if you care about them:
+ - Bucket Accelerate Configuration
+ """
+ config_dict = {
+ "version": "1.3",
+ "configurationItemCaptureTime": str(self.creation_date),
+ "configurationItemStatus": "ResourceDiscovered",
+ "configurationStateId": str(
+ int(time.mktime(self.creation_date.timetuple()))
+ ), # PY2 and 3 compatible
+ "configurationItemMD5Hash": "",
+ "arn": self.arn,
+ "resourceType": "AWS::S3::Bucket",
+ "resourceId": self.name,
+ "resourceName": self.name,
+ "awsRegion": self.region_name,
+ "availabilityZone": "Regional",
+ "resourceCreationTime": str(self.creation_date),
+ "relatedEvents": [],
+ "relationships": [],
+ "tags": s3_backend.tagger.get_tag_dict_for_resource(self.arn),
+ "configuration": {
+ "name": self.name,
+ "owner": {"id": OWNER},
+ "creationDate": self.creation_date.isoformat(),
+ },
+ }
+
+ # Make the supplementary configuration:
+ # This is a dobule-wrapped JSON for some reason...
+ s_config = {
+ "AccessControlList": json.dumps(json.dumps(self.acl.to_config_dict()))
+ }
+
+ if self.public_access_block:
+ s_config["PublicAccessBlockConfiguration"] = json.dumps(
+ self.public_access_block.to_config_dict()
+ )
+
+ # Tagging is special:
+ if config_dict["tags"]:
+ s_config["BucketTaggingConfiguration"] = json.dumps(
+ {"tagSets": [{"tags": config_dict["tags"]}]}
+ )
+
+ # TODO implement Accelerate Configuration:
+ s_config["BucketAccelerateConfiguration"] = {"status": None}
+
+ if self.rules:
+ s_config["BucketLifecycleConfiguration"] = {
+ "rules": [rule.to_config_dict() for rule in self.rules]
+ }
+
+ s_config["BucketLoggingConfiguration"] = {
+ "destinationBucketName": self.logging.get("TargetBucket", None),
+ "logFilePrefix": self.logging.get("TargetPrefix", None),
+ }
+
+ s_config["BucketPolicy"] = {
+ "policyText": self.policy.decode("utf-8") if self.policy else None
+ }
+
+ s_config["IsRequesterPaysEnabled"] = (
+ "false" if self.payer == "BucketOwner" else "true"
+ )
+
+ if self.notification_configuration:
+ s_config[
+ "BucketNotificationConfiguration"
+ ] = self.notification_configuration.to_config_dict()
+ else:
+ s_config["BucketNotificationConfiguration"] = {"configurations": {}}
+
+ config_dict["supplementaryConfiguration"] = s_config
+
+ return config_dict
+
+ @property
+ def has_default_lock(self):
+ if not self.object_lock_enabled:
+ return False
+
+ if self.default_lock_mode:
+ return True
+
+ return False
+
+ def default_retention(self):
+ now = datetime.datetime.utcnow()
+ now += datetime.timedelta(self.default_lock_days)
+ now += datetime.timedelta(self.default_lock_years * 365)
+ return now.strftime("%Y-%m-%dT%H:%M:%SZ")
+
+
+class S3Backend(BaseBackend, CloudWatchMetricProvider):
+ """
+ Moto implementation for S3.
+
+ Custom S3 endpoints are supported, if you are using a S3-compatible storage solution like Ceph.
+ Example usage:
+
+ .. sourcecode:: python
+
+ os.environ["MOTO_S3_CUSTOM_ENDPOINTS"] = "http://custom.internal.endpoint,http://custom.other.endpoint"
+ @mock_s3
+ def test_my_custom_endpoint():
+ boto3.client("s3", endpoint_url="http://custom.internal.endpoint")
+ ...
+
+ Note that this only works if the environment variable is set **before** the mock is initialized.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.buckets = {}
+ self.tagger = TaggingService()
+
+ @property
+ def _url_module(self):
+ # The urls-property can be different depending on env variables
+ # Force a reload, to retrieve the correct set of URLs
+ import moto.s3.urls as backend_urls_module
+
+ reload(backend_urls_module)
+ return backend_urls_module
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """List of dicts representing default VPC endpoints for this service."""
+ accesspoint = {
+ "AcceptanceRequired": False,
+ "AvailabilityZones": zones,
+ "BaseEndpointDnsNames": [
+ f"accesspoint.s3-global.{service_region}.vpce.amazonaws.com",
+ ],
+ "ManagesVpcEndpoints": False,
+ "Owner": "amazon",
+ "PrivateDnsName": "*.accesspoint.s3-global.amazonaws.com",
+ "PrivateDnsNameVerificationState": "verified",
+ "PrivateDnsNames": [
+ {"PrivateDnsName": "*.accesspoint.s3-global.amazonaws.com"}
+ ],
+ "ServiceId": f"vpce-svc-{BaseBackend.vpce_random_number()}",
+ "ServiceName": "com.amazonaws.s3-global.accesspoint",
+ "ServiceType": [{"ServiceType": "Interface"}],
+ "Tags": [],
+ "VpcEndpointPolicySupported": True,
+ }
+ return (
+ BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "s3", "Interface"
+ )
+ + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "s3", "Gateway"
+ )
+ + [accesspoint]
+ )
+
+ # TODO: This is broken! DO NOT IMPORT MUTABLE DATA TYPES FROM OTHER AREAS -- THIS BREAKS UNMOCKING!
+ # WRAP WITH A GETTER/SETTER FUNCTION
+ # Register this class as a CloudWatch Metric Provider
+ # Must provide a method 'get_cloudwatch_metrics' that will return a list of metrics, based on the data available
+ # metric_providers["S3"] = self
+
+ @classmethod
+ def get_cloudwatch_metrics(cls):
+ metrics = []
+ for name, bucket in s3_backend.buckets.items():
+ metrics.append(
+ MetricDatum(
+ namespace="AWS/S3",
+ name="BucketSizeBytes",
+ value=bucket.keys.item_size(),
+ dimensions=[
+ {"Name": "StorageType", "Value": "StandardStorage"},
+ {"Name": "BucketName", "Value": name},
+ ],
+ timestamp=datetime.datetime.now(tz=pytz.utc).replace(
+ hour=0, minute=0, second=0, microsecond=0
+ ),
+ unit="Bytes",
+ )
+ )
+ metrics.append(
+ MetricDatum(
+ namespace="AWS/S3",
+ name="NumberOfObjects",
+ value=len(bucket.keys),
+ dimensions=[
+ {"Name": "StorageType", "Value": "AllStorageTypes"},
+ {"Name": "BucketName", "Value": name},
+ ],
+ timestamp=datetime.datetime.now(tz=pytz.utc).replace(
+ hour=0, minute=0, second=0, microsecond=0
+ ),
+ unit="Count",
+ )
+ )
+ return metrics
+
+ def create_bucket(self, bucket_name, region_name):
+ if bucket_name in self.buckets:
+ raise BucketAlreadyExists(bucket=bucket_name)
+ if not MIN_BUCKET_NAME_LENGTH <= len(bucket_name) <= MAX_BUCKET_NAME_LENGTH:
+ raise InvalidBucketName()
+ new_bucket = FakeBucket(name=bucket_name, region_name=region_name)
+
+ self.buckets[bucket_name] = new_bucket
+
+ notification_detail = {
+ "version": "0",
+ "bucket": {"name": bucket_name},
+ "request-id": "N4N7GDK58NMKJ12R",
+ "requester": get_account_id(),
+ "source-ip-address": "1.2.3.4",
+ "reason": "PutObject",
+ }
+ events_send_notification(
+ source="aws.s3",
+ event_name="CreateBucket",
+ region=region_name,
+ resources=[f"arn:aws:s3:::{bucket_name}"],
+ detail=notification_detail,
+ )
+
+ return new_bucket
+
+ def list_buckets(self):
+ return self.buckets.values()
+
+ def get_bucket(self, bucket_name):
+ try:
+ return self.buckets[bucket_name]
+ except KeyError:
+ raise MissingBucket(bucket=bucket_name)
+
+ def head_bucket(self, bucket_name):
+ return self.get_bucket(bucket_name)
+
+ def delete_bucket(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ if bucket.keys:
+ # Can't delete a bucket with keys
+ return False
+ else:
+ return self.buckets.pop(bucket_name)
+
+ def set_bucket_versioning(self, bucket_name, status):
+ self.get_bucket(bucket_name).versioning_status = status
+
+ def get_bucket_versioning(self, bucket_name):
+ return self.get_bucket(bucket_name).versioning_status
+
+ def get_bucket_encryption(self, bucket_name):
+ return self.get_bucket(bucket_name).encryption
+
+ def list_object_versions(
+ self, bucket_name, delimiter=None, key_marker=None, prefix=""
+ ):
+ bucket = self.get_bucket(bucket_name)
+
+ common_prefixes = []
+ requested_versions = []
+ delete_markers = []
+ all_versions = itertools.chain(
+ *(copy.deepcopy(l) for key, l in bucket.keys.iterlists())
+ )
+ all_versions = list(all_versions)
+ # sort by name, revert last-modified-date
+ all_versions.sort(key=lambda r: (r.name, -unix_time_millis(r.last_modified)))
+ last_name = None
+ for version in all_versions:
+ name = version.name
+ # guaranteed to be sorted - so the first key with this name will be the latest
+ version.is_latest = name != last_name
+ if version.is_latest:
+ last_name = name
+ # skip all keys that alphabetically come before keymarker
+ if key_marker and name < key_marker:
+ continue
+ # Filter for keys that start with prefix
+ if not name.startswith(prefix):
+ continue
+ # separate out all keys that contain delimiter
+ if delimiter and delimiter in name:
+ index = name.index(delimiter) + len(delimiter)
+ prefix_including_delimiter = name[0:index]
+ common_prefixes.append(prefix_including_delimiter)
+ continue
+
+ # Differentiate between FakeKey and FakeDeleteMarkers
+ if not isinstance(version, FakeKey):
+ delete_markers.append(version)
+ continue
+
+ requested_versions.append(version)
+
+ common_prefixes = sorted(set(common_prefixes))
+
+ return requested_versions, common_prefixes, delete_markers
+
+ def get_bucket_policy(self, bucket_name):
+ return self.get_bucket(bucket_name).policy
+
+ def put_bucket_policy(self, bucket_name, policy):
+ self.get_bucket(bucket_name).policy = policy
+
+ def delete_bucket_policy(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.policy = None
+
+ def put_bucket_encryption(self, bucket_name, encryption):
+ self.get_bucket(bucket_name).encryption = encryption
+
+ def delete_bucket_encryption(self, bucket_name):
+ self.get_bucket(bucket_name).encryption = None
+
+ def get_bucket_replication(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return getattr(bucket, "replication", None)
+
+ def put_bucket_replication(self, bucket_name, replication):
+ if isinstance(replication["Rule"], dict):
+ replication["Rule"] = [replication["Rule"]]
+ for rule in replication["Rule"]:
+ if "Priority" not in rule:
+ rule["Priority"] = 1
+ if "ID" not in rule:
+ rule["ID"] = "".join(
+ random.choice(string.ascii_letters + string.digits)
+ for _ in range(30)
+ )
+ bucket = self.get_bucket(bucket_name)
+ bucket.replication = replication
+
+ def delete_bucket_replication(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.replication = None
+
+ def put_bucket_lifecycle(self, bucket_name, rules):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_lifecycle(rules)
+
+ def delete_bucket_lifecycle(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.delete_lifecycle()
+
+ def set_bucket_website_configuration(self, bucket_name, website_configuration):
+ bucket = self.get_bucket(bucket_name)
+ bucket.website_configuration = website_configuration
+
+ def get_bucket_website_configuration(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.website_configuration
+
+ def delete_bucket_website(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.website_configuration = None
+
+ def get_public_access_block(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+
+ if not bucket.public_access_block:
+ raise NoSuchPublicAccessBlockConfiguration()
+
+ return bucket.public_access_block
+
+ def put_object(
+ self,
+ bucket_name,
+ key_name,
+ value,
+ storage=None,
+ etag=None,
+ multipart=None,
+ encryption=None,
+ kms_key_id=None,
+ bucket_key_enabled=None,
+ lock_mode=None,
+ lock_legal_status=None,
+ lock_until=None,
+ ):
+ key_name = clean_key_name(key_name)
+ if storage is not None and storage not in STORAGE_CLASS:
+ raise InvalidStorageClass(storage=storage)
+
+ bucket = self.get_bucket(bucket_name)
+
+ # getting default config from bucket if not included in put request
+ if bucket.encryption:
+ bucket_key_enabled = bucket_key_enabled or bucket.encryption["Rule"].get(
+ "BucketKeyEnabled", False
+ )
+ kms_key_id = kms_key_id or bucket.encryption["Rule"][
+ "ApplyServerSideEncryptionByDefault"
+ ].get("KMSMasterKeyID")
+ encryption = (
+ encryption
+ or bucket.encryption["Rule"]["ApplyServerSideEncryptionByDefault"][
+ "SSEAlgorithm"
+ ]
+ )
+
+ new_key = FakeKey(
+ name=key_name,
+ bucket_name=bucket_name,
+ value=value,
+ storage=storage,
+ etag=etag,
+ is_versioned=bucket.is_versioned,
+ version_id=str(uuid.uuid4()) if bucket.is_versioned else "null",
+ multipart=multipart,
+ encryption=encryption,
+ kms_key_id=kms_key_id,
+ bucket_key_enabled=bucket_key_enabled,
+ lock_mode=lock_mode,
+ lock_legal_status=lock_legal_status,
+ lock_until=lock_until,
+ s3_backend=s3_backend,
+ )
+
+ keys = [
+ key
+ for key in bucket.keys.getlist(key_name, [])
+ if key.version_id != new_key.version_id
+ ] + [new_key]
+ bucket.keys.setlist(key_name, keys)
+
+ notifications.send_event(notifications.S3_OBJECT_CREATE_PUT, bucket, new_key)
+
+ return new_key
+
+ def put_object_acl(self, bucket_name, key_name, acl):
+ key = self.get_object(bucket_name, key_name)
+ # TODO: Support the XML-based ACL format
+ if key is not None:
+ key.set_acl(acl)
+ else:
+ raise MissingKey(key=key_name)
+
+ def put_object_legal_hold(
+ self, bucket_name, key_name, version_id, legal_hold_status
+ ):
+ key = self.get_object(bucket_name, key_name, version_id=version_id)
+ key.lock_legal_status = legal_hold_status
+
+ def put_object_retention(self, bucket_name, key_name, version_id, retention):
+ key = self.get_object(bucket_name, key_name, version_id=version_id)
+ key.lock_mode = retention[0]
+ key.lock_until = retention[1]
+
+ def get_object(
+ self,
+ bucket_name,
+ key_name,
+ version_id=None,
+ part_number=None,
+ key_is_clean=False,
+ ):
+ if not key_is_clean:
+ key_name = clean_key_name(key_name)
+ bucket = self.get_bucket(bucket_name)
+ key = None
+
+ if bucket:
+ if version_id is None:
+ if key_name in bucket.keys:
+ key = bucket.keys[key_name]
+ else:
+ for key_version in bucket.keys.getlist(key_name, default=[]):
+ if str(key_version.version_id) == str(version_id):
+ key = key_version
+ break
+
+ if part_number and key and key.multipart:
+ key = key.multipart.parts[part_number]
+
+ if isinstance(key, FakeKey):
+ return key
+ else:
+ return None
+
+ def head_object(self, bucket_name, key_name, version_id=None, part_number=None):
+ return self.get_object(bucket_name, key_name, version_id, part_number)
+
+ def get_object_acl(self, key):
+ return key.acl
+
+ def get_object_legal_hold(self, key):
+ return key.lock_legal_status
+
+ def get_object_lock_configuration(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ if not bucket.object_lock_enabled:
+ raise ObjectLockConfigurationNotFoundError
+ return (
+ bucket.object_lock_enabled,
+ bucket.default_lock_mode,
+ bucket.default_lock_days,
+ bucket.default_lock_years,
+ )
+
+ def get_object_tagging(self, key):
+ return self.tagger.list_tags_for_resource(key.arn)
+
+ def set_key_tags(self, key, tags, key_name=None):
+ if key is None:
+ raise MissingKey(key=key_name)
+ boto_tags_dict = self.tagger.convert_dict_to_tags_input(tags)
+ errmsg = self.tagger.validate_tags(boto_tags_dict)
+ if errmsg:
+ raise InvalidTagError(errmsg)
+ self.tagger.delete_all_tags_for_resource(key.arn)
+ self.tagger.tag_resource(key.arn, boto_tags_dict)
+ return key
+
+ def get_bucket_tagging(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return self.tagger.list_tags_for_resource(bucket.arn)
+
+ def put_bucket_tagging(self, bucket_name, tags):
+ bucket = self.get_bucket(bucket_name)
+ self.tagger.delete_all_tags_for_resource(bucket.arn)
+ self.tagger.tag_resource(
+ bucket.arn, [{"Key": key, "Value": value} for key, value in tags.items()]
+ )
+
+ def put_object_lock_configuration(
+ self, bucket_name, lock_enabled, mode=None, days=None, years=None
+ ):
+ bucket = self.get_bucket(bucket_name)
+
+ if bucket.keys.item_size() > 0:
+ raise BucketNeedsToBeNew
+
+ if lock_enabled:
+ bucket.object_lock_enabled = True
+ bucket.versioning_status = "Enabled"
+
+ bucket.default_lock_mode = mode
+ bucket.default_lock_days = days
+ bucket.default_lock_years = years
+
+ def delete_bucket_tagging(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ self.tagger.delete_all_tags_for_resource(bucket.arn)
+
+ def put_bucket_cors(self, bucket_name, cors_rules):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_cors(cors_rules)
+
+ def put_bucket_logging(self, bucket_name, logging_config):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_logging(logging_config, self)
+
+ def delete_bucket_cors(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.delete_cors()
+
+ def delete_public_access_block(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ bucket.public_access_block = None
+
+ def put_bucket_notification_configuration(self, bucket_name, notification_config):
+ """
+ The configuration can be persisted, but at the moment we only send notifications to the following targets:
+
+ - AWSLambda
+ - SQS
+
+ For the following events:
+
+ - 's3:ObjectCreated:Copy'
+ - 's3:ObjectCreated:Put'
+ """
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_notification_configuration(notification_config)
+
+ def put_bucket_accelerate_configuration(
+ self, bucket_name, accelerate_configuration
+ ):
+ if accelerate_configuration not in ["Enabled", "Suspended"]:
+ raise MalformedXML()
+
+ bucket = self.get_bucket(bucket_name)
+ if bucket.name.find(".") != -1:
+ raise InvalidRequest("PutBucketAccelerateConfiguration")
+ bucket.set_accelerate_configuration(accelerate_configuration)
+
+ def put_bucket_public_access_block(self, bucket_name, pub_block_config):
+ bucket = self.get_bucket(bucket_name)
+
+ if not pub_block_config:
+ raise InvalidPublicAccessBlockConfiguration()
+
+ bucket.public_access_block = PublicAccessBlock(
+ pub_block_config.get("BlockPublicAcls"),
+ pub_block_config.get("IgnorePublicAcls"),
+ pub_block_config.get("BlockPublicPolicy"),
+ pub_block_config.get("RestrictPublicBuckets"),
+ )
+
+ def complete_multipart(self, bucket_name, multipart_id, body):
+ bucket = self.get_bucket(bucket_name)
+ multipart = bucket.multiparts[multipart_id]
+ value, etag = multipart.complete(body)
+ if value is None:
+ return
+ del bucket.multiparts[multipart_id]
+
+ key = self.put_object(
+ bucket_name, multipart.key_name, value, etag=etag, multipart=multipart
+ )
+ key.set_metadata(multipart.metadata)
+ return key
+
+ def abort_multipart_upload(self, bucket_name, multipart_id):
+ bucket = self.get_bucket(bucket_name)
+ multipart_data = bucket.multiparts.get(multipart_id, None)
+ if not multipart_data:
+ raise NoSuchUpload(upload_id=multipart_id)
+ del bucket.multiparts[multipart_id]
+
+ def list_parts(
+ self, bucket_name, multipart_id, part_number_marker=0, max_parts=1000
+ ):
+ bucket = self.get_bucket(bucket_name)
+ if multipart_id not in bucket.multiparts:
+ raise NoSuchUpload(upload_id=multipart_id)
+ return list(
+ bucket.multiparts[multipart_id].list_parts(part_number_marker, max_parts)
+ )
+
+ def is_truncated(self, bucket_name, multipart_id, next_part_number_marker):
+ bucket = self.get_bucket(bucket_name)
+ return len(bucket.multiparts[multipart_id].parts) > next_part_number_marker
+
+ def create_multipart_upload(
+ self, bucket_name, key_name, metadata, storage_type, tags, acl
+ ):
+ multipart = FakeMultipart(
+ key_name, metadata, storage=storage_type, tags=tags, acl=acl
+ )
+
+ bucket = self.get_bucket(bucket_name)
+ bucket.multiparts[multipart.id] = multipart
+ return multipart.id
+
+ def complete_multipart_upload(self, bucket_name, multipart_id, body):
+ bucket = self.get_bucket(bucket_name)
+ multipart = bucket.multiparts[multipart_id]
+ value, etag = multipart.complete(body)
+ if value is not None:
+ del bucket.multiparts[multipart_id]
+ return multipart, value, etag
+
+ def get_all_multiparts(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.multiparts
+
+ def upload_part(self, bucket_name, multipart_id, part_id, value):
+ bucket = self.get_bucket(bucket_name)
+ multipart = bucket.multiparts[multipart_id]
+ return multipart.set_part(part_id, value)
+
+ def copy_part(
+ self,
+ dest_bucket_name,
+ multipart_id,
+ part_id,
+ src_bucket_name,
+ src_key_name,
+ src_version_id,
+ start_byte,
+ end_byte,
+ ):
+ dest_bucket = self.get_bucket(dest_bucket_name)
+ multipart = dest_bucket.multiparts[multipart_id]
+
+ src_value = self.get_object(
+ src_bucket_name, src_key_name, version_id=src_version_id
+ ).value
+ if start_byte is not None:
+ src_value = src_value[start_byte : end_byte + 1]
+ return multipart.set_part(part_id, src_value)
+
+ def list_objects(self, bucket, prefix, delimiter):
+ key_results = set()
+ folder_results = set()
+ if prefix:
+ for key_name, key in bucket.keys.items():
+ if key_name.startswith(prefix):
+ key_without_prefix = key_name.replace(prefix, "", 1)
+ if delimiter and delimiter in key_without_prefix:
+ # If delimiter, we need to split out folder_results
+ key_without_delimiter = key_without_prefix.split(delimiter)[0]
+ folder_results.add(
+ "{0}{1}{2}".format(prefix, key_without_delimiter, delimiter)
+ )
+ else:
+ key_results.add(key)
+ else:
+ for key_name, key in bucket.keys.items():
+ if delimiter and delimiter in key_name:
+ # If delimiter, we need to split out folder_results
+ folder_results.add(key_name.split(delimiter)[0] + delimiter)
+ else:
+ key_results.add(key)
+
+ key_results = filter(
+ lambda key: not isinstance(key, FakeDeleteMarker), key_results
+ )
+ key_results = sorted(key_results, key=lambda key: key.name)
+ folder_results = [
+ folder_name for folder_name in sorted(folder_results, key=lambda key: key)
+ ]
+
+ return key_results, folder_results
+
+ def list_objects_v2(self, bucket, prefix, delimiter):
+ result_keys, result_folders = self.list_objects(bucket, prefix, delimiter)
+ # sort the combination of folders and keys into lexicographical order
+ all_keys = result_keys + result_folders
+ all_keys.sort(key=self._get_name)
+ return all_keys
+
+ @staticmethod
+ def _get_name(key):
+ if isinstance(key, FakeKey):
+ return key.name
+ else:
+ return key
+
+ def _set_delete_marker(self, bucket_name, key_name):
+ bucket = self.get_bucket(bucket_name)
+ delete_marker = FakeDeleteMarker(key=bucket.keys[key_name])
+ bucket.keys[key_name] = delete_marker
+ return delete_marker
+
+ def delete_object_tagging(self, bucket_name, key_name, version_id=None):
+ key = self.get_object(bucket_name, key_name, version_id=version_id)
+ self.tagger.delete_all_tags_for_resource(key.arn)
+
+ def delete_object(self, bucket_name, key_name, version_id=None, bypass=False):
+ key_name = clean_key_name(key_name)
+ bucket = self.get_bucket(bucket_name)
+
+ response_meta = {}
+
+ try:
+ if not bucket.is_versioned:
+ bucket.keys.pop(key_name)
+ else:
+ if version_id is None:
+ delete_marker = self._set_delete_marker(bucket_name, key_name)
+ response_meta["version-id"] = delete_marker.version_id
+ else:
+ if key_name not in bucket.keys:
+ raise KeyError
+
+ response_meta["delete-marker"] = "false"
+ for key in bucket.keys.getlist(key_name):
+ if str(key.version_id) == str(version_id):
+
+ if (
+ hasattr(key, "is_locked")
+ and key.is_locked
+ and not bypass
+ ):
+ raise AccessDeniedByLock
+
+ if type(key) is FakeDeleteMarker:
+ response_meta["delete-marker"] = "true"
+ break
+
+ bucket.keys.setlist(
+ key_name,
+ [
+ key
+ for key in bucket.keys.getlist(key_name)
+ if str(key.version_id) != str(version_id)
+ ],
+ )
+
+ if not bucket.keys.getlist(key_name):
+ bucket.keys.pop(key_name)
+ return True, response_meta
+ except KeyError:
+ return False, None
+
+ def delete_objects(self, bucket_name, objects):
+ deleted_objects = []
+ for object_ in objects:
+ key_name = object_["Key"]
+ version_id = object_.get("VersionId", None)
+
+ self.delete_object(
+ bucket_name, undo_clean_key_name(key_name), version_id=version_id
+ )
+ deleted_objects.append((key_name, version_id))
+ return deleted_objects
+
+ def copy_object(
+ self,
+ src_key,
+ dest_bucket_name,
+ dest_key_name,
+ storage=None,
+ acl=None,
+ encryption=None,
+ kms_key_id=None,
+ bucket_key_enabled=False,
+ mdirective=None,
+ ):
+ if (
+ src_key.name == dest_key_name
+ and src_key.bucket_name == dest_bucket_name
+ and storage == src_key.storage_class
+ and acl == src_key.acl
+ and encryption == src_key.encryption
+ and kms_key_id == src_key.kms_key_id
+ and bucket_key_enabled == (src_key.bucket_key_enabled or False)
+ and mdirective != "REPLACE"
+ ):
+ raise CopyObjectMustChangeSomething
+
+ new_key = self.put_object(
+ bucket_name=dest_bucket_name,
+ key_name=dest_key_name,
+ value=src_key.value,
+ storage=storage or src_key.storage_class,
+ multipart=src_key.multipart,
+ encryption=encryption or src_key.encryption,
+ kms_key_id=kms_key_id or src_key.kms_key_id,
+ bucket_key_enabled=bucket_key_enabled or src_key.bucket_key_enabled,
+ lock_mode=src_key.lock_mode,
+ lock_legal_status=src_key.lock_legal_status,
+ lock_until=src_key.lock_until,
+ )
+ self.tagger.copy_tags(src_key.arn, new_key.arn)
+ new_key.set_metadata(src_key.metadata)
+
+ if acl is not None:
+ new_key.set_acl(acl)
+ if src_key.storage_class in "GLACIER":
+ # Object copied from Glacier object should not have expiry
+ new_key.set_expiry(None)
+
+ # Send notifications that an object was copied
+ bucket = self.get_bucket(dest_bucket_name)
+ notifications.send_event(notifications.S3_OBJECT_CREATE_COPY, bucket, new_key)
+
+ def put_bucket_acl(self, bucket_name, acl):
+ bucket = self.get_bucket(bucket_name)
+ bucket.set_acl(acl)
+
+ def get_bucket_acl(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.acl
+
+ def get_bucket_cors(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.cors
+
+ def get_bucket_lifecycle(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.rules
+
+ def get_bucket_location(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+
+ return bucket.location
+
+ def get_bucket_logging(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.logging
+
+ def get_bucket_notification_configuration(self, bucket_name):
+ bucket = self.get_bucket(bucket_name)
+ return bucket.notification_configuration
+
+
+s3_backends = BackendDict(
+ S3Backend, service_name="s3", use_boto3_regions=False, additional_regions=["global"]
+)
+s3_backend = s3_backends["global"]
diff --git a/contrib/python/moto/py3/moto/s3/notifications.py b/contrib/python/moto/py3/moto/s3/notifications.py
new file mode 100644
index 0000000000..0de29b8524
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/notifications.py
@@ -0,0 +1,108 @@
+import json
+from datetime import datetime
+
+_EVENT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
+
+S3_OBJECT_CREATE_COPY = "s3:ObjectCreated:Copy"
+S3_OBJECT_CREATE_PUT = "s3:ObjectCreated:Put"
+
+
+def _get_s3_event(event_name, bucket, key, notification_id):
+ etag = key.etag.replace('"', "")
+ # s3:ObjectCreated:Put --> ObjectCreated:Put
+ event_name = event_name[3:]
+ event_time = datetime.now().strftime(_EVENT_TIME_FORMAT)
+ return {
+ "Records": [
+ {
+ "eventVersion": "2.1",
+ "eventSource": "aws:s3",
+ "awsRegion": bucket.region_name,
+ "eventTime": event_time,
+ "eventName": event_name,
+ "s3": {
+ "s3SchemaVersion": "1.0",
+ "configurationId": notification_id,
+ "bucket": {
+ "name": bucket.name,
+ "arn": f"arn:aws:s3:::{bucket.name}",
+ },
+ "object": {"key": key.name, "size": key.size, "eTag": etag},
+ },
+ }
+ ]
+ }
+
+
+def _get_region_from_arn(arn):
+ return arn.split(":")[3]
+
+
+def send_event(event_name, bucket, key):
+ if bucket.notification_configuration is None:
+ return
+
+ for notification in bucket.notification_configuration.cloud_function:
+ if notification.matches(event_name, key.name):
+ event_body = _get_s3_event(event_name, bucket, key, notification.id)
+ region_name = _get_region_from_arn(notification.arn)
+
+ _invoke_awslambda(event_body, notification.arn, region_name)
+
+ for notification in bucket.notification_configuration.queue:
+ if notification.matches(event_name, key.name):
+ event_body = _get_s3_event(event_name, bucket, key, notification.id)
+ region_name = _get_region_from_arn(notification.arn)
+ queue_name = notification.arn.split(":")[-1]
+
+ _send_sqs_message(event_body, queue_name, region_name)
+
+
+def _send_sqs_message(event_body, queue_name, region_name):
+ try:
+ from moto.sqs.models import sqs_backends
+
+ sqs_backend = sqs_backends[region_name]
+ sqs_backend.send_message(
+ queue_name=queue_name, message_body=json.dumps(event_body)
+ )
+ except: # noqa
+ # This is an async action in AWS.
+ # Even if this part fails, the calling function should pass, so catch all errors
+ # Possible exceptions that could be thrown:
+ # - Queue does not exist
+ pass
+
+
+def _invoke_awslambda(event_body, fn_arn, region_name):
+ try:
+ from moto.awslambda.models import lambda_backends
+
+ lambda_backend = lambda_backends[region_name]
+ func = lambda_backend.get_function(fn_arn)
+ func.invoke(json.dumps(event_body), dict(), dict())
+ except: # noqa
+ # This is an async action in AWS.
+ # Even if this part fails, the calling function should pass, so catch all errors
+ # Possible exceptions that could be thrown:
+ # - Function does not exist
+ pass
+
+
+def _get_test_event(bucket_name):
+ event_time = datetime.now().strftime(_EVENT_TIME_FORMAT)
+ return {
+ "Service": "Amazon S3",
+ "Event": "s3:TestEvent",
+ "Time": event_time,
+ "Bucket": bucket_name,
+ }
+
+
+def send_test_event(bucket):
+ arns = [n.arn for n in bucket.notification_configuration.queue]
+ for arn in set(arns):
+ region_name = _get_region_from_arn(arn)
+ queue_name = arn.split(":")[-1]
+ message_body = _get_test_event(bucket.name)
+ _send_sqs_message(message_body, queue_name, region_name)
diff --git a/contrib/python/moto/py3/moto/s3/responses.py b/contrib/python/moto/py3/moto/s3/responses.py
new file mode 100644
index 0000000000..b16af818e6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/responses.py
@@ -0,0 +1,2781 @@
+import io
+import os
+import re
+from typing import List, Union
+
+from moto import settings
+from moto.core.utils import (
+ amzn_request_id,
+ extract_region_from_aws_authorization,
+ str_to_rfc_1123_datetime,
+)
+from urllib.parse import parse_qs, urlparse, unquote, urlencode, urlunparse
+
+import xmltodict
+
+from moto.core.responses import _TemplateEnvironmentMixin, ActionAuthenticatorMixin
+from moto.core.utils import path_url
+from moto.core import get_account_id
+
+from moto.s3bucket_path.utils import (
+ bucket_name_from_url as bucketpath_bucket_name_from_url,
+ parse_key_name as bucketpath_parse_key_name,
+ is_delete_keys as bucketpath_is_delete_keys,
+)
+
+from .exceptions import (
+ BucketAlreadyExists,
+ BucketAccessDeniedError,
+ BucketMustHaveLockeEnabled,
+ DuplicateTagKeys,
+ InvalidContentMD5,
+ InvalidContinuationToken,
+ S3ClientError,
+ MissingBucket,
+ MissingKey,
+ MissingVersion,
+ InvalidMaxPartArgument,
+ InvalidMaxPartNumberArgument,
+ NotAnIntegerException,
+ InvalidPartOrder,
+ MalformedXML,
+ MalformedACLError,
+ IllegalLocationConstraintException,
+ InvalidNotificationARN,
+ InvalidNotificationEvent,
+ S3AclAndGrantError,
+ InvalidObjectState,
+ ObjectNotInActiveTierError,
+ NoSystemTags,
+ PreconditionFailed,
+ InvalidRange,
+ LockNotEnabled,
+)
+from .models import s3_backend, get_canned_acl, FakeGrantee, FakeGrant, FakeAcl, FakeKey
+from .utils import bucket_name_from_url, metadata_from_headers, parse_region_from_url
+from xml.dom import minidom
+
+
+DEFAULT_REGION_NAME = "us-east-1"
+
+ACTION_MAP = {
+ "BUCKET": {
+ "HEAD": {"DEFAULT": "HeadBucket"},
+ "GET": {
+ "uploads": "ListBucketMultipartUploads",
+ "location": "GetBucketLocation",
+ "lifecycle": "GetLifecycleConfiguration",
+ "versioning": "GetBucketVersioning",
+ "policy": "GetBucketPolicy",
+ "website": "GetBucketWebsite",
+ "acl": "GetBucketAcl",
+ "tagging": "GetBucketTagging",
+ "logging": "GetBucketLogging",
+ "cors": "GetBucketCORS",
+ "notification": "GetBucketNotification",
+ "accelerate": "GetAccelerateConfiguration",
+ "versions": "ListBucketVersions",
+ "public_access_block": "GetPublicAccessBlock",
+ "DEFAULT": "ListBucket",
+ },
+ "PUT": {
+ "lifecycle": "PutLifecycleConfiguration",
+ "versioning": "PutBucketVersioning",
+ "policy": "PutBucketPolicy",
+ "website": "PutBucketWebsite",
+ "acl": "PutBucketAcl",
+ "tagging": "PutBucketTagging",
+ "logging": "PutBucketLogging",
+ "cors": "PutBucketCORS",
+ "notification": "PutBucketNotification",
+ "accelerate": "PutAccelerateConfiguration",
+ "public_access_block": "PutPublicAccessBlock",
+ "DEFAULT": "CreateBucket",
+ },
+ "DELETE": {
+ "lifecycle": "PutLifecycleConfiguration",
+ "policy": "DeleteBucketPolicy",
+ "website": "DeleteBucketWebsite",
+ "tagging": "PutBucketTagging",
+ "cors": "PutBucketCORS",
+ "public_access_block": "DeletePublicAccessBlock",
+ "DEFAULT": "DeleteBucket",
+ },
+ },
+ "KEY": {
+ "HEAD": {"DEFAULT": "HeadObject"},
+ "GET": {
+ "uploadId": "ListMultipartUploadParts",
+ "acl": "GetObjectAcl",
+ "tagging": "GetObjectTagging",
+ "versionId": "GetObjectVersion",
+ "DEFAULT": "GetObject",
+ },
+ "PUT": {
+ "acl": "PutObjectAcl",
+ "tagging": "PutObjectTagging",
+ "DEFAULT": "PutObject",
+ },
+ "DELETE": {
+ "uploadId": "AbortMultipartUpload",
+ "versionId": "DeleteObjectVersion",
+ "DEFAULT": "DeleteObject",
+ },
+ "POST": {
+ "uploads": "PutObject",
+ "restore": "RestoreObject",
+ "uploadId": "PutObject",
+ },
+ },
+ "CONTROL": {
+ "GET": {"publicAccessBlock": "GetPublicAccessBlock"},
+ "PUT": {"publicAccessBlock": "PutPublicAccessBlock"},
+ "DELETE": {"publicAccessBlock": "DeletePublicAccessBlock"},
+ },
+}
+
+
+def parse_key_name(pth):
+ # strip the first '/' left by urlparse
+ return pth[1:] if pth.startswith("/") else pth
+
+
+def is_delete_keys(request, path):
+ # GOlang sends a request as url/?delete= (treating it as a normal key=value, even if the value is empty)
+ # Python sends a request as url/?delete (treating it as a flag)
+ # https://github.com/spulec/moto/issues/2937
+ return (
+ path == "/?delete"
+ or path == "/?delete="
+ or (path == "/" and getattr(request, "query_string", "") == "delete")
+ )
+
+
+class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
+ def __init__(self, backend):
+ super().__init__()
+ self.backend = backend
+ self.method = ""
+ self.path = ""
+ self.data = {}
+ self.headers = {}
+
+ @property
+ def should_autoescape(self):
+ return True
+
+ def all_buckets(self):
+ self.data["Action"] = "ListAllMyBuckets"
+ self._authenticate_and_authorize_s3_action()
+
+ # No bucket specified. Listing all buckets
+ all_buckets = self.backend.list_buckets()
+ template = self.response_template(S3_ALL_BUCKETS)
+ return template.render(buckets=all_buckets)
+
+ def subdomain_based_buckets(self, request):
+ if settings.S3_IGNORE_SUBDOMAIN_BUCKETNAME:
+ return False
+ host = request.headers.get("host", request.headers.get("Host"))
+ if not host:
+ host = urlparse(request.url).netloc
+
+ custom_endpoints = settings.get_s3_custom_endpoints()
+ if (
+ host
+ and custom_endpoints
+ and any([host in endpoint for endpoint in custom_endpoints])
+ ):
+ # Default to path-based buckets for S3-compatible SDKs (Ceph, DigitalOcean Spaces, etc)
+ return False
+
+ if (
+ not host
+ or host.startswith("localhost")
+ or host.startswith("localstack")
+ or host.startswith("host.docker.internal")
+ or re.match(r"^[^.]+$", host)
+ or re.match(r"^.*\.svc\.cluster\.local:?\d*$", host)
+ ):
+ # Default to path-based buckets for (1) localhost, (2) localstack hosts (e.g. localstack.dev),
+ # (3) local host names that do not contain a "." (e.g., Docker container host names), or
+ # (4) kubernetes host names
+ return False
+
+ match = re.match(r"^([^\[\]:]+)(:\d+)?$", host)
+ if match:
+ match = re.match(
+ r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}", match.groups()[0]
+ )
+ if match:
+ return False
+
+ match = re.match(r"^\[(.+)\](:\d+)?$", host)
+ if match:
+ match = re.match(
+ r"^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\Z",
+ match.groups()[0],
+ re.IGNORECASE,
+ )
+ if match:
+ return False
+
+ path_based = host == "s3.amazonaws.com" or re.match(
+ r"s3[\.\-]([^.]*)\.amazonaws\.com", host
+ )
+ return not path_based
+
+ def is_delete_keys(self, request, path, bucket_name):
+ if self.subdomain_based_buckets(request):
+ return is_delete_keys(request, path)
+ else:
+ return bucketpath_is_delete_keys(request, path, bucket_name)
+
+ def parse_bucket_name_from_url(self, request, url):
+ if self.subdomain_based_buckets(request):
+ return bucket_name_from_url(url)
+ else:
+ return bucketpath_bucket_name_from_url(url)
+
+ def parse_key_name(self, request, url):
+ if self.subdomain_based_buckets(request):
+ return parse_key_name(url)
+ else:
+ return bucketpath_parse_key_name(url)
+
+ def ambiguous_response(self, request, full_url, headers):
+ # Depending on which calling format the client is using, we don't know
+ # if this is a bucket or key request so we have to check
+ if self.subdomain_based_buckets(request):
+ return self.key_response(request, full_url, headers)
+ else:
+ # Using path-based buckets
+ return self.bucket_response(request, full_url, headers)
+
+ @amzn_request_id
+ def bucket_response(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ self.method = request.method
+ self.path = self._get_path(request)
+ # Make a copy of request.headers because it's immutable
+ self.headers = dict(request.headers)
+ if "Host" not in self.headers:
+ self.headers["Host"] = urlparse(full_url).netloc
+ try:
+ response = self._bucket_response(request, full_url)
+ except S3ClientError as s3error:
+ response = s3error.code, {}, s3error.description
+
+ return self._send_response(response)
+
+ @staticmethod
+ def _send_response(response):
+ if isinstance(response, str):
+ return 200, {}, response.encode("utf-8")
+ else:
+ status_code, headers, response_content = response
+ if not isinstance(response_content, bytes):
+ response_content = response_content.encode("utf-8")
+
+ return status_code, headers, response_content
+
+ def _bucket_response(self, request, full_url):
+ querystring = self._get_querystring(full_url)
+ method = request.method
+ region_name = parse_region_from_url(full_url, use_default_region=False)
+ if region_name is None:
+ region_name = extract_region_from_aws_authorization(
+ request.headers.get("Authorization", "")
+ )
+ region_name = region_name or DEFAULT_REGION_NAME
+ if region_name == "yandex":
+ region_name = DEFAULT_REGION_NAME
+
+ bucket_name = self.parse_bucket_name_from_url(request, full_url)
+ if not bucket_name:
+ # If no bucket specified, list all buckets
+ return self.all_buckets()
+
+ self.data["BucketName"] = bucket_name
+
+ if hasattr(request, "body"):
+ # Boto
+ body = request.body
+ else:
+ # Flask server
+ body = request.data
+ if body is None:
+ body = b""
+ if isinstance(body, bytes):
+ body = body.decode("utf-8")
+ body = "{0}".format(body).encode("utf-8")
+
+ if method == "HEAD":
+ return self._bucket_response_head(bucket_name, querystring)
+ elif method == "GET":
+ return self._bucket_response_get(bucket_name, querystring)
+ elif method == "PUT":
+ return self._bucket_response_put(
+ request, body, region_name, bucket_name, querystring
+ )
+ elif method == "DELETE":
+ return self._bucket_response_delete(bucket_name, querystring)
+ elif method == "POST":
+ return self._bucket_response_post(request, body, bucket_name)
+ elif method == "OPTIONS":
+ return self._response_options(bucket_name)
+ else:
+ raise NotImplementedError(
+ "Method {0} has not been implemented in the S3 backend yet".format(
+ method
+ )
+ )
+
+ @staticmethod
+ def _get_querystring(full_url):
+ parsed_url = urlparse(full_url)
+ # full_url can be one of two formats, depending on the version of werkzeug used:
+ # http://foobaz.localhost:5000/?prefix=bar%2Bbaz
+ # http://foobaz.localhost:5000/?prefix=bar+baz
+ # Werkzeug helpfully encodes the plus-sign for us, from >= 2.1.0
+ # However, the `parse_qs` method will (correctly) replace '+' with a space
+ #
+ # Workaround - manually reverse the encoding.
+ # Keep the + encoded, ensuring that parse_qsl doesn't replace it, and parse_qsl will unquote it afterwards
+ #
+ # YQ-1825: Replace was commented out as the version of `Werkzeug`
+ # that we are using is 2.0.3 (lesser than 2.1.0) and workaround is not needed
+ qs = (parsed_url.query or "") #.replace("+", "%2B")
+ querystring = parse_qs(qs, keep_blank_values=True)
+ return querystring
+
+ def _bucket_response_head(self, bucket_name, querystring):
+ self._set_action("BUCKET", "HEAD", querystring)
+ self._authenticate_and_authorize_s3_action()
+
+ try:
+ self.backend.head_bucket(bucket_name)
+ except MissingBucket:
+ # Unless we do this, boto3 does not raise ClientError on
+ # HEAD (which the real API responds with), and instead
+ # raises NoSuchBucket, leading to inconsistency in
+ # error response between real and mocked responses.
+ return 404, {}, ""
+ return 200, {}, ""
+
+ def _set_cors_headers(self, bucket):
+ """
+ TODO: smarter way of matching the right CORS rule:
+ See https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html
+
+ "When Amazon S3 receives a preflight request from a browser, it evaluates
+ the CORS configuration for the bucket and uses the first CORSRule rule
+ that matches the incoming browser request to enable a cross-origin request."
+ This here just uses all rules and the last rule will override the previous ones
+ if they are re-defining the same headers.
+ """
+
+ def _to_string(header: Union[List[str], str]) -> str:
+ # We allow list and strs in header values. Transform lists in comma-separated strings
+ if isinstance(header, list):
+ return ", ".join(header)
+ return header
+
+ for cors_rule in bucket.cors:
+ if cors_rule.allowed_methods is not None:
+ self.headers["Access-Control-Allow-Methods"] = _to_string(
+ cors_rule.allowed_methods
+ )
+ if cors_rule.allowed_origins is not None:
+ self.headers["Access-Control-Allow-Origin"] = _to_string(
+ cors_rule.allowed_origins
+ )
+ if cors_rule.allowed_headers is not None:
+ self.headers["Access-Control-Allow-Headers"] = _to_string(
+ cors_rule.allowed_headers
+ )
+ if cors_rule.exposed_headers is not None:
+ self.headers["Access-Control-Expose-Headers"] = _to_string(
+ cors_rule.exposed_headers
+ )
+ if cors_rule.max_age_seconds is not None:
+ self.headers["Access-Control-Max-Age"] = _to_string(
+ cors_rule.max_age_seconds
+ )
+
+ return self.headers
+
+ def _response_options(self, bucket_name):
+ # Return 200 with the headers from the bucket CORS configuration
+ self._authenticate_and_authorize_s3_action()
+ try:
+ bucket = self.backend.head_bucket(bucket_name)
+ except MissingBucket:
+ return (
+ 403,
+ {},
+ "",
+ ) # AWS S3 seems to return 403 on OPTIONS and 404 on GET/HEAD
+
+ self._set_cors_headers(bucket)
+
+ return 200, self.headers, ""
+
+ def _bucket_response_get(self, bucket_name, querystring):
+ self._set_action("BUCKET", "GET", querystring)
+ self._authenticate_and_authorize_s3_action()
+
+ if "object-lock" in querystring:
+ (
+ lock_enabled,
+ mode,
+ days,
+ years,
+ ) = self.backend.get_object_lock_configuration(bucket_name)
+ template = self.response_template(S3_BUCKET_LOCK_CONFIGURATION)
+
+ return template.render(
+ lock_enabled=lock_enabled, mode=mode, days=days, years=years
+ )
+
+ if "uploads" in querystring:
+ for unsup in ("delimiter", "max-uploads"):
+ if unsup in querystring:
+ raise NotImplementedError(
+ "Listing multipart uploads with {} has not been implemented yet.".format(
+ unsup
+ )
+ )
+ multiparts = list(self.backend.get_all_multiparts(bucket_name).values())
+ if "prefix" in querystring:
+ prefix = querystring.get("prefix", [None])[0]
+ multiparts = [
+ upload
+ for upload in multiparts
+ if upload.key_name.startswith(prefix)
+ ]
+ template = self.response_template(S3_ALL_MULTIPARTS)
+ return template.render(bucket_name=bucket_name, uploads=multiparts)
+ elif "location" in querystring:
+ location = self.backend.get_bucket_location(bucket_name)
+ template = self.response_template(S3_BUCKET_LOCATION)
+
+ # us-east-1 is different - returns a None location
+ if location == DEFAULT_REGION_NAME:
+ location = None
+
+ return template.render(location=location)
+ elif "lifecycle" in querystring:
+ rules = self.backend.get_bucket_lifecycle(bucket_name)
+ if not rules:
+ template = self.response_template(S3_NO_LIFECYCLE)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_BUCKET_LIFECYCLE_CONFIGURATION)
+ return template.render(rules=rules)
+ elif "versioning" in querystring:
+ versioning = self.backend.get_bucket_versioning(bucket_name)
+ template = self.response_template(S3_BUCKET_GET_VERSIONING)
+ return template.render(status=versioning)
+ elif "policy" in querystring:
+ policy = self.backend.get_bucket_policy(bucket_name)
+ if not policy:
+ template = self.response_template(S3_NO_POLICY)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ return 200, {}, policy
+ elif "website" in querystring:
+ website_configuration = self.backend.get_bucket_website_configuration(
+ bucket_name
+ )
+ if not website_configuration:
+ template = self.response_template(S3_NO_BUCKET_WEBSITE_CONFIG)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ return 200, {}, website_configuration
+ elif "acl" in querystring:
+ acl = self.backend.get_bucket_acl(bucket_name)
+ template = self.response_template(S3_OBJECT_ACL_RESPONSE)
+ return template.render(acl=acl)
+ elif "tagging" in querystring:
+ tags = self.backend.get_bucket_tagging(bucket_name)["Tags"]
+ # "Special Error" if no tags:
+ if len(tags) == 0:
+ template = self.response_template(S3_NO_BUCKET_TAGGING)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_OBJECT_TAGGING_RESPONSE)
+ return template.render(tags=tags)
+ elif "logging" in querystring:
+ logging = self.backend.get_bucket_logging(bucket_name)
+ if not logging:
+ template = self.response_template(S3_NO_LOGGING_CONFIG)
+ return 200, {}, template.render()
+ template = self.response_template(S3_LOGGING_CONFIG)
+ return 200, {}, template.render(logging=logging)
+ elif "cors" in querystring:
+ cors = self.backend.get_bucket_cors(bucket_name)
+ if len(cors) == 0:
+ template = self.response_template(S3_NO_CORS_CONFIG)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_BUCKET_CORS_RESPONSE)
+ return template.render(cors=cors)
+ elif "notification" in querystring:
+ notification_configuration = (
+ self.backend.get_bucket_notification_configuration(bucket_name)
+ )
+ if not notification_configuration:
+ return 200, {}, ""
+ template = self.response_template(S3_GET_BUCKET_NOTIFICATION_CONFIG)
+ return template.render(config=notification_configuration)
+ elif "accelerate" in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if bucket.accelerate_configuration is None:
+ template = self.response_template(S3_BUCKET_ACCELERATE_NOT_SET)
+ return 200, {}, template.render()
+ template = self.response_template(S3_BUCKET_ACCELERATE)
+ return template.render(bucket=bucket)
+ elif "publicAccessBlock" in querystring:
+ public_block_config = self.backend.get_public_access_block(bucket_name)
+ template = self.response_template(S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION)
+ return template.render(public_block_config=public_block_config)
+
+ elif "versions" in querystring:
+ delimiter = querystring.get("delimiter", [None])[0]
+ key_marker = querystring.get("key-marker", [None])[0]
+ prefix = querystring.get("prefix", [""])[0]
+
+ bucket = self.backend.get_bucket(bucket_name)
+ (
+ versions,
+ common_prefixes,
+ delete_markers,
+ ) = self.backend.list_object_versions(
+ bucket_name, delimiter=delimiter, key_marker=key_marker, prefix=prefix
+ )
+ key_list = versions
+ template = self.response_template(S3_BUCKET_GET_VERSIONS)
+
+ return (
+ 200,
+ {},
+ template.render(
+ common_prefixes=common_prefixes,
+ key_list=key_list,
+ delete_marker_list=delete_markers,
+ bucket=bucket,
+ prefix=prefix,
+ max_keys=1000,
+ delimiter=delimiter,
+ key_marker=key_marker,
+ is_truncated="false",
+ ),
+ )
+ elif "encryption" in querystring:
+ encryption = self.backend.get_bucket_encryption(bucket_name)
+ if not encryption:
+ template = self.response_template(S3_NO_ENCRYPTION)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_ENCRYPTION_CONFIG)
+ return 200, {}, template.render(encryption=encryption)
+ elif querystring.get("list-type", [None])[0] == "2":
+ return 200, {}, self._handle_list_objects_v2(bucket_name, querystring)
+ elif "replication" in querystring:
+ replication = self.backend.get_bucket_replication(bucket_name)
+ if not replication:
+ template = self.response_template(S3_NO_REPLICATION)
+ return 404, {}, template.render(bucket_name=bucket_name)
+ template = self.response_template(S3_REPLICATION_CONFIG)
+ return 200, {}, template.render(replication=replication)
+
+ bucket = self.backend.get_bucket(bucket_name)
+ prefix = querystring.get("prefix", [None])[0]
+ if prefix and isinstance(prefix, bytes):
+ prefix = prefix.decode("utf-8")
+ delimiter = querystring.get("delimiter", [None])[0]
+ max_keys = int(querystring.get("max-keys", [1000])[0])
+ marker = querystring.get("marker", [None])[0]
+ result_keys, result_folders = self.backend.list_objects(
+ bucket, prefix, delimiter
+ )
+ encoding_type = querystring.get("encoding-type", [None])[0]
+
+ if marker:
+ result_keys = self._get_results_from_token(result_keys, marker)
+
+ result_keys, is_truncated, next_marker = self._truncate_result(
+ result_keys, max_keys
+ )
+
+ template = self.response_template(S3_BUCKET_GET_RESPONSE)
+ return (
+ 200,
+ {},
+ template.render(
+ bucket=bucket,
+ prefix=prefix,
+ delimiter=delimiter,
+ result_keys=result_keys,
+ result_folders=result_folders,
+ is_truncated=is_truncated,
+ next_marker=next_marker,
+ max_keys=max_keys,
+ encoding_type=encoding_type,
+ ),
+ )
+
+ def _set_action(self, action_resource_type, method, querystring):
+ action_set = False
+ for action_in_querystring, action in ACTION_MAP[action_resource_type][
+ method
+ ].items():
+ if action_in_querystring in querystring:
+ self.data["Action"] = action
+ action_set = True
+ if not action_set:
+ self.data["Action"] = ACTION_MAP[action_resource_type][method]["DEFAULT"]
+
+ def _handle_list_objects_v2(self, bucket_name, querystring):
+ template = self.response_template(S3_BUCKET_GET_RESPONSE_V2)
+ bucket = self.backend.get_bucket(bucket_name)
+
+ continuation_token = querystring.get("continuation-token", [None])[0]
+ if continuation_token is not None and continuation_token == "":
+ raise InvalidContinuationToken()
+
+ prefix = querystring.get("prefix", [None])[0]
+ if prefix and isinstance(prefix, bytes):
+ prefix = prefix.decode("utf-8")
+ delimiter = querystring.get("delimiter", [None])[0]
+ all_keys = self.backend.list_objects_v2(bucket, prefix, delimiter)
+
+ fetch_owner = querystring.get("fetch-owner", [False])[0]
+ max_keys = int(querystring.get("max-keys", [1000])[0])
+ start_after = querystring.get("start-after", [None])[0]
+ encoding_type = querystring.get("encoding-type", [None])[0]
+
+ if continuation_token or start_after:
+ limit = continuation_token or start_after
+ all_keys = self._get_results_from_token(all_keys, limit)
+
+ truncated_keys, is_truncated, next_continuation_token = self._truncate_result(
+ all_keys, max_keys
+ )
+ result_keys, result_folders = self._split_truncated_keys(truncated_keys)
+
+ key_count = len(result_keys) + len(result_folders)
+
+ return template.render(
+ bucket=bucket,
+ prefix=prefix or "",
+ delimiter=delimiter,
+ key_count=key_count,
+ result_keys=result_keys,
+ result_folders=result_folders,
+ fetch_owner=fetch_owner,
+ max_keys=max_keys,
+ is_truncated=is_truncated,
+ next_continuation_token=next_continuation_token,
+ start_after=None if continuation_token else start_after,
+ encoding_type=encoding_type,
+ )
+
+ @staticmethod
+ def _split_truncated_keys(truncated_keys):
+ result_keys = []
+ result_folders = []
+ for key in truncated_keys:
+ if isinstance(key, FakeKey):
+ result_keys.append(key)
+ else:
+ result_folders.append(key)
+ return result_keys, result_folders
+
+ def _get_results_from_token(self, result_keys, token):
+ continuation_index = 0
+ for key in result_keys:
+ if (key.name if isinstance(key, FakeKey) else key) > token:
+ break
+ continuation_index += 1
+ return result_keys[continuation_index:]
+
+ def _truncate_result(self, result_keys, max_keys):
+ if max_keys == 0:
+ result_keys = []
+ is_truncated = True
+ next_continuation_token = None
+ elif len(result_keys) > max_keys:
+ is_truncated = "true"
+ result_keys = result_keys[:max_keys]
+ item = result_keys[-1]
+ next_continuation_token = item.name if isinstance(item, FakeKey) else item
+ else:
+ is_truncated = "false"
+ next_continuation_token = None
+ return result_keys, is_truncated, next_continuation_token
+
+ def _body_contains_location_constraint(self, body):
+ if body:
+ try:
+ xmltodict.parse(body)["CreateBucketConfiguration"]["LocationConstraint"]
+ return True
+ except KeyError:
+ pass
+ return False
+
+ def _create_bucket_configuration_is_empty(self, body):
+ if body:
+ try:
+ create_bucket_configuration = xmltodict.parse(body)[
+ "CreateBucketConfiguration"
+ ]
+ del create_bucket_configuration["@xmlns"]
+ if len(create_bucket_configuration) == 0:
+ return True
+ except KeyError:
+ pass
+ return False
+
+ def _parse_pab_config(self, body):
+ parsed_xml = xmltodict.parse(body)
+ parsed_xml["PublicAccessBlockConfiguration"].pop("@xmlns", None)
+
+ return parsed_xml
+
+ def _bucket_response_put(
+ self, request, body, region_name, bucket_name, querystring
+ ):
+ if not request.headers.get("Content-Length"):
+ return 411, {}, "Content-Length required"
+
+ self._set_action("BUCKET", "PUT", querystring)
+ self._authenticate_and_authorize_s3_action()
+
+ if "object-lock" in querystring:
+ body_decoded = body.decode()
+ config = self._lock_config_from_xml(body_decoded)
+
+ if not self.backend.get_bucket(bucket_name).object_lock_enabled:
+ raise BucketMustHaveLockeEnabled
+
+ self.backend.put_object_lock_configuration(
+ bucket_name,
+ config.get("enabled"),
+ config.get("mode"),
+ config.get("days"),
+ config.get("years"),
+ )
+ return 200, {}, ""
+
+ if "versioning" in querystring:
+ ver = re.search("<Status>([A-Za-z]+)</Status>", body.decode())
+ if ver:
+ self.backend.set_bucket_versioning(bucket_name, ver.group(1))
+ template = self.response_template(S3_BUCKET_VERSIONING)
+ return template.render(bucket_versioning_status=ver.group(1))
+ else:
+ return 404, {}, ""
+ elif "lifecycle" in querystring:
+ rules = xmltodict.parse(body)["LifecycleConfiguration"]["Rule"]
+ if not isinstance(rules, list):
+ # If there is only one rule, xmldict returns just the item
+ rules = [rules]
+ self.backend.put_bucket_lifecycle(bucket_name, rules)
+ return ""
+ elif "policy" in querystring:
+ self.backend.put_bucket_policy(bucket_name, body)
+ return "True"
+ elif "acl" in querystring:
+ # Headers are first. If not set, then look at the body (consistent with the documentation):
+ acls = self._acl_from_headers(request.headers)
+ if not acls:
+ acls = self._acl_from_xml(body)
+ self.backend.put_bucket_acl(bucket_name, acls)
+ return ""
+ elif "tagging" in querystring:
+ tagging = self._bucket_tagging_from_xml(body)
+ self.backend.put_bucket_tagging(bucket_name, tagging)
+ return ""
+ elif "website" in querystring:
+ self.backend.set_bucket_website_configuration(bucket_name, body)
+ return ""
+ elif "cors" in querystring:
+ try:
+ self.backend.put_bucket_cors(bucket_name, self._cors_from_xml(body))
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ elif "logging" in querystring:
+ try:
+ self.backend.put_bucket_logging(
+ bucket_name, self._logging_from_xml(body)
+ )
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ elif "notification" in querystring:
+ try:
+ self.backend.put_bucket_notification_configuration(
+ bucket_name, self._notification_config_from_xml(body)
+ )
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ except Exception as e:
+ raise e
+ elif "accelerate" in querystring:
+ try:
+ accelerate_status = self._accelerate_config_from_xml(body)
+ self.backend.put_bucket_accelerate_configuration(
+ bucket_name, accelerate_status
+ )
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ except Exception as e:
+ raise e
+
+ elif "publicAccessBlock" in querystring:
+ pab_config = self._parse_pab_config(body)
+ self.backend.put_bucket_public_access_block(
+ bucket_name, pab_config["PublicAccessBlockConfiguration"]
+ )
+ return ""
+ elif "encryption" in querystring:
+ try:
+ self.backend.put_bucket_encryption(
+ bucket_name, self._encryption_config_from_xml(body)
+ )
+ return ""
+ except KeyError:
+ raise MalformedXML()
+ except Exception as e:
+ raise e
+ elif "replication" in querystring:
+ bucket = self.backend.get_bucket(bucket_name)
+ if not bucket.is_versioned:
+ template = self.response_template(S3_NO_VERSIONING_ENABLED)
+ return 400, {}, template.render(bucket_name=bucket_name)
+ replication_config = self._replication_config_from_xml(body)
+ self.backend.put_bucket_replication(bucket_name, replication_config)
+ return ""
+ else:
+ # us-east-1, the default AWS region behaves a bit differently
+ # - you should not use it as a location constraint --> it fails
+ # - querying the location constraint returns None
+ # - LocationConstraint has to be specified if outside us-east-1
+ if (
+ region_name != DEFAULT_REGION_NAME
+ and not self._body_contains_location_constraint(body)
+ ):
+ raise IllegalLocationConstraintException()
+ if body:
+ if self._create_bucket_configuration_is_empty(body):
+ raise MalformedXML()
+
+ try:
+ forced_region = xmltodict.parse(body)["CreateBucketConfiguration"][
+ "LocationConstraint"
+ ]
+
+ if forced_region == DEFAULT_REGION_NAME:
+ raise S3ClientError(
+ "InvalidLocationConstraint",
+ "The specified location-constraint is not valid",
+ )
+ else:
+ region_name = forced_region
+ except KeyError:
+ pass
+
+ try:
+ new_bucket = self.backend.create_bucket(bucket_name, region_name)
+ except BucketAlreadyExists:
+ new_bucket = self.backend.get_bucket(bucket_name)
+ if (
+ new_bucket.region_name == DEFAULT_REGION_NAME
+ and region_name == DEFAULT_REGION_NAME
+ ):
+ # us-east-1 has different behavior - creating a bucket there is an idempotent operation
+ pass
+ else:
+ template = self.response_template(S3_DUPLICATE_BUCKET_ERROR)
+ return 409, {}, template.render(bucket_name=bucket_name)
+
+ if "x-amz-acl" in request.headers:
+ # TODO: Support the XML-based ACL format
+ self.backend.put_bucket_acl(
+ bucket_name, self._acl_from_headers(request.headers)
+ )
+
+ if (
+ request.headers.get("x-amz-bucket-object-lock-enabled", "").lower()
+ == "true"
+ ):
+ new_bucket.object_lock_enabled = True
+ new_bucket.versioning_status = "Enabled"
+
+ template = self.response_template(S3_BUCKET_CREATE_RESPONSE)
+ return 200, {}, template.render(bucket=new_bucket)
+
+ def _bucket_response_delete(self, bucket_name, querystring):
+ self._set_action("BUCKET", "DELETE", querystring)
+ self._authenticate_and_authorize_s3_action()
+
+ if "policy" in querystring:
+ self.backend.delete_bucket_policy(bucket_name)
+ return 204, {}, ""
+ elif "tagging" in querystring:
+ self.backend.delete_bucket_tagging(bucket_name)
+ return 204, {}, ""
+ elif "website" in querystring:
+ self.backend.delete_bucket_website(bucket_name)
+ return 204, {}, ""
+ elif "cors" in querystring:
+ self.backend.delete_bucket_cors(bucket_name)
+ return 204, {}, ""
+ elif "lifecycle" in querystring:
+ self.backend.delete_bucket_lifecycle(bucket_name)
+ return 204, {}, ""
+ elif "publicAccessBlock" in querystring:
+ self.backend.delete_public_access_block(bucket_name)
+ return 204, {}, ""
+ elif "encryption" in querystring:
+ self.backend.delete_bucket_encryption(bucket_name)
+ return 204, {}, ""
+ elif "replication" in querystring:
+ self.backend.delete_bucket_replication(bucket_name)
+ return 204, {}, ""
+
+ removed_bucket = self.backend.delete_bucket(bucket_name)
+
+ if removed_bucket:
+ # Bucket exists
+ template = self.response_template(S3_DELETE_BUCKET_SUCCESS)
+ return 204, {}, template.render(bucket=removed_bucket)
+ else:
+ # Tried to delete a bucket that still has keys
+ template = self.response_template(S3_DELETE_BUCKET_WITH_ITEMS_ERROR)
+ return 409, {}, template.render(bucket=removed_bucket)
+
+ def _bucket_response_post(self, request, body, bucket_name):
+ response_headers = {}
+ if not request.headers.get("Content-Length"):
+ return 411, {}, "Content-Length required"
+
+ path = self._get_path(request)
+
+ if self.is_delete_keys(request, path, bucket_name):
+ self.data["Action"] = "DeleteObject"
+ try:
+ self._authenticate_and_authorize_s3_action()
+ return self._bucket_response_delete_keys(body, bucket_name)
+ except BucketAccessDeniedError:
+ return self._bucket_response_delete_keys(
+ body, bucket_name, authenticated=False
+ )
+
+ self.data["Action"] = "PutObject"
+ self._authenticate_and_authorize_s3_action()
+
+ # POST to bucket-url should create file from form
+ form = request.form
+
+ key = form["key"]
+ if "file" in form:
+ f = form["file"]
+ else:
+ fobj = request.files["file"]
+ f = fobj.stream.read()
+ key = key.replace("${filename}", os.path.basename(fobj.filename))
+
+ if "success_action_redirect" in form:
+ redirect = form["success_action_redirect"]
+ parts = urlparse(redirect)
+ queryargs = parse_qs(parts.query)
+ queryargs["key"] = key
+ queryargs["bucket"] = bucket_name
+ redirect_queryargs = urlencode(queryargs, doseq=True)
+ newparts = (
+ parts.scheme,
+ parts.netloc,
+ parts.path,
+ parts.params,
+ redirect_queryargs,
+ parts.fragment,
+ )
+ fixed_redirect = urlunparse(newparts)
+
+ response_headers["Location"] = fixed_redirect
+
+ if "success_action_status" in form:
+ status_code = form["success_action_status"]
+ elif "success_action_redirect" in form:
+ status_code = 303
+ else:
+ status_code = 204
+
+ new_key = self.backend.put_object(bucket_name, key, f)
+
+ if form.get("acl"):
+ acl = get_canned_acl(form.get("acl"))
+ new_key.set_acl(acl)
+
+ # Metadata
+ metadata = metadata_from_headers(form)
+ new_key.set_metadata(metadata)
+
+ return status_code, response_headers, ""
+
+ @staticmethod
+ def _get_path(request):
+ return (
+ request.full_path
+ if hasattr(request, "full_path")
+ else path_url(request.url)
+ )
+
+ def _bucket_response_delete_keys(self, body, bucket_name, authenticated=True):
+ template = self.response_template(S3_DELETE_KEYS_RESPONSE)
+ body_dict = xmltodict.parse(body, strip_whitespace=False)
+
+ objects = body_dict["Delete"].get("Object", [])
+ if not isinstance(objects, list):
+ # We expect a list of objects, but when there is a single <Object> node xmltodict does not
+ # return a list.
+ objects = [objects]
+ if len(objects) == 0:
+ raise MalformedXML()
+
+ if authenticated:
+ deleted_objects = self.backend.delete_objects(bucket_name, objects)
+ errors = []
+ else:
+ deleted_objects = []
+ # [(key_name, errorcode, 'error message'), ..]
+ errors = [(o["Key"], "AccessDenied", "Access Denied") for o in objects]
+
+ return (
+ 200,
+ {},
+ template.render(deleted=deleted_objects, delete_errors=errors),
+ )
+
+ def _handle_range_header(self, request, response_headers, response_content):
+ length = len(response_content)
+ last = length - 1
+ _, rspec = request.headers.get("range").split("=")
+ if "," in rspec:
+ raise NotImplementedError("Multiple range specifiers not supported")
+
+ def toint(i):
+ return int(i) if i else None
+
+ begin, end = map(toint, rspec.split("-"))
+ if begin is not None: # byte range
+ end = last if end is None else min(end, last)
+ elif end is not None: # suffix byte range
+ begin = length - min(end, length)
+ end = last
+ else:
+ return 400, response_headers, ""
+ if begin < 0 or end > last or begin > min(end, last):
+ raise InvalidRange(
+ actual_size=str(length), range_requested=request.headers.get("range")
+ )
+ response_headers["content-range"] = "bytes {0}-{1}/{2}".format(
+ begin, end, length
+ )
+ content = response_content[begin : end + 1]
+ response_headers["content-length"] = len(content)
+ return 206, response_headers, content
+
+ def _handle_v4_chunk_signatures(self, body, content_length):
+ body_io = io.BytesIO(body)
+ new_body = bytearray(content_length)
+ pos = 0
+ line = body_io.readline()
+ while line:
+ # https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition
+ # str(hex(chunk-size)) + ";chunk-signature=" + signature + \r\n + chunk-data + \r\n
+ chunk_size = int(line[: line.find(b";")].decode("utf8"), 16)
+ new_body[pos : pos + chunk_size] = body_io.read(chunk_size)
+ pos = pos + chunk_size
+ body_io.read(2) # skip trailing \r\n
+ line = body_io.readline()
+ return bytes(new_body)
+
+ @amzn_request_id
+ def key_response(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ # Key and Control are lumped in because splitting out the regex is too much of a pain :/
+ self.method = request.method
+ self.path = self._get_path(request)
+ # Make a copy of request.headers because it's immutable
+ self.headers = dict(request.headers)
+ if "Host" not in self.headers:
+ self.headers["Host"] = urlparse(full_url).netloc
+ response_headers = {}
+
+ try:
+ response = self._key_response(request, full_url, self.headers)
+ except S3ClientError as s3error:
+ response = s3error.code, {}, s3error.description
+
+ if isinstance(response, str):
+ status_code = 200
+ response_content = response
+ else:
+ status_code, response_headers, response_content = response
+
+ if (
+ status_code == 200
+ and "range" in request.headers
+ and request.headers["range"] != ""
+ ):
+ try:
+ return self._handle_range_header(
+ request, response_headers, response_content
+ )
+ except S3ClientError as s3error:
+ return s3error.code, {}, s3error.description
+ return status_code, response_headers, response_content
+
+ def _key_response(self, request, full_url, headers):
+ parsed_url = urlparse(full_url)
+ query = parse_qs(parsed_url.query, keep_blank_values=True)
+ method = request.method
+
+ key_name = self.parse_key_name(request, parsed_url.path)
+ bucket_name = self.parse_bucket_name_from_url(request, full_url)
+
+ # Because we patch the requests library the boto/boto3 API
+ # requests go through this method but so do
+ # `requests.get("https://bucket-name.s3.amazonaws.com/file-name")`
+ # Here we deny public access to private files by checking the
+ # ACL and checking for the mere presence of an Authorization
+ # header.
+ if "Authorization" not in request.headers:
+ if hasattr(request, "url"):
+ signed_url = "Signature=" in request.url
+ elif hasattr(request, "requestline"):
+ signed_url = "Signature=" in request.path
+ key = self.backend.get_object(bucket_name, key_name)
+
+ if key:
+ if not key.acl.public_read and not signed_url:
+ return 403, {}, ""
+ elif signed_url:
+ # coming in from requests.get(s3.generate_presigned_url())
+ if self._invalid_headers(request.url, dict(request.headers)):
+ return 403, {}, S3_INVALID_PRESIGNED_PARAMETERS
+
+ if hasattr(request, "body"):
+ # Boto
+ body = request.body
+ if hasattr(body, "read"):
+ body = body.read()
+ else:
+ # Flask server
+ body = request.data
+ if not body:
+ # when the data is being passed as a file
+ if request.files:
+ for _, value in request.files.items():
+ body = value.stream.read()
+ elif hasattr(request, "form"):
+ # Body comes through as part of the form, if no content-type is set on the PUT-request
+ # form = ImmutableMultiDict([('some data 123 321', '')])
+ form = request.form
+ for k, _ in form.items():
+ body = k
+
+ if body is None:
+ body = b""
+
+ if (
+ request.headers.get("x-amz-content-sha256", None)
+ == "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
+ ):
+ body = self._handle_v4_chunk_signatures(
+ body, int(request.headers["x-amz-decoded-content-length"])
+ )
+
+ if method == "GET":
+ return self._key_response_get(
+ bucket_name, query, key_name, headers=request.headers
+ )
+ elif method == "PUT":
+ return self._key_response_put(request, body, bucket_name, query, key_name)
+ elif method == "HEAD":
+ return self._key_response_head(
+ bucket_name, query, key_name, headers=request.headers
+ )
+ elif method == "DELETE":
+ return self._key_response_delete(headers, bucket_name, query, key_name)
+ elif method == "POST":
+ return self._key_response_post(request, body, bucket_name, query, key_name)
+ elif method == "OPTIONS":
+ # OPTIONS response doesn't depend on the key_name: always return 200 with CORS headers
+ return self._response_options(bucket_name)
+ else:
+ raise NotImplementedError(
+ "Method {0} has not been implemented in the S3 backend yet".format(
+ method
+ )
+ )
+
+ def _key_response_get(self, bucket_name, query, key_name, headers):
+ self._set_action("KEY", "GET", query)
+ self._authenticate_and_authorize_s3_action()
+
+ response_headers = {}
+ if query.get("uploadId"):
+ upload_id = query["uploadId"][0]
+
+ # 0 <= PartNumberMarker <= 2,147,483,647
+ part_number_marker = int(query.get("part-number-marker", [0])[0])
+ if part_number_marker > 2147483647:
+ raise NotAnIntegerException(
+ name="part-number-marker", value=part_number_marker
+ )
+ if not (0 <= part_number_marker <= 2147483647):
+ raise InvalidMaxPartArgument("part-number-marker", 0, 2147483647)
+
+ # 0 <= MaxParts <= 2,147,483,647 (default is 1,000)
+ max_parts = int(query.get("max-parts", [1000])[0])
+ if max_parts > 2147483647:
+ raise NotAnIntegerException(name="max-parts", value=max_parts)
+ if not (0 <= max_parts <= 2147483647):
+ raise InvalidMaxPartArgument("max-parts", 0, 2147483647)
+
+ parts = self.backend.list_parts(
+ bucket_name,
+ upload_id,
+ part_number_marker=part_number_marker,
+ max_parts=max_parts,
+ )
+ next_part_number_marker = parts[-1].name if parts else 0
+ is_truncated = len(parts) != 0 and self.backend.is_truncated(
+ bucket_name, upload_id, next_part_number_marker
+ )
+
+ template = self.response_template(S3_MULTIPART_LIST_RESPONSE)
+ return (
+ 200,
+ response_headers,
+ template.render(
+ bucket_name=bucket_name,
+ key_name=key_name,
+ upload_id=upload_id,
+ is_truncated=str(is_truncated).lower(),
+ max_parts=max_parts,
+ next_part_number_marker=next_part_number_marker,
+ parts=parts,
+ part_number_marker=part_number_marker,
+ ),
+ )
+ version_id = query.get("versionId", [None])[0]
+ if_modified_since = headers.get("If-Modified-Since", None)
+ if_match = headers.get("If-Match", None)
+ if_none_match = headers.get("If-None-Match", None)
+ if_unmodified_since = headers.get("If-Unmodified-Since", None)
+
+ key = self.backend.get_object(bucket_name, key_name, version_id=version_id)
+ if key is None and version_id is None:
+ raise MissingKey(key=key_name)
+ elif key is None:
+ raise MissingVersion()
+
+ if key.version_id:
+ response_headers["x-amz-version-id"] = key.version_id
+
+ if key.storage_class == "GLACIER":
+ raise InvalidObjectState(storage_class="GLACIER")
+ if if_unmodified_since:
+ if_unmodified_since = str_to_rfc_1123_datetime(if_unmodified_since)
+ if key.last_modified > if_unmodified_since:
+ raise PreconditionFailed("If-Unmodified-Since")
+ if if_match and key.etag not in [if_match, '"{0}"'.format(if_match)]:
+ raise PreconditionFailed("If-Match")
+
+ if if_modified_since:
+ if_modified_since = str_to_rfc_1123_datetime(if_modified_since)
+ if key.last_modified < if_modified_since:
+ return 304, response_headers, "Not Modified"
+ if if_none_match and key.etag == if_none_match:
+ return 304, response_headers, "Not Modified"
+
+ if "acl" in query:
+ acl = s3_backend.get_object_acl(key)
+ template = self.response_template(S3_OBJECT_ACL_RESPONSE)
+ return 200, response_headers, template.render(acl=acl)
+ if "tagging" in query:
+ tags = self.backend.get_object_tagging(key)["Tags"]
+ template = self.response_template(S3_OBJECT_TAGGING_RESPONSE)
+ return 200, response_headers, template.render(tags=tags)
+ if "legal-hold" in query:
+ legal_hold = self.backend.get_object_legal_hold(key)
+ template = self.response_template(S3_OBJECT_LEGAL_HOLD)
+ return 200, response_headers, template.render(legal_hold=legal_hold)
+
+ response_headers.update(key.metadata)
+ response_headers.update(key.response_dict)
+ return 200, response_headers, key.value
+
+ def _key_response_put(self, request, body, bucket_name, query, key_name):
+ self._set_action("KEY", "PUT", query)
+ self._authenticate_and_authorize_s3_action()
+
+ response_headers = {}
+ if query.get("uploadId") and query.get("partNumber"):
+ upload_id = query["uploadId"][0]
+ part_number = int(query["partNumber"][0])
+ if "x-amz-copy-source" in request.headers:
+ copy_source = request.headers.get("x-amz-copy-source")
+ if isinstance(copy_source, bytes):
+ copy_source = copy_source.decode("utf-8")
+ copy_source_parsed = urlparse(copy_source)
+ src_bucket, src_key = copy_source_parsed.path.lstrip("/").split("/", 1)
+ src_version_id = parse_qs(copy_source_parsed.query).get(
+ "versionId", [None]
+ )[0]
+ src_range = request.headers.get("x-amz-copy-source-range", "").split(
+ "bytes="
+ )[-1]
+
+ try:
+ start_byte, end_byte = src_range.split("-")
+ start_byte, end_byte = int(start_byte), int(end_byte)
+ except ValueError:
+ start_byte, end_byte = None, None
+
+ if self.backend.get_object(
+ src_bucket, src_key, version_id=src_version_id
+ ):
+ key = self.backend.copy_part(
+ bucket_name,
+ upload_id,
+ part_number,
+ src_bucket,
+ src_key,
+ src_version_id,
+ start_byte,
+ end_byte,
+ )
+ else:
+ return 404, response_headers, ""
+
+ template = self.response_template(S3_MULTIPART_UPLOAD_RESPONSE)
+ response = template.render(part=key)
+ else:
+ if part_number > 10000:
+ raise InvalidMaxPartNumberArgument(part_number)
+ key = self.backend.upload_part(
+ bucket_name, upload_id, part_number, body
+ )
+ response = ""
+ response_headers.update(key.response_dict)
+ return 200, response_headers, response
+
+ storage_class = request.headers.get("x-amz-storage-class", "STANDARD")
+ encryption = request.headers.get("x-amz-server-side-encryption", None)
+ kms_key_id = request.headers.get(
+ "x-amz-server-side-encryption-aws-kms-key-id", None
+ )
+
+ bucket_key_enabled = request.headers.get(
+ "x-amz-server-side-encryption-bucket-key-enabled", None
+ )
+ if bucket_key_enabled is not None:
+ bucket_key_enabled = str(bucket_key_enabled).lower()
+
+ bucket = self.backend.get_bucket(bucket_name)
+ lock_enabled = bucket.object_lock_enabled
+
+ lock_mode = request.headers.get("x-amz-object-lock-mode", None)
+ lock_until = request.headers.get("x-amz-object-lock-retain-until-date", None)
+ legal_hold = request.headers.get("x-amz-object-lock-legal-hold", None)
+
+ if lock_mode or lock_until or legal_hold == "ON":
+ if not request.headers.get("Content-Md5"):
+ raise InvalidContentMD5
+ if not lock_enabled:
+ raise LockNotEnabled
+
+ elif lock_enabled and bucket.has_default_lock:
+ if not request.headers.get("Content-Md5"):
+ raise InvalidContentMD5
+ lock_until = bucket.default_retention()
+ lock_mode = bucket.default_lock_mode
+
+ acl = self._acl_from_headers(request.headers)
+ if acl is None:
+ acl = self.backend.get_bucket(bucket_name).acl
+ tagging = self._tagging_from_headers(request.headers)
+
+ if "retention" in query:
+ if not lock_enabled:
+ raise LockNotEnabled
+ version_id = query.get("VersionId")
+ retention = self._mode_until_from_xml(body)
+ self.backend.put_object_retention(
+ bucket_name, key_name, version_id=version_id, retention=retention
+ )
+ return 200, response_headers, ""
+
+ if "legal-hold" in query:
+ if not lock_enabled:
+ raise LockNotEnabled
+ version_id = query.get("VersionId")
+ legal_hold_status = self._legal_hold_status_from_xml(body)
+ self.backend.put_object_legal_hold(
+ bucket_name, key_name, version_id, legal_hold_status
+ )
+ return 200, response_headers, ""
+
+ if "acl" in query:
+ self.backend.put_object_acl(bucket_name, key_name, acl)
+ return 200, response_headers, ""
+
+ if "tagging" in query:
+ if "versionId" in query:
+ version_id = query["versionId"][0]
+ else:
+ version_id = None
+ key = self.backend.get_object(bucket_name, key_name, version_id=version_id)
+ tagging = self._tagging_from_xml(body)
+ self.backend.set_key_tags(key, tagging, key_name)
+ return 200, response_headers, ""
+
+ if "x-amz-copy-source" in request.headers:
+ # Copy key
+ # you can have a quoted ?version=abc with a version Id, so work on
+ # we need to parse the unquoted string first
+ copy_source = request.headers.get("x-amz-copy-source")
+ if isinstance(copy_source, bytes):
+ copy_source = copy_source.decode("utf-8")
+ copy_source_parsed = urlparse(copy_source)
+ src_bucket, src_key = (
+ unquote(copy_source_parsed.path).lstrip("/").split("/", 1)
+ )
+ src_version_id = parse_qs(copy_source_parsed.query).get(
+ "versionId", [None]
+ )[0]
+
+ key = self.backend.get_object(
+ src_bucket, src_key, version_id=src_version_id, key_is_clean=True
+ )
+
+ if key is not None:
+ if key.storage_class in ["GLACIER", "DEEP_ARCHIVE"]:
+ if key.response_dict.get(
+ "x-amz-restore"
+ ) is None or 'ongoing-request="true"' in key.response_dict.get(
+ "x-amz-restore"
+ ):
+ raise ObjectNotInActiveTierError(key)
+
+ bucket_key_enabled = (
+ request.headers.get(
+ "x-amz-server-side-encryption-bucket-key-enabled", ""
+ ).lower()
+ == "true"
+ )
+
+ mdirective = request.headers.get("x-amz-metadata-directive")
+
+ self.backend.copy_object(
+ key,
+ bucket_name,
+ key_name,
+ storage=storage_class,
+ acl=acl,
+ kms_key_id=kms_key_id,
+ encryption=encryption,
+ bucket_key_enabled=bucket_key_enabled,
+ mdirective=mdirective,
+ )
+ else:
+ raise MissingKey(key=src_key)
+
+ new_key = self.backend.get_object(bucket_name, key_name)
+ if mdirective is not None and mdirective == "REPLACE":
+ metadata = metadata_from_headers(request.headers)
+ new_key.set_metadata(metadata, replace=True)
+ tdirective = request.headers.get("x-amz-tagging-directive")
+ if tdirective == "REPLACE":
+ tagging = self._tagging_from_headers(request.headers)
+ self.backend.set_key_tags(new_key, tagging)
+ template = self.response_template(S3_OBJECT_COPY_RESPONSE)
+ response_headers.update(new_key.response_dict)
+ return 200, response_headers, template.render(key=new_key)
+
+ # Initial data
+ new_key = self.backend.put_object(
+ bucket_name,
+ key_name,
+ body,
+ storage=storage_class,
+ encryption=encryption,
+ kms_key_id=kms_key_id,
+ bucket_key_enabled=bucket_key_enabled,
+ lock_mode=lock_mode,
+ lock_legal_status=legal_hold,
+ lock_until=lock_until,
+ )
+
+ metadata = metadata_from_headers(request.headers)
+ metadata.update(metadata_from_headers(query))
+ new_key.set_metadata(metadata)
+ new_key.set_acl(acl)
+ new_key.website_redirect_location = request.headers.get(
+ "x-amz-website-redirect-location"
+ )
+ self.backend.set_key_tags(new_key, tagging)
+
+ response_headers.update(new_key.response_dict)
+ return 200, response_headers, ""
+
+ def _key_response_head(self, bucket_name, query, key_name, headers):
+ self._set_action("KEY", "HEAD", query)
+ self._authenticate_and_authorize_s3_action()
+
+ response_headers = {}
+ version_id = query.get("versionId", [None])[0]
+ if version_id and not self.backend.get_bucket(bucket_name).is_versioned:
+ return 400, response_headers, ""
+
+ part_number = query.get("partNumber", [None])[0]
+ if part_number:
+ part_number = int(part_number)
+
+ if_modified_since = headers.get("If-Modified-Since", None)
+ if_match = headers.get("If-Match", None)
+ if_none_match = headers.get("If-None-Match", None)
+ if_unmodified_since = headers.get("If-Unmodified-Since", None)
+
+ key = self.backend.head_object(
+ bucket_name, key_name, version_id=version_id, part_number=part_number
+ )
+ if key:
+ response_headers.update(key.metadata)
+ response_headers.update(key.response_dict)
+
+ if if_unmodified_since:
+ if_unmodified_since = str_to_rfc_1123_datetime(if_unmodified_since)
+ if key.last_modified > if_unmodified_since:
+ return 412, response_headers, ""
+ if if_match and key.etag != if_match:
+ return 412, response_headers, ""
+
+ if if_modified_since:
+ if_modified_since = str_to_rfc_1123_datetime(if_modified_since)
+ if key.last_modified < if_modified_since:
+ return 304, response_headers, "Not Modified"
+ if if_none_match and key.etag == if_none_match:
+ return 304, response_headers, "Not Modified"
+
+ return 200, response_headers, ""
+ else:
+ return 404, response_headers, ""
+
+ def _lock_config_from_xml(self, xml):
+ response_dict = {"enabled": False, "mode": None, "days": None, "years": None}
+ parsed_xml = xmltodict.parse(xml)
+ enabled = (
+ parsed_xml["ObjectLockConfiguration"]["ObjectLockEnabled"] == "Enabled"
+ )
+ response_dict["enabled"] = enabled
+
+ default_retention = parsed_xml.get("ObjectLockConfiguration").get("Rule")
+ if default_retention:
+ default_retention = default_retention.get("DefaultRetention")
+ mode = default_retention["Mode"]
+ days = int(default_retention.get("Days", 0))
+ years = int(default_retention.get("Years", 0))
+
+ if days and years:
+ raise MalformedXML
+ response_dict["mode"] = mode
+ response_dict["days"] = days
+ response_dict["years"] = years
+
+ return response_dict
+
+ def _acl_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+ if not parsed_xml.get("AccessControlPolicy"):
+ raise MalformedACLError()
+
+ # The owner is needed for some reason...
+ if not parsed_xml["AccessControlPolicy"].get("Owner"):
+ # TODO: Validate that the Owner is actually correct.
+ raise MalformedACLError()
+
+ # If empty, then no ACLs:
+ if parsed_xml["AccessControlPolicy"].get("AccessControlList") is None:
+ return []
+
+ if not parsed_xml["AccessControlPolicy"]["AccessControlList"].get("Grant"):
+ raise MalformedACLError()
+
+ permissions = ["READ", "WRITE", "READ_ACP", "WRITE_ACP", "FULL_CONTROL"]
+
+ if not isinstance(
+ parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"], list
+ ):
+ parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"] = [
+ parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"]
+ ]
+
+ grants = self._get_grants_from_xml(
+ parsed_xml["AccessControlPolicy"]["AccessControlList"]["Grant"],
+ MalformedACLError,
+ permissions,
+ )
+ return FakeAcl(grants)
+
+ def _get_grants_from_xml(self, grant_list, exception_type, permissions):
+ grants = []
+ for grant in grant_list:
+ if grant.get("Permission", "") not in permissions:
+ raise exception_type()
+
+ if grant["Grantee"].get("@xsi:type", "") not in [
+ "CanonicalUser",
+ "AmazonCustomerByEmail",
+ "Group",
+ ]:
+ raise exception_type()
+
+ # TODO: Verify that the proper grantee data is supplied based on the type.
+
+ grants.append(
+ FakeGrant(
+ [
+ FakeGrantee(
+ grantee_id=grant["Grantee"].get("ID", ""),
+ display_name=grant["Grantee"].get("DisplayName", ""),
+ uri=grant["Grantee"].get("URI", ""),
+ )
+ ],
+ [grant["Permission"]],
+ )
+ )
+
+ return grants
+
+ def _acl_from_headers(self, headers):
+ canned_acl = headers.get("x-amz-acl", "")
+
+ grants = []
+ for header, value in headers.items():
+ header = header.lower()
+ if not header.startswith("x-amz-grant-"):
+ continue
+
+ permission = {
+ "read": "READ",
+ "write": "WRITE",
+ "read-acp": "READ_ACP",
+ "write-acp": "WRITE_ACP",
+ "full-control": "FULL_CONTROL",
+ }[header[len("x-amz-grant-") :]]
+
+ grantees = []
+ for key_and_value in value.split(","):
+ key, value = re.match(
+ '([^=]+)="?([^"]+)"?', key_and_value.strip()
+ ).groups()
+ if key.lower() == "id":
+ grantees.append(FakeGrantee(grantee_id=value))
+ else:
+ grantees.append(FakeGrantee(uri=value))
+ grants.append(FakeGrant(grantees, [permission]))
+
+ if canned_acl and grants:
+ raise S3AclAndGrantError()
+ if canned_acl:
+ return get_canned_acl(canned_acl)
+ if grants:
+ return FakeAcl(grants)
+ else:
+ return None
+
+ def _tagging_from_headers(self, headers):
+ tags = {}
+ if headers.get("x-amz-tagging"):
+ parsed_header = parse_qs(headers["x-amz-tagging"], keep_blank_values=True)
+ for tag in parsed_header.items():
+ tags[tag[0]] = tag[1][0]
+ return tags
+
+ def _tagging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml, force_list={"Tag": True})
+
+ tags = {}
+ for tag in parsed_xml["Tagging"]["TagSet"]["Tag"]:
+ tags[tag["Key"]] = tag["Value"]
+
+ return tags
+
+ def _bucket_tagging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ tags = {}
+ # Optional if no tags are being sent:
+ if parsed_xml["Tagging"].get("TagSet"):
+ # If there is only 1 tag, then it's not a list:
+ if not isinstance(parsed_xml["Tagging"]["TagSet"]["Tag"], list):
+ tags[parsed_xml["Tagging"]["TagSet"]["Tag"]["Key"]] = parsed_xml[
+ "Tagging"
+ ]["TagSet"]["Tag"]["Value"]
+ else:
+ for tag in parsed_xml["Tagging"]["TagSet"]["Tag"]:
+ if tag["Key"] in tags:
+ raise DuplicateTagKeys()
+ tags[tag["Key"]] = tag["Value"]
+
+ # Verify that "aws:" is not in the tags. If so, then this is a problem:
+ for key, _ in tags.items():
+ if key.startswith("aws:"):
+ raise NoSystemTags()
+
+ return tags
+
+ def _cors_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if isinstance(parsed_xml["CORSConfiguration"]["CORSRule"], list):
+ return [cors for cors in parsed_xml["CORSConfiguration"]["CORSRule"]]
+
+ return [parsed_xml["CORSConfiguration"]["CORSRule"]]
+
+ def _mode_until_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+ return (
+ parsed_xml.get("Retention", None).get("Mode", None),
+ parsed_xml.get("Retention", None).get("RetainUntilDate", None),
+ )
+
+ def _legal_hold_status_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+ return parsed_xml["LegalHold"]["Status"]
+
+ def _encryption_config_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if (
+ not parsed_xml["ServerSideEncryptionConfiguration"].get("Rule")
+ or not parsed_xml["ServerSideEncryptionConfiguration"]["Rule"].get(
+ "ApplyServerSideEncryptionByDefault"
+ )
+ or not parsed_xml["ServerSideEncryptionConfiguration"]["Rule"][
+ "ApplyServerSideEncryptionByDefault"
+ ].get("SSEAlgorithm")
+ ):
+ raise MalformedXML()
+
+ return parsed_xml["ServerSideEncryptionConfiguration"]
+
+ def _logging_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if not parsed_xml["BucketLoggingStatus"].get("LoggingEnabled"):
+ return {}
+
+ if not parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetBucket"):
+ raise MalformedXML()
+
+ if not parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetPrefix"):
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetPrefix"] = ""
+
+ # Get the ACLs:
+ if parsed_xml["BucketLoggingStatus"]["LoggingEnabled"].get("TargetGrants"):
+ permissions = ["READ", "WRITE", "FULL_CONTROL"]
+ if not isinstance(
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"][
+ "Grant"
+ ],
+ list,
+ ):
+ target_grants = self._get_grants_from_xml(
+ [
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"][
+ "TargetGrants"
+ ]["Grant"]
+ ],
+ MalformedXML,
+ permissions,
+ )
+ else:
+ target_grants = self._get_grants_from_xml(
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]["TargetGrants"][
+ "Grant"
+ ],
+ MalformedXML,
+ permissions,
+ )
+
+ parsed_xml["BucketLoggingStatus"]["LoggingEnabled"][
+ "TargetGrants"
+ ] = target_grants
+
+ return parsed_xml["BucketLoggingStatus"]["LoggingEnabled"]
+
+ def _notification_config_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+
+ if not len(parsed_xml["NotificationConfiguration"]):
+ return {}
+
+ # The types of notifications, and their required fields (apparently lambda is categorized by the API as
+ # "CloudFunction"):
+ notification_fields = [
+ ("Topic", "sns"),
+ ("Queue", "sqs"),
+ ("CloudFunction", "lambda"),
+ ]
+
+ event_names = [
+ "s3:ReducedRedundancyLostObject",
+ "s3:ObjectCreated:*",
+ "s3:ObjectCreated:Put",
+ "s3:ObjectCreated:Post",
+ "s3:ObjectCreated:Copy",
+ "s3:ObjectCreated:CompleteMultipartUpload",
+ "s3:ObjectRemoved:*",
+ "s3:ObjectRemoved:Delete",
+ "s3:ObjectRemoved:DeleteMarkerCreated",
+ ]
+
+ found_notifications = (
+ 0 # Tripwire -- if this is not ever set, then there were no notifications
+ )
+ for name, arn_string in notification_fields:
+ # 1st verify that the proper notification configuration has been passed in (with an ARN that is close
+ # to being correct -- nothing too complex in the ARN logic):
+ the_notification = parsed_xml["NotificationConfiguration"].get(
+ "{}Configuration".format(name)
+ )
+ if the_notification:
+ found_notifications += 1
+ if not isinstance(the_notification, list):
+ the_notification = parsed_xml["NotificationConfiguration"][
+ "{}Configuration".format(name)
+ ] = [the_notification]
+
+ for n in the_notification:
+ if not n[name].startswith("arn:aws:{}:".format(arn_string)):
+ raise InvalidNotificationARN()
+
+ # 2nd, verify that the Events list is correct:
+ assert n["Event"]
+ if not isinstance(n["Event"], list):
+ n["Event"] = [n["Event"]]
+
+ for event in n["Event"]:
+ if event not in event_names:
+ raise InvalidNotificationEvent()
+
+ # Parse out the filters:
+ if n.get("Filter"):
+ # Error if S3Key is blank:
+ if not n["Filter"]["S3Key"]:
+ raise KeyError()
+
+ if not isinstance(n["Filter"]["S3Key"]["FilterRule"], list):
+ n["Filter"]["S3Key"]["FilterRule"] = [
+ n["Filter"]["S3Key"]["FilterRule"]
+ ]
+
+ for filter_rule in n["Filter"]["S3Key"]["FilterRule"]:
+ assert filter_rule["Name"] in ["suffix", "prefix"]
+ assert filter_rule["Value"]
+
+ if not found_notifications:
+ return {}
+
+ return parsed_xml["NotificationConfiguration"]
+
+ def _accelerate_config_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml)
+ config = parsed_xml["AccelerateConfiguration"]
+ return config["Status"]
+
+ def _replication_config_from_xml(self, xml):
+ parsed_xml = xmltodict.parse(xml, dict_constructor=dict)
+ config = parsed_xml["ReplicationConfiguration"]
+ return config
+
+ def _key_response_delete(self, headers, bucket_name, query, key_name):
+ self._set_action("KEY", "DELETE", query)
+ self._authenticate_and_authorize_s3_action()
+
+ if query.get("uploadId"):
+ upload_id = query["uploadId"][0]
+ self.backend.abort_multipart_upload(bucket_name, upload_id)
+ return 204, {}, ""
+ version_id = query.get("versionId", [None])[0]
+ if "tagging" in query:
+ self.backend.delete_object_tagging(
+ bucket_name, key_name, version_id=version_id
+ )
+ template = self.response_template(S3_DELETE_KEY_TAGGING_RESPONSE)
+ return 204, {}, template.render(version_id=version_id)
+ bypass = headers.get("X-Amz-Bypass-Governance-Retention")
+ _, response_meta = self.backend.delete_object(
+ bucket_name, key_name, version_id=version_id, bypass=bypass
+ )
+ response_headers = {}
+ if response_meta is not None:
+ for k in response_meta:
+ response_headers["x-amz-{}".format(k)] = response_meta[k]
+ return 204, response_headers, ""
+
+ def _complete_multipart_body(self, body):
+ ps = minidom.parseString(body).getElementsByTagName("Part")
+ prev = 0
+ for p in ps:
+ pn = int(p.getElementsByTagName("PartNumber")[0].firstChild.wholeText)
+ if pn <= prev:
+ raise InvalidPartOrder()
+ yield (pn, p.getElementsByTagName("ETag")[0].firstChild.wholeText)
+
+ def _key_response_post(self, request, body, bucket_name, query, key_name):
+ self._set_action("KEY", "POST", query)
+ self._authenticate_and_authorize_s3_action()
+
+ if body == b"" and "uploads" in query:
+ metadata = metadata_from_headers(request.headers)
+ tagging = self._tagging_from_headers(request.headers)
+ storage_type = request.headers.get("x-amz-storage-class", "STANDARD")
+ acl = self._acl_from_headers(request.headers)
+ if acl is None:
+ acl = self.backend.get_bucket(bucket_name).acl
+ multipart_id = self.backend.create_multipart_upload(
+ bucket_name, key_name, metadata, storage_type, tagging, acl
+ )
+
+ template = self.response_template(S3_MULTIPART_INITIATE_RESPONSE)
+ response = template.render(
+ bucket_name=bucket_name, key_name=key_name, upload_id=multipart_id
+ )
+ return 200, {}, response
+
+ if query.get("uploadId"):
+ body = self._complete_multipart_body(body)
+ multipart_id = query["uploadId"][0]
+
+ multipart, value, etag = self.backend.complete_multipart_upload(
+ bucket_name, multipart_id, body
+ )
+ if value is None:
+ return 400, {}, ""
+
+ key = self.backend.put_object(
+ bucket_name,
+ multipart.key_name,
+ value,
+ storage=multipart.storage,
+ etag=etag,
+ multipart=multipart,
+ )
+ key.set_metadata(multipart.metadata)
+ self.backend.set_key_tags(key, multipart.tags)
+ self.backend.put_object_acl(bucket_name, key.name, multipart.acl)
+
+ template = self.response_template(S3_MULTIPART_COMPLETE_RESPONSE)
+ headers = {}
+ if key.version_id:
+ headers["x-amz-version-id"] = key.version_id
+ return (
+ 200,
+ headers,
+ template.render(
+ bucket_name=bucket_name, key_name=key.name, etag=key.etag
+ ),
+ )
+
+ elif "restore" in query:
+ es = minidom.parseString(body).getElementsByTagName("Days")
+ days = es[0].childNodes[0].wholeText
+ key = self.backend.get_object(bucket_name, key_name)
+ if key.storage_class not in ["GLACIER", "DEEP_ARCHIVE"]:
+ raise InvalidObjectState(storage_class=key.storage_class)
+ r = 202
+ if key.expiry_date is not None:
+ r = 200
+ key.restore(int(days))
+ return r, {}, ""
+
+ else:
+ raise NotImplementedError(
+ "Method POST had only been implemented for multipart uploads and restore operations, so far"
+ )
+
+ def _invalid_headers(self, url, headers):
+ """
+ Verify whether the provided metadata in the URL is also present in the headers
+ :param url: .../file.txt&content-type=app%2Fjson&Signature=..
+ :param headers: Content-Type=app/json
+ :return: True or False
+ """
+ metadata_to_check = {
+ "content-disposition": "Content-Disposition",
+ "content-encoding": "Content-Encoding",
+ "content-language": "Content-Language",
+ "content-length": "Content-Length",
+ "content-md5": "Content-MD5",
+ "content-type": "Content-Type",
+ }
+ for url_key, header_key in metadata_to_check.items():
+ metadata_in_url = re.search(url_key + "=(.+?)(&.+$|$)", url)
+ if metadata_in_url:
+ url_value = unquote(metadata_in_url.group(1))
+ if header_key not in headers or (url_value != headers[header_key]):
+ return True
+ return False
+
+
+S3ResponseInstance = ResponseObject(s3_backend)
+
+S3_ALL_BUCKETS = """<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <Owner>
+ <ID>bcaf1ffd86f41161ca5fb16fd081034f</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <Buckets>
+ {% for bucket in buckets %}
+ <Bucket>
+ <Name>{{ bucket.name }}</Name>
+ <CreationDate>{{ bucket.creation_date_ISO8601 }}</CreationDate>
+ </Bucket>
+ {% endfor %}
+ </Buckets>
+</ListAllMyBucketsResult>"""
+
+S3_BUCKET_GET_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Name>{{ bucket.name }}</Name>
+ {% if prefix != None %}
+ <Prefix>{{ prefix }}</Prefix>
+ {% endif %}
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ {% if delimiter %}
+ <Delimiter>{{ delimiter }}</Delimiter>
+ {% endif %}
+ {% if encoding_type %}
+ <EncodingType>{{ encoding_type }}</EncodingType>
+ {% endif %}
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ {% if next_marker %}
+ <NextMarker>{{ next_marker }}</NextMarker>
+ {% endif %}
+ {% for key in result_keys %}
+ <Contents>
+ <Key>{{ key.safe_name(encoding_type) }}</Key>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </Contents>
+ {% endfor %}
+ {% if delimiter %}
+ {% for folder in result_folders %}
+ <CommonPrefixes>
+ <Prefix>{{ folder }}</Prefix>
+ </CommonPrefixes>
+ {% endfor %}
+ {% endif %}
+ </ListBucketResult>"""
+
+S3_BUCKET_GET_RESPONSE_V2 = """<?xml version="1.0" encoding="UTF-8"?>
+<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Name>{{ bucket.name }}</Name>
+{% if prefix != None %}
+ <Prefix>{{ prefix }}</Prefix>
+{% endif %}
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ <KeyCount>{{ key_count }}</KeyCount>
+{% if delimiter %}
+ <Delimiter>{{ delimiter }}</Delimiter>
+{% endif %}
+{% if encoding_type %}
+ <EncodingType>{{ encoding_type }}</EncodingType>
+{% endif %}
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+{% if next_continuation_token %}
+ <NextContinuationToken>{{ next_continuation_token }}</NextContinuationToken>
+{% endif %}
+{% if start_after %}
+ <StartAfter>{{ start_after }}</StartAfter>
+{% endif %}
+ {% for key in result_keys %}
+ <Contents>
+ <Key>{{ key.safe_name(encoding_type) }}</Key>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ {% if fetch_owner %}
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ {% endif %}
+ </Contents>
+ {% endfor %}
+ {% if delimiter %}
+ {% for folder in result_folders %}
+ <CommonPrefixes>
+ <Prefix>{{ folder }}</Prefix>
+ </CommonPrefixes>
+ {% endfor %}
+ {% endif %}
+ </ListBucketResult>"""
+
+S3_BUCKET_CREATE_RESPONSE = """<CreateBucketResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <CreateBucketResponse>
+ <Bucket>{{ bucket.name }}</Bucket>
+ </CreateBucketResponse>
+</CreateBucketResponse>"""
+
+S3_DELETE_BUCKET_SUCCESS = """<DeleteBucketResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <DeleteBucketResponse>
+ <Code>204</Code>
+ <Description>No Content</Description>
+ </DeleteBucketResponse>
+</DeleteBucketResponse>"""
+
+S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
+<Error><Code>BucketNotEmpty</Code>
+<Message>The bucket you tried to delete is not empty</Message>
+<BucketName>{{ bucket.name }}</BucketName>
+<RequestId>asdfasdfsdafds</RequestId>
+<HostId>sdfgdsfgdsfgdfsdsfgdfs</HostId>
+</Error>"""
+
+S3_BUCKET_LOCATION = """<?xml version="1.0" encoding="UTF-8"?>
+<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">{% if location != None %}{{ location }}{% endif %}</LocationConstraint>"""
+
+S3_BUCKET_LIFECYCLE_CONFIGURATION = """<?xml version="1.0" encoding="UTF-8"?>
+<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ {% for rule in rules %}
+ <Rule>
+ <ID>{{ rule.id }}</ID>
+ {% if rule.filter %}
+ <Filter>
+ {% if rule.filter.prefix != None %}
+ <Prefix>{{ rule.filter.prefix }}</Prefix>
+ {% endif %}
+ {% if rule.filter.tag_key %}
+ <Tag>
+ <Key>{{ rule.filter.tag_key }}</Key>
+ <Value>{{ rule.filter.tag_value }}</Value>
+ </Tag>
+ {% endif %}
+ {% if rule.filter.and_filter %}
+ <And>
+ {% if rule.filter.and_filter.prefix != None %}
+ <Prefix>{{ rule.filter.and_filter.prefix }}</Prefix>
+ {% endif %}
+ {% for key, value in rule.filter.and_filter.tags.items() %}
+ <Tag>
+ <Key>{{ key }}</Key>
+ <Value>{{ value }}</Value>
+ </Tag>
+ {% endfor %}
+ </And>
+ {% endif %}
+ </Filter>
+ {% else %}
+ {% if rule.prefix != None %}
+ <Prefix>{{ rule.prefix }}</Prefix>
+ {% endif %}
+ {% endif %}
+ <Status>{{ rule.status }}</Status>
+ {% if rule.storage_class %}
+ <Transition>
+ {% if rule.transition_days %}
+ <Days>{{ rule.transition_days }}</Days>
+ {% endif %}
+ {% if rule.transition_date %}
+ <Date>{{ rule.transition_date }}</Date>
+ {% endif %}
+ <StorageClass>{{ rule.storage_class }}</StorageClass>
+ </Transition>
+ {% endif %}
+ {% if rule.expiration_days or rule.expiration_date or rule.expired_object_delete_marker %}
+ <Expiration>
+ {% if rule.expiration_days %}
+ <Days>{{ rule.expiration_days }}</Days>
+ {% endif %}
+ {% if rule.expiration_date %}
+ <Date>{{ rule.expiration_date }}</Date>
+ {% endif %}
+ {% if rule.expired_object_delete_marker %}
+ <ExpiredObjectDeleteMarker>{{ rule.expired_object_delete_marker }}</ExpiredObjectDeleteMarker>
+ {% endif %}
+ </Expiration>
+ {% endif %}
+ {% if rule.nvt_noncurrent_days and rule.nvt_storage_class %}
+ <NoncurrentVersionTransition>
+ <NoncurrentDays>{{ rule.nvt_noncurrent_days }}</NoncurrentDays>
+ <StorageClass>{{ rule.nvt_storage_class }}</StorageClass>
+ </NoncurrentVersionTransition>
+ {% endif %}
+ {% if rule.nve_noncurrent_days %}
+ <NoncurrentVersionExpiration>
+ <NoncurrentDays>{{ rule.nve_noncurrent_days }}</NoncurrentDays>
+ </NoncurrentVersionExpiration>
+ {% endif %}
+ {% if rule.aimu_days %}
+ <AbortIncompleteMultipartUpload>
+ <DaysAfterInitiation>{{ rule.aimu_days }}</DaysAfterInitiation>
+ </AbortIncompleteMultipartUpload>
+ {% endif %}
+ </Rule>
+ {% endfor %}
+</LifecycleConfiguration>
+"""
+
+S3_BUCKET_VERSIONING = """<?xml version="1.0" encoding="UTF-8"?>
+<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Status>{{ bucket_versioning_status }}</Status>
+</VersioningConfiguration>
+"""
+
+S3_BUCKET_GET_VERSIONING = """<?xml version="1.0" encoding="UTF-8"?>
+{% if status is none %}
+ <VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>
+{% else %}
+ <VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Status>{{ status }}</Status>
+ </VersioningConfiguration>
+{% endif %}
+"""
+
+S3_BUCKET_GET_VERSIONS = """<?xml version="1.0" encoding="UTF-8"?>
+<ListVersionsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+ <Name>{{ bucket.name }}</Name>
+ {% if prefix != None %}
+ <Prefix>{{ prefix }}</Prefix>
+ {% endif %}
+ {% if common_prefixes %}
+ {% for prefix in common_prefixes %}
+ <CommonPrefixes>
+ <Prefix>{{ prefix }}</Prefix>
+ </CommonPrefixes>
+ {% endfor %}
+ {% endif %}
+ <Delimiter>{{ delimiter }}</Delimiter>
+ <KeyMarker>{{ key_marker or "" }}</KeyMarker>
+ <MaxKeys>{{ max_keys }}</MaxKeys>
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ {% for key in key_list %}
+ <Version>
+ <Key>{{ key.name }}</Key>
+ <VersionId>{% if key.version_id is none %}null{% else %}{{ key.version_id }}{% endif %}</VersionId>
+ <IsLatest>{{ 'true' if key.is_latest else 'false' }}</IsLatest>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ key.etag }}</ETag>
+ <Size>{{ key.size }}</Size>
+ <StorageClass>{{ key.storage_class }}</StorageClass>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </Version>
+ {% endfor %}
+ {% for marker in delete_marker_list %}
+ <DeleteMarker>
+ <Key>{{ marker.name }}</Key>
+ <VersionId>{{ marker.version_id }}</VersionId>
+ <IsLatest>{{ 'true' if marker.is_latest else 'false' }}</IsLatest>
+ <LastModified>{{ marker.last_modified_ISO8601 }}</LastModified>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ </DeleteMarker>
+ {% endfor %}
+</ListVersionsResult>
+"""
+
+S3_DELETE_KEYS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<DeleteResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+{% for k, v in deleted %}
+<Deleted>
+<Key>{{k}}</Key>
+{% if v %}<VersionId>{{v}}</VersionId>{% endif %}
+</Deleted>
+{% endfor %}
+{% for k,c,m in delete_errors %}
+<Error>
+<Key>{{k}}</Key>
+<Code>{{c}}</Code>
+<Message>{{m}}</Message>
+</Error>
+{% endfor %}
+</DeleteResult>"""
+
+S3_DELETE_KEY_TAGGING_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<DeleteObjectTaggingResult xmlns="http://s3.amazonaws.com/doc/2006-03-01">
+<VersionId>{{version_id}}</VersionId>
+</DeleteObjectTaggingResult>
+"""
+
+S3_OBJECT_ACL_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+ <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <AccessControlList>
+ {% for grant in acl.grants %}
+ <Grant>
+ {% for grantee in grant.grantees %}
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="{{ grantee.type }}">
+ {% if grantee.uri %}
+ <URI>{{ grantee.uri }}</URI>
+ {% endif %}
+ {% if grantee.id %}
+ <ID>{{ grantee.id }}</ID>
+ {% endif %}
+ {% if grantee.display_name %}
+ <DisplayName>{{ grantee.display_name }}</DisplayName>
+ {% endif %}
+ </Grantee>
+ {% endfor %}
+ {% for permission in grant.permissions %}
+ <Permission>{{ permission }}</Permission>
+ {% endfor %}
+ </Grant>
+ {% endfor %}
+ </AccessControlList>
+ </AccessControlPolicy>"""
+
+S3_OBJECT_LEGAL_HOLD = """<?xml version="1.0" encoding="UTF-8"?>
+<LegalHold>
+ <Status>{{ legal_hold }}</Status>
+</LegalHold>
+"""
+
+S3_OBJECT_TAGGING_RESPONSE = """\
+<?xml version="1.0" encoding="UTF-8"?>
+<Tagging xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <TagSet>
+ {% for tag in tags %}
+ <Tag>
+ <Key>{{ tag.Key }}</Key>
+ <Value>{{ tag.Value }}</Value>
+ </Tag>
+ {% endfor %}
+ </TagSet>
+</Tagging>"""
+
+S3_BUCKET_CORS_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CORSConfiguration>
+ {% for cors in cors %}
+ <CORSRule>
+ {% for origin in cors.allowed_origins %}
+ <AllowedOrigin>{{ origin }}</AllowedOrigin>
+ {% endfor %}
+ {% for method in cors.allowed_methods %}
+ <AllowedMethod>{{ method }}</AllowedMethod>
+ {% endfor %}
+ {% if cors.allowed_headers is not none %}
+ {% for header in cors.allowed_headers %}
+ <AllowedHeader>{{ header }}</AllowedHeader>
+ {% endfor %}
+ {% endif %}
+ {% if cors.exposed_headers is not none %}
+ {% for header in cors.exposed_headers %}
+ <ExposedHeader>{{ header }}</ExposedHeader>
+ {% endfor %}
+ {% endif %}
+ {% if cors.max_age_seconds is not none %}
+ <MaxAgeSeconds>{{ cors.max_age_seconds }}</MaxAgeSeconds>
+ {% endif %}
+ </CORSRule>
+ {% endfor %}
+ </CORSConfiguration>
+"""
+
+S3_OBJECT_COPY_RESPONSE = """\
+<CopyObjectResult xmlns="http://doc.s3.amazonaws.com/2006-03-01">
+ <ETag>{{ key.etag }}</ETag>
+ <LastModified>{{ key.last_modified_ISO8601 }}</LastModified>
+</CopyObjectResult>"""
+
+S3_MULTIPART_INITIATE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <UploadId>{{ upload_id }}</UploadId>
+</InitiateMultipartUploadResult>"""
+
+S3_MULTIPART_UPLOAD_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CopyPartResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <LastModified>{{ part.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ part.etag }}</ETag>
+</CopyPartResult>"""
+
+S3_MULTIPART_LIST_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<ListPartsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <UploadId>{{ upload_id }}</UploadId>
+ <StorageClass>STANDARD</StorageClass>
+ <Initiator>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Initiator>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <PartNumberMarker>{{ part_number_marker }}</PartNumberMarker>
+ <NextPartNumberMarker>{{ next_part_number_marker }}</NextPartNumberMarker>
+ <MaxParts>{{ max_parts }}</MaxParts>
+ <IsTruncated>{{ is_truncated }}</IsTruncated>
+ {% for part in parts %}
+ <Part>
+ <PartNumber>{{ part.name }}</PartNumber>
+ <LastModified>{{ part.last_modified_ISO8601 }}</LastModified>
+ <ETag>{{ part.etag }}</ETag>
+ <Size>{{ part.size }}</Size>
+ </Part>
+ {% endfor %}
+</ListPartsResult>"""
+
+S3_MULTIPART_COMPLETE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
+<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Location>http://{{ bucket_name }}.s3.amazonaws.com/{{ key_name }}</Location>
+ <Bucket>{{ bucket_name }}</Bucket>
+ <Key>{{ key_name }}</Key>
+ <ETag>{{ etag }}</ETag>
+</CompleteMultipartUploadResult>
+"""
+
+S3_ALL_MULTIPARTS = (
+ """<?xml version="1.0" encoding="UTF-8"?>
+<ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Bucket>{{ bucket_name }}</Bucket>
+ <KeyMarker></KeyMarker>
+ <UploadIdMarker></UploadIdMarker>
+ <MaxUploads>1000</MaxUploads>
+ <IsTruncated>false</IsTruncated>
+ {% for upload in uploads %}
+ <Upload>
+ <Key>{{ upload.key_name }}</Key>
+ <UploadId>{{ upload.id }}</UploadId>
+ <Initiator>
+ <ID>arn:aws:iam::"""
+ + get_account_id()
+ + """:user/user1-11111a31-17b5-4fb7-9df5-b111111f13de</ID>
+ <DisplayName>user1-11111a31-17b5-4fb7-9df5-b111111f13de</DisplayName>
+ </Initiator>
+ <Owner>
+ <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
+ <DisplayName>webfile</DisplayName>
+ </Owner>
+ <StorageClass>STANDARD</StorageClass>
+ <Initiated>2010-11-10T20:48:33.000Z</Initiated>
+ </Upload>
+ {% endfor %}
+</ListMultipartUploadsResult>
+"""
+)
+
+S3_NO_POLICY = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchBucketPolicy</Code>
+ <Message>The bucket policy does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>0D68A23BB2E2215B</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_LIFECYCLE = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchLifecycleConfiguration</Code>
+ <Message>The lifecycle configuration does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_BUCKET_TAGGING = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchTagSet</Code>
+ <Message>The TagSet does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_BUCKET_WEBSITE_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchWebsiteConfiguration</Code>
+ <Message>The specified bucket does not have a website configuration</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_INVALID_CORS_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchWebsiteConfiguration</Code>
+ <Message>The specified bucket does not have a website configuration</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_CORS_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>NoSuchCORSConfiguration</Code>
+ <Message>The CORS configuration does not exist</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_LOGGING_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
+ <LoggingEnabled>
+ <TargetBucket>{{ logging["TargetBucket"] }}</TargetBucket>
+ <TargetPrefix>{{ logging["TargetPrefix"] }}</TargetPrefix>
+ {% if logging.get("TargetGrants") %}
+ <TargetGrants>
+ {% for grant in logging["TargetGrants"] %}
+ <Grant>
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="{{ grant.grantees[0].type }}">
+ {% if grant.grantees[0].uri %}
+ <URI>{{ grant.grantees[0].uri }}</URI>
+ {% endif %}
+ {% if grant.grantees[0].id %}
+ <ID>{{ grant.grantees[0].id }}</ID>
+ {% endif %}
+ {% if grant.grantees[0].display_name %}
+ <DisplayName>{{ grant.grantees[0].display_name }}</DisplayName>
+ {% endif %}
+ </Grantee>
+ <Permission>{{ grant.permissions[0] }}</Permission>
+ </Grant>
+ {% endfor %}
+ </TargetGrants>
+ {% endif %}
+ </LoggingEnabled>
+</BucketLoggingStatus>
+"""
+
+S3_NO_LOGGING_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01" />
+"""
+
+S3_ENCRYPTION_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<ServerSideEncryptionConfiguration xmlns="http://doc.s3.amazonaws.com/2006-03-01">
+ {% if encryption %}
+ <Rule>
+ <ApplyServerSideEncryptionByDefault>
+ <SSEAlgorithm>{{ encryption["Rule"]["ApplyServerSideEncryptionByDefault"]["SSEAlgorithm"] }}</SSEAlgorithm>
+ {% if encryption["Rule"]["ApplyServerSideEncryptionByDefault"].get("KMSMasterKeyID") %}
+ <KMSMasterKeyID>{{ encryption["Rule"]["ApplyServerSideEncryptionByDefault"]["KMSMasterKeyID"] }}</KMSMasterKeyID>
+ {% endif %}
+ </ApplyServerSideEncryptionByDefault>
+ <BucketKeyEnabled>{{ 'true' if encryption["Rule"].get("BucketKeyEnabled") == 'true' else 'false' }}</BucketKeyEnabled>
+ </Rule>
+ {% endif %}
+</ServerSideEncryptionConfiguration>
+"""
+
+S3_INVALID_PRESIGNED_PARAMETERS = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>SignatureDoesNotMatch</Code>
+ <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
+ <RequestId>0D68A23BB2E2215B</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_ENCRYPTION = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>ServerSideEncryptionConfigurationNotFoundError</Code>
+ <Message>The server side encryption configuration was not found</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>0D68A23BB2E2215B</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_GET_BUCKET_NOTIFICATION_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<NotificationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ {% for topic in config.topic %}
+ <TopicConfiguration>
+ <Id>{{ topic.id }}</Id>
+ <Topic>{{ topic.arn }}</Topic>
+ {% for event in topic.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if topic.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in topic.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </TopicConfiguration>
+ {% endfor %}
+ {% for queue in config.queue %}
+ <QueueConfiguration>
+ <Id>{{ queue.id }}</Id>
+ <Queue>{{ queue.arn }}</Queue>
+ {% for event in queue.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if queue.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in queue.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </QueueConfiguration>
+ {% endfor %}
+ {% for cf in config.cloud_function %}
+ <CloudFunctionConfiguration>
+ <Id>{{ cf.id }}</Id>
+ <CloudFunction>{{ cf.arn }}</CloudFunction>
+ {% for event in cf.events %}
+ <Event>{{ event }}</Event>
+ {% endfor %}
+ {% if cf.filters %}
+ <Filter>
+ <S3Key>
+ {% for rule in cf.filters["S3Key"]["FilterRule"] %}
+ <FilterRule>
+ <Name>{{ rule["Name"] }}</Name>
+ <Value>{{ rule["Value"] }}</Value>
+ </FilterRule>
+ {% endfor %}
+ </S3Key>
+ </Filter>
+ {% endif %}
+ </CloudFunctionConfiguration>
+ {% endfor %}
+</NotificationConfiguration>
+"""
+
+S3_BUCKET_ACCELERATE = """
+<AccelerateConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Status>{{ bucket.accelerate_configuration }}</Status>
+</AccelerateConfiguration>
+"""
+
+S3_BUCKET_ACCELERATE_NOT_SET = """
+<AccelerateConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>
+"""
+
+S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION = """
+<PublicAccessBlockConfiguration>
+ <BlockPublicAcls>{{public_block_config.block_public_acls}}</BlockPublicAcls>
+ <IgnorePublicAcls>{{public_block_config.ignore_public_acls}}</IgnorePublicAcls>
+ <BlockPublicPolicy>{{public_block_config.block_public_policy}}</BlockPublicPolicy>
+ <RestrictPublicBuckets>{{public_block_config.restrict_public_buckets}}</RestrictPublicBuckets>
+</PublicAccessBlockConfiguration>
+"""
+
+S3_BUCKET_LOCK_CONFIGURATION = """
+<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ {%if lock_enabled %}
+ <ObjectLockEnabled>Enabled</ObjectLockEnabled>
+ {% else %}
+ <ObjectLockEnabled>Disabled</ObjectLockEnabled>
+ {% endif %}
+ {% if mode %}
+ <Rule>
+ <DefaultRetention>
+ <Mode>{{mode}}</Mode>
+ <Days>{{days}}</Days>
+ <Years>{{years}}</Years>
+ </DefaultRetention>
+ </Rule>
+ {% endif %}
+</ObjectLockConfiguration>
+"""
+
+S3_DUPLICATE_BUCKET_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>BucketAlreadyOwnedByYou</Code>
+ <Message>Your previous request to create the named bucket succeeded and you already own it.</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>44425877V1D0A2F9</RequestId>
+ <HostId>9Gjjt1m+cjU4OPvX9O9/8RuvnG41MRb/18Oux2o5H5MY7ISNTlXN+Dz9IG62/ILVxhAGI0qyPfg=</HostId>
+</Error>
+"""
+
+S3_NO_REPLICATION = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>ReplicationConfigurationNotFoundError</Code>
+ <Message>The replication configuration was not found</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>ZM6MA8EGCZ1M9EW9</RequestId>
+ <HostId>SMUZFedx1CuwjSaZQnM2bEVpet8UgX9uD/L7e MlldClgtEICTTVFz3C66cz8Bssci2OsWCVlog=</HostId>
+</Error>
+"""
+
+S3_NO_VERSIONING_ENABLED = """<?xml version="1.0" encoding="UTF-8"?>
+<Error>
+ <Code>InvalidRequest</Code>
+ <Message>Versioning must be 'Enabled' on the bucket to apply a replication configuration</Message>
+ <BucketName>{{ bucket_name }}</BucketName>
+ <RequestId>ZM6MA8EGCZ1M9EW9</RequestId>
+ <HostId>SMUZFedx1CuwjSaZQnM2bEVpet8UgX9uD/L7e MlldClgtEICTTVFz3C66cz8Bssci2OsWCVlog=</HostId>
+</Error>
+"""
+
+S3_REPLICATION_CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
+<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+{% for rule in replication["Rule"] %}
+<Rule>
+ <ID>{{ rule["ID"] }}</ID>
+ <Priority>{{ rule["Priority"] }}</Priority>
+ <Status>{{ rule["Status"] }}</Status>
+ <DeleteMarkerReplication>
+ <Status>Disabled</Status>
+ </DeleteMarkerReplication>
+ <Filter>
+ <Prefix></Prefix>
+ </Filter>
+ <Destination>
+ <Bucket>{{ rule["Destination"]["Bucket"] }}</Bucket>
+ </Destination>
+</Rule>
+{% endfor %}
+<Role>{{ replication["Role"] }}</Role>
+</ReplicationConfiguration>
+"""
diff --git a/contrib/python/moto/py3/moto/s3/urls.py b/contrib/python/moto/py3/moto/s3/urls.py
new file mode 100644
index 0000000000..a9f989915e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/urls.py
@@ -0,0 +1,22 @@
+from moto import settings
+
+from .responses import S3ResponseInstance
+
+# Catch s3.amazonaws.com, but not s3-control.amazonaws.com
+url_bases = [
+ r"https?://s3(?!-control)(.*)\.amazonaws.com",
+ r"https?://(?P<bucket_name>[a-zA-Z0-9\-_.]*)\.?s3(?!-control)(.*)\.amazonaws.com",
+]
+
+url_bases.extend(settings.get_s3_custom_endpoints())
+
+url_paths = {
+ # subdomain bucket
+ "{0}/$": S3ResponseInstance.bucket_response,
+ # subdomain key of path-based bucket
+ "{0}/(?P<key_or_bucket_name>[^/]+)/?$": S3ResponseInstance.ambiguous_response,
+ # path-based bucket + key
+ "{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)": S3ResponseInstance.key_response,
+ # subdomain bucket + key with empty first part of path
+ "{0}/(?P<key_name>/.*)$": S3ResponseInstance.key_response,
+}
diff --git a/contrib/python/moto/py3/moto/s3/utils.py b/contrib/python/moto/py3/moto/s3/utils.py
new file mode 100644
index 0000000000..8a175158fb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3/utils.py
@@ -0,0 +1,170 @@
+import logging
+
+import re
+from urllib.parse import urlparse, unquote, quote
+from requests.structures import CaseInsensitiveDict
+import sys
+from moto.settings import S3_IGNORE_SUBDOMAIN_BUCKETNAME
+
+
+log = logging.getLogger(__name__)
+
+
+bucket_name_regex = re.compile(r"(.+)\.s3(.*)\.amazonaws.com")
+user_settable_fields = {
+ "content-md5",
+ "content-language",
+ "content-type",
+ "content-encoding",
+ "cache-control",
+ "expires",
+ "content-disposition",
+ "x-robots-tag",
+}
+
+
+def bucket_name_from_url(url):
+ if S3_IGNORE_SUBDOMAIN_BUCKETNAME:
+ return None
+ domain = urlparse(url).netloc
+
+ if domain.startswith("www."):
+ domain = domain[4:]
+
+ if "amazonaws.com" in domain:
+ bucket_result = bucket_name_regex.search(domain)
+ if bucket_result:
+ return bucket_result.groups()[0]
+ else:
+ if "." in domain:
+ return domain.split(".")[0]
+ else:
+ # No subdomain found.
+ return None
+
+
+# 'owi-common-cf', 'snippets/test.json' = bucket_and_name_from_url('s3://owi-common-cf/snippets/test.json')
+def bucket_and_name_from_url(url):
+ prefix = "s3://"
+ if url.startswith(prefix):
+ bucket_name = url[len(prefix) : url.index("/", len(prefix))]
+ key = url[url.index("/", len(prefix)) + 1 :]
+ return bucket_name, key
+ else:
+ return None, None
+
+
+REGION_URL_REGEX = re.compile(
+ r"^https?://(s3[-\.](?P<region1>.+)\.amazonaws\.com/(.+)|"
+ r"(.+)\.s3[-\.](?P<region2>.+)\.amazonaws\.com)/?"
+)
+
+
+def parse_region_from_url(url, use_default_region=True):
+ match = REGION_URL_REGEX.search(url)
+ if match:
+ region = match.group("region1") or match.group("region2")
+ else:
+ region = "us-east-1" if use_default_region else None
+ return region
+
+
+def metadata_from_headers(headers):
+ metadata = CaseInsensitiveDict()
+ meta_regex = re.compile(r"^x-amz-meta-([a-zA-Z0-9\-_.]+)$", flags=re.IGNORECASE)
+ for header in headers.keys():
+ if isinstance(header, str):
+ result = meta_regex.match(header)
+ meta_key = None
+ if result:
+ # Check for extra metadata
+ meta_key = result.group(0).lower()
+ elif header.lower() in user_settable_fields:
+ # Check for special metadata that doesn't start with x-amz-meta
+ meta_key = header
+ if meta_key:
+ metadata[meta_key] = (
+ headers[header][0]
+ if type(headers[header]) == list
+ else headers[header]
+ )
+ return metadata
+
+
+def clean_key_name(key_name):
+ return unquote(key_name)
+
+
+def undo_clean_key_name(key_name):
+ return quote(key_name)
+
+
+class _VersionedKeyStore(dict):
+
+ """A simplified/modified version of Django's `MultiValueDict` taken from:
+ https://github.com/django/django/blob/70576740b0bb5289873f5a9a9a4e1a26b2c330e5/django/utils/datastructures.py#L282
+ """
+
+ def __sgetitem__(self, key):
+ return super().__getitem__(key)
+
+ def __getitem__(self, key):
+ return self.__sgetitem__(key)[-1]
+
+ def __setitem__(self, key, value):
+ try:
+ current = self.__sgetitem__(key)
+ current.append(value)
+ except (KeyError, IndexError):
+ current = [value]
+
+ super().__setitem__(key, current)
+
+ def get(self, key, default=None):
+ try:
+ return self[key]
+ except (KeyError, IndexError):
+ pass
+ return default
+
+ def getlist(self, key, default=None):
+ try:
+ return self.__sgetitem__(key)
+ except (KeyError, IndexError):
+ pass
+ return default
+
+ def setlist(self, key, list_):
+ if isinstance(list_, tuple):
+ list_ = list(list_)
+ elif not isinstance(list_, list):
+ list_ = [list_]
+
+ super().__setitem__(key, list_)
+
+ def _iteritems(self):
+ for key in self._self_iterable():
+ yield key, self[key]
+
+ def _itervalues(self):
+ for key in self._self_iterable():
+ yield self[key]
+
+ def _iterlists(self):
+ for key in self._self_iterable():
+ yield key, self.getlist(key)
+
+ def item_size(self):
+ size = 0
+ for val in self._self_iterable().values():
+ size += sys.getsizeof(val)
+ return size
+
+ def _self_iterable(self):
+ # to enable concurrency, return a copy, to avoid "dictionary changed size during iteration"
+ # TODO: look into replacing with a locking mechanism, potentially
+ return dict(self)
+
+ items = iteritems = _iteritems
+ lists = iterlists = _iterlists
+ values = itervalues = _itervalues
diff --git a/contrib/python/moto/py3/moto/s3bucket_path/__init__.py b/contrib/python/moto/py3/moto/s3bucket_path/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3bucket_path/__init__.py
diff --git a/contrib/python/moto/py3/moto/s3bucket_path/utils.py b/contrib/python/moto/py3/moto/s3bucket_path/utils.py
new file mode 100644
index 0000000000..bdf3e769b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3bucket_path/utils.py
@@ -0,0 +1,25 @@
+from urllib.parse import urlparse
+
+
+def bucket_name_from_url(url):
+ path = urlparse(url).path.lstrip("/")
+
+ parts = path.lstrip("/").split("/")
+ if len(parts) == 0 or parts[0] == "":
+ return None
+ return parts[0]
+
+
+def parse_key_name(path):
+ return "/".join(path.split("/")[2:])
+
+
+def is_delete_keys(request, path, bucket_name):
+ return (
+ path == "/" + bucket_name + "/?delete"
+ or path == "/" + bucket_name + "?delete"
+ or (
+ path == "/" + bucket_name
+ and getattr(request, "query_string", "") == "delete"
+ )
+ )
diff --git a/contrib/python/moto/py3/moto/s3control/__init__.py b/contrib/python/moto/py3/moto/s3control/__init__.py
new file mode 100644
index 0000000000..2c34680eac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/__init__.py
@@ -0,0 +1,6 @@
+"""s3control module initialization; sets value for base decorator."""
+from .models import s3control_backend
+from ..core.models import base_decorator
+
+s3control_backends = {"global": s3control_backend}
+mock_s3control = base_decorator(s3control_backends)
diff --git a/contrib/python/moto/py3/moto/s3control/config.py b/contrib/python/moto/py3/moto/s3control/config.py
new file mode 100644
index 0000000000..10914a21f1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/config.py
@@ -0,0 +1,155 @@
+import datetime
+import json
+import time
+
+from boto3 import Session
+
+from moto.core.exceptions import InvalidNextTokenException
+from moto.core.common_models import ConfigQueryModel
+from moto.s3control import s3control_backends
+from moto.s3.models import get_moto_s3_account_id
+
+
+class S3AccountPublicAccessBlockConfigQuery(ConfigQueryModel):
+ def list_config_service_resources(
+ self,
+ resource_ids,
+ resource_name,
+ limit,
+ next_token,
+ backend_region=None,
+ resource_region=None,
+ aggregator=None,
+ ):
+ # For the Account Public Access Block, they are the same for all regions. The resource ID is the AWS account ID
+ # There is no resource name -- it should be a blank string "" if provided.
+
+ # The resource name can only ever be None or an empty string:
+ if resource_name is not None and resource_name != "":
+ return [], None
+
+ pab = None
+ account_id = get_moto_s3_account_id()
+ regions = [region for region in Session().get_available_regions("config")]
+
+ # If a resource ID was passed in, then filter accordingly:
+ if resource_ids:
+ for resource_id in resource_ids:
+ if account_id == resource_id:
+ pab = self.backends["global"].public_access_block
+ break
+
+ # Otherwise, just grab the one from the backend:
+ if not resource_ids:
+ pab = self.backends["global"].public_access_block
+
+ # If it's not present, then return nothing
+ if not pab:
+ return [], None
+
+ # Filter on regions (and paginate on them as well):
+ if backend_region:
+ pab_list = [backend_region]
+ elif resource_region:
+ # Invalid region?
+ if resource_region not in regions:
+ return [], None
+
+ pab_list = [resource_region]
+
+ # Aggregated query where no regions were supplied so return them all:
+ else:
+ pab_list = regions
+
+ # Pagination logic:
+ sorted_regions = sorted(pab_list)
+ new_token = None
+
+ # Get the start:
+ if not next_token:
+ start = 0
+ else:
+ # Tokens for this moto feature is just the region-name:
+ # For OTHER non-global resource types, it's the region concatenated with the resource ID.
+ if next_token not in sorted_regions:
+ raise InvalidNextTokenException()
+
+ start = sorted_regions.index(next_token)
+
+ # Get the list of items to collect:
+ pab_list = sorted_regions[start : (start + limit)]
+
+ if len(sorted_regions) > (start + limit):
+ new_token = sorted_regions[start + limit]
+
+ return (
+ [
+ {
+ "type": "AWS::S3::AccountPublicAccessBlock",
+ "id": account_id,
+ "region": region,
+ }
+ for region in pab_list
+ ],
+ new_token,
+ )
+
+ def get_config_resource(
+ self, resource_id, resource_name=None, backend_region=None, resource_region=None
+ ):
+ # Do we even have this defined?
+ if not self.backends["global"].public_access_block:
+ return None
+
+ # Resource name can only ever be "" if it's supplied:
+ if resource_name is not None and resource_name != "":
+ return None
+
+ # Are we filtering based on region?
+ account_id = get_moto_s3_account_id()
+ regions = [region for region in Session().get_available_regions("config")]
+
+ # Is the resource ID correct?:
+ if account_id == resource_id:
+ if backend_region:
+ pab_region = backend_region
+
+ # Invalid region?
+ elif resource_region not in regions:
+ return None
+
+ else:
+ pab_region = resource_region
+
+ else:
+ return None
+
+ # Format the PAB to the AWS Config format:
+ creation_time = datetime.datetime.utcnow()
+ config_data = {
+ "version": "1.3",
+ "accountId": account_id,
+ "configurationItemCaptureTime": str(creation_time),
+ "configurationItemStatus": "OK",
+ "configurationStateId": str(
+ int(time.mktime(creation_time.timetuple()))
+ ), # PY2 and 3 compatible
+ "resourceType": "AWS::S3::AccountPublicAccessBlock",
+ "resourceId": account_id,
+ "awsRegion": pab_region,
+ "availabilityZone": "Not Applicable",
+ "configuration": self.backends[
+ "global"
+ ].public_access_block.to_config_dict(),
+ "supplementaryConfiguration": {},
+ }
+
+ # The 'configuration' field is also a JSON string:
+ config_data["configuration"] = json.dumps(config_data["configuration"])
+
+ return config_data
+
+
+s3_account_public_access_block_query = S3AccountPublicAccessBlockConfigQuery(
+ s3control_backends
+)
diff --git a/contrib/python/moto/py3/moto/s3control/exceptions.py b/contrib/python/moto/py3/moto/s3control/exceptions.py
new file mode 100644
index 0000000000..8e051b300f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/exceptions.py
@@ -0,0 +1,44 @@
+"""Exceptions raised by the s3control service."""
+from moto.core.exceptions import RESTError
+
+
+ERROR_WITH_ACCESS_POINT_NAME = """{% extends 'wrapped_single_error' %}
+{% block extra %}<AccessPointName>{{ name }}</AccessPointName>{% endblock %}
+"""
+
+
+ERROR_WITH_ACCESS_POINT_POLICY = """{% extends 'wrapped_single_error' %}
+{% block extra %}<AccessPointName>{{ name }}</AccessPointName>{% endblock %}
+"""
+
+
+class S3ControlError(RESTError):
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "single_error")
+ super().__init__(*args, **kwargs)
+
+
+class AccessPointNotFound(S3ControlError):
+ code = 404
+
+ def __init__(self, name, **kwargs):
+ kwargs.setdefault("template", "ap_not_found")
+ kwargs["name"] = name
+ self.templates["ap_not_found"] = ERROR_WITH_ACCESS_POINT_NAME
+ super().__init__(
+ "NoSuchAccessPoint", "The specified accesspoint does not exist", **kwargs
+ )
+
+
+class AccessPointPolicyNotFound(S3ControlError):
+ code = 404
+
+ def __init__(self, name, **kwargs):
+ kwargs.setdefault("template", "apf_not_found")
+ kwargs["name"] = name
+ self.templates["apf_not_found"] = ERROR_WITH_ACCESS_POINT_POLICY
+ super().__init__(
+ "NoSuchAccessPointPolicy",
+ "The specified accesspoint policy does not exist",
+ **kwargs
+ )
diff --git a/contrib/python/moto/py3/moto/s3control/models.py b/contrib/python/moto/py3/moto/s3control/models.py
new file mode 100644
index 0000000000..e0c935ec1e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/models.py
@@ -0,0 +1,132 @@
+from collections import defaultdict
+from datetime import datetime
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import get_random_hex
+from moto.s3.exceptions import (
+ WrongPublicAccessBlockAccountIdError,
+ NoSuchPublicAccessBlockConfiguration,
+ InvalidPublicAccessBlockConfiguration,
+)
+from moto.s3.models import PublicAccessBlock
+
+from .exceptions import AccessPointNotFound, AccessPointPolicyNotFound
+
+
+class AccessPoint(BaseModel):
+ def __init__(
+ self, name, bucket, vpc_configuration, public_access_block_configuration
+ ):
+ self.name = name
+ self.alias = f"{name}-{get_random_hex(34)}-s3alias"
+ self.bucket = bucket
+ self.created = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")
+ self.arn = f"arn:aws:s3:us-east-1:{get_account_id()}:accesspoint/{name}"
+ self.policy = None
+ self.network_origin = "VPC" if vpc_configuration else "Internet"
+ self.vpc_id = (vpc_configuration or {}).get("VpcId")
+ pubc = public_access_block_configuration or {}
+ self.pubc = {
+ "BlockPublicAcls": pubc.get("BlockPublicAcls", "true"),
+ "IgnorePublicAcls": pubc.get("IgnorePublicAcls", "true"),
+ "BlockPublicPolicy": pubc.get("BlockPublicPolicy", "true"),
+ "RestrictPublicBuckets": pubc.get("RestrictPublicBuckets", "true"),
+ }
+
+ def delete_policy(self):
+ self.policy = None
+
+ def set_policy(self, policy):
+ self.policy = policy
+
+ def has_policy(self):
+ return self.policy is not None
+
+
+class S3ControlBackend(BaseBackend):
+ def __init__(self, region_name=None):
+ self.region_name = region_name
+ self.public_access_block = None
+ self.access_points = defaultdict(dict)
+
+ def reset(self):
+ region_name = self.region_name
+ self.__dict__ = {}
+ self.__init__(region_name)
+
+ def get_public_access_block(self, account_id):
+ # The account ID should equal the account id that is set for Moto:
+ if account_id != get_account_id():
+ raise WrongPublicAccessBlockAccountIdError()
+
+ if not self.public_access_block:
+ raise NoSuchPublicAccessBlockConfiguration()
+
+ return self.public_access_block
+
+ def delete_public_access_block(self, account_id):
+ # The account ID should equal the account id that is set for Moto:
+ if account_id != get_account_id():
+ raise WrongPublicAccessBlockAccountIdError()
+
+ self.public_access_block = None
+
+ def put_public_access_block(self, account_id, pub_block_config):
+ # The account ID should equal the account id that is set for Moto:
+ if account_id != get_account_id():
+ raise WrongPublicAccessBlockAccountIdError()
+
+ if not pub_block_config:
+ raise InvalidPublicAccessBlockConfiguration()
+
+ self.public_access_block = PublicAccessBlock(
+ pub_block_config.get("BlockPublicAcls"),
+ pub_block_config.get("IgnorePublicAcls"),
+ pub_block_config.get("BlockPublicPolicy"),
+ pub_block_config.get("RestrictPublicBuckets"),
+ )
+
+ def create_access_point(
+ self,
+ account_id,
+ name,
+ bucket,
+ vpc_configuration,
+ public_access_block_configuration,
+ ):
+ access_point = AccessPoint(
+ name, bucket, vpc_configuration, public_access_block_configuration
+ )
+ self.access_points[account_id][name] = access_point
+ return access_point
+
+ def delete_access_point(self, account_id, name):
+ self.access_points[account_id].pop(name, None)
+
+ def get_access_point(self, account_id, name):
+ if name not in self.access_points[account_id]:
+ raise AccessPointNotFound(name)
+ return self.access_points[account_id][name]
+
+ def create_access_point_policy(self, account_id, name, policy):
+ access_point = self.get_access_point(account_id, name)
+ access_point.set_policy(policy)
+
+ def get_access_point_policy(self, account_id, name):
+ access_point = self.get_access_point(account_id, name)
+ if access_point.has_policy():
+ return access_point.policy
+ raise AccessPointPolicyNotFound(name)
+
+ def delete_access_point_policy(self, account_id, name):
+ access_point = self.get_access_point(account_id, name)
+ access_point.delete_policy()
+
+ def get_access_point_policy_status(self, account_id, name):
+ """
+ We assume the policy status is always public
+ """
+ self.get_access_point_policy(account_id, name)
+ return True
+
+
+s3control_backend = S3ControlBackend()
diff --git a/contrib/python/moto/py3/moto/s3control/responses.py b/contrib/python/moto/py3/moto/s3control/responses.py
new file mode 100644
index 0000000000..103335d305
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/responses.py
@@ -0,0 +1,223 @@
+import json
+import xmltodict
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from moto.s3.exceptions import S3ClientError
+from moto.s3.responses import S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION
+from .models import s3control_backend
+
+
+class S3ControlResponse(BaseResponse):
+ @amzn_request_id
+ def public_access_block(
+ self, request, full_url, headers
+ ): # pylint: disable=unused-argument
+ try:
+ if request.method == "GET":
+ return self.get_public_access_block(request)
+ elif request.method == "PUT":
+ return self.put_public_access_block(request)
+ elif request.method == "DELETE":
+ return self.delete_public_access_block(request)
+ except S3ClientError as err:
+ return err.code, {}, err.description
+
+ def get_public_access_block(self, request):
+ account_id = request.headers.get("x-amz-account-id")
+ public_block_config = s3control_backend.get_public_access_block(
+ account_id=account_id
+ )
+ template = self.response_template(S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION)
+ return 200, {}, template.render(public_block_config=public_block_config)
+
+ def put_public_access_block(self, request):
+ account_id = request.headers.get("x-amz-account-id")
+ data = request.body if hasattr(request, "body") else request.data
+ pab_config = self._parse_pab_config(data)
+ s3control_backend.put_public_access_block(
+ account_id, pab_config["PublicAccessBlockConfiguration"]
+ )
+ return 201, {}, json.dumps({})
+
+ def delete_public_access_block(self, request):
+ account_id = request.headers.get("x-amz-account-id")
+ s3control_backend.delete_public_access_block(account_id=account_id)
+ return 204, {}, json.dumps({})
+
+ def _parse_pab_config(self, body):
+ parsed_xml = xmltodict.parse(body)
+ parsed_xml["PublicAccessBlockConfiguration"].pop("@xmlns", None)
+
+ return parsed_xml
+
+ def access_point(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.create_access_point(full_url)
+ if request.method == "GET":
+ return self.get_access_point(full_url)
+ if request.method == "DELETE":
+ return self.delete_access_point(full_url)
+
+ def access_point_policy(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.create_access_point_policy(full_url)
+ if request.method == "GET":
+ return self.get_access_point_policy(full_url)
+ if request.method == "DELETE":
+ return self.delete_access_point_policy(full_url)
+
+ def access_point_policy_status(self, request, full_url, headers):
+ self.setup_class(request, full_url, headers)
+ if request.method == "PUT":
+ return self.create_access_point(full_url)
+ if request.method == "GET":
+ return self.get_access_point_policy_status(full_url)
+
+ def create_access_point(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_accesspoint(full_url)
+ params = xmltodict.parse(self.body)["CreateAccessPointRequest"]
+ bucket = params["Bucket"]
+ vpc_configuration = params.get("VpcConfiguration")
+ public_access_block_configuration = params.get("PublicAccessBlockConfiguration")
+ access_point = s3control_backend.create_access_point(
+ account_id=account_id,
+ name=name,
+ bucket=bucket,
+ vpc_configuration=vpc_configuration,
+ public_access_block_configuration=public_access_block_configuration,
+ )
+ template = self.response_template(CREATE_ACCESS_POINT_TEMPLATE)
+ return 200, {}, template.render(access_point=access_point)
+
+ def get_access_point(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_accesspoint(full_url)
+
+ access_point = s3control_backend.get_access_point(
+ account_id=account_id, name=name
+ )
+ template = self.response_template(GET_ACCESS_POINT_TEMPLATE)
+ return 200, {}, template.render(access_point=access_point)
+
+ def delete_access_point(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_accesspoint(full_url)
+ s3control_backend.delete_access_point(account_id=account_id, name=name)
+ return 204, {}, ""
+
+ def create_access_point_policy(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_policy(full_url)
+ params = xmltodict.parse(self.body)
+ policy = params["PutAccessPointPolicyRequest"]["Policy"]
+ s3control_backend.create_access_point_policy(account_id, name, policy)
+ return 200, {}, ""
+
+ def get_access_point_policy(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_policy(full_url)
+ policy = s3control_backend.get_access_point_policy(account_id, name)
+ template = self.response_template(GET_ACCESS_POINT_POLICY_TEMPLATE)
+ return 200, {}, template.render(policy=policy)
+
+ def delete_access_point_policy(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_policy(full_url)
+ s3control_backend.delete_access_point_policy(account_id=account_id, name=name)
+ return 204, {}, ""
+
+ def get_access_point_policy_status(self, full_url):
+ account_id, name = self._get_accountid_and_name_from_policy(full_url)
+ s3control_backend.get_access_point_policy_status(account_id, name)
+ template = self.response_template(GET_ACCESS_POINT_POLICY_STATUS_TEMPLATE)
+ return 200, {}, template.render()
+
+ def _get_accountid_and_name_from_accesspoint(self, full_url):
+ url = full_url
+ if full_url.startswith("http"):
+ url = full_url.split("://")[1]
+ account_id = url.split(".")[0]
+ name = url.split("v20180820/accesspoint/")[-1]
+ return account_id, name
+
+ def _get_accountid_and_name_from_policy(self, full_url):
+ url = full_url
+ if full_url.startswith("http"):
+ url = full_url.split("://")[1]
+ account_id = url.split(".")[0]
+ name = self.path.split("/")[-2]
+ return account_id, name
+
+
+S3ControlResponseInstance = S3ControlResponse()
+
+
+CREATE_ACCESS_POINT_TEMPLATE = """<CreateAccessPointResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <Alias>{{ access_point.name }}</Alias>
+ <AccessPointArn>{{ access_point.arn }}</AccessPointArn>
+</CreateAccessPointResult>
+"""
+
+
+GET_ACCESS_POINT_TEMPLATE = """<GetAccessPointResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <Name>{{ access_point.name }}</Name>
+ <Bucket>{{ access_point.bucket }}</Bucket>
+ <NetworkOrigin>{{ access_point.network_origin }}</NetworkOrigin>
+ {% if access_point.vpc_id %}
+ <VpcConfiguration>
+ <VpcId>{{ access_point.vpc_id }}</VpcId>
+ </VpcConfiguration>
+ {% endif %}
+ <PublicAccessBlockConfiguration>
+ <BlockPublicAcls>{{ access_point.pubc["BlockPublicAcls"] }}</BlockPublicAcls>
+ <IgnorePublicAcls>{{ access_point.pubc["IgnorePublicAcls"] }}</IgnorePublicAcls>
+ <BlockPublicPolicy>{{ access_point.pubc["BlockPublicPolicy"] }}</BlockPublicPolicy>
+ <RestrictPublicBuckets>{{ access_point.pubc["RestrictPublicBuckets"] }}</RestrictPublicBuckets>
+ </PublicAccessBlockConfiguration>
+ <CreationDate>{{ access_point.created }}</CreationDate>
+ <Alias>{{ access_point.alias }}</Alias>
+ <AccessPointArn>{{ access_point.arn }}</AccessPointArn>
+ <Endpoints>
+ <entry>
+ <key>ipv4</key>
+ <value>s3-accesspoint.us-east-1.amazonaws.com</value>
+ </entry>
+ <entry>
+ <key>fips</key>
+ <value>s3-accesspoint-fips.us-east-1.amazonaws.com</value>
+ </entry>
+ <entry>
+ <key>fips_dualstack</key>
+ <value>s3-accesspoint-fips.dualstack.us-east-1.amazonaws.com</value>
+ </entry>
+ <entry>
+ <key>dualstack</key>
+ <value>s3-accesspoint.dualstack.us-east-1.amazonaws.com</value>
+ </entry>
+ </Endpoints>
+</GetAccessPointResult>
+"""
+
+
+GET_ACCESS_POINT_POLICY_TEMPLATE = """<GetAccessPointPolicyResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <Policy>{{ policy }}</Policy>
+</GetAccessPointPolicyResult>
+"""
+
+
+GET_ACCESS_POINT_POLICY_STATUS_TEMPLATE = """<GetAccessPointPolicyResult>
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <PolicyStatus>
+ <IsPublic>true</IsPublic>
+ </PolicyStatus>
+</GetAccessPointPolicyResult>
+"""
diff --git a/contrib/python/moto/py3/moto/s3control/urls.py b/contrib/python/moto/py3/moto/s3control/urls.py
new file mode 100644
index 0000000000..66029b9cb4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/s3control/urls.py
@@ -0,0 +1,14 @@
+"""s3control base URL and path."""
+from .responses import S3ControlResponseInstance
+
+url_bases = [
+ r"https?://([0-9]+)\.s3-control\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ r"{0}/v20180820/configuration/publicAccessBlock$": S3ControlResponseInstance.public_access_block,
+ r"{0}/v20180820/accesspoint/(?P<name>[\w_:%-]+)$": S3ControlResponseInstance.access_point,
+ r"{0}/v20180820/accesspoint/(?P<name>[\w_:%-]+)/policy$": S3ControlResponseInstance.access_point_policy,
+ r"{0}/v20180820/accesspoint/(?P<name>[\w_:%-]+)/policyStatus$": S3ControlResponseInstance.access_point_policy_status,
+}
diff --git a/contrib/python/moto/py3/moto/sagemaker/__init__.py b/contrib/python/moto/py3/moto/sagemaker/__init__.py
new file mode 100644
index 0000000000..71ccc54794
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/__init__.py
@@ -0,0 +1,5 @@
+from .models import sagemaker_backends
+from ..core.models import base_decorator
+
+sagemaker_backend = sagemaker_backends["us-east-1"]
+mock_sagemaker = base_decorator(sagemaker_backends)
diff --git a/contrib/python/moto/py3/moto/sagemaker/exceptions.py b/contrib/python/moto/py3/moto/sagemaker/exceptions.py
new file mode 100644
index 0000000000..ba183a0f59
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/exceptions.py
@@ -0,0 +1,40 @@
+from moto.core.exceptions import RESTError, JsonRESTError, AWSError
+
+ERROR_WITH_MODEL_NAME = """{% extends 'single_error' %}
+{% block extra %}<ModelName>{{ model }}</ModelName>{% endblock %}
+"""
+
+
+class SagemakerClientError(RESTError):
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "single_error")
+ self.templates["model_error"] = ERROR_WITH_MODEL_NAME
+ super().__init__(*args, **kwargs)
+
+
+class ModelError(RESTError):
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("template", "model_error")
+ self.templates["model_error"] = ERROR_WITH_MODEL_NAME
+ super().__init__(*args, **kwargs)
+
+
+class MissingModel(ModelError):
+ code = 404
+
+ def __init__(self, *args, **kwargs):
+ super().__init__("NoSuchModel", "Could not find model", *args, **kwargs)
+
+
+class ValidationError(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ValidationException", message, **kwargs)
+
+
+class AWSValidationException(AWSError):
+ TYPE = "ValidationException"
+
+
+class ResourceNotFound(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__(__class__.__name__, message, **kwargs)
diff --git a/contrib/python/moto/py3/moto/sagemaker/models.py b/contrib/python/moto/py3/moto/sagemaker/models.py
new file mode 100644
index 0000000000..f5490d10ac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/models.py
@@ -0,0 +1,2077 @@
+import json
+import os
+from datetime import datetime
+from moto.core import get_account_id, BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import BackendDict
+from moto.sagemaker import validators
+from moto.utilities.paginator import paginate
+from .exceptions import (
+ MissingModel,
+ ValidationError,
+ AWSValidationException,
+ ResourceNotFound,
+)
+
+
+PAGINATION_MODEL = {
+ "list_experiments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "limit_default": 100,
+ "unique_attribute": "experiment_arn",
+ "fail_on_invalid_token": True,
+ },
+ "list_trials": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "limit_default": 100,
+ "unique_attribute": "trial_arn",
+ "fail_on_invalid_token": True,
+ },
+ "list_trial_components": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "limit_default": 100,
+ "unique_attribute": "trial_component_arn",
+ "fail_on_invalid_token": True,
+ },
+ "list_tags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "limit_default": 50,
+ "unique_attribute": "Key",
+ "fail_on_invalid_token": True,
+ },
+}
+
+
+class BaseObject(BaseModel):
+ def camelCase(self, key):
+ words = []
+ for word in key.split("_"):
+ words.append(word.title())
+ return "".join(words)
+
+ def update(self, details_json):
+ details = json.loads(details_json)
+ for k in details.keys():
+ setattr(self, k, details[k])
+
+ def gen_response_object(self):
+ response_object = dict()
+ for key, value in self.__dict__.items():
+ if "_" in key:
+ response_object[self.camelCase(key)] = value
+ else:
+ response_object[key[0].upper() + key[1:]] = value
+ return response_object
+
+ @property
+ def response_object(self):
+ return self.gen_response_object()
+
+
+class FakeProcessingJob(BaseObject):
+ def __init__(
+ self,
+ app_specification,
+ experiment_config,
+ network_config,
+ processing_inputs,
+ processing_job_name,
+ processing_output_config,
+ region_name,
+ role_arn,
+ tags,
+ stopping_condition,
+ ):
+ self.processing_job_name = processing_job_name
+ self.processing_job_arn = FakeProcessingJob.arn_formatter(
+ processing_job_name, region_name
+ )
+
+ now_string = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.creation_time = now_string
+ self.last_modified_time = now_string
+ self.processing_end_time = now_string
+ self.tags = tags or []
+ self.role_arn = role_arn
+ self.app_specification = app_specification
+ self.experiment_config = experiment_config
+ self.network_config = network_config
+ self.processing_inputs = processing_inputs
+ self.processing_job_status = "Completed"
+ self.processing_output_config = processing_output_config
+ self.stopping_condition = stopping_condition
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"ProcessingJobArn": self.processing_job_arn}
+
+ @staticmethod
+ def arn_formatter(endpoint_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":processing-job/"
+ + endpoint_name
+ )
+
+
+class FakeTrainingJob(BaseObject):
+ def __init__(
+ self,
+ region_name,
+ training_job_name,
+ hyper_parameters,
+ algorithm_specification,
+ role_arn,
+ input_data_config,
+ output_data_config,
+ resource_config,
+ vpc_config,
+ stopping_condition,
+ tags,
+ enable_network_isolation,
+ enable_inter_container_traffic_encryption,
+ enable_managed_spot_training,
+ checkpoint_config,
+ debug_hook_config,
+ debug_rule_configurations,
+ tensor_board_output_config,
+ experiment_config,
+ ):
+ self.training_job_name = training_job_name
+ self.hyper_parameters = hyper_parameters
+ self.algorithm_specification = algorithm_specification
+ self.role_arn = role_arn
+ self.input_data_config = input_data_config
+ self.output_data_config = output_data_config
+ self.resource_config = resource_config
+ self.vpc_config = vpc_config
+ self.stopping_condition = stopping_condition
+ self.tags = tags or []
+ self.enable_network_isolation = enable_network_isolation
+ self.enable_inter_container_traffic_encryption = (
+ enable_inter_container_traffic_encryption
+ )
+ self.enable_managed_spot_training = enable_managed_spot_training
+ self.checkpoint_config = checkpoint_config
+ self.debug_hook_config = debug_hook_config
+ self.debug_rule_configurations = debug_rule_configurations
+ self.tensor_board_output_config = tensor_board_output_config
+ self.experiment_config = experiment_config
+ self.training_job_arn = FakeTrainingJob.arn_formatter(
+ training_job_name, region_name
+ )
+ self.creation_time = self.last_modified_time = datetime.now().strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+ self.model_artifacts = {
+ "S3ModelArtifacts": os.path.join(
+ self.output_data_config["S3OutputPath"],
+ self.training_job_name,
+ "output",
+ "model.tar.gz",
+ )
+ }
+ self.training_job_status = "Completed"
+ self.secondary_status = "Completed"
+ self.algorithm_specification["MetricDefinitions"] = [
+ {
+ "Name": "test:dcg",
+ "Regex": "#quality_metric: host=\\S+, test dcg <score>=(\\S+)",
+ }
+ ]
+ now_string = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.creation_time = now_string
+ self.last_modified_time = now_string
+ self.training_start_time = now_string
+ self.training_end_time = now_string
+ self.secondary_status_transitions = [
+ {
+ "Status": "Starting",
+ "StartTime": self.creation_time,
+ "EndTime": self.creation_time,
+ "StatusMessage": "Preparing the instances for training",
+ }
+ ]
+ self.final_metric_data_list = [
+ {
+ "MetricName": "train:progress",
+ "Value": 100.0,
+ "Timestamp": self.creation_time,
+ }
+ ]
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"TrainingJobArn": self.training_job_arn}
+
+ @staticmethod
+ def arn_formatter(endpoint_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":training-job/"
+ + endpoint_name
+ )
+
+
+class FakeEndpoint(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ region_name,
+ endpoint_name,
+ endpoint_config_name,
+ production_variants,
+ data_capture_config,
+ tags,
+ ):
+ self.endpoint_name = endpoint_name
+ self.endpoint_arn = FakeEndpoint.arn_formatter(endpoint_name, region_name)
+ self.endpoint_config_name = endpoint_config_name
+ self.production_variants = self._process_production_variants(
+ production_variants
+ )
+ self.data_capture_config = data_capture_config
+ self.tags = tags or []
+ self.endpoint_status = "InService"
+ self.failure_reason = None
+ self.creation_time = self.last_modified_time = datetime.now().strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+
+ def _process_production_variants(self, production_variants):
+ endpoint_variants = []
+ for production_variant in production_variants:
+ temp_variant = {}
+
+ # VariantName is the only required param
+ temp_variant["VariantName"] = production_variant["VariantName"]
+
+ if production_variant.get("InitialInstanceCount", None):
+ temp_variant["CurrentInstanceCount"] = production_variant[
+ "InitialInstanceCount"
+ ]
+ temp_variant["DesiredInstanceCount"] = production_variant[
+ "InitialInstanceCount"
+ ]
+
+ if production_variant.get("InitialVariantWeight", None):
+ temp_variant["CurrentWeight"] = production_variant[
+ "InitialVariantWeight"
+ ]
+ temp_variant["DesiredWeight"] = production_variant[
+ "InitialVariantWeight"
+ ]
+
+ if production_variant.get("ServerlessConfig", None):
+ temp_variant["CurrentServerlessConfig"] = production_variant[
+ "ServerlessConfig"
+ ]
+ temp_variant["DesiredServerlessConfig"] = production_variant[
+ "ServerlessConfig"
+ ]
+
+ endpoint_variants.append(temp_variant)
+
+ return endpoint_variants
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"EndpointArn": self.endpoint_arn}
+
+ @staticmethod
+ def arn_formatter(endpoint_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":endpoint/"
+ + endpoint_name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.endpoint_arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["EndpointName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#aws-resource-sagemaker-endpoint-return-values
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "EndpointName":
+ return self.endpoint_name
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html
+ return "AWS::SageMaker::Endpoint"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ sagemaker_backend = sagemaker_backends[region_name]
+
+ # Get required properties from provided CloudFormation template
+ properties = cloudformation_json["Properties"]
+ endpoint_config_name = properties["EndpointConfigName"]
+
+ endpoint = sagemaker_backend.create_endpoint(
+ endpoint_name=resource_name,
+ endpoint_config_name=endpoint_config_name,
+ tags=properties.get("Tags", []),
+ )
+ return endpoint
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # Changes to the Endpoint will not change resource name
+ cls.delete_from_cloudformation_json(
+ original_resource.endpoint_arn, cloudformation_json, region_name
+ )
+ new_resource = cls.create_from_cloudformation_json(
+ original_resource.endpoint_name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # Get actual name because resource_name actually provides the ARN
+ # since the Physical Resource ID is the ARN despite SageMaker
+ # using the name for most of its operations.
+ endpoint_name = resource_name.split("/")[-1]
+
+ sagemaker_backends[region_name].delete_endpoint(endpoint_name)
+
+
+class FakeEndpointConfig(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ region_name,
+ endpoint_config_name,
+ production_variants,
+ data_capture_config,
+ tags,
+ kms_key_id,
+ ):
+ self.validate_production_variants(production_variants)
+
+ self.endpoint_config_name = endpoint_config_name
+ self.endpoint_config_arn = FakeEndpointConfig.arn_formatter(
+ endpoint_config_name, region_name
+ )
+ self.production_variants = production_variants or []
+ self.data_capture_config = data_capture_config or {}
+ self.tags = tags or []
+ self.kms_key_id = kms_key_id
+ self.creation_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+ def validate_production_variants(self, production_variants):
+ for production_variant in production_variants:
+ self.validate_instance_type(production_variant["InstanceType"])
+
+ def validate_instance_type(self, instance_type):
+ VALID_INSTANCE_TYPES = [
+ "ml.r5d.12xlarge",
+ "ml.r5.12xlarge",
+ "ml.p2.xlarge",
+ "ml.m5.4xlarge",
+ "ml.m4.16xlarge",
+ "ml.r5d.24xlarge",
+ "ml.r5.24xlarge",
+ "ml.p3.16xlarge",
+ "ml.m5d.xlarge",
+ "ml.m5.large",
+ "ml.t2.xlarge",
+ "ml.p2.16xlarge",
+ "ml.m5d.12xlarge",
+ "ml.inf1.2xlarge",
+ "ml.m5d.24xlarge",
+ "ml.c4.2xlarge",
+ "ml.c5.2xlarge",
+ "ml.c4.4xlarge",
+ "ml.inf1.6xlarge",
+ "ml.c5d.2xlarge",
+ "ml.c5.4xlarge",
+ "ml.g4dn.xlarge",
+ "ml.g4dn.12xlarge",
+ "ml.c5d.4xlarge",
+ "ml.g4dn.2xlarge",
+ "ml.c4.8xlarge",
+ "ml.c4.large",
+ "ml.c5d.xlarge",
+ "ml.c5.large",
+ "ml.g4dn.4xlarge",
+ "ml.c5.9xlarge",
+ "ml.g4dn.16xlarge",
+ "ml.c5d.large",
+ "ml.c5.xlarge",
+ "ml.c5d.9xlarge",
+ "ml.c4.xlarge",
+ "ml.inf1.xlarge",
+ "ml.g4dn.8xlarge",
+ "ml.inf1.24xlarge",
+ "ml.m5d.2xlarge",
+ "ml.t2.2xlarge",
+ "ml.c5d.18xlarge",
+ "ml.m5d.4xlarge",
+ "ml.t2.medium",
+ "ml.c5.18xlarge",
+ "ml.r5d.2xlarge",
+ "ml.r5.2xlarge",
+ "ml.p3.2xlarge",
+ "ml.m5d.large",
+ "ml.m5.xlarge",
+ "ml.m4.10xlarge",
+ "ml.t2.large",
+ "ml.r5d.4xlarge",
+ "ml.r5.4xlarge",
+ "ml.m5.12xlarge",
+ "ml.m4.xlarge",
+ "ml.m5.24xlarge",
+ "ml.m4.2xlarge",
+ "ml.p2.8xlarge",
+ "ml.m5.2xlarge",
+ "ml.r5d.xlarge",
+ "ml.r5d.large",
+ "ml.r5.xlarge",
+ "ml.r5.large",
+ "ml.p3.8xlarge",
+ "ml.m4.4xlarge",
+ ]
+ if not validators.is_one_of(instance_type, VALID_INSTANCE_TYPES):
+ message = "Value '{}' at 'instanceType' failed to satisfy constraint: Member must satisfy enum value set: {}".format(
+ instance_type, VALID_INSTANCE_TYPES
+ )
+ raise ValidationError(message=message)
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"EndpointConfigArn": self.endpoint_config_arn}
+
+ @staticmethod
+ def arn_formatter(model_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":endpoint-config/"
+ + model_name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.endpoint_config_arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["EndpointConfigName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#aws-resource-sagemaker-endpointconfig-return-values
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "EndpointConfigName":
+ return self.endpoint_config_name
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html
+ return "AWS::SageMaker::EndpointConfig"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ sagemaker_backend = sagemaker_backends[region_name]
+
+ # Get required properties from provided CloudFormation template
+ properties = cloudformation_json["Properties"]
+ production_variants = properties["ProductionVariants"]
+
+ endpoint_config = sagemaker_backend.create_endpoint_config(
+ endpoint_config_name=resource_name,
+ production_variants=production_variants,
+ data_capture_config=properties.get("DataCaptureConfig", {}),
+ kms_key_id=properties.get("KmsKeyId"),
+ tags=properties.get("Tags", []),
+ )
+ return endpoint_config
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # Most changes to the endpoint config will change resource name for EndpointConfigs
+ cls.delete_from_cloudformation_json(
+ original_resource.endpoint_config_arn, cloudformation_json, region_name
+ )
+ new_resource = cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # Get actual name because resource_name actually provides the ARN
+ # since the Physical Resource ID is the ARN despite SageMaker
+ # using the name for most of its operations.
+ endpoint_config_name = resource_name.split("/")[-1]
+
+ sagemaker_backends[region_name].delete_endpoint_config(endpoint_config_name)
+
+
+class Model(BaseObject, CloudFormationModel):
+ def __init__(
+ self,
+ region_name,
+ model_name,
+ execution_role_arn,
+ primary_container,
+ vpc_config,
+ containers=None,
+ tags=None,
+ ):
+ self.model_name = model_name
+ self.creation_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.containers = containers or []
+ self.tags = tags or []
+ self.enable_network_isolation = False
+ self.vpc_config = vpc_config
+ self.primary_container = primary_container
+ self.execution_role_arn = execution_role_arn or "arn:test"
+ self.model_arn = self.arn_for_model_name(self.model_name, region_name)
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"ModelArn": self.model_arn}
+
+ @staticmethod
+ def arn_for_model_name(model_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":model/"
+ + model_name
+ )
+
+ @property
+ def physical_resource_id(self):
+ return self.model_arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["ModelName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#aws-resource-sagemaker-model-return-values
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "ModelName":
+ return self.model_name
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html
+ return "AWS::SageMaker::Model"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ sagemaker_backend = sagemaker_backends[region_name]
+
+ # Get required properties from provided CloudFormation template
+ properties = cloudformation_json["Properties"]
+ execution_role_arn = properties["ExecutionRoleArn"]
+ primary_container = properties["PrimaryContainer"]
+
+ model = sagemaker_backend.create_model(
+ ModelName=resource_name,
+ ExecutionRoleArn=execution_role_arn,
+ PrimaryContainer=primary_container,
+ VpcConfig=properties.get("VpcConfig", {}),
+ Containers=properties.get("Containers", []),
+ Tags=properties.get("Tags", []),
+ )
+ return model
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # Most changes to the model will change resource name for Models
+ cls.delete_from_cloudformation_json(
+ original_resource.model_arn, cloudformation_json, region_name
+ )
+ new_resource = cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # Get actual name because resource_name actually provides the ARN
+ # since the Physical Resource ID is the ARN despite SageMaker
+ # using the name for most of its operations.
+ model_name = resource_name.split("/")[-1]
+
+ sagemaker_backends[region_name].delete_model(model_name)
+
+
+class VpcConfig(BaseObject):
+ def __init__(self, security_group_ids, subnets):
+ self.security_group_ids = security_group_ids
+ self.subnets = subnets
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+
+class Container(BaseObject):
+ def __init__(self, **kwargs):
+ self.container_hostname = kwargs.get("container_hostname", "localhost")
+ self.model_data_url = kwargs.get("data_url", "")
+ self.model_package_name = kwargs.get("package_name", "pkg")
+ self.image = kwargs.get("image", "")
+ self.environment = kwargs.get("environment", {})
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+
+class FakeSagemakerNotebookInstance(CloudFormationModel):
+ def __init__(
+ self,
+ region_name,
+ notebook_instance_name,
+ instance_type,
+ role_arn,
+ subnet_id,
+ security_group_ids,
+ kms_key_id,
+ tags,
+ lifecycle_config_name,
+ direct_internet_access,
+ volume_size_in_gb,
+ accelerator_types,
+ default_code_repository,
+ additional_code_repositories,
+ root_access,
+ ):
+ self.validate_volume_size_in_gb(volume_size_in_gb)
+ self.validate_instance_type(instance_type)
+
+ self.region_name = region_name
+ self.notebook_instance_name = notebook_instance_name
+ self.instance_type = instance_type
+ self.role_arn = role_arn
+ self.subnet_id = subnet_id
+ self.security_group_ids = security_group_ids
+ self.kms_key_id = kms_key_id
+ self.tags = tags or []
+ self.lifecycle_config_name = lifecycle_config_name
+ self.direct_internet_access = direct_internet_access
+ self.volume_size_in_gb = volume_size_in_gb
+ self.accelerator_types = accelerator_types
+ self.default_code_repository = default_code_repository
+ self.additional_code_repositories = additional_code_repositories
+ self.root_access = root_access
+ self.status = None
+ self.creation_time = self.last_modified_time = datetime.now()
+ self.start()
+
+ def validate_volume_size_in_gb(self, volume_size_in_gb):
+ if not validators.is_integer_between(volume_size_in_gb, mn=5, optional=True):
+ message = "Invalid range for parameter VolumeSizeInGB, value: {}, valid range: 5-inf"
+ raise ValidationError(message=message)
+
+ def validate_instance_type(self, instance_type):
+ VALID_INSTANCE_TYPES = [
+ "ml.p2.xlarge",
+ "ml.m5.4xlarge",
+ "ml.m4.16xlarge",
+ "ml.t3.xlarge",
+ "ml.p3.16xlarge",
+ "ml.t2.xlarge",
+ "ml.p2.16xlarge",
+ "ml.c4.2xlarge",
+ "ml.c5.2xlarge",
+ "ml.c4.4xlarge",
+ "ml.c5d.2xlarge",
+ "ml.c5.4xlarge",
+ "ml.c5d.4xlarge",
+ "ml.c4.8xlarge",
+ "ml.c5d.xlarge",
+ "ml.c5.9xlarge",
+ "ml.c5.xlarge",
+ "ml.c5d.9xlarge",
+ "ml.c4.xlarge",
+ "ml.t2.2xlarge",
+ "ml.c5d.18xlarge",
+ "ml.t3.2xlarge",
+ "ml.t3.medium",
+ "ml.t2.medium",
+ "ml.c5.18xlarge",
+ "ml.p3.2xlarge",
+ "ml.m5.xlarge",
+ "ml.m4.10xlarge",
+ "ml.t2.large",
+ "ml.m5.12xlarge",
+ "ml.m4.xlarge",
+ "ml.t3.large",
+ "ml.m5.24xlarge",
+ "ml.m4.2xlarge",
+ "ml.p2.8xlarge",
+ "ml.m5.2xlarge",
+ "ml.p3.8xlarge",
+ "ml.m4.4xlarge",
+ ]
+ if not validators.is_one_of(instance_type, VALID_INSTANCE_TYPES):
+ message = "Value '{}' at 'instanceType' failed to satisfy constraint: Member must satisfy enum value set: {}".format(
+ instance_type, VALID_INSTANCE_TYPES
+ )
+ raise ValidationError(message=message)
+
+ @property
+ def arn(self):
+ return (
+ "arn:aws:sagemaker:"
+ + self.region_name
+ + ":"
+ + str(get_account_id())
+ + ":notebook-instance/"
+ + self.notebook_instance_name
+ )
+
+ @property
+ def url(self):
+ return "{}.notebook.{}.sagemaker.aws".format(
+ self.notebook_instance_name, self.region_name
+ )
+
+ def start(self):
+ self.status = "InService"
+
+ @property
+ def is_deletable(self):
+ return self.status in ["Stopped", "Failed"]
+
+ def stop(self):
+ self.status = "Stopped"
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["NotebookInstanceName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#aws-resource-sagemaker-notebookinstance-return-values
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "NotebookInstanceName":
+ return self.notebook_instance_name
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html
+ return "AWS::SageMaker::NotebookInstance"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ # Get required properties from provided CloudFormation template
+ properties = cloudformation_json["Properties"]
+ instance_type = properties["InstanceType"]
+ role_arn = properties["RoleArn"]
+
+ notebook = sagemaker_backends[region_name].create_notebook_instance(
+ notebook_instance_name=resource_name,
+ instance_type=instance_type,
+ role_arn=role_arn,
+ )
+ return notebook
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # Operations keep same resource name so delete old and create new to mimic update
+ cls.delete_from_cloudformation_json(
+ original_resource.arn, cloudformation_json, region_name
+ )
+ new_resource = cls.create_from_cloudformation_json(
+ original_resource.notebook_instance_name, cloudformation_json, region_name
+ )
+ return new_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # Get actual name because resource_name actually provides the ARN
+ # since the Physical Resource ID is the ARN despite SageMaker
+ # using the name for most of its operations.
+ notebook_instance_name = resource_name.split("/")[-1]
+
+ backend = sagemaker_backends[region_name]
+ backend.stop_notebook_instance(notebook_instance_name)
+ backend.delete_notebook_instance(notebook_instance_name)
+
+
+class FakeSageMakerNotebookInstanceLifecycleConfig(BaseObject, CloudFormationModel):
+ def __init__(
+ self, region_name, notebook_instance_lifecycle_config_name, on_create, on_start
+ ):
+ self.region_name = region_name
+ self.notebook_instance_lifecycle_config_name = (
+ notebook_instance_lifecycle_config_name
+ )
+ self.on_create = on_create
+ self.on_start = on_start
+ self.creation_time = self.last_modified_time = datetime.now().strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+ self.notebook_instance_lifecycle_config_arn = (
+ FakeSageMakerNotebookInstanceLifecycleConfig.arn_formatter(
+ self.notebook_instance_lifecycle_config_name, self.region_name
+ )
+ )
+
+ @staticmethod
+ def arn_formatter(notebook_instance_lifecycle_config_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":notebook-instance-lifecycle-configuration/"
+ + notebook_instance_lifecycle_config_name
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"TrainingJobArn": self.training_job_arn}
+
+ @property
+ def physical_resource_id(self):
+ return self.notebook_instance_lifecycle_config_arn
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["NotebookInstanceLifecycleConfigName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html#aws-resource-sagemaker-notebookinstancelifecycleconfig-return-values
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "NotebookInstanceLifecycleConfigName":
+ return self.notebook_instance_lifecycle_config_name
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return None
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html
+ return "AWS::SageMaker::NotebookInstanceLifecycleConfig"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+
+ config = sagemaker_backends[
+ region_name
+ ].create_notebook_instance_lifecycle_config(
+ notebook_instance_lifecycle_config_name=resource_name,
+ on_create=properties.get("OnCreate"),
+ on_start=properties.get("OnStart"),
+ )
+ return config
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ # Operations keep same resource name so delete old and create new to mimic update
+ cls.delete_from_cloudformation_json(
+ original_resource.notebook_instance_lifecycle_config_arn,
+ cloudformation_json,
+ region_name,
+ )
+ new_resource = cls.create_from_cloudformation_json(
+ original_resource.notebook_instance_lifecycle_config_name,
+ cloudformation_json,
+ region_name,
+ )
+ return new_resource
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # Get actual name because resource_name actually provides the ARN
+ # since the Physical Resource ID is the ARN despite SageMaker
+ # using the name for most of its operations.
+ config_name = resource_name.split("/")[-1]
+
+ backend = sagemaker_backends[region_name]
+ backend.delete_notebook_instance_lifecycle_config(config_name)
+
+
+class SageMakerModelBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._models = {}
+ self.notebook_instances = {}
+ self.endpoint_configs = {}
+ self.endpoints = {}
+ self.experiments = {}
+ self.processing_jobs = {}
+ self.trials = {}
+ self.trial_components = {}
+ self.training_jobs = {}
+ self.notebook_instance_lifecycle_configurations = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint services."""
+ api_service = BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "api.sagemaker", special_service_name="sagemaker.api"
+ )
+
+ notebook_service_id = f"vpce-svc-{BaseBackend.vpce_random_number()}"
+ studio_service_id = f"vpce-svc-{BaseBackend.vpce_random_number()}"
+
+ notebook_service = {
+ "AcceptanceRequired": False,
+ "AvailabilityZones": zones,
+ "BaseEndpointDnsNames": [
+ f"{notebook_service_id}.{service_region}.vpce.amazonaws.com",
+ f"notebook.{service_region}.vpce.sagemaker.aws",
+ ],
+ "ManagesVpcEndpoints": False,
+ "Owner": "amazon",
+ "PrivateDnsName": f"*.notebook.{service_region}.sagemaker.aws",
+ "PrivateDnsNameVerificationState": "verified",
+ "PrivateDnsNames": [
+ {"PrivateDnsName": f"*.notebook.{service_region}.sagemaker.aws"}
+ ],
+ "ServiceId": notebook_service_id,
+ "ServiceName": f"aws.sagemaker.{service_region}.notebook",
+ "ServiceType": [{"ServiceType": "Interface"}],
+ "Tags": [],
+ "VpcEndpointPolicySupported": True,
+ }
+ studio_service = {
+ "AcceptanceRequired": False,
+ "AvailabilityZones": zones,
+ "BaseEndpointDnsNames": [
+ f"{studio_service_id}.{service_region}.vpce.amazonaws.com",
+ f"studio.{service_region}.vpce.sagemaker.aws",
+ ],
+ "ManagesVpcEndpoints": False,
+ "Owner": "amazon",
+ "PrivateDnsName": f"*.studio.{service_region}.sagemaker.aws",
+ "PrivateDnsNameVerificationState": "verified",
+ "PrivateDnsNames": [
+ {"PrivateDnsName": f"*.studio.{service_region}.sagemaker.aws"}
+ ],
+ "ServiceId": studio_service_id,
+ "ServiceName": f"aws.sagemaker.{service_region}.studio",
+ "ServiceType": [{"ServiceType": "Interface"}],
+ "Tags": [],
+ "VpcEndpointPolicySupported": True,
+ }
+ return api_service + [notebook_service, studio_service]
+
+ def create_model(self, **kwargs):
+ model_obj = Model(
+ region_name=self.region_name,
+ model_name=kwargs.get("ModelName"),
+ execution_role_arn=kwargs.get("ExecutionRoleArn"),
+ primary_container=kwargs.get("PrimaryContainer", {}),
+ vpc_config=kwargs.get("VpcConfig", {}),
+ containers=kwargs.get("Containers", []),
+ tags=kwargs.get("Tags", []),
+ )
+
+ self._models[kwargs.get("ModelName")] = model_obj
+ return model_obj
+
+ def describe_model(self, model_name=None):
+ model = self._models.get(model_name)
+ if model:
+ return model
+ message = "Could not find model '{}'.".format(
+ Model.arn_for_model_name(model_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def list_models(self):
+ return self._models.values()
+
+ def delete_model(self, model_name=None):
+ for model in self._models.values():
+ if model.model_name == model_name:
+ self._models.pop(model.model_name)
+ break
+ else:
+ raise MissingModel(model=model_name)
+
+ def create_experiment(self, experiment_name):
+ experiment = FakeExperiment(
+ region_name=self.region_name, experiment_name=experiment_name, tags=[]
+ )
+ self.experiments[experiment_name] = experiment
+ return experiment.response_create
+
+ def describe_experiment(self, experiment_name):
+ experiment_data = self.experiments[experiment_name]
+ return {
+ "ExperimentName": experiment_data.experiment_name,
+ "ExperimentArn": experiment_data.experiment_arn,
+ "CreationTime": experiment_data.creation_time,
+ "LastModifiedTime": experiment_data.last_modified_time,
+ }
+
+ def _get_resource_from_arn(self, arn):
+ resources = {
+ "model": self._models,
+ "notebook-instance": self.notebook_instances,
+ "endpoint": self.endpoints,
+ "endpoint-config": self.endpoint_configs,
+ "training-job": self.training_jobs,
+ "experiment": self.experiments,
+ "experiment-trial": self.trials,
+ "experiment-trial-component": self.trial_components,
+ "processing-job": self.processing_jobs,
+ }
+ target_resource, target_name = arn.split(":")[-1].split("/")
+ try:
+ resource = resources.get(target_resource).get(target_name)
+ except KeyError:
+ message = f"Could not find {target_resource} with name {target_name}"
+ raise ValidationError(message=message)
+ return resource
+
+ def add_tags(self, arn, tags):
+ resource = self._get_resource_from_arn(arn)
+ resource.tags.extend(tags)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_tags(self, arn):
+ resource = self._get_resource_from_arn(arn)
+ return resource.tags
+
+ def delete_tags(self, arn, tag_keys):
+ resource = self._get_resource_from_arn(arn)
+ resource.tags = [tag for tag in resource.tags if tag["Key"] not in tag_keys]
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_experiments(self):
+ return list(self.experiments.values())
+
+ def search(self, resource=None, search_expression=None):
+ next_index = None
+
+ valid_resources = [
+ "Pipeline",
+ "ModelPackageGroup",
+ "TrainingJob",
+ "ExperimentTrialComponent",
+ "FeatureGroup",
+ "Endpoint",
+ "PipelineExecution",
+ "Project",
+ "ExperimentTrial",
+ "Image",
+ "ImageVersion",
+ "ModelPackage",
+ "Experiment",
+ ]
+
+ if resource not in valid_resources:
+ raise AWSValidationException(
+ f"An error occurred (ValidationException) when calling the Search operation: 1 validation error detected: Value '{resource}' at 'resource' failed to satisfy constraint: Member must satisfy enum value set: {valid_resources}"
+ )
+
+ def evaluate_search_expression(item):
+ filters = None
+ if search_expression is not None:
+ filters = search_expression.get("Filters")
+
+ if filters is not None:
+ for f in filters:
+ if f["Operator"] == "Equals":
+ if f["Name"].startswith("Tags."):
+ key = f["Name"][5:]
+ value = f["Value"]
+
+ if (
+ len(
+ [
+ e
+ for e in item.tags
+ if e["Key"] == key and e["Value"] == value
+ ]
+ )
+ == 0
+ ):
+ return False
+ if f["Name"] == "ExperimentName":
+ experiment_name = f["Value"]
+
+ if hasattr(item, "experiment_name"):
+ if getattr(item, "experiment_name") != experiment_name:
+ return False
+ else:
+ raise ValidationError(
+ message="Unknown property name: ExperimentName"
+ )
+
+ if f["Name"] == "TrialName":
+ raise AWSValidationException(
+ f"An error occurred (ValidationException) when calling the Search operation: Unknown property name: {f['Name']}"
+ )
+
+ if f["Name"] == "Parents.TrialName":
+ trial_name = f["Value"]
+
+ if getattr(item, "trial_name") != trial_name:
+ return False
+
+ return True
+
+ result = {
+ "Results": [],
+ "NextToken": str(next_index) if next_index is not None else None,
+ }
+ if resource == "Experiment":
+ experiments_fetched = list(self.experiments.values())
+
+ experiment_summaries = [
+ {
+ "ExperimentName": experiment_data.experiment_name,
+ "ExperimentArn": experiment_data.experiment_arn,
+ "CreationTime": experiment_data.creation_time,
+ "LastModifiedTime": experiment_data.last_modified_time,
+ }
+ for experiment_data in experiments_fetched
+ if evaluate_search_expression(experiment_data)
+ ]
+
+ for experiment_summary in experiment_summaries:
+ result["Results"].append({"Experiment": experiment_summary})
+
+ if resource == "ExperimentTrial":
+ trials_fetched = list(self.trials.values())
+
+ trial_summaries = [
+ {
+ "TrialName": trial_data.trial_name,
+ "TrialArn": trial_data.trial_arn,
+ "CreationTime": trial_data.creation_time,
+ "LastModifiedTime": trial_data.last_modified_time,
+ }
+ for trial_data in trials_fetched
+ if evaluate_search_expression(trial_data)
+ ]
+
+ for trial_summary in trial_summaries:
+ result["Results"].append({"Trial": trial_summary})
+
+ if resource == "ExperimentTrialComponent":
+ trial_components_fetched = list(self.trial_components.values())
+
+ trial_component_summaries = [
+ {
+ "TrialComponentName": trial_component_data.trial_component_name,
+ "TrialComponentArn": trial_component_data.trial_component_arn,
+ "CreationTime": trial_component_data.creation_time,
+ "LastModifiedTime": trial_component_data.last_modified_time,
+ }
+ for trial_component_data in trial_components_fetched
+ if evaluate_search_expression(trial_component_data)
+ ]
+
+ for trial_component_summary in trial_component_summaries:
+ result["Results"].append({"TrialComponent": trial_component_summary})
+ return result
+
+ def delete_experiment(self, experiment_name):
+ try:
+ del self.experiments[experiment_name]
+ except KeyError:
+ message = "Could not find experiment configuration '{}'.".format(
+ FakeTrial.arn_formatter(experiment_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def create_trial(self, trial_name, experiment_name):
+ trial = FakeTrial(
+ region_name=self.region_name,
+ trial_name=trial_name,
+ experiment_name=experiment_name,
+ tags=[],
+ trial_components=[],
+ )
+ self.trials[trial_name] = trial
+ return trial.response_create
+
+ def describe_trial(self, trial_name):
+ try:
+ return self.trials[trial_name].response_object
+ except KeyError:
+ message = "Could not find trial '{}'.".format(
+ FakeTrial.arn_formatter(trial_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def delete_trial(self, trial_name):
+ try:
+ del self.trials[trial_name]
+ except KeyError:
+ message = "Could not find trial configuration '{}'.".format(
+ FakeTrial.arn_formatter(trial_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_trials(self, experiment_name=None, trial_component_name=None):
+ trials_fetched = list(self.trials.values())
+
+ def evaluate_filter_expression(trial_data):
+ if experiment_name is not None:
+ if trial_data.experiment_name != experiment_name:
+ return False
+
+ if trial_component_name is not None:
+ if trial_component_name not in trial_data.trial_components:
+ return False
+
+ return True
+
+ return [
+ trial_data
+ for trial_data in trials_fetched
+ if evaluate_filter_expression(trial_data)
+ ]
+
+ def create_trial_component(self, trial_component_name, trial_name):
+ trial_component = FakeTrialComponent(
+ region_name=self.region_name,
+ trial_component_name=trial_component_name,
+ trial_name=trial_name,
+ tags=[],
+ )
+ self.trial_components[trial_component_name] = trial_component
+ return trial_component.response_create
+
+ def delete_trial_component(self, trial_component_name):
+ try:
+ del self.trial_components[trial_component_name]
+ except KeyError:
+ message = "Could not find trial-component configuration '{}'.".format(
+ FakeTrial.arn_formatter(trial_component_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def describe_trial_component(self, trial_component_name):
+ try:
+ return self.trial_components[trial_component_name].response_object
+ except KeyError:
+ message = "Could not find trial component '{}'.".format(
+ FakeTrialComponent.arn_formatter(trial_component_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def _update_trial_component_details(self, trial_component_name, details_json):
+ self.trial_components[trial_component_name].update(details_json)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_trial_components(self, trial_name=None):
+ trial_components_fetched = list(self.trial_components.values())
+
+ return [
+ trial_component_data
+ for trial_component_data in trial_components_fetched
+ if trial_name is None or trial_component_data.trial_name == trial_name
+ ]
+
+ def associate_trial_component(self, params):
+ trial_name = params["TrialName"]
+ trial_component_name = params["TrialComponentName"]
+
+ if trial_name in self.trials.keys():
+ self.trials[trial_name].trial_components.extend([trial_component_name])
+ else:
+ raise ResourceNotFound(
+ message=f"Trial 'arn:aws:sagemaker:{self.region_name}:{get_account_id()}:experiment-trial/{trial_name}' does not exist."
+ )
+
+ if trial_component_name in self.trial_components.keys():
+ self.trial_components[trial_component_name].trial_name = trial_name
+
+ return {
+ "TrialComponentArn": self.trial_components[
+ trial_component_name
+ ].trial_component_arn,
+ "TrialArn": self.trials[trial_name].trial_arn,
+ }
+
+ def disassociate_trial_component(self, params):
+ trial_component_name = params["TrialComponentName"]
+ trial_name = params["TrialName"]
+
+ if trial_component_name in self.trial_components.keys():
+ self.trial_components[trial_component_name].trial_name = None
+
+ if trial_name in self.trials.keys():
+ self.trials[trial_name].trial_components = list(
+ filter(
+ lambda x: x != trial_component_name,
+ self.trials[trial_name].trial_components,
+ )
+ )
+
+ return {
+ "TrialComponentArn": f"arn:aws:sagemaker:{self.region_name}:{get_account_id()}:experiment-trial-component/{trial_component_name}",
+ "TrialArn": f"arn:aws:sagemaker:{self.region_name}:{get_account_id()}:experiment-trial/{trial_name}",
+ }
+
+ def create_notebook_instance(
+ self,
+ notebook_instance_name,
+ instance_type,
+ role_arn,
+ subnet_id=None,
+ security_group_ids=None,
+ kms_key_id=None,
+ tags=None,
+ lifecycle_config_name=None,
+ direct_internet_access="Enabled",
+ volume_size_in_gb=5,
+ accelerator_types=None,
+ default_code_repository=None,
+ additional_code_repositories=None,
+ root_access=None,
+ ):
+ self._validate_unique_notebook_instance_name(notebook_instance_name)
+
+ notebook_instance = FakeSagemakerNotebookInstance(
+ region_name=self.region_name,
+ notebook_instance_name=notebook_instance_name,
+ instance_type=instance_type,
+ role_arn=role_arn,
+ subnet_id=subnet_id,
+ security_group_ids=security_group_ids,
+ kms_key_id=kms_key_id,
+ tags=tags,
+ lifecycle_config_name=lifecycle_config_name,
+ direct_internet_access=direct_internet_access
+ if direct_internet_access is not None
+ else "Enabled",
+ volume_size_in_gb=volume_size_in_gb if volume_size_in_gb is not None else 5,
+ accelerator_types=accelerator_types,
+ default_code_repository=default_code_repository,
+ additional_code_repositories=additional_code_repositories,
+ root_access=root_access,
+ )
+ self.notebook_instances[notebook_instance_name] = notebook_instance
+ return notebook_instance
+
+ def _validate_unique_notebook_instance_name(self, notebook_instance_name):
+ if notebook_instance_name in self.notebook_instances:
+ duplicate_arn = self.notebook_instances[notebook_instance_name].arn
+ message = "Cannot create a duplicate Notebook Instance ({})".format(
+ duplicate_arn
+ )
+ raise ValidationError(message=message)
+
+ def get_notebook_instance(self, notebook_instance_name):
+ try:
+ return self.notebook_instances[notebook_instance_name]
+ except KeyError:
+ raise ValidationError(message="RecordNotFound")
+
+ def start_notebook_instance(self, notebook_instance_name):
+ notebook_instance = self.get_notebook_instance(notebook_instance_name)
+ notebook_instance.start()
+
+ def stop_notebook_instance(self, notebook_instance_name):
+ notebook_instance = self.get_notebook_instance(notebook_instance_name)
+ notebook_instance.stop()
+
+ def delete_notebook_instance(self, notebook_instance_name):
+ notebook_instance = self.get_notebook_instance(notebook_instance_name)
+ if not notebook_instance.is_deletable:
+ message = "Status ({}) not in ([Stopped, Failed]). Unable to transition to (Deleting) for Notebook Instance ({})".format(
+ notebook_instance.status, notebook_instance.arn
+ )
+ raise ValidationError(message=message)
+ del self.notebook_instances[notebook_instance_name]
+
+ def create_notebook_instance_lifecycle_config(
+ self, notebook_instance_lifecycle_config_name, on_create, on_start
+ ):
+ if (
+ notebook_instance_lifecycle_config_name
+ in self.notebook_instance_lifecycle_configurations
+ ):
+ message = "Unable to create Notebook Instance Lifecycle Config {}. (Details: Notebook Instance Lifecycle Config already exists.)".format(
+ FakeSageMakerNotebookInstanceLifecycleConfig.arn_formatter(
+ notebook_instance_lifecycle_config_name, self.region_name
+ )
+ )
+ raise ValidationError(message=message)
+ lifecycle_config = FakeSageMakerNotebookInstanceLifecycleConfig(
+ region_name=self.region_name,
+ notebook_instance_lifecycle_config_name=notebook_instance_lifecycle_config_name,
+ on_create=on_create,
+ on_start=on_start,
+ )
+ self.notebook_instance_lifecycle_configurations[
+ notebook_instance_lifecycle_config_name
+ ] = lifecycle_config
+ return lifecycle_config
+
+ def describe_notebook_instance_lifecycle_config(
+ self, notebook_instance_lifecycle_config_name
+ ):
+ try:
+ return self.notebook_instance_lifecycle_configurations[
+ notebook_instance_lifecycle_config_name
+ ].response_object
+ except KeyError:
+ message = "Unable to describe Notebook Instance Lifecycle Config '{}'. (Details: Notebook Instance Lifecycle Config does not exist.)".format(
+ FakeSageMakerNotebookInstanceLifecycleConfig.arn_formatter(
+ notebook_instance_lifecycle_config_name, self.region_name
+ )
+ )
+ raise ValidationError(message=message)
+
+ def delete_notebook_instance_lifecycle_config(
+ self, notebook_instance_lifecycle_config_name
+ ):
+ try:
+ del self.notebook_instance_lifecycle_configurations[
+ notebook_instance_lifecycle_config_name
+ ]
+ except KeyError:
+ message = "Unable to delete Notebook Instance Lifecycle Config '{}'. (Details: Notebook Instance Lifecycle Config does not exist.)".format(
+ FakeSageMakerNotebookInstanceLifecycleConfig.arn_formatter(
+ notebook_instance_lifecycle_config_name, self.region_name
+ )
+ )
+ raise ValidationError(message=message)
+
+ def create_endpoint_config(
+ self,
+ endpoint_config_name,
+ production_variants,
+ data_capture_config,
+ tags,
+ kms_key_id,
+ ):
+ endpoint_config = FakeEndpointConfig(
+ region_name=self.region_name,
+ endpoint_config_name=endpoint_config_name,
+ production_variants=production_variants,
+ data_capture_config=data_capture_config,
+ tags=tags,
+ kms_key_id=kms_key_id,
+ )
+ self.validate_production_variants(production_variants)
+
+ self.endpoint_configs[endpoint_config_name] = endpoint_config
+ return endpoint_config
+
+ def validate_production_variants(self, production_variants):
+ for production_variant in production_variants:
+ if production_variant["ModelName"] not in self._models:
+ message = "Could not find model '{}'.".format(
+ Model.arn_for_model_name(
+ production_variant["ModelName"], self.region_name
+ )
+ )
+ raise ValidationError(message=message)
+
+ def describe_endpoint_config(self, endpoint_config_name):
+ try:
+ return self.endpoint_configs[endpoint_config_name].response_object
+ except KeyError:
+ message = "Could not find endpoint configuration '{}'.".format(
+ FakeEndpointConfig.arn_formatter(endpoint_config_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def delete_endpoint_config(self, endpoint_config_name):
+ try:
+ del self.endpoint_configs[endpoint_config_name]
+ except KeyError:
+ message = "Could not find endpoint configuration '{}'.".format(
+ FakeEndpointConfig.arn_formatter(endpoint_config_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def create_endpoint(self, endpoint_name, endpoint_config_name, tags):
+ try:
+ endpoint_config = self.describe_endpoint_config(endpoint_config_name)
+ except KeyError:
+ message = "Could not find endpoint_config '{}'.".format(
+ FakeEndpointConfig.arn_formatter(endpoint_config_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ endpoint = FakeEndpoint(
+ region_name=self.region_name,
+ endpoint_name=endpoint_name,
+ endpoint_config_name=endpoint_config_name,
+ production_variants=endpoint_config["ProductionVariants"],
+ data_capture_config=endpoint_config["DataCaptureConfig"],
+ tags=tags,
+ )
+
+ self.endpoints[endpoint_name] = endpoint
+ return endpoint
+
+ def describe_endpoint(self, endpoint_name):
+ try:
+ return self.endpoints[endpoint_name].response_object
+ except KeyError:
+ message = "Could not find endpoint '{}'.".format(
+ FakeEndpoint.arn_formatter(endpoint_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def delete_endpoint(self, endpoint_name):
+ try:
+ del self.endpoints[endpoint_name]
+ except KeyError:
+ message = "Could not find endpoint '{}'.".format(
+ FakeEndpoint.arn_formatter(endpoint_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def create_processing_job(
+ self,
+ app_specification,
+ experiment_config,
+ network_config,
+ processing_inputs,
+ processing_job_name,
+ processing_output_config,
+ role_arn,
+ tags,
+ stopping_condition,
+ ):
+ processing_job = FakeProcessingJob(
+ app_specification=app_specification,
+ experiment_config=experiment_config,
+ network_config=network_config,
+ processing_inputs=processing_inputs,
+ processing_job_name=processing_job_name,
+ processing_output_config=processing_output_config,
+ region_name=self.region_name,
+ role_arn=role_arn,
+ stopping_condition=stopping_condition,
+ tags=tags,
+ )
+ self.processing_jobs[processing_job_name] = processing_job
+ return processing_job
+
+ def describe_processing_job(self, processing_job_name):
+ try:
+ return self.processing_jobs[processing_job_name].response_object
+ except KeyError:
+ message = "Could not find processing job '{}'.".format(
+ FakeProcessingJob.arn_formatter(processing_job_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def list_processing_jobs(
+ self,
+ next_token,
+ max_results,
+ creation_time_after,
+ creation_time_before,
+ last_modified_time_after,
+ last_modified_time_before,
+ name_contains,
+ status_equals,
+ ):
+ if next_token:
+ try:
+ starting_index = int(next_token)
+ if starting_index > len(self.processing_jobs):
+ raise ValueError # invalid next_token
+ except ValueError:
+ raise AWSValidationException('Invalid pagination token because "{0}".')
+ else:
+ starting_index = 0
+
+ if max_results:
+ end_index = max_results + starting_index
+ processing_jobs_fetched = list(self.processing_jobs.values())[
+ starting_index:end_index
+ ]
+ if end_index >= len(self.processing_jobs):
+ next_index = None
+ else:
+ next_index = end_index
+ else:
+ processing_jobs_fetched = list(self.processing_jobs.values())
+ next_index = None
+
+ if name_contains is not None:
+ processing_jobs_fetched = filter(
+ lambda x: name_contains in x.processing_job_name,
+ processing_jobs_fetched,
+ )
+
+ if creation_time_after is not None:
+ processing_jobs_fetched = filter(
+ lambda x: x.creation_time > creation_time_after, processing_jobs_fetched
+ )
+
+ if creation_time_before is not None:
+ processing_jobs_fetched = filter(
+ lambda x: x.creation_time < creation_time_before,
+ processing_jobs_fetched,
+ )
+
+ if last_modified_time_after is not None:
+ processing_jobs_fetched = filter(
+ lambda x: x.last_modified_time > last_modified_time_after,
+ processing_jobs_fetched,
+ )
+
+ if last_modified_time_before is not None:
+ processing_jobs_fetched = filter(
+ lambda x: x.last_modified_time < last_modified_time_before,
+ processing_jobs_fetched,
+ )
+ if status_equals is not None:
+ processing_jobs_fetched = filter(
+ lambda x: x.training_job_status == status_equals,
+ processing_jobs_fetched,
+ )
+
+ processing_job_summaries = [
+ {
+ "ProcessingJobName": processing_job_data.processing_job_name,
+ "ProcessingJobArn": processing_job_data.processing_job_arn,
+ "CreationTime": processing_job_data.creation_time,
+ "ProcessingEndTime": processing_job_data.processing_end_time,
+ "LastModifiedTime": processing_job_data.last_modified_time,
+ "ProcessingJobStatus": processing_job_data.processing_job_status,
+ }
+ for processing_job_data in processing_jobs_fetched
+ ]
+
+ return {
+ "ProcessingJobSummaries": processing_job_summaries,
+ "NextToken": str(next_index) if next_index is not None else None,
+ }
+
+ def create_training_job(
+ self,
+ training_job_name,
+ hyper_parameters,
+ algorithm_specification,
+ role_arn,
+ input_data_config,
+ output_data_config,
+ resource_config,
+ vpc_config,
+ stopping_condition,
+ tags,
+ enable_network_isolation,
+ enable_inter_container_traffic_encryption,
+ enable_managed_spot_training,
+ checkpoint_config,
+ debug_hook_config,
+ debug_rule_configurations,
+ tensor_board_output_config,
+ experiment_config,
+ ):
+ training_job = FakeTrainingJob(
+ region_name=self.region_name,
+ training_job_name=training_job_name,
+ hyper_parameters=hyper_parameters,
+ algorithm_specification=algorithm_specification,
+ role_arn=role_arn,
+ input_data_config=input_data_config,
+ output_data_config=output_data_config,
+ resource_config=resource_config,
+ vpc_config=vpc_config,
+ stopping_condition=stopping_condition,
+ tags=tags,
+ enable_network_isolation=enable_network_isolation,
+ enable_inter_container_traffic_encryption=enable_inter_container_traffic_encryption,
+ enable_managed_spot_training=enable_managed_spot_training,
+ checkpoint_config=checkpoint_config,
+ debug_hook_config=debug_hook_config,
+ debug_rule_configurations=debug_rule_configurations,
+ tensor_board_output_config=tensor_board_output_config,
+ experiment_config=experiment_config,
+ )
+ self.training_jobs[training_job_name] = training_job
+ return training_job
+
+ def describe_training_job(self, training_job_name):
+ try:
+ return self.training_jobs[training_job_name].response_object
+ except KeyError:
+ message = "Could not find training job '{}'.".format(
+ FakeTrainingJob.arn_formatter(training_job_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def delete_training_job(self, training_job_name):
+ try:
+ del self.training_jobs[training_job_name]
+ except KeyError:
+ message = "Could not find endpoint configuration '{}'.".format(
+ FakeTrainingJob.arn_formatter(training_job_name, self.region_name)
+ )
+ raise ValidationError(message=message)
+
+ def _update_training_job_details(self, training_job_name, details_json):
+ self.training_jobs[training_job_name].update(details_json)
+
+ def list_training_jobs(
+ self,
+ next_token,
+ max_results,
+ creation_time_after,
+ creation_time_before,
+ last_modified_time_after,
+ last_modified_time_before,
+ name_contains,
+ status_equals,
+ ):
+ if next_token:
+ try:
+ starting_index = int(next_token)
+ if starting_index > len(self.training_jobs):
+ raise ValueError # invalid next_token
+ except ValueError:
+ raise AWSValidationException('Invalid pagination token because "{0}".')
+ else:
+ starting_index = 0
+
+ if max_results:
+ end_index = max_results + starting_index
+ training_jobs_fetched = list(self.training_jobs.values())[
+ starting_index:end_index
+ ]
+ if end_index >= len(self.training_jobs):
+ next_index = None
+ else:
+ next_index = end_index
+ else:
+ training_jobs_fetched = list(self.training_jobs.values())
+ next_index = None
+
+ if name_contains is not None:
+ training_jobs_fetched = filter(
+ lambda x: name_contains in x.training_job_name, training_jobs_fetched
+ )
+
+ if creation_time_after is not None:
+ training_jobs_fetched = filter(
+ lambda x: x.creation_time > creation_time_after, training_jobs_fetched
+ )
+
+ if creation_time_before is not None:
+ training_jobs_fetched = filter(
+ lambda x: x.creation_time < creation_time_before, training_jobs_fetched
+ )
+
+ if last_modified_time_after is not None:
+ training_jobs_fetched = filter(
+ lambda x: x.last_modified_time > last_modified_time_after,
+ training_jobs_fetched,
+ )
+
+ if last_modified_time_before is not None:
+ training_jobs_fetched = filter(
+ lambda x: x.last_modified_time < last_modified_time_before,
+ training_jobs_fetched,
+ )
+ if status_equals is not None:
+ training_jobs_fetched = filter(
+ lambda x: x.training_job_status == status_equals, training_jobs_fetched
+ )
+
+ training_job_summaries = [
+ {
+ "TrainingJobName": training_job_data.training_job_name,
+ "TrainingJobArn": training_job_data.training_job_arn,
+ "CreationTime": training_job_data.creation_time,
+ "TrainingEndTime": training_job_data.training_end_time,
+ "LastModifiedTime": training_job_data.last_modified_time,
+ "TrainingJobStatus": training_job_data.training_job_status,
+ }
+ for training_job_data in training_jobs_fetched
+ ]
+
+ return {
+ "TrainingJobSummaries": training_job_summaries,
+ "NextToken": str(next_index) if next_index is not None else None,
+ }
+
+ def update_endpoint_weights_and_capacities(
+ self, endpoint_name, desired_weights_and_capacities
+ ):
+ # Validate inputs
+ endpoint = self.endpoints.get(endpoint_name, None)
+ if not endpoint:
+ raise AWSValidationException(
+ f'Could not find endpoint "{FakeEndpoint.arn_formatter(endpoint_name, self.region_name)}".'
+ )
+
+ names_checked = []
+ for variant_config in desired_weights_and_capacities:
+ name = variant_config.get("VariantName")
+
+ if name in names_checked:
+ raise AWSValidationException(
+ f'The variant name "{name}" was non-unique within the request.'
+ )
+
+ if not any(
+ variant["VariantName"] == name
+ for variant in endpoint.production_variants
+ ):
+ raise AWSValidationException(
+ f'The variant name(s) "{name}" is/are not present within endpoint configuration "{endpoint.endpoint_config_name}".'
+ )
+
+ names_checked.append(name)
+
+ # Update endpoint variants
+ endpoint.endpoint_status = "Updating"
+
+ for variant_config in desired_weights_and_capacities:
+ name = variant_config.get("VariantName")
+ desired_weight = variant_config.get("DesiredWeight")
+ desired_instance_count = variant_config.get("DesiredInstanceCount")
+
+ for variant in endpoint.production_variants:
+ if variant.get("VariantName") == name:
+ variant["DesiredWeight"] = desired_weight
+ variant["CurrentWeight"] = desired_weight
+ variant["DesiredInstanceCount"] = desired_instance_count
+ variant["CurrentInstanceCount"] = desired_instance_count
+ break
+
+ endpoint.endpoint_status = "InService"
+ return endpoint.endpoint_arn
+
+
+class FakeExperiment(BaseObject):
+ def __init__(self, region_name, experiment_name, tags):
+ self.experiment_name = experiment_name
+ self.experiment_arn = FakeExperiment.arn_formatter(experiment_name, region_name)
+ self.tags = tags
+ self.creation_time = self.last_modified_time = datetime.now().strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"ExperimentArn": self.experiment_arn}
+
+ @staticmethod
+ def arn_formatter(experiment_arn, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":experiment/"
+ + experiment_arn
+ )
+
+
+class FakeTrial(BaseObject):
+ def __init__(
+ self, region_name, trial_name, experiment_name, tags, trial_components
+ ):
+ self.trial_name = trial_name
+ self.trial_arn = FakeTrial.arn_formatter(trial_name, region_name)
+ self.tags = tags
+ self.trial_components = trial_components
+ self.experiment_name = experiment_name
+ self.creation_time = self.last_modified_time = datetime.now().strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"TrialArn": self.trial_arn}
+
+ @staticmethod
+ def arn_formatter(trial_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":experiment-trial/"
+ + trial_name
+ )
+
+
+class FakeTrialComponent(BaseObject):
+ def __init__(self, region_name, trial_component_name, trial_name, tags):
+ self.trial_component_name = trial_component_name
+ self.trial_component_arn = FakeTrialComponent.arn_formatter(
+ trial_component_name, region_name
+ )
+ self.tags = tags
+ self.trial_name = trial_name
+ now_string = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.creation_time = self.last_modified_time = now_string
+
+ @property
+ def response_object(self):
+ response_object = self.gen_response_object()
+ return {
+ k: v for k, v in response_object.items() if v is not None and v != [None]
+ }
+
+ @property
+ def response_create(self):
+ return {"TrialComponentArn": self.trial_component_arn}
+
+ @staticmethod
+ def arn_formatter(trial_component_name, region_name):
+ return (
+ "arn:aws:sagemaker:"
+ + region_name
+ + ":"
+ + str(get_account_id())
+ + ":experiment-trial-component/"
+ + trial_component_name
+ )
+
+
+sagemaker_backends = BackendDict(SageMakerModelBackend, "sagemaker")
diff --git a/contrib/python/moto/py3/moto/sagemaker/responses.py b/contrib/python/moto/py3/moto/sagemaker/responses.py
new file mode 100644
index 0000000000..b4be4cd0e2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/responses.py
@@ -0,0 +1,589 @@
+import json
+
+from moto.sagemaker.exceptions import AWSValidationException
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import sagemaker_backends
+
+
+def format_enum_error(value, attribute, allowed):
+ return f"Value '{value}' at '{attribute}' failed to satisfy constraint: Member must satisfy enum value set: {allowed}"
+
+
+class SageMakerResponse(BaseResponse):
+ @property
+ def sagemaker_backend(self):
+ return sagemaker_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def describe_model(self):
+ model_name = self._get_param("ModelName")
+ model = self.sagemaker_backend.describe_model(model_name)
+ return json.dumps(model.response_object)
+
+ def create_model(self):
+ model = self.sagemaker_backend.create_model(**self.request_params)
+ return json.dumps(model.response_create)
+
+ def delete_model(self):
+ model_name = self._get_param("ModelName")
+ response = self.sagemaker_backend.delete_model(model_name)
+ return json.dumps(response)
+
+ def list_models(self):
+ models = self.sagemaker_backend.list_models(**self.request_params)
+ return json.dumps({"Models": [model.response_object for model in models]})
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ @amzn_request_id
+ def create_notebook_instance(self):
+ sagemaker_notebook = self.sagemaker_backend.create_notebook_instance(
+ notebook_instance_name=self._get_param("NotebookInstanceName"),
+ instance_type=self._get_param("InstanceType"),
+ subnet_id=self._get_param("SubnetId"),
+ security_group_ids=self._get_param("SecurityGroupIds"),
+ role_arn=self._get_param("RoleArn"),
+ kms_key_id=self._get_param("KmsKeyId"),
+ tags=self._get_param("Tags"),
+ lifecycle_config_name=self._get_param("LifecycleConfigName"),
+ direct_internet_access=self._get_param("DirectInternetAccess"),
+ volume_size_in_gb=self._get_param("VolumeSizeInGB"),
+ accelerator_types=self._get_param("AcceleratorTypes"),
+ default_code_repository=self._get_param("DefaultCodeRepository"),
+ additional_code_repositories=self._get_param("AdditionalCodeRepositories"),
+ root_access=self._get_param("RootAccess"),
+ )
+ response = {
+ "NotebookInstanceArn": sagemaker_notebook.arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_notebook_instance(self):
+ notebook_instance_name = self._get_param("NotebookInstanceName")
+ notebook_instance = self.sagemaker_backend.get_notebook_instance(
+ notebook_instance_name
+ )
+ response = {
+ "NotebookInstanceArn": notebook_instance.arn,
+ "NotebookInstanceName": notebook_instance.notebook_instance_name,
+ "NotebookInstanceStatus": notebook_instance.status,
+ "Url": notebook_instance.url,
+ "InstanceType": notebook_instance.instance_type,
+ "SubnetId": notebook_instance.subnet_id,
+ "SecurityGroups": notebook_instance.security_group_ids,
+ "RoleArn": notebook_instance.role_arn,
+ "KmsKeyId": notebook_instance.kms_key_id,
+ # ToDo: NetworkInterfaceId
+ "LastModifiedTime": str(notebook_instance.last_modified_time),
+ "CreationTime": str(notebook_instance.creation_time),
+ "NotebookInstanceLifecycleConfigName": notebook_instance.lifecycle_config_name,
+ "DirectInternetAccess": notebook_instance.direct_internet_access,
+ "VolumeSizeInGB": notebook_instance.volume_size_in_gb,
+ "AcceleratorTypes": notebook_instance.accelerator_types,
+ "DefaultCodeRepository": notebook_instance.default_code_repository,
+ "AdditionalCodeRepositories": notebook_instance.additional_code_repositories,
+ "RootAccess": notebook_instance.root_access,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def start_notebook_instance(self):
+ notebook_instance_name = self._get_param("NotebookInstanceName")
+ self.sagemaker_backend.start_notebook_instance(notebook_instance_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def stop_notebook_instance(self):
+ notebook_instance_name = self._get_param("NotebookInstanceName")
+ self.sagemaker_backend.stop_notebook_instance(notebook_instance_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def delete_notebook_instance(self):
+ notebook_instance_name = self._get_param("NotebookInstanceName")
+ self.sagemaker_backend.delete_notebook_instance(notebook_instance_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def list_tags(self):
+ arn = self._get_param("ResourceArn")
+ max_results = self._get_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ paged_results, next_token = self.sagemaker_backend.list_tags(
+ arn=arn, MaxResults=max_results, NextToken=next_token
+ )
+ response = {"Tags": paged_results}
+ if next_token:
+ response["NextToken"] = next_token
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def add_tags(self):
+ arn = self._get_param("ResourceArn")
+ tags = self._get_param("Tags")
+ tags = self.sagemaker_backend.add_tags(arn, tags)
+ response = {"Tags": tags}
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def delete_tags(self):
+ arn = self._get_param("ResourceArn")
+ tag_keys = self._get_param("TagKeys")
+ self.sagemaker_backend.delete_tags(arn, tag_keys)
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def create_endpoint_config(self):
+ endpoint_config = self.sagemaker_backend.create_endpoint_config(
+ endpoint_config_name=self._get_param("EndpointConfigName"),
+ production_variants=self._get_param("ProductionVariants"),
+ data_capture_config=self._get_param("DataCaptureConfig"),
+ tags=self._get_param("Tags"),
+ kms_key_id=self._get_param("KmsKeyId"),
+ )
+ response = {
+ "EndpointConfigArn": endpoint_config.endpoint_config_arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_endpoint_config(self):
+ endpoint_config_name = self._get_param("EndpointConfigName")
+ response = self.sagemaker_backend.describe_endpoint_config(endpoint_config_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_endpoint_config(self):
+ endpoint_config_name = self._get_param("EndpointConfigName")
+ self.sagemaker_backend.delete_endpoint_config(endpoint_config_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def create_endpoint(self):
+ endpoint = self.sagemaker_backend.create_endpoint(
+ endpoint_name=self._get_param("EndpointName"),
+ endpoint_config_name=self._get_param("EndpointConfigName"),
+ tags=self._get_param("Tags"),
+ )
+ response = {
+ "EndpointArn": endpoint.endpoint_arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_endpoint(self):
+ endpoint_name = self._get_param("EndpointName")
+ response = self.sagemaker_backend.describe_endpoint(endpoint_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_endpoint(self):
+ endpoint_name = self._get_param("EndpointName")
+ self.sagemaker_backend.delete_endpoint(endpoint_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def create_processing_job(self):
+ processing_job = self.sagemaker_backend.create_processing_job(
+ app_specification=self._get_param("AppSpecification"),
+ experiment_config=self._get_param("ExperimentConfig"),
+ network_config=self._get_param("NetworkConfig"),
+ processing_inputs=self._get_param("ProcessingInputs"),
+ processing_job_name=self._get_param("ProcessingJobName"),
+ processing_output_config=self._get_param("ProcessingOutputConfig"),
+ role_arn=self._get_param("RoleArn"),
+ stopping_condition=self._get_param("StoppingCondition"),
+ tags=self._get_param("Tags"),
+ )
+ response = {
+ "ProcessingJobArn": processing_job.processing_job_arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_processing_job(self):
+ processing_job_name = self._get_param("ProcessingJobName")
+ response = self.sagemaker_backend.describe_processing_job(processing_job_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def create_training_job(self):
+ training_job = self.sagemaker_backend.create_training_job(
+ training_job_name=self._get_param("TrainingJobName"),
+ hyper_parameters=self._get_param("HyperParameters"),
+ algorithm_specification=self._get_param("AlgorithmSpecification"),
+ role_arn=self._get_param("RoleArn"),
+ input_data_config=self._get_param("InputDataConfig"),
+ output_data_config=self._get_param("OutputDataConfig"),
+ resource_config=self._get_param("ResourceConfig"),
+ vpc_config=self._get_param("VpcConfig"),
+ stopping_condition=self._get_param("StoppingCondition"),
+ tags=self._get_param("Tags"),
+ enable_network_isolation=self._get_param("EnableNetworkIsolation", False),
+ enable_inter_container_traffic_encryption=self._get_param(
+ "EnableInterContainerTrafficEncryption", False
+ ),
+ enable_managed_spot_training=self._get_param(
+ "EnableManagedSpotTraining", False
+ ),
+ checkpoint_config=self._get_param("CheckpointConfig"),
+ debug_hook_config=self._get_param("DebugHookConfig"),
+ debug_rule_configurations=self._get_param("DebugRuleConfigurations"),
+ tensor_board_output_config=self._get_param("TensorBoardOutputConfig"),
+ experiment_config=self._get_param("ExperimentConfig"),
+ )
+ response = {
+ "TrainingJobArn": training_job.training_job_arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_training_job(self):
+ training_job_name = self._get_param("TrainingJobName")
+ response = self.sagemaker_backend.describe_training_job(training_job_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_training_job(self):
+ training_job_name = self._get_param("TrainingJobName")
+ self.sagemaker_backend.delete_training_job(training_job_name)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def create_notebook_instance_lifecycle_config(self):
+ lifecycle_configuration = (
+ self.sagemaker_backend.create_notebook_instance_lifecycle_config(
+ notebook_instance_lifecycle_config_name=self._get_param(
+ "NotebookInstanceLifecycleConfigName"
+ ),
+ on_create=self._get_param("OnCreate"),
+ on_start=self._get_param("OnStart"),
+ )
+ )
+ response = {
+ "NotebookInstanceLifecycleConfigArn": lifecycle_configuration.notebook_instance_lifecycle_config_arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_notebook_instance_lifecycle_config(self):
+ response = self.sagemaker_backend.describe_notebook_instance_lifecycle_config(
+ notebook_instance_lifecycle_config_name=self._get_param(
+ "NotebookInstanceLifecycleConfigName"
+ )
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_notebook_instance_lifecycle_config(self):
+ self.sagemaker_backend.delete_notebook_instance_lifecycle_config(
+ notebook_instance_lifecycle_config_name=self._get_param(
+ "NotebookInstanceLifecycleConfigName"
+ )
+ )
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def search(self):
+ response = self.sagemaker_backend.search(
+ resource=self._get_param("Resource"),
+ search_expression=self._get_param("SearchExpression"),
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_experiments(self):
+ MaxResults = self._get_param("MaxResults")
+ NextToken = self._get_param("NextToken")
+
+ paged_results, next_token = self.sagemaker_backend.list_experiments(
+ MaxResults=MaxResults, NextToken=NextToken
+ )
+
+ experiment_summaries = [
+ {
+ "ExperimentName": experiment_data.experiment_name,
+ "ExperimentArn": experiment_data.experiment_arn,
+ "CreationTime": experiment_data.creation_time,
+ "LastModifiedTime": experiment_data.last_modified_time,
+ }
+ for experiment_data in paged_results
+ ]
+
+ response = {
+ "ExperimentSummaries": experiment_summaries,
+ }
+
+ if next_token:
+ response["NextToken"] = next_token
+
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def delete_experiment(self):
+ self.sagemaker_backend.delete_experiment(
+ experiment_name=self._get_param("ExperimentName")
+ )
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def create_experiment(self):
+ response = self.sagemaker_backend.create_experiment(
+ experiment_name=self._get_param("ExperimentName")
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_experiment(self):
+ response = self.sagemaker_backend.describe_experiment(
+ experiment_name=self._get_param("ExperimentName")
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_trials(self):
+ MaxResults = self._get_param("MaxResults")
+ NextToken = self._get_param("NextToken")
+
+ paged_results, next_token = self.sagemaker_backend.list_trials(
+ NextToken=NextToken,
+ MaxResults=MaxResults,
+ experiment_name=self._get_param("ExperimentName"),
+ trial_component_name=self._get_param("TrialComponentName"),
+ )
+
+ trial_summaries = [
+ {
+ "TrialName": trial_data.trial_name,
+ "TrialArn": trial_data.trial_arn,
+ "CreationTime": trial_data.creation_time,
+ "LastModifiedTime": trial_data.last_modified_time,
+ }
+ for trial_data in paged_results
+ ]
+
+ response = {
+ "TrialSummaries": trial_summaries,
+ }
+
+ if next_token:
+ response["NextToken"] = next_token
+
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def create_trial(self):
+ response = self.sagemaker_backend.create_trial(
+ trial_name=self._get_param("TrialName"),
+ experiment_name=self._get_param("ExperimentName"),
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_trial_components(self):
+ MaxResults = self._get_param("MaxResults")
+ NextToken = self._get_param("NextToken")
+
+ paged_results, next_token = self.sagemaker_backend.list_trial_components(
+ NextToken=NextToken,
+ MaxResults=MaxResults,
+ trial_name=self._get_param("TrialName"),
+ )
+
+ trial_component_summaries = [
+ {
+ "TrialComponentName": trial_component_data.trial_component_name,
+ "TrialComponentArn": trial_component_data.trial_component_arn,
+ "CreationTime": trial_component_data.creation_time,
+ "LastModifiedTime": trial_component_data.last_modified_time,
+ }
+ for trial_component_data in paged_results
+ ]
+
+ response = {
+ "TrialComponentSummaries": trial_component_summaries,
+ }
+
+ if next_token:
+ response["NextToken"] = next_token
+
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def create_trial_component(self):
+ response = self.sagemaker_backend.create_trial_component(
+ trial_component_name=self._get_param("TrialComponentName"),
+ trial_name=self._get_param("TrialName"),
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_trial(self):
+ trial_name = self._get_param("TrialName")
+ response = self.sagemaker_backend.describe_trial(trial_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_trial(self):
+ trial_name = self._get_param("TrialName")
+ self.sagemaker_backend.delete_trial(trial_name)
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def delete_trial_component(self):
+ trial_component_name = self._get_param("TrialComponentName")
+ self.sagemaker_backend.delete_trial_component(trial_component_name)
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def describe_trial_component(self):
+ trial_component_name = self._get_param("TrialComponentName")
+ response = self.sagemaker_backend.describe_trial_component(trial_component_name)
+ return json.dumps(response)
+
+ @amzn_request_id
+ def associate_trial_component(self):
+ response = self.sagemaker_backend.associate_trial_component(self.request_params)
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def disassociate_trial_component(self):
+ response = self.sagemaker_backend.disassociate_trial_component(
+ self.request_params
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_associations(self, *args, **kwargs): # pylint: disable=unused-argument
+ response = self.sagemaker_backend.list_associations(self.request_params)
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_processing_jobs(self):
+ max_results_range = range(1, 101)
+ allowed_sort_by = ["Name", "CreationTime", "Status"]
+ allowed_sort_order = ["Ascending", "Descending"]
+ allowed_status_equals = [
+ "Completed",
+ "Stopped",
+ "InProgress",
+ "Stopping",
+ "Failed",
+ ]
+
+ max_results = self._get_int_param("MaxResults")
+ sort_by = self._get_param("SortBy", "CreationTime")
+ sort_order = self._get_param("SortOrder", "Ascending")
+ status_equals = self._get_param("StatusEquals")
+ next_token = self._get_param("NextToken")
+ errors = []
+ if max_results and max_results not in max_results_range:
+ errors.append(
+ "Value '{0}' at 'maxResults' failed to satisfy constraint: Member must have value less than or equal to {1}".format(
+ max_results, max_results_range[-1]
+ )
+ )
+
+ if sort_by not in allowed_sort_by:
+ errors.append(format_enum_error(sort_by, "sortBy", allowed_sort_by))
+ if sort_order not in allowed_sort_order:
+ errors.append(
+ format_enum_error(sort_order, "sortOrder", allowed_sort_order)
+ )
+
+ if status_equals and status_equals not in allowed_status_equals:
+ errors.append(
+ format_enum_error(status_equals, "statusEquals", allowed_status_equals)
+ )
+
+ if errors != []:
+ raise AWSValidationException(
+ f"{len(errors)} validation errors detected: {';'.join(errors)}"
+ )
+
+ response = self.sagemaker_backend.list_processing_jobs(
+ next_token=next_token,
+ max_results=max_results,
+ creation_time_after=self._get_param("CreationTimeAfter"),
+ creation_time_before=self._get_param("CreationTimeBefore"),
+ last_modified_time_after=self._get_param("LastModifiedTimeAfter"),
+ last_modified_time_before=self._get_param("LastModifiedTimeBefore"),
+ name_contains=self._get_param("NameContains"),
+ status_equals=status_equals,
+ )
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_training_jobs(self):
+ max_results_range = range(1, 101)
+ allowed_sort_by = ["Name", "CreationTime", "Status"]
+ allowed_sort_order = ["Ascending", "Descending"]
+ allowed_status_equals = [
+ "Completed",
+ "Stopped",
+ "InProgress",
+ "Stopping",
+ "Failed",
+ ]
+
+ max_results = self._get_int_param("MaxResults")
+ sort_by = self._get_param("SortBy", "CreationTime")
+ sort_order = self._get_param("SortOrder", "Ascending")
+ status_equals = self._get_param("StatusEquals")
+ next_token = self._get_param("NextToken")
+ errors = []
+ if max_results and max_results not in max_results_range:
+ errors.append(
+ "Value '{0}' at 'maxResults' failed to satisfy constraint: Member must have value less than or equal to {1}".format(
+ max_results, max_results_range[-1]
+ )
+ )
+
+ if sort_by not in allowed_sort_by:
+ errors.append(format_enum_error(sort_by, "sortBy", allowed_sort_by))
+ if sort_order not in allowed_sort_order:
+ errors.append(
+ format_enum_error(sort_order, "sortOrder", allowed_sort_order)
+ )
+
+ if status_equals and status_equals not in allowed_status_equals:
+ errors.append(
+ format_enum_error(status_equals, "statusEquals", allowed_status_equals)
+ )
+
+ if errors != []:
+ raise AWSValidationException(
+ f"{len(errors)} validation errors detected: {';'.join(errors)}"
+ )
+
+ response = self.sagemaker_backend.list_training_jobs(
+ next_token=next_token,
+ max_results=max_results,
+ creation_time_after=self._get_param("CreationTimeAfter"),
+ creation_time_before=self._get_param("CreationTimeBefore"),
+ last_modified_time_after=self._get_param("LastModifiedTimeAfter"),
+ last_modified_time_before=self._get_param("LastModifiedTimeBefore"),
+ name_contains=self._get_param("NameContains"),
+ status_equals=status_equals,
+ )
+ return 200, {}, json.dumps(response)
+
+ def update_endpoint_weights_and_capacities(self):
+ endpoint_name = self._get_param("EndpointName")
+ desired_weights_and_capacities = self._get_param("DesiredWeightsAndCapacities")
+ endpoint_arn = self.sagemaker_backend.update_endpoint_weights_and_capacities(
+ endpoint_name=endpoint_name,
+ desired_weights_and_capacities=desired_weights_and_capacities,
+ )
+ response = {"EndpointArn": endpoint_arn}
+ return 200, {}, json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/sagemaker/urls.py b/contrib/python/moto/py3/moto/sagemaker/urls.py
new file mode 100644
index 0000000000..49bbd73244
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/urls.py
@@ -0,0 +1,9 @@
+from .responses import SageMakerResponse
+
+url_bases = [
+ r"https?://api\.sagemaker\.(.+)\.amazonaws.com",
+]
+
+url_paths = {
+ "{0}/$": SageMakerResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/sagemaker/validators.py b/contrib/python/moto/py3/moto/sagemaker/validators.py
new file mode 100644
index 0000000000..69cbee2a5b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sagemaker/validators.py
@@ -0,0 +1,20 @@
+def is_integer_between(x, mn=None, mx=None, optional=False):
+ if optional and x is None:
+ return True
+ try:
+ if mn is not None and mx is not None:
+ return int(x) >= mn and int(x) < mx
+ elif mn is not None:
+ return int(x) >= mn
+ elif mx is not None:
+ return int(x) < mx
+ else:
+ return True
+ except ValueError:
+ return False
+
+
+def is_one_of(x, choices, optional=False):
+ if optional and x is None:
+ return True
+ return x in choices
diff --git a/contrib/python/moto/py3/moto/sdb/__init__.py b/contrib/python/moto/py3/moto/sdb/__init__.py
new file mode 100644
index 0000000000..3d1cdfd5d6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sdb/__init__.py
@@ -0,0 +1,5 @@
+"""sdb module initialization; sets value for base decorator."""
+from .models import sdb_backends
+from ..core.models import base_decorator
+
+mock_sdb = base_decorator(sdb_backends)
diff --git a/contrib/python/moto/py3/moto/sdb/exceptions.py b/contrib/python/moto/py3/moto/sdb/exceptions.py
new file mode 100644
index 0000000000..ec588d2f37
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sdb/exceptions.py
@@ -0,0 +1,45 @@
+"""Exceptions raised by the sdb service."""
+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 InvalidParameterError(RESTError):
+ code = 400
+
+ def __init__(self, **kwargs):
+ kwargs.setdefault("template", "sdb_error")
+ self.templates["sdb_error"] = SDB_ERROR
+ kwargs["error_type"] = "InvalidParameterValue"
+ super().__init__(**kwargs)
+
+
+class InvalidDomainName(InvalidParameterError):
+ code = 400
+
+ def __init__(self, domain_name):
+ super().__init__(
+ message=f"Value ({domain_name}) for parameter DomainName is invalid. "
+ )
+
+
+class UnknownDomainName(RESTError):
+ code = 400
+
+ def __init__(self, **kwargs):
+ kwargs.setdefault("template", "sdb_error")
+ self.templates["sdb_error"] = SDB_ERROR
+ kwargs["error_type"] = "NoSuchDomain"
+ kwargs["message"] = "The specified domain does not exist."
+ super().__init__(**kwargs)
diff --git a/contrib/python/moto/py3/moto/sdb/models.py b/contrib/python/moto/py3/moto/sdb/models.py
new file mode 100644
index 0000000000..6f1f1cffb9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sdb/models.py
@@ -0,0 +1,96 @@
+"""SimpleDBBackend class with methods for supported APIs."""
+import re
+from collections import defaultdict
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from threading import Lock
+
+from .exceptions import InvalidDomainName, UnknownDomainName
+
+
+class FakeItem(BaseModel):
+ def __init__(self):
+ self.attributes = []
+ self.lock = Lock()
+
+ def get_attributes(self, names):
+ if not names:
+ return self.attributes
+ return [attr for attr in self.attributes if attr["name"] in names]
+
+ def put_attributes(self, attributes):
+ # Replacing attributes involves quite a few loops
+ # Lock this, so we know noone else touches this list while we're operating on it
+ with self.lock:
+ for attr in attributes:
+ if attr.get("replace", "false").lower() == "true":
+ self._remove_attributes(attr["name"])
+ self.attributes.append(attr)
+
+ def _remove_attributes(self, name):
+ self.attributes = [attr for attr in self.attributes if attr["name"] != name]
+
+
+class FakeDomain(BaseModel):
+ def __init__(self, name):
+ self.name = name
+ self.items = defaultdict(FakeItem)
+
+ def get(self, item_name, attribute_names):
+ item = self.items[item_name]
+ return item.get_attributes(attribute_names)
+
+ def put(self, item_name, attributes):
+ item = self.items[item_name]
+ item.put_attributes(attributes)
+
+
+class SimpleDBBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.domains = dict()
+
+ def create_domain(self, domain_name):
+ self._validate_domain_name(domain_name)
+ self.domains[domain_name] = FakeDomain(name=domain_name)
+
+ def list_domains(self):
+ """
+ The `max_number_of_domains` and `next_token` parameter have not been implemented yet - we simply return all domains.
+ """
+ return self.domains.keys()
+
+ def delete_domain(self, domain_name):
+ self._validate_domain_name(domain_name)
+ # Ignore unknown domains - AWS does the same
+ self.domains.pop(domain_name, None)
+
+ def _validate_domain_name(self, domain_name):
+ # Domain Name needs to have at least 3 chars
+ # Can only contain characters: a-z, A-Z, 0-9, '_', '-', and '.'
+ if not re.match("^[a-zA-Z0-9-_.]{3,}$", domain_name):
+ raise InvalidDomainName(domain_name)
+
+ def _get_domain(self, domain_name):
+ if domain_name not in self.domains:
+ raise UnknownDomainName()
+ return self.domains[domain_name]
+
+ def get_attributes(self, domain_name, item_name, attribute_names):
+ """
+ Behaviour for the consistent_read-attribute is not yet implemented
+ """
+ self._validate_domain_name(domain_name)
+ domain = self._get_domain(domain_name)
+ return domain.get(item_name, attribute_names)
+
+ def put_attributes(self, domain_name, item_name, attributes):
+ """
+ Behaviour for the expected-attribute is not yet implemented.
+ """
+ self._validate_domain_name(domain_name)
+ domain = self._get_domain(domain_name)
+ domain.put(item_name, attributes)
+
+
+sdb_backends = BackendDict(SimpleDBBackend, "sdb")
diff --git a/contrib/python/moto/py3/moto/sdb/responses.py b/contrib/python/moto/py3/moto/sdb/responses.py
new file mode 100644
index 0000000000..9b8a5e0441
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sdb/responses.py
@@ -0,0 +1,90 @@
+from moto.core.responses import BaseResponse
+from .models import sdb_backends
+
+
+class SimpleDBResponse(BaseResponse):
+ @property
+ def sdb_backend(self):
+ return sdb_backends[self.region]
+
+ def create_domain(self):
+ 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()
+
+ def delete_domain(self):
+ 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()
+
+ def list_domains(self):
+ domain_names = self.sdb_backend.list_domains()
+ template = self.response_template(LIST_DOMAINS_TEMPLATE)
+ return template.render(domain_names=domain_names, next_token=None)
+
+ def get_attributes(self):
+ domain_name = self._get_param("DomainName")
+ item_name = self._get_param("ItemName")
+ attribute_names = self._get_multi_param("AttributeName.")
+ attributes = self.sdb_backend.get_attributes(
+ domain_name=domain_name,
+ item_name=item_name,
+ attribute_names=attribute_names,
+ )
+ template = self.response_template(GET_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=attributes)
+
+ def put_attributes(self):
+ 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>"""
diff --git a/contrib/python/moto/py3/moto/sdb/urls.py b/contrib/python/moto/py3/moto/sdb/urls.py
new file mode 100644
index 0000000000..f83502bde7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sdb/urls.py
@@ -0,0 +1,7 @@
+from .responses import SimpleDBResponse
+
+url_bases = [
+ r"https?://sdb\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {"{0}/$": SimpleDBResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/secretsmanager/__init__.py b/contrib/python/moto/py3/moto/secretsmanager/__init__.py
new file mode 100644
index 0000000000..0be3a35dd5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/__init__.py
@@ -0,0 +1,5 @@
+from .models import secretsmanager_backends
+from ..core.models import base_decorator
+
+secretsmanager_backend = secretsmanager_backends["us-east-1"]
+mock_secretsmanager = base_decorator(secretsmanager_backends)
diff --git a/contrib/python/moto/py3/moto/secretsmanager/exceptions.py b/contrib/python/moto/py3/moto/secretsmanager/exceptions.py
new file mode 100644
index 0000000000..6506fccfbe
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/exceptions.py
@@ -0,0 +1,55 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class SecretsManagerClientError(JsonRESTError):
+ code = 400
+
+
+class ResourceNotFoundException(SecretsManagerClientError):
+ def __init__(self, message):
+ self.code = 404
+ super().__init__("ResourceNotFoundException", message)
+
+
+class SecretNotFoundException(SecretsManagerClientError):
+ def __init__(self):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException",
+ message="Secrets Manager can't find the specified secret.",
+ )
+
+
+class SecretHasNoValueException(SecretsManagerClientError):
+ def __init__(self, version_stage):
+ self.code = 404
+ super().__init__(
+ "ResourceNotFoundException",
+ message="Secrets Manager can't find the specified secret "
+ "value for staging label: {}".format(version_stage),
+ )
+
+
+class ClientError(SecretsManagerClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class InvalidParameterException(SecretsManagerClientError):
+ def __init__(self, message):
+ super().__init__("InvalidParameterException", message)
+
+
+class ResourceExistsException(SecretsManagerClientError):
+ def __init__(self, message):
+ super().__init__("ResourceExistsException", message)
+
+
+class InvalidRequestException(SecretsManagerClientError):
+ def __init__(self, message):
+ super().__init__("InvalidRequestException", message)
+
+
+class ValidationException(SecretsManagerClientError):
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
diff --git a/contrib/python/moto/py3/moto/secretsmanager/list_secrets/__init__.py b/contrib/python/moto/py3/moto/secretsmanager/list_secrets/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/list_secrets/__init__.py
diff --git a/contrib/python/moto/py3/moto/secretsmanager/list_secrets/filters.py b/contrib/python/moto/py3/moto/secretsmanager/list_secrets/filters.py
new file mode 100644
index 0000000000..d6492ba786
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/list_secrets/filters.py
@@ -0,0 +1,44 @@
+def name(secret, names):
+ return _matcher(names, [secret.name])
+
+
+def description(secret, descriptions):
+ return _matcher(descriptions, [secret.description])
+
+
+def tag_key(secret, tag_keys):
+ return _matcher(tag_keys, [tag["Key"] for tag in secret.tags])
+
+
+def tag_value(secret, tag_values):
+ return _matcher(tag_values, [tag["Value"] for tag in secret.tags])
+
+
+def filter_all(secret, values):
+ attributes = (
+ [secret.name, secret.description]
+ + [tag["Key"] for tag in secret.tags]
+ + [tag["Value"] for tag in secret.tags]
+ )
+
+ return _matcher(values, attributes)
+
+
+def _matcher(patterns, strings):
+ for pattern in [p for p in patterns if p.startswith("!")]:
+ for string in strings:
+ if _match_pattern(pattern[1:], string):
+ return False
+
+ for pattern in [p for p in patterns if not p.startswith("!")]:
+ for string in strings:
+ if _match_pattern(pattern, string):
+ return True
+ return False
+
+
+def _match_pattern(pattern, value):
+ for word in pattern.split(" "):
+ if word not in value:
+ return False
+ return True
diff --git a/contrib/python/moto/py3/moto/secretsmanager/models.py b/contrib/python/moto/py3/moto/secretsmanager/models.py
new file mode 100644
index 0000000000..70e6c1e220
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/models.py
@@ -0,0 +1,816 @@
+import time
+import json
+import uuid
+import datetime
+
+from typing import List, Tuple
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from .exceptions import (
+ SecretNotFoundException,
+ SecretHasNoValueException,
+ InvalidParameterException,
+ ResourceExistsException,
+ ResourceNotFoundException,
+ InvalidRequestException,
+ ClientError,
+)
+from .utils import random_password, secret_arn, get_secret_name_from_arn
+from .list_secrets.filters import filter_all, tag_key, tag_value, description, name
+
+
+_filter_functions = {
+ "all": filter_all,
+ "name": name,
+ "description": description,
+ "tag-key": tag_key,
+ "tag-value": tag_value,
+}
+
+
+def filter_keys():
+ return list(_filter_functions.keys())
+
+
+def _matches(secret, filters):
+ is_match = True
+
+ for f in filters:
+ # Filter names are pre-validated in the resource layer
+ filter_function = _filter_functions.get(f["Key"])
+ is_match = is_match and filter_function(secret, f["Values"])
+
+ return is_match
+
+
+class SecretsManager(BaseModel):
+ def __init__(self, region_name):
+ self.region = region_name
+
+
+class FakeSecret:
+ def __init__(
+ self,
+ region_name,
+ secret_id,
+ secret_string=None,
+ secret_binary=None,
+ description=None,
+ tags=None,
+ kms_key_id=None,
+ version_id=None,
+ version_stages=None,
+ last_changed_date=None,
+ created_date=None,
+ ):
+ self.secret_id = secret_id
+ self.name = secret_id
+ self.arn = secret_arn(region_name, secret_id)
+ self.secret_string = secret_string
+ self.secret_binary = secret_binary
+ self.description = description
+ self.tags = tags or []
+ self.kms_key_id = kms_key_id
+ self.version_id = version_id
+ self.version_stages = version_stages
+ self.last_changed_date = last_changed_date
+ self.created_date = created_date
+ self.rotation_enabled = False
+ self.rotation_lambda_arn = ""
+ self.auto_rotate_after_days = 0
+ self.deleted_date = None
+
+ def update(
+ self, description=None, tags=None, kms_key_id=None, last_changed_date=None
+ ):
+ self.description = description
+ self.tags = tags or []
+ if last_changed_date is not None:
+ self.last_changed_date = last_changed_date
+
+ if kms_key_id is not None:
+ self.kms_key_id = kms_key_id
+
+ def set_versions(self, versions):
+ self.versions = versions
+
+ def set_default_version_id(self, version_id):
+ self.default_version_id = version_id
+
+ def reset_default_version(self, secret_version, version_id):
+ # remove all old AWSPREVIOUS stages
+ for old_version in self.versions.values():
+ if "AWSPREVIOUS" in old_version["version_stages"]:
+ old_version["version_stages"].remove("AWSPREVIOUS")
+
+ # set old AWSCURRENT secret to AWSPREVIOUS
+ previous_current_version_id = self.default_version_id
+ self.versions[previous_current_version_id]["version_stages"] = ["AWSPREVIOUS"]
+
+ self.versions[version_id] = secret_version
+ self.default_version_id = version_id
+
+ def remove_version_stages_from_old_versions(self, version_stages):
+ for version_stage in version_stages:
+ for old_version in self.versions.values():
+ if version_stage in old_version["version_stages"]:
+ old_version["version_stages"].remove(version_stage)
+
+ def delete(self, deleted_date):
+ self.deleted_date = deleted_date
+
+ def restore(self):
+ self.deleted_date = None
+
+ def is_deleted(self):
+ return self.deleted_date is not None
+
+ def to_short_dict(self, include_version_stages=False, version_id=None):
+ if not version_id:
+ version_id = self.default_version_id
+ dct = {
+ "ARN": self.arn,
+ "Name": self.name,
+ "VersionId": version_id,
+ }
+ if include_version_stages:
+ dct["VersionStages"] = self.versions[version_id]["version_stages"]
+ return json.dumps(dct)
+
+ def to_dict(self):
+ version_id_to_stages = self._form_version_ids_to_stages()
+
+ return {
+ "ARN": self.arn,
+ "Name": self.name,
+ "Description": self.description or "",
+ "KmsKeyId": self.kms_key_id,
+ "RotationEnabled": self.rotation_enabled,
+ "RotationLambdaARN": self.rotation_lambda_arn,
+ "RotationRules": {"AutomaticallyAfterDays": self.auto_rotate_after_days},
+ "LastRotatedDate": None,
+ "LastChangedDate": self.last_changed_date,
+ "LastAccessedDate": None,
+ "DeletedDate": self.deleted_date,
+ "Tags": self.tags,
+ "VersionIdsToStages": version_id_to_stages,
+ "SecretVersionsToStages": version_id_to_stages,
+ "CreatedDate": self.created_date,
+ }
+
+ def _form_version_ids_to_stages(self):
+ version_id_to_stages = {}
+ for key, value in self.versions.items():
+ version_id_to_stages[key] = value["version_stages"]
+
+ return version_id_to_stages
+
+
+class SecretsStore(dict):
+ def __setitem__(self, key, value):
+ new_key = get_secret_name_from_arn(key)
+ super().__setitem__(new_key, value)
+
+ def __getitem__(self, key):
+ new_key = get_secret_name_from_arn(key)
+ return super().__getitem__(new_key)
+
+ def __contains__(self, key):
+ new_key = get_secret_name_from_arn(key)
+ return dict.__contains__(self, new_key)
+
+ def get(self, key, *args, **kwargs):
+ new_key = get_secret_name_from_arn(key)
+ return super().get(new_key, *args, **kwargs)
+
+ def pop(self, key, *args, **kwargs):
+ new_key = get_secret_name_from_arn(key)
+ return super().pop(new_key, *args, **kwargs)
+
+
+class SecretsManagerBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.secrets = SecretsStore()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint services."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "secretsmanager"
+ )
+
+ def _is_valid_identifier(self, identifier):
+ return identifier in self.secrets
+
+ def _unix_time_secs(self, dt):
+ epoch = datetime.datetime.utcfromtimestamp(0)
+ return (dt - epoch).total_seconds()
+
+ def _client_request_token_validator(self, client_request_token):
+ token_length = len(client_request_token)
+ if token_length < 32 or token_length > 64:
+ msg = "ClientRequestToken must be 32-64 characters long."
+ raise InvalidParameterException(msg)
+
+ def _from_client_request_token(self, client_request_token):
+ version_id = client_request_token
+ if version_id:
+ self._client_request_token_validator(version_id)
+ else:
+ version_id = str(uuid.uuid4())
+ return version_id
+
+ def get_secret_value(self, secret_id, version_id, version_stage):
+ if not self._is_valid_identifier(secret_id):
+ raise SecretNotFoundException()
+
+ if not version_id and version_stage:
+ # set version_id to match version_stage
+ versions_dict = self.secrets[secret_id].versions
+ for ver_id, ver_val in versions_dict.items():
+ if version_stage in ver_val["version_stages"]:
+ version_id = ver_id
+ break
+ if not version_id:
+ raise SecretNotFoundException()
+
+ # TODO check this part
+ if self.secrets[secret_id].is_deleted():
+ raise InvalidRequestException(
+ "An error occurred (InvalidRequestException) when calling the GetSecretValue operation: You tried to \
+ perform the operation on a secret that's currently marked deleted."
+ )
+
+ secret = self.secrets[secret_id]
+ version_id = version_id or secret.default_version_id
+
+ secret_version = secret.versions.get(version_id)
+ if not secret_version:
+ raise ResourceNotFoundException(
+ "An error occurred (ResourceNotFoundException) when calling the GetSecretValue operation: Secrets "
+ "Manager can't find the specified secret value for VersionId: {}".format(
+ version_id
+ )
+ )
+
+ response_data = {
+ "ARN": secret.arn,
+ "Name": secret.name,
+ "VersionId": secret_version["version_id"],
+ "VersionStages": secret_version["version_stages"],
+ "CreatedDate": secret_version["createdate"],
+ }
+
+ if "secret_string" in secret_version:
+ response_data["SecretString"] = secret_version["secret_string"]
+
+ if "secret_binary" in secret_version:
+ response_data["SecretBinary"] = secret_version["secret_binary"]
+
+ if (
+ "secret_string" not in secret_version
+ and "secret_binary" not in secret_version
+ ):
+ raise SecretHasNoValueException(version_stage or "AWSCURRENT")
+
+ return response_data
+
+ def update_secret(
+ self,
+ secret_id,
+ secret_string=None,
+ secret_binary=None,
+ client_request_token=None,
+ kms_key_id=None,
+ ):
+
+ # error if secret does not exist
+ if secret_id not in self.secrets:
+ raise SecretNotFoundException()
+
+ if self.secrets[secret_id].is_deleted():
+ raise InvalidRequestException(
+ "An error occurred (InvalidRequestException) when calling the UpdateSecret operation: "
+ "You can't perform this operation on the secret because it was marked for deletion."
+ )
+
+ secret = self.secrets[secret_id]
+ tags = secret.tags
+ description = secret.description
+
+ secret = self._add_secret(
+ secret_id,
+ secret_string=secret_string,
+ secret_binary=secret_binary,
+ description=description,
+ version_id=client_request_token,
+ tags=tags,
+ kms_key_id=kms_key_id,
+ )
+
+ return secret.to_short_dict()
+
+ def create_secret(
+ self,
+ name,
+ secret_string=None,
+ secret_binary=None,
+ description=None,
+ tags=None,
+ kms_key_id=None,
+ client_request_token=None,
+ ):
+
+ # error if secret exists
+ if name in self.secrets.keys():
+ raise ResourceExistsException(
+ "A resource with the ID you requested already exists."
+ )
+
+ secret = self._add_secret(
+ name,
+ secret_string=secret_string,
+ secret_binary=secret_binary,
+ description=description,
+ tags=tags,
+ kms_key_id=kms_key_id,
+ version_id=client_request_token,
+ )
+
+ return secret.to_short_dict()
+
+ def _add_secret(
+ self,
+ secret_id,
+ secret_string=None,
+ secret_binary=None,
+ description=None,
+ tags=None,
+ kms_key_id=None,
+ version_id=None,
+ version_stages=None,
+ ):
+
+ if version_stages is None:
+ version_stages = ["AWSCURRENT"]
+
+ version_id = self._from_client_request_token(version_id)
+
+ secret_version = {
+ "createdate": int(time.time()),
+ "version_id": version_id,
+ "version_stages": version_stages,
+ }
+ if secret_string is not None:
+ secret_version["secret_string"] = secret_string
+
+ if secret_binary is not None:
+ secret_version["secret_binary"] = secret_binary
+
+ update_time = int(time.time())
+ if secret_id in self.secrets:
+ secret = self.secrets[secret_id]
+
+ secret.update(description, tags, kms_key_id, last_changed_date=update_time)
+
+ if "AWSCURRENT" in version_stages:
+ secret.reset_default_version(secret_version, version_id)
+ else:
+ secret.remove_version_stages_from_old_versions(version_stages)
+ secret.versions[version_id] = secret_version
+ else:
+ secret = FakeSecret(
+ region_name=self.region_name,
+ secret_id=secret_id,
+ secret_string=secret_string,
+ secret_binary=secret_binary,
+ description=description,
+ tags=tags,
+ kms_key_id=kms_key_id,
+ last_changed_date=update_time,
+ created_date=update_time,
+ )
+ secret.set_versions({version_id: secret_version})
+ secret.set_default_version_id(version_id)
+ self.secrets[secret_id] = secret
+
+ return secret
+
+ def put_secret_value(
+ self,
+ secret_id,
+ secret_string,
+ secret_binary,
+ client_request_token,
+ version_stages,
+ ):
+
+ if not self._is_valid_identifier(secret_id):
+ raise SecretNotFoundException()
+ else:
+ secret = self.secrets[secret_id]
+ tags = secret.tags
+ description = secret.description
+
+ version_id = self._from_client_request_token(client_request_token)
+
+ secret = self._add_secret(
+ secret_id,
+ secret_string,
+ secret_binary,
+ version_id=version_id,
+ description=description,
+ tags=tags,
+ version_stages=version_stages,
+ )
+
+ return secret.to_short_dict(include_version_stages=True, version_id=version_id)
+
+ def describe_secret(self, secret_id):
+ if not self._is_valid_identifier(secret_id):
+ raise SecretNotFoundException()
+
+ secret = self.secrets[secret_id]
+
+ return secret.to_dict()
+
+ def rotate_secret(
+ self,
+ secret_id,
+ client_request_token=None,
+ rotation_lambda_arn=None,
+ rotation_rules=None,
+ ):
+
+ rotation_days = "AutomaticallyAfterDays"
+
+ if not self._is_valid_identifier(secret_id):
+ raise SecretNotFoundException()
+
+ if self.secrets[secret_id].is_deleted():
+ raise InvalidRequestException(
+ "An error occurred (InvalidRequestException) when calling the RotateSecret operation: You tried to \
+ perform the operation on a secret that's currently marked deleted."
+ )
+
+ if rotation_lambda_arn:
+ if len(rotation_lambda_arn) > 2048:
+ msg = "RotationLambdaARN " "must <= 2048 characters long."
+ raise InvalidParameterException(msg)
+
+ if rotation_rules:
+ if rotation_days in rotation_rules:
+ rotation_period = rotation_rules[rotation_days]
+ if rotation_period < 1 or rotation_period > 1000:
+ msg = (
+ "RotationRules.AutomaticallyAfterDays " "must be within 1-1000."
+ )
+ raise InvalidParameterException(msg)
+
+ secret = self.secrets[secret_id]
+
+ # The rotation function must end with the versions of the secret in
+ # one of two states:
+ #
+ # - The AWSPENDING and AWSCURRENT staging labels are attached to the
+ # same version of the secret, or
+ # - The AWSPENDING staging label is not attached to any version of the secret.
+ #
+ # If the AWSPENDING staging label is present but not attached to the same
+ # version as AWSCURRENT then any later invocation of RotateSecret assumes
+ # that a previous rotation request is still in progress and returns an error.
+ try:
+ version = next(
+ version
+ for version in secret.versions.values()
+ if "AWSPENDING" in version["version_stages"]
+ )
+ if "AWSCURRENT" in version["version_stages"]:
+ msg = "Previous rotation request is still in progress."
+ raise InvalidRequestException(msg)
+
+ except StopIteration:
+ # Pending is not present in any version
+ pass
+
+ old_secret_version = secret.versions[secret.default_version_id]
+
+ if client_request_token:
+ self._client_request_token_validator(client_request_token)
+ new_version_id = client_request_token
+ else:
+ new_version_id = str(uuid.uuid4())
+
+ # We add the new secret version as "pending". The previous version remains
+ # as "current" for now. Once we've passed the new secret through the lambda
+ # rotation function (if provided) we can then update the status to "current".
+ self._add_secret(
+ secret_id,
+ old_secret_version["secret_string"],
+ description=secret.description,
+ tags=secret.tags,
+ version_id=new_version_id,
+ version_stages=["AWSPENDING"],
+ )
+ secret.rotation_lambda_arn = rotation_lambda_arn or ""
+ if rotation_rules:
+ secret.auto_rotate_after_days = rotation_rules.get(rotation_days, 0)
+ if secret.auto_rotate_after_days > 0:
+ secret.rotation_enabled = True
+
+ # Begin the rotation process for the given secret by invoking the lambda function.
+ if secret.rotation_lambda_arn:
+ from moto.awslambda.models import lambda_backends
+
+ lambda_backend = lambda_backends[self.region_name]
+
+ request_headers = {}
+ response_headers = {}
+
+ try:
+ func = lambda_backend.get_function(secret.rotation_lambda_arn)
+ except Exception:
+ msg = "Resource not found for ARN '{}'.".format(
+ secret.rotation_lambda_arn
+ )
+ raise ResourceNotFoundException(msg)
+
+ for step in ["create", "set", "test", "finish"]:
+ func.invoke(
+ json.dumps(
+ {
+ "Step": step + "Secret",
+ "SecretId": secret.name,
+ "ClientRequestToken": new_version_id,
+ }
+ ),
+ request_headers,
+ response_headers,
+ )
+
+ secret.set_default_version_id(new_version_id)
+ else:
+ secret.reset_default_version(
+ secret.versions[new_version_id], new_version_id
+ )
+ secret.versions[new_version_id]["version_stages"] = ["AWSCURRENT"]
+
+ return secret.to_short_dict()
+
+ def get_random_password(
+ self,
+ password_length,
+ exclude_characters,
+ exclude_numbers,
+ exclude_punctuation,
+ exclude_uppercase,
+ exclude_lowercase,
+ include_space,
+ require_each_included_type,
+ ):
+ # password size must have value less than or equal to 4096
+ if password_length > 4096:
+ raise ClientError(
+ "ClientError: An error occurred (ValidationException) \
+ when calling the GetRandomPassword operation: 1 validation error detected: Value '{}' at 'passwordLength' \
+ failed to satisfy constraint: Member must have value less than or equal to 4096".format(
+ password_length
+ )
+ )
+ if password_length < 4:
+ raise InvalidParameterException(
+ "InvalidParameterException: An error occurred (InvalidParameterException) \
+ when calling the GetRandomPassword operation: Password length is too short based on the required types."
+ )
+
+ response = json.dumps(
+ {
+ "RandomPassword": random_password(
+ password_length,
+ exclude_characters,
+ exclude_numbers,
+ exclude_punctuation,
+ exclude_uppercase,
+ exclude_lowercase,
+ include_space,
+ require_each_included_type,
+ )
+ }
+ )
+
+ return response
+
+ def list_secret_version_ids(self, secret_id):
+ secret = self.secrets[secret_id]
+
+ version_list = []
+ for version_id, version in secret.versions.items():
+ version_list.append(
+ {
+ "CreatedDate": int(time.time()),
+ "LastAccessedDate": int(time.time()),
+ "VersionId": version_id,
+ "VersionStages": version["version_stages"],
+ }
+ )
+
+ response = json.dumps(
+ {
+ "ARN": secret.secret_id,
+ "Name": secret.name,
+ "NextToken": "",
+ "Versions": version_list,
+ }
+ )
+
+ return response
+
+ def list_secrets(
+ self, filters: List, max_results: int = 100, next_token: str = None
+ ) -> Tuple[List, str]:
+ secret_list = []
+ for secret in self.secrets.values():
+ if _matches(secret, filters):
+ secret_list.append(secret.to_dict())
+
+ starting_point = int(next_token or 0)
+ ending_point = starting_point + int(max_results or 100)
+ secret_page = secret_list[starting_point:ending_point]
+ new_next_token = str(ending_point) if ending_point < len(secret_list) else None
+
+ return secret_page, new_next_token
+
+ def delete_secret(
+ self, secret_id, recovery_window_in_days, force_delete_without_recovery
+ ):
+
+ if recovery_window_in_days and (
+ recovery_window_in_days < 7 or recovery_window_in_days > 30
+ ):
+ raise InvalidParameterException(
+ "An error occurred (InvalidParameterException) when calling the DeleteSecret operation: The \
+ RecoveryWindowInDays value must be between 7 and 30 days (inclusive)."
+ )
+
+ if recovery_window_in_days and force_delete_without_recovery:
+ raise InvalidParameterException(
+ "An error occurred (InvalidParameterException) when calling the DeleteSecret operation: You can't \
+ use ForceDeleteWithoutRecovery in conjunction with RecoveryWindowInDays."
+ )
+
+ if not self._is_valid_identifier(secret_id):
+ if not force_delete_without_recovery:
+ raise SecretNotFoundException()
+ else:
+ secret = FakeSecret(self.region_name, secret_id)
+ arn = secret.arn
+ name = secret.name
+ deletion_date = datetime.datetime.utcnow()
+ return arn, name, self._unix_time_secs(deletion_date)
+ else:
+ if self.secrets[secret_id].is_deleted():
+ raise InvalidRequestException(
+ "An error occurred (InvalidRequestException) when calling the DeleteSecret operation: You tried to \
+ perform the operation on a secret that's currently marked deleted."
+ )
+
+ deletion_date = datetime.datetime.utcnow()
+
+ if force_delete_without_recovery:
+ secret = self.secrets.pop(secret_id, None)
+ else:
+ deletion_date += datetime.timedelta(days=recovery_window_in_days or 30)
+ self.secrets[secret_id].delete(self._unix_time_secs(deletion_date))
+ secret = self.secrets.get(secret_id, None)
+
+ if not secret:
+ raise SecretNotFoundException()
+
+ arn = secret.arn
+ name = secret.name
+
+ return arn, name, self._unix_time_secs(deletion_date)
+
+ def restore_secret(self, secret_id):
+
+ if not self._is_valid_identifier(secret_id):
+ raise SecretNotFoundException()
+
+ secret = self.secrets[secret_id]
+ secret.restore()
+
+ return secret.arn, secret.name
+
+ def tag_resource(self, secret_id, tags):
+
+ if secret_id not in self.secrets:
+ raise SecretNotFoundException()
+
+ secret = self.secrets[secret_id]
+ old_tags = secret.tags
+
+ for tag in tags:
+ existing_key_name = next(
+ (
+ old_key
+ for old_key in old_tags
+ if old_key.get("Key") == tag.get("Key")
+ ),
+ None,
+ )
+ if existing_key_name:
+ old_tags.remove(existing_key_name)
+ old_tags.append(tag)
+
+ return secret_id
+
+ def untag_resource(self, secret_id, tag_keys):
+
+ if secret_id not in self.secrets:
+ raise SecretNotFoundException()
+
+ secret = self.secrets[secret_id]
+ tags = secret.tags
+
+ for tag in tags:
+ if tag["Key"] in tag_keys:
+ tags.remove(tag)
+
+ return secret_id
+
+ def update_secret_version_stage(
+ self, secret_id, version_stage, remove_from_version_id, move_to_version_id
+ ):
+ if secret_id not in self.secrets:
+ raise SecretNotFoundException()
+
+ secret = self.secrets[secret_id]
+
+ if remove_from_version_id:
+ if remove_from_version_id not in secret.versions:
+ raise InvalidParameterException(
+ "Not a valid version: %s" % remove_from_version_id
+ )
+
+ stages = secret.versions[remove_from_version_id]["version_stages"]
+ if version_stage not in stages:
+ raise InvalidParameterException(
+ "Version stage %s not found in version %s"
+ % (version_stage, remove_from_version_id)
+ )
+
+ stages.remove(version_stage)
+
+ if move_to_version_id:
+ if move_to_version_id not in secret.versions:
+ raise InvalidParameterException(
+ "Not a valid version: %s" % move_to_version_id
+ )
+
+ stages = secret.versions[move_to_version_id]["version_stages"]
+ stages.append(version_stage)
+
+ if version_stage == "AWSCURRENT":
+ if remove_from_version_id:
+ # Whenever you move AWSCURRENT, Secrets Manager automatically
+ # moves the label AWSPREVIOUS to the version that AWSCURRENT
+ # was removed from.
+ secret.versions[remove_from_version_id]["version_stages"].append(
+ "AWSPREVIOUS"
+ )
+
+ if move_to_version_id:
+ stages = secret.versions[move_to_version_id]["version_stages"]
+ if "AWSPREVIOUS" in stages:
+ stages.remove("AWSPREVIOUS")
+
+ return secret_id
+
+ @staticmethod
+ def get_resource_policy(secret_id):
+ resource_policy = {
+ "Version": "2012-10-17",
+ "Statement": {
+ "Effect": "Allow",
+ "Principal": {
+ "AWS": [
+ "arn:aws:iam::111122223333:root",
+ "arn:aws:iam::444455556666:root",
+ ]
+ },
+ "Action": ["secretsmanager:GetSecretValue"],
+ "Resource": "*",
+ },
+ }
+ return json.dumps(
+ {
+ "ARN": secret_id,
+ "Name": secret_id,
+ "ResourcePolicy": json.dumps(resource_policy),
+ }
+ )
+
+
+secretsmanager_backends = BackendDict(SecretsManagerBackend, "secretsmanager")
diff --git a/contrib/python/moto/py3/moto/secretsmanager/responses.py b/contrib/python/moto/py3/moto/secretsmanager/responses.py
new file mode 100644
index 0000000000..959f3339f0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/responses.py
@@ -0,0 +1,192 @@
+from moto.core.responses import BaseResponse
+from moto.secretsmanager.exceptions import (
+ InvalidRequestException,
+ InvalidParameterException,
+ ValidationException,
+)
+
+from .models import secretsmanager_backends, filter_keys
+
+import json
+
+
+def _validate_filters(filters):
+ for idx, f in enumerate(filters):
+ filter_key = f.get("Key", None)
+ filter_values = f.get("Values", None)
+ if filter_key is None:
+ raise InvalidParameterException("Invalid filter key")
+ if filter_key not in filter_keys():
+ raise ValidationException(
+ "1 validation error detected: Value '{}' at 'filters.{}.member.key' failed to satisfy constraint: "
+ "Member must satisfy enum value set: [all, name, tag-key, description, tag-value]".format(
+ filter_key, idx + 1
+ )
+ )
+ if filter_values is None:
+ raise InvalidParameterException(
+ "Invalid filter values for key: {}".format(filter_key)
+ )
+
+
+class SecretsManagerResponse(BaseResponse):
+ @property
+ def backend(self):
+ return secretsmanager_backends[self.region]
+
+ def get_secret_value(self):
+ secret_id = self._get_param("SecretId")
+ version_id = self._get_param("VersionId")
+ version_stage = self._get_param("VersionStage")
+ value = self.backend.get_secret_value(
+ secret_id=secret_id, version_id=version_id, version_stage=version_stage
+ )
+ return json.dumps(value)
+
+ def create_secret(self):
+ name = self._get_param("Name")
+ secret_string = self._get_param("SecretString")
+ secret_binary = self._get_param("SecretBinary")
+ description = self._get_param("Description", if_none="")
+ tags = self._get_param("Tags", if_none=[])
+ kms_key_id = self._get_param("KmsKeyId", if_none=None)
+ client_request_token = self._get_param("ClientRequestToken", if_none=None)
+ return self.backend.create_secret(
+ name=name,
+ secret_string=secret_string,
+ secret_binary=secret_binary,
+ description=description,
+ tags=tags,
+ kms_key_id=kms_key_id,
+ client_request_token=client_request_token,
+ )
+
+ def update_secret(self):
+ secret_id = self._get_param("SecretId")
+ secret_string = self._get_param("SecretString")
+ secret_binary = self._get_param("SecretBinary")
+ client_request_token = self._get_param("ClientRequestToken")
+ kms_key_id = self._get_param("KmsKeyId", if_none=None)
+ return self.backend.update_secret(
+ secret_id=secret_id,
+ secret_string=secret_string,
+ secret_binary=secret_binary,
+ client_request_token=client_request_token,
+ kms_key_id=kms_key_id,
+ )
+
+ def get_random_password(self):
+ password_length = self._get_param("PasswordLength", if_none=32)
+ exclude_characters = self._get_param("ExcludeCharacters", if_none="")
+ exclude_numbers = self._get_param("ExcludeNumbers", if_none=False)
+ exclude_punctuation = self._get_param("ExcludePunctuation", if_none=False)
+ exclude_uppercase = self._get_param("ExcludeUppercase", if_none=False)
+ exclude_lowercase = self._get_param("ExcludeLowercase", if_none=False)
+ include_space = self._get_param("IncludeSpace", if_none=False)
+ require_each_included_type = self._get_param(
+ "RequireEachIncludedType", if_none=True
+ )
+ return self.backend.get_random_password(
+ password_length=password_length,
+ exclude_characters=exclude_characters,
+ exclude_numbers=exclude_numbers,
+ exclude_punctuation=exclude_punctuation,
+ exclude_uppercase=exclude_uppercase,
+ exclude_lowercase=exclude_lowercase,
+ include_space=include_space,
+ require_each_included_type=require_each_included_type,
+ )
+
+ def describe_secret(self):
+ secret_id = self._get_param("SecretId")
+ secret = self.backend.describe_secret(secret_id=secret_id)
+ return json.dumps(secret)
+
+ def rotate_secret(self):
+ client_request_token = self._get_param("ClientRequestToken")
+ rotation_lambda_arn = self._get_param("RotationLambdaARN")
+ rotation_rules = self._get_param("RotationRules")
+ secret_id = self._get_param("SecretId")
+ return self.backend.rotate_secret(
+ secret_id=secret_id,
+ client_request_token=client_request_token,
+ rotation_lambda_arn=rotation_lambda_arn,
+ rotation_rules=rotation_rules,
+ )
+
+ def put_secret_value(self):
+ secret_id = self._get_param("SecretId", if_none="")
+ secret_string = self._get_param("SecretString")
+ secret_binary = self._get_param("SecretBinary")
+ client_request_token = self._get_param("ClientRequestToken")
+ if not secret_binary and not secret_string:
+ raise InvalidRequestException(
+ "You must provide either SecretString or SecretBinary."
+ )
+ version_stages = self._get_param("VersionStages", if_none=["AWSCURRENT"])
+ if not isinstance(version_stages, list):
+ version_stages = [version_stages]
+
+ return self.backend.put_secret_value(
+ secret_id=secret_id,
+ secret_binary=secret_binary,
+ secret_string=secret_string,
+ version_stages=version_stages,
+ client_request_token=client_request_token,
+ )
+
+ def list_secret_version_ids(self):
+ secret_id = self._get_param("SecretId", if_none="")
+ return self.backend.list_secret_version_ids(secret_id=secret_id)
+
+ def list_secrets(self):
+ filters = self._get_param("Filters", if_none=[])
+ _validate_filters(filters)
+ max_results = self._get_int_param("MaxResults")
+ next_token = self._get_param("NextToken")
+ secret_list, next_token = self.backend.list_secrets(
+ filters=filters, max_results=max_results, next_token=next_token
+ )
+ return json.dumps(dict(SecretList=secret_list, NextToken=next_token))
+
+ def delete_secret(self):
+ secret_id = self._get_param("SecretId")
+ recovery_window_in_days = self._get_param("RecoveryWindowInDays")
+ force_delete_without_recovery = self._get_param("ForceDeleteWithoutRecovery")
+ arn, name, deletion_date = self.backend.delete_secret(
+ secret_id=secret_id,
+ recovery_window_in_days=recovery_window_in_days,
+ force_delete_without_recovery=force_delete_without_recovery,
+ )
+ return json.dumps(dict(ARN=arn, Name=name, DeletionDate=deletion_date))
+
+ def restore_secret(self):
+ secret_id = self._get_param("SecretId")
+ arn, name = self.backend.restore_secret(secret_id=secret_id)
+ return json.dumps(dict(ARN=arn, Name=name))
+
+ def get_resource_policy(self):
+ secret_id = self._get_param("SecretId")
+ return self.backend.get_resource_policy(secret_id=secret_id)
+
+ def tag_resource(self):
+ secret_id = self._get_param("SecretId")
+ tags = self._get_param("Tags", if_none=[])
+ return self.backend.tag_resource(secret_id, tags)
+
+ def untag_resource(self):
+ secret_id = self._get_param("SecretId")
+ tag_keys = self._get_param("TagKeys", if_none=[])
+ return self.backend.untag_resource(secret_id=secret_id, tag_keys=tag_keys)
+
+ def update_secret_version_stage(self):
+ secret_id = self._get_param("SecretId")
+ version_stage = self._get_param("VersionStage")
+ remove_from_version_id = self._get_param("RemoveFromVersionId")
+ move_to_version_id = self._get_param("MoveToVersionId")
+ return self.backend.update_secret_version_stage(
+ secret_id=secret_id,
+ version_stage=version_stage,
+ remove_from_version_id=remove_from_version_id,
+ move_to_version_id=move_to_version_id,
+ )
diff --git a/contrib/python/moto/py3/moto/secretsmanager/urls.py b/contrib/python/moto/py3/moto/secretsmanager/urls.py
new file mode 100644
index 0000000000..218588f6dc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/urls.py
@@ -0,0 +1,5 @@
+from .responses import SecretsManagerResponse
+
+url_bases = [r"https?://secretsmanager\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": SecretsManagerResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/secretsmanager/utils.py b/contrib/python/moto/py3/moto/secretsmanager/utils.py
new file mode 100644
index 0000000000..24d1a85499
--- /dev/null
+++ b/contrib/python/moto/py3/moto/secretsmanager/utils.py
@@ -0,0 +1,99 @@
+import random
+import string
+import re
+
+from moto.core import get_account_id
+
+
+def random_password(
+ password_length,
+ exclude_characters,
+ exclude_numbers,
+ exclude_punctuation,
+ exclude_uppercase,
+ exclude_lowercase,
+ include_space,
+ require_each_included_type,
+):
+
+ password = ""
+ required_characters = ""
+
+ if not exclude_lowercase and not exclude_uppercase:
+ password += string.ascii_letters
+ required_characters += random.choice(
+ _exclude_characters(string.ascii_lowercase, exclude_characters)
+ )
+ required_characters += random.choice(
+ _exclude_characters(string.ascii_uppercase, exclude_characters)
+ )
+ elif not exclude_lowercase:
+ password += string.ascii_lowercase
+ required_characters += random.choice(
+ _exclude_characters(string.ascii_lowercase, exclude_characters)
+ )
+ elif not exclude_uppercase:
+ password += string.ascii_uppercase
+ required_characters += random.choice(
+ _exclude_characters(string.ascii_uppercase, exclude_characters)
+ )
+ if not exclude_numbers:
+ password += string.digits
+ required_characters += random.choice(
+ _exclude_characters(string.digits, exclude_characters)
+ )
+ if not exclude_punctuation:
+ password += string.punctuation
+ required_characters += random.choice(
+ _exclude_characters(string.punctuation, exclude_characters)
+ )
+ if include_space:
+ password += " "
+ required_characters += " "
+ if exclude_characters:
+ password = _exclude_characters(password, exclude_characters)
+
+ password = "".join(str(random.choice(password)) for x in range(password_length))
+
+ if require_each_included_type:
+ password = _add_password_require_each_included_type(
+ password, required_characters
+ )
+
+ return password
+
+
+def secret_arn(region, secret_id):
+ id_string = "".join(random.choice(string.ascii_letters) for _ in range(5))
+ return "arn:aws:secretsmanager:{0}:{1}:secret:{2}-{3}".format(
+ region, get_account_id(), secret_id, id_string
+ )
+
+
+def get_secret_name_from_arn(secret_id):
+ # can fetch by both arn and by name
+ # but we are storing via name
+ # so we need to change the arn to name
+ # if it starts with arn then the secret id is arn
+ if secret_id.startswith("arn:aws:secretsmanager:"):
+ # split the arn by colon
+ # then get the last value which is the name appended with a random string
+ # then remove the random string
+ secret_id = "-".join(secret_id.split(":")[-1].split("-")[:-1])
+ return secret_id
+
+
+def _exclude_characters(password, exclude_characters):
+ for c in exclude_characters:
+ if c in string.punctuation:
+ # Escape punctuation regex usage
+ c = r"\{0}".format(c)
+ password = re.sub(c, "", str(password))
+ return password
+
+
+def _add_password_require_each_included_type(password, required_characters):
+ password_with_required_char = password[: -len(required_characters)]
+ password_with_required_char += required_characters
+
+ return password_with_required_char
diff --git a/contrib/python/moto/py3/moto/server.py b/contrib/python/moto/py3/moto/server.py
new file mode 100644
index 0000000000..8d1570505b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/server.py
@@ -0,0 +1,94 @@
+import argparse
+import os
+import signal
+import sys
+from werkzeug.serving import run_simple
+
+from moto.moto_server.werkzeug_app import (
+ DomainDispatcherApplication,
+ create_backend_app,
+)
+from moto.moto_server.threaded_moto_server import ( # noqa # pylint: disable=unused-import
+ ThreadedMotoServer,
+)
+
+
+def signal_handler(signum, frame): # pylint: disable=unused-argument
+ sys.exit(0)
+
+
+def main(argv=None):
+ argv = argv or sys.argv[1:]
+ parser = argparse.ArgumentParser()
+
+ # Keep this for backwards compat
+ parser.add_argument(
+ "service",
+ type=str,
+ nargs="?", # http://stackoverflow.com/a/4480202/731592
+ default=os.environ.get("MOTO_SERVICE"),
+ )
+ parser.add_argument(
+ "-H", "--host", type=str, help="Which host to bind", default="127.0.0.1"
+ )
+ parser.add_argument(
+ "-p",
+ "--port",
+ type=int,
+ help="Port number to use for connection",
+ default=int(os.environ.get("MOTO_PORT", 5000)),
+ )
+ parser.add_argument(
+ "-r",
+ "--reload",
+ action="store_true",
+ help="Reload server on a file change",
+ default=False,
+ )
+ parser.add_argument(
+ "-s",
+ "--ssl",
+ action="store_true",
+ help="Enable SSL encrypted connection with auto-generated certificate (use https://... URL)",
+ default=False,
+ )
+ parser.add_argument(
+ "-c", "--ssl-cert", type=str, help="Path to SSL certificate", default=None
+ )
+ parser.add_argument(
+ "-k", "--ssl-key", type=str, help="Path to SSL private key", default=None
+ )
+
+ args = parser.parse_args(argv)
+
+ if "MOTO_PORT" not in os.environ:
+ os.environ["MOTO_PORT"] = f"{args.port}"
+
+ try:
+ signal.signal(signal.SIGINT, signal_handler)
+ signal.signal(signal.SIGTERM, signal_handler)
+ except Exception:
+ pass # ignore "ValueError: signal only works in main thread"
+
+ # Wrap the main application
+ main_app = DomainDispatcherApplication(create_backend_app, service=args.service)
+ main_app.debug = True
+
+ ssl_context = None
+ if args.ssl_key and args.ssl_cert:
+ ssl_context = (args.ssl_cert, args.ssl_key)
+ elif args.ssl:
+ ssl_context = "adhoc"
+
+ run_simple(
+ args.host,
+ args.port,
+ main_app,
+ threaded=True,
+ use_reloader=args.reload,
+ ssl_context=ssl_context,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/contrib/python/moto/py3/moto/servicediscovery/__init__.py b/contrib/python/moto/py3/moto/servicediscovery/__init__.py
new file mode 100644
index 0000000000..983db1ab4d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/servicediscovery/__init__.py
@@ -0,0 +1,5 @@
+"""servicediscovery module initialization; sets value for base decorator."""
+from .models import servicediscovery_backends
+from ..core.models import base_decorator
+
+mock_servicediscovery = base_decorator(servicediscovery_backends)
diff --git a/contrib/python/moto/py3/moto/servicediscovery/exceptions.py b/contrib/python/moto/py3/moto/servicediscovery/exceptions.py
new file mode 100644
index 0000000000..f816fcc2c8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/servicediscovery/exceptions.py
@@ -0,0 +1,22 @@
+"""Exceptions raised by the servicediscovery service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class OperationNotFound(JsonRESTError):
+ def __init__(self):
+ super().__init__("OperationNotFound", "")
+
+
+class NamespaceNotFound(JsonRESTError):
+ def __init__(self, ns_id):
+ super().__init__("NamespaceNotFound", f"{ns_id}")
+
+
+class ServiceNotFound(JsonRESTError):
+ def __init__(self, ns_id):
+ super().__init__("ServiceNotFound", f"{ns_id}")
+
+
+class ConflictingDomainExists(JsonRESTError):
+ def __init__(self, vpc_id):
+ super().__init__("ConflictingDomainExists", f"{vpc_id}")
diff --git a/contrib/python/moto/py3/moto/servicediscovery/models.py b/contrib/python/moto/py3/moto/servicediscovery/models.py
new file mode 100644
index 0000000000..d1bcd86551
--- /dev/null
+++ b/contrib/python/moto/py3/moto/servicediscovery/models.py
@@ -0,0 +1,328 @@
+import random
+import string
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from moto.utilities.tagging_service import TaggingService
+
+from .exceptions import (
+ ConflictingDomainExists,
+ NamespaceNotFound,
+ OperationNotFound,
+ ServiceNotFound,
+)
+
+
+def random_id(size):
+ return "".join(
+ [random.choice(string.ascii_lowercase + string.digits) for _ in range(size)]
+ )
+
+
+class Namespace(BaseModel):
+ def __init__(
+ self,
+ region,
+ name,
+ ns_type,
+ creator_request_id,
+ description,
+ dns_properties,
+ http_properties,
+ vpc=None,
+ ):
+ super().__init__()
+ self.id = f"ns-{random_id(20)}"
+ self.arn = (
+ f"arn:aws:servicediscovery:{region}:{get_account_id()}:namespace/{self.id}"
+ )
+ self.name = name
+ self.type = ns_type
+ self.creator_request_id = creator_request_id
+ self.description = description
+ self.dns_properties = dns_properties
+ self.http_properties = http_properties
+ self.vpc = vpc
+ self.created = unix_time()
+ self.updated = unix_time()
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "Id": self.id,
+ "Name": self.name,
+ "Description": self.description,
+ "Type": self.type,
+ "Properties": {
+ "DnsProperties": self.dns_properties,
+ "HttpProperties": self.http_properties,
+ },
+ "CreateDate": self.created,
+ "UpdateDate": self.updated,
+ "CreatorRequestId": self.creator_request_id,
+ }
+
+
+class Service(BaseModel):
+ def __init__(
+ self,
+ region,
+ name,
+ namespace_id,
+ description,
+ creator_request_id,
+ dns_config,
+ health_check_config,
+ health_check_custom_config,
+ service_type,
+ ):
+ super().__init__()
+ self.id = f"srv-{random_id(8)}"
+ self.arn = (
+ f"arn:aws:servicediscovery:{region}:{get_account_id()}:service/{self.id}"
+ )
+ self.name = name
+ self.namespace_id = namespace_id
+ self.description = description
+ self.creator_request_id = creator_request_id
+ self.dns_config = dns_config
+ self.health_check_config = health_check_config
+ self.health_check_custom_config = health_check_custom_config
+ self.service_type = service_type
+ self.created = unix_time()
+
+ def update(self, details):
+ if "Description" in details:
+ self.description = details["Description"]
+ if "DnsConfig" in details:
+ if self.dns_config is None:
+ self.dns_config = {}
+ self.dns_config["DnsRecords"] = details["DnsConfig"]["DnsRecords"]
+ else:
+ # From the docs:
+ # If you omit any existing DnsRecords or HealthCheckConfig configurations from an UpdateService request,
+ # the configurations are deleted from the service.
+ self.dns_config = None
+ if "HealthCheckConfig" in details:
+ self.health_check_config = details["HealthCheckConfig"]
+
+ def to_json(self):
+ return {
+ "Arn": self.arn,
+ "Id": self.id,
+ "Name": self.name,
+ "NamespaceId": self.namespace_id,
+ "CreateDate": self.created,
+ "Description": self.description,
+ "CreatorRequestId": self.creator_request_id,
+ "DnsConfig": self.dns_config,
+ "HealthCheckConfig": self.health_check_config,
+ "HealthCheckCustomConfig": self.health_check_custom_config,
+ "Type": self.service_type,
+ }
+
+
+class Operation(BaseModel):
+ def __init__(self, operation_type, targets):
+ super().__init__()
+ self.id = f"{random_id(32)}-{random_id(8)}"
+ self.status = "SUCCESS"
+ self.operation_type = operation_type
+ self.created = unix_time()
+ self.updated = unix_time()
+ self.targets = targets
+
+ def to_json(self, short=False):
+ if short:
+ return {"Id": self.id, "Status": self.status}
+ else:
+ return {
+ "Id": self.id,
+ "Status": self.status,
+ "Type": self.operation_type,
+ "CreateDate": self.created,
+ "UpdateDate": self.updated,
+ "Targets": self.targets,
+ }
+
+
+class ServiceDiscoveryBackend(BaseBackend):
+ """Implementation of ServiceDiscovery APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.operations = dict()
+ self.namespaces = dict()
+ self.services = dict()
+ self.tagger = TaggingService()
+
+ def list_namespaces(self):
+ """
+ Pagination or the Filters-parameter is not yet implemented
+ """
+ return self.namespaces.values()
+
+ def create_http_namespace(self, name, creator_request_id, description, tags):
+ namespace = Namespace(
+ region=self.region_name,
+ name=name,
+ ns_type="HTTP",
+ creator_request_id=creator_request_id,
+ description=description,
+ dns_properties={"SOA": {}},
+ http_properties={"HttpName": name},
+ )
+ self.namespaces[namespace.id] = namespace
+ if tags:
+ self.tagger.tag_resource(namespace.arn, tags)
+ operation_id = self._create_operation(
+ "CREATE_NAMESPACE", targets={"NAMESPACE": namespace.id}
+ )
+ return operation_id
+
+ def _create_operation(self, op_type, targets):
+ operation = Operation(operation_type=op_type, targets=targets)
+ self.operations[operation.id] = operation
+ operation_id = operation.id
+ return operation_id
+
+ def delete_namespace(self, namespace_id):
+ if namespace_id not in self.namespaces:
+ raise NamespaceNotFound(namespace_id)
+ del self.namespaces[namespace_id]
+ operation_id = self._create_operation(
+ op_type="DELETE_NAMESPACE", targets={"NAMESPACE": namespace_id}
+ )
+ return operation_id
+
+ def get_namespace(self, namespace_id):
+ if namespace_id not in self.namespaces:
+ raise NamespaceNotFound(namespace_id)
+ return self.namespaces[namespace_id]
+
+ def list_operations(self):
+ """
+ Pagination or the Filters-argument is not yet implemented
+ """
+ # Operations for namespaces will only be listed as long as namespaces exist
+ self.operations = {
+ op_id: op
+ for op_id, op in self.operations.items()
+ if op.targets.get("NAMESPACE") in self.namespaces
+ }
+ return self.operations.values()
+
+ def get_operation(self, operation_id):
+ if operation_id not in self.operations:
+ raise OperationNotFound()
+ return self.operations[operation_id]
+
+ def tag_resource(self, resource_arn, tags):
+ self.tagger.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+ def list_tags_for_resource(self, resource_arn):
+ return self.tagger.list_tags_for_resource(resource_arn)
+
+ def create_private_dns_namespace(
+ self, name, creator_request_id, description, vpc, tags, properties
+ ):
+ for namespace in self.namespaces.values():
+ if namespace.vpc == vpc:
+ raise ConflictingDomainExists(vpc)
+ dns_properties = (properties or {}).get("DnsProperties", {})
+ dns_properties["HostedZoneId"] = "hzi"
+ namespace = Namespace(
+ region=self.region_name,
+ name=name,
+ ns_type="DNS_PRIVATE",
+ creator_request_id=creator_request_id,
+ description=description,
+ dns_properties=dns_properties,
+ http_properties={},
+ vpc=vpc,
+ )
+ self.namespaces[namespace.id] = namespace
+ if tags:
+ self.tagger.tag_resource(namespace.arn, tags)
+ operation_id = self._create_operation(
+ "CREATE_NAMESPACE", targets={"NAMESPACE": namespace.id}
+ )
+ return operation_id
+
+ def create_public_dns_namespace(
+ self, name, creator_request_id, description, tags, properties
+ ):
+ dns_properties = (properties or {}).get("DnsProperties", {})
+ dns_properties["HostedZoneId"] = "hzi"
+ namespace = Namespace(
+ region=self.region_name,
+ name=name,
+ ns_type="DNS_PUBLIC",
+ creator_request_id=creator_request_id,
+ description=description,
+ dns_properties=dns_properties,
+ http_properties={},
+ )
+ self.namespaces[namespace.id] = namespace
+ if tags:
+ self.tagger.tag_resource(namespace.arn, tags)
+ operation_id = self._create_operation(
+ "CREATE_NAMESPACE", targets={"NAMESPACE": namespace.id}
+ )
+ return operation_id
+
+ def create_service(
+ self,
+ name,
+ namespace_id,
+ creator_request_id,
+ description,
+ dns_config,
+ health_check_config,
+ health_check_custom_config,
+ tags,
+ service_type,
+ ):
+ service = Service(
+ region=self.region_name,
+ name=name,
+ namespace_id=namespace_id,
+ description=description,
+ creator_request_id=creator_request_id,
+ dns_config=dns_config,
+ health_check_config=health_check_config,
+ health_check_custom_config=health_check_custom_config,
+ service_type=service_type,
+ )
+ self.services[service.id] = service
+ if tags:
+ self.tagger.tag_resource(service.arn, tags)
+ return service
+
+ def get_service(self, service_id):
+ if service_id not in self.services:
+ raise ServiceNotFound(service_id)
+ return self.services[service_id]
+
+ def delete_service(self, service_id):
+ self.services.pop(service_id, None)
+
+ def list_services(self):
+ """
+ Pagination or the Filters-argument is not yet implemented
+ """
+ return self.services.values()
+
+ def update_service(self, service_id, details):
+ service = self.get_service(service_id)
+ service.update(details=details)
+ operation_id = self._create_operation(
+ "UPDATE_SERVICE", targets={"SERVICE": service.id}
+ )
+ return operation_id
+
+
+servicediscovery_backends = BackendDict(ServiceDiscoveryBackend, "servicediscovery")
diff --git a/contrib/python/moto/py3/moto/servicediscovery/responses.py b/contrib/python/moto/py3/moto/servicediscovery/responses.py
new file mode 100644
index 0000000000..1633d401da
--- /dev/null
+++ b/contrib/python/moto/py3/moto/servicediscovery/responses.py
@@ -0,0 +1,169 @@
+"""Handles incoming servicediscovery requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import servicediscovery_backends
+
+
+class ServiceDiscoveryResponse(BaseResponse):
+ @property
+ def servicediscovery_backend(self):
+ """Return backend instance specific for this region."""
+ return servicediscovery_backends[self.region]
+
+ def list_namespaces(self):
+ namespaces = self.servicediscovery_backend.list_namespaces()
+ return 200, {}, json.dumps({"Namespaces": [ns.to_json() for ns in namespaces]})
+
+ def create_http_namespace(self):
+ params = json.loads(self.body)
+ name = params.get("Name")
+ creator_request_id = params.get("CreatorRequestId")
+ description = params.get("Description")
+ tags = params.get("Tags")
+ operation_id = self.servicediscovery_backend.create_http_namespace(
+ name=name,
+ creator_request_id=creator_request_id,
+ description=description,
+ tags=tags,
+ )
+ return json.dumps(dict(OperationId=operation_id))
+
+ def delete_namespace(self):
+ params = json.loads(self.body)
+ namespace_id = params.get("Id")
+ operation_id = self.servicediscovery_backend.delete_namespace(
+ namespace_id=namespace_id
+ )
+ return json.dumps(dict(OperationId=operation_id))
+
+ def list_operations(self):
+ operations = self.servicediscovery_backend.list_operations()
+ return (
+ 200,
+ {},
+ json.dumps({"Operations": [o.to_json(short=True) for o in operations]}),
+ )
+
+ def get_operation(self):
+ params = json.loads(self.body)
+ operation_id = params.get("OperationId")
+ operation = self.servicediscovery_backend.get_operation(
+ operation_id=operation_id
+ )
+ return json.dumps(dict(Operation=operation.to_json()))
+
+ def get_namespace(self):
+ params = json.loads(self.body)
+ namespace_id = params.get("Id")
+ namespace = self.servicediscovery_backend.get_namespace(
+ namespace_id=namespace_id
+ )
+ return json.dumps(dict(Namespace=namespace.to_json()))
+
+ def tag_resource(self):
+ params = json.loads(self.body)
+ resource_arn = params.get("ResourceARN")
+ tags = params.get("Tags")
+ self.servicediscovery_backend.tag_resource(resource_arn=resource_arn, tags=tags)
+ return json.dumps(dict())
+
+ def untag_resource(self):
+ params = json.loads(self.body)
+ resource_arn = params.get("ResourceARN")
+ tag_keys = params.get("TagKeys")
+ self.servicediscovery_backend.untag_resource(
+ resource_arn=resource_arn, tag_keys=tag_keys
+ )
+ return json.dumps(dict())
+
+ def list_tags_for_resource(self):
+ params = json.loads(self.body)
+ resource_arn = params.get("ResourceARN")
+ tags = self.servicediscovery_backend.list_tags_for_resource(
+ resource_arn=resource_arn
+ )
+ return 200, {}, json.dumps(tags)
+
+ def create_private_dns_namespace(self):
+ params = json.loads(self.body)
+ name = params.get("Name")
+ creator_request_id = params.get("CreatorRequestId")
+ description = params.get("Description")
+ vpc = params.get("Vpc")
+ tags = params.get("Tags")
+ properties = params.get("Properties")
+ operation_id = self.servicediscovery_backend.create_private_dns_namespace(
+ name=name,
+ creator_request_id=creator_request_id,
+ description=description,
+ vpc=vpc,
+ tags=tags,
+ properties=properties,
+ )
+ return json.dumps(dict(OperationId=operation_id))
+
+ def create_public_dns_namespace(self):
+ params = json.loads(self.body)
+ name = params.get("Name")
+ creator_request_id = params.get("CreatorRequestId")
+ description = params.get("Description")
+ tags = params.get("Tags")
+ properties = params.get("Properties")
+ operation_id = self.servicediscovery_backend.create_public_dns_namespace(
+ name=name,
+ creator_request_id=creator_request_id,
+ description=description,
+ tags=tags,
+ properties=properties,
+ )
+ return json.dumps(dict(OperationId=operation_id))
+
+ def create_service(self):
+ params = json.loads(self.body)
+ name = params.get("Name")
+ namespace_id = params.get("NamespaceId")
+ creator_request_id = params.get("CreatorRequestId")
+ description = params.get("Description")
+ dns_config = params.get("DnsConfig")
+ health_check_config = params.get("HealthCheckConfig")
+ health_check_custom_config = params.get("HealthCheckCustomConfig")
+ tags = params.get("Tags")
+ service_type = params.get("Type")
+ service = self.servicediscovery_backend.create_service(
+ name=name,
+ namespace_id=namespace_id,
+ creator_request_id=creator_request_id,
+ description=description,
+ dns_config=dns_config,
+ health_check_config=health_check_config,
+ health_check_custom_config=health_check_custom_config,
+ tags=tags,
+ service_type=service_type,
+ )
+ return json.dumps(dict(Service=service.to_json()))
+
+ def get_service(self):
+ params = json.loads(self.body)
+ service_id = params.get("Id")
+ service = self.servicediscovery_backend.get_service(service_id=service_id)
+ return json.dumps(dict(Service=service.to_json()))
+
+ def delete_service(self):
+ params = json.loads(self.body)
+ service_id = params.get("Id")
+ self.servicediscovery_backend.delete_service(service_id=service_id)
+ return json.dumps(dict())
+
+ def list_services(self):
+ services = self.servicediscovery_backend.list_services()
+ return json.dumps(dict(Services=[s.to_json() for s in services]))
+
+ def update_service(self):
+ params = json.loads(self.body)
+ service_id = params.get("Id")
+ details = params.get("Service")
+ operation_id = self.servicediscovery_backend.update_service(
+ service_id=service_id, details=details
+ )
+ return json.dumps(dict(OperationId=operation_id))
diff --git a/contrib/python/moto/py3/moto/servicediscovery/urls.py b/contrib/python/moto/py3/moto/servicediscovery/urls.py
new file mode 100644
index 0000000000..53e1b0ffb3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/servicediscovery/urls.py
@@ -0,0 +1,11 @@
+"""servicediscovery base URL and path."""
+from .responses import ServiceDiscoveryResponse
+
+url_bases = [
+ r"https?://servicediscovery\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": ServiceDiscoveryResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/ses/__init__.py b/contrib/python/moto/py3/moto/ses/__init__.py
new file mode 100644
index 0000000000..20de2f5aa8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/__init__.py
@@ -0,0 +1,4 @@
+from .models import ses_backends
+from ..core.models import base_decorator
+
+mock_ses = base_decorator(ses_backends)
diff --git a/contrib/python/moto/py3/moto/ses/exceptions.py b/contrib/python/moto/py3/moto/ses/exceptions.py
new file mode 100644
index 0000000000..1b539f4ea0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/exceptions.py
@@ -0,0 +1,95 @@
+from moto.core.exceptions import RESTError
+
+
+class MessageRejectedError(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("MessageRejected", message)
+
+
+class ConfigurationSetDoesNotExist(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ConfigurationSetDoesNotExist", message)
+
+
+class EventDestinationAlreadyExists(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("EventDestinationAlreadyExists", message)
+
+
+class TemplateNameAlreadyExists(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("TemplateNameAlreadyExists", message)
+
+
+class ValidationError(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationError", message)
+
+
+class InvalidParameterValue(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class InvalidRenderingParameterException:
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidRenderingParameterException", message)
+
+
+class TemplateDoesNotExist(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("TemplateDoesNotExist", message)
+
+
+class RuleSetNameAlreadyExists(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("RuleSetNameAlreadyExists", message)
+
+
+class RuleAlreadyExists(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("RuleAlreadyExists", message)
+
+
+class RuleSetDoesNotExist(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("RuleSetDoesNotExist", message)
+
+
+class RuleDoesNotExist(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("RuleDoesNotExist", message)
+
+
+class MissingRenderingAttributeException(RESTError):
+ code = 400
+
+ def __init__(self, var):
+ super().__init__(
+ "MissingRenderingAttributeException",
+ "Attribute '{0}' is not present in the rendering data.".format(var),
+ )
diff --git a/contrib/python/moto/py3/moto/ses/feedback.py b/contrib/python/moto/py3/moto/ses/feedback.py
new file mode 100644
index 0000000000..b643d51ab8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/feedback.py
@@ -0,0 +1,67 @@
+from moto.core import get_account_id
+
+"""
+SES Feedback messages
+Extracted from https://docs.aws.amazon.com/ses/latest/DeveloperGuide/notification-contents.html
+"""
+COMMON_MAIL = {
+ "notificationType": "Bounce, Complaint, or Delivery.",
+ "mail": {
+ "timestamp": "2018-10-08T14:05:45 +0000",
+ "messageId": "000001378603177f-7a5433e7-8edb-42ae-af10-f0181f34d6ee-000000",
+ "source": "sender@example.com",
+ "sourceArn": "arn:aws:ses:us-west-2:888888888888:identity/example.com",
+ "sourceIp": "127.0.3.0",
+ "sendingAccountId": get_account_id(),
+ "destination": ["recipient@example.com"],
+ "headersTruncated": False,
+ "headers": [
+ {"name": "From", "value": '"Sender Name" <sender@example.com>'},
+ {"name": "To", "value": '"Recipient Name" <recipient@example.com>'},
+ ],
+ "commonHeaders": {
+ "from": ["Sender Name <sender@example.com>"],
+ "date": "Mon, 08 Oct 2018 14:05:45 +0000",
+ "to": ["Recipient Name <recipient@example.com>"],
+ "messageId": " custom-message-ID",
+ "subject": "Message sent using Amazon SES",
+ },
+ },
+}
+BOUNCE = {
+ "bounceType": "Permanent",
+ "bounceSubType": "General",
+ "bouncedRecipients": [
+ {
+ "status": "5.0.0",
+ "action": "failed",
+ "diagnosticCode": "smtp; 550 user unknown",
+ "emailAddress": "recipient1@example.com",
+ },
+ {
+ "status": "4.0.0",
+ "action": "delayed",
+ "emailAddress": "recipient2@example.com",
+ },
+ ],
+ "reportingMTA": "example.com",
+ "timestamp": "2012-05-25T14:59:38.605Z",
+ "feedbackId": "000001378603176d-5a4b5ad9-6f30-4198-a8c3-b1eb0c270a1d-000000",
+ "remoteMtaIp": "127.0.2.0",
+}
+COMPLAINT = {
+ "userAgent": "AnyCompany Feedback Loop (V0.01)",
+ "complainedRecipients": [{"emailAddress": "recipient1@example.com"}],
+ "complaintFeedbackType": "abuse",
+ "arrivalDate": "2009-12-03T04:24:21.000-05:00",
+ "timestamp": "2012-05-25T14:59:38.623Z",
+ "feedbackId": "000001378603177f-18c07c78-fa81-4a58-9dd1-fedc3cb8f49a-000000",
+}
+DELIVERY = {
+ "timestamp": "2014-05-28T22:41:01.184Z",
+ "processingTimeMillis": 546,
+ "recipients": ["success@simulator.amazonses.com"],
+ "smtpResponse": "250 ok: Message 64111812 accepted",
+ "reportingMTA": "a8-70.smtp-out.amazonses.com",
+ "remoteMtaIp": "127.0.2.0",
+}
diff --git a/contrib/python/moto/py3/moto/ses/models.py b/contrib/python/moto/py3/moto/ses/models.py
new file mode 100644
index 0000000000..964e9b23ce
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/models.py
@@ -0,0 +1,543 @@
+import re
+import json
+import email
+import datetime
+from email.mime.base import MIMEBase
+from email.utils import parseaddr
+from email.mime.multipart import MIMEMultipart
+from email.encoders import encode_7or8bit
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.sns.models import sns_backends
+from .exceptions import (
+ MessageRejectedError,
+ ConfigurationSetDoesNotExist,
+ EventDestinationAlreadyExists,
+ TemplateNameAlreadyExists,
+ ValidationError,
+ InvalidParameterValue,
+ InvalidRenderingParameterException,
+ TemplateDoesNotExist,
+ RuleDoesNotExist,
+ RuleSetNameAlreadyExists,
+ RuleSetDoesNotExist,
+ RuleAlreadyExists,
+ MissingRenderingAttributeException,
+)
+from .utils import get_random_message_id, is_valid_address
+from .feedback import COMMON_MAIL, BOUNCE, COMPLAINT, DELIVERY
+
+RECIPIENT_LIMIT = 50
+
+
+class SESFeedback(BaseModel):
+
+ BOUNCE = "Bounce"
+ COMPLAINT = "Complaint"
+ DELIVERY = "Delivery"
+
+ SUCCESS_ADDR = "success"
+ BOUNCE_ADDR = "bounce"
+ COMPLAINT_ADDR = "complaint"
+
+ FEEDBACK_SUCCESS_MSG = {"test": "success"}
+ FEEDBACK_BOUNCE_MSG = {"test": "bounce"}
+ FEEDBACK_COMPLAINT_MSG = {"test": "complaint"}
+
+ FORWARDING_ENABLED = "feedback_forwarding_enabled"
+
+ @staticmethod
+ def generate_message(msg_type):
+ msg = dict(COMMON_MAIL)
+ if msg_type == SESFeedback.BOUNCE:
+ msg["bounce"] = BOUNCE
+ elif msg_type == SESFeedback.COMPLAINT:
+ msg["complaint"] = COMPLAINT
+ elif msg_type == SESFeedback.DELIVERY:
+ msg["delivery"] = DELIVERY
+
+ return msg
+
+
+class Message(BaseModel):
+ def __init__(self, message_id, source, subject, body, destinations):
+ self.id = message_id
+ self.source = source
+ self.subject = subject
+ self.body = body
+ self.destinations = destinations
+
+
+class TemplateMessage(BaseModel):
+ def __init__(self, message_id, source, template, template_data, destinations):
+ self.id = message_id
+ self.source = source
+ self.template = template
+ self.template_data = template_data
+ self.destinations = destinations
+
+
+class RawMessage(BaseModel):
+ def __init__(self, message_id, source, destinations, raw_data):
+ self.id = message_id
+ self.source = source
+ self.destinations = destinations
+ self.raw_data = raw_data
+
+
+class SESQuota(BaseModel):
+ def __init__(self, sent):
+ self.sent = sent
+
+ @property
+ def sent_past_24(self):
+ return self.sent
+
+
+def are_all_variables_present(template, template_data):
+ subject_part = template["subject_part"]
+ text_part = template["text_part"]
+ html_part = template["html_part"]
+
+ for var in re.findall("{{(.+?)}}", subject_part + text_part + html_part):
+ if not template_data.get(var):
+ return var, False
+ return None, True
+
+
+class SESBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.addresses = []
+ self.email_addresses = []
+ self.domains = []
+ self.sent_messages = []
+ self.sent_message_count = 0
+ self.rejected_messages_count = 0
+ self.sns_topics = {}
+ self.config_set = {}
+ self.config_set_event_destination = {}
+ self.event_destinations = {}
+ self.identity_mail_from_domains = {}
+ self.templates = {}
+ self.receipt_rule_set = {}
+
+ def _is_verified_address(self, source):
+ _, address = parseaddr(source)
+ if address in self.addresses:
+ return True
+ if address in self.email_addresses:
+ return True
+ _, host = address.split("@", 1)
+ return host in self.domains
+
+ def verify_email_identity(self, address):
+ _, address = parseaddr(address)
+ if address not in self.addresses:
+ self.addresses.append(address)
+
+ def verify_email_address(self, address):
+ _, address = parseaddr(address)
+ self.email_addresses.append(address)
+
+ def verify_domain(self, domain):
+ if domain.lower() not in self.domains:
+ self.domains.append(domain.lower())
+
+ def list_identities(self):
+ return self.domains + self.addresses
+
+ def list_verified_email_addresses(self):
+ return self.email_addresses
+
+ def delete_identity(self, identity):
+ if "@" in identity:
+ self.addresses.remove(identity)
+ else:
+ self.domains.remove(identity)
+
+ def send_email(self, source, subject, body, destinations, region):
+ recipient_count = sum(map(len, destinations.values()))
+ if recipient_count > RECIPIENT_LIMIT:
+ raise MessageRejectedError("Too many recipients.")
+ if not self._is_verified_address(source):
+ self.rejected_messages_count += 1
+ raise MessageRejectedError("Email address not verified %s" % source)
+ destination_addresses = [
+ address for addresses in destinations.values() for address in addresses
+ ]
+ for address in [source, *destination_addresses]:
+ valid, msg = is_valid_address(address)
+ if not valid:
+ raise InvalidParameterValue(msg)
+
+ self.__process_sns_feedback__(source, destinations, region)
+
+ message_id = get_random_message_id()
+ message = Message(message_id, source, subject, body, destinations)
+ self.sent_messages.append(message)
+ self.sent_message_count += recipient_count
+ return message
+
+ def send_templated_email(
+ self, source, template, template_data, destinations, region
+ ):
+ recipient_count = sum(map(len, destinations.values()))
+ if recipient_count > RECIPIENT_LIMIT:
+ raise MessageRejectedError("Too many recipients.")
+ if not self._is_verified_address(source):
+ self.rejected_messages_count += 1
+ raise MessageRejectedError("Email address not verified %s" % source)
+ destination_addresses = [
+ address for addresses in destinations.values() for address in addresses
+ ]
+ for address in [source, *destination_addresses]:
+ valid, msg = is_valid_address(address)
+ if not valid:
+ raise InvalidParameterValue(msg)
+
+ if not self.templates.get(template[0]):
+ raise TemplateDoesNotExist("Template (%s) does not exist" % template[0])
+
+ self.__process_sns_feedback__(source, destinations, region)
+
+ message_id = get_random_message_id()
+ message = TemplateMessage(
+ message_id, source, template, template_data, destinations
+ )
+ self.sent_messages.append(message)
+ self.sent_message_count += recipient_count
+ return message
+
+ def __type_of_message__(self, destinations):
+ """Checks the destination for any special address that could indicate delivery,
+ complaint or bounce like in SES simulator"""
+ if isinstance(destinations, list):
+ alladdress = destinations
+ else:
+ alladdress = (
+ destinations.get("ToAddresses", [])
+ + destinations.get("CcAddresses", [])
+ + destinations.get("BccAddresses", [])
+ )
+
+ for addr in alladdress:
+ if SESFeedback.SUCCESS_ADDR in addr:
+ return SESFeedback.DELIVERY
+ elif SESFeedback.COMPLAINT_ADDR in addr:
+ return SESFeedback.COMPLAINT
+ elif SESFeedback.BOUNCE_ADDR in addr:
+ return SESFeedback.BOUNCE
+
+ return None
+
+ def __generate_feedback__(self, msg_type):
+ """Generates the SNS message for the feedback"""
+ return SESFeedback.generate_message(msg_type)
+
+ def __process_sns_feedback__(self, source, destinations, region):
+ domain = str(source)
+ if "@" in domain:
+ domain = domain.split("@")[1]
+ if domain in self.sns_topics:
+ msg_type = self.__type_of_message__(destinations)
+ if msg_type is not None:
+ sns_topic = self.sns_topics[domain].get(msg_type, None)
+ if sns_topic is not None:
+ message = self.__generate_feedback__(msg_type)
+ if message:
+ sns_backends[region].publish(message, arn=sns_topic)
+
+ def send_raw_email(self, source, destinations, raw_data, region):
+ if source is not None:
+ _, source_email_address = parseaddr(source)
+ if not self._is_verified_address(source_email_address):
+ raise MessageRejectedError(
+ "Did not have authority to send from email %s"
+ % source_email_address
+ )
+
+ recipient_count = len(destinations)
+ message = email.message_from_string(raw_data)
+ if source is None:
+ if message["from"] is None:
+ raise MessageRejectedError("Source not specified")
+
+ _, source_email_address = parseaddr(message["from"])
+ if not self._is_verified_address(source_email_address):
+ raise MessageRejectedError(
+ "Did not have authority to send from email %s"
+ % source_email_address
+ )
+
+ for header in "TO", "CC", "BCC":
+ recipient_count += sum(
+ d.strip() and 1 or 0 for d in message.get(header, "").split(",")
+ )
+ if recipient_count > RECIPIENT_LIMIT:
+ raise MessageRejectedError("Too many recipients.")
+ for address in [addr for addr in [source, *destinations] if addr is not None]:
+ valid, msg = is_valid_address(address)
+ if not valid:
+ raise InvalidParameterValue(msg)
+
+ self.__process_sns_feedback__(source, destinations, region)
+
+ self.sent_message_count += recipient_count
+ message_id = get_random_message_id()
+ message = RawMessage(message_id, source, destinations, raw_data)
+ self.sent_messages.append(message)
+ return message
+
+ def get_send_quota(self):
+ return SESQuota(self.sent_message_count)
+
+ def get_identity_notification_attributes(self, identities):
+ response = {}
+ for identity in identities:
+ response[identity] = self.sns_topics.get(identity, {})
+ return response
+
+ def set_identity_feedback_forwarding_enabled(self, identity, enabled):
+ identity_sns_topics = self.sns_topics.get(identity, {})
+ identity_sns_topics[SESFeedback.FORWARDING_ENABLED] = enabled
+ self.sns_topics[identity] = identity_sns_topics
+
+ def set_identity_notification_topic(self, identity, notification_type, sns_topic):
+ identity_sns_topics = self.sns_topics.get(identity, {})
+ if sns_topic is None:
+ del identity_sns_topics[notification_type]
+ else:
+ identity_sns_topics[notification_type] = sns_topic
+
+ self.sns_topics[identity] = identity_sns_topics
+
+ return {}
+
+ def create_configuration_set(self, configuration_set_name):
+ self.config_set[configuration_set_name] = 1
+ return {}
+
+ def create_configuration_set_event_destination(
+ self, configuration_set_name, event_destination
+ ):
+
+ if self.config_set.get(configuration_set_name) is None:
+ raise ConfigurationSetDoesNotExist("Invalid Configuration Set Name.")
+
+ if self.event_destinations.get(event_destination["Name"]):
+ raise EventDestinationAlreadyExists("Duplicate Event destination Name.")
+
+ self.config_set_event_destination[configuration_set_name] = event_destination
+ self.event_destinations[event_destination["Name"]] = 1
+
+ return {}
+
+ def get_send_statistics(self):
+
+ statistics = {}
+ statistics["DeliveryAttempts"] = self.sent_message_count
+ statistics["Rejects"] = self.rejected_messages_count
+ statistics["Complaints"] = 0
+ statistics["Bounces"] = 0
+ statistics["Timestamp"] = datetime.datetime.utcnow()
+ return statistics
+
+ def add_template(self, template_info):
+ template_name = template_info["template_name"]
+ if not template_name:
+ raise ValidationError(
+ "1 validation error detected: "
+ "Value null at 'template.templateName'"
+ "failed to satisfy constraint: Member must not be null"
+ )
+
+ if self.templates.get(template_name, None):
+ raise TemplateNameAlreadyExists("Duplicate Template Name.")
+
+ template_subject = template_info["subject_part"]
+ if not template_subject:
+ raise InvalidParameterValue("The subject must be specified.")
+ self.templates[template_name] = template_info
+
+ def update_template(self, template_info):
+ template_name = template_info["template_name"]
+ if not template_name:
+ raise ValidationError(
+ "1 validation error detected: "
+ "Value null at 'template.templateName'"
+ "failed to satisfy constraint: Member must not be null"
+ )
+
+ if not self.templates.get(template_name, None):
+ raise TemplateDoesNotExist("Invalid Template Name.")
+
+ template_subject = template_info["subject_part"]
+ if not template_subject:
+ raise InvalidParameterValue("The subject must be specified.")
+ self.templates[template_name] = template_info
+
+ def get_template(self, template_name):
+ if not self.templates.get(template_name, None):
+ raise TemplateDoesNotExist("Invalid Template Name.")
+ return self.templates[template_name]
+
+ def list_templates(self):
+ return list(self.templates.values())
+
+ def render_template(self, render_data):
+ template_name = render_data.get("name", "")
+ template = self.templates.get(template_name, None)
+ if not template:
+ raise TemplateDoesNotExist("Invalid Template Name.")
+
+ template_data = render_data.get("data")
+ try:
+ template_data = json.loads(template_data)
+ except ValueError:
+ raise InvalidRenderingParameterException(
+ "Template rendering data is invalid"
+ )
+
+ var, are_variables_present = are_all_variables_present(template, template_data)
+ if not are_variables_present:
+ raise MissingRenderingAttributeException(var)
+
+ subject_part = template["subject_part"]
+ text_part = template["text_part"]
+ html_part = template["html_part"]
+
+ for key, value in template_data.items():
+ subject_part = str.replace(str(subject_part), "{{%s}}" % key, value)
+ text_part = str.replace(str(text_part), "{{%s}}" % key, value)
+ html_part = str.replace(str(html_part), "{{%s}}" % key, value)
+
+ email = MIMEMultipart("alternative")
+
+ mime_text = MIMEBase("text", "plain;charset=UTF-8")
+ mime_text.set_payload(text_part.encode("utf-8"))
+ encode_7or8bit(mime_text)
+ email.attach(mime_text)
+
+ mime_html = MIMEBase("text", "html;charset=UTF-8")
+ mime_html.set_payload(html_part.encode("utf-8"))
+ encode_7or8bit(mime_html)
+ email.attach(mime_html)
+
+ now = datetime.datetime.now().isoformat()
+
+ rendered_template = "Date: %s\r\nSubject: %s\r\n%s" % (
+ now,
+ subject_part,
+ email.as_string(),
+ )
+ return rendered_template
+
+ def create_receipt_rule_set(self, rule_set_name):
+ if self.receipt_rule_set.get(rule_set_name) is not None:
+ raise RuleSetNameAlreadyExists("Duplicate Receipt Rule Set Name.")
+ self.receipt_rule_set[rule_set_name] = []
+
+ def create_receipt_rule(self, rule_set_name, rule):
+ rule_set = self.receipt_rule_set.get(rule_set_name)
+ if rule_set is None:
+ raise RuleSetDoesNotExist("Invalid Rule Set Name.")
+ if rule in rule_set:
+ raise RuleAlreadyExists("Duplicate Rule Name.")
+ rule_set.append(rule)
+ self.receipt_rule_set[rule_set_name] = rule_set
+
+ def describe_receipt_rule_set(self, rule_set_name):
+ rule_set = self.receipt_rule_set.get(rule_set_name)
+
+ if rule_set is None:
+ raise RuleSetDoesNotExist(f"Rule set does not exist: {rule_set_name}")
+
+ return rule_set
+
+ def describe_receipt_rule(self, rule_set_name, rule_name):
+ rule_set = self.receipt_rule_set.get(rule_set_name)
+
+ if rule_set is None:
+ raise RuleSetDoesNotExist("Invalid Rule Set Name.")
+
+ for receipt_rule in rule_set:
+ if receipt_rule["name"] == rule_name:
+ return receipt_rule
+
+ raise RuleDoesNotExist("Invalid Rule Name.")
+
+ def update_receipt_rule(self, rule_set_name, rule):
+ rule_set = self.receipt_rule_set.get(rule_set_name)
+
+ if rule_set is None:
+ raise RuleSetDoesNotExist(f"Rule set does not exist: {rule_set_name}")
+
+ for i, receipt_rule in enumerate(rule_set):
+ if receipt_rule["name"] == rule["name"]:
+ rule_set[i] = rule
+ break
+ else:
+ raise RuleDoesNotExist(f"Rule does not exist: {rule['name']}")
+
+ def set_identity_mail_from_domain(
+ self, identity, mail_from_domain=None, behavior_on_mx_failure=None
+ ):
+ if identity not in (self.domains + self.addresses):
+ raise InvalidParameterValue(
+ "Identity '{0}' does not exist.".format(identity)
+ )
+
+ if mail_from_domain is None:
+ self.identity_mail_from_domains.pop(identity)
+ return
+
+ if not mail_from_domain.endswith(identity):
+ raise InvalidParameterValue(
+ "Provided MAIL-FROM domain '{0}' is not subdomain of "
+ "the domain of the identity '{1}'.".format(mail_from_domain, identity)
+ )
+
+ if behavior_on_mx_failure not in (None, "RejectMessage", "UseDefaultValue"):
+ raise ValidationError(
+ "1 validation error detected: "
+ "Value '{0}' at 'behaviorOnMXFailure'"
+ "failed to satisfy constraint: Member must satisfy enum value set: "
+ "[RejectMessage, UseDefaultValue]".format(behavior_on_mx_failure)
+ )
+
+ self.identity_mail_from_domains[identity] = {
+ "mail_from_domain": mail_from_domain,
+ "behavior_on_mx_failure": behavior_on_mx_failure,
+ }
+
+ def get_identity_mail_from_domain_attributes(self, identities=None):
+ if identities is None:
+ identities = []
+
+ attributes_by_identity = {}
+ for identity in identities:
+ if identity in (self.domains + self.addresses):
+ attributes_by_identity[identity] = self.identity_mail_from_domains.get(
+ identity
+ ) or {"behavior_on_mx_failure": "UseDefaultValue"}
+
+ return attributes_by_identity
+
+ def get_identity_verification_attributes(self, identities=None):
+ if identities is None:
+ identities = []
+
+ attributes_by_identity = {}
+ for identity in identities:
+ if identity in (self.domains + self.addresses):
+ attributes_by_identity[identity] = "Success"
+
+ return attributes_by_identity
+
+
+ses_backends = BackendDict(
+ SESBackend, "ses", use_boto3_regions=False, additional_regions=["global"]
+)
+ses_backend = ses_backends["global"]
diff --git a/contrib/python/moto/py3/moto/ses/responses.py b/contrib/python/moto/py3/moto/ses/responses.py
new file mode 100644
index 0000000000..b49a6c5c10
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/responses.py
@@ -0,0 +1,716 @@
+import base64
+
+from moto.core.responses import BaseResponse
+from .models import ses_backend
+from datetime import datetime
+
+
+class EmailResponse(BaseResponse):
+ def verify_email_identity(self):
+ address = self.querystring.get("EmailAddress")[0]
+ ses_backend.verify_email_identity(address)
+ template = self.response_template(VERIFY_EMAIL_IDENTITY)
+ return template.render()
+
+ def verify_email_address(self):
+ address = self.querystring.get("EmailAddress")[0]
+ ses_backend.verify_email_address(address)
+ template = self.response_template(VERIFY_EMAIL_ADDRESS)
+ return template.render()
+
+ def list_identities(self):
+ identities = ses_backend.list_identities()
+ template = self.response_template(LIST_IDENTITIES_RESPONSE)
+ return template.render(identities=identities)
+
+ def list_verified_email_addresses(self):
+ email_addresses = ses_backend.list_verified_email_addresses()
+ template = self.response_template(LIST_VERIFIED_EMAIL_RESPONSE)
+ return template.render(email_addresses=email_addresses)
+
+ def verify_domain_dkim(self):
+ domain = self.querystring.get("Domain")[0]
+ ses_backend.verify_domain(domain)
+ template = self.response_template(VERIFY_DOMAIN_DKIM_RESPONSE)
+ return template.render()
+
+ def verify_domain_identity(self):
+ domain = self.querystring.get("Domain")[0]
+ ses_backend.verify_domain(domain)
+ template = self.response_template(VERIFY_DOMAIN_IDENTITY_RESPONSE)
+ return template.render()
+
+ def delete_identity(self):
+ domain = self.querystring.get("Identity")[0]
+ ses_backend.delete_identity(domain)
+ template = self.response_template(DELETE_IDENTITY_RESPONSE)
+ return template.render()
+
+ def send_email(self):
+ bodydatakey = "Message.Body.Text.Data"
+ if "Message.Body.Html.Data" in self.querystring:
+ bodydatakey = "Message.Body.Html.Data"
+ body = self.querystring.get(bodydatakey)[0]
+ source = self.querystring.get("Source")[0]
+ subject = self.querystring.get("Message.Subject.Data")[0]
+ destinations = {"ToAddresses": [], "CcAddresses": [], "BccAddresses": []}
+ for dest_type in destinations:
+ # consume up to 51 to allow exception
+ for i in range(1, 52):
+ field = "Destination.%s.member.%s" % (dest_type, i)
+ address = self.querystring.get(field)
+ if address is None:
+ break
+ destinations[dest_type].append(address[0])
+
+ message = ses_backend.send_email(
+ source, subject, body, destinations, self.region
+ )
+ template = self.response_template(SEND_EMAIL_RESPONSE)
+ return template.render(message=message)
+
+ def send_templated_email(self):
+ source = self.querystring.get("Source")[0]
+ template = self.querystring.get("Template")
+ template_data = self.querystring.get("TemplateData")
+
+ destinations = {"ToAddresses": [], "CcAddresses": [], "BccAddresses": []}
+ for dest_type in destinations:
+ # consume up to 51 to allow exception
+ for i in range(1, 52):
+ field = "Destination.%s.member.%s" % (dest_type, i)
+ address = self.querystring.get(field)
+ if address is None:
+ break
+ destinations[dest_type].append(address[0])
+
+ message = ses_backend.send_templated_email(
+ source, template, template_data, destinations, self.region
+ )
+ template = self.response_template(SEND_TEMPLATED_EMAIL_RESPONSE)
+ return template.render(message=message)
+
+ def send_raw_email(self):
+ source = self.querystring.get("Source")
+ if source is not None:
+ (source,) = source
+
+ raw_data = self.querystring.get("RawMessage.Data")[0]
+ raw_data = base64.b64decode(raw_data)
+ raw_data = raw_data.decode("utf-8")
+ destinations = []
+ # consume up to 51 to allow exception
+ for i in range(1, 52):
+ field = "Destinations.member.%s" % i
+ address = self.querystring.get(field)
+ if address is None:
+ break
+ destinations.append(address[0])
+
+ message = ses_backend.send_raw_email(
+ source, destinations, raw_data, self.region
+ )
+ template = self.response_template(SEND_RAW_EMAIL_RESPONSE)
+ return template.render(message=message)
+
+ def get_send_quota(self):
+ quota = ses_backend.get_send_quota()
+ template = self.response_template(GET_SEND_QUOTA_RESPONSE)
+ return template.render(quota=quota)
+
+ def get_identity_notification_attributes(self):
+ identities = self._get_params()["Identities"]
+ identities = ses_backend.get_identity_notification_attributes(identities)
+ template = self.response_template(GET_IDENTITY_NOTIFICATION_ATTRIBUTES)
+ return template.render(identities=identities)
+
+ def set_identity_feedback_forwarding_enabled(self):
+ identity = self._get_param("Identity")
+ enabled = self._get_bool_param("ForwardingEnabled")
+ ses_backend.set_identity_feedback_forwarding_enabled(identity, enabled)
+ template = self.response_template(SET_IDENTITY_FORWARDING_ENABLED_RESPONSE)
+ return template.render()
+
+ def set_identity_notification_topic(self):
+
+ identity = self.querystring.get("Identity")[0]
+ not_type = self.querystring.get("NotificationType")[0]
+ sns_topic = self.querystring.get("SnsTopic")
+ if sns_topic:
+ sns_topic = sns_topic[0]
+
+ ses_backend.set_identity_notification_topic(identity, not_type, sns_topic)
+ template = self.response_template(SET_IDENTITY_NOTIFICATION_TOPIC_RESPONSE)
+ return template.render()
+
+ def get_send_statistics(self):
+ statistics = ses_backend.get_send_statistics()
+ template = self.response_template(GET_SEND_STATISTICS)
+ return template.render(all_statistics=[statistics])
+
+ def create_configuration_set(self):
+ configuration_set_name = self.querystring.get("ConfigurationSet.Name")[0]
+ ses_backend.create_configuration_set(
+ configuration_set_name=configuration_set_name
+ )
+ template = self.response_template(CREATE_CONFIGURATION_SET)
+ return template.render()
+
+ def create_configuration_set_event_destination(self):
+
+ configuration_set_name = self._get_param("ConfigurationSetName")
+ is_configuration_event_enabled = self.querystring.get(
+ "EventDestination.Enabled"
+ )[0]
+ configuration_event_name = self.querystring.get("EventDestination.Name")[0]
+ event_topic_arn = self.querystring.get(
+ "EventDestination.SNSDestination.TopicARN"
+ )[0]
+ event_matching_types = self._get_multi_param(
+ "EventDestination.MatchingEventTypes.member"
+ )
+
+ event_destination = {
+ "Name": configuration_event_name,
+ "Enabled": is_configuration_event_enabled,
+ "EventMatchingTypes": event_matching_types,
+ "SNSDestination": event_topic_arn,
+ }
+
+ ses_backend.create_configuration_set_event_destination(
+ configuration_set_name=configuration_set_name,
+ event_destination=event_destination,
+ )
+
+ template = self.response_template(CREATE_CONFIGURATION_SET_EVENT_DESTINATION)
+ return template.render()
+
+ def create_template(self):
+ template_data = self._get_dict_param("Template")
+ template_info = {}
+ template_info["text_part"] = template_data.get("._text_part", "")
+ template_info["html_part"] = template_data.get("._html_part", "")
+ template_info["template_name"] = template_data.get("._name", "")
+ template_info["subject_part"] = template_data.get("._subject_part", "")
+ template_info["Timestamp"] = datetime.utcnow()
+ ses_backend.add_template(template_info=template_info)
+ template = self.response_template(CREATE_TEMPLATE)
+ return template.render()
+
+ def update_template(self):
+ template_data = self._get_dict_param("Template")
+ template_info = {}
+ template_info["text_part"] = template_data.get("._text_part", "")
+ template_info["html_part"] = template_data.get("._html_part", "")
+ template_info["template_name"] = template_data.get("._name", "")
+ template_info["subject_part"] = template_data.get("._subject_part", "")
+ template_info["Timestamp"] = datetime.utcnow()
+ ses_backend.update_template(template_info=template_info)
+ template = self.response_template(UPDATE_TEMPLATE)
+ return template.render()
+
+ def get_template(self):
+ template_name = self._get_param("TemplateName")
+ template_data = ses_backend.get_template(template_name)
+ template = self.response_template(GET_TEMPLATE)
+ return template.render(template_data=template_data)
+
+ def list_templates(self):
+ email_templates = ses_backend.list_templates()
+ template = self.response_template(LIST_TEMPLATES)
+ return template.render(templates=email_templates)
+
+ def test_render_template(self):
+ render_info = self._get_dict_param("Template")
+ rendered_template = ses_backend.render_template(render_info)
+ template = self.response_template(RENDER_TEMPLATE)
+ return template.render(template=rendered_template)
+
+ def create_receipt_rule_set(self):
+ rule_set_name = self._get_param("RuleSetName")
+ ses_backend.create_receipt_rule_set(rule_set_name)
+ template = self.response_template(CREATE_RECEIPT_RULE_SET)
+ return template.render()
+
+ def create_receipt_rule(self):
+ rule_set_name = self._get_param("RuleSetName")
+ rule = self._get_dict_param("Rule.")
+ ses_backend.create_receipt_rule(rule_set_name, rule)
+ template = self.response_template(CREATE_RECEIPT_RULE)
+ return template.render()
+
+ def describe_receipt_rule_set(self):
+ rule_set_name = self._get_param("RuleSetName")
+
+ rule_set = ses_backend.describe_receipt_rule_set(rule_set_name)
+
+ for i, rule in enumerate(rule_set):
+ formatted_rule = {}
+
+ for k, v in rule.items():
+ self._parse_param(k, v, formatted_rule)
+
+ rule_set[i] = formatted_rule
+
+ template = self.response_template(DESCRIBE_RECEIPT_RULE_SET)
+
+ return template.render(rule_set=rule_set, rule_set_name=rule_set_name)
+
+ def describe_receipt_rule(self):
+ rule_set_name = self._get_param("RuleSetName")
+ rule_name = self._get_param("RuleName")
+
+ receipt_rule = ses_backend.describe_receipt_rule(rule_set_name, rule_name)
+
+ rule = {}
+
+ for k, v in receipt_rule.items():
+ self._parse_param(k, v, rule)
+
+ template = self.response_template(DESCRIBE_RECEIPT_RULE)
+ return template.render(rule=rule)
+
+ def update_receipt_rule(self):
+ rule_set_name = self._get_param("RuleSetName")
+ rule = self._get_dict_param("Rule.")
+
+ ses_backend.update_receipt_rule(rule_set_name, rule)
+
+ template = self.response_template(UPDATE_RECEIPT_RULE)
+ return template.render()
+
+ def set_identity_mail_from_domain(self):
+ identity = self._get_param("Identity")
+ mail_from_domain = self._get_param("MailFromDomain")
+ behavior_on_mx_failure = self._get_param("BehaviorOnMXFailure")
+
+ ses_backend.set_identity_mail_from_domain(
+ identity, mail_from_domain, behavior_on_mx_failure
+ )
+
+ template = self.response_template(SET_IDENTITY_MAIL_FROM_DOMAIN)
+ return template.render()
+
+ def get_identity_mail_from_domain_attributes(self):
+ identities = self._get_multi_param("Identities.member.")
+ identities = ses_backend.get_identity_mail_from_domain_attributes(identities)
+ template = self.response_template(GET_IDENTITY_MAIL_FROM_DOMAIN_ATTRIBUTES)
+
+ return template.render(identities=identities)
+
+ def get_identity_verification_attributes(self):
+ params = self._get_params()
+ identities = params.get("Identities")
+ verification_attributes = ses_backend.get_identity_verification_attributes(
+ identities=identities,
+ )
+
+ template = self.response_template(GET_IDENTITY_VERIFICATION_ATTRIBUTES_TEMPLATE)
+ return template.render(verification_attributes=verification_attributes)
+
+
+VERIFY_EMAIL_IDENTITY = """<VerifyEmailIdentityResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <VerifyEmailIdentityResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</VerifyEmailIdentityResponse>"""
+
+VERIFY_EMAIL_ADDRESS = """<VerifyEmailAddressResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <VerifyEmailAddressResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</VerifyEmailAddressResponse>"""
+
+LIST_IDENTITIES_RESPONSE = """<ListIdentitiesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <ListIdentitiesResult>
+ <Identities>
+ {% for identity in identities %}
+ <member>{{ identity }}</member>
+ {% endfor %}
+ </Identities>
+ </ListIdentitiesResult>
+ <ResponseMetadata>
+ <RequestId>cacecf23-9bf1-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</ListIdentitiesResponse>"""
+
+LIST_VERIFIED_EMAIL_RESPONSE = """<ListVerifiedEmailAddressesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <ListVerifiedEmailAddressesResult>
+ <VerifiedEmailAddresses>
+ {% for email in email_addresses %}
+ <member>{{ email }}</member>
+ {% endfor %}
+ </VerifiedEmailAddresses>
+ </ListVerifiedEmailAddressesResult>
+ <ResponseMetadata>
+ <RequestId>cacecf23-9bf1-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</ListVerifiedEmailAddressesResponse>"""
+
+VERIFY_DOMAIN_DKIM_RESPONSE = """<VerifyDomainDkimResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <VerifyDomainDkimResult>
+ <DkimTokens>
+ <member>vvjuipp74whm76gqoni7qmwwn4w4qusjiainivf6sf</member>
+ <member>3frqe7jn4obpuxjpwpolz6ipb3k5nvt2nhjpik2oy</member>
+ <member>wrqplteh7oodxnad7hsl4mixg2uavzneazxv5sxi2</member>
+ </DkimTokens>
+ </VerifyDomainDkimResult>
+ <ResponseMetadata>
+ <RequestId>9662c15b-c469-11e1-99d1-797d6ecd6414</RequestId>
+ </ResponseMetadata>
+</VerifyDomainDkimResponse>"""
+
+VERIFY_DOMAIN_IDENTITY_RESPONSE = """\
+<VerifyDomainIdentityResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <VerifyDomainIdentityResult>
+ <VerificationToken>QTKknzFg2J4ygwa+XvHAxUl1hyHoY0gVfZdfjIedHZ0=</VerificationToken>
+ </VerifyDomainIdentityResult>
+ <ResponseMetadata>
+ <RequestId>94f6368e-9bf2-11e1-8ee7-c98a0037a2b6</RequestId>
+ </ResponseMetadata>
+</VerifyDomainIdentityResponse>"""
+
+DELETE_IDENTITY_RESPONSE = """<DeleteIdentityResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <DeleteIdentityResult/>
+ <ResponseMetadata>
+ <RequestId>d96bd874-9bf2-11e1-8ee7-c98a0037a2b6</RequestId>
+ </ResponseMetadata>
+</DeleteIdentityResponse>"""
+
+SEND_EMAIL_RESPONSE = """<SendEmailResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SendEmailResult>
+ <MessageId>{{ message.id }}</MessageId>
+ </SendEmailResult>
+ <ResponseMetadata>
+ <RequestId>d5964849-c866-11e0-9beb-01a62d68c57f</RequestId>
+ </ResponseMetadata>
+</SendEmailResponse>"""
+
+SEND_TEMPLATED_EMAIL_RESPONSE = """<SendTemplatedEmailResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SendTemplatedEmailResult>
+ <MessageId>{{ message.id }}</MessageId>
+ </SendTemplatedEmailResult>
+ <ResponseMetadata>
+ <RequestId>d5964849-c866-11e0-9beb-01a62d68c57f</RequestId>
+ </ResponseMetadata>
+</SendTemplatedEmailResponse>"""
+
+SEND_RAW_EMAIL_RESPONSE = """<SendRawEmailResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SendRawEmailResult>
+ <MessageId>{{ message.id }}</MessageId>
+ </SendRawEmailResult>
+ <ResponseMetadata>
+ <RequestId>e0abcdfa-c866-11e0-b6d0-273d09173b49</RequestId>
+ </ResponseMetadata>
+</SendRawEmailResponse>"""
+
+GET_SEND_QUOTA_RESPONSE = """<GetSendQuotaResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetSendQuotaResult>
+ <SentLast24Hours>{{ quota.sent_past_24 }}</SentLast24Hours>
+ <Max24HourSend>200.0</Max24HourSend>
+ <MaxSendRate>1.0</MaxSendRate>
+ </GetSendQuotaResult>
+ <ResponseMetadata>
+ <RequestId>273021c6-c866-11e0-b926-699e21c3af9e</RequestId>
+ </ResponseMetadata>
+</GetSendQuotaResponse>"""
+
+GET_IDENTITY_NOTIFICATION_ATTRIBUTES = """<GetIdentityNotificationAttributesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetIdentityNotificationAttributesResult>
+ <NotificationAttributes>
+ {% for identity, config in identities.items() %}
+ <entry>
+ <key>{{ identity }}</key>
+ <value>
+ <HeadersInBounceNotificationsEnabled>false</HeadersInBounceNotificationsEnabled>
+ <HeadersInDeliveryNotificationsEnabled>false</HeadersInDeliveryNotificationsEnabled>
+ <HeadersInComplaintNotificationsEnabled>false</HeadersInComplaintNotificationsEnabled>
+ {% if config.get("feedback_forwarding_enabled", True) == False %}
+ <ForwardingEnabled>false</ForwardingEnabled>
+ {% else %}
+ <ForwardingEnabled>true</ForwardingEnabled>
+ {% endif %}
+ </value>
+ </entry>
+ {% endfor %}
+ </NotificationAttributes>
+ </GetIdentityNotificationAttributesResult>
+ <ResponseMetadata>
+ <RequestId>46c90cfc-9055-4b84-96e3-4d6a309a8b9b</RequestId>
+ </ResponseMetadata>
+</GetIdentityNotificationAttributesResponse>"""
+
+SET_IDENTITY_FORWARDING_ENABLED_RESPONSE = """<SetIdentityFeedbackForwardingEnabledResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SetIdentityFeedbackForwardingEnabledResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</SetIdentityFeedbackForwardingEnabledResponse>"""
+
+SET_IDENTITY_NOTIFICATION_TOPIC_RESPONSE = """<SetIdentityNotificationTopicResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SetIdentityNotificationTopicResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</SetIdentityNotificationTopicResponse>"""
+
+GET_SEND_STATISTICS = """<GetSendStatisticsResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetSendStatisticsResult>
+ <SendDataPoints>
+ {% for statistics in all_statistics %}
+ <member>
+ <DeliveryAttempts>{{ statistics["DeliveryAttempts"] }}</DeliveryAttempts>
+ <Rejects>{{ statistics["Rejects"] }}</Rejects>
+ <Bounces>{{ statistics["Bounces"] }}</Bounces>
+ <Complaints>{{ statistics["Complaints"] }}</Complaints>
+ <Timestamp>{{ statistics["Timestamp"].isoformat() }}</Timestamp>
+ </member>
+ {% endfor %}
+ </SendDataPoints>
+ </GetSendStatisticsResult>
+ <ResponseMetadata>
+ <RequestId>e0abcdfa-c866-11e0-b6d0-273d09173z49</RequestId>
+ </ResponseMetadata>
+</GetSendStatisticsResponse>"""
+
+CREATE_CONFIGURATION_SET = """<CreateConfigurationSetResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <CreateConfigurationSetResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</CreateConfigurationSetResponse>"""
+
+
+CREATE_CONFIGURATION_SET_EVENT_DESTINATION = """<CreateConfigurationSetEventDestinationResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <CreateConfigurationSetEventDestinationResult/>
+ <ResponseMetadata>
+ <RequestId>67e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</CreateConfigurationSetEventDestinationResponse>"""
+
+CREATE_TEMPLATE = """<CreateTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <CreateTemplateResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
+ </ResponseMetadata>
+</CreateTemplateResponse>"""
+
+UPDATE_TEMPLATE = """<UpdateTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <UpdateTemplateResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
+ </ResponseMetadata>
+</UpdateTemplateResponse>"""
+
+GET_TEMPLATE = """<GetTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetTemplateResult>
+ <Template>
+ <TemplateName>{{ template_data["template_name"] }}</TemplateName>
+ <SubjectPart>{{ template_data["subject_part"] }}</SubjectPart>
+ <HtmlPart><![CDATA[{{ template_data["html_part"] }}]]></HtmlPart>
+ <TextPart>{{ template_data["text_part"] }}</TextPart>
+ </Template>
+ </GetTemplateResult>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
+ </ResponseMetadata>
+</GetTemplateResponse>"""
+
+
+LIST_TEMPLATES = """<ListTemplatesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <ListTemplatesResult>
+ <TemplatesMetadata>
+ {% for template in templates %}
+ <Item>
+ <Name>{{ template["template_name"] }}</Name>
+ <CreatedTimestamp>{{ template["Timestamp"] }}</CreatedTimestamp>
+ </Item>
+ {% endfor %}
+ </TemplatesMetadata>
+ </ListTemplatesResult>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
+ </ResponseMetadata>
+</ListTemplatesResponse>"""
+
+RENDER_TEMPLATE = """
+<TestRenderTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <TestRenderTemplateResult>
+ <RenderedTemplate>
+ {{template | e}}
+ </RenderedTemplate>
+ </TestRenderTemplateResult>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
+ </ResponseMetadata>
+</TestRenderTemplateResponse>
+"""
+
+CREATE_RECEIPT_RULE_SET = """<CreateReceiptRuleSetResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <CreateReceiptRuleSetResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-01ab88cf109a</RequestId>
+ </ResponseMetadata>
+</CreateReceiptRuleSetResponse>"""
+
+CREATE_RECEIPT_RULE = """<CreateReceiptRuleResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <CreateReceiptRuleResult/>
+ <ResponseMetadata>
+ <RequestId>15e0ef1a-9bf2-11e1-9279-01ab88cf109a</RequestId>
+ </ResponseMetadata>
+</CreateReceiptRuleResponse>"""
+
+DESCRIBE_RECEIPT_RULE_SET = """<DescribeReceiptRuleSetResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <DescribeReceiptRuleSetResult>
+ <Rules>
+ {% for rule in rule_set %}
+ <member>
+ <Recipients>
+ {% for recipient in rule["recipients"] %}
+ <member>{{recipient}}</member>
+ {% endfor %}
+ </Recipients>
+ <Name>{{rule["name"]}}</Name>
+ <Actions>
+ {% for action in rule["actions"] %}
+ <member>
+ {% if action["_s3_action"] %}
+ <S3Action>
+ <BucketName>{{action["_s3_action"]["_bucket_name"]}}</BucketName>
+ <KmsKeyArn>{{action["_s3_action"]["_kms_key_arn"]}}</KmsKeyArn>
+ <ObjectKeyPrefix>{{action["_s3_action"]["_object_key_prefix"]}}</ObjectKeyPrefix>
+ <TopicArn>{{action["_s3_action"]["_topic_arn"]}}</TopicArn>
+ </S3Action>
+ {% endif %}
+ {% if action["_bounce_action"] %}
+ <BounceAction>
+ <TopicArn>{{action["_bounce_action"]["_topic_arn"]}}</TopicArn>
+ <SmtpReplyCode>{{action["_bounce_action"]["_smtp_reply_code"]}}</SmtpReplyCode>
+ <StatusCode>{{action["_bounce_action"]["_status_code"]}}</StatusCode>
+ <Message>{{action["_bounce_action"]["_message"]}}</Message>
+ <Sender>{{action["_bounce_action"]["_sender"]}}</Sender>
+ </BounceAction>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Actions>
+ <TlsPolicy>{{rule["tls_policy"]}}</TlsPolicy>
+ <ScanEnabled>{{rule["scan_enabled"]}}</ScanEnabled>
+ <Enabled>{{rule["enabled"]}}</Enabled>
+ </member>
+ {% endfor %}
+ </Rules>
+ <Metadata>
+ <Name>{{rule_set_name}}</Name>
+ <CreatedTimestamp>2021-10-31</CreatedTimestamp>
+ </Metadata>
+ </DescribeReceiptRuleSetResult>
+ <ResponseMetadata>
+ <RequestId>15e0ef1a-9bf2-11e1-9279-01ab88cf109a</RequestId>
+ </ResponseMetadata>
+</DescribeReceiptRuleSetResponse>
+"""
+
+DESCRIBE_RECEIPT_RULE = """<DescribeReceiptRuleResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <DescribeReceiptRuleResult>
+ <Rule>
+ <Recipients>
+ {% for recipient in rule["recipients"] %}
+ <member>{{recipient}}</member>
+ {% endfor %}
+ </Recipients>
+ <Name>{{rule["name"]}}</Name>
+ <Actions>
+ {% for action in rule["actions"] %}
+ <member>
+ {% if action["_s3_action"] %}
+ <S3Action>
+ <BucketName>{{action["_s3_action"]["_bucket_name"]}}</BucketName>
+ <KmsKeyArn>{{action["_s3_action"]["_kms_key_arn"]}}</KmsKeyArn>
+ <ObjectKeyPrefix>{{action["_s3_action"]["_object_key_prefix"]}}</ObjectKeyPrefix>
+ <TopicArn>{{action["_s3_action"]["_topic_arn"]}}</TopicArn>
+ </S3Action>
+ {% endif %}
+ {% if action["_bounce_action"] %}
+ <BounceAction>
+ <TopicArn>{{action["_bounce_action"]["_topic_arn"]}}</TopicArn>
+ <SmtpReplyCode>{{action["_bounce_action"]["_smtp_reply_code"]}}</SmtpReplyCode>
+ <StatusCode>{{action["_bounce_action"]["_status_code"]}}</StatusCode>
+ <Message>{{action["_bounce_action"]["_message"]}}</Message>
+ <Sender>{{action["_bounce_action"]["_sender"]}}</Sender>
+ </BounceAction>
+ {% endif %}
+ </member>
+ {% endfor %}
+ </Actions>
+ <TlsPolicy>{{rule["tls_policy"]}}</TlsPolicy>
+ <ScanEnabled>{{rule["scan_enabled"]}}</ScanEnabled>
+ <Enabled>{{rule["enabled"]}}</Enabled>
+ </Rule>
+ </DescribeReceiptRuleResult>
+ <ResponseMetadata>
+ <RequestId>15e0ef1a-9bf2-11e1-9279-01ab88cf109a</RequestId>
+ </ResponseMetadata>
+</DescribeReceiptRuleResponse>
+"""
+
+UPDATE_RECEIPT_RULE = """<UpdateReceiptRuleResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <UpdateReceiptRuleResult/>
+ <ResponseMetadata>
+ <RequestId>15e0ef1a-9bf2-11e1-9279-01ab88cf109a</RequestId>
+ </ResponseMetadata>
+</UpdateReceiptRuleResponse>"""
+
+SET_IDENTITY_MAIL_FROM_DOMAIN = """<SetIdentityMailFromDomainResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <SetIdentityMailFromDomainResult/>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</SetIdentityMailFromDomainResponse>"""
+
+GET_IDENTITY_MAIL_FROM_DOMAIN_ATTRIBUTES = """<GetIdentityMailFromDomainAttributesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetIdentityMailFromDomainAttributesResult>
+ {% if identities.items()|length > 0 %}
+ <MailFromDomainAttributes>
+ {% for name, value in identities.items() %}
+ <entry>
+ <key>{{ name }}</key>
+ <value>
+ {% if 'mail_from_domain' in value %}
+ <MailFromDomain>{{ value.get("mail_from_domain") }}</MailFromDomain>
+ <MailFromDomainStatus>Success</MailFromDomainStatus>
+ {% endif %}
+ <BehaviorOnMXFailure>{{ value.get("behavior_on_mx_failure") }}</BehaviorOnMXFailure>
+ </value>
+ </entry>
+ {% endfor %}
+ </MailFromDomainAttributes>
+ {% else %}
+ <MailFromDomainAttributes/>
+ {% endif %}
+ </GetIdentityMailFromDomainAttributesResult>
+ <ResponseMetadata>
+ <RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
+ </ResponseMetadata>
+</GetIdentityMailFromDomainAttributesResponse>"""
+
+GET_IDENTITY_VERIFICATION_ATTRIBUTES_TEMPLATE = """<GetIdentityVerificationAttributesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
+ <GetIdentityVerificationAttributesResult>
+ <VerificationAttributes>
+ {% for name, value in verification_attributes.items() %}
+ <entry>
+ <key>{{ name }}</key>
+ <value>
+ <VerificationStatus>{{ value }}</VerificationStatus>
+ <VerificationToken>ILQMESfEW0p6i6gIJcEWvO65TP5hg6B99hGFZ2lxrIs=</VerificationToken>
+ </value>
+ </entry>
+ {% endfor %}
+ </VerificationAttributes>
+ </GetIdentityVerificationAttributesResult>
+ <ResponseMetadata>
+ <RequestId>d435c1b8-a225-4b89-acff-81fcf7ef9236</RequestId>
+ </ResponseMetadata>
+</GetIdentityVerificationAttributesResponse>"""
diff --git a/contrib/python/moto/py3/moto/ses/urls.py b/contrib/python/moto/py3/moto/ses/urls.py
new file mode 100644
index 0000000000..846f86d5a3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/urls.py
@@ -0,0 +1,8 @@
+from .responses import EmailResponse
+
+url_bases = [
+ r"https?://email\.(.+)\.amazonaws\.com",
+ r"https?://ses\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {"{0}/$": EmailResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/ses/utils.py b/contrib/python/moto/py3/moto/ses/utils.py
new file mode 100644
index 0000000000..96445ad5f0
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ses/utils.py
@@ -0,0 +1,27 @@
+import random
+import string
+from email.utils import parseaddr
+
+
+def random_hex(length):
+ return "".join(random.choice(string.ascii_lowercase) for x in range(length))
+
+
+def get_random_message_id():
+ return "{0}-{1}-{2}-{3}-{4}-{5}-{6}".format(
+ random_hex(16),
+ random_hex(8),
+ random_hex(4),
+ random_hex(4),
+ random_hex(4),
+ random_hex(12),
+ random_hex(6),
+ )
+
+
+def is_valid_address(addr):
+ _, address = parseaddr(addr)
+ address = address.split("@")
+ if len(address) != 2 or not address[1]:
+ return False, "Missing domain"
+ return True, None
diff --git a/contrib/python/moto/py3/moto/settings.py b/contrib/python/moto/py3/moto/settings.py
new file mode 100644
index 0000000000..e3f8333606
--- /dev/null
+++ b/contrib/python/moto/py3/moto/settings.py
@@ -0,0 +1,127 @@
+import json
+import os
+import pathlib
+
+from functools import lru_cache
+
+
+TEST_SERVER_MODE = os.environ.get("TEST_SERVER_MODE", "0").lower() == "true"
+INITIAL_NO_AUTH_ACTION_COUNT = float(
+ os.environ.get("INITIAL_NO_AUTH_ACTION_COUNT", float("inf"))
+)
+DEFAULT_CONTAINER_REGISTRY = os.environ.get("DEFAULT_CONTAINER_REGISTRY", "docker.io")
+
+S3_IGNORE_SUBDOMAIN_BUCKETNAME = os.environ.get(
+ "S3_IGNORE_SUBDOMAIN_BUCKETNAME", ""
+) in ["1", "true"]
+
+# How many seconds to wait before we "validate" a new certificate in ACM.
+ACM_VALIDATION_WAIT = int(os.environ.get("MOTO_ACM_VALIDATION_WAIT", "60"))
+
+EC2_ENABLE_INSTANCE_TYPE_VALIDATION = bool(
+ os.environ.get("MOTO_EC2_ENABLE_INSTANCE_TYPE_VALIDATION", False)
+)
+
+ENABLE_KEYPAIR_VALIDATION = bool(
+ os.environ.get("MOTO_ENABLE_KEYPAIR_VALIDATION", False)
+)
+
+ENABLE_AMI_VALIDATION = bool(os.environ.get("MOTO_ENABLE_AMI_VALIDATION", False))
+
+
+def get_sf_execution_history_type():
+ """
+ Determines which execution history events `get_execution_history` returns
+ :returns: str representing the type of Step Function Execution Type events should be
+ returned. Default value is SUCCESS, currently supports (SUCCESS || FAILURE)
+ """
+ return os.environ.get("SF_EXECUTION_HISTORY_TYPE", "SUCCESS")
+
+
+def get_s3_custom_endpoints():
+ endpoints = os.environ.get("MOTO_S3_CUSTOM_ENDPOINTS")
+ if endpoints:
+ return endpoints.split(",")
+ return []
+
+
+S3_UPLOAD_PART_MIN_SIZE = 5242880
+
+
+def get_s3_default_key_buffer_size():
+ return int(
+ os.environ.get(
+ "MOTO_S3_DEFAULT_KEY_BUFFER_SIZE", S3_UPLOAD_PART_MIN_SIZE - 1024
+ )
+ )
+
+
+def ecs_new_arn_format():
+ # True by default - only the value 'false' will return false
+ return os.environ.get("MOTO_ECS_NEW_ARN", "true").lower() != "false"
+
+
+def allow_unknown_region():
+ return os.environ.get("MOTO_ALLOW_NONEXISTENT_REGION", "false").lower() == "true"
+
+
+def moto_server_port():
+ return os.environ.get("MOTO_PORT") or "5000"
+
+
+@lru_cache()
+def moto_server_host():
+ if is_docker():
+ return get_docker_host()
+ else:
+ return "http://host.docker.internal"
+
+
+def moto_lambda_image():
+ return os.environ.get("MOTO_DOCKER_LAMBDA_IMAGE", "lambci/lambda")
+
+
+def moto_network_name():
+ return os.environ.get("MOTO_DOCKER_NETWORK_NAME")
+
+
+def moto_network_mode():
+ return os.environ.get("MOTO_DOCKER_NETWORK_MODE")
+
+
+def test_server_mode_endpoint():
+ return os.environ.get(
+ "TEST_SERVER_MODE_ENDPOINT", f"http://localhost:{moto_server_port()}"
+ )
+
+
+def is_docker():
+ path = pathlib.Path("/proc/self/cgroup")
+ return (
+ os.path.exists("/.dockerenv")
+ or path.is_file()
+ and any("docker" in line for line in path.read_text())
+ )
+
+
+def get_docker_host():
+ try:
+ cmd = "curl -s --unix-socket /run/docker.sock http://docker/containers/$HOSTNAME/json"
+ container_info = os.popen(cmd).read()
+ network_settings = json.loads(container_info)["NetworkSettings"]
+ network_name = moto_network_name()
+ if network_name and network_name in network_settings["Networks"]:
+ _ip = network_settings["Networks"][network_name]["IPAddress"]
+ else:
+ _ip = network_settings["IPAddress"]
+ if network_name:
+ print(
+ f"WARNING - Moto couldn't find network '{network_name}' - defaulting to {_ip}"
+ )
+ return f"http://{_ip}"
+ except Exception as e: # noqa
+ print(
+ "WARNING - Unable to parse Docker API response. Defaulting to 'host.docker.internal'"
+ )
+ print(f"{type(e)}::{e}")
+ return "http://host.docker.internal"
diff --git a/contrib/python/moto/py3/moto/sns/__init__.py b/contrib/python/moto/py3/moto/sns/__init__.py
new file mode 100644
index 0000000000..e3dbba6e35
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/__init__.py
@@ -0,0 +1,4 @@
+from .models import sns_backends
+from ..core.models import base_decorator
+
+mock_sns = base_decorator(sns_backends)
diff --git a/contrib/python/moto/py3/moto/sns/exceptions.py b/contrib/python/moto/py3/moto/sns/exceptions.py
new file mode 100644
index 0000000000..954d28d5ad
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/exceptions.py
@@ -0,0 +1,91 @@
+from moto.core.exceptions import RESTError
+
+
+class SNSException(RESTError):
+ def __init__(self, *args, **kwargs):
+ kwargs["template"] = "wrapped_single_error"
+ super().__init__(*args, **kwargs)
+
+
+class SNSNotFoundError(SNSException):
+ code = 404
+
+ def __init__(self, message, **kwargs):
+ super().__init__("NotFound", message, **kwargs)
+
+
+class TopicNotFound(SNSNotFoundError):
+ def __init__(self):
+ super().__init__(message="Topic does not exist")
+
+
+class ResourceNotFoundError(SNSException):
+ code = 404
+
+ def __init__(self):
+ super().__init__("ResourceNotFound", "Resource does not exist")
+
+
+class DuplicateSnsEndpointError(SNSException):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DuplicateEndpoint", message)
+
+
+class SnsEndpointDisabled(SNSException):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("EndpointDisabled", message)
+
+
+class SNSInvalidParameter(SNSException):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameter", message)
+
+
+class InvalidParameterValue(SNSException):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class TagLimitExceededError(SNSException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "TagLimitExceeded",
+ "Could not complete request: tag quota of per resource exceeded",
+ )
+
+
+class InternalError(SNSException):
+ code = 500
+
+ def __init__(self, message):
+ super().__init__("InternalFailure", message)
+
+
+class TooManyEntriesInBatchRequest(SNSException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "TooManyEntriesInBatchRequest",
+ "The batch request contains more entries than permissible.",
+ )
+
+
+class BatchEntryIdsNotDistinct(SNSException):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "BatchEntryIdsNotDistinct",
+ "Two or more batch entries in the request have the same Id.",
+ )
diff --git a/contrib/python/moto/py3/moto/sns/models.py b/contrib/python/moto/py3/moto/sns/models.py
new file mode 100644
index 0000000000..26125b90c4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/models.py
@@ -0,0 +1,944 @@
+import datetime
+import uuid
+import json
+
+import requests
+import re
+
+from collections import OrderedDict
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import (
+ iso_8601_datetime_with_milliseconds,
+ camelcase_to_underscores,
+ BackendDict,
+)
+from moto.sqs import sqs_backends
+from moto.sqs.exceptions import MissingParameter
+
+from .exceptions import (
+ SNSNotFoundError,
+ TopicNotFound,
+ DuplicateSnsEndpointError,
+ SnsEndpointDisabled,
+ SNSInvalidParameter,
+ InvalidParameterValue,
+ InternalError,
+ ResourceNotFoundError,
+ TagLimitExceededError,
+ TooManyEntriesInBatchRequest,
+ BatchEntryIdsNotDistinct,
+)
+from .utils import make_arn_for_topic, make_arn_for_subscription, is_e164
+
+from moto.core import get_account_id
+
+DEFAULT_PAGE_SIZE = 100
+MAXIMUM_MESSAGE_LENGTH = 262144 # 256 KiB
+MAXIMUM_SMS_MESSAGE_BYTES = 1600 # Amazon limit for a single publish SMS action
+
+
+class Topic(CloudFormationModel):
+ def __init__(self, name, sns_backend):
+ self.name = name
+ self.sns_backend = sns_backend
+ self.account_id = get_account_id()
+ self.display_name = ""
+ self.delivery_policy = ""
+ self.kms_master_key_id = ""
+ self.effective_delivery_policy = json.dumps(DEFAULT_EFFECTIVE_DELIVERY_POLICY)
+ self.arn = make_arn_for_topic(self.account_id, name, sns_backend.region_name)
+
+ self.subscriptions_pending = 0
+ self.subscriptions_confimed = 0
+ self.subscriptions_deleted = 0
+ self.sent_notifications = []
+
+ self._policy_json = self._create_default_topic_policy(
+ sns_backend.region_name, self.account_id, name
+ )
+ self._tags = {}
+ self.fifo_topic = "false"
+ self.content_based_deduplication = "false"
+
+ def publish(self, message, subject=None, message_attributes=None, group_id=None):
+ message_id = str(uuid.uuid4())
+ subscriptions, _ = self.sns_backend.list_subscriptions(self.arn)
+ for subscription in subscriptions:
+ subscription.publish(
+ message,
+ message_id,
+ subject=subject,
+ message_attributes=message_attributes,
+ group_id=group_id,
+ )
+ self.sent_notifications.append(
+ (message_id, message, subject, message_attributes, group_id)
+ )
+ return message_id
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["TopicName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "TopicName":
+ return self.name
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ @property
+ def policy(self):
+ return json.dumps(self._policy_json, separators=(",", ":"))
+
+ @policy.setter
+ def policy(self, policy):
+ self._policy_json = json.loads(policy)
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "TopicName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html
+ return "AWS::SNS::Topic"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ sns_backend = sns_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ topic = sns_backend.create_topic(resource_name)
+ for subscription in properties.get("Subscription", []):
+ sns_backend.subscribe(
+ topic.arn, subscription["Endpoint"], subscription["Protocol"]
+ )
+ return topic
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ cls.delete_from_cloudformation_json(
+ original_resource.name, cloudformation_json, region_name
+ )
+ return cls.create_from_cloudformation_json(
+ new_resource_name, cloudformation_json, region_name
+ )
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ sns_backend = sns_backends[region_name]
+ properties = cloudformation_json["Properties"]
+
+ topic_name = properties.get(cls.cloudformation_name_type()) or resource_name
+ topic_arn = make_arn_for_topic(
+ get_account_id(), topic_name, sns_backend.region_name
+ )
+ subscriptions, _ = sns_backend.list_subscriptions(topic_arn)
+ for subscription in subscriptions:
+ sns_backend.unsubscribe(subscription.arn)
+ sns_backend.delete_topic(topic_arn)
+
+ def _create_default_topic_policy(self, region_name, account_id, name):
+ return {
+ "Version": "2008-10-17",
+ "Id": "__default_policy_ID",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Sid": "__default_statement_ID",
+ "Principal": {"AWS": "*"},
+ "Action": [
+ "SNS:GetTopicAttributes",
+ "SNS:SetTopicAttributes",
+ "SNS:AddPermission",
+ "SNS:RemovePermission",
+ "SNS:DeleteTopic",
+ "SNS:Subscribe",
+ "SNS:ListSubscriptionsByTopic",
+ "SNS:Publish",
+ "SNS:Receive",
+ ],
+ "Resource": make_arn_for_topic(self.account_id, name, region_name),
+ "Condition": {"StringEquals": {"AWS:SourceOwner": str(account_id)}},
+ }
+ ],
+ }
+
+
+class Subscription(BaseModel):
+ def __init__(self, topic, endpoint, protocol):
+ self.topic = topic
+ self.endpoint = endpoint
+ self.protocol = protocol
+ self.arn = make_arn_for_subscription(self.topic.arn)
+ self.attributes = {}
+ self._filter_policy = None # filter policy as a dict, not json.
+ self.confirmed = False
+
+ def publish(
+ self, message, message_id, subject=None, message_attributes=None, group_id=None
+ ):
+ if not self._matches_filter_policy(message_attributes):
+ return
+
+ if self.protocol == "sqs":
+ queue_name = self.endpoint.split(":")[-1]
+ region = self.endpoint.split(":")[3]
+ if self.attributes.get("RawMessageDelivery") != "true":
+ sqs_backends[region].send_message(
+ queue_name,
+ json.dumps(
+ self.get_post_data(
+ message,
+ message_id,
+ subject,
+ message_attributes=message_attributes,
+ ),
+ sort_keys=True,
+ indent=2,
+ separators=(",", ": "),
+ ),
+ group_id=group_id,
+ )
+ else:
+ raw_message_attributes = {}
+ for key, value in message_attributes.items():
+ attr_type = "string_value"
+ type_value = value["Value"]
+ if value["Type"].startswith("Binary"):
+ attr_type = "binary_value"
+ elif value["Type"].startswith("Number"):
+ type_value = str(value["Value"])
+
+ raw_message_attributes[key] = {
+ "data_type": value["Type"],
+ attr_type: type_value,
+ }
+
+ sqs_backends[region].send_message(
+ queue_name,
+ message,
+ message_attributes=raw_message_attributes,
+ group_id=group_id,
+ )
+ elif self.protocol in ["http", "https"]:
+ post_data = self.get_post_data(message, message_id, subject)
+ requests.post(
+ self.endpoint,
+ json=post_data,
+ headers={"Content-Type": "text/plain; charset=UTF-8"},
+ )
+ elif self.protocol == "lambda":
+ # TODO: support bad function name
+ # http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
+ arr = self.endpoint.split(":")
+ region = arr[3]
+ qualifier = None
+ if len(arr) == 7:
+ assert arr[5] == "function"
+ function_name = arr[-1]
+ elif len(arr) == 8:
+ assert arr[5] == "function"
+ qualifier = arr[-1]
+ function_name = arr[-2]
+ else:
+ assert False
+
+ from moto.awslambda import lambda_backends
+
+ lambda_backends[region].send_sns_message(
+ function_name, message, subject=subject, qualifier=qualifier
+ )
+
+ def _matches_filter_policy(self, message_attributes):
+ # TODO: support Anything-but matching, prefix matching and
+ # numeric value matching.
+ if not self._filter_policy:
+ return True
+
+ if message_attributes is None:
+ message_attributes = {}
+
+ def _field_match(field, rules, message_attributes):
+ for rule in rules:
+ # TODO: boolean value matching is not supported, SNS behavior unknown
+ if isinstance(rule, str):
+ if field not in message_attributes:
+ return False
+ if message_attributes[field]["Value"] == rule:
+ return True
+ try:
+ json_data = json.loads(message_attributes[field]["Value"])
+ if rule in json_data:
+ return True
+ except (ValueError, TypeError):
+ pass
+ if isinstance(rule, (int, float)):
+ if field not in message_attributes:
+ return False
+ if message_attributes[field]["Type"] == "Number":
+ attribute_values = [message_attributes[field]["Value"]]
+ elif message_attributes[field]["Type"] == "String.Array":
+ try:
+ attribute_values = json.loads(
+ message_attributes[field]["Value"]
+ )
+ if not isinstance(attribute_values, list):
+ attribute_values = [attribute_values]
+ except (ValueError, TypeError):
+ return False
+ else:
+ return False
+
+ for attribute_values in attribute_values:
+ # Even the official documentation states a 5 digits of accuracy after the decimal point for numerics, in reality it is 6
+ # https://docs.aws.amazon.com/sns/latest/dg/sns-subscription-filter-policies.html#subscription-filter-policy-constraints
+ if int(attribute_values * 1000000) == int(rule * 1000000):
+ return True
+ if isinstance(rule, dict):
+ keyword = list(rule.keys())[0]
+ attributes = list(rule.values())[0]
+ if keyword == "exists":
+ if attributes and field in message_attributes:
+ return True
+ elif not attributes and field not in message_attributes:
+ return True
+ return False
+
+ return all(
+ _field_match(field, rules, message_attributes)
+ for field, rules in self._filter_policy.items()
+ )
+
+ def get_post_data(self, message, message_id, subject, message_attributes=None):
+ post_data = {
+ "Type": "Notification",
+ "MessageId": message_id,
+ "TopicArn": self.topic.arn,
+ "Message": message,
+ "Timestamp": iso_8601_datetime_with_milliseconds(
+ datetime.datetime.utcnow()
+ ),
+ "SignatureVersion": "1",
+ "Signature": "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=",
+ "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
+ "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:{}:some-topic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55".format(
+ get_account_id()
+ ),
+ }
+ if subject:
+ post_data["Subject"] = subject
+ if message_attributes:
+ post_data["MessageAttributes"] = message_attributes
+ return post_data
+
+
+class PlatformApplication(BaseModel):
+ def __init__(self, region, name, platform, attributes):
+ self.region = region
+ self.name = name
+ self.platform = platform
+ self.attributes = attributes
+
+ @property
+ def arn(self):
+ return "arn:aws:sns:{region}:{AccountId}:app/{platform}/{name}".format(
+ region=self.region,
+ platform=self.platform,
+ name=self.name,
+ AccountId=get_account_id(),
+ )
+
+
+class PlatformEndpoint(BaseModel):
+ def __init__(self, region, application, custom_user_data, token, attributes):
+ self.region = region
+ self.application = application
+ self.custom_user_data = custom_user_data
+ self.token = token
+ self.attributes = attributes
+ self.id = uuid.uuid4()
+ self.messages = OrderedDict()
+ self.__fixup_attributes()
+
+ def __fixup_attributes(self):
+ # When AWS returns the attributes dict, it always contains these two elements, so we need to
+ # automatically ensure they exist as well.
+ if "Token" not in self.attributes:
+ self.attributes["Token"] = self.token
+ if "Enabled" in self.attributes:
+ enabled = self.attributes["Enabled"]
+ self.attributes["Enabled"] = enabled.lower()
+ else:
+ self.attributes["Enabled"] = "true"
+
+ @property
+ def enabled(self):
+ return json.loads(self.attributes.get("Enabled", "true").lower())
+
+ @property
+ def arn(self):
+ return (
+ "arn:aws:sns:{region}:{AccountId}:endpoint/{platform}/{name}/{id}".format(
+ region=self.region,
+ AccountId=get_account_id(),
+ platform=self.application.platform,
+ name=self.application.name,
+ id=self.id,
+ )
+ )
+
+ def publish(self, message):
+ if not self.enabled:
+ raise SnsEndpointDisabled("Endpoint %s disabled" % self.id)
+
+ # This is where we would actually send a message
+ message_id = str(uuid.uuid4())
+ self.messages[message_id] = message
+ return message_id
+
+
+class SNSBackend(BaseBackend):
+ """
+ Responsible for mocking calls to SNS. Integration with SQS/HTTP/etc is supported.
+
+ Messages published to a topic are persisted in the backend. If you need to verify that a message was published successfully, you can use the internal API to check the message was published successfully:
+
+ .. sourcecode:: python
+
+ from moto.sns import sns_backends
+ sns_backend = sns_backends["us-east-1"] # Use the appropriate region
+ all_send_notifications = sns_backend.topics[topic_arn].sent_notifications
+
+ Note that, as this is an internal API, the exact format may differ per versions.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.topics = OrderedDict()
+ self.subscriptions: OrderedDict[str, Subscription] = OrderedDict()
+ self.applications = {}
+ self.platform_endpoints = {}
+ self.region_name = region_name
+ self.sms_attributes = {}
+ self.sms_messages = OrderedDict()
+ self.opt_out_numbers = [
+ "+447420500600",
+ "+447420505401",
+ "+447632960543",
+ "+447632960028",
+ "+447700900149",
+ "+447700900550",
+ "+447700900545",
+ "+447700900907",
+ ]
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """List of dicts representing default VPC endpoints for this service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "sns"
+ )
+
+ def update_sms_attributes(self, attrs):
+ self.sms_attributes.update(attrs)
+
+ def create_topic(self, name, attributes=None, tags=None):
+
+ if attributes is None:
+ attributes = {}
+ if (
+ attributes.get("FifoTopic")
+ and attributes.get("FifoTopic").lower() == "true"
+ ):
+ fails_constraints = not re.match(r"^[a-zA-Z0-9_-]{1,256}\.fifo$", name)
+ msg = "Fifo Topic names must end with .fifo and must be made up of only uppercase and lowercase ASCII letters, numbers, underscores, and hyphens, and must be between 1 and 256 characters long."
+
+ else:
+ fails_constraints = not re.match(r"^[a-zA-Z0-9_-]{1,256}$", name)
+ msg = "Topic names must be made up of only uppercase and lowercase ASCII letters, numbers, underscores, and hyphens, and must be between 1 and 256 characters long."
+
+ if fails_constraints:
+ raise InvalidParameterValue(msg)
+
+ candidate_topic = Topic(name, self)
+ if attributes:
+ for attribute in attributes:
+ setattr(
+ candidate_topic,
+ camelcase_to_underscores(attribute),
+ attributes[attribute],
+ )
+ if tags:
+ candidate_topic._tags = tags
+ if candidate_topic.arn in self.topics:
+ return self.topics[candidate_topic.arn]
+ else:
+ self.topics[candidate_topic.arn] = candidate_topic
+ return candidate_topic
+
+ def _get_values_nexttoken(self, values_map, next_token=None):
+ if next_token is None or not next_token:
+ next_token = 0
+ next_token = int(next_token)
+ values = list(values_map.values())[next_token : next_token + DEFAULT_PAGE_SIZE]
+ if len(values) == DEFAULT_PAGE_SIZE:
+ next_token = next_token + DEFAULT_PAGE_SIZE
+ else:
+ next_token = None
+ return values, next_token
+
+ def _get_topic_subscriptions(self, topic):
+ return [sub for sub in self.subscriptions.values() if sub.topic == topic]
+
+ def list_topics(self, next_token=None):
+ return self._get_values_nexttoken(self.topics, next_token)
+
+ def delete_topic_subscriptions(self, topic):
+ for key, value in dict(self.subscriptions).items():
+ if value.topic == topic:
+ self.subscriptions.pop(key)
+
+ def delete_topic(self, arn):
+ try:
+ topic = self.get_topic(arn)
+ self.delete_topic_subscriptions(topic)
+ self.topics.pop(arn)
+ except KeyError:
+ raise SNSNotFoundError("Topic with arn {0} not found".format(arn))
+
+ def get_topic(self, arn):
+ try:
+ return self.topics[arn]
+ except KeyError:
+ raise SNSNotFoundError("Topic with arn {0} not found".format(arn))
+
+ def set_topic_attribute(self, topic_arn, attribute_name, attribute_value):
+ topic = self.get_topic(topic_arn)
+ setattr(topic, attribute_name, attribute_value)
+
+ def subscribe(self, topic_arn, endpoint, protocol):
+ if protocol == "sms":
+ if re.search(r"[./-]{2,}", endpoint) or re.search(
+ r"(^[./-]|[./-]$)", endpoint
+ ):
+ raise SNSInvalidParameter("Invalid SMS endpoint: {}".format(endpoint))
+
+ reduced_endpoint = re.sub(r"[./-]", "", endpoint)
+
+ if not is_e164(reduced_endpoint):
+ raise SNSInvalidParameter("Invalid SMS endpoint: {}".format(endpoint))
+
+ # AWS doesn't create duplicates
+ old_subscription = self._find_subscription(topic_arn, endpoint, protocol)
+ if old_subscription:
+ return old_subscription
+ topic = self.get_topic(topic_arn)
+ subscription = Subscription(topic, endpoint, protocol)
+ attributes = {
+ "PendingConfirmation": "false",
+ "ConfirmationWasAuthenticated": "true",
+ "Endpoint": endpoint,
+ "TopicArn": topic_arn,
+ "Protocol": protocol,
+ "SubscriptionArn": subscription.arn,
+ "Owner": get_account_id(),
+ "RawMessageDelivery": "false",
+ }
+
+ if protocol in ["http", "https"]:
+ attributes["EffectiveDeliveryPolicy"] = topic.effective_delivery_policy
+
+ subscription.attributes = attributes
+ self.subscriptions[subscription.arn] = subscription
+ return subscription
+
+ def _find_subscription(self, topic_arn, endpoint, protocol):
+ for subscription in self.subscriptions.values():
+ if (
+ subscription.topic.arn == topic_arn
+ and subscription.endpoint == endpoint
+ and subscription.protocol == protocol
+ ):
+ return subscription
+ return None
+
+ def unsubscribe(self, subscription_arn):
+ self.subscriptions.pop(subscription_arn, None)
+
+ def list_subscriptions(self, topic_arn=None, next_token=None):
+ if topic_arn:
+ topic = self.get_topic(topic_arn)
+ filtered = OrderedDict(
+ [(sub.arn, sub) for sub in self._get_topic_subscriptions(topic)]
+ )
+ return self._get_values_nexttoken(filtered, next_token)
+ else:
+ return self._get_values_nexttoken(self.subscriptions, next_token)
+
+ def publish(
+ self,
+ message,
+ arn=None,
+ phone_number=None,
+ subject=None,
+ message_attributes=None,
+ group_id=None,
+ ):
+ if subject is not None and len(subject) > 100:
+ # Note that the AWS docs around length are wrong: https://github.com/spulec/moto/issues/1503
+ raise ValueError("Subject must be less than 100 characters")
+
+ if phone_number:
+ # This is only an approximation. In fact, we should try to use GSM-7 or UCS-2 encoding to count used bytes
+ if len(message) > MAXIMUM_SMS_MESSAGE_BYTES:
+ raise ValueError("SMS message must be less than 1600 bytes")
+
+ message_id = str(uuid.uuid4())
+ self.sms_messages[message_id] = (phone_number, message)
+ return message_id
+
+ if len(message) > MAXIMUM_MESSAGE_LENGTH:
+ raise InvalidParameterValue(
+ "An error occurred (InvalidParameter) when calling the Publish operation: Invalid parameter: Message too long"
+ )
+
+ try:
+ topic = self.get_topic(arn)
+
+ fifo_topic = topic.fifo_topic == "true"
+ if group_id is None:
+ # MessageGroupId is a mandatory parameter for all
+ # messages in a fifo queue
+ if fifo_topic:
+ raise MissingParameter("MessageGroupId")
+ else:
+ if not fifo_topic:
+ msg = (
+ "Value {} for parameter MessageGroupId is invalid. "
+ "Reason: The request include parameter that is not valid for this queue type."
+ ).format(group_id)
+ raise InvalidParameterValue(msg)
+ message_id = topic.publish(
+ message,
+ subject=subject,
+ message_attributes=message_attributes,
+ group_id=group_id,
+ )
+ except SNSNotFoundError:
+ endpoint = self.get_endpoint(arn)
+ message_id = endpoint.publish(message)
+ return message_id
+
+ def create_platform_application(self, region, name, platform, attributes):
+ application = PlatformApplication(region, name, platform, attributes)
+ self.applications[application.arn] = application
+ return application
+
+ def get_application(self, arn):
+ try:
+ return self.applications[arn]
+ except KeyError:
+ raise SNSNotFoundError("Application with arn {0} not found".format(arn))
+
+ def set_application_attributes(self, arn, attributes):
+ application = self.get_application(arn)
+ application.attributes.update(attributes)
+ return application
+
+ def list_platform_applications(self):
+ return self.applications.values()
+
+ def delete_platform_application(self, platform_arn):
+ self.applications.pop(platform_arn)
+
+ def create_platform_endpoint(
+ self, region, application, custom_user_data, token, attributes
+ ):
+ for endpoint in self.platform_endpoints.values():
+ if token == endpoint.token:
+ if (
+ attributes.get("Enabled", "").lower()
+ == endpoint.attributes["Enabled"]
+ ):
+ return endpoint
+ raise DuplicateSnsEndpointError(
+ "Duplicate endpoint token with different attributes: %s" % token
+ )
+ platform_endpoint = PlatformEndpoint(
+ region, application, custom_user_data, token, attributes
+ )
+ self.platform_endpoints[platform_endpoint.arn] = platform_endpoint
+ return platform_endpoint
+
+ def list_endpoints_by_platform_application(self, application_arn):
+ return [
+ endpoint
+ for endpoint in self.platform_endpoints.values()
+ if endpoint.application.arn == application_arn
+ ]
+
+ def get_endpoint(self, arn):
+ try:
+ return self.platform_endpoints[arn]
+ except KeyError:
+ raise SNSNotFoundError("Endpoint does not exist")
+
+ def set_endpoint_attributes(self, arn, attributes):
+ endpoint = self.get_endpoint(arn)
+ if "Enabled" in attributes:
+ attributes["Enabled"] = attributes["Enabled"].lower()
+ endpoint.attributes.update(attributes)
+ return endpoint
+
+ def delete_endpoint(self, arn):
+ try:
+ del self.platform_endpoints[arn]
+ except KeyError:
+ raise SNSNotFoundError("Endpoint with arn {0} not found".format(arn))
+
+ def get_subscription_attributes(self, arn):
+ subscription = self.subscriptions.get(arn)
+
+ if not subscription:
+ raise SNSNotFoundError(
+ "Subscription does not exist", template="wrapped_single_error"
+ )
+
+ return subscription.attributes
+
+ def set_subscription_attributes(self, arn, name, value):
+ if name not in [
+ "RawMessageDelivery",
+ "DeliveryPolicy",
+ "FilterPolicy",
+ "RedrivePolicy",
+ ]:
+ raise SNSInvalidParameter("AttributeName")
+
+ # TODO: should do validation
+ _subscription = [_ for _ in self.subscriptions.values() if _.arn == arn]
+ if not _subscription:
+ raise SNSNotFoundError("Subscription with arn {0} not found".format(arn))
+ subscription = _subscription[0]
+
+ subscription.attributes[name] = value
+
+ if name == "FilterPolicy":
+ filter_policy = json.loads(value)
+ self._validate_filter_policy(filter_policy)
+ subscription._filter_policy = filter_policy
+
+ def _validate_filter_policy(self, value):
+ # TODO: extend validation checks
+ combinations = 1
+ for rules in value.values():
+ combinations *= len(rules)
+ # Even the official documentation states the total combination of values must not exceed 100, in reality it is 150
+ # https://docs.aws.amazon.com/sns/latest/dg/sns-subscription-filter-policies.html#subscription-filter-policy-constraints
+ if combinations > 150:
+ raise SNSInvalidParameter(
+ "Invalid parameter: FilterPolicy: Filter policy is too complex"
+ )
+
+ for rules in value.values():
+ for rule in rules:
+ if rule is None:
+ continue
+ if isinstance(rule, str):
+ continue
+ if isinstance(rule, bool):
+ continue
+ if isinstance(rule, (int, float)):
+ if rule <= -1000000000 or rule >= 1000000000:
+ raise InternalError("Unknown")
+ continue
+ if isinstance(rule, dict):
+ keyword = list(rule.keys())[0]
+ attributes = list(rule.values())[0]
+ if keyword == "anything-but":
+ continue
+ elif keyword == "exists":
+ if not isinstance(attributes, bool):
+ raise SNSInvalidParameter(
+ "Invalid parameter: FilterPolicy: exists match pattern must be either true or false."
+ )
+ continue
+ elif keyword == "numeric":
+ continue
+ elif keyword == "prefix":
+ continue
+ else:
+ raise SNSInvalidParameter(
+ "Invalid parameter: FilterPolicy: Unrecognized match type {type}".format(
+ type=keyword
+ )
+ )
+
+ raise SNSInvalidParameter(
+ "Invalid parameter: FilterPolicy: Match value must be String, number, true, false, or null"
+ )
+
+ def add_permission(self, topic_arn, label, aws_account_ids, action_names):
+ if topic_arn not in self.topics:
+ raise SNSNotFoundError("Topic does not exist")
+
+ policy = self.topics[topic_arn]._policy_json
+ statement = next(
+ (
+ statement
+ for statement in policy["Statement"]
+ if statement["Sid"] == label
+ ),
+ None,
+ )
+
+ if statement:
+ raise SNSInvalidParameter("Statement already exists")
+
+ if any(action_name not in VALID_POLICY_ACTIONS for action_name in action_names):
+ raise SNSInvalidParameter("Policy statement action out of service scope!")
+
+ principals = [
+ "arn:aws:iam::{}:root".format(account_id) for account_id in aws_account_ids
+ ]
+ actions = ["SNS:{}".format(action_name) for action_name in action_names]
+
+ statement = {
+ "Sid": label,
+ "Effect": "Allow",
+ "Principal": {"AWS": principals[0] if len(principals) == 1 else principals},
+ "Action": actions[0] if len(actions) == 1 else actions,
+ "Resource": topic_arn,
+ }
+
+ self.topics[topic_arn]._policy_json["Statement"].append(statement)
+
+ def remove_permission(self, topic_arn, label):
+ if topic_arn not in self.topics:
+ raise SNSNotFoundError("Topic does not exist")
+
+ statements = self.topics[topic_arn]._policy_json["Statement"]
+ statements = [
+ statement for statement in statements if statement["Sid"] != label
+ ]
+
+ self.topics[topic_arn]._policy_json["Statement"] = statements
+
+ def list_tags_for_resource(self, resource_arn):
+ if resource_arn not in self.topics:
+ raise ResourceNotFoundError
+
+ return self.topics[resource_arn]._tags
+
+ def tag_resource(self, resource_arn, tags):
+ if resource_arn not in self.topics:
+ raise ResourceNotFoundError
+
+ updated_tags = self.topics[resource_arn]._tags.copy()
+ updated_tags.update(tags)
+
+ if len(updated_tags) > 50:
+ raise TagLimitExceededError
+
+ self.topics[resource_arn]._tags = updated_tags
+
+ def untag_resource(self, resource_arn, tag_keys):
+ if resource_arn not in self.topics:
+ raise ResourceNotFoundError
+
+ for key in tag_keys:
+ self.topics[resource_arn]._tags.pop(key, None)
+
+ def publish_batch(self, topic_arn, publish_batch_request_entries):
+ """
+ The MessageStructure and MessageDeduplicationId-parameters have not yet been implemented.
+ """
+ try:
+ topic = self.get_topic(topic_arn)
+ except SNSNotFoundError:
+ raise TopicNotFound
+
+ if len(publish_batch_request_entries) > 10:
+ raise TooManyEntriesInBatchRequest
+
+ ids = [m["Id"] for m in publish_batch_request_entries]
+ if len(set(ids)) != len(ids):
+ raise BatchEntryIdsNotDistinct
+
+ fifo_topic = topic.fifo_topic == "true"
+ if fifo_topic:
+ if not all(
+ ["MessageGroupId" in entry for entry in publish_batch_request_entries]
+ ):
+ raise SNSInvalidParameter(
+ "Invalid parameter: The MessageGroupId parameter is required for FIFO topics"
+ )
+
+ successful = []
+ failed = []
+
+ for entry in publish_batch_request_entries:
+ try:
+ message_id = self.publish(
+ message=entry["Message"],
+ arn=topic_arn,
+ subject=entry.get("Subject"),
+ message_attributes=entry.get("MessageAttributes", {}),
+ group_id=entry.get("MessageGroupId"),
+ )
+ successful.append({"MessageId": message_id, "Id": entry["Id"]})
+ except Exception as e:
+ if isinstance(e, InvalidParameterValue):
+ failed.append(
+ {
+ "Id": entry["Id"],
+ "Code": "InvalidParameter",
+ "Message": f"Invalid parameter: {e.message}",
+ "SenderFault": True,
+ }
+ )
+ return successful, failed
+
+
+sns_backends = BackendDict(SNSBackend, "sns")
+
+
+DEFAULT_EFFECTIVE_DELIVERY_POLICY = {
+ "defaultHealthyRetryPolicy": {
+ "numNoDelayRetries": 0,
+ "numMinDelayRetries": 0,
+ "minDelayTarget": 20,
+ "maxDelayTarget": 20,
+ "numMaxDelayRetries": 0,
+ "numRetries": 3,
+ "backoffFunction": "linear",
+ },
+ "sicklyRetryPolicy": None,
+ "throttlePolicy": None,
+ "guaranteed": False,
+}
+
+
+VALID_POLICY_ACTIONS = [
+ "GetTopicAttributes",
+ "SetTopicAttributes",
+ "AddPermission",
+ "RemovePermission",
+ "DeleteTopic",
+ "Subscribe",
+ "ListSubscriptionsByTopic",
+ "Publish",
+ "Receive",
+]
diff --git a/contrib/python/moto/py3/moto/sns/responses.py b/contrib/python/moto/py3/moto/sns/responses.py
new file mode 100644
index 0000000000..4abc8713a3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/responses.py
@@ -0,0 +1,1249 @@
+import json
+import re
+from collections import defaultdict
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import camelcase_to_underscores
+from .models import sns_backends
+from .exceptions import InvalidParameterValue, SNSNotFoundError
+from .utils import is_e164
+
+
+class SNSResponse(BaseResponse):
+ SMS_ATTR_REGEX = re.compile(
+ r"^attributes\.entry\.(?P<index>\d+)\.(?P<type>key|value)$"
+ )
+ OPT_OUT_PHONE_NUMBER_REGEX = re.compile(r"^\+?\d+$")
+
+ @property
+ def backend(self):
+ return sns_backends[self.region]
+
+ def _error(self, code, message, sender="Sender"):
+ template = self.response_template(ERROR_RESPONSE)
+ return template.render(code=code, message=message, sender=sender)
+
+ def _get_attributes(self):
+ attributes = self._get_list_prefix("Attributes.entry")
+ return dict((attribute["key"], attribute["value"]) for attribute in attributes)
+
+ def _get_tags(self):
+ tags = self._get_list_prefix("Tags.member")
+ return {tag["key"]: tag["value"] for tag in tags}
+
+ def _parse_message_attributes(self):
+ message_attributes = self._get_object_map(
+ "MessageAttributes.entry", name="Name", value="Value"
+ )
+ return self._transform_message_attributes(message_attributes)
+
+ def _transform_message_attributes(self, message_attributes):
+ # SNS converts some key names before forwarding messages
+ # DataType -> Type, StringValue -> Value, BinaryValue -> Value
+ transformed_message_attributes = {}
+ for name, value in message_attributes.items():
+ # validation
+ data_type = value["DataType"]
+ if not data_type:
+ raise InvalidParameterValue(
+ "The message attribute '{0}' must contain non-empty "
+ "message attribute value.".format(name)
+ )
+
+ data_type_parts = data_type.split(".")
+ if len(data_type_parts) > 2 or data_type_parts[0] not in [
+ "String",
+ "Binary",
+ "Number",
+ ]:
+ raise InvalidParameterValue(
+ "The message attribute '{0}' has an invalid message "
+ "attribute type, the set of supported type prefixes is "
+ "Binary, Number, and String.".format(name)
+ )
+
+ transform_value = None
+ if "StringValue" in value:
+ if data_type == "Number":
+ try:
+ transform_value = int(value["StringValue"])
+ except ValueError:
+ try:
+ transform_value = float(value["StringValue"])
+ except ValueError:
+ raise InvalidParameterValue(
+ "An error occurred (ParameterValueInvalid) "
+ "when calling the Publish operation: "
+ "Could not cast message attribute '{0}' value to number.".format(
+ name
+ )
+ )
+ else:
+ transform_value = value["StringValue"]
+ elif "BinaryValue" in value:
+ transform_value = value["BinaryValue"]
+ if transform_value == "":
+ raise InvalidParameterValue(
+ "The message attribute '{0}' must contain non-empty "
+ "message attribute value for message attribute "
+ "type '{1}'.".format(name, data_type[0])
+ )
+
+ # transformation
+ transformed_message_attributes[name] = {
+ "Type": data_type,
+ "Value": transform_value,
+ }
+
+ return transformed_message_attributes
+
+ def create_topic(self):
+ name = self._get_param("Name")
+ attributes = self._get_attributes()
+ tags = self._get_tags()
+ topic = self.backend.create_topic(name, attributes, tags)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreateTopicResponse": {
+ "CreateTopicResult": {"TopicArn": topic.arn},
+ "ResponseMetadata": {
+ "RequestId": "a8dec8b3-33a4-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(CREATE_TOPIC_TEMPLATE)
+ return template.render(topic=topic)
+
+ def list_topics(self):
+ next_token = self._get_param("NextToken")
+ topics, next_token = self.backend.list_topics(next_token=next_token)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "ListTopicsResponse": {
+ "ListTopicsResult": {
+ "Topics": [{"TopicArn": topic.arn} for topic in topics],
+ "NextToken": next_token,
+ }
+ },
+ "ResponseMetadata": {
+ "RequestId": "a8dec8b3-33a4-11df-8963-01868b7c937a"
+ },
+ }
+ )
+
+ template = self.response_template(LIST_TOPICS_TEMPLATE)
+ return template.render(topics=topics, next_token=next_token)
+
+ def delete_topic(self):
+ topic_arn = self._get_param("TopicArn")
+ self.backend.delete_topic(topic_arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "DeleteTopicResponse": {
+ "ResponseMetadata": {
+ "RequestId": "a8dec8b3-33a4-11df-8963-01868b7c937a"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(DELETE_TOPIC_TEMPLATE)
+ return template.render()
+
+ def get_topic_attributes(self):
+ topic_arn = self._get_param("TopicArn")
+ topic = self.backend.get_topic(topic_arn)
+
+ if self.request_json:
+ attributes = {
+ "Owner": topic.account_id,
+ "Policy": topic.policy,
+ "TopicArn": topic.arn,
+ "DisplayName": topic.display_name,
+ "SubscriptionsPending": topic.subscriptions_pending,
+ "SubscriptionsConfirmed": topic.subscriptions_confimed,
+ "SubscriptionsDeleted": topic.subscriptions_deleted,
+ "DeliveryPolicy": topic.delivery_policy,
+ "EffectiveDeliveryPolicy": topic.effective_delivery_policy,
+ }
+ if topic.kms_master_key_id:
+ attributes["KmsMasterKeyId"] = topic.kms_master_key_id
+ if topic.fifo_topic == "true":
+ attributes["FifoTopic"] = topic.fifo_topic
+ attributes[
+ "ContentBasedDeduplication"
+ ] = topic.content_based_deduplication
+ response = {
+ "GetTopicAttributesResponse": {
+ "GetTopicAttributesResult": {"Attributes": attributes},
+ "ResponseMetadata": {
+ "RequestId": "057f074c-33a7-11df-9540-99d0768312d3"
+ },
+ }
+ }
+ return json.dumps(response)
+
+ template = self.response_template(GET_TOPIC_ATTRIBUTES_TEMPLATE)
+ return template.render(topic=topic)
+
+ def set_topic_attributes(self):
+ topic_arn = self._get_param("TopicArn")
+ attribute_name = self._get_param("AttributeName")
+ attribute_name = camelcase_to_underscores(attribute_name)
+ attribute_value = self._get_param("AttributeValue")
+ self.backend.set_topic_attribute(topic_arn, attribute_name, attribute_value)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "SetTopicAttributesResponse": {
+ "ResponseMetadata": {
+ "RequestId": "a8763b99-33a7-11df-a9b7-05d48da6f042"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(SET_TOPIC_ATTRIBUTES_TEMPLATE)
+ return template.render()
+
+ def subscribe(self):
+ topic_arn = self._get_param("TopicArn")
+ endpoint = self._get_param("Endpoint")
+ protocol = self._get_param("Protocol")
+ attributes = self._get_attributes()
+
+ subscription = self.backend.subscribe(topic_arn, endpoint, protocol)
+
+ if attributes is not None:
+ for attr_name, attr_value in attributes.items():
+ self.backend.set_subscription_attributes(
+ subscription.arn, attr_name, attr_value
+ )
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "SubscribeResponse": {
+ "SubscribeResult": {"SubscriptionArn": subscription.arn},
+ "ResponseMetadata": {
+ "RequestId": "a8763b99-33a7-11df-a9b7-05d48da6f042"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(SUBSCRIBE_TEMPLATE)
+ return template.render(subscription=subscription)
+
+ def unsubscribe(self):
+ subscription_arn = self._get_param("SubscriptionArn")
+ self.backend.unsubscribe(subscription_arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "UnsubscribeResponse": {
+ "ResponseMetadata": {
+ "RequestId": "a8763b99-33a7-11df-a9b7-05d48da6f042"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(UNSUBSCRIBE_TEMPLATE)
+ return template.render()
+
+ def list_subscriptions(self):
+ next_token = self._get_param("NextToken")
+ subscriptions, next_token = self.backend.list_subscriptions(
+ next_token=next_token
+ )
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "ListSubscriptionsResponse": {
+ "ListSubscriptionsResult": {
+ "Subscriptions": [
+ {
+ "TopicArn": subscription.topic.arn,
+ "Protocol": subscription.protocol,
+ "SubscriptionArn": subscription.arn,
+ "Owner": subscription.topic.account_id,
+ "Endpoint": subscription.endpoint,
+ }
+ for subscription in subscriptions
+ ],
+ "NextToken": next_token,
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(LIST_SUBSCRIPTIONS_TEMPLATE)
+ return template.render(subscriptions=subscriptions, next_token=next_token)
+
+ def list_subscriptions_by_topic(self):
+ topic_arn = self._get_param("TopicArn")
+ next_token = self._get_param("NextToken")
+ subscriptions, next_token = self.backend.list_subscriptions(
+ topic_arn, next_token=next_token
+ )
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "ListSubscriptionsByTopicResponse": {
+ "ListSubscriptionsByTopicResult": {
+ "Subscriptions": [
+ {
+ "TopicArn": subscription.topic.arn,
+ "Protocol": subscription.protocol,
+ "SubscriptionArn": subscription.arn,
+ "Owner": subscription.topic.account_id,
+ "Endpoint": subscription.endpoint,
+ }
+ for subscription in subscriptions
+ ],
+ "NextToken": next_token,
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(LIST_SUBSCRIPTIONS_BY_TOPIC_TEMPLATE)
+ return template.render(subscriptions=subscriptions, next_token=next_token)
+
+ def publish(self):
+ target_arn = self._get_param("TargetArn")
+ topic_arn = self._get_param("TopicArn")
+ phone_number = self._get_param("PhoneNumber")
+ subject = self._get_param("Subject")
+ message_group_id = self._get_param("MessageGroupId")
+
+ message_attributes = self._parse_message_attributes()
+
+ arn = None
+ if phone_number is not None:
+ # Check phone is correct syntax (e164)
+ if not is_e164(phone_number):
+ return (
+ self._error(
+ "InvalidParameter", "Phone number does not meet the E164 format"
+ ),
+ dict(status=400),
+ )
+ elif target_arn is not None:
+ arn = target_arn
+ else:
+ arn = topic_arn
+
+ message = self._get_param("Message")
+
+ try:
+ message_id = self.backend.publish(
+ message,
+ arn=arn,
+ phone_number=phone_number,
+ subject=subject,
+ message_attributes=message_attributes,
+ group_id=message_group_id,
+ )
+ except ValueError as err:
+ error_response = self._error("InvalidParameter", str(err))
+ return error_response, dict(status=400)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "PublishResponse": {
+ "PublishResult": {"MessageId": message_id},
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(PUBLISH_TEMPLATE)
+ return template.render(message_id=message_id)
+
+ def publish_batch(self):
+ topic_arn = self._get_param("TopicArn")
+ publish_batch_request_entries = self._get_multi_param(
+ "PublishBatchRequestEntries.member"
+ )
+ for entry in publish_batch_request_entries:
+ if "MessageAttributes" in entry:
+ # Convert into the same format as the regular publish-method
+ # FROM: [{'Name': 'a', 'Value': {'DataType': 'String', 'StringValue': 'v'}}]
+ # TO : {'name': {'DataType': 'Number', 'StringValue': '123'}}
+ msg_attrs = {y["Name"]: y["Value"] for y in entry["MessageAttributes"]}
+ # Use the same validation/processing as the regular publish-method
+ entry["MessageAttributes"] = self._transform_message_attributes(
+ msg_attrs
+ )
+ successful, failed = self.backend.publish_batch(
+ topic_arn=topic_arn,
+ publish_batch_request_entries=publish_batch_request_entries,
+ )
+ template = self.response_template(PUBLISH_BATCH_TEMPLATE)
+ return template.render(successful=successful, failed=failed)
+
+ def create_platform_application(self):
+ name = self._get_param("Name")
+ platform = self._get_param("Platform")
+ attributes = self._get_attributes()
+ platform_application = self.backend.create_platform_application(
+ self.region, name, platform, attributes
+ )
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreatePlatformApplicationResponse": {
+ "CreatePlatformApplicationResult": {
+ "PlatformApplicationArn": platform_application.arn
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937b"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(CREATE_PLATFORM_APPLICATION_TEMPLATE)
+ return template.render(platform_application=platform_application)
+
+ def get_platform_application_attributes(self):
+ arn = self._get_param("PlatformApplicationArn")
+ application = self.backend.get_application(arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "GetPlatformApplicationAttributesResponse": {
+ "GetPlatformApplicationAttributesResult": {
+ "Attributes": application.attributes
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937f"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(GET_PLATFORM_APPLICATION_ATTRIBUTES_TEMPLATE)
+ return template.render(application=application)
+
+ def set_platform_application_attributes(self):
+ arn = self._get_param("PlatformApplicationArn")
+ attributes = self._get_attributes()
+
+ self.backend.set_application_attributes(arn, attributes)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "SetPlatformApplicationAttributesResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-12df-8963-01868b7c937f"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(SET_PLATFORM_APPLICATION_ATTRIBUTES_TEMPLATE)
+ return template.render()
+
+ def list_platform_applications(self):
+ applications = self.backend.list_platform_applications()
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "ListPlatformApplicationsResponse": {
+ "ListPlatformApplicationsResult": {
+ "PlatformApplications": [
+ {
+ "PlatformApplicationArn": application.arn,
+ "attributes": application.attributes,
+ }
+ for application in applications
+ ],
+ "NextToken": None,
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937c"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(LIST_PLATFORM_APPLICATIONS_TEMPLATE)
+ return template.render(applications=applications)
+
+ def delete_platform_application(self):
+ platform_arn = self._get_param("PlatformApplicationArn")
+ self.backend.delete_platform_application(platform_arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "DeletePlatformApplicationResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937e"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(DELETE_PLATFORM_APPLICATION_TEMPLATE)
+ return template.render()
+
+ def create_platform_endpoint(self):
+ application_arn = self._get_param("PlatformApplicationArn")
+ application = self.backend.get_application(application_arn)
+
+ custom_user_data = self._get_param("CustomUserData")
+ token = self._get_param("Token")
+ attributes = self._get_attributes()
+
+ platform_endpoint = self.backend.create_platform_endpoint(
+ self.region, application, custom_user_data, token, attributes
+ )
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "CreatePlatformEndpointResponse": {
+ "CreatePlatformEndpointResult": {
+ "EndpointArn": platform_endpoint.arn
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3779-11df-8963-01868b7c937b"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(CREATE_PLATFORM_ENDPOINT_TEMPLATE)
+ return template.render(platform_endpoint=platform_endpoint)
+
+ def list_endpoints_by_platform_application(self):
+ application_arn = self._get_param("PlatformApplicationArn")
+ endpoints = self.backend.list_endpoints_by_platform_application(application_arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "ListEndpointsByPlatformApplicationResponse": {
+ "ListEndpointsByPlatformApplicationResult": {
+ "Endpoints": [
+ {
+ "Attributes": endpoint.attributes,
+ "EndpointArn": endpoint.arn,
+ }
+ for endpoint in endpoints
+ ],
+ "NextToken": None,
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937a"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(
+ LIST_ENDPOINTS_BY_PLATFORM_APPLICATION_TEMPLATE
+ )
+ return template.render(endpoints=endpoints)
+
+ def get_endpoint_attributes(self):
+ arn = self._get_param("EndpointArn")
+ try:
+ endpoint = self.backend.get_endpoint(arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "GetEndpointAttributesResponse": {
+ "GetEndpointAttributesResult": {
+ "Attributes": endpoint.attributes
+ },
+ "ResponseMetadata": {
+ "RequestId": "384ac68d-3775-11df-8963-01868b7c937f"
+ },
+ }
+ }
+ )
+
+ template = self.response_template(GET_ENDPOINT_ATTRIBUTES_TEMPLATE)
+ return template.render(endpoint=endpoint)
+ except SNSNotFoundError:
+ error_response = self._error("NotFound", "Endpoint does not exist")
+ return error_response, dict(status=404)
+
+ def set_endpoint_attributes(self):
+ arn = self._get_param("EndpointArn")
+ attributes = self._get_attributes()
+
+ self.backend.set_endpoint_attributes(arn, attributes)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "SetEndpointAttributesResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384bc68d-3775-12df-8963-01868b7c937f"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(SET_ENDPOINT_ATTRIBUTES_TEMPLATE)
+ return template.render()
+
+ def delete_endpoint(self):
+ arn = self._get_param("EndpointArn")
+ self.backend.delete_endpoint(arn)
+
+ if self.request_json:
+ return json.dumps(
+ {
+ "DeleteEndpointResponse": {
+ "ResponseMetadata": {
+ "RequestId": "384bc68d-3775-12df-8963-01868b7c937f"
+ }
+ }
+ }
+ )
+
+ template = self.response_template(DELETE_ENDPOINT_TEMPLATE)
+ return template.render()
+
+ def get_subscription_attributes(self):
+ arn = self._get_param("SubscriptionArn")
+ attributes = self.backend.get_subscription_attributes(arn)
+ template = self.response_template(GET_SUBSCRIPTION_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=attributes)
+
+ def set_subscription_attributes(self):
+ arn = self._get_param("SubscriptionArn")
+ attr_name = self._get_param("AttributeName")
+ attr_value = self._get_param("AttributeValue")
+ self.backend.set_subscription_attributes(arn, attr_name, attr_value)
+ template = self.response_template(SET_SUBSCRIPTION_ATTRIBUTES_TEMPLATE)
+ return template.render()
+
+ def set_sms_attributes(self):
+ # attributes.entry.1.key
+ # attributes.entry.1.value
+ # to
+ # 1: {key:X, value:Y}
+ temp_dict = defaultdict(dict)
+ for key, value in self.querystring.items():
+ match = self.SMS_ATTR_REGEX.match(key)
+ if match is not None:
+ temp_dict[match.group("index")][match.group("type")] = value[0]
+
+ # 1: {key:X, value:Y}
+ # to
+ # X: Y
+ # All of this, just to take into account when people provide invalid stuff.
+ result = {}
+ for item in temp_dict.values():
+ if "key" in item and "value" in item:
+ result[item["key"]] = item["value"]
+
+ self.backend.update_sms_attributes(result)
+
+ template = self.response_template(SET_SMS_ATTRIBUTES_TEMPLATE)
+ return template.render()
+
+ def get_sms_attributes(self):
+ filter_list = set()
+ for key, value in self.querystring.items():
+ if key.startswith("attributes.member.1"):
+ filter_list.add(value[0])
+
+ if len(filter_list) > 0:
+ result = {
+ k: v for k, v in self.backend.sms_attributes.items() if k in filter_list
+ }
+ else:
+ result = self.backend.sms_attributes
+
+ template = self.response_template(GET_SMS_ATTRIBUTES_TEMPLATE)
+ return template.render(attributes=result)
+
+ def check_if_phone_number_is_opted_out(self):
+ number = self._get_param("phoneNumber")
+ if self.OPT_OUT_PHONE_NUMBER_REGEX.match(number) is None:
+ error_response = self._error(
+ code="InvalidParameter",
+ message="Invalid parameter: PhoneNumber Reason: input incorrectly formatted",
+ )
+ return error_response, dict(status=400)
+
+ # There should be a nicer way to set if a nubmer has opted out
+ template = self.response_template(CHECK_IF_OPTED_OUT_TEMPLATE)
+ return template.render(opt_out=str(number.endswith("99")).lower())
+
+ def list_phone_numbers_opted_out(self):
+ template = self.response_template(LIST_OPTOUT_TEMPLATE)
+ return template.render(opt_outs=self.backend.opt_out_numbers)
+
+ def opt_in_phone_number(self):
+ number = self._get_param("phoneNumber")
+
+ try:
+ self.backend.opt_out_numbers.remove(number)
+ except ValueError:
+ pass
+
+ template = self.response_template(OPT_IN_NUMBER_TEMPLATE)
+ return template.render()
+
+ def add_permission(self):
+ topic_arn = self._get_param("TopicArn")
+ label = self._get_param("Label")
+ aws_account_ids = self._get_multi_param("AWSAccountId.member.")
+ action_names = self._get_multi_param("ActionName.member.")
+
+ self.backend.add_permission(topic_arn, label, aws_account_ids, action_names)
+
+ template = self.response_template(ADD_PERMISSION_TEMPLATE)
+ return template.render()
+
+ def remove_permission(self):
+ topic_arn = self._get_param("TopicArn")
+ label = self._get_param("Label")
+
+ self.backend.remove_permission(topic_arn, label)
+
+ template = self.response_template(DEL_PERMISSION_TEMPLATE)
+ return template.render()
+
+ def confirm_subscription(self):
+ arn = self._get_param("TopicArn")
+
+ if arn not in self.backend.topics:
+ error_response = self._error("NotFound", "Topic does not exist")
+ return error_response, dict(status=404)
+
+ # Once Tokens are stored by the `subscribe` endpoint and distributed
+ # to the client somehow, then we can check validity of tokens
+ # presented to this method. The following code works, all thats
+ # needed is to perform a token check and assign that value to the
+ # `already_subscribed` variable.
+ #
+ # token = self._get_param('Token')
+ # auth = self._get_param('AuthenticateOnUnsubscribe')
+ # if already_subscribed:
+ # error_response = self._error(
+ # code='AuthorizationError',
+ # message='Subscription already confirmed'
+ # )
+ # return error_response, dict(status=400)
+
+ template = self.response_template(CONFIRM_SUBSCRIPTION_TEMPLATE)
+ return template.render(
+ sub_arn="{0}:68762e72-e9b1-410a-8b3b-903da69ee1d5".format(arn)
+ )
+
+ def list_tags_for_resource(self):
+ arn = self._get_param("ResourceArn")
+
+ result = self.backend.list_tags_for_resource(arn)
+
+ template = self.response_template(LIST_TAGS_FOR_RESOURCE_TEMPLATE)
+ return template.render(tags=result)
+
+ def tag_resource(self):
+ arn = self._get_param("ResourceArn")
+ tags = self._get_tags()
+
+ self.backend.tag_resource(arn, tags)
+
+ return self.response_template(TAG_RESOURCE_TEMPLATE).render()
+
+ def untag_resource(self):
+ arn = self._get_param("ResourceArn")
+ tag_keys = self._get_multi_param("TagKeys.member")
+
+ self.backend.untag_resource(arn, tag_keys)
+
+ return self.response_template(UNTAG_RESOURCE_TEMPLATE).render()
+
+
+CREATE_TOPIC_TEMPLATE = """<CreateTopicResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <CreateTopicResult>
+ <TopicArn>{{ topic.arn }}</TopicArn>
+ </CreateTopicResult>
+ <ResponseMetadata>
+ <RequestId>a8dec8b3-33a4-11df-8963-01868b7c937a</RequestId>
+ </ResponseMetadata>
+ </CreateTopicResponse>"""
+
+LIST_TOPICS_TEMPLATE = """<ListTopicsResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListTopicsResult>
+ <Topics>
+ {% for topic in topics %}
+ <member>
+ <TopicArn>{{ topic.arn }}</TopicArn>
+ </member>
+ {% endfor %}
+ </Topics>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </ListTopicsResult>
+ <ResponseMetadata>
+ <RequestId>3f1478c7-33a9-11df-9540-99d0768312d3</RequestId>
+ </ResponseMetadata>
+</ListTopicsResponse>"""
+
+DELETE_TOPIC_TEMPLATE = """<DeleteTopicResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>f3aa9ac9-3c3d-11df-8235-9dab105e9c32</RequestId>
+ </ResponseMetadata>
+</DeleteTopicResponse>"""
+
+GET_TOPIC_ATTRIBUTES_TEMPLATE = """<GetTopicAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <GetTopicAttributesResult>
+ <Attributes>
+ <entry>
+ <key>Owner</key>
+ <value>{{ topic.account_id }}</value>
+ </entry>
+ <entry>
+ <key>Policy</key>
+ <value>{{ topic.policy }}</value>
+ </entry>
+ <entry>
+ <key>TopicArn</key>
+ <value>{{ topic.arn }}</value>
+ </entry>
+ <entry>
+ <key>DisplayName</key>
+ <value>{{ topic.display_name }}</value>
+ </entry>
+ <entry>
+ <key>SubscriptionsPending</key>
+ <value>{{ topic.subscriptions_pending }}</value>
+ </entry>
+ <entry>
+ <key>SubscriptionsConfirmed</key>
+ <value>{{ topic.subscriptions_confimed }}</value>
+ </entry>
+ <entry>
+ <key>SubscriptionsDeleted</key>
+ <value>{{ topic.subscriptions_deleted }}</value>
+ </entry>
+ <entry>
+ <key>DeliveryPolicy</key>
+ <value>{{ topic.delivery_policy }}</value>
+ </entry>
+ <entry>
+ <key>EffectiveDeliveryPolicy</key>
+ <value>{{ topic.effective_delivery_policy }}</value>
+ </entry>
+ {% if topic.kms_master_key_id %}
+ <entry>
+ <key>KmsMasterKeyId</key>
+ <value>{{ topic.kms_master_key_id }}</value>
+ </entry>
+ {% endif %}
+ {% if topic.fifo_topic == 'true' %}
+ <entry>
+ <key>FifoTopic</key>
+ <value>{{ topic.fifo_topic }}</value>
+ </entry>
+ <entry>
+ <key>ContentBasedDeduplication</key>
+ <value>{{ topic.content_based_deduplication }}</value>
+ </entry>
+ {% endif %}
+ </Attributes>
+ </GetTopicAttributesResult>
+ <ResponseMetadata>
+ <RequestId>057f074c-33a7-11df-9540-99d0768312d3</RequestId>
+ </ResponseMetadata>
+</GetTopicAttributesResponse>"""
+
+SET_TOPIC_ATTRIBUTES_TEMPLATE = """<SetTopicAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>a8763b99-33a7-11df-a9b7-05d48da6f042</RequestId>
+ </ResponseMetadata>
+</SetTopicAttributesResponse>"""
+
+CREATE_PLATFORM_APPLICATION_TEMPLATE = """<CreatePlatformApplicationResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <CreatePlatformApplicationResult>
+ <PlatformApplicationArn>{{ platform_application.arn }}</PlatformApplicationArn>
+ </CreatePlatformApplicationResult>
+ <ResponseMetadata>
+ <RequestId>b6f0e78b-e9d4-5a0e-b973-adc04e8a4ff9</RequestId>
+ </ResponseMetadata>
+</CreatePlatformApplicationResponse>"""
+
+CREATE_PLATFORM_ENDPOINT_TEMPLATE = """<CreatePlatformEndpointResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <CreatePlatformEndpointResult>
+ <EndpointArn>{{ platform_endpoint.arn }}</EndpointArn>
+ </CreatePlatformEndpointResult>
+ <ResponseMetadata>
+ <RequestId>6613341d-3e15-53f7-bf3c-7e56994ba278</RequestId>
+ </ResponseMetadata>
+</CreatePlatformEndpointResponse>"""
+
+LIST_PLATFORM_APPLICATIONS_TEMPLATE = """<ListPlatformApplicationsResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListPlatformApplicationsResult>
+ <PlatformApplications>
+ {% for application in applications %}
+ <member>
+ <PlatformApplicationArn>{{ application.arn }}</PlatformApplicationArn>
+ <Attributes>
+ {% for attribute in application.attributes %}
+ <entry>
+ <key>{{ attribute }}</key>
+ <value>{{ application.attributes[attribute] }}</value>
+ </entry>
+ {% endfor %}
+ </Attributes>
+ </member>
+ {% endfor %}
+ </PlatformApplications>
+ </ListPlatformApplicationsResult>
+ <ResponseMetadata>
+ <RequestId>315a335e-85d8-52df-9349-791283cbb529</RequestId>
+ </ResponseMetadata>
+</ListPlatformApplicationsResponse>"""
+
+DELETE_PLATFORM_APPLICATION_TEMPLATE = """<DeletePlatformApplicationResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>097dac18-7a77-5823-a8dd-e65476dcb037</RequestId>
+ </ResponseMetadata>
+</DeletePlatformApplicationResponse>"""
+
+GET_ENDPOINT_ATTRIBUTES_TEMPLATE = """<GetEndpointAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <GetEndpointAttributesResult>
+ <Attributes>
+ {% for attribute in endpoint.attributes %}
+ <entry>
+ <key>{{ attribute }}</key>
+ <value>{{ endpoint.attributes[attribute] }}</value>
+ </entry>
+ {% endfor %}
+ </Attributes>
+ </GetEndpointAttributesResult>
+ <ResponseMetadata>
+ <RequestId>6c725a19-a142-5b77-94f9-1055a9ea04e7</RequestId>
+ </ResponseMetadata>
+</GetEndpointAttributesResponse>"""
+
+LIST_ENDPOINTS_BY_PLATFORM_APPLICATION_TEMPLATE = """<ListEndpointsByPlatformApplicationResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListEndpointsByPlatformApplicationResult>
+ <Endpoints>
+ {% for endpoint in endpoints %}
+ <member>
+ <EndpointArn>{{ endpoint.arn }}</EndpointArn>
+ <Attributes>
+ {% for attribute in endpoint.attributes %}
+ <entry>
+ <key>{{ attribute }}</key>
+ <value>{{ endpoint.attributes[attribute] }}</value>
+ </entry>
+ {% endfor %}
+ </Attributes>
+ </member>
+ {% endfor %}
+ </Endpoints>
+ </ListEndpointsByPlatformApplicationResult>
+ <ResponseMetadata>
+ <RequestId>9a48768c-dac8-5a60-aec0-3cc27ea08d96</RequestId>
+ </ResponseMetadata>
+</ListEndpointsByPlatformApplicationResponse>"""
+
+GET_PLATFORM_APPLICATION_ATTRIBUTES_TEMPLATE = """<GetPlatformApplicationAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <GetPlatformApplicationAttributesResult>
+ <Attributes>
+ {% for attribute in application.attributes %}
+ <entry>
+ <key>{{ attribute }}</key>
+ <value>{{ application.attributes[attribute] }}</value>
+ </entry>
+ {% endfor %}
+ </Attributes>
+ </GetPlatformApplicationAttributesResult>
+ <ResponseMetadata>
+ <RequestId>74848df2-87f6-55ed-890c-c7be80442462</RequestId>
+ </ResponseMetadata>
+</GetPlatformApplicationAttributesResponse>"""
+
+PUBLISH_TEMPLATE = """<PublishResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <PublishResult>
+ <MessageId>{{ message_id }}</MessageId>
+ </PublishResult>
+ <ResponseMetadata>
+ <RequestId>f187a3c1-376f-11df-8963-01868b7c937a</RequestId>
+ </ResponseMetadata>
+</PublishResponse>"""
+
+SET_ENDPOINT_ATTRIBUTES_TEMPLATE = """<SetEndpointAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>2fe0bfc7-3e85-5ee5-a9e2-f58b35e85f6a</RequestId>
+ </ResponseMetadata>
+</SetEndpointAttributesResponse>"""
+
+DELETE_ENDPOINT_TEMPLATE = """<DeleteEndpointResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>c1d2b191-353c-5a5f-8969-fbdd3900afa8</RequestId>
+ </ResponseMetadata>
+</DeleteEndpointResponse>"""
+
+
+SET_PLATFORM_APPLICATION_ATTRIBUTES_TEMPLATE = """<SetPlatformApplicationAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>cf577bcc-b3dc-5463-88f1-3180b9412395</RequestId>
+ </ResponseMetadata>
+</SetPlatformApplicationAttributesResponse>"""
+
+SUBSCRIBE_TEMPLATE = """<SubscribeResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <SubscribeResult>
+ <SubscriptionArn>{{ subscription.arn }}</SubscriptionArn>
+ </SubscribeResult>
+ <ResponseMetadata>
+ <RequestId>c4407779-24a4-56fa-982c-3d927f93a775</RequestId>
+ </ResponseMetadata>
+</SubscribeResponse>"""
+
+UNSUBSCRIBE_TEMPLATE = """<UnsubscribeResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>18e0ac39-3776-11df-84c0-b93cc1666b84</RequestId>
+ </ResponseMetadata>
+</UnsubscribeResponse>"""
+
+LIST_SUBSCRIPTIONS_TEMPLATE = """<ListSubscriptionsResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListSubscriptionsResult>
+ <Subscriptions>
+ {% for subscription in subscriptions %}
+ <member>
+ <TopicArn>{{ subscription.topic.arn }}</TopicArn>
+ <Protocol>{{ subscription.protocol }}</Protocol>
+ <SubscriptionArn>{{ subscription.arn }}</SubscriptionArn>
+ <Owner>{{ subscription.account_id }}</Owner>
+ <Endpoint>{{ subscription.endpoint }}</Endpoint>
+ </member>
+ {% endfor %}
+ </Subscriptions>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </ListSubscriptionsResult>
+ <ResponseMetadata>
+ <RequestId>384ac68d-3775-11df-8963-01868b7c937a</RequestId>
+ </ResponseMetadata>
+</ListSubscriptionsResponse>"""
+
+LIST_SUBSCRIPTIONS_BY_TOPIC_TEMPLATE = """<ListSubscriptionsByTopicResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListSubscriptionsByTopicResult>
+ <Subscriptions>
+ {% for subscription in subscriptions %}
+ <member>
+ <TopicArn>{{ subscription.topic.arn }}</TopicArn>
+ <Protocol>{{ subscription.protocol }}</Protocol>
+ <SubscriptionArn>{{ subscription.arn }}</SubscriptionArn>
+ <Owner>{{ subscription.account_id }}</Owner>
+ <Endpoint>{{ subscription.endpoint }}</Endpoint>
+ </member>
+ {% endfor %}
+ </Subscriptions>
+ {% if next_token %}
+ <NextToken>{{ next_token }}</NextToken>
+ {% endif %}
+ </ListSubscriptionsByTopicResult>
+ <ResponseMetadata>
+ <RequestId>384ac68d-3775-11df-8963-01868b7c937a</RequestId>
+ </ResponseMetadata>
+</ListSubscriptionsByTopicResponse>"""
+
+
+# Not responding aws system attribetus like 'Owner' and 'SubscriptionArn'
+GET_SUBSCRIPTION_ATTRIBUTES_TEMPLATE = """<GetSubscriptionAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <GetSubscriptionAttributesResult>
+ <Attributes>
+ {% for name, value in attributes.items() %}
+ <entry>
+ <key>{{ name }}</key>
+ <value>{{ value }}</value>
+ </entry>
+ {% endfor %}
+ </Attributes>
+ </GetSubscriptionAttributesResult>
+ <ResponseMetadata>
+ <RequestId>057f074c-33a7-11df-9540-99d0768312d3</RequestId>
+ </ResponseMetadata>
+</GetSubscriptionAttributesResponse>"""
+
+
+SET_SUBSCRIPTION_ATTRIBUTES_TEMPLATE = """<SetSubscriptionAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>a8763b99-33a7-11df-a9b7-05d48da6f042</RequestId>
+ </ResponseMetadata>
+</SetSubscriptionAttributesResponse>"""
+
+SET_SMS_ATTRIBUTES_TEMPLATE = """<SetSMSAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <SetSMSAttributesResult/>
+ <ResponseMetadata>
+ <RequestId>26332069-c04a-5428-b829-72524b56a364</RequestId>
+ </ResponseMetadata>
+</SetSMSAttributesResponse>"""
+
+GET_SMS_ATTRIBUTES_TEMPLATE = """<GetSMSAttributesResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <GetSMSAttributesResult>
+ <attributes>
+ {% for name, value in attributes.items() %}
+ {% if value %}
+ <entry>
+ <key>{{ name }}</key>
+ <value>{{ value }}</value>
+ </entry>
+ {% endif %}
+ {% endfor %}
+ </attributes>
+ </GetSMSAttributesResult>
+ <ResponseMetadata>
+ <RequestId>287f9554-8db3-5e66-8abc-c76f0186db7e</RequestId>
+ </ResponseMetadata>
+</GetSMSAttributesResponse>"""
+
+CHECK_IF_OPTED_OUT_TEMPLATE = """<CheckIfPhoneNumberIsOptedOutResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <CheckIfPhoneNumberIsOptedOutResult>
+ <isOptedOut>{{ opt_out }}</isOptedOut>
+ </CheckIfPhoneNumberIsOptedOutResult>
+ <ResponseMetadata>
+ <RequestId>287f9554-8db3-5e66-8abc-c76f0186db7e</RequestId>
+ </ResponseMetadata>
+</CheckIfPhoneNumberIsOptedOutResponse>"""
+
+ERROR_RESPONSE = """<ErrorResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <Error>
+ <Type>{{ sender }}</Type>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ </Error>
+ <RequestId>9dd01905-5012-5f99-8663-4b3ecd0dfaef</RequestId>
+</ErrorResponse>"""
+
+LIST_OPTOUT_TEMPLATE = """<ListPhoneNumbersOptedOutResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListPhoneNumbersOptedOutResult>
+ <phoneNumbers>
+ {% for item in opt_outs %}
+ <member>{{ item }}</member>
+ {% endfor %}
+ </phoneNumbers>
+ </ListPhoneNumbersOptedOutResult>
+ <ResponseMetadata>
+ <RequestId>985e196d-a237-51b6-b33a-4b5601276b38</RequestId>
+ </ResponseMetadata>
+</ListPhoneNumbersOptedOutResponse>"""
+
+OPT_IN_NUMBER_TEMPLATE = """<OptInPhoneNumberResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <OptInPhoneNumberResult/>
+ <ResponseMetadata>
+ <RequestId>4c61842c-0796-50ef-95ac-d610c0bc8cf8</RequestId>
+ </ResponseMetadata>
+</OptInPhoneNumberResponse>"""
+
+ADD_PERMISSION_TEMPLATE = """<AddPermissionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>c046e713-c5ff-5888-a7bc-b52f0e4f1299</RequestId>
+ </ResponseMetadata>
+</AddPermissionResponse>"""
+
+DEL_PERMISSION_TEMPLATE = """<RemovePermissionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>e767cc9f-314b-5e1b-b283-9ea3fd4e38a3</RequestId>
+ </ResponseMetadata>
+</RemovePermissionResponse>"""
+
+CONFIRM_SUBSCRIPTION_TEMPLATE = """<ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ConfirmSubscriptionResult>
+ <SubscriptionArn>{{ sub_arn }}</SubscriptionArn>
+ </ConfirmSubscriptionResult>
+ <ResponseMetadata>
+ <RequestId>16eb4dde-7b3c-5b3e-a22a-1fe2a92d3293</RequestId>
+ </ResponseMetadata>
+</ConfirmSubscriptionResponse>"""
+
+LIST_TAGS_FOR_RESOURCE_TEMPLATE = """<ListTagsForResourceResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ListTagsForResourceResult>
+ <Tags>
+ {% for name, value in tags.items() %}
+ <member>
+ <Key>{{ name }}</Key>
+ <Value>{{ value }}</Value>
+ </member>
+ {% endfor %}
+ </Tags>
+ </ListTagsForResourceResult>
+ <ResponseMetadata>
+ <RequestId>97fa763f-861b-5223-a946-20251f2a42e2</RequestId>
+ </ResponseMetadata>
+</ListTagsForResourceResponse>"""
+
+TAG_RESOURCE_TEMPLATE = """<TagResourceResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <TagResourceResult/>
+ <ResponseMetadata>
+ <RequestId>fd4ab1da-692f-50a7-95ad-e7c665877d98</RequestId>
+ </ResponseMetadata>
+</TagResourceResponse>"""
+
+UNTAG_RESOURCE_TEMPLATE = """<UntagResourceResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <UntagResourceResult/>
+ <ResponseMetadata>
+ <RequestId>14eb7b1a-4cbd-5a56-80db-2d06412df769</RequestId>
+ </ResponseMetadata>
+</UntagResourceResponse>"""
+
+PUBLISH_BATCH_TEMPLATE = """<PublishBatchResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
+ <ResponseMetadata>
+ <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
+ </ResponseMetadata>
+ <PublishBatchResult>
+ <Successful>
+{% for successful in successful %}
+ <member>
+ <Id>{{ successful["Id"] }}</Id>
+ <MessageId>{{ successful["MessageId"] }}</MessageId>
+ </member>
+{% endfor %}
+ </Successful>
+ <Failed>
+{% for failed in failed %}
+ <member>
+ <Id>{{ failed["Id"] }}</Id>
+ <Code>{{ failed["Code"] }}</Code>
+ <Message>{{ failed["Message"] }}</Message>
+ <SenderFault>{{'true' if failed["SenderFault"] else 'false'}}</SenderFault>
+ </member>
+{% endfor %}
+ </Failed>
+ </PublishBatchResult>
+</PublishBatchResponse>"""
diff --git a/contrib/python/moto/py3/moto/sns/urls.py b/contrib/python/moto/py3/moto/sns/urls.py
new file mode 100644
index 0000000000..5846c4f0ac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/urls.py
@@ -0,0 +1,5 @@
+from .responses import SNSResponse
+
+url_bases = [r"https?://sns\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": SNSResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/sns/utils.py b/contrib/python/moto/py3/moto/sns/utils.py
new file mode 100644
index 0000000000..41839c3728
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sns/utils.py
@@ -0,0 +1,17 @@
+import re
+import uuid
+
+E164_REGEX = re.compile(r"^\+?[1-9]\d{1,14}$")
+
+
+def make_arn_for_topic(account_id, name, region_name):
+ return "arn:aws:sns:{0}:{1}:{2}".format(region_name, account_id, name)
+
+
+def make_arn_for_subscription(topic_arn):
+ subscription_id = uuid.uuid4()
+ return "{0}:{1}".format(topic_arn, subscription_id)
+
+
+def is_e164(number):
+ return E164_REGEX.match(number) is not None
diff --git a/contrib/python/moto/py3/moto/sqs/__init__.py b/contrib/python/moto/py3/moto/sqs/__init__.py
new file mode 100644
index 0000000000..5ea59d91be
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/__init__.py
@@ -0,0 +1,4 @@
+from .models import sqs_backends
+from ..core.models import base_decorator
+
+mock_sqs = base_decorator(sqs_backends)
diff --git a/contrib/python/moto/py3/moto/sqs/exceptions.py b/contrib/python/moto/py3/moto/sqs/exceptions.py
new file mode 100644
index 0000000000..230d9af805
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/exceptions.py
@@ -0,0 +1,130 @@
+from moto.core.exceptions import RESTError
+
+
+class ReceiptHandleIsInvalid(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "ReceiptHandleIsInvalid", "The input receipt handle is invalid."
+ )
+
+
+class MessageAttributesInvalid(RESTError):
+ code = 400
+
+ def __init__(self, description):
+ super().__init__("MessageAttributesInvalid", description)
+
+
+class QueueDoesNotExist(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "AWS.SimpleQueueService.NonExistentQueue",
+ "The specified queue does not exist for this wsdl version.",
+ template="wrapped_single_error",
+ )
+
+
+class QueueAlreadyExists(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("QueueAlreadyExists", message)
+
+
+class EmptyBatchRequest(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "EmptyBatchRequest",
+ "There should be at least one SendMessageBatchRequestEntry in the request.",
+ )
+
+
+class InvalidBatchEntryId(RESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ "InvalidBatchEntryId",
+ "A batch entry id can only contain alphanumeric characters, "
+ "hyphens and underscores. It can be at most 80 letters long.",
+ )
+
+
+class BatchRequestTooLong(RESTError):
+ code = 400
+
+ def __init__(self, length):
+ super().__init__(
+ "BatchRequestTooLong",
+ "Batch requests cannot be longer than 262144 bytes. "
+ "You have sent {} bytes.".format(length),
+ )
+
+
+class BatchEntryIdsNotDistinct(RESTError):
+ code = 400
+
+ def __init__(self, entry_id):
+ super().__init__("BatchEntryIdsNotDistinct", "Id {} repeated.".format(entry_id))
+
+
+class TooManyEntriesInBatchRequest(RESTError):
+ code = 400
+
+ def __init__(self, number):
+ super().__init__(
+ "TooManyEntriesInBatchRequest",
+ "Maximum number of entries per request are 10. "
+ "You have sent {}.".format(number),
+ )
+
+
+class InvalidAttributeName(RESTError):
+ code = 400
+
+ def __init__(self, attribute_name):
+ super().__init__(
+ "InvalidAttributeName", "Unknown Attribute {}.".format(attribute_name)
+ )
+
+
+class InvalidAttributeValue(RESTError):
+ code = 400
+
+ def __init__(self, attribute_name):
+ super().__init__(
+ "InvalidAttributeValue",
+ "Invalid value for the parameter {}.".format(attribute_name),
+ )
+
+
+class InvalidParameterValue(RESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidParameterValue", message)
+
+
+class MissingParameter(RESTError):
+ code = 400
+
+ def __init__(self, parameter):
+ super().__init__(
+ "MissingParameter",
+ "The request must contain the parameter {}.".format(parameter),
+ )
+
+
+class OverLimit(RESTError):
+ code = 403
+
+ def __init__(self, count):
+ super().__init__(
+ "OverLimit", "{} Actions were found, maximum allowed is 7.".format(count)
+ )
diff --git a/contrib/python/moto/py3/moto/sqs/models.py b/contrib/python/moto/py3/moto/sqs/models.py
new file mode 100644
index 0000000000..d92a0400fd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/models.py
@@ -0,0 +1,1100 @@
+import base64
+import hashlib
+import json
+import random
+import re
+import string
+
+import struct
+from copy import deepcopy
+from typing import Dict
+from xml.sax.saxutils import escape
+
+from moto.core.exceptions import RESTError
+from moto.core import BaseBackend, BaseModel, CloudFormationModel
+from moto.core.utils import (
+ camelcase_to_underscores,
+ get_random_message_id,
+ unix_time,
+ unix_time_millis,
+ tags_from_cloudformation_tags_list,
+ BackendDict,
+)
+from moto.utilities.utils import md5_hash
+from .utils import generate_receipt_handle
+from .exceptions import (
+ MessageAttributesInvalid,
+ QueueDoesNotExist,
+ QueueAlreadyExists,
+ ReceiptHandleIsInvalid,
+ InvalidBatchEntryId,
+ BatchRequestTooLong,
+ BatchEntryIdsNotDistinct,
+ TooManyEntriesInBatchRequest,
+ InvalidAttributeName,
+ InvalidParameterValue,
+ MissingParameter,
+ OverLimit,
+ InvalidAttributeValue,
+)
+
+from moto.core import get_account_id
+
+DEFAULT_SENDER_ID = "AIDAIT2UOQQY3AUEKVGXU"
+
+MAXIMUM_MESSAGE_LENGTH = 262144 # 256 KiB
+
+MAXIMUM_MESSAGE_SIZE_ATTR_LOWER_BOUND = 1024
+MAXIMUM_MESSAGE_SIZE_ATTR_UPPER_BOUND = MAXIMUM_MESSAGE_LENGTH
+
+TRANSPORT_TYPE_ENCODINGS = {
+ "String": b"\x01",
+ "Binary": b"\x02",
+ "Number": b"\x01",
+ "String.custom": b"\x01",
+}
+
+STRING_TYPE_FIELD_INDEX = 1
+BINARY_TYPE_FIELD_INDEX = 2
+STRING_LIST_TYPE_FIELD_INDEX = 3
+BINARY_LIST_TYPE_FIELD_INDEX = 4
+
+# Valid attribute name rules can found at
+# https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-metadata.html
+ATTRIBUTE_NAME_PATTERN = re.compile("^([a-z]|[A-Z]|[0-9]|[_.\\-])+$")
+
+DEDUPLICATION_TIME_IN_SECONDS = 300
+
+
+class Message(BaseModel):
+ def __init__(self, message_id, body, system_attributes=None):
+ self.id = message_id
+ self._body = body
+ self.message_attributes = {}
+ self.receipt_handle = None
+ self._old_receipt_handles = []
+ self.sender_id = DEFAULT_SENDER_ID
+ self.sent_timestamp = None
+ self.approximate_first_receive_timestamp = None
+ self.approximate_receive_count = 0
+ self.deduplication_id = None
+ self.group_id = None
+ self.sequence_number = None
+ self.visible_at = 0
+ self.delayed_until = 0
+ self.system_attributes = system_attributes or {}
+
+ @property
+ def body_md5(self):
+ md5 = md5_hash()
+ md5.update(self._body.encode("utf-8"))
+ return md5.hexdigest()
+
+ @property
+ def attribute_md5(self):
+
+ md5 = md5_hash()
+
+ for attrName in sorted(self.message_attributes.keys()):
+ self.validate_attribute_name(attrName)
+ attrValue = self.message_attributes[attrName]
+ # Encode name
+ self.update_binary_length_and_value(md5, self.utf8(attrName))
+ # Encode type
+ self.update_binary_length_and_value(md5, self.utf8(attrValue["data_type"]))
+
+ if attrValue.get("string_value"):
+ md5.update(bytearray([STRING_TYPE_FIELD_INDEX]))
+ self.update_binary_length_and_value(
+ md5, self.utf8(attrValue.get("string_value"))
+ )
+ elif attrValue.get("binary_value"):
+ md5.update(bytearray([BINARY_TYPE_FIELD_INDEX]))
+ decoded_binary_value = base64.b64decode(attrValue.get("binary_value"))
+ self.update_binary_length_and_value(md5, decoded_binary_value)
+ # string_list_value type is not implemented, reserved for the future use.
+ # See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_MessageAttributeValue.html
+ elif len(attrValue["string_list_value"]) > 0:
+ md5.update(bytearray([STRING_LIST_TYPE_FIELD_INDEX]))
+ for strListMember in attrValue["string_list_value"]:
+ self.update_binary_length_and_value(md5, self.utf8(strListMember))
+ # binary_list_value type is not implemented, reserved for the future use.
+ # See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_MessageAttributeValue.html
+ elif len(attrValue["binary_list_value"]) > 0:
+ md5.update(bytearray([BINARY_LIST_TYPE_FIELD_INDEX]))
+ for strListMember in attrValue["binary_list_value"]:
+ decoded_binary_value = base64.b64decode(strListMember)
+ self.update_binary_length_and_value(md5, decoded_binary_value)
+
+ return md5.hexdigest()
+
+ @staticmethod
+ def update_binary_length_and_value(md5, value):
+ length_bytes = struct.pack("!I".encode("ascii"), len(value))
+ md5.update(length_bytes)
+ md5.update(value)
+
+ @staticmethod
+ def validate_attribute_name(name):
+ if not ATTRIBUTE_NAME_PATTERN.match(name):
+ raise MessageAttributesInvalid(
+ "The message attribute name '{0}' is invalid. "
+ "Attribute name can contain A-Z, a-z, 0-9, "
+ "underscore (_), hyphen (-), and period (.) characters.".format(name)
+ )
+
+ @staticmethod
+ def utf8(string):
+ if isinstance(string, str):
+ return string.encode("utf-8")
+ return string
+
+ @property
+ def body(self):
+ return escape(self._body).replace('"', "&quot;").replace("\r", "&#xD;")
+
+ def mark_sent(self, delay_seconds=None):
+ self.sent_timestamp = int(unix_time_millis())
+ if delay_seconds:
+ self.delay(delay_seconds=delay_seconds)
+
+ def mark_received(self, visibility_timeout=None):
+ """
+ When a message is received we will set the first receive timestamp,
+ tap the ``approximate_receive_count`` and the ``visible_at`` time.
+ """
+ if visibility_timeout:
+ visibility_timeout = int(visibility_timeout)
+ else:
+ visibility_timeout = 0
+
+ if not self.approximate_first_receive_timestamp:
+ self.approximate_first_receive_timestamp = int(unix_time_millis())
+
+ self.approximate_receive_count += 1
+
+ # Make message visible again in the future unless its
+ # destroyed.
+ if visibility_timeout:
+ self.change_visibility(visibility_timeout)
+
+ self._old_receipt_handles.append(self.receipt_handle)
+ self.receipt_handle = generate_receipt_handle()
+
+ def change_visibility(self, visibility_timeout):
+ # We're dealing with milliseconds internally
+ visibility_timeout_msec = int(visibility_timeout) * 1000
+ self.visible_at = unix_time_millis() + visibility_timeout_msec
+
+ def delay(self, delay_seconds):
+ delay_msec = int(delay_seconds) * 1000
+ self.delayed_until = unix_time_millis() + delay_msec
+
+ @property
+ def visible(self):
+ current_time = unix_time_millis()
+ if current_time > self.visible_at:
+ return True
+ return False
+
+ @property
+ def delayed(self):
+ current_time = unix_time_millis()
+ if current_time < self.delayed_until:
+ return True
+ return False
+
+ @property
+ def all_receipt_handles(self):
+ return [self.receipt_handle] + self._old_receipt_handles
+
+ def had_receipt_handle(self, receipt_handle):
+ """
+ Check if this message ever had this receipt_handle in the past
+ """
+ return receipt_handle in self.all_receipt_handles
+
+
+class Queue(CloudFormationModel):
+ BASE_ATTRIBUTES = [
+ "ApproximateNumberOfMessages",
+ "ApproximateNumberOfMessagesDelayed",
+ "ApproximateNumberOfMessagesNotVisible",
+ "CreatedTimestamp",
+ "DelaySeconds",
+ "LastModifiedTimestamp",
+ "MaximumMessageSize",
+ "MessageRetentionPeriod",
+ "QueueArn",
+ "Policy",
+ "RedrivePolicy",
+ "ReceiveMessageWaitTimeSeconds",
+ "VisibilityTimeout",
+ ]
+ FIFO_ATTRIBUTES = [
+ "ContentBasedDeduplication",
+ "DeduplicationScope",
+ "FifoQueue",
+ "FifoThroughputLimit",
+ ]
+ KMS_ATTRIBUTES = ["KmsDataKeyReusePeriodSeconds", "KmsMasterKeyId"]
+ ALLOWED_PERMISSIONS = (
+ "*",
+ "ChangeMessageVisibility",
+ "DeleteMessage",
+ "GetQueueAttributes",
+ "GetQueueUrl",
+ "ListDeadLetterSourceQueues",
+ "PurgeQueue",
+ "ReceiveMessage",
+ "SendMessage",
+ )
+
+ def __init__(self, name, region, **kwargs):
+ self.name = name
+ self.region = region
+ self.tags = {}
+ self.permissions = {}
+
+ self._messages = []
+ self._pending_messages = set()
+ self.deleted_messages = set()
+
+ now = unix_time()
+ self.created_timestamp = now
+ self.queue_arn = "arn:aws:sqs:{0}:{1}:{2}".format(
+ self.region, get_account_id(), self.name
+ )
+ self.dead_letter_queue = None
+
+ self.lambda_event_source_mappings = {}
+
+ # default settings for a non fifo queue
+ defaults = {
+ "ContentBasedDeduplication": "false",
+ "DeduplicationScope": "queue",
+ "DelaySeconds": 0,
+ "FifoQueue": "false",
+ "FifoThroughputLimit": "perQueue",
+ "KmsDataKeyReusePeriodSeconds": 300, # five minutes
+ "KmsMasterKeyId": None,
+ "MaximumMessageSize": MAXIMUM_MESSAGE_LENGTH,
+ "MessageRetentionPeriod": 86400 * 4, # four days
+ "Policy": None,
+ "ReceiveMessageWaitTimeSeconds": 0,
+ "RedrivePolicy": None,
+ "VisibilityTimeout": 30,
+ }
+
+ defaults.update(kwargs)
+ self._set_attributes(defaults, now)
+
+ # Check some conditions
+ if self.fifo_queue and not self.name.endswith(".fifo"):
+ raise InvalidParameterValue("Queue name must end in .fifo for FIFO queues")
+ if (
+ self.maximum_message_size < MAXIMUM_MESSAGE_SIZE_ATTR_LOWER_BOUND
+ or self.maximum_message_size > MAXIMUM_MESSAGE_SIZE_ATTR_UPPER_BOUND
+ ):
+ raise InvalidAttributeValue("MaximumMessageSize")
+
+ @property
+ def pending_messages(self):
+ return self._pending_messages
+
+ @property
+ def pending_message_groups(self):
+ return set(
+ message.group_id
+ for message in self._pending_messages
+ if message.group_id is not None
+ )
+
+ def _set_attributes(self, attributes, now=None):
+ if not now:
+ now = unix_time()
+
+ integer_fields = (
+ "DelaySeconds",
+ "KmsDataKeyreusePeriodSeconds",
+ "MaximumMessageSize",
+ "MessageRetentionPeriod",
+ "ReceiveMessageWaitTime",
+ "VisibilityTimeout",
+ )
+ bool_fields = ("ContentBasedDeduplication", "FifoQueue")
+
+ for key, value in attributes.items():
+ if key in integer_fields:
+ value = int(value)
+ if key in bool_fields:
+ value = str(value).lower() == "true"
+
+ if key in ["Policy", "RedrivePolicy"] and value is not None:
+ continue
+
+ setattr(self, camelcase_to_underscores(key), value)
+
+ if attributes.get("RedrivePolicy", None) is not None:
+ self._setup_dlq(attributes["RedrivePolicy"])
+
+ self.policy = attributes.get("Policy")
+
+ self.last_modified_timestamp = now
+
+ @staticmethod
+ def _is_empty_redrive_policy(policy):
+ if isinstance(policy, str):
+ if policy == "" or len(json.loads(policy)) == 0:
+ return True
+ elif isinstance(policy, dict) and len(policy) == 0:
+ return True
+
+ return False
+
+ def _setup_dlq(self, policy):
+ if Queue._is_empty_redrive_policy(policy):
+ self.redrive_policy = None
+ self.dead_letter_queue = None
+ return
+
+ if isinstance(policy, str):
+ try:
+ self.redrive_policy = json.loads(policy)
+ except ValueError:
+ raise RESTError(
+ "InvalidParameterValue",
+ "Redrive policy is not a dict or valid json",
+ )
+ elif isinstance(policy, dict):
+ self.redrive_policy = policy
+ else:
+ raise RESTError(
+ "InvalidParameterValue", "Redrive policy is not a dict or valid json"
+ )
+
+ if "deadLetterTargetArn" not in self.redrive_policy:
+ raise RESTError(
+ "InvalidParameterValue",
+ "Redrive policy does not contain deadLetterTargetArn",
+ )
+ if "maxReceiveCount" not in self.redrive_policy:
+ raise RESTError(
+ "InvalidParameterValue",
+ "Redrive policy does not contain maxReceiveCount",
+ )
+
+ # 'maxReceiveCount' is stored as int
+ self.redrive_policy["maxReceiveCount"] = int(
+ self.redrive_policy["maxReceiveCount"]
+ )
+
+ for queue in sqs_backends[self.region].queues.values():
+ if queue.queue_arn == self.redrive_policy["deadLetterTargetArn"]:
+ self.dead_letter_queue = queue
+
+ if self.fifo_queue and not queue.fifo_queue:
+ raise RESTError(
+ "InvalidParameterCombination",
+ "Fifo queues cannot use non fifo dead letter queues",
+ )
+ break
+ else:
+ raise RESTError(
+ "AWS.SimpleQueueService.NonExistentQueue",
+ "Could not find DLQ for {0}".format(
+ self.redrive_policy["deadLetterTargetArn"]
+ ),
+ )
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "QueueName"
+
+ @staticmethod
+ def cloudformation_type():
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html
+ return "AWS::SQS::Queue"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = deepcopy(cloudformation_json["Properties"])
+ # remove Tags from properties and convert tags list to dict
+ tags = properties.pop("Tags", [])
+ tags_dict = tags_from_cloudformation_tags_list(tags)
+
+ # Could be passed as an integer - just treat it as a string
+ resource_name = str(resource_name)
+
+ sqs_backend = sqs_backends[region_name]
+ return sqs_backend.create_queue(
+ name=resource_name, tags=tags_dict, region=region_name, **properties
+ )
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json["Properties"]
+ queue_name = original_resource.name
+
+ sqs_backend = sqs_backends[region_name]
+ queue = sqs_backend.get_queue(queue_name)
+ if "VisibilityTimeout" in properties:
+ queue.visibility_timeout = int(properties["VisibilityTimeout"])
+
+ if "ReceiveMessageWaitTimeSeconds" in properties:
+ queue.receive_message_wait_time_seconds = int(
+ properties["ReceiveMessageWaitTimeSeconds"]
+ )
+ return queue
+
+ @classmethod
+ def delete_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name
+ ):
+ # ResourceName will be the full queue URL - we only need the name
+ # https://sqs.us-west-1.amazonaws.com/123456789012/queue_name
+ queue_name = resource_name.split("/")[-1]
+ sqs_backend = sqs_backends[region_name]
+ sqs_backend.delete_queue(queue_name)
+
+ @property
+ def approximate_number_of_messages_delayed(self):
+ return len([m for m in self._messages if m.delayed])
+
+ @property
+ def approximate_number_of_messages_not_visible(self):
+ return len([m for m in self._messages if not m.visible])
+
+ @property
+ def approximate_number_of_messages(self):
+ return len(self.messages)
+
+ @property
+ def physical_resource_id(self):
+ return f"https://sqs.{self.region}.amazonaws.com/{get_account_id()}/{self.name}"
+
+ @property
+ def attributes(self):
+ result = {}
+
+ for attribute in self.BASE_ATTRIBUTES:
+ attr = getattr(self, camelcase_to_underscores(attribute))
+ result[attribute] = attr
+
+ if self.fifo_queue:
+ for attribute in self.FIFO_ATTRIBUTES:
+ attr = getattr(self, camelcase_to_underscores(attribute))
+ result[attribute] = attr
+
+ if self.kms_master_key_id:
+ for attribute in self.KMS_ATTRIBUTES:
+ attr = getattr(self, camelcase_to_underscores(attribute))
+ result[attribute] = attr
+
+ if self.policy:
+ result["Policy"] = self.policy
+
+ if self.redrive_policy:
+ result["RedrivePolicy"] = json.dumps(self.redrive_policy)
+
+ for key in result:
+ if isinstance(result[key], bool):
+ result[key] = str(result[key]).lower()
+
+ return result
+
+ def url(self, request_url):
+ return "{0}://{1}/{2}/{3}".format(
+ request_url.scheme, request_url.netloc, get_account_id(), self.name
+ )
+
+ @property
+ def messages(self):
+ # TODO: This can become very inefficient if a large number of messages are in-flight
+ return [
+ message
+ for message in self._messages
+ if message.visible and not message.delayed
+ ]
+
+ def add_message(self, message):
+ if (
+ self.fifo_queue
+ and self.attributes.get("ContentBasedDeduplication") == "true"
+ ):
+ for m in self._messages:
+ if m.deduplication_id == message.deduplication_id:
+ diff = message.sent_timestamp - m.sent_timestamp
+ # if a duplicate message is received within the deduplication time then it should
+ # not be added to the queue
+ if diff / 1000 < DEDUPLICATION_TIME_IN_SECONDS:
+ return
+
+ self._messages.append(message)
+
+ for arn, esm in self.lambda_event_source_mappings.items():
+ backend = sqs_backends[self.region]
+
+ """
+ Lambda polls the queue and invokes your function synchronously with an event
+ that contains queue messages. Lambda reads messages in batches and invokes
+ your function once for each batch. When your function successfully processes
+ a batch, Lambda deletes its messages from the queue.
+ """
+ messages = backend.receive_message(
+ self.name,
+ esm.batch_size,
+ self.receive_message_wait_time_seconds,
+ self.visibility_timeout,
+ )
+
+ from moto.awslambda import lambda_backends
+
+ result = lambda_backends[self.region].send_sqs_batch(
+ arn, messages, self.queue_arn
+ )
+
+ if result:
+ [backend.delete_message(self.name, m.receipt_handle) for m in messages]
+ else:
+ # Make messages visible again
+ [
+ backend.change_message_visibility(
+ self.name, m.receipt_handle, visibility_timeout=0
+ )
+ for m in messages
+ ]
+
+ def delete_message(self, receipt_handle):
+ if receipt_handle in self.deleted_messages:
+ # Already deleted - gracefully handle deleting it again
+ return
+
+ if not any(
+ message.had_receipt_handle(receipt_handle) for message in self._messages
+ ):
+ raise ReceiptHandleIsInvalid()
+
+ # Delete message from queue regardless of pending state
+ new_messages = []
+ for message in self._messages:
+ if message.had_receipt_handle(receipt_handle):
+ self.pending_messages.discard(message)
+ self.deleted_messages.update(message.all_receipt_handles)
+ continue
+ new_messages.append(message)
+ self._messages = new_messages
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in ["Arn", "QueueName"]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Arn":
+ return self.queue_arn
+ elif attribute_name == "QueueName":
+ return self.name
+ raise UnformattedGetAttTemplateException()
+
+ @property
+ def policy(self):
+ if self._policy_json.get("Statement"):
+ return json.dumps(self._policy_json)
+ else:
+ return None
+
+ @policy.setter
+ def policy(self, policy):
+ if policy:
+ self._policy_json = json.loads(policy)
+ else:
+ self._policy_json = {
+ "Version": "2012-10-17",
+ "Id": "{}/SQSDefaultPolicy".format(self.queue_arn),
+ "Statement": [],
+ }
+
+
+def _filter_message_attributes(message, input_message_attributes):
+ filtered_message_attributes = {}
+ return_all = "All" in input_message_attributes
+ for key, value in message.message_attributes.items():
+ if return_all or key in input_message_attributes:
+ filtered_message_attributes[key] = value
+ message.message_attributes = filtered_message_attributes
+
+
+class SQSBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.queues: Dict[str, Queue] = {}
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "sqs"
+ )
+
+ def create_queue(self, name, tags=None, **kwargs):
+ queue = self.queues.get(name)
+ if queue:
+ try:
+ kwargs.pop("region")
+ except KeyError:
+ pass
+
+ new_queue = Queue(name, region=self.region_name, **kwargs)
+
+ queue_attributes = queue.attributes
+ new_queue_attributes = new_queue.attributes
+
+ # only the attributes which are being sent for the queue
+ # creation have to be compared if the queue is existing.
+ for key in kwargs:
+ if queue_attributes.get(key) != new_queue_attributes.get(key):
+ raise QueueAlreadyExists("The specified queue already exists.")
+ else:
+ try:
+ kwargs.pop("region")
+ except KeyError:
+ pass
+ queue = Queue(name, region=self.region_name, **kwargs)
+ self.queues[name] = queue
+
+ if tags:
+ queue.tags = tags
+
+ return queue
+
+ def get_queue_url(self, queue_name):
+ return self.get_queue(queue_name)
+
+ def list_queues(self, queue_name_prefix):
+ re_str = ".*"
+ if queue_name_prefix:
+ re_str = "^{0}.*".format(queue_name_prefix)
+ prefix_re = re.compile(re_str)
+ qs = []
+ for name, q in self.queues.items():
+ if prefix_re.search(name):
+ qs.append(q)
+ return qs[:1000]
+
+ def get_queue(self, queue_name):
+ queue = self.queues.get(queue_name)
+ if queue is None:
+ raise QueueDoesNotExist()
+ return queue
+
+ def delete_queue(self, queue_name):
+ self.get_queue(queue_name)
+
+ del self.queues[queue_name]
+
+ def get_queue_attributes(self, queue_name, attribute_names):
+ queue = self.get_queue(queue_name)
+ if not attribute_names:
+ return {}
+
+ valid_names = (
+ ["All"]
+ + queue.BASE_ATTRIBUTES
+ + queue.FIFO_ATTRIBUTES
+ + queue.KMS_ATTRIBUTES
+ )
+ invalid_name = next(
+ (name for name in attribute_names if name not in valid_names), None
+ )
+
+ if invalid_name or invalid_name == "":
+ raise InvalidAttributeName(invalid_name)
+
+ attributes = {}
+
+ if "All" in attribute_names:
+ attributes = queue.attributes
+ else:
+ for name in (name for name in attribute_names if name in queue.attributes):
+ if queue.attributes.get(name) is not None:
+ attributes[name] = queue.attributes.get(name)
+
+ return attributes
+
+ def set_queue_attributes(self, queue_name, attributes):
+ queue = self.get_queue(queue_name)
+ queue._set_attributes(attributes)
+ return queue
+
+ def send_message(
+ self,
+ queue_name,
+ message_body,
+ message_attributes=None,
+ delay_seconds=None,
+ deduplication_id=None,
+ group_id=None,
+ system_attributes=None,
+ ):
+
+ queue = self.get_queue(queue_name)
+
+ if len(message_body) > queue.maximum_message_size:
+ msg = "One or more parameters are invalid. Reason: Message must be shorter than {} bytes.".format(
+ queue.maximum_message_size
+ )
+ raise InvalidParameterValue(msg)
+
+ if delay_seconds:
+ delay_seconds = int(delay_seconds)
+ else:
+ delay_seconds = queue.delay_seconds
+
+ message_id = get_random_message_id()
+ message = Message(message_id, message_body, system_attributes)
+
+ # if content based deduplication is set then set sha256 hash of the message
+ # as the deduplication_id
+ if queue.attributes.get("ContentBasedDeduplication") == "true":
+ sha256 = hashlib.sha256()
+ sha256.update(message_body.encode("utf-8"))
+ message.deduplication_id = sha256.hexdigest()
+
+ # Attributes, but not *message* attributes
+ if deduplication_id is not None:
+ message.deduplication_id = deduplication_id
+ message.sequence_number = "".join(
+ random.choice(string.digits) for _ in range(20)
+ )
+
+ if group_id is None:
+ # MessageGroupId is a mandatory parameter for all
+ # messages in a fifo queue
+ if queue.fifo_queue:
+ raise MissingParameter("MessageGroupId")
+ else:
+ if not queue.fifo_queue:
+ msg = (
+ "Value {} for parameter MessageGroupId is invalid. "
+ "Reason: The request include parameter that is not valid for this queue type."
+ ).format(group_id)
+ raise InvalidParameterValue(msg)
+ message.group_id = group_id
+
+ if message_attributes:
+ message.message_attributes = message_attributes
+
+ message.mark_sent(delay_seconds=delay_seconds)
+
+ queue.add_message(message)
+
+ return message
+
+ def send_message_batch(self, queue_name, entries):
+ self.get_queue(queue_name)
+
+ if any(
+ not re.match(r"^[\w-]{1,80}$", entry["Id"]) for entry in entries.values()
+ ):
+ raise InvalidBatchEntryId()
+
+ body_length = next(
+ (
+ len(entry["MessageBody"])
+ for entry in entries.values()
+ if len(entry["MessageBody"]) > MAXIMUM_MESSAGE_LENGTH
+ ),
+ False,
+ )
+ if body_length:
+ raise BatchRequestTooLong(body_length)
+
+ duplicate_id = self._get_first_duplicate_id(
+ [entry["Id"] for entry in entries.values()]
+ )
+ if duplicate_id:
+ raise BatchEntryIdsNotDistinct(duplicate_id)
+
+ if len(entries) > 10:
+ raise TooManyEntriesInBatchRequest(len(entries))
+
+ messages = []
+ for entry in entries.values():
+ # Loop through looking for messages
+ message = self.send_message(
+ queue_name,
+ entry["MessageBody"],
+ message_attributes=entry["MessageAttributes"],
+ delay_seconds=entry["DelaySeconds"],
+ group_id=entry.get("MessageGroupId"),
+ deduplication_id=entry.get("MessageDeduplicationId"),
+ )
+ message.user_id = entry["Id"]
+
+ messages.append(message)
+
+ return messages
+
+ def _get_first_duplicate_id(self, ids):
+ unique_ids = set()
+ for _id in ids:
+ if _id in unique_ids:
+ return _id
+ unique_ids.add(_id)
+ return None
+
+ def receive_message(
+ self,
+ queue_name,
+ count,
+ wait_seconds_timeout,
+ visibility_timeout,
+ message_attribute_names=None,
+ ):
+ # Attempt to retrieve visible messages from a queue.
+
+ # If a message was read by client and not deleted it is considered to be
+ # "inflight" and cannot be read. We make attempts to obtain ``count``
+ # messages but we may return less if messages are in-flight or there
+ # are simple not enough messages in the queue.
+
+ if message_attribute_names is None:
+ message_attribute_names = []
+ queue = self.get_queue(queue_name)
+ result = []
+ previous_result_count = len(result)
+
+ polling_end = unix_time() + wait_seconds_timeout
+ currently_pending_groups = deepcopy(queue.pending_message_groups)
+
+ # queue.messages only contains visible messages
+ while True:
+
+ if result or (wait_seconds_timeout and unix_time() > polling_end):
+ break
+
+ messages_to_dlq = []
+
+ for message in queue.messages:
+ if not message.visible:
+ continue
+
+ if message in queue.pending_messages:
+ # The message is pending but is visible again, so the
+ # consumer must have timed out.
+ queue.pending_messages.remove(message)
+ currently_pending_groups = deepcopy(queue.pending_message_groups)
+
+ if message.group_id and queue.fifo_queue:
+ if message.group_id in currently_pending_groups:
+ # A previous call is still processing messages in this group, so we cannot deliver this one.
+ continue
+
+ if (
+ queue.dead_letter_queue is not None
+ and queue.redrive_policy
+ and message.approximate_receive_count
+ >= queue.redrive_policy["maxReceiveCount"]
+ ):
+ messages_to_dlq.append(message)
+ continue
+
+ queue.pending_messages.add(message)
+ message.mark_received(visibility_timeout=visibility_timeout)
+ # Create deepcopy to not mutate the message state when filtering for attributes
+ message_copy = deepcopy(message)
+ _filter_message_attributes(message_copy, message_attribute_names)
+ if not self.is_message_valid_based_on_retention_period(
+ queue_name, message
+ ):
+ break
+ result.append(message_copy)
+ if len(result) >= count:
+ break
+
+ for message in messages_to_dlq:
+ queue._messages.remove(message)
+ queue.dead_letter_queue.add_message(message)
+
+ if previous_result_count == len(result):
+ if wait_seconds_timeout == 0:
+ # There is timeout and we have added no additional results,
+ # so break to avoid an infinite loop.
+ break
+
+ import time
+
+ time.sleep(0.01)
+ continue
+
+ previous_result_count = len(result)
+
+ return result
+
+ def delete_message(self, queue_name, receipt_handle):
+ queue = self.get_queue(queue_name)
+
+ queue.delete_message(receipt_handle)
+
+ def change_message_visibility(self, queue_name, receipt_handle, visibility_timeout):
+ queue = self.get_queue(queue_name)
+ for message in queue._messages:
+ if message.had_receipt_handle(receipt_handle):
+
+ visibility_timeout_msec = int(visibility_timeout) * 1000
+ given_visibility_timeout = unix_time_millis() + visibility_timeout_msec
+ if given_visibility_timeout - message.sent_timestamp > 43200 * 1000:
+ raise InvalidParameterValue(
+ "Value {0} for parameter VisibilityTimeout is invalid. Reason: Total "
+ "VisibilityTimeout for the message is beyond the limit [43200 seconds]".format(
+ visibility_timeout
+ )
+ )
+
+ message.change_visibility(visibility_timeout)
+ if message.visible and message in queue.pending_messages:
+ # If the message is visible again, remove it from pending
+ # messages.
+ queue.pending_messages.remove(message)
+ return
+ raise ReceiptHandleIsInvalid
+
+ def purge_queue(self, queue_name):
+ queue = self.get_queue(queue_name)
+ queue._messages = []
+ queue._pending_messages = set()
+
+ def list_dead_letter_source_queues(self, queue_name):
+ dlq = self.get_queue(queue_name)
+
+ queues = []
+ for queue in self.queues.values():
+ if queue.dead_letter_queue is dlq:
+ queues.append(queue)
+
+ return queues
+
+ def add_permission(self, queue_name, actions, account_ids, label):
+ queue = self.get_queue(queue_name)
+
+ if not actions:
+ raise MissingParameter("Actions")
+
+ if not account_ids:
+ raise InvalidParameterValue(
+ "Value [] for parameter PrincipalId is invalid. Reason: Unable to verify."
+ )
+
+ count = len(actions)
+ if count > 7:
+ raise OverLimit(count)
+
+ invalid_action = next(
+ (action for action in actions if action not in Queue.ALLOWED_PERMISSIONS),
+ None,
+ )
+ if invalid_action:
+ raise InvalidParameterValue(
+ "Value SQS:{} for parameter ActionName is invalid. "
+ "Reason: Only the queue owner is allowed to invoke this action.".format(
+ invalid_action
+ )
+ )
+
+ policy = queue._policy_json
+ statement = next(
+ (
+ statement
+ for statement in policy["Statement"]
+ if statement["Sid"] == label
+ ),
+ None,
+ )
+ if statement:
+ raise InvalidParameterValue(
+ "Value {} for parameter Label is invalid. "
+ "Reason: Already exists.".format(label)
+ )
+
+ principals = [
+ "arn:aws:iam::{}:root".format(account_id) for account_id in account_ids
+ ]
+ actions = ["SQS:{}".format(action) for action in actions]
+
+ statement = {
+ "Sid": label,
+ "Effect": "Allow",
+ "Principal": {"AWS": principals[0] if len(principals) == 1 else principals},
+ "Action": actions[0] if len(actions) == 1 else actions,
+ "Resource": queue.queue_arn,
+ }
+
+ queue._policy_json["Statement"].append(statement)
+
+ def remove_permission(self, queue_name, label):
+ queue = self.get_queue(queue_name)
+
+ statements = queue._policy_json["Statement"]
+ statements_new = [
+ statement for statement in statements if statement["Sid"] != label
+ ]
+
+ if len(statements) == len(statements_new):
+ raise InvalidParameterValue(
+ "Value {} for parameter Label is invalid. "
+ "Reason: can't find label on existing policy.".format(label)
+ )
+
+ queue._policy_json["Statement"] = statements_new
+
+ def tag_queue(self, queue_name, tags):
+ queue = self.get_queue(queue_name)
+
+ if not len(tags):
+ raise MissingParameter("Tags")
+
+ if len(tags) > 50:
+ raise InvalidParameterValue(
+ "Too many tags added for queue {}.".format(queue_name)
+ )
+
+ queue.tags.update(tags)
+
+ def untag_queue(self, queue_name, tag_keys):
+ queue = self.get_queue(queue_name)
+
+ if not len(tag_keys):
+ raise RESTError(
+ "InvalidParameterValue",
+ "Tag keys must be between 1 and 128 characters in length.",
+ )
+
+ for key in tag_keys:
+ try:
+ del queue.tags[key]
+ except KeyError:
+ pass
+
+ def list_queue_tags(self, queue_name):
+ return self.get_queue(queue_name)
+
+ def is_message_valid_based_on_retention_period(self, queue_name, message):
+ message_attributes = self.get_queue_attributes(
+ queue_name, ["MessageRetentionPeriod"]
+ )
+ retain_until = (
+ message_attributes.get("MessageRetentionPeriod")
+ + message.sent_timestamp / 1000
+ )
+ if retain_until <= unix_time():
+ return False
+ return True
+
+
+sqs_backends = BackendDict(SQSBackend, "sqs")
diff --git a/contrib/python/moto/py3/moto/sqs/responses.py b/contrib/python/moto/py3/moto/sqs/responses.py
new file mode 100644
index 0000000000..c6dea26019
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/responses.py
@@ -0,0 +1,821 @@
+import re
+
+from moto.core.exceptions import RESTError
+from moto.core.responses import BaseResponse
+from moto.core.utils import (
+ amz_crc32,
+ amzn_request_id,
+ underscores_to_camelcase,
+ camelcase_to_pascal,
+)
+from urllib.parse import urlparse
+
+from .exceptions import (
+ EmptyBatchRequest,
+ InvalidAttributeName,
+ ReceiptHandleIsInvalid,
+ BatchEntryIdsNotDistinct,
+)
+from .models import sqs_backends
+from .utils import parse_message_attributes, extract_input_message_attributes
+
+MAXIMUM_VISIBILTY_TIMEOUT = 43200
+MAXIMUM_MESSAGE_LENGTH = 262144 # 256 KiB
+DEFAULT_RECEIVED_MESSAGES = 1
+
+
+class SQSResponse(BaseResponse):
+
+ region_regex = re.compile(r"://(.+?)\.queue\.amazonaws\.com")
+
+ @property
+ def sqs_backend(self):
+ return sqs_backends[self.region]
+
+ @property
+ def attribute(self):
+ if not hasattr(self, "_attribute"):
+ self._attribute = self._get_map_prefix(
+ "Attribute", key_end=".Name", value_end=".Value"
+ )
+ return self._attribute
+
+ @property
+ def tags(self):
+ if not hasattr(self, "_tags"):
+ self._tags = self._get_map_prefix("Tag", key_end=".Key", value_end=".Value")
+ return self._tags
+
+ def _get_queue_name(self):
+ try:
+ queue_url = self.querystring.get("QueueUrl")[0]
+ if queue_url.startswith("http://") or queue_url.startswith("https://"):
+ return queue_url.split("/")[-1]
+ else:
+ # The parameter could be the name itself, which AWS also accepts
+ return queue_url
+ except TypeError:
+ # Fallback to reading from the URL for botocore
+ return self.path.split("/")[-1]
+
+ def _get_validated_visibility_timeout(self, timeout=None):
+ """
+ :raises ValueError: If specified visibility timeout exceeds MAXIMUM_VISIBILTY_TIMEOUT
+ :raises TypeError: If visibility timeout was not specified
+ """
+ if timeout is not None:
+ visibility_timeout = int(timeout)
+ else:
+ visibility_timeout = int(self.querystring.get("VisibilityTimeout")[0])
+
+ if visibility_timeout > MAXIMUM_VISIBILTY_TIMEOUT:
+ raise ValueError
+
+ return visibility_timeout
+
+ @amz_crc32 # crc last as request_id can edit XML
+ @amzn_request_id
+ def call_action(self):
+ status_code, headers, body = super().call_action()
+ if status_code == 404:
+ queue_name = self.querystring.get("QueueName", [""])[0]
+ template = self.response_template(ERROR_INEXISTENT_QUEUE)
+ response = template.render(queue_name=queue_name)
+ return 404, headers, response
+ return status_code, headers, body
+
+ def _error(self, code, message, status=400):
+ template = self.response_template(ERROR_TEMPLATE)
+ return template.render(code=code, message=message), dict(status=status)
+
+ def create_queue(self):
+ request_url = urlparse(self.uri)
+ queue_name = self._get_param("QueueName")
+
+ queue = self.sqs_backend.create_queue(queue_name, self.tags, **self.attribute)
+
+ template = self.response_template(CREATE_QUEUE_RESPONSE)
+ return template.render(queue_url=queue.url(request_url))
+
+ def get_queue_url(self):
+ request_url = urlparse(self.uri)
+ queue_name = self._get_param("QueueName")
+
+ queue = self.sqs_backend.get_queue_url(queue_name)
+
+ template = self.response_template(GET_QUEUE_URL_RESPONSE)
+ return template.render(queue_url=queue.url(request_url))
+
+ def list_queues(self):
+ request_url = urlparse(self.uri)
+ queue_name_prefix = self._get_param("QueueNamePrefix")
+ queues = self.sqs_backend.list_queues(queue_name_prefix)
+ template = self.response_template(LIST_QUEUES_RESPONSE)
+ return template.render(queues=queues, request_url=request_url)
+
+ def change_message_visibility(self):
+ queue_name = self._get_queue_name()
+ receipt_handle = self._get_param("ReceiptHandle")
+
+ try:
+ visibility_timeout = self._get_validated_visibility_timeout()
+ except ValueError:
+ return ERROR_MAX_VISIBILITY_TIMEOUT_RESPONSE, dict(status=400)
+
+ self.sqs_backend.change_message_visibility(
+ queue_name=queue_name,
+ receipt_handle=receipt_handle,
+ visibility_timeout=visibility_timeout,
+ )
+
+ template = self.response_template(CHANGE_MESSAGE_VISIBILITY_RESPONSE)
+ return template.render()
+
+ def change_message_visibility_batch(self):
+ queue_name = self._get_queue_name()
+ entries = self._get_list_prefix("ChangeMessageVisibilityBatchRequestEntry")
+
+ success = []
+ error = []
+ for entry in entries:
+ try:
+ visibility_timeout = self._get_validated_visibility_timeout(
+ entry["visibility_timeout"]
+ )
+ except ValueError:
+ error.append(
+ {
+ "Id": entry["id"],
+ "SenderFault": "true",
+ "Code": "InvalidParameterValue",
+ "Message": "Visibility timeout invalid",
+ }
+ )
+ continue
+
+ try:
+ self.sqs_backend.change_message_visibility(
+ queue_name=queue_name,
+ receipt_handle=entry["receipt_handle"],
+ visibility_timeout=visibility_timeout,
+ )
+ success.append(entry["id"])
+ except ReceiptHandleIsInvalid as e:
+ error.append(
+ {
+ "Id": entry["id"],
+ "SenderFault": "true",
+ "Code": "ReceiptHandleIsInvalid",
+ "Message": e.description,
+ }
+ )
+
+ template = self.response_template(CHANGE_MESSAGE_VISIBILITY_BATCH_RESPONSE)
+ return template.render(success=success, errors=error)
+
+ def get_queue_attributes(self):
+ queue_name = self._get_queue_name()
+
+ if self.querystring.get("AttributeNames"):
+ raise InvalidAttributeName("")
+
+ attribute_names = self._get_multi_param("AttributeName")
+
+ # if connecting to AWS via boto, then 'AttributeName' is just a normal parameter
+ if not attribute_names:
+ attribute_names = self.querystring.get("AttributeName")
+
+ attributes = self.sqs_backend.get_queue_attributes(queue_name, attribute_names)
+
+ template = self.response_template(GET_QUEUE_ATTRIBUTES_RESPONSE)
+ return template.render(attributes=attributes)
+
+ def set_queue_attributes(self):
+ # TODO validate self.get_param('QueueUrl')
+ attribute = self.attribute
+
+ # Fixes issue with Policy set to empty str
+ attribute_names = self._get_multi_param("Attribute")
+ if attribute_names:
+ for attr in attribute_names:
+ if attr["Name"] == "Policy" and len(attr["Value"]) == 0:
+ attribute = {attr["Name"]: None}
+
+ queue_name = self._get_queue_name()
+ self.sqs_backend.set_queue_attributes(queue_name, attribute)
+
+ return SET_QUEUE_ATTRIBUTE_RESPONSE
+
+ def delete_queue(self):
+ # TODO validate self.get_param('QueueUrl')
+ queue_name = self._get_queue_name()
+
+ self.sqs_backend.delete_queue(queue_name)
+
+ template = self.response_template(DELETE_QUEUE_RESPONSE)
+ return template.render()
+
+ def send_message(self):
+ message = self._get_param("MessageBody")
+ delay_seconds = int(self._get_param("DelaySeconds", 0))
+ message_group_id = self._get_param("MessageGroupId")
+ message_dedupe_id = self._get_param("MessageDeduplicationId")
+
+ if len(message) > MAXIMUM_MESSAGE_LENGTH:
+ return ERROR_TOO_LONG_RESPONSE, dict(status=400)
+
+ message_attributes = parse_message_attributes(self.querystring)
+ system_message_attributes = parse_message_attributes(
+ self.querystring, key="MessageSystemAttribute"
+ )
+
+ queue_name = self._get_queue_name()
+
+ try:
+ message = self.sqs_backend.send_message(
+ queue_name,
+ message,
+ message_attributes=message_attributes,
+ delay_seconds=delay_seconds,
+ deduplication_id=message_dedupe_id,
+ group_id=message_group_id,
+ system_attributes=system_message_attributes,
+ )
+ except RESTError as err:
+ return self._error(err.error_type, err.message)
+
+ template = self.response_template(SEND_MESSAGE_RESPONSE)
+ return template.render(message=message, message_attributes=message_attributes)
+
+ def send_message_batch(self):
+ """
+ The querystring comes like this
+
+ 'SendMessageBatchRequestEntry.1.DelaySeconds': ['0'],
+ 'SendMessageBatchRequestEntry.1.MessageBody': ['test message 1'],
+ 'SendMessageBatchRequestEntry.1.Id': ['6d0f122d-4b13-da2c-378f-e74244d8ad11']
+ 'SendMessageBatchRequestEntry.2.Id': ['ff8cbf59-70a2-c1cb-44c7-b7469f1ba390'],
+ 'SendMessageBatchRequestEntry.2.MessageBody': ['test message 2'],
+ 'SendMessageBatchRequestEntry.2.DelaySeconds': ['0'],
+ """
+
+ queue_name = self._get_queue_name()
+
+ self.sqs_backend.get_queue(queue_name)
+
+ if self.querystring.get("Entries"):
+ raise EmptyBatchRequest()
+
+ entries = {}
+ for key, value in self.querystring.items():
+ match = re.match(r"^SendMessageBatchRequestEntry\.(\d+)\.Id", key)
+ if match:
+ index = match.group(1)
+
+ message_attributes = parse_message_attributes(
+ self.querystring,
+ base="SendMessageBatchRequestEntry.{}.".format(index),
+ )
+
+ entries[index] = {
+ "Id": value[0],
+ "MessageBody": self.querystring.get(
+ "SendMessageBatchRequestEntry.{}.MessageBody".format(index)
+ )[0],
+ "DelaySeconds": self.querystring.get(
+ "SendMessageBatchRequestEntry.{}.DelaySeconds".format(index),
+ [None],
+ )[0],
+ "MessageAttributes": message_attributes,
+ "MessageGroupId": self.querystring.get(
+ "SendMessageBatchRequestEntry.{}.MessageGroupId".format(index),
+ [None],
+ )[0],
+ "MessageDeduplicationId": self.querystring.get(
+ "SendMessageBatchRequestEntry.{}.MessageDeduplicationId".format(
+ index
+ ),
+ [None],
+ )[0],
+ }
+
+ if entries == {}:
+ raise EmptyBatchRequest()
+
+ messages = self.sqs_backend.send_message_batch(queue_name, entries)
+
+ template = self.response_template(SEND_MESSAGE_BATCH_RESPONSE)
+ return template.render(messages=messages)
+
+ def delete_message(self):
+ queue_name = self._get_queue_name()
+ receipt_handle = self.querystring.get("ReceiptHandle")[0]
+ self.sqs_backend.delete_message(queue_name, receipt_handle)
+ template = self.response_template(DELETE_MESSAGE_RESPONSE)
+ return template.render()
+
+ def delete_message_batch(self):
+ """
+ The querystring comes like this
+
+ 'DeleteMessageBatchRequestEntry.1.Id': ['message_1'],
+ 'DeleteMessageBatchRequestEntry.1.ReceiptHandle': ['asdfsfs...'],
+ 'DeleteMessageBatchRequestEntry.2.Id': ['message_2'],
+ 'DeleteMessageBatchRequestEntry.2.ReceiptHandle': ['zxcvfda...'],
+ ...
+ """
+ queue_name = self._get_queue_name()
+
+ receipts = []
+
+ for index in range(1, 11):
+ # Loop through looking for messages
+ receipt_key = "DeleteMessageBatchRequestEntry.{0}.ReceiptHandle".format(
+ index
+ )
+ receipt_handle = self.querystring.get(receipt_key)
+ if not receipt_handle:
+ # Found all messages
+ break
+
+ message_user_id_key = "DeleteMessageBatchRequestEntry.{0}.Id".format(index)
+ message_user_id = self.querystring.get(message_user_id_key)[0]
+ receipts.append(
+ {"receipt_handle": receipt_handle[0], "msg_user_id": message_user_id}
+ )
+
+ receipt_seen = set()
+ for receipt_and_id in receipts:
+ receipt = receipt_and_id["receipt_handle"]
+ if receipt in receipt_seen:
+ raise BatchEntryIdsNotDistinct(receipt_and_id["msg_user_id"])
+ receipt_seen.add(receipt)
+
+ success = []
+ errors = []
+ for receipt_and_id in receipts:
+ try:
+ self.sqs_backend.delete_message(
+ queue_name, receipt_and_id["receipt_handle"]
+ )
+ success.append(receipt_and_id["msg_user_id"])
+ except ReceiptHandleIsInvalid:
+ errors.append(
+ {
+ "Id": receipt_and_id["msg_user_id"],
+ "SenderFault": "true",
+ "Code": "ReceiptHandleIsInvalid",
+ "Message": f'The input receipt handle "{receipt_and_id["receipt_handle"]}" is not a valid receipt handle.',
+ }
+ )
+
+ template = self.response_template(DELETE_MESSAGE_BATCH_RESPONSE)
+ return template.render(success=success, errors=errors)
+
+ def purge_queue(self):
+ queue_name = self._get_queue_name()
+ self.sqs_backend.purge_queue(queue_name)
+ template = self.response_template(PURGE_QUEUE_RESPONSE)
+ return template.render()
+
+ def receive_message(self):
+ queue_name = self._get_queue_name()
+ message_attributes = self._get_multi_param("message_attributes")
+ if not message_attributes:
+ message_attributes = extract_input_message_attributes(self.querystring)
+
+ attribute_names = self._get_multi_param("AttributeName")
+
+ queue = self.sqs_backend.get_queue(queue_name)
+
+ try:
+ message_count = int(self.querystring.get("MaxNumberOfMessages")[0])
+ except TypeError:
+ message_count = DEFAULT_RECEIVED_MESSAGES
+
+ if message_count < 1 or message_count > 10:
+ return self._error(
+ "InvalidParameterValue",
+ "An error occurred (InvalidParameterValue) when calling "
+ "the ReceiveMessage operation: Value %s for parameter "
+ "MaxNumberOfMessages is invalid. Reason: must be between "
+ "1 and 10, if provided." % message_count,
+ )
+
+ try:
+ wait_time = int(self.querystring.get("WaitTimeSeconds")[0])
+ except TypeError:
+ wait_time = int(queue.receive_message_wait_time_seconds)
+
+ if wait_time < 0 or wait_time > 20:
+ return self._error(
+ "InvalidParameterValue",
+ "An error occurred (InvalidParameterValue) when calling "
+ "the ReceiveMessage operation: Value %s for parameter "
+ "WaitTimeSeconds is invalid. Reason: must be &lt;= 0 and "
+ "&gt;= 20 if provided." % wait_time,
+ )
+
+ try:
+ visibility_timeout = self._get_validated_visibility_timeout()
+ except TypeError:
+ visibility_timeout = queue.visibility_timeout
+ except ValueError:
+ return ERROR_MAX_VISIBILITY_TIMEOUT_RESPONSE, dict(status=400)
+
+ messages = self.sqs_backend.receive_message(
+ queue_name, message_count, wait_time, visibility_timeout, message_attributes
+ )
+
+ attributes = {
+ "approximate_first_receive_timestamp": False,
+ "approximate_receive_count": False,
+ "message_deduplication_id": False,
+ "message_group_id": False,
+ "sender_id": False,
+ "sent_timestamp": False,
+ "sequence_number": False,
+ }
+
+ for attribute in attributes:
+ pascalcase_name = camelcase_to_pascal(underscores_to_camelcase(attribute))
+ if any(x in ["All", pascalcase_name] for x in attribute_names):
+ attributes[attribute] = True
+
+ template = self.response_template(RECEIVE_MESSAGE_RESPONSE)
+ return template.render(messages=messages, attributes=attributes)
+
+ def list_dead_letter_source_queues(self):
+ request_url = urlparse(self.uri)
+ queue_name = self._get_queue_name()
+
+ source_queue_urls = self.sqs_backend.list_dead_letter_source_queues(queue_name)
+
+ template = self.response_template(LIST_DEAD_LETTER_SOURCE_QUEUES_RESPONSE)
+ return template.render(queues=source_queue_urls, request_url=request_url)
+
+ def add_permission(self):
+ queue_name = self._get_queue_name()
+ actions = self._get_multi_param("ActionName")
+ account_ids = self._get_multi_param("AWSAccountId")
+ label = self._get_param("Label")
+
+ self.sqs_backend.add_permission(queue_name, actions, account_ids, label)
+
+ template = self.response_template(ADD_PERMISSION_RESPONSE)
+ return template.render()
+
+ def remove_permission(self):
+ queue_name = self._get_queue_name()
+ label = self._get_param("Label")
+
+ self.sqs_backend.remove_permission(queue_name, label)
+
+ template = self.response_template(REMOVE_PERMISSION_RESPONSE)
+ return template.render()
+
+ def tag_queue(self):
+ queue_name = self._get_queue_name()
+ tags = self._get_map_prefix("Tag", key_end=".Key", value_end=".Value")
+
+ self.sqs_backend.tag_queue(queue_name, tags)
+
+ template = self.response_template(TAG_QUEUE_RESPONSE)
+ return template.render()
+
+ def untag_queue(self):
+ queue_name = self._get_queue_name()
+ tag_keys = self._get_multi_param("TagKey")
+
+ self.sqs_backend.untag_queue(queue_name, tag_keys)
+
+ template = self.response_template(UNTAG_QUEUE_RESPONSE)
+ return template.render()
+
+ def list_queue_tags(self):
+ queue_name = self._get_queue_name()
+
+ queue = self.sqs_backend.list_queue_tags(queue_name)
+
+ template = self.response_template(LIST_QUEUE_TAGS_RESPONSE)
+ return template.render(tags=queue.tags)
+
+
+CREATE_QUEUE_RESPONSE = """<CreateQueueResponse>
+ <CreateQueueResult>
+ <QueueUrl>{{ queue_url }}</QueueUrl>
+ </CreateQueueResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</CreateQueueResponse>"""
+
+GET_QUEUE_URL_RESPONSE = """<GetQueueUrlResponse>
+ <GetQueueUrlResult>
+ <QueueUrl>{{ queue_url }}</QueueUrl>
+ </GetQueueUrlResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</GetQueueUrlResponse>"""
+
+LIST_QUEUES_RESPONSE = """<ListQueuesResponse>
+ <ListQueuesResult>
+ {% for queue in queues %}
+ <QueueUrl>{{ queue.url(request_url) }}</QueueUrl>
+ {% endfor %}
+ </ListQueuesResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</ListQueuesResponse>"""
+
+DELETE_QUEUE_RESPONSE = """<DeleteQueueResponse>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</DeleteQueueResponse>"""
+
+GET_QUEUE_ATTRIBUTES_RESPONSE = """<GetQueueAttributesResponse>
+ <GetQueueAttributesResult>
+ {% for key, value in attributes.items() %}
+ {% if value is not none %}
+ <Attribute>
+ <Name>{{ key }}</Name>
+ <Value>{{ value }}</Value>
+ </Attribute>
+ {% endif %}
+ {% endfor %}
+ </GetQueueAttributesResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</GetQueueAttributesResponse>"""
+
+SET_QUEUE_ATTRIBUTE_RESPONSE = """<SetQueueAttributesResponse>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</SetQueueAttributesResponse>"""
+
+SEND_MESSAGE_RESPONSE = """<SendMessageResponse>
+ <SendMessageResult>
+ <MD5OfMessageBody>
+ {{- message.body_md5 -}}
+ </MD5OfMessageBody>
+ {% if message.message_attributes.items()|count > 0 %}
+ <MD5OfMessageAttributes>{{- message.attribute_md5 -}}</MD5OfMessageAttributes>
+ {% endif %}
+ <MessageId>
+ {{- message.id -}}
+ </MessageId>
+ </SendMessageResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</SendMessageResponse>"""
+
+RECEIVE_MESSAGE_RESPONSE = """<ReceiveMessageResponse>
+ <ReceiveMessageResult>
+ {% for message in messages %}
+ <Message>
+ <MessageId>{{ message.id }}</MessageId>
+ <ReceiptHandle>{{ message.receipt_handle }}</ReceiptHandle>
+ <MD5OfBody>{{ message.body_md5 }}</MD5OfBody>
+ <Body>{{ message.body }}</Body>
+ {% if attributes.sender_id %}
+ <Attribute>
+ <Name>SenderId</Name>
+ <Value>{{ message.sender_id }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.sent_timestamp %}
+ <Attribute>
+ <Name>SentTimestamp</Name>
+ <Value>{{ message.sent_timestamp }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.approximate_receive_count %}
+ <Attribute>
+ <Name>ApproximateReceiveCount</Name>
+ <Value>{{ message.approximate_receive_count }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.approximate_first_receive_timestamp %}
+ <Attribute>
+ <Name>ApproximateFirstReceiveTimestamp</Name>
+ <Value>{{ message.approximate_first_receive_timestamp }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.message_deduplication_id and message.deduplication_id is not none %}
+ <Attribute>
+ <Name>MessageDeduplicationId</Name>
+ <Value>{{ message.deduplication_id }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.message_group_id and message.group_id is not none %}
+ <Attribute>
+ <Name>MessageGroupId</Name>
+ <Value>{{ message.group_id }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if message.system_attributes and message.system_attributes.get('AWSTraceHeader') is not none %}
+ <Attribute>
+ <Name>AWSTraceHeader</Name>
+ <Value>{{ message.system_attributes.get('AWSTraceHeader',{}).get('string_value') }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if attributes.sequence_number and message.sequence_number is not none %}
+ <Attribute>
+ <Name>SequenceNumber</Name>
+ <Value>{{ message.sequence_number }}</Value>
+ </Attribute>
+ {% endif %}
+ {% if message.message_attributes.items()|count > 0 %}
+ <MD5OfMessageAttributes>{{- message.attribute_md5 -}}</MD5OfMessageAttributes>
+ {% endif %}
+ {% for name, value in message.message_attributes.items() %}
+ <MessageAttribute>
+ <Name>{{ name }}</Name>
+ <Value>
+ <DataType>{{ value.data_type }}</DataType>
+ {% if 'Binary' in value.data_type %}
+ <BinaryValue>{{ value.binary_value }}</BinaryValue>
+ {% else %}
+ <StringValue><![CDATA[{{ value.string_value }}]]></StringValue>
+ {% endif %}
+ </Value>
+ </MessageAttribute>
+ {% endfor %}
+ </Message>
+ {% endfor %}
+ </ReceiveMessageResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</ReceiveMessageResponse>"""
+
+SEND_MESSAGE_BATCH_RESPONSE = """<SendMessageBatchResponse>
+<SendMessageBatchResult>
+ {% for message in messages %}
+ <SendMessageBatchResultEntry>
+ <Id>{{ message.user_id }}</Id>
+ <MessageId>{{ message.id }}</MessageId>
+ <MD5OfMessageBody>{{ message.body_md5 }}</MD5OfMessageBody>
+ {% if message.message_attributes.items()|count > 0 %}
+ <MD5OfMessageAttributes>{{- message.attribute_md5 -}}</MD5OfMessageAttributes>
+ {% endif %}
+ </SendMessageBatchResultEntry>
+ {% endfor %}
+</SendMessageBatchResult>
+<ResponseMetadata>
+ <RequestId></RequestId>
+</ResponseMetadata>
+</SendMessageBatchResponse>"""
+
+DELETE_MESSAGE_RESPONSE = """<DeleteMessageResponse>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</DeleteMessageResponse>"""
+
+DELETE_MESSAGE_BATCH_RESPONSE = """<DeleteMessageBatchResponse>
+ <DeleteMessageBatchResult>
+ {% for message_id in success %}
+ <DeleteMessageBatchResultEntry>
+ <Id>{{ message_id }}</Id>
+ </DeleteMessageBatchResultEntry>
+ {% endfor %}
+ {% for error_dict in errors %}
+ <BatchResultErrorEntry>
+ <Id>{{ error_dict['Id'] }}</Id>
+ <Code>{{ error_dict['Code'] }}</Code>
+ <Message>{{ error_dict['Message'] }}</Message>
+ <SenderFault>{{ error_dict['SenderFault'] }}</SenderFault>
+ </BatchResultErrorEntry>
+ {% endfor %}
+ </DeleteMessageBatchResult>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</DeleteMessageBatchResponse>"""
+
+CHANGE_MESSAGE_VISIBILITY_RESPONSE = """<ChangeMessageVisibilityResponse>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</ChangeMessageVisibilityResponse>"""
+
+CHANGE_MESSAGE_VISIBILITY_BATCH_RESPONSE = """<ChangeMessageVisibilityBatchResponse>
+ <ChangeMessageVisibilityBatchResult>
+ {% for success_id in success %}
+ <ChangeMessageVisibilityBatchResultEntry>
+ <Id>{{ success_id }}</Id>
+ </ChangeMessageVisibilityBatchResultEntry>
+ {% endfor %}
+ {% for error_dict in errors %}
+ <BatchResultErrorEntry>
+ <Id>{{ error_dict['Id'] }}</Id>
+ <Code>{{ error_dict['Code'] }}</Code>
+ <Message>{{ error_dict['Message'] }}</Message>
+ <SenderFault>{{ error_dict['SenderFault'] }}</SenderFault>
+ </BatchResultErrorEntry>
+ {% endfor %}
+ </ChangeMessageVisibilityBatchResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ChangeMessageVisibilityBatchResponse>"""
+
+PURGE_QUEUE_RESPONSE = """<PurgeQueueResponse>
+ <ResponseMetadata>
+ <RequestId></RequestId>
+ </ResponseMetadata>
+</PurgeQueueResponse>"""
+
+LIST_DEAD_LETTER_SOURCE_QUEUES_RESPONSE = """<ListDeadLetterSourceQueuesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
+ <ListDeadLetterSourceQueuesResult>
+ {% for queue in queues %}
+ <QueueUrl>{{ queue.url(request_url) }}</QueueUrl>
+ {% endfor %}
+ </ListDeadLetterSourceQueuesResult>
+ <ResponseMetadata>
+ <RequestId>8ffb921f-b85e-53d9-abcf-d8d0057f38fc</RequestId>
+ </ResponseMetadata>
+</ListDeadLetterSourceQueuesResponse>"""
+
+ADD_PERMISSION_RESPONSE = """<AddPermissionResponse>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</AddPermissionResponse>"""
+
+REMOVE_PERMISSION_RESPONSE = """<RemovePermissionResponse>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</RemovePermissionResponse>"""
+
+TAG_QUEUE_RESPONSE = """<TagQueueResponse>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</TagQueueResponse>"""
+
+UNTAG_QUEUE_RESPONSE = """<UntagQueueResponse>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</UntagQueueResponse>"""
+
+LIST_QUEUE_TAGS_RESPONSE = """<ListQueueTagsResponse>
+ <ListQueueTagsResult>
+ {% for key, value in tags.items() %}
+ <Tag>
+ <Key>{{ key }}</Key>
+ <Value>{{ value }}</Value>
+ </Tag>
+ {% endfor %}
+ </ListQueueTagsResult>
+ <ResponseMetadata>
+ <RequestId>{{ request_id }}</RequestId>
+ </ResponseMetadata>
+</ListQueueTagsResponse>"""
+
+ERROR_TOO_LONG_RESPONSE = """<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>InvalidParameterValue</Code>
+ <Message>One or more parameters are invalid. Reason: Message must be shorter than 262144 bytes.</Message>
+ <Detail/>
+ </Error>
+ <RequestId>6fde8d1e-52cd-4581-8cd9-c512f4c64223</RequestId>
+</ErrorResponse>"""
+
+ERROR_MAX_VISIBILITY_TIMEOUT_RESPONSE = (
+ f"Invalid request, maximum visibility timeout is {MAXIMUM_VISIBILTY_TIMEOUT}"
+)
+
+ERROR_INEXISTENT_QUEUE = """<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>AWS.SimpleQueueService.NonExistentQueue</Code>
+ {% if queue_name %}
+ <Message>The specified queue {{queue_name}} does not exist for this wsdl version.</Message>
+ {% else %}
+ <Message>The specified queue does not exist for this wsdl version.</Message>
+ {% endif %}
+ <Detail/>
+ </Error>
+ <RequestId>b8bc806b-fa6b-53b5-8be8-cfa2f9836bc3</RequestId>
+</ErrorResponse>"""
+
+ERROR_TEMPLATE = """<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
+ <Error>
+ <Type>Sender</Type>
+ <Code>{{ code }}</Code>
+ <Message>{{ message }}</Message>
+ <Detail/>
+ </Error>
+ <RequestId>6fde8d1e-52cd-4581-8cd9-c512f4c64223</RequestId>
+</ErrorResponse>"""
diff --git a/contrib/python/moto/py3/moto/sqs/urls.py b/contrib/python/moto/py3/moto/sqs/urls.py
new file mode 100644
index 0000000000..696ef3aa09
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/urls.py
@@ -0,0 +1,10 @@
+from .responses import SQSResponse
+
+url_bases = [r"https?://(.*\.)?(queue|sqs)\.(.*\.)?amazonaws\.com"]
+
+dispatch = SQSResponse().dispatch
+
+url_paths = {
+ "{0}/$": dispatch,
+ r"{0}/(?P<account_id>\d+)/(?P<queue_name>[a-zA-Z0-9\-_\.]+)": dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/sqs/utils.py b/contrib/python/moto/py3/moto/sqs/utils.py
new file mode 100644
index 0000000000..24d3742489
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sqs/utils.py
@@ -0,0 +1,84 @@
+import random
+import string
+
+from .exceptions import MessageAttributesInvalid
+
+
+def generate_receipt_handle():
+ # http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/ImportantIdentifiers.html#ImportantIdentifiers-receipt-handles
+ length = 185
+ return "".join(random.choice(string.ascii_lowercase) for x in range(length))
+
+
+def extract_input_message_attributes(querystring):
+ message_attributes = []
+ index = 1
+ while True:
+ # Loop through looking for message attributes
+ name_key = "MessageAttributeName.{0}".format(index)
+ name = querystring.get(name_key)
+ if not name:
+ # Found all attributes
+ break
+ message_attributes.append(name[0])
+ index = index + 1
+ return message_attributes
+
+
+def parse_message_attributes(
+ querystring, key="MessageAttribute", base="", value_namespace="Value."
+):
+ message_attributes = {}
+ index = 1
+ while True:
+ # Loop through looking for message attributes
+ name_key = base + "{0}.{1}.Name".format(key, index)
+ name = querystring.get(name_key)
+ if not name:
+ # Found all attributes
+ break
+
+ data_type_key = base + "{0}.{1}.{2}DataType".format(key, index, value_namespace)
+ data_type = querystring.get(data_type_key)
+ if not data_type:
+ raise MessageAttributesInvalid(
+ "The message attribute '{0}' must contain non-empty message attribute value.".format(
+ name[0]
+ )
+ )
+
+ data_type_parts = data_type[0].split(".")
+ if data_type_parts[0] not in [
+ "String",
+ "Binary",
+ "Number",
+ ]:
+ raise MessageAttributesInvalid(
+ "The message attribute '{0}' has an invalid message attribute type, the set of supported type prefixes is Binary, Number, and String.".format(
+ name[0]
+ )
+ )
+
+ type_prefix = "String"
+ if data_type_parts[0] == "Binary":
+ type_prefix = "Binary"
+
+ value_key = base + "{0}.{1}.{2}{3}Value".format(
+ key, index, value_namespace, type_prefix
+ )
+ value = querystring.get(value_key)
+ if not value:
+ raise MessageAttributesInvalid(
+ "The message attribute '{0}' must contain non-empty message attribute value for message attribute type '{1}'.".format(
+ name[0], data_type[0]
+ )
+ )
+
+ message_attributes[name[0]] = {
+ "data_type": data_type[0],
+ type_prefix.lower() + "_value": value[0],
+ }
+
+ index += 1
+
+ return message_attributes
diff --git a/contrib/python/moto/py3/moto/ssm/__init__.py b/contrib/python/moto/py3/moto/ssm/__init__.py
new file mode 100644
index 0000000000..4d9b60c48c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/__init__.py
@@ -0,0 +1,4 @@
+from .models import ssm_backends
+from ..core.models import base_decorator
+
+mock_ssm = base_decorator(ssm_backends)
diff --git a/contrib/python/moto/py3/moto/ssm/exceptions.py b/contrib/python/moto/py3/moto/ssm/exceptions.py
new file mode 100644
index 0000000000..e573fff84c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/exceptions.py
@@ -0,0 +1,141 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidFilterKey(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidFilterKey", message)
+
+
+class InvalidFilterOption(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidFilterOption", message)
+
+
+class InvalidFilterValue(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidFilterValue", message)
+
+
+class InvalidResourceId(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidResourceId", "Invalid Resource Id")
+
+
+class InvalidResourceType(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__("InvalidResourceType", "Invalid Resource Type")
+
+
+class ParameterNotFound(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ParameterNotFound", message)
+
+
+class ParameterVersionNotFound(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ParameterVersionNotFound", message)
+
+
+class ParameterVersionLabelLimitExceeded(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ParameterVersionLabelLimitExceeded", message)
+
+
+class ValidationException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ValidationException", message)
+
+
+class DocumentAlreadyExists(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DocumentAlreadyExists", message)
+
+
+class DocumentPermissionLimit(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DocumentPermissionLimit", message)
+
+
+class InvalidPermissionType(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidPermissionType", message)
+
+
+class InvalidDocument(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidDocument", message)
+
+
+class InvalidDocumentOperation(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidDocumentOperation", message)
+
+
+class AccessDeniedException(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("AccessDeniedException", message)
+
+
+class InvalidDocumentContent(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidDocumentContent", message)
+
+
+class InvalidDocumentVersion(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("InvalidDocumentVersion", message)
+
+
+class DuplicateDocumentVersionName(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DuplicateDocumentVersionName", message)
+
+
+class DuplicateDocumentContent(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("DuplicateDocumentContent", message)
+
+
+class ParameterMaxVersionLimitExceeded(JsonRESTError):
+ code = 400
+
+ def __init__(self, message):
+ super().__init__("ParameterMaxVersionLimitExceeded", message)
diff --git a/contrib/python/moto/py3/moto/ssm/models.py b/contrib/python/moto/py3/moto/ssm/models.py
new file mode 100644
index 0000000000..19c2aabb00
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/models.py
@@ -0,0 +1,1951 @@
+import re
+from dataclasses import dataclass
+from typing import Dict
+
+from collections import defaultdict
+
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.exceptions import RESTError
+from moto.core.utils import BackendDict
+from moto.ec2 import ec2_backends
+from moto.secretsmanager import secretsmanager_backends
+from moto.secretsmanager.exceptions import SecretsManagerClientError
+from moto.utilities.utils import load_resource
+
+import datetime
+import time
+import uuid
+import json
+import yaml
+import hashlib
+import random
+
+from .utils import parameter_arn, convert_to_params
+from .exceptions import (
+ ValidationException,
+ InvalidFilterValue,
+ InvalidFilterOption,
+ InvalidFilterKey,
+ ParameterVersionLabelLimitExceeded,
+ ParameterVersionNotFound,
+ ParameterNotFound,
+ DocumentAlreadyExists,
+ InvalidDocumentOperation,
+ AccessDeniedException,
+ InvalidDocument,
+ InvalidDocumentContent,
+ InvalidDocumentVersion,
+ DuplicateDocumentVersionName,
+ DuplicateDocumentContent,
+ ParameterMaxVersionLimitExceeded,
+ DocumentPermissionLimit,
+ InvalidPermissionType,
+ InvalidResourceId,
+ InvalidResourceType,
+)
+
+
+class ParameterDict(defaultdict):
+ def __init__(self, region_name):
+ # each value is a list of all of the versions for a parameter
+ # to get the current value, grab the last item of the list
+ super().__init__(list)
+ self.parameters_loaded = False
+ self.region_name = region_name
+
+ def _check_loading_status(self, key):
+ if not self.parameters_loaded and key and str(key).startswith("/aws"):
+ self._load_global_parameters()
+
+ def _load_global_parameters(self):
+ regions = load_resource(__name__, "resources/regions.json")
+ services = load_resource(__name__, "resources/services.json")
+ params = []
+ params.extend(convert_to_params(regions))
+ params.extend(convert_to_params(services))
+
+ for param in params:
+ last_modified_date = time.time()
+ name = param["Name"]
+ value = param["Value"]
+ # Following were lost in translation/conversion - using sensible defaults
+ parameter_type = "String"
+ version = 1
+ super().__getitem__(name).append(
+ Parameter(
+ name=name,
+ value=value,
+ parameter_type=parameter_type,
+ description=None,
+ allowed_pattern=None,
+ keyid=None,
+ last_modified_date=last_modified_date,
+ version=version,
+ data_type="text",
+ )
+ )
+ self.parameters_loaded = True
+
+ def _get_secretsmanager_parameter(self, secret_name):
+ secret = secretsmanager_backends[self.region_name].describe_secret(secret_name)
+ version_id_to_stage = secret["VersionIdsToStages"]
+ # Sort version ID's so that AWSCURRENT is last
+ sorted_version_ids = [
+ k for k in version_id_to_stage if "AWSCURRENT" not in version_id_to_stage[k]
+ ] + [k for k in version_id_to_stage if "AWSCURRENT" in version_id_to_stage[k]]
+ values = [
+ secretsmanager_backends[self.region_name].get_secret_value(
+ secret_name,
+ version_id=version_id,
+ version_stage=None,
+ )
+ for version_id in sorted_version_ids
+ ]
+ return [
+ Parameter(
+ name=secret["Name"],
+ value=val.get("SecretString"),
+ parameter_type="SecureString",
+ description=secret.get("Description"),
+ allowed_pattern=None,
+ keyid=None,
+ last_modified_date=secret["LastChangedDate"],
+ version=0,
+ data_type="text",
+ labels=[val.get("VersionId")] + val.get("VersionStages", []),
+ source_result=json.dumps(secret),
+ )
+ for val in values
+ ]
+
+ def __getitem__(self, item):
+ if item.startswith("/aws/reference/secretsmanager/"):
+ return self._get_secretsmanager_parameter("/".join(item.split("/")[4:]))
+ self._check_loading_status(item)
+ return super().__getitem__(item)
+
+ def __contains__(self, k):
+ if k and k.startswith("/aws/reference/secretsmanager/"):
+ try:
+ param = self._get_secretsmanager_parameter("/".join(k.split("/")[4:]))
+ return param is not None
+ except SecretsManagerClientError:
+ raise ParameterNotFound(
+ f"An error occurred (ParameterNotFound) when referencing Secrets Manager: Secret {k} not found."
+ )
+ self._check_loading_status(k)
+ return super().__contains__(k)
+
+ def get_keys_beginning_with(self, path, recursive):
+ self._check_loading_status(path)
+ for param_name in self:
+ if path != "/" and not param_name.startswith(path):
+ continue
+ if "/" in param_name[len(path) + 1 :] and not recursive:
+ continue
+ yield param_name
+
+
+PARAMETER_VERSION_LIMIT = 100
+PARAMETER_HISTORY_MAX_RESULTS = 50
+
+
+class Parameter(BaseModel):
+ def __init__(
+ self,
+ name,
+ value,
+ parameter_type,
+ description,
+ allowed_pattern,
+ keyid,
+ last_modified_date,
+ version,
+ data_type,
+ tags=None,
+ labels=None,
+ source_result=None,
+ ):
+ self.name = name
+ self.type = parameter_type
+ self.description = description
+ self.allowed_pattern = allowed_pattern
+ self.keyid = keyid
+ self.last_modified_date = last_modified_date
+ self.version = version
+ self.data_type = data_type
+ self.tags = tags or []
+ self.labels = labels or []
+ self.source_result = source_result
+
+ if self.type == "SecureString":
+ if not self.keyid:
+ self.keyid = "alias/aws/ssm"
+
+ self.value = self.encrypt(value)
+ else:
+ self.value = value
+
+ def encrypt(self, value):
+ return "kms:{}:".format(self.keyid) + value
+
+ def decrypt(self, value):
+ if self.type != "SecureString":
+ return value
+
+ prefix = "kms:{}:".format(self.keyid or "default")
+ if value.startswith(prefix):
+ return value[len(prefix) :]
+
+ def response_object(self, decrypt=False, region=None):
+ r = {
+ "Name": self.name,
+ "Type": self.type,
+ "Value": self.decrypt(self.value) if decrypt else self.value,
+ "Version": self.version,
+ "LastModifiedDate": round(self.last_modified_date, 3),
+ "DataType": self.data_type,
+ }
+ if self.source_result:
+ r["SourceResult"] = self.source_result
+
+ if region:
+ r["ARN"] = parameter_arn(region, self.name)
+
+ return r
+
+ def describe_response_object(self, decrypt=False, include_labels=False):
+ r = self.response_object(decrypt)
+ r["LastModifiedDate"] = round(self.last_modified_date, 3)
+ r["LastModifiedUser"] = "N/A"
+
+ if self.description:
+ r["Description"] = self.description
+
+ if self.keyid:
+ r["KeyId"] = self.keyid
+
+ if self.allowed_pattern:
+ r["AllowedPattern"] = self.allowed_pattern
+
+ if include_labels:
+ r["Labels"] = self.labels
+
+ return r
+
+
+MAX_TIMEOUT_SECONDS = 3600
+
+
+def generate_ssm_doc_param_list(parameters):
+ if not parameters:
+ return None
+ param_list = []
+ for param_name, param_info in parameters.items():
+ final_dict = {
+ "Name": param_name,
+ }
+
+ description = param_info.get("description")
+ if description:
+ final_dict["Description"] = description
+
+ param_type = param_info["type"]
+ final_dict["Type"] = param_type
+
+ default_value = param_info.get("default")
+ if default_value is not None:
+ if param_type in {"StringList", "StringMap", "MapList"}:
+ final_dict["DefaultValue"] = json.dumps(default_value)
+ else:
+ final_dict["DefaultValue"] = str(default_value)
+
+ param_list.append(final_dict)
+
+ return param_list
+
+
+@dataclass(frozen=True)
+class AccountPermission:
+ account_id: str
+ version: str
+ created_at: datetime
+
+
+class Documents(BaseModel):
+ def __init__(self, ssm_document):
+ version = ssm_document.document_version
+ self.versions = {version: ssm_document}
+ self.default_version = version
+ self.latest_version = version
+ self.permissions = {} # {AccountID: AccountPermission }
+
+ def get_default_version(self):
+ return self.versions.get(self.default_version)
+
+ def get_latest_version(self):
+ return self.versions.get(self.latest_version)
+
+ def find_by_version_name(self, version_name):
+ return next(
+ (
+ document
+ for document in self.versions.values()
+ if document.version_name == version_name
+ ),
+ None,
+ )
+
+ def find_by_version(self, version):
+ return self.versions.get(version)
+
+ def find_by_version_and_version_name(self, version, version_name):
+ return next(
+ (
+ document
+ for doc_version, document in self.versions.items()
+ if doc_version == version and document.version_name == version_name
+ ),
+ None,
+ )
+
+ def find(self, document_version=None, version_name=None, strict=True):
+
+ if document_version == "$LATEST":
+ ssm_document = self.get_latest_version()
+ elif version_name and document_version:
+ ssm_document = self.find_by_version_and_version_name(
+ document_version, version_name
+ )
+ elif version_name:
+ ssm_document = self.find_by_version_name(version_name)
+ elif document_version:
+ ssm_document = self.find_by_version(document_version)
+ else:
+ ssm_document = self.get_default_version()
+
+ if strict and not ssm_document:
+ raise InvalidDocument("The specified document does not exist.")
+
+ return ssm_document
+
+ def exists(self, document_version=None, version_name=None):
+ return self.find(document_version, version_name, strict=False) is not None
+
+ def add_new_version(self, new_document_version):
+ version = new_document_version.document_version
+ self.latest_version = version
+ self.versions[version] = new_document_version
+
+ def update_default_version(self, version):
+ ssm_document = self.find_by_version(version)
+ if not ssm_document:
+ raise InvalidDocument("The specified document does not exist.")
+ self.default_version = version
+ return ssm_document
+
+ def delete(self, *versions):
+ for version in versions:
+ if version in self.versions:
+ del self.versions[version]
+
+ if self.versions and self.latest_version not in self.versions:
+ ordered_versions = sorted(self.versions.keys())
+ new_latest_version = ordered_versions[-1]
+ self.latest_version = new_latest_version
+
+ def describe(self, document_version=None, version_name=None, tags=None):
+ document = self.find(document_version, version_name)
+ base = {
+ "Hash": document.hash,
+ "HashType": "Sha256",
+ "Name": document.name,
+ "Owner": document.owner,
+ "CreatedDate": document.created_date.strftime("%Y-%m-%dT%H:%M:%SZ"),
+ "Status": document.status,
+ "DocumentVersion": document.document_version,
+ "Description": document.description,
+ "Parameters": document.parameter_list,
+ "PlatformTypes": document.platform_types,
+ "DocumentType": document.document_type,
+ "SchemaVersion": document.schema_version,
+ "LatestVersion": self.latest_version,
+ "DefaultVersion": self.default_version,
+ "DocumentFormat": document.document_format,
+ }
+ if document.version_name:
+ base["VersionName"] = document.version_name
+ if document.target_type:
+ base["TargetType"] = document.target_type
+ if tags:
+ base["Tags"] = tags
+
+ return base
+
+ def modify_permissions(self, accounts_to_add, accounts_to_remove, version):
+ version = version or "$DEFAULT"
+ if accounts_to_add:
+ if "all" in accounts_to_add:
+ self.permissions.clear()
+ else:
+ self.permissions.pop("all", None)
+
+ new_permissions = {
+ account_id: AccountPermission(
+ account_id, version, datetime.datetime.now()
+ )
+ for account_id in accounts_to_add
+ }
+ self.permissions.update(**new_permissions)
+
+ if accounts_to_remove:
+ if "all" in accounts_to_remove:
+ self.permissions.clear()
+ else:
+ for account_id in accounts_to_remove:
+ self.permissions.pop(account_id, None)
+
+ def describe_permissions(self):
+
+ permissions_ordered_by_date = sorted(
+ self.permissions.values(), key=lambda p: p.created_at
+ )
+
+ return {
+ "AccountIds": [p.account_id for p in permissions_ordered_by_date],
+ "AccountSharingInfoList": [
+ {"AccountId": p.account_id, "SharedDocumentVersion": p.version}
+ for p in permissions_ordered_by_date
+ ],
+ }
+
+ def is_shared(self):
+ return len(self.permissions) > 0
+
+
+class Document(BaseModel):
+ def __init__(
+ self,
+ name,
+ version_name,
+ content,
+ document_type,
+ document_format,
+ requires,
+ attachments,
+ target_type,
+ document_version="1",
+ ):
+ self.name = name
+ self.version_name = version_name
+ self.content = content
+ self.document_type = document_type
+ self.document_format = document_format
+ self.requires = requires
+ self.attachments = attachments
+ self.target_type = target_type
+
+ self.status = "Active"
+ self.document_version = document_version
+ self.owner = get_account_id()
+ self.created_date = datetime.datetime.utcnow()
+
+ if document_format == "JSON":
+ try:
+ content_json = json.loads(content)
+ except ValueError:
+ # Python2
+ raise InvalidDocumentContent(
+ "The content for the document is not valid."
+ )
+ except json.decoder.JSONDecodeError:
+ raise InvalidDocumentContent(
+ "The content for the document is not valid."
+ )
+ elif document_format == "YAML":
+ try:
+ content_json = yaml.safe_load(content)
+ except yaml.YAMLError:
+ raise InvalidDocumentContent(
+ "The content for the document is not valid."
+ )
+ else:
+ raise ValidationException("Invalid document format " + str(document_format))
+
+ self.content_json = content_json
+
+ try:
+ self.schema_version = str(content_json["schemaVersion"])
+ self.description = content_json.get("description")
+ self.outputs = content_json.get("outputs")
+ self.files = content_json.get("files")
+ # TODO add platformType (requires mapping the ssm actions to OS's this isn't well documented)
+ self.platform_types = ["Not Implemented (moto)"]
+ self.parameter_list = generate_ssm_doc_param_list(
+ content_json.get("parameters")
+ )
+
+ if self.schema_version in {"0.3", "2.0", "2.2"}:
+ self.mainSteps = content_json.get("mainSteps")
+ elif self.schema_version == "1.2":
+ self.runtimeConfig = content_json.get("runtimeConfig")
+
+ except KeyError:
+ raise InvalidDocumentContent("The content for the document is not valid.")
+
+ @property
+ def hash(self):
+ return hashlib.sha256(self.content.encode("utf-8")).hexdigest()
+
+ def list_describe(self, tags=None):
+ base = {
+ "Name": self.name,
+ "Owner": self.owner,
+ "DocumentVersion": self.document_version,
+ "DocumentType": self.document_type,
+ "SchemaVersion": self.schema_version,
+ "DocumentFormat": self.document_format,
+ }
+ if self.version_name:
+ base["VersionName"] = self.version_name
+ if self.platform_types:
+ base["PlatformTypes"] = self.platform_types
+ if self.target_type:
+ base["TargetType"] = self.target_type
+ if self.requires:
+ base["Requires"] = self.requires
+ if tags:
+ base["Tags"] = tags
+
+ return base
+
+
+class Command(BaseModel):
+ def __init__(
+ self,
+ comment="",
+ document_name="",
+ timeout_seconds=MAX_TIMEOUT_SECONDS,
+ instance_ids=None,
+ max_concurrency="",
+ max_errors="",
+ notification_config=None,
+ output_s3_bucket_name="",
+ output_s3_key_prefix="",
+ output_s3_region="",
+ parameters=None,
+ service_role_arn="",
+ targets=None,
+ backend_region="us-east-1",
+ ):
+
+ if instance_ids is None:
+ instance_ids = []
+
+ if notification_config is None:
+ notification_config = {}
+
+ if parameters is None:
+ parameters = {}
+
+ if targets is None:
+ targets = []
+
+ self.command_id = str(uuid.uuid4())
+ self.status = "Success"
+ self.status_details = "Details placeholder"
+
+ self.requested_date_time = datetime.datetime.now()
+ self.requested_date_time_iso = self.requested_date_time.isoformat()
+ expires_after = self.requested_date_time + datetime.timedelta(
+ 0, timeout_seconds
+ )
+ self.expires_after = expires_after.isoformat()
+
+ self.comment = comment
+ self.document_name = document_name
+ self.max_concurrency = max_concurrency
+ self.max_errors = max_errors
+ self.notification_config = notification_config
+ self.output_s3_bucket_name = output_s3_bucket_name
+ self.output_s3_key_prefix = output_s3_key_prefix
+ self.output_s3_region = output_s3_region
+ self.parameters = parameters
+ self.service_role_arn = service_role_arn
+ self.targets = targets
+ self.backend_region = backend_region
+
+ self.instance_ids = instance_ids
+ self.instance_ids += self._get_instance_ids_from_targets()
+ # Ensure no duplicate instance_ids
+ self.instance_ids = list(set(self.instance_ids))
+
+ # NOTE: All of these counts are 0 in the ssm:SendCommand response
+ # received from a real AWS backend. The counts are correct when
+ # making subsequent calls to ssm:DescribeCommand or ssm:ListCommands.
+ # Not likely to cause any problems, but perhaps an area for future
+ # improvement.
+ self.error_count = 0
+ self.completed_count = len(instance_ids)
+ self.target_count = len(instance_ids)
+
+ # Create invocations with a single run command plugin.
+ self.invocations = []
+ for instance_id in self.instance_ids:
+ self.invocations.append(
+ self.invocation_response(instance_id, "aws:runShellScript")
+ )
+
+ def _get_instance_ids_from_targets(self):
+ target_instance_ids = []
+ ec2_backend = ec2_backends[self.backend_region]
+ ec2_filters = {target["Key"]: target["Values"] for target in self.targets}
+ reservations = ec2_backend.all_reservations(filters=ec2_filters)
+ for reservation in reservations:
+ for instance in reservation.instances:
+ target_instance_ids.append(instance.id)
+ return target_instance_ids
+
+ def response_object(self):
+ r = {
+ "CommandId": self.command_id,
+ "Comment": self.comment,
+ "CompletedCount": self.completed_count,
+ "DocumentName": self.document_name,
+ "ErrorCount": self.error_count,
+ "ExpiresAfter": self.expires_after,
+ "InstanceIds": self.instance_ids,
+ "MaxConcurrency": self.max_concurrency,
+ "MaxErrors": self.max_errors,
+ "NotificationConfig": self.notification_config,
+ "OutputS3Region": self.output_s3_region,
+ "OutputS3BucketName": self.output_s3_bucket_name,
+ "OutputS3KeyPrefix": self.output_s3_key_prefix,
+ "Parameters": self.parameters,
+ "RequestedDateTime": self.requested_date_time_iso,
+ "ServiceRole": self.service_role_arn,
+ "Status": self.status,
+ "StatusDetails": self.status_details,
+ "TargetCount": self.target_count,
+ "Targets": self.targets,
+ }
+
+ return r
+
+ def invocation_response(self, instance_id, plugin_name):
+ # Calculate elapsed time from requested time and now. Use a hardcoded
+ # elapsed time since there is no easy way to convert a timedelta to
+ # an ISO 8601 duration string.
+ elapsed_time_iso = "PT5M"
+ elapsed_time_delta = datetime.timedelta(minutes=5)
+ end_time = self.requested_date_time + elapsed_time_delta
+
+ r = {
+ "CommandId": self.command_id,
+ "InstanceId": instance_id,
+ "Comment": self.comment,
+ "DocumentName": self.document_name,
+ "PluginName": plugin_name,
+ "ResponseCode": 0,
+ "ExecutionStartDateTime": self.requested_date_time_iso,
+ "ExecutionElapsedTime": elapsed_time_iso,
+ "ExecutionEndDateTime": end_time.isoformat(),
+ "Status": "Success",
+ "StatusDetails": "Success",
+ "StandardOutputContent": "",
+ "StandardOutputUrl": "",
+ "StandardErrorContent": "",
+ }
+
+ return r
+
+ def get_invocation(self, instance_id, plugin_name):
+ invocation = next(
+ (
+ invocation
+ for invocation in self.invocations
+ if invocation["InstanceId"] == instance_id
+ ),
+ None,
+ )
+
+ if invocation is None:
+ raise RESTError(
+ "InvocationDoesNotExist",
+ "An error occurred (InvocationDoesNotExist) when calling the GetCommandInvocation operation",
+ )
+
+ if plugin_name is not None and invocation["PluginName"] != plugin_name:
+ raise RESTError(
+ "InvocationDoesNotExist",
+ "An error occurred (InvocationDoesNotExist) when calling the GetCommandInvocation operation",
+ )
+
+ return invocation
+
+
+def _validate_document_format(document_format):
+ aws_doc_formats = ["JSON", "YAML"]
+ if document_format not in aws_doc_formats:
+ raise ValidationException("Invalid document format " + str(document_format))
+
+
+def _validate_document_info(content, name, document_type, document_format, strict=True):
+ aws_ssm_name_regex = r"^[a-zA-Z0-9_\-.]{3,128}$"
+ aws_name_reject_list = ["aws-", "amazon", "amzn"]
+ aws_doc_types = [
+ "Command",
+ "Policy",
+ "Automation",
+ "Session",
+ "Package",
+ "ApplicationConfiguration",
+ "ApplicationConfigurationSchema",
+ "DeploymentStrategy",
+ "ChangeCalendar",
+ ]
+
+ _validate_document_format(document_format)
+
+ if not content:
+ raise ValidationException("Content is required")
+
+ if list(filter(name.startswith, aws_name_reject_list)):
+ raise ValidationException("Invalid document name " + str(name))
+ ssm_name_pattern = re.compile(aws_ssm_name_regex)
+ if not ssm_name_pattern.match(name):
+ raise ValidationException("Invalid document name " + str(name))
+
+ if strict and document_type not in aws_doc_types:
+ # Update document doesn't use document type
+ raise ValidationException("Invalid document type " + str(document_type))
+
+
+def _document_filter_equal_comparator(keyed_value, _filter):
+ for v in _filter["Values"]:
+ if keyed_value == v:
+ return True
+ return False
+
+
+def _document_filter_list_includes_comparator(keyed_value_list, _filter):
+ for v in _filter["Values"]:
+ if v in keyed_value_list:
+ return True
+ return False
+
+
+def _document_filter_match(filters, ssm_doc):
+ for _filter in filters:
+ if _filter["Key"] == "Name" and not _document_filter_equal_comparator(
+ ssm_doc.name, _filter
+ ):
+ return False
+
+ elif _filter["Key"] == "Owner":
+ if len(_filter["Values"]) != 1:
+ raise ValidationException("Owner filter can only have one value.")
+ if _filter["Values"][0] == "Self":
+ # Update to running account ID
+ _filter["Values"][0] = get_account_id()
+ if not _document_filter_equal_comparator(ssm_doc.owner, _filter):
+ return False
+
+ elif _filter[
+ "Key"
+ ] == "PlatformTypes" and not _document_filter_list_includes_comparator(
+ ssm_doc.platform_types, _filter
+ ):
+ return False
+
+ elif _filter["Key"] == "DocumentType" and not _document_filter_equal_comparator(
+ ssm_doc.document_type, _filter
+ ):
+ return False
+
+ elif _filter["Key"] == "TargetType" and not _document_filter_equal_comparator(
+ ssm_doc.target_type, _filter
+ ):
+ return False
+
+ return True
+
+
+def _valid_parameter_data_type(data_type):
+ """
+ Parameter DataType field allows only `text` and `aws:ec2:image` values
+
+ """
+ return data_type in ("text", "aws:ec2:image")
+
+
+class FakeMaintenanceWindow:
+ def __init__(
+ self,
+ name,
+ description,
+ enabled,
+ duration,
+ cutoff,
+ schedule,
+ schedule_timezone,
+ schedule_offset,
+ start_date,
+ end_date,
+ ):
+ self.id = FakeMaintenanceWindow.generate_id()
+ self.name = name
+ self.description = description
+ self.enabled = enabled
+ self.duration = duration
+ self.cutoff = cutoff
+ self.schedule = schedule
+ self.schedule_timezone = schedule_timezone
+ self.schedule_offset = schedule_offset
+ self.start_date = start_date
+ self.end_date = end_date
+
+ def to_json(self):
+ return {
+ "WindowId": self.id,
+ "Name": self.name,
+ "Description": self.description,
+ "Enabled": self.enabled,
+ "Duration": self.duration,
+ "Cutoff": self.cutoff,
+ "Schedule": self.schedule,
+ "ScheduleTimezone": self.schedule_timezone,
+ "ScheduleOffset": self.schedule_offset,
+ "StartDate": self.start_date,
+ "EndDate": self.end_date,
+ }
+
+ @staticmethod
+ def generate_id():
+ chars = list(range(10)) + ["a", "b", "c", "d", "e", "f"]
+ return "mw-" + "".join(str(random.choice(chars)) for _ in range(17))
+
+
+class SimpleSystemManagerBackend(BaseBackend):
+ """
+ Moto supports the following default parameters out of the box:
+
+ - /aws/service/global-infrastructure/regions
+ - /aws/service/global-infrastructure/services
+
+ Note that these are hardcoded, so they may be out of date for new services/regions.
+
+ Integration with SecretsManager is also supported.
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._parameters = ParameterDict(region_name)
+
+ self._resource_tags = defaultdict(lambda: defaultdict(dict))
+ self._commands = []
+ self._errors = []
+ self._documents: Dict[str, Documents] = {}
+
+ self.windows: Dict[str, FakeMaintenanceWindow] = dict()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint services."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ssm"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "ssmmessages"
+ )
+
+ def _generate_document_information(self, ssm_document, document_format):
+ content = self._get_document_content(document_format, ssm_document)
+ base = {
+ "Name": ssm_document.name,
+ "DocumentVersion": ssm_document.document_version,
+ "Status": ssm_document.status,
+ "Content": content,
+ "DocumentType": ssm_document.document_type,
+ "DocumentFormat": document_format,
+ }
+
+ if ssm_document.version_name:
+ base["VersionName"] = ssm_document.version_name
+ if ssm_document.requires:
+ base["Requires"] = ssm_document.requires
+ if ssm_document.attachments:
+ base["AttachmentsContent"] = ssm_document.attachments
+
+ return base
+
+ @staticmethod
+ def _get_document_content(document_format, ssm_document):
+ if document_format == ssm_document.document_format:
+ content = ssm_document.content
+ elif document_format == "JSON":
+ content = json.dumps(ssm_document.content_json)
+ elif document_format == "YAML":
+ content = yaml.dump(ssm_document.content_json)
+ else:
+ raise ValidationException("Invalid document format " + str(document_format))
+ return content
+
+ def _get_documents(self, name):
+ documents = self._documents.get(name)
+ if not documents:
+ raise InvalidDocument("The specified document does not exist.")
+ return documents
+
+ def _get_documents_tags(self, name):
+ docs_tags = self._resource_tags.get("Document")
+ if docs_tags:
+ document_tags = docs_tags.get(name, {})
+ return [
+ {"Key": tag, "Value": value} for tag, value in document_tags.items()
+ ]
+ return []
+
+ def create_document(
+ self,
+ content,
+ requires,
+ attachments,
+ name,
+ version_name,
+ document_type,
+ document_format,
+ target_type,
+ tags,
+ ):
+ ssm_document = Document(
+ name=name,
+ version_name=version_name,
+ content=content,
+ document_type=document_type,
+ document_format=document_format,
+ requires=requires,
+ attachments=attachments,
+ target_type=target_type,
+ )
+
+ _validate_document_info(
+ content=content,
+ name=name,
+ document_type=document_type,
+ document_format=document_format,
+ )
+
+ if self._documents.get(ssm_document.name):
+ raise DocumentAlreadyExists("The specified document already exists.")
+
+ documents = Documents(ssm_document)
+ self._documents[ssm_document.name] = documents
+
+ if tags:
+ document_tags = {t["Key"]: t["Value"] for t in tags}
+ self.add_tags_to_resource("Document", name, document_tags)
+
+ return documents.describe(tags=tags)
+
+ def delete_document(self, name, document_version, version_name, force):
+ documents = self._get_documents(name)
+
+ if documents.is_shared():
+ raise InvalidDocumentOperation("Must unshare document first before delete")
+
+ keys_to_delete = set()
+
+ if documents:
+ default_doc = documents.get_default_version()
+ if (
+ default_doc.document_type == "ApplicationConfigurationSchema"
+ and not force
+ ):
+ raise InvalidDocumentOperation(
+ "You attempted to delete a document while it is still shared. "
+ "You must stop sharing the document before you can delete it."
+ )
+
+ if document_version and document_version == default_doc.document_version:
+ raise InvalidDocumentOperation(
+ "Default version of the document can't be deleted."
+ )
+
+ if document_version or version_name:
+ # We delete only a specific version
+ delete_doc = documents.find(document_version, version_name)
+
+ # we can't delete only the default version
+ if (
+ delete_doc
+ and delete_doc.document_version == default_doc.document_version
+ and len(documents.versions) != 1
+ ):
+ raise InvalidDocumentOperation(
+ "Default version of the document can't be deleted."
+ )
+
+ if delete_doc:
+ keys_to_delete.add(delete_doc.document_version)
+ else:
+ raise InvalidDocument("The specified document does not exist.")
+ else:
+ # We are deleting all versions
+ keys_to_delete = set(documents.versions.keys())
+
+ documents.delete(*keys_to_delete)
+
+ if len(documents.versions) == 0:
+ self._resource_tags.get("Document", {}).pop(name, None)
+ del self._documents[name]
+
+ def get_document(self, name, document_version, version_name, document_format):
+
+ documents = self._get_documents(name)
+ ssm_document = documents.find(document_version, version_name)
+
+ if not document_format:
+ document_format = ssm_document.document_format
+ else:
+ _validate_document_format(document_format=document_format)
+
+ return self._generate_document_information(ssm_document, document_format)
+
+ def update_document_default_version(self, name, document_version):
+ documents = self._get_documents(name)
+ ssm_document = documents.update_default_version(document_version)
+
+ result = {
+ "Name": ssm_document.name,
+ "DefaultVersion": document_version,
+ }
+
+ if ssm_document.version_name:
+ result["DefaultVersionName"] = ssm_document.version_name
+
+ return result
+
+ def update_document(
+ self,
+ content,
+ attachments,
+ name,
+ version_name,
+ document_version,
+ document_format,
+ target_type,
+ ):
+ _validate_document_info(
+ content=content,
+ name=name,
+ document_type=None,
+ document_format=document_format,
+ strict=False,
+ )
+
+ documents = self._documents.get(name)
+ if not documents:
+ raise InvalidDocument("The specified document does not exist.")
+
+ if (
+ documents.latest_version != document_version
+ and document_version != "$LATEST"
+ ):
+ raise InvalidDocumentVersion(
+ "The document version is not valid or does not exist."
+ )
+
+ if version_name:
+ if documents.exists(version_name=version_name):
+ raise DuplicateDocumentVersionName(
+ "The specified version name is a duplicate."
+ )
+
+ old_ssm_document = documents.get_default_version()
+
+ new_version = str(int(documents.latest_version) + 1)
+ new_ssm_document = Document(
+ name=name,
+ version_name=version_name,
+ content=content,
+ document_type=old_ssm_document.document_type,
+ document_format=document_format,
+ requires=old_ssm_document.requires,
+ attachments=attachments,
+ target_type=target_type,
+ document_version=new_version,
+ )
+
+ for document in documents.versions.values():
+ if document.content == new_ssm_document.content:
+ if not target_type or target_type == document.target_type:
+ raise DuplicateDocumentContent(
+ "The content of the association document matches another document. "
+ "Change the content of the document and try again."
+ )
+
+ documents.add_new_version(new_ssm_document)
+ tags = self._get_documents_tags(name)
+ return documents.describe(document_version=new_version, tags=tags)
+
+ def describe_document(self, name, document_version, version_name):
+ documents = self._get_documents(name)
+ tags = self._get_documents_tags(name)
+ return documents.describe(document_version, version_name, tags=tags)
+
+ def list_documents(
+ self, document_filter_list, filters, max_results=10, next_token="0"
+ ):
+ if document_filter_list:
+ raise ValidationException(
+ "DocumentFilterList is deprecated. Instead use Filters."
+ )
+
+ next_token = int(next_token)
+ results = []
+ dummy_token_tracker = 0
+ # Sort to maintain next token adjacency
+ for _, documents in sorted(self._documents.items()):
+ if len(results) == max_results:
+ # There's still more to go so we need a next token
+ return results, str(next_token + len(results))
+
+ if dummy_token_tracker < next_token:
+ dummy_token_tracker += 1
+ continue
+
+ ssm_doc = documents.get_default_version()
+ if filters and not _document_filter_match(filters, ssm_doc):
+ # If we have filters enabled, and we don't match them,
+ continue
+ else:
+ tags = self._get_documents_tags(ssm_doc.name)
+ doc_describe = ssm_doc.list_describe(tags=tags)
+ results.append(doc_describe)
+
+ # If we've fallen out of the loop, theres no more documents. No next token.
+ return results, ""
+
+ def describe_document_permission(self, name):
+ """
+ Parameters max_results, permission_type, and next_token not yet implemented
+ """
+ document = self._get_documents(name)
+ return document.describe_permissions()
+
+ def modify_document_permission(
+ self,
+ name,
+ account_ids_to_add,
+ account_ids_to_remove,
+ shared_document_version,
+ permission_type,
+ ):
+
+ account_id_regex = re.compile(r"^(all|[0-9]{12})$", re.IGNORECASE)
+ version_regex = re.compile(r"^([$]LATEST|[$]DEFAULT|[$]ALL)$")
+
+ account_ids_to_add = account_ids_to_add or []
+ account_ids_to_remove = account_ids_to_remove or []
+
+ if shared_document_version and not version_regex.match(shared_document_version):
+ raise ValidationException(
+ f"Value '{shared_document_version}' at 'sharedDocumentVersion' failed to satisfy constraint: "
+ f"Member must satisfy regular expression pattern: ([$]LATEST|[$]DEFAULT|[$]ALL)."
+ )
+
+ for account_id in account_ids_to_add:
+ if not account_id_regex.match(account_id):
+ raise ValidationException(
+ f"Value '[{account_id}]' at 'accountIdsToAdd' failed to satisfy constraint: "
+ "Member must satisfy regular expression pattern: (all|[0-9]{12}])."
+ )
+
+ for account_id in account_ids_to_remove:
+ if not account_id_regex.match(account_id):
+ raise ValidationException(
+ f"Value '[{account_id}]' at 'accountIdsToRemove' failed to satisfy constraint: "
+ "Member must satisfy regular expression pattern: (?i)all|[0-9]{12}]."
+ )
+
+ if "all" in account_ids_to_add and len(account_ids_to_add) > 1:
+ raise DocumentPermissionLimit(
+ "Accounts can either be all or a group of AWS accounts"
+ )
+
+ if "all" in account_ids_to_remove and len(account_ids_to_remove) > 1:
+ raise DocumentPermissionLimit(
+ "Accounts can either be all or a group of AWS accounts"
+ )
+
+ if permission_type != "Share":
+ raise InvalidPermissionType(
+ f"Value '{permission_type}' at 'permissionType' failed to satisfy constraint: "
+ "Member must satisfy enum value set: [Share]."
+ )
+
+ document = self._get_documents(name)
+ document.modify_permissions(
+ account_ids_to_add, account_ids_to_remove, shared_document_version
+ )
+
+ def delete_parameter(self, name):
+ self._resource_tags.get("Parameter", {}).pop(name, None)
+ return self._parameters.pop(name, None)
+
+ def delete_parameters(self, names):
+ result = []
+ for name in names:
+ try:
+ del self._parameters[name]
+ result.append(name)
+ self._resource_tags.get("Parameter", {}).pop(name, None)
+ except KeyError:
+ pass
+ return result
+
+ def describe_parameters(self, filters, parameter_filters):
+ if filters and parameter_filters:
+ raise ValidationException(
+ "You can use either Filters or ParameterFilters in a single request."
+ )
+
+ self._validate_parameter_filters(parameter_filters, by_path=False)
+
+ result = []
+ for param_name in self._parameters:
+ ssm_parameter = self.get_parameter(param_name)
+ if not self._match_filters(ssm_parameter, parameter_filters):
+ continue
+
+ if filters:
+ for _filter in filters:
+ if _filter["Key"] == "Name":
+ k = ssm_parameter.name
+ for v in _filter["Values"]:
+ if k.startswith(v):
+ result.append(ssm_parameter)
+ break
+ elif _filter["Key"] == "Type":
+ k = ssm_parameter.type
+ for v in _filter["Values"]:
+ if k == v:
+ result.append(ssm_parameter)
+ break
+ elif _filter["Key"] == "KeyId":
+ k = ssm_parameter.keyid
+ if k:
+ for v in _filter["Values"]:
+ if k == v:
+ result.append(ssm_parameter)
+ break
+ continue
+
+ result.append(ssm_parameter)
+
+ return result
+
+ def _validate_parameter_filters(self, parameter_filters, by_path):
+ for index, filter_obj in enumerate(parameter_filters or []):
+ key = filter_obj["Key"]
+ values = filter_obj.get("Values", [])
+
+ if key == "Path":
+ option = filter_obj.get("Option", "OneLevel")
+ else:
+ option = filter_obj.get("Option", "Equals")
+
+ if not re.match(r"^tag:.+|Name|Type|KeyId|Path|Label|Tier$", key):
+ self._errors.append(
+ self._format_error(
+ key="parameterFilters.{index}.member.key".format(
+ index=(index + 1)
+ ),
+ value=key,
+ constraint="Member must satisfy regular expression pattern: tag:.+|Name|Type|KeyId|Path|Label|Tier",
+ )
+ )
+
+ if len(key) > 132:
+ self._errors.append(
+ self._format_error(
+ key="parameterFilters.{index}.member.key".format(
+ index=(index + 1)
+ ),
+ value=key,
+ constraint="Member must have length less than or equal to 132",
+ )
+ )
+
+ if len(option) > 10:
+ self._errors.append(
+ self._format_error(
+ key="parameterFilters.{index}.member.option".format(
+ index=(index + 1)
+ ),
+ value="over 10 chars",
+ constraint="Member must have length less than or equal to 10",
+ )
+ )
+
+ if len(values) > 50:
+ self._errors.append(
+ self._format_error(
+ key="parameterFilters.{index}.member.values".format(
+ index=(index + 1)
+ ),
+ value=values,
+ constraint="Member must have length less than or equal to 50",
+ )
+ )
+
+ if any(len(value) > 1024 for value in values):
+ self._errors.append(
+ self._format_error(
+ key="parameterFilters.{index}.member.values".format(
+ index=(index + 1)
+ ),
+ value=values,
+ constraint="[Member must have length less than or equal to 1024, Member must have length greater than or equal to 1]",
+ )
+ )
+
+ self._raise_errors()
+
+ filter_keys = []
+ for filter_obj in parameter_filters or []:
+ key = filter_obj["Key"]
+ values = filter_obj.get("Values")
+
+ if key == "Path":
+ option = filter_obj.get("Option", "OneLevel")
+ else:
+ option = filter_obj.get("Option", "Equals")
+
+ if not by_path and key == "Label":
+ raise InvalidFilterKey(
+ "The following filter key is not valid: Label. Valid filter keys include: [Path, Name, Type, KeyId, Tier]."
+ )
+
+ if by_path and key in ["Name", "Path", "Tier"]:
+ raise InvalidFilterKey(
+ "The following filter key is not valid: {key}. Valid filter keys include: [Type, KeyId].".format(
+ key=key
+ )
+ )
+
+ if not values:
+ raise InvalidFilterValue(
+ "The following filter values are missing : null for filter key Name."
+ )
+
+ if key in filter_keys:
+ raise InvalidFilterKey(
+ "The following filter is duplicated in the request: Name. A request can contain only one occurrence of a specific filter."
+ )
+
+ if key == "Path":
+ if option not in ["Recursive", "OneLevel"]:
+ raise InvalidFilterOption(
+ "The following filter option is not valid: {option}. Valid options include: [Recursive, OneLevel].".format(
+ option=option
+ )
+ )
+ if any(value.lower().startswith(("/aws", "/ssm")) for value in values):
+ raise ValidationException(
+ 'Filters for common parameters can\'t be prefixed with "aws" or "ssm" (case-insensitive). '
+ "When using global parameters, please specify within a global namespace."
+ )
+ for value in values:
+ if value.lower().startswith(("/aws", "/ssm")):
+ raise ValidationException(
+ 'Filters for common parameters can\'t be prefixed with "aws" or "ssm" (case-insensitive). '
+ "When using global parameters, please specify within a global namespace."
+ )
+ if (
+ "//" in value
+ or not value.startswith("/")
+ or not re.match(r"^[a-zA-Z0-9_.\-/]*$", value)
+ ):
+ raise ValidationException(
+ 'The parameter doesn\'t meet the parameter name requirements. The parameter name must begin with a forward slash "/". '
+ 'It can\'t be prefixed with "aws" or "ssm" (case-insensitive). '
+ "It must use only letters, numbers, or the following symbols: . (period), - (hyphen), _ (underscore). "
+ 'Special characters are not allowed. All sub-paths, if specified, must use the forward slash symbol "/". '
+ "Valid example: /get/parameters2-/by1./path0_."
+ )
+
+ if key == "Tier":
+ for value in values:
+ if value not in ["Standard", "Advanced", "Intelligent-Tiering"]:
+ raise InvalidFilterOption(
+ "The following filter value is not valid: {value}. Valid values include: [Standard, Advanced, Intelligent-Tiering].".format(
+ value=value
+ )
+ )
+
+ if key == "Type":
+ for value in values:
+ if value not in ["String", "StringList", "SecureString"]:
+ raise InvalidFilterOption(
+ "The following filter value is not valid: {value}. Valid values include: [String, StringList, SecureString].".format(
+ value=value
+ )
+ )
+
+ allowed_options = ["Equals", "BeginsWith"]
+ if key == "Name":
+ allowed_options += ["Contains"]
+ if key != "Path" and option not in allowed_options:
+ raise InvalidFilterOption(
+ "The following filter option is not valid: {option}. Valid options include: [BeginsWith, Equals].".format(
+ option=option
+ )
+ )
+
+ filter_keys.append(key)
+
+ def _format_error(self, key, value, constraint):
+ return 'Value "{value}" at "{key}" failed to satisfy constraint: {constraint}'.format(
+ constraint=constraint, key=key, value=value
+ )
+
+ def _raise_errors(self):
+ if self._errors:
+ count = len(self._errors)
+ plural = "s" if len(self._errors) > 1 else ""
+ errors = "; ".join(self._errors)
+ self._errors = [] # reset collected errors
+
+ raise ValidationException(
+ "{count} validation error{plural} detected: {errors}".format(
+ count=count, plural=plural, errors=errors
+ )
+ )
+
+ def get_all_parameters(self):
+ result = []
+ for k, _ in self._parameters.items():
+ result.append(self._parameters[k])
+ return result
+
+ def get_parameters(self, names):
+ result = {}
+
+ if len(names) > 10:
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '[{}]' at 'names' failed to satisfy constraint: "
+ "Member must have length less than or equal to 10.".format(
+ ", ".join(names)
+ )
+ )
+
+ for name in set(names):
+ if name.split(":")[0] in self._parameters:
+ try:
+ param = self.get_parameter(name)
+
+ if param is not None:
+ result[name] = param
+ except ParameterVersionNotFound:
+ pass
+ return result
+
+ def get_parameters_by_path(
+ self,
+ path,
+ recursive,
+ filters=None,
+ next_token=None,
+ max_results=10,
+ ):
+ """Implement the get-parameters-by-path-API in the backend."""
+
+ self._validate_parameter_filters(filters, by_path=True)
+
+ result = []
+ # path could be with or without a trailing /. we handle this
+ # difference here.
+ path = path.rstrip("/") + "/"
+ for param_name in self._parameters.get_keys_beginning_with(path, recursive):
+ parameter = self.get_parameter(param_name)
+ if not self._match_filters(parameter, filters):
+ continue
+ result.append(parameter)
+
+ return self._get_values_nexttoken(result, max_results, next_token)
+
+ def _get_values_nexttoken(self, values_list, max_results, next_token=None):
+ if next_token is None:
+ next_token = 0
+ next_token = int(next_token)
+ max_results = int(max_results)
+ values = values_list[next_token : next_token + max_results]
+ if len(values) == max_results:
+ next_token = str(next_token + max_results)
+ else:
+ next_token = None
+ return values, next_token
+
+ def get_parameter_history(self, name, next_token, max_results=50):
+
+ if max_results > PARAMETER_HISTORY_MAX_RESULTS:
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '{}' at 'maxResults' failed to satisfy constraint: "
+ "Member must have value less than or equal to {}.".format(
+ max_results, PARAMETER_HISTORY_MAX_RESULTS
+ )
+ )
+
+ if name in self._parameters:
+ history = self._parameters[name]
+ return self._get_history_nexttoken(history, next_token, max_results)
+
+ return None, None
+
+ def _get_history_nexttoken(self, history, next_token, max_results):
+ if next_token is None:
+ next_token = 0
+ next_token = int(next_token)
+ max_results = int(max_results)
+ history_to_return = history[next_token : next_token + max_results]
+ if (
+ len(history_to_return) == max_results
+ and len(history) > next_token + max_results
+ ):
+ new_next_token = next_token + max_results
+ return history_to_return, str(new_next_token)
+ return history_to_return, None
+
+ def _match_filters(self, parameter, filters=None):
+ """Return True if the given parameter matches all the filters"""
+ for filter_obj in filters or []:
+ key = filter_obj["Key"]
+ values = filter_obj.get("Values", [])
+
+ if key == "Path":
+ option = filter_obj.get("Option", "OneLevel")
+ else:
+ option = filter_obj.get("Option", "Equals")
+
+ what = None
+ if key == "KeyId":
+ what = parameter.keyid
+ elif key == "Name":
+ what = "/" + parameter.name.lstrip("/")
+ if option != "Contains":
+ values = ["/" + value.lstrip("/") for value in values]
+ elif key == "Path":
+ what = "/" + parameter.name.lstrip("/")
+ values = ["/" + value.strip("/") for value in values]
+ elif key == "Type":
+ what = parameter.type
+ elif key == "Label":
+ what = parameter.labels
+ # Label filter can only have option="Equals" (also valid implicitly)
+ if len(what) == 0 or not all(label in values for label in what):
+ return False
+ else:
+ continue
+ elif key.startswith("tag:"):
+ what = key[4:] or None
+ for tag in parameter.tags:
+ if tag["Key"] == what and tag["Value"] in values:
+ return True
+ return False
+
+ if what is None:
+ return False
+ elif option == "BeginsWith" and not any(
+ what.startswith(value) for value in values
+ ):
+ return False
+ elif option == "Contains" and not any(value in what for value in values):
+ return False
+ elif option == "Equals" and not any(what == value for value in values):
+ return False
+ elif option == "OneLevel":
+ if any(value == "/" and len(what.split("/")) == 2 for value in values):
+ continue
+ elif any(
+ value != "/"
+ and what.startswith(value + "/")
+ and len(what.split("/")) - 1 == len(value.split("/"))
+ for value in values
+ ):
+ continue
+ else:
+ return False
+ elif option == "Recursive":
+ if any(value == "/" for value in values):
+ continue
+ elif any(what.startswith(value + "/") for value in values):
+ continue
+ else:
+ return False
+ # True if no false match (or no filters at all)
+ return True
+
+ def get_parameter(self, name):
+ name_parts = name.split(":")
+ name_prefix = name_parts[0]
+
+ if len(name_parts) > 2:
+ return None
+
+ if name_prefix in self._parameters:
+ if len(name_parts) == 1:
+ return self._parameters[name][-1]
+
+ if len(name_parts) == 2:
+ version_or_label = name_parts[1]
+ parameters = self._parameters[name_prefix]
+
+ if version_or_label.isdigit():
+ result = list(
+ filter(lambda x: str(x.version) == version_or_label, parameters)
+ )
+ if len(result) > 0:
+ return result[-1]
+ elif len(parameters) > 0:
+ raise ParameterVersionNotFound(
+ "Systems Manager could not find version %s of %s. "
+ "Verify the version and try again."
+ % (version_or_label, name_prefix)
+ )
+ result = list(
+ filter(lambda x: version_or_label in x.labels, parameters)
+ )
+ if len(result) > 0:
+ return result[-1]
+
+ return None
+
+ def label_parameter_version(self, name, version, labels):
+ previous_parameter_versions = self._parameters[name]
+ if not previous_parameter_versions:
+ raise ParameterNotFound("Parameter %s not found." % name)
+ found_parameter = None
+ labels_needing_removal = []
+ if not version:
+ version = 1
+ for parameter in previous_parameter_versions:
+ if parameter.version >= version:
+ version = parameter.version
+ for parameter in previous_parameter_versions:
+ if parameter.version == version:
+ found_parameter = parameter
+ else:
+ for label in labels:
+ if label in parameter.labels:
+ labels_needing_removal.append(label)
+ if not found_parameter:
+ raise ParameterVersionNotFound(
+ "Systems Manager could not find version %s of %s. "
+ "Verify the version and try again." % (version, name)
+ )
+ labels_to_append = []
+ invalid_labels = []
+ for label in labels:
+ if (
+ label.startswith("aws")
+ or label.startswith("ssm")
+ or label[:1].isdigit()
+ or not re.match(r"^[a-zA-z0-9_\.\-]*$", label)
+ ):
+ invalid_labels.append(label)
+ continue
+ if len(label) > 100:
+ raise ValidationException(
+ "1 validation error detected: "
+ "Value '[%s]' at 'labels' failed to satisfy constraint: "
+ "Member must satisfy constraint: "
+ "[Member must have length less than or equal to 100, Member must have length greater than or equal to 1]"
+ % label
+ )
+ continue
+ if label not in found_parameter.labels:
+ labels_to_append.append(label)
+ if (len(found_parameter.labels) + len(labels_to_append)) > 10:
+ raise ParameterVersionLabelLimitExceeded(
+ "An error occurred (ParameterVersionLabelLimitExceeded) when calling the LabelParameterVersion operation: "
+ "A parameter version can have maximum 10 labels."
+ "Move one or more labels to another version and try again."
+ )
+ found_parameter.labels = found_parameter.labels + labels_to_append
+ for parameter in previous_parameter_versions:
+ if parameter.version != version:
+ for label in parameter.labels[:]:
+ if label in labels_needing_removal:
+ parameter.labels.remove(label)
+ return [invalid_labels, version]
+
+ def _check_for_parameter_version_limit_exception(self, name):
+ # https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html
+ parameter_versions = self._parameters[name]
+ oldest_parameter = parameter_versions[0]
+ if oldest_parameter.labels:
+ raise ParameterMaxVersionLimitExceeded(
+ "You attempted to create a new version of %s by calling the PutParameter API "
+ "with the overwrite flag. Version %d, the oldest version, can't be deleted "
+ "because it has a label associated with it. Move the label to another version "
+ "of the parameter, and try again." % (name, oldest_parameter.version)
+ )
+
+ def put_parameter(
+ self,
+ name,
+ description,
+ value,
+ parameter_type,
+ allowed_pattern,
+ keyid,
+ overwrite,
+ tags,
+ data_type,
+ ):
+ if not value:
+ raise ValidationException(
+ "1 validation error detected: Value '' at 'value' failed to satisfy"
+ " constraint: Member must have length greater than or equal to 1."
+ )
+ if overwrite and tags:
+ raise ValidationException(
+ "Invalid request: tags and overwrite can't be used together. To create a "
+ "parameter with tags, please remove overwrite flag. To update tags for an "
+ "existing parameter, please use AddTagsToResource or RemoveTagsFromResource."
+ )
+ if name.lower().lstrip("/").startswith("aws") or name.lower().lstrip(
+ "/"
+ ).startswith("ssm"):
+ is_path = name.count("/") > 1
+ if name.lower().startswith("/aws") and is_path:
+ raise AccessDeniedException(
+ "No access to reserved parameter name: {name}.".format(name=name)
+ )
+ if not is_path:
+ invalid_prefix_error = 'Parameter name: can\'t be prefixed with "aws" or "ssm" (case-insensitive).'
+ else:
+ invalid_prefix_error = (
+ 'Parameter name: can\'t be prefixed with "ssm" (case-insensitive). '
+ "If formed as a path, it can consist of sub-paths divided by slash symbol; each sub-path can be "
+ "formed as a mix of letters, numbers and the following 3 symbols .-_"
+ )
+ raise ValidationException(invalid_prefix_error)
+
+ if not _valid_parameter_data_type(data_type):
+ # The check of the existence of an AMI ID in the account for a parameter of DataType `aws:ec2:image`
+ # is not supported. The parameter will be created.
+ # https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-ec2-aliases.html
+ raise ValidationException(
+ f"The following data type is not supported: {data_type} (Data type names are all lowercase.)"
+ )
+
+ previous_parameter_versions = self._parameters[name]
+ if len(previous_parameter_versions) == 0:
+ previous_parameter = None
+ version = 1
+ else:
+ previous_parameter = previous_parameter_versions[-1]
+ version = previous_parameter.version + 1
+
+ if not overwrite:
+ return
+
+ if len(previous_parameter_versions) >= PARAMETER_VERSION_LIMIT:
+ self._check_for_parameter_version_limit_exception(name)
+ previous_parameter_versions.pop(0)
+
+ last_modified_date = time.time()
+ self._parameters[name].append(
+ Parameter(
+ name=name,
+ value=value,
+ parameter_type=parameter_type,
+ description=description,
+ allowed_pattern=allowed_pattern,
+ keyid=keyid,
+ last_modified_date=last_modified_date,
+ version=version,
+ tags=tags or [],
+ data_type=data_type,
+ )
+ )
+
+ if tags:
+ tags = {t["Key"]: t["Value"] for t in tags}
+ self.add_tags_to_resource("Parameter", name, tags)
+
+ return version
+
+ def add_tags_to_resource(self, resource_type, resource_id, tags):
+ self._validate_resource_type_and_id(resource_type, resource_id)
+ for key, value in tags.items():
+ self._resource_tags[resource_type][resource_id][key] = value
+
+ def remove_tags_from_resource(self, resource_type, resource_id, keys):
+ self._validate_resource_type_and_id(resource_type, resource_id)
+ tags = self._resource_tags[resource_type][resource_id]
+ for key in keys:
+ if key in tags:
+ del tags[key]
+
+ def list_tags_for_resource(self, resource_type, resource_id):
+ self._validate_resource_type_and_id(resource_type, resource_id)
+ return self._resource_tags[resource_type][resource_id]
+
+ def _validate_resource_type_and_id(self, resource_type, resource_id):
+ if resource_type == "Parameter":
+ if resource_id not in self._parameters:
+ raise InvalidResourceId()
+ else:
+ return
+ elif resource_type == "Document":
+ if resource_id not in self._documents:
+ raise InvalidResourceId()
+ else:
+ return
+ elif resource_type not in (
+ # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Client.remove_tags_from_resource
+ "ManagedInstance",
+ "MaintenanceWindow",
+ "PatchBaseline",
+ "OpsItem",
+ "OpsMetadata",
+ ):
+ raise InvalidResourceType()
+ else:
+ raise InvalidResourceId()
+
+ def send_command(self, **kwargs):
+ command = Command(
+ comment=kwargs.get("Comment", ""),
+ document_name=kwargs.get("DocumentName"),
+ timeout_seconds=kwargs.get("TimeoutSeconds", 3600),
+ instance_ids=kwargs.get("InstanceIds", []),
+ max_concurrency=kwargs.get("MaxConcurrency", "50"),
+ max_errors=kwargs.get("MaxErrors", "0"),
+ notification_config=kwargs.get(
+ "NotificationConfig",
+ {
+ "NotificationArn": "string",
+ "NotificationEvents": ["Success"],
+ "NotificationType": "Command",
+ },
+ ),
+ output_s3_bucket_name=kwargs.get("OutputS3BucketName", ""),
+ output_s3_key_prefix=kwargs.get("OutputS3KeyPrefix", ""),
+ output_s3_region=kwargs.get("OutputS3Region", ""),
+ parameters=kwargs.get("Parameters", {}),
+ service_role_arn=kwargs.get("ServiceRoleArn", ""),
+ targets=kwargs.get("Targets", []),
+ backend_region=self.region_name,
+ )
+
+ self._commands.append(command)
+ return {"Command": command.response_object()}
+
+ def list_commands(self, **kwargs):
+ """
+ https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_ListCommands.html
+ """
+ commands = self._commands
+
+ command_id = kwargs.get("CommandId", None)
+ if command_id:
+ commands = [self.get_command_by_id(command_id)]
+ instance_id = kwargs.get("InstanceId", None)
+ if instance_id:
+ commands = self.get_commands_by_instance_id(instance_id)
+
+ return {"Commands": [command.response_object() for command in commands]}
+
+ def get_command_by_id(self, command_id):
+ command = next(
+ (command for command in self._commands if command.command_id == command_id),
+ None,
+ )
+
+ if command is None:
+ raise RESTError("InvalidCommandId", "Invalid command id.")
+
+ return command
+
+ def get_commands_by_instance_id(self, instance_id):
+ return [
+ command for command in self._commands if instance_id in command.instance_ids
+ ]
+
+ def get_command_invocation(self, **kwargs):
+ """
+ https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetCommandInvocation.html
+ """
+
+ command_id = kwargs.get("CommandId")
+ instance_id = kwargs.get("InstanceId")
+ plugin_name = kwargs.get("PluginName", None)
+
+ command = self.get_command_by_id(command_id)
+ return command.get_invocation(instance_id, plugin_name)
+
+ def create_maintenance_window(
+ self,
+ name,
+ description,
+ enabled,
+ duration,
+ cutoff,
+ schedule,
+ schedule_timezone,
+ schedule_offset,
+ start_date,
+ end_date,
+ ):
+ """
+ Creates a maintenance window. No error handling or input validation has been implemented yet.
+ """
+ window = FakeMaintenanceWindow(
+ name,
+ description,
+ enabled,
+ duration,
+ cutoff,
+ schedule,
+ schedule_timezone,
+ schedule_offset,
+ start_date,
+ end_date,
+ )
+ self.windows[window.id] = window
+ return window.id
+
+ def get_maintenance_window(self, window_id):
+ """
+ The window is assumed to exist - no error handling has been implemented yet.
+ The NextExecutionTime-field is not returned.
+ """
+ return self.windows[window_id]
+
+ def describe_maintenance_windows(self, filters):
+ """
+ Returns all windows. No pagination has been implemented yet. Only filtering for Name is supported.
+ The NextExecutionTime-field is not returned.
+
+ """
+ res = [window for window in self.windows.values()]
+ if filters:
+ for f in filters:
+ if f["Key"] == "Name":
+ res = [w for w in res if w.name in f["Values"]]
+ return res
+
+ def delete_maintenance_window(self, window_id):
+ """
+ Assumes the provided WindowId exists. No error handling has been implemented yet.
+ """
+ del self.windows[window_id]
+
+
+ssm_backends = BackendDict(SimpleSystemManagerBackend, "ssm")
diff --git a/contrib/python/moto/py3/moto/ssm/resources/regions.json b/contrib/python/moto/py3/moto/ssm/resources/regions.json
new file mode 100644
index 0000000000..140197175d
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/resources/regions.json
@@ -0,0 +1,42769 @@
+{
+ "aws": {
+ "service": {
+ "global-infrastructure": {
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "availability-zones": {
+ "afs1-az1": {
+ "Value": "afs1-az1"
+ },
+ "afs1-az2": {
+ "Value": "afs1-az2"
+ },
+ "afs1-az3": {
+ "Value": "afs1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "ZA"
+ },
+ "geolocationRegion": {
+ "Value": "WC"
+ },
+ "longName": {
+ "Value": "Africa (Cape Town)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata"
+ },
+ "appflow": {
+ "Value": "appflow"
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.af-south-1.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "availability-zones": {
+ "ape1-az1": {
+ "Value": "ape1-az1"
+ },
+ "ape1-az2": {
+ "Value": "ape1-az2"
+ },
+ "ape1-az3": {
+ "Value": "ape1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "CN"
+ },
+ "geolocationRegion": {
+ "Value": "CN-91"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Hong Kong)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-east-1.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "availability-zones": {
+ "apne1-az1": {
+ "Value": "apne1-az1"
+ },
+ "apne1-az2": {
+ "Value": "apne1-az2"
+ },
+ "apne1-az3": {
+ "Value": "apne1-az3"
+ },
+ "apne1-az4": {
+ "Value": "apne1-az4"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "JP"
+ },
+ "geolocationRegion": {
+ "Value": "JP-13"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Tokyo)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "endpoint": {
+ "Value": "apprunner.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ap-northeast-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "endpoint": {
+ "Value": "datapipeline.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "deeplens": {
+ "Value": "deeplens",
+ "endpoint": {
+ "Value": "deeplens.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdeviceadvisor": {
+ "Value": "iotdeviceadvisor",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "endpoint": {
+ "Value": "api.iotwireless.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "proton": {
+ "Value": "proton",
+ "endpoint": {
+ "Value": "proton.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ },
+ "wavelength-zones": {
+ "apne1-wl1-kix-wlz1": {
+ "Value": "apne1-wl1-kix-wlz1"
+ },
+ "apne1-wl1-nrt-wlz1": {
+ "Value": "apne1-wl1-nrt-wlz1"
+ }
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "availability-zones": {
+ "apne2-az1": {
+ "Value": "apne2-az1"
+ },
+ "apne2-az2": {
+ "Value": "apne2-az2"
+ },
+ "apne2-az3": {
+ "Value": "apne2-az3"
+ },
+ "apne2-az4": {
+ "Value": "apne2-az4"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "KR"
+ },
+ "geolocationRegion": {
+ "Value": "KR-28"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Seoul)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ap-northeast-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutequipment": {
+ "Value": "lookoutequipment",
+ "endpoint": {
+ "Value": "lookoutequipment.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-2.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "availability-zones": {
+ "apne3-az1": {
+ "Value": "apne3-az1"
+ },
+ "apne3-az2": {
+ "Value": "apne3-az2"
+ },
+ "apne3-az3": {
+ "Value": "apne3-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "JP"
+ },
+ "geolocationRegion": {
+ "Value": "JP-27"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Osaka)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.ap-northeast-3.amazonaws.com"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace",
+ "endpoint": {
+ "Value": "marketplace.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-3.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "availability-zones": {
+ "aps1-az1": {
+ "Value": "aps1-az1"
+ },
+ "aps1-az2": {
+ "Value": "aps1-az2"
+ },
+ "aps1-az3": {
+ "Value": "aps1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "IN"
+ },
+ "geolocationRegion": {
+ "Value": "IN-MH"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Mumbai)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.ap-south-1.amazonaws.com"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ap-south-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pricing": {
+ "Value": "pricing",
+ "endpoint": {
+ "Value": "api.pricing.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-south-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "availability-zones": {
+ "apse1-az1": {
+ "Value": "apse1-az1"
+ },
+ "apse1-az2": {
+ "Value": "apse1-az2"
+ },
+ "apse1-az3": {
+ "Value": "apse1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "SG"
+ },
+ "geolocationRegion": {
+ "Value": "SG-01"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Singapore)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ap-southeast-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "evidently": {
+ "Value": "evidently",
+ "endpoint": {
+ "Value": "evidently.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resiliencehub": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-southeast-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "voice-id": {
+ "Value": "voice-id"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wam": {
+ "Value": "wam"
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "availability-zones": {
+ "apse2-az1": {
+ "Value": "apse2-az1"
+ },
+ "apse2-az2": {
+ "Value": "apse2-az2"
+ },
+ "apse2-az3": {
+ "Value": "apse2-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "AU"
+ },
+ "geolocationRegion": {
+ "Value": "AU-NSW"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Sydney)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ap-southeast-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "endpoint": {
+ "Value": "datapipeline.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "evidently": {
+ "Value": "evidently",
+ "endpoint": {
+ "Value": "evidently.ap-southeast-2.amazonaws.com"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "endpoint": {
+ "Value": "api.iotwireless.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "endpoint": {
+ "Value": "nimble.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rum": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ap-southeast-2.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "voice-id": {
+ "endpoint": {
+ "Value": "voiceid.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wam": {
+ "Value": "wam"
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wisdom": {
+ "Value": "wisdom",
+ "endpoint": {
+ "Value": "wisdom.ap-southeast-2.amazonaws.com"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "availability-zones": {
+ "apse3-az1": {
+ "Value": "apse3-az1"
+ },
+ "apse3-az2": {
+ "Value": "apse3-az2"
+ },
+ "apse3-az3": {
+ "Value": "apse3-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "ID"
+ },
+ "geolocationRegion": {
+ "Value": "ID-JK"
+ },
+ "longName": {
+ "Value": "Asia Pacific (Jakarta)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "availability-zones": {
+ "cac1-az1": {
+ "Value": "cac1-az1"
+ },
+ "cac1-az2": {
+ "Value": "cac1-az2"
+ },
+ "cac1-az4": {
+ "Value": "cac1-az4"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "CA"
+ },
+ "geolocationRegion": {
+ "Value": "CA-QC"
+ },
+ "longName": {
+ "Value": "Canada (Central)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata",
+ "endpoint": {
+ "Value": "appconfigdata.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway"
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.ca-central-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "finspace": {
+ "Value": "finspace",
+ "endpoint": {
+ "Value": "finspace.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "endpoint": {
+ "Value": "finspace-api.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "endpoint": {
+ "Value": "nimble.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.ca-central-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "availability-zones": {
+ "cnn1-az1": {
+ "Value": "cnn1-az1"
+ },
+ "cnn1-az2": {
+ "Value": "cnn1-az2"
+ },
+ "cnn1-az4": {
+ "Value": "cnn1-az4"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com.cn"
+ },
+ "geolocationCountry": {
+ "Value": "CN"
+ },
+ "geolocationRegion": {
+ "Value": "CN-11"
+ },
+ "longName": {
+ "Value": "China (Beijing)"
+ },
+ "partition": {
+ "Value": "aws-cn"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata",
+ "endpoint": {
+ "Value": "appconfigdata.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "health": {
+ "Value": "health",
+ "endpoint": {
+ "Value": "health.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data.ats.iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.amazonaws.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.cn-north-1.amazonaws.com.cn"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "cn.transcribe.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "availability-zones": {
+ "cnnw1-az1": {
+ "Value": "cnnw1-az1"
+ },
+ "cnnw1-az2": {
+ "Value": "cnnw1-az2"
+ },
+ "cnnw1-az3": {
+ "Value": "cnnw1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com.cn"
+ },
+ "geolocationCountry": {
+ "Value": "CN"
+ },
+ "geolocationRegion": {
+ "Value": "CN-64"
+ },
+ "longName": {
+ "Value": "China (Ningxia)"
+ },
+ "partition": {
+ "Value": "aws-cn"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "costexplorer": {
+ "Value": "costexplorer",
+ "endpoint": {
+ "Value": "ce.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cur": {
+ "Value": "cur",
+ "endpoint": {
+ "Value": "cur.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "health": {
+ "Value": "health",
+ "endpoint": {
+ "Value": "health.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.amazonaws.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "cn.transcribe.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "availability-zones": {
+ "euc1-az1": {
+ "Value": "euc1-az1"
+ },
+ "euc1-az2": {
+ "Value": "euc1-az2"
+ },
+ "euc1-az3": {
+ "Value": "euc1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "DE"
+ },
+ "geolocationRegion": {
+ "Value": "DE-HE"
+ },
+ "longName": {
+ "Value": "Europe (Frankfurt)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata",
+ "endpoint": {
+ "Value": "appconfigdata.eu-central-1.amazonaws.com"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.eu-central-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "deeplens": {
+ "Value": "deeplens",
+ "endpoint": {
+ "Value": "deeplens.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "migrationhubstrategy": {
+ "Value": "migrationhubstrategy"
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rbin": {
+ "endpoint": {
+ "Value": "rbin.eu-central-1.amazonaws.com"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snow-device-management": {
+ "Value": "snow-device-management",
+ "endpoint": {
+ "Value": "snow-device-management.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-central-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "timestream": {
+ "Value": "timestream"
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ },
+ "wavelength-zones": {
+ "euc1-wl1-ber-wlz1": {
+ "Value": "euc1-wl1-ber-wlz1"
+ },
+ "euc1-wl1-dtm-wlz1": {
+ "Value": "euc1-wl1-dtm-wlz1"
+ },
+ "euc1-wl1-muc-wlz1": {
+ "Value": "euc1-wl1-muc-wlz1"
+ }
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "availability-zones": {
+ "eun1-az1": {
+ "Value": "eun1-az1"
+ },
+ "eun1-az2": {
+ "Value": "eun1-az2"
+ },
+ "eun1-az3": {
+ "Value": "eun1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "SE"
+ },
+ "geolocationRegion": {
+ "Value": "SE-AB"
+ },
+ "longName": {
+ "Value": "Europe (Stockholm)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.eu-north-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-north-1.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "availability-zones": {
+ "eus1-az1": {
+ "Value": "eus1-az1"
+ },
+ "eus1-az2": {
+ "Value": "eus1-az2"
+ },
+ "eus1-az3": {
+ "Value": "eus1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "IT"
+ },
+ "geolocationRegion": {
+ "Value": "IT-MI"
+ },
+ "longName": {
+ "Value": "Europe (Milan)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-south-1.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "availability-zones": {
+ "euw1-az1": {
+ "Value": "euw1-az1"
+ },
+ "euw1-az2": {
+ "Value": "euw1-az2"
+ },
+ "euw1-az3": {
+ "Value": "euw1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "IE"
+ },
+ "geolocationRegion": {
+ "Value": "IE-D"
+ },
+ "longName": {
+ "Value": "Europe (Ireland)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "endpoint": {
+ "Value": "apprunner.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsm": {
+ "Value": "cloudhsm",
+ "endpoint": {
+ "Value": "cloudhsm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.eu-west-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "endpoint": {
+ "Value": "datapipeline.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "finspace": {
+ "Value": "finspace",
+ "endpoint": {
+ "Value": "finspace.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "endpoint": {
+ "Value": "finspace-api.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdeviceadvisor": {
+ "Value": "iotdeviceadvisor",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "endpoint": {
+ "Value": "api.iotwireless.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutequipment": {
+ "Value": "lookoutequipment",
+ "endpoint": {
+ "Value": "lookoutequipment.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "machinelearning": {
+ "Value": "machinelearning",
+ "endpoint": {
+ "Value": "machinelearning.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "proton": {
+ "Value": "proton",
+ "endpoint": {
+ "Value": "proton.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snow-device-management": {
+ "Value": "snow-device-management",
+ "endpoint": {
+ "Value": "snow-device-management.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-west-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "timestream": {
+ "Value": "timestream"
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wam": {
+ "Value": "wam"
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "worklink": {
+ "Value": "worklink",
+ "endpoint": {
+ "Value": "worklink.eu-west-1.amazonaws.com"
+ }
+ },
+ "workmail": {
+ "Value": "workmail",
+ "endpoint": {
+ "Value": "workmail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workmailmessageflow": {
+ "Value": "workmailmessageflow",
+ "endpoint": {
+ "Value": "workmailmessageflow.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "availability-zones": {
+ "euw2-az1": {
+ "Value": "euw2-az1"
+ },
+ "euw2-az2": {
+ "Value": "euw2-az2"
+ },
+ "euw2-az3": {
+ "Value": "euw2-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "GB"
+ },
+ "geolocationRegion": {
+ "Value": "GB-LND"
+ },
+ "longName": {
+ "Value": "Europe (London)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "braket": {
+ "Value": "braket",
+ "endpoint": {
+ "Value": "braket.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.eu-west-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "endpoint": {
+ "Value": "nimble.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-west-2.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "voice-id": {
+ "Value": "voice-id",
+ "endpoint": {
+ "Value": "voiceid.eu-west-2.amazonaws.com"
+ }
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ },
+ "wavelength-zones": {
+ "euw2-wl1-lon-wlz1": {
+ "Value": "euw2-wl1-lon-wlz1"
+ }
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "availability-zones": {
+ "euw3-az1": {
+ "Value": "euw3-az1"
+ },
+ "euw3-az2": {
+ "Value": "euw3-az2"
+ },
+ "euw3-az3": {
+ "Value": "euw3-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "FR"
+ },
+ "geolocationRegion": {
+ "Value": "FR-75"
+ },
+ "longName": {
+ "Value": "Europe (Paris)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.eu-west-3.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.eu-west-3.amazonaws.com"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "availability-zones": {
+ "mes1-az1": {
+ "Value": "mes1-az1"
+ },
+ "mes1-az2": {
+ "Value": "mes1-az2"
+ },
+ "mes1-az3": {
+ "Value": "mes1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "BH"
+ },
+ "geolocationRegion": {
+ "Value": "BH-14"
+ },
+ "longName": {
+ "Value": "Middle East (Bahrain)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift"
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "availability-zones": {
+ "sae1-az1": {
+ "Value": "sae1-az1"
+ },
+ "sae1-az2": {
+ "Value": "sae1-az2"
+ },
+ "sae1-az3": {
+ "Value": "sae1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "BR"
+ },
+ "geolocationRegion": {
+ "Value": "BR-SP"
+ },
+ "longName": {
+ "Value": "South America (Sao Paulo)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.sa-east-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "endpoint": {
+ "Value": "inspector2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.sa-east-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "availability-zones": {
+ "use1-az1": {
+ "Value": "use1-az1"
+ },
+ "use1-az2": {
+ "Value": "use1-az2"
+ },
+ "use1-az3": {
+ "Value": "use1-az3"
+ },
+ "use1-az4": {
+ "Value": "use1-az4"
+ },
+ "use1-az5": {
+ "Value": "use1-az5"
+ },
+ "use1-az6": {
+ "Value": "use1-az6"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-VA"
+ },
+ "local-zones": {
+ "use1-bos1-az1": {
+ "Value": "use1-bos1-az1"
+ },
+ "use1-chi1-az1": {
+ "Value": "use1-chi1-az1"
+ },
+ "use1-dfw1-az1": {
+ "Value": "use1-dfw1-az1"
+ },
+ "use1-mci1-az1": {
+ "Value": "use1-mci1-az1"
+ },
+ "use1-mia1-az1": {
+ "Value": "use1-mia1-az1"
+ },
+ "use1-msp1-az1": {
+ "Value": "use1-msp1-az1"
+ },
+ "use1-nyc1-az1": {
+ "Value": "use1-nyc1-az1"
+ },
+ "use1-phl1-az1": {
+ "Value": "use1-phl1-az1"
+ }
+ },
+ "longName": {
+ "Value": "US East (N. Virginia)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ahl": {
+ "Value": "ahl",
+ "endpoint": {
+ "Value": "healthlake.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "alexaforbusiness": {
+ "Value": "alexaforbusiness",
+ "endpoint": {
+ "Value": "a4b.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "applicationcostprofiler": {
+ "Value": "applicationcostprofiler"
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "endpoint": {
+ "Value": "apprunner.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "braket": {
+ "Value": "braket",
+ "endpoint": {
+ "Value": "braket.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime",
+ "endpoint": {
+ "Value": "chime.us-east-1.amazonaws.com"
+ }
+ },
+ "chime-sdk-identity": {
+ "Value": "chime-sdk-identity",
+ "endpoint": {
+ "Value": "identity-chime.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chime-sdk-messaging": {
+ "Value": "chime-sdk-messaging",
+ "endpoint": {
+ "Value": "messaging-chime.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsm": {
+ "Value": "cloudhsm",
+ "endpoint": {
+ "Value": "cloudhsm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.us-east-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "costexplorer": {
+ "Value": "costexplorer",
+ "endpoint": {
+ "Value": "ce.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cur": {
+ "Value": "cur",
+ "endpoint": {
+ "Value": "cur.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "endpoint": {
+ "Value": "datapipeline.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "deepcomposer": {
+ "Value": "deepcomposer",
+ "endpoint": {
+ "Value": "deepcomposer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "deeplens": {
+ "Value": "deeplens",
+ "endpoint": {
+ "Value": "deeplens.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "deepracer": {
+ "Value": "deepracer"
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecr-public": {
+ "Value": "ecr-public",
+ "endpoint": {
+ "Value": "ecr-public.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "finspace": {
+ "Value": "finspace",
+ "endpoint": {
+ "Value": "finspace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "endpoint": {
+ "Value": "finspace-api.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "health": {
+ "Value": "health",
+ "endpoint": {
+ "Value": "health.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector2": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdeviceadvisor": {
+ "Value": "iotdeviceadvisor",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "endpoint": {
+ "Value": "api.iotwireless.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutequipment": {
+ "Value": "lookoutequipment",
+ "endpoint": {
+ "Value": "lookoutequipment.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "machinelearning": {
+ "Value": "machinelearning",
+ "endpoint": {
+ "Value": "machinelearning.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "endpoint": {
+ "Value": "managedblockchain.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "marketplace-entitlement": {
+ "Value": "marketplace-entitlement",
+ "endpoint": {
+ "Value": "entitlement.marketplace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplacecommerceanalytics": {
+ "Value": "marketplacecommerceanalytics",
+ "endpoint": {
+ "Value": "marketplacecommerceanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mobile": {
+ "Value": "mobile",
+ "endpoint": {
+ "Value": "mobile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mturk": {
+ "Value": "mturk",
+ "endpoint": {
+ "Value": "mturk-requester.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "endpoint": {
+ "Value": "nimble.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pricing": {
+ "Value": "pricing",
+ "endpoint": {
+ "Value": "api.pricing.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "proton": {
+ "Value": "proton",
+ "endpoint": {
+ "Value": "proton.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rdsvmware": {
+ "Value": "rdsvmware"
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53domains": {
+ "Value": "route53domains",
+ "endpoint": {
+ "Value": "route53domains.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snow-device-management": {
+ "Value": "snow-device-management",
+ "endpoint": {
+ "Value": "snow-device-management.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-east-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "timestream": {
+ "Value": "timestream"
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wam": {
+ "Value": "wam"
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wisdom": {
+ "Value": "wisdom",
+ "endpoint": {
+ "Value": "wisdom.us-east-1.amazonaws.com"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "worklink": {
+ "Value": "worklink",
+ "endpoint": {
+ "Value": "worklink.us-east-1.amazonaws.com"
+ }
+ },
+ "workmail": {
+ "Value": "workmail",
+ "endpoint": {
+ "Value": "workmail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workmailmessageflow": {
+ "Value": "workmailmessageflow",
+ "endpoint": {
+ "Value": "workmailmessageflow.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces-web": {
+ "Value": "workspaces-web",
+ "endpoint": {
+ "Value": "workspaces-web.us-east-1.amazonaws.com"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ },
+ "wavelength-zones": {
+ "use1-wl1-atl-wlz1": {
+ "Value": "use1-wl1-atl-wlz1"
+ },
+ "use1-wl1-bos-wlz1": {
+ "Value": "use1-wl1-bos-wlz1"
+ },
+ "use1-wl1-chi-wlz1": {
+ "Value": "use1-wl1-chi-wlz1"
+ },
+ "use1-wl1-dfw-wlz1": {
+ "Value": "use1-wl1-dfw-wlz1"
+ },
+ "use1-wl1-iah-wlz1": {
+ "Value": "use1-wl1-iah-wlz1"
+ },
+ "use1-wl1-mia-wlz1": {
+ "Value": "use1-wl1-mia-wlz1"
+ },
+ "use1-wl1-nyc-wlz1": {
+ "Value": "use1-wl1-nyc-wlz1"
+ },
+ "use1-wl1-was-wlz1": {
+ "Value": "use1-wl1-was-wlz1"
+ }
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "availability-zones": {
+ "use2-az1": {
+ "Value": "use2-az1"
+ },
+ "use2-az2": {
+ "Value": "use2-az2"
+ },
+ "use2-az3": {
+ "Value": "use2-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-OH"
+ },
+ "longName": {
+ "Value": "US East (Ohio)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ahl": {
+ "Value": "ahl",
+ "endpoint": {
+ "Value": "healthlake.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata",
+ "endpoint": {
+ "Value": "appconfigdata.us-east-2.amazonaws.com"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "endpoint": {
+ "Value": "apprunner.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.us-east-2.amazonaws.com"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.us-east-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "evidently": {
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "finspace": {
+ "Value": "finspace",
+ "endpoint": {
+ "Value": "finspace.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "endpoint": {
+ "Value": "finspace-api.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "health": {
+ "Value": "health",
+ "endpoint": {
+ "Value": "health.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "proton": {
+ "Value": "proton",
+ "endpoint": {
+ "Value": "proton.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-east-2.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "timestream": {
+ "Value": "timestream"
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "worklink": {
+ "Value": "worklink",
+ "endpoint": {
+ "Value": "worklink.us-east-2.amazonaws.com"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "availability-zones": {
+ "usge1-az1": {
+ "Value": "usge1-az1"
+ },
+ "usge1-az2": {
+ "Value": "usge1-az2"
+ },
+ "usge1-az3": {
+ "Value": "usge1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-OH"
+ },
+ "longName": {
+ "Value": "AWS GovCloud (US-East)"
+ },
+ "partition": {
+ "Value": "aws-us-gov"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.us-gov.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall-fips.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.amazonaws-us-gov.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-gov-east-1.amazonaws.com"
+ }
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "availability-zones": {
+ "usgw1-az1": {
+ "Value": "usgw1-az1"
+ },
+ "usgw1-az2": {
+ "Value": "usgw1-az2"
+ },
+ "usgw1-az3": {
+ "Value": "usgw1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-OR"
+ },
+ "longName": {
+ "Value": "AWS GovCloud (US-West)"
+ },
+ "partition": {
+ "Value": "aws-us-gov"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata"
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsm": {
+ "Value": "cloudhsm",
+ "endpoint": {
+ "Value": "cloudhsm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "health": {
+ "Value": "health",
+ "endpoint": {
+ "Value": "health.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.us-gov.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall-fips.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "networkmanager": {
+ "Value": "networkmanager",
+ "endpoint": {
+ "Value": "networkmanager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.amazonaws-us-gov.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-gov-west-1.amazonaws.com"
+ }
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "availability-zones": {
+ "usw1-az1": {
+ "Value": "usw1-az1"
+ },
+ "usw1-az2": {
+ "Value": "usw1-az2"
+ },
+ "usw1-az3": {
+ "Value": "usw1-az3"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-CA"
+ },
+ "longName": {
+ "Value": "US West (N. California)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "braket": {
+ "Value": "braket",
+ "endpoint": {
+ "Value": "braket.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace",
+ "endpoint": {
+ "Value": "marketplace.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-west-1.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "availability-zones": {
+ "usw2-az1": {
+ "Value": "usw2-az1"
+ },
+ "usw2-az2": {
+ "Value": "usw2-az2"
+ },
+ "usw2-az3": {
+ "Value": "usw2-az3"
+ },
+ "usw2-az4": {
+ "Value": "usw2-az4"
+ }
+ },
+ "domain": {
+ "Value": "amazonaws.com"
+ },
+ "geolocationCountry": {
+ "Value": "US"
+ },
+ "geolocationRegion": {
+ "Value": "US-OR"
+ },
+ "local-zones": {
+ "usw2-den1-az1": {
+ "Value": "usw2-den1-az1"
+ },
+ "usw2-las1-az1": {
+ "Value": "usw2-las1-az1"
+ },
+ "usw2-lax1-az1": {
+ "Value": "usw2-lax1-az1"
+ },
+ "usw2-lax1-az2": {
+ "Value": "usw2-lax1-az2"
+ },
+ "usw2-pdx1-az1": {
+ "Value": "usw2-pdx1-az1"
+ }
+ },
+ "longName": {
+ "Value": "US West (Oregon)"
+ },
+ "partition": {
+ "Value": "aws"
+ },
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "endpoint": {
+ "Value": "access-analyzer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "endpoint": {
+ "Value": "acm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "endpoint": {
+ "Value": "acm-pca.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ahl": {
+ "Value": "ahl",
+ "endpoint": {
+ "Value": "healthlake.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "aiq": {
+ "Value": "aiq"
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice"
+ },
+ "amp": {
+ "Value": "amp",
+ "endpoint": {
+ "Value": "aps.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "endpoint": {
+ "Value": "amplify.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "endpoint": {
+ "Value": "amplifybackend.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "endpoint": {
+ "Value": "apigateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi"
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "endpoint": {
+ "Value": "apigateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "endpoint": {
+ "Value": "appconfig.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "endpoint": {
+ "Value": "appflow.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "endpoint": {
+ "Value": "app-integrations.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "endpoint": {
+ "Value": "applicationinsights.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "endpoint": {
+ "Value": "appmesh.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "endpoint": {
+ "Value": "apprunner.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "endpoint": {
+ "Value": "appstream2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "endpoint": {
+ "Value": "appsync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "artifact": {
+ "Value": "artifact"
+ },
+ "athena": {
+ "Value": "athena",
+ "endpoint": {
+ "Value": "athena.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "endpoint": {
+ "Value": "auditmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime"
+ },
+ "aurora": {
+ "Value": "aurora",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "endpoint": {
+ "Value": "autoscaling.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "endpoint": {
+ "Value": "backup.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "endpoint": {
+ "Value": "backup-gateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "endpoint": {
+ "Value": "batch.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "braket": {
+ "Value": "braket",
+ "endpoint": {
+ "Value": "braket.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot"
+ },
+ "chime": {
+ "Value": "chime"
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "endpoint": {
+ "Value": "cloud9.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "endpoint": {
+ "Value": "clouddirectory.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery"
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration"
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "endpoint": {
+ "Value": "cloudformation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "endpoint": {
+ "Value": "cloudsearch.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "endpoint": {
+ "Value": "cloudshell.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "endpoint": {
+ "Value": "cloudtrail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "endpoint": {
+ "Value": "monitoring.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "endpoint": {
+ "Value": "codeartifact.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "endpoint": {
+ "Value": "codebuild.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "endpoint": {
+ "Value": "codecommit.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "endpoint": {
+ "Value": "codedeploy.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "endpoint": {
+ "Value": "codepipeline.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "endpoint": {
+ "Value": "codestar.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "endpoint": {
+ "Value": "codestar-connections.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "endpoint": {
+ "Value": "codestar-notifications.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "endpoint": {
+ "Value": "cognito-identity.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "endpoint": {
+ "Value": "cognito-idp.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "endpoint": {
+ "Value": "cognito-sync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "endpoint": {
+ "Value": "comprehend.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "endpoint": {
+ "Value": "comprehendmedical.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "endpoint": {
+ "Value": "compute-optimizer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "config": {
+ "Value": "config",
+ "endpoint": {
+ "Value": "config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "endpoint": {
+ "Value": "connect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "endpoint": {
+ "Value": "contact-lens.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "endpoint": {
+ "Value": "participant.connect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "endpoint": {
+ "Value": "prod.us-west-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "endpoint": {
+ "Value": "profile.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "endpoint": {
+ "Value": "databrew.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "endpoint": {
+ "Value": "dataexchange.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "endpoint": {
+ "Value": "datapipeline.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "endpoint": {
+ "Value": "datasync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "endpoint": {
+ "Value": "dax.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "endpoint": {
+ "Value": "api.detective.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devicefarm": {
+ "Value": "devicefarm",
+ "endpoint": {
+ "Value": "devicefarm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "endpoint": {
+ "Value": "devops-guru.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "endpoint": {
+ "Value": "directconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "endpoint": {
+ "Value": "discovery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "endpoint": {
+ "Value": "dlm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "endpoint": {
+ "Value": "dms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "endpoint": {
+ "Value": "drs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "endpoint": {
+ "Value": "ds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "endpoint": {
+ "Value": "dynamodb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "endpoint": {
+ "Value": "ecr.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "endpoint": {
+ "Value": "ecs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "endpoint": {
+ "Value": "eks.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "endpoint": {
+ "Value": "elasticache.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "endpoint": {
+ "Value": "elastictranscoder.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "endpoint": {
+ "Value": "emr-containers.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "es": {
+ "Value": "es",
+ "endpoint": {
+ "Value": "es.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge"
+ },
+ "events": {
+ "Value": "events",
+ "endpoint": {
+ "Value": "events.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fargate": {
+ "Value": "fargate"
+ },
+ "finspace": {
+ "Value": "finspace",
+ "endpoint": {
+ "Value": "finspace.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "endpoint": {
+ "Value": "finspace-api.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "endpoint": {
+ "Value": "firehose.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "endpoint": {
+ "Value": "fis.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "endpoint": {
+ "Value": "fms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "endpoint": {
+ "Value": "forecast.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "endpoint": {
+ "Value": "forecastquery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "endpoint": {
+ "Value": "frauddetector.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "endpoint": {
+ "Value": "gamelift.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "endpoint": {
+ "Value": "glacier.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "endpoint": {
+ "Value": "glue.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "endpoint": {
+ "Value": "grafana.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "endpoint": {
+ "Value": "greengrass.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "endpoint": {
+ "Value": "groundstation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "endpoint": {
+ "Value": "guardduty.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "honeycode": {
+ "Value": "honeycode",
+ "endpoint": {
+ "Value": "honeycode.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "endpoint": {
+ "Value": "identitystore.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "endpoint": {
+ "Value": "imagebuilder.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "endpoint": {
+ "Value": "inspector.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "endpoint": {
+ "Value": "data-ats.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot-jobs-data": {
+ "Value": "iot-jobs-data",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-devices": {
+ "Value": "iot1click-devices",
+ "endpoint": {
+ "Value": "devices.iot1click.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "endpoint": {
+ "Value": "projects.iot1click.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "endpoint": {
+ "Value": "iotanalytics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdeviceadvisor": {
+ "Value": "iotdeviceadvisor",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "endpoint": {
+ "Value": "iotevents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "endpoint": {
+ "Value": "data.iotevents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "endpoint": {
+ "Value": "iotsitewise.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "endpoint": {
+ "Value": "iotthingsgraph.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "endpoint": {
+ "Value": "api.iotwireless.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "endpoint": {
+ "Value": "ivs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "endpoint": {
+ "Value": "kafka.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "endpoint": {
+ "Value": "kafkaconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "endpoint": {
+ "Value": "kendra.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "endpoint": {
+ "Value": "kinesis.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "endpoint": {
+ "Value": "kinesisvideo.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "endpoint": {
+ "Value": "kms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "endpoint": {
+ "Value": "lakeformation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "endpoint": {
+ "Value": "lambda.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "endpoint": {
+ "Value": "models.lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "endpoint": {
+ "Value": "runtime-v2-lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "endpoint": {
+ "Value": "models-v2-lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "endpoint": {
+ "Value": "license-manager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "endpoint": {
+ "Value": "lightsail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "endpoint": {
+ "Value": "logs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "endpoint": {
+ "Value": "lookoutvision.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard"
+ },
+ "macie": {
+ "Value": "macie",
+ "endpoint": {
+ "Value": "macie2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace"
+ },
+ "mcs": {
+ "Value": "mcs",
+ "endpoint": {
+ "Value": "cassandra.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "endpoint": {
+ "Value": "mediaconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "endpoint": {
+ "Value": "mediaconvert.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "endpoint": {
+ "Value": "medialive.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "endpoint": {
+ "Value": "mediapackage.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "endpoint": {
+ "Value": "mediastore.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data"
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "endpoint": {
+ "Value": "api.mediatailor.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "endpoint": {
+ "Value": "memory-db.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "endpoint": {
+ "Value": "metering.marketplace.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "endpoint": {
+ "Value": "mgh.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "endpoint": {
+ "Value": "mgn.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "migrationhubstrategy": {
+ "Value": "migrationhubstrategy"
+ },
+ "mobile": {
+ "Value": "mobile",
+ "endpoint": {
+ "Value": "mobile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "endpoint": {
+ "Value": "mq.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa"
+ },
+ "neptune": {
+ "Value": "neptune",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "endpoint": {
+ "Value": "network-firewall.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "networkmanager": {
+ "Value": "networkmanager",
+ "endpoint": {
+ "Value": "networkmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "endpoint": {
+ "Value": "nimble.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "endpoint": {
+ "Value": "opsworks.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "endpoint": {
+ "Value": "outposts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "endpoint": {
+ "Value": "personalize.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "endpoint": {
+ "Value": "pi.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "endpoint": {
+ "Value": "pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "endpoint": {
+ "Value": "email.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "endpoint": {
+ "Value": "polly.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink"
+ },
+ "proton": {
+ "Value": "proton",
+ "endpoint": {
+ "Value": "proton.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "endpoint": {
+ "Value": "qldb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "endpoint": {
+ "Value": "session.qldb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "endpoint": {
+ "Value": "quicksight.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "endpoint": {
+ "Value": "ram.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rbin": {
+ "Value": "rbin"
+ },
+ "rds": {
+ "Value": "rds",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "endpoint": {
+ "Value": "rds-data.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "endpoint": {
+ "Value": "redshift.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "endpoint": {
+ "Value": "redshift-data.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "endpoint": {
+ "Value": "rekognition.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resiliencehub": {
+ "endpoint": {
+ "Value": "resiliencehub.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "endpoint": {
+ "Value": "resource-groups.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "endpoint": {
+ "Value": "tagging.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "endpoint": {
+ "Value": "robomaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rosa": {
+ "Value": "rosa"
+ },
+ "route53": {
+ "Value": "route53",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53-recovery-control-config": {
+ "Value": "route53-recovery-control-config",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "endpoint": {
+ "Value": "route53resolver.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "rum": {
+ "Value": "rum",
+ "endpoint": {
+ "Value": "rum.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "endpoint": {
+ "Value": "s3.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "s3control": {
+ "Value": "s3control"
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "endpoint": {
+ "Value": "s3-outposts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "endpoint": {
+ "Value": "api.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-edge": {
+ "Value": "sagemaker-edge"
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "endpoint": {
+ "Value": "schemas.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "endpoint": {
+ "Value": "sdb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "endpoint": {
+ "Value": "secretsmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "endpoint": {
+ "Value": "securityhub.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "endpoint": {
+ "Value": "serverlessrepo.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "endpoint": {
+ "Value": "servicequotas.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "endpoint": {
+ "Value": "servicecatalog.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "endpoint": {
+ "Value": "servicediscovery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "endpoint": {
+ "Value": "email.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "endpoint": {
+ "Value": "signer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "endpoint": {
+ "Value": "sms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snow-device-management": {
+ "Value": "snow-device-management",
+ "endpoint": {
+ "Value": "snow-device-management.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "endpoint": {
+ "Value": "snowball.us-west-2.amazonaws.com"
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone"
+ },
+ "snowmobile": {
+ "Value": "snowmobile"
+ },
+ "sns": {
+ "Value": "sns",
+ "endpoint": {
+ "Value": "sns.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "endpoint": {
+ "Value": "sqs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "endpoint": {
+ "Value": "ssm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "endpoint": {
+ "Value": "ssm-contacts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "endpoint": {
+ "Value": "ssm-incidents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "endpoint": {
+ "Value": "sso.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "endpoint": {
+ "Value": "oidc.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "endpoint": {
+ "Value": "states.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "endpoint": {
+ "Value": "storagegateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "endpoint": {
+ "Value": "sts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "endpoint": {
+ "Value": "sumerian.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "support": {
+ "Value": "support",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "endpoint": {
+ "Value": "swf.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "endpoint": {
+ "Value": "synthetics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "endpoint": {
+ "Value": "textract.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "timestream": {
+ "Value": "timestream"
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "endpoint": {
+ "Value": "transcribe.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical"
+ },
+ "transfer": {
+ "Value": "transfer",
+ "endpoint": {
+ "Value": "transfer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "endpoint": {
+ "Value": "translate.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor"
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws"
+ },
+ "voice-id": {
+ "Value": "voice-id",
+ "endpoint": {
+ "Value": "voiceid.us-west-2.amazonaws.com"
+ }
+ },
+ "vpc": {
+ "Value": "vpc"
+ },
+ "vpn": {
+ "Value": "vpn",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "endpoint": {
+ "Value": "wafv2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "endpoint": {
+ "Value": "waf-regional.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "wam": {
+ "Value": "wam"
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "endpoint": {
+ "Value": "wellarchitected.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "endpoint": {
+ "Value": "workdocs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "worklink": {
+ "Value": "worklink",
+ "endpoint": {
+ "Value": "worklink.us-west-2.amazonaws.com"
+ }
+ },
+ "workmail": {
+ "Value": "workmail",
+ "endpoint": {
+ "Value": "workmail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workmailmessageflow": {
+ "Value": "workmailmessageflow",
+ "endpoint": {
+ "Value": "workmailmessageflow.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "endpoint": {
+ "Value": "workspaces.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "workspaces-web": {
+ "Value": "workspaces-web"
+ },
+ "xray": {
+ "Value": "xray",
+ "endpoint": {
+ "Value": "xray.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ },
+ "wavelength-zones": {
+ "usw2-wl1-den-wlz1": {
+ "Value": "usw2-wl1-den-wlz1"
+ },
+ "usw2-wl1-las-wlz1": {
+ "Value": "usw2-wl1-las-wlz1"
+ },
+ "usw2-wl1-phx-wlz1": {
+ "Value": "usw2-wl1-phx-wlz1"
+ },
+ "usw2-wl1-sea-wlz1": {
+ "Value": "usw2-wl1-sea-wlz1"
+ },
+ "usw2-wl1-sfo-wlz1": {
+ "Value": "usw2-wl1-sfo-wlz1"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ssm/resources/services.json b/contrib/python/moto/py3/moto/ssm/resources/services.json
new file mode 100644
index 0000000000..44d0a9dc61
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/resources/services.json
@@ -0,0 +1,45693 @@
+{
+ "aws": {
+ "service": {
+ "global-infrastructure": {
+ "services": {
+ "accessanalyzer": {
+ "Value": "accessanalyzer",
+ "longName": {
+ "Value": "AWS IAM Access Analyzer"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "access-analyzer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "access-analyzer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "access-analyzer.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "access-analyzer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "access-analyzer.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "access-analyzer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "access-analyzer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "access-analyzer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "access-analyzer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "access-analyzer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "access-analyzer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "access-analyzer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "access-analyzer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "access-analyzer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "access-analyzer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "access-analyzer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "access-analyzer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "access-analyzer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "access-analyzer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "access-analyzer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "account": {
+ "Value": "account",
+ "longName": {
+ "Value": "AWS Account Management"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "account.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "acm": {
+ "Value": "acm",
+ "longName": {
+ "Value": "AWS Certificate Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/certificate-manager/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "acm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "acm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "acm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "acm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "acm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "acm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "acm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "acm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "acm.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "acm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "acm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "acm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "acm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "acm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "acm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "acm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "acm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "acm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "acm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "acm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "acm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "acm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "acm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "acm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "acm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "acm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "acm-pca": {
+ "Value": "acm-pca",
+ "longName": {
+ "Value": "AWS Certificate Manager Private Certificate Authority"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "acm-pca.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "acm-pca.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "acm-pca.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "acm-pca.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "acm-pca.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "acm-pca.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "acm-pca.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "acm-pca.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "acm-pca.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "acm-pca.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "acm-pca.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "acm-pca.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "acm-pca.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "acm-pca.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "acm-pca.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "acm-pca.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "acm-pca.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "acm-pca.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "acm-pca.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ahl": {
+ "Value": "ahl",
+ "longName": {
+ "Value": "Amazon HealthLake"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/healthlake/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "healthlake.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "healthlake.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "healthlake.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "aiq": {
+ "Value": "aiq",
+ "longName": {
+ "Value": "AWS IQ"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iq/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "alexaforbusiness": {
+ "Value": "alexaforbusiness",
+ "longName": {
+ "Value": "Alexa for Business"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/alexaforbusiness/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "a4b.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "amazonlocationservice": {
+ "Value": "amazonlocationservice",
+ "longName": {
+ "Value": "Amazon Location Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/location"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "amp": {
+ "Value": "amp",
+ "longName": {
+ "Value": "Amazon Managed Service for Prometheus"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "aps.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "aps.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "aps.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "aps.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "aps.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "aps.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "aps.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "aps.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "aps.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "amplify": {
+ "Value": "amplify",
+ "longName": {
+ "Value": "AWS Amplify"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/amplify/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "amplify.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "amplify.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "amplify.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "amplify.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "amplify.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "amplify.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "amplify.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "amplify.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "amplify.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "amplify.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "amplify.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "amplify.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "amplify.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "amplify.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "amplify.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "amplify.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "amplify.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "amplify.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "amplify.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "amplifybackend": {
+ "Value": "amplifybackend",
+ "longName": {
+ "Value": "AWS Amplify Admin"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "amplifybackend.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "amplifybackend.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "amplifybackend.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "amplifybackend.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "amplifybackend.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "amplifybackend.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "amplifybackend.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "amplifybackend.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "amplifybackend.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "amplifybackend.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "amplifybackend.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "amplifybackend.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "amplifybackend.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "amplifybackend.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "amplifybackend.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "apigateway": {
+ "Value": "apigateway",
+ "longName": {
+ "Value": "Amazon API Gateway"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/api-gateway/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "apigateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "apigateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "apigateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "apigateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "apigateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "apigateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "apigateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "apigateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "apigateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "apigateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "apigateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "apigateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "apigateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "apigateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "apigateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "apigateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "apigateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "apigateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "apigateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "apigateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "apigatewaymanagementapi": {
+ "Value": "apigatewaymanagementapi",
+ "longName": {
+ "Value": "AmazonApiGatewayManagementApi"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "apigatewayv2": {
+ "Value": "apigatewayv2",
+ "longName": {
+ "Value": "Amazon API Gateway V2"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "apigateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "apigateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "apigateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "apigateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "apigateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "apigateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "apigateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "apigateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "apigateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "apigateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "apigateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "apigateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "apigateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "apigateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "apigateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "apigateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "apigateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "apigateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "apigateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "apigateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "apigateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "apigateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appconfig": {
+ "Value": "appconfig",
+ "longName": {
+ "Value": "Amazon AppConfig"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "appconfig.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "appconfig.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "appconfig.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "appconfig.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "appconfig.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "appconfig.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "appconfig.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "appconfig.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "appconfig.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "appconfig.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "appconfig.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "appconfig.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appconfig.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "appconfig.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "appconfig.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "appconfig.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appconfig.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "appconfig.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "appconfig.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "appconfig.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "appconfig.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appconfig.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appconfigdata": {
+ "Value": "appconfigdata",
+ "longName": {
+ "Value": "AppConfigData"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ca-central-1": {
+ "endpoint": {
+ "Value": "appconfigdata.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "appconfigdata.cn-north-1.amazonaws.com.cn"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appconfigdata.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "appconfigdata.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "appconfigdata.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "appconfigdata.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appconfigdata.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "appconfigdata.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "appconfigdata.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "appconfigdata.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "appconfigdata.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appconfigdata.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appflow": {
+ "Value": "appflow",
+ "longName": {
+ "Value": "Amazon AppFlow"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/appflow/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "appflow.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "appflow.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "appflow.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "appflow.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "appflow.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "appflow.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "appflow.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "appflow.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appflow.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "appflow.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "appflow.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appflow.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "appflow.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "appflow.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appflow.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appintegrations": {
+ "Value": "appintegrations",
+ "longName": {
+ "Value": "AmazonAppIntegrationService"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "app-integrations.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "app-integrations.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "app-integrations.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "app-integrations.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "app-integrations.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "app-integrations.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "app-integrations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "app-integrations.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "application-autoscaling": {
+ "Value": "application-autoscaling",
+ "longName": {
+ "Value": "AWS Auto Scaling"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/autoscaling/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "autoscaling-plans.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "autoscaling-plans.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "autoscaling-plans.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "application-insights": {
+ "Value": "application-insights",
+ "longName": {
+ "Value": "Amazon CloudWatch Application Insights"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "applicationinsights.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "applicationinsights.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "applicationinsights.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "applicationinsights.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "applicationinsights.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "applicationinsights.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "applicationinsights.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "applicationinsights.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "applicationinsights.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "applicationinsights.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "applicationinsights.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "applicationinsights.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "applicationinsights.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "applicationinsights.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "applicationinsights.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "applicationinsights.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "applicationinsights.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "applicationinsights.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "applicationinsights.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "applicationinsights.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "applicationinsights.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "applicationcostprofiler": {
+ "Value": "applicationcostprofiler",
+ "longName": {
+ "Value": "AWS Application Cost Profiler"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1"
+ }
+ }
+ },
+ "appmesh": {
+ "Value": "appmesh",
+ "longName": {
+ "Value": "AWS App Mesh"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/app-mesh/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "appmesh.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "appmesh.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "appmesh.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "appmesh.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "appmesh.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "appmesh.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "appmesh.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "appmesh.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "appmesh.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "appmesh.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "appmesh.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "appmesh.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "appmesh.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "appmesh.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appmesh.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "appmesh.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "appmesh.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "appmesh.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appmesh.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "appmesh.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "appmesh.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appmesh.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "apprunner": {
+ "Value": "apprunner",
+ "longName": {
+ "Value": "AWS App Runner"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "apprunner.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "apprunner.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "apprunner.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "apprunner.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "apprunner.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appstream": {
+ "Value": "appstream",
+ "longName": {
+ "Value": "Amazon AppStream 2.0"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/appstream2/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "appstream2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "appstream2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "appstream2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "appstream2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "appstream2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "appstream2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "appstream2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appstream2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appstream2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "appstream2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appstream2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "appsync": {
+ "Value": "appsync",
+ "longName": {
+ "Value": "AWS AppSync"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/appsync/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "appsync.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "appsync.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "appsync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "appsync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "appsync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "appsync.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "appsync.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "appsync.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "appsync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "appsync.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "appsync.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "appsync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "appsync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "appsync.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "appsync.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "appsync.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "appsync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "appsync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "appsync.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "appsync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "artifact": {
+ "Value": "artifact",
+ "longName": {
+ "Value": "AWS Artifact"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/artifact/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "athena": {
+ "Value": "athena",
+ "longName": {
+ "Value": "Amazon Athena"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/athena/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "athena.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "athena.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "athena.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "athena.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "athena.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "athena.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "athena.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "athena.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "athena.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "athena.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "athena.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "athena.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "athena.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "athena.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "athena.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "athena.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "athena.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "athena.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "athena.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "athena.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "athena.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "athena.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "athena.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "athena.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "athena.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "auditmanager": {
+ "Value": "auditmanager",
+ "longName": {
+ "Value": "AWS Audit Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/audit-manager/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "auditmanager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "auditmanager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "auditmanager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "auditmanager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "auditmanager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "auditmanager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "auditmanager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "auditmanager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "auditmanager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "auditmanager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "auditmanager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "auditmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "augmentedairuntime": {
+ "Value": "augmentedairuntime",
+ "longName": {
+ "Value": "Amazon Augmented AI (A2I)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/augmented-ai/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "aurora": {
+ "Value": "aurora",
+ "longName": {
+ "Value": "Amazon Aurora"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/rds/aurora/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "rds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "rds.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "rds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "autoscaling": {
+ "Value": "autoscaling",
+ "longName": {
+ "Value": "Auto Scaling"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "autoscaling.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "autoscaling.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "autoscaling.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "autoscaling.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "autoscaling.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "autoscaling.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "autoscaling.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "autoscaling.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "autoscaling.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "autoscaling.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "autoscaling.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "autoscaling.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "autoscaling.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "autoscaling.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "autoscaling.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "autoscaling.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "autoscaling.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "autoscaling.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "autoscaling.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "autoscaling.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "backup": {
+ "Value": "backup",
+ "longName": {
+ "Value": "AWS Backup"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/backup/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "backup.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "backup.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "backup.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "backup.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "backup.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "backup.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "backup.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "backup.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "backup.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "backup.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "backup.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "backup.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "backup.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "backup.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "backup.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "backup.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "backup.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "backup.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "backup.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "backup.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "backup.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "backup.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "backup.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "backup.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "backup.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "backup.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "backup-gateway": {
+ "Value": "backup-gateway",
+ "longName": {
+ "Value": "AWS Backup Gateway"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "backup-gateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "backup-gateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "backup-gateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "backup-gateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "backup-gateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "backup-gateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "backup-gateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "backup-gateway.ap-southeast-2.amazonaws.com"
+ }
+ },
+ "eu-south-1": {
+ "endpoint": {
+ "Value": "backup-gateway.eu-south-1.amazonaws.com"
+ }
+ },
+ "eu-west-2": {
+ "endpoint": {
+ "Value": "backup-gateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "backup-gateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "backup-gateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "backup-gateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "backup-gateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "backup-gateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "backup-gateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "backup-gateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "backup-gateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "backup-gateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "batch": {
+ "Value": "batch",
+ "longName": {
+ "Value": "AWS Batch"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/batch/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "batch.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "batch.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "batch.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "batch.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "batch.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "batch.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "batch.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "batch.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "batch.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "batch.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "batch.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "batch.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "batch.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "batch.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "batch.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "batch.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "batch.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "batch.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "batch.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "batch.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "batch.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "batch.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "batch.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "batch.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "batch.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "braket": {
+ "Value": "braket",
+ "longName": {
+ "Value": "Amazon Braket"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/braket/"
+ },
+ "regions": {
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "braket.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "braket.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "braket.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "braket.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "budgets": {
+ "Value": "budgets",
+ "longName": {
+ "Value": "AWS Budgets"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/aws-cost-management/aws-budgets/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "budgets.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "chatbot": {
+ "Value": "chatbot",
+ "longName": {
+ "Value": "AWS Chatbot"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/chatbot/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "chime": {
+ "Value": "chime",
+ "longName": {
+ "Value": "Amazon Chime"
+ },
+ "marketingHomeURL": {
+ "Value": "https://chime.aws/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "chime.us-east-1.amazonaws.com"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "chime-sdk-identity": {
+ "Value": "chime-sdk-identity",
+ "longName": {
+ "Value": "ChimeSDK Identity"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "identity-chime.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "chime-sdk-meetings": {
+ "Value": "chime-sdk-meetings",
+ "longName": {
+ "Value": "AWS Chime Meetings SDK"
+ }
+ },
+ "chime-sdk-messaging": {
+ "Value": "chime-sdk-messaging",
+ "longName": {
+ "Value": "Amazon Chime Messaging"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "messaging-chime.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloud9": {
+ "Value": "cloud9",
+ "longName": {
+ "Value": "AWS Cloud9"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloud9/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "cloud9.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cloud9.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "cloud9.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloud9.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloud9.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloud9.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cloud9.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloud9.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cloud9.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "cloud9.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloud9.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cloud9.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cloud9.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cloud9.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloud9.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloud9.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloud9.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloud9.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloud9.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "clouddirectory": {
+ "Value": "clouddirectory",
+ "longName": {
+ "Value": "Amazon Cloud Directory"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloud-directory/"
+ },
+ "regions": {
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "clouddirectory.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "clouddirectory.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "clouddirectory.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "clouddirectory.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "clouddirectory.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "clouddirectory.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "clouddirectory.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "clouddirectory.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "clouddirectory.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "clouddirectory.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudenduredisasterrecovery": {
+ "Value": "cloudenduredisasterrecovery",
+ "longName": {
+ "Value": "CloudEndure Disaster Recovery"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudendure-disaster-recovery/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "cloudenduremigration": {
+ "Value": "cloudenduremigration",
+ "longName": {
+ "Value": "CloudEndure Migration"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudendure-migration/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "cloudformation": {
+ "Value": "cloudformation",
+ "longName": {
+ "Value": "AWS CloudFormation"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudformation/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "cloudformation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cloudformation.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "cloudformation.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloudformation.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "cloudformation.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cloudformation.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cloudformation.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cloudformation.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudformation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cloudformation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "cloudformation.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cloudformation.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cloudformation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloudformation.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudformation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloudformation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "cloudformation.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cloudformation.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloudformation.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudformation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudfront": {
+ "Value": "cloudfront",
+ "longName": {
+ "Value": "Amazon CloudFront"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudfront/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cloudfront.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cloudfront.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudfront.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudhsm": {
+ "Value": "cloudhsm",
+ "longName": {
+ "Value": "AWS CloudHSM"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudhsm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudhsm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cloudhsm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudhsmv2": {
+ "Value": "cloudhsmv2",
+ "longName": {
+ "Value": "AWS CloudHSM"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudhsm/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudhsmv2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cloudhsmv2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudhsmv2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudsearch": {
+ "Value": "cloudsearch",
+ "longName": {
+ "Value": "Amazon CloudSearch"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudsearch/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudsearch.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloudsearch.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloudsearch.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudsearch.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudsearch.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudsearch.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloudsearch.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudsearch.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloudsearch.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudsearch.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudshell": {
+ "Value": "cloudshell",
+ "longName": {
+ "Value": "AWS CloudShell"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudshell/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudshell.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloudshell.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudshell.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudshell.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudshell.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudshell.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloudshell.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudshell.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudtrail": {
+ "Value": "cloudtrail",
+ "longName": {
+ "Value": "AWS CloudTrail"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudtrail/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "cloudtrail.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cloudtrail.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "cloudtrail.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cloudtrail.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "cloudtrail.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cloudtrail.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cloudtrail.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cloudtrail.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cloudtrail.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cloudtrail.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "cloudtrail.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cloudtrail.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cloudtrail.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cloudtrail.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cloudtrail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cloudtrail.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "cloudtrail.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cloudtrail.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cloudtrail.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cloudtrail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cloudwatch": {
+ "Value": "cloudwatch",
+ "longName": {
+ "Value": "Amazon CloudWatch"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloudwatch/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "monitoring.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "monitoring.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "monitoring.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "monitoring.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "monitoring.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "monitoring.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "monitoring.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "monitoring.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "monitoring.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "monitoring.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "monitoring.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "monitoring.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "monitoring.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "monitoring.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "monitoring.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "monitoring.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "monitoring.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "monitoring.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "monitoring.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "monitoring.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "monitoring.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "monitoring.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "codeartifact": {
+ "Value": "codeartifact",
+ "longName": {
+ "Value": "AWS CodeArtifact"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codeartifact"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codeartifact.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codeartifact.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codeartifact.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codeartifact.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codeartifact.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codeartifact.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "codeartifact.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codeartifact.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codeartifact.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codeartifact.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codeartifact.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codebuild": {
+ "Value": "codebuild",
+ "longName": {
+ "Value": "AWS CodeBuild"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codebuild/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "codebuild.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "codebuild.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "codebuild.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codebuild.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codebuild.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codebuild.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codebuild.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "codebuild.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "codebuild.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codebuild.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codebuild.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "codebuild.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codebuild.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codebuild.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codebuild.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "codebuild.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codebuild.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codebuild.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codebuild.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "codebuild.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "codebuild.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codebuild.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codebuild.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codecommit": {
+ "Value": "codecommit",
+ "longName": {
+ "Value": "AWS CodeCommit"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codecommit/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "codecommit.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "codecommit.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "codecommit.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codecommit.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codecommit.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codecommit.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codecommit.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "codecommit.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "codecommit.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codecommit.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codecommit.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "codecommit.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codecommit.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codecommit.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codecommit.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "codecommit.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codecommit.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codecommit.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codecommit.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "codecommit.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "codecommit.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codecommit.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codecommit.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codedeploy": {
+ "Value": "codedeploy",
+ "longName": {
+ "Value": "AWS CodeDeploy"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codedeploy/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "codedeploy.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "codedeploy.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "codedeploy.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codedeploy.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "codedeploy.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codedeploy.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "codedeploy.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "codedeploy.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codedeploy.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codedeploy.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "codedeploy.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codedeploy.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "codedeploy.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codedeploy.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codedeploy.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codedeploy.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "codedeploy.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "codedeploy.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codedeploy.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codedeploy.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codeguru-reviewer": {
+ "Value": "codeguru-reviewer",
+ "longName": {
+ "Value": "Amazon CodeGuru Reviewer"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codeguru-reviewer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codeguru-reviewer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codeguru-reviewer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codeguruprofiler": {
+ "Value": "codeguruprofiler",
+ "longName": {
+ "Value": "Amazon CodeGuru"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codeguru/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codeguru-profiler.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codeguru-profiler.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codeguru-profiler.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codepipeline": {
+ "Value": "codepipeline",
+ "longName": {
+ "Value": "AWS CodePipeline"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codepipeline/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "codepipeline.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codepipeline.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codepipeline.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codepipeline.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codepipeline.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codepipeline.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codepipeline.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codepipeline.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codepipeline.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "codepipeline.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codepipeline.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codepipeline.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codepipeline.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codepipeline.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "codepipeline.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codepipeline.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codepipeline.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codestar": {
+ "Value": "codestar",
+ "longName": {
+ "Value": "AWS CodeStar"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/codestar/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codestar.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codestar.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codestar.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codestar.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codestar.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codestar.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codestar.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codestar.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codestar.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codestar.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codestar.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codestar.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codestar.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codestar-connections": {
+ "Value": "codestar-connections",
+ "longName": {
+ "Value": "CodeStar Connections"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codestar-connections.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codestar-connections.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codestar-connections.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codestar-connections.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codestar-connections.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codestar-connections.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codestar-connections.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codestar-connections.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codestar-connections.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codestar-connections.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codestar-connections.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codestar-connections.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codestar-connections.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codestar-connections.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "codestar-notifications": {
+ "Value": "codestar-notifications",
+ "longName": {
+ "Value": "AWS CodeStar Notifications"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "codestar-notifications.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "codestar-notifications.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "codestar-notifications.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "codestar-notifications.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "codestar-notifications.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "codestar-notifications.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "codestar-notifications.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "codestar-notifications.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "codestar-notifications.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cognito-identity": {
+ "Value": "cognito-identity",
+ "longName": {
+ "Value": "Amazon Cognito"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cognito/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cognito-identity.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cognito-identity.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cognito-identity.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cognito-identity.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cognito-identity.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cognito-identity.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cognito-identity.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cognito-identity.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cognito-identity.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cognito-identity.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cognito-identity.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cognito-identity.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cognito-identity.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cognito-identity.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cognito-identity.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cognito-identity.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cognito-identity.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cognito-idp": {
+ "Value": "cognito-idp",
+ "longName": {
+ "Value": "Amazon Cognito Identity User Pools"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cognito-idp.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cognito-idp.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cognito-idp.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cognito-idp.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cognito-idp.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cognito-idp.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cognito-idp.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cognito-idp.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cognito-idp.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cognito-idp.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cognito-idp.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cognito-idp.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cognito-idp.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "cognito-idp.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cognito-idp.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cognito-idp.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cognito-sync": {
+ "Value": "cognito-sync",
+ "longName": {
+ "Value": "Amazon Cognito Sync"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cognito-sync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cognito-sync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cognito-sync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cognito-sync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cognito-sync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cognito-sync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cognito-sync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cognito-sync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cognito-sync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cognito-sync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cognito-sync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "comprehend": {
+ "Value": "comprehend",
+ "longName": {
+ "Value": "Amazon Comprehend"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/comprehend/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "comprehend.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "comprehend.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "comprehend.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "comprehend.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "comprehend.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "comprehend.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "comprehend.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "comprehend.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "comprehend.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "comprehend.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "comprehend.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "comprehend.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "comprehend.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "comprehendmedical": {
+ "Value": "comprehendmedical",
+ "longName": {
+ "Value": "Amazon Comprehend Medical"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/comprehend/medical/"
+ },
+ "regions": {
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "comprehendmedical.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "comprehendmedical.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "comprehendmedical.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "comprehendmedical.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "comprehendmedical.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "comprehendmedical.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "comprehendmedical.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "comprehendmedical.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "compute-optimizer": {
+ "Value": "compute-optimizer",
+ "longName": {
+ "Value": "AWS Compute Optimizer"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/compute-optimizer/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "compute-optimizer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "compute-optimizer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "compute-optimizer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "compute-optimizer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "compute-optimizer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "compute-optimizer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "compute-optimizer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "compute-optimizer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "compute-optimizer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "compute-optimizer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "config": {
+ "Value": "config",
+ "longName": {
+ "Value": "AWS Config"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/config/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "config.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "config.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "config.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "config.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "config.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "config.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "config.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "config.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "config.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "config.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "config.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "config.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "config.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "config.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "config.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "config.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "config.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "config.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "config.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "config.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "config.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "config.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "config.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "config.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "config.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "connect": {
+ "Value": "connect",
+ "longName": {
+ "Value": "Amazon Connect"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/connect/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "connect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "connect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "connect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "connect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "connect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "connect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "connect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "connect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "connect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "connect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "connect-contact-lens": {
+ "Value": "connect-contact-lens",
+ "longName": {
+ "Value": "Amazon Connect Contact Lens"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "contact-lens.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "contact-lens.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "contact-lens.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "contact-lens.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "contact-lens.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "contact-lens.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "contact-lens.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "contact-lens.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "connectparticipant": {
+ "Value": "connectparticipant",
+ "longName": {
+ "Value": "Amazon Connect Participant Service"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "participant.connect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "participant.connect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "participant.connect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "participant.connect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "participant.connect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "participant.connect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "participant.connect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "participant.connect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "participant.connect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "participant.connect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "controltower": {
+ "Value": "controltower",
+ "longName": {
+ "Value": "AWS Control Tower"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/controltower"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "prod.ap-northeast-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "prod.ap-northeast-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "prod.ap-south-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "prod.ap-southeast-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "prod.ap-southeast-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "prod.ca-central-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "prod.eu-central-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "prod.eu-north-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "prod.eu-west-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "prod.eu-west-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "prod.eu-west-3.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "prod.sa-east-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "prod.us-east-1.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "prod.us-east-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "prod.us-west-2.blackbeard.aws.a2z.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "costexplorer": {
+ "Value": "costexplorer",
+ "longName": {
+ "Value": "AWS Cost Explorer"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/aws-cost-management/aws-cost-explorer/"
+ },
+ "regions": {
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ce.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ce.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "cur": {
+ "Value": "cur",
+ "longName": {
+ "Value": "AWS Cost and Usage Report"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/aws-cost-management/aws-cost-and-usage-reporting/"
+ },
+ "regions": {
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cur.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cur.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "customer-profiles": {
+ "Value": "customer-profiles",
+ "longName": {
+ "Value": "Amazon Connect Customer Profiles"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "profile.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "profile.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "profile.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "profile.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "profile.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "profile.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "profile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "profile.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "databrew": {
+ "Value": "databrew",
+ "longName": {
+ "Value": "AWS Glue DataBrew"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "databrew.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "databrew.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "databrew.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "databrew.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "databrew.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "databrew.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "databrew.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "databrew.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "databrew.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "databrew.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "databrew.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "databrew.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "databrew.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "databrew.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "databrew.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "databrew.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "databrew.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "databrew.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "databrew.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "databrew.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "databrew.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "databrew.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "dataexchange": {
+ "Value": "dataexchange",
+ "longName": {
+ "Value": "AWS Data Exchange"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/data-exchange/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "dataexchange.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "dataexchange.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "dataexchange.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "dataexchange.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "dataexchange.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "dataexchange.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "dataexchange.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "dataexchange.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "dataexchange.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "dataexchange.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "dataexchange.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "datapipeline": {
+ "Value": "datapipeline",
+ "longName": {
+ "Value": "AWS Data Pipeline"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/datapipeline/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "datapipeline.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "datapipeline.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "datapipeline.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "datapipeline.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "datapipeline.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "datasync": {
+ "Value": "datasync",
+ "longName": {
+ "Value": "AWS DataSync"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/datasync"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "datasync.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "datasync.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "datasync.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "datasync.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "datasync.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "datasync.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "datasync.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "datasync.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "datasync.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "datasync.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "datasync.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "datasync.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "datasync.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "datasync.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "datasync.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "datasync.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "datasync.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "datasync.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "datasync.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "datasync.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "datasync.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "dax": {
+ "Value": "dax",
+ "longName": {
+ "Value": "Amazon DynamoDB Accelerator"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "dax.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "dax.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "dax.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "dax.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "dax.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "dax.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "dax.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "dax.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "dax.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "dax.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "dax.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "dax.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "dax.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "dax.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "dax.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "deepcomposer": {
+ "Value": "deepcomposer",
+ "longName": {
+ "Value": "AWS DeepComposer"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/deepcomposer/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "deepcomposer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "deeplens": {
+ "Value": "deeplens",
+ "longName": {
+ "Value": "AWS DeepLens"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/deeplens/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "deeplens.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "deeplens.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "deeplens.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "deepracer": {
+ "Value": "deepracer",
+ "longName": {
+ "Value": "AWS DeepRacer"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/deepracer/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1"
+ }
+ }
+ },
+ "detective": {
+ "Value": "detective",
+ "longName": {
+ "Value": "Amazon Detective"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/detective/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "api.detective.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "api.detective.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.detective.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "api.detective.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "api.detective.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "api.detective.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "api.detective.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "api.detective.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "api.detective.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "api.detective.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "api.detective.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.detective.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "api.detective.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "api.detective.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "api.detective.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "api.detective.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.detective.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "api.detective.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "api.detective.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "api.detective.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "api.detective.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.detective.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "devicefarm": {
+ "Value": "devicefarm",
+ "longName": {
+ "Value": "AWS Device Farm"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/device-farm/"
+ },
+ "regions": {
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "devicefarm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "devops-guru": {
+ "Value": "devops-guru",
+ "longName": {
+ "Value": "Amazon DevOps Guru"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/devops-guru/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "devops-guru.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "devops-guru.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "devops-guru.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "devops-guru.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "devops-guru.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "devops-guru.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "devops-guru.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "devops-guru.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "devops-guru.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "directconnect": {
+ "Value": "directconnect",
+ "longName": {
+ "Value": "AWS Direct Connect"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/directconnect/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "directconnect.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "directconnect.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "directconnect.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "directconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "directconnect.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "directconnect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "directconnect.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "directconnect.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "directconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "directconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "directconnect.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "directconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "directconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "directconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "directconnect.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "directconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "directconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "directconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "directconnect.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "directconnect.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "directconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "directconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "discovery": {
+ "Value": "discovery",
+ "longName": {
+ "Value": "AWS Application Discovery Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/application-discovery/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "discovery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "discovery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "discovery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "discovery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "discovery.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "discovery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "discovery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "dlm": {
+ "Value": "dlm",
+ "longName": {
+ "Value": "AWSdlm"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "dlm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "dlm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "dlm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "dlm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "dlm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "dlm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "dlm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "dlm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "dlm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "dlm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "dlm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "dlm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "dlm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "dlm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "dlm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "dlm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "dlm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "dlm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "dlm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "dlm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "dlm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "dlm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "dlm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "dms": {
+ "Value": "dms",
+ "longName": {
+ "Value": "AWS Database Migration Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/dms/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "dms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "dms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "dms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "dms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "dms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "dms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "dms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "dms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "dms.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "dms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "dms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "dms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "dms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "dms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "dms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "dms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "dms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "dms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "dms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "dms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "dms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "dms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "dms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "dms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "dms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "dms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "docdb": {
+ "Value": "docdb",
+ "longName": {
+ "Value": "Amazon DocumentDB (with MongoDB compatibility)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/documentdb/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "drs": {
+ "Value": "drs",
+ "longName": {
+ "Value": "AWS Elastic Disaster Recovery (DRS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/disaster-recovery/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "drs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "drs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "drs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "drs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "drs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "drs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "drs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "drs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "drs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ds": {
+ "Value": "ds",
+ "longName": {
+ "Value": "AWS Directory Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/directoryservice/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "dynamodb": {
+ "Value": "dynamodb",
+ "longName": {
+ "Value": "Amazon DynamoDB"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/dynamodb/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "dynamodb.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "dynamodb.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "dynamodb.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "dynamodb.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "dynamodb.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "dynamodb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "dynamodb.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "dynamodb.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "dynamodb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "dynamodb.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "dynamodb.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "dynamodb.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "dynamodb.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "dynamodb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "dynamodb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "dynamodb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "dynamodb.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "dynamodb.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "dynamodb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "dynamodb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "dynamodbstreams": {
+ "Value": "dynamodbstreams",
+ "longName": {
+ "Value": "Amazon DynamoDB Streams"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "streams.dynamodb.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "streams.dynamodb.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "streams.dynamodb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "ebs": {
+ "Value": "ebs",
+ "longName": {
+ "Value": "Amazon Elastic Block Store (EBS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ebs/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ec2": {
+ "Value": "ec2",
+ "longName": {
+ "Value": "Amazon Elastic Compute Cloud (EC2)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ec2/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "ecr": {
+ "Value": "ecr",
+ "longName": {
+ "Value": "Amazon Elastic Container Registry (ECR)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ecr/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ecr.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ecr.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ecr.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ecr.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ecr.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ecr.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ecr.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ecr.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ecr.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ecr.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ecr.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ecr.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ecr.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ecr.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ecr.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ecr.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ecr.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ecr.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ecr.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ecr.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ecr.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ecr.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ecr-public": {
+ "Value": "ecr-public",
+ "longName": {
+ "Value": "Amazon Elastic Container Registry Public"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ecr-public.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ecs": {
+ "Value": "ecs",
+ "longName": {
+ "Value": "Amazon Elastic Container Service (ECS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ecs/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ecs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ecs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ecs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ecs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ecs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ecs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ecs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ecs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ecs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ecs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ecs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ecs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ecs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ecs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ecs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ecs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ecs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ecs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ecs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ecs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ecs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ecs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "efs": {
+ "Value": "efs",
+ "longName": {
+ "Value": "Amazon Elastic File System (EFS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/efs/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elasticfilesystem.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "elasticfilesystem.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elasticfilesystem.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eks": {
+ "Value": "eks",
+ "longName": {
+ "Value": "Amazon Elastic Kubernetes Service (EKS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/eks"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "eks.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "eks.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "eks.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "eks.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "eks.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "eks.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "eks.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "eks.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "eks.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "eks.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "eks.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "eks.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "eks.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "eks.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "eks.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "eks.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "eks.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "eks.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "eks.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "eks.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "eks.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "eks.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "eks.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "eks.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "eks.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "elastic-inference": {
+ "Value": "elastic-inference",
+ "longName": {
+ "Value": "Amazon Elastic Inference"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elastic-inference/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.elastic-inference.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "api.elastic-inference.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.elastic-inference.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.elastic-inference.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "elasticache": {
+ "Value": "elasticache",
+ "longName": {
+ "Value": "Amazon ElastiCache"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elasticache/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "elasticache.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "elasticache.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "elasticache.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elasticache.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "elasticache.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "elasticache.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "elasticache.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "elasticache.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "elasticache.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "elasticache.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "elasticache.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elasticache.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "elasticache.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "elasticache.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "elasticache.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "elasticache.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elasticache.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "elasticache.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "elasticache.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "elasticache.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elasticache.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elasticache.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "elasticbeanstalk": {
+ "Value": "elasticbeanstalk",
+ "longName": {
+ "Value": "AWS Elastic Beanstalk"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elasticbeanstalk/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "elasticbeanstalk.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elasticbeanstalk.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "elastictranscoder": {
+ "Value": "elastictranscoder",
+ "longName": {
+ "Value": "Amazon Elastic Transcoder"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elastictranscoder/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elastictranscoder.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elastictranscoder.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elastictranscoder.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elastictranscoder.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elastictranscoder.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "elb": {
+ "Value": "elb",
+ "longName": {
+ "Value": "Elastic Load Balancing"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elasticloadbalancing/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "elasticloadbalancing.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elasticloadbalancing.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "emr": {
+ "Value": "emr",
+ "longName": {
+ "Value": "Amazon Elastic MapReduce (EMR)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/emr/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "elasticmapreduce.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "elasticmapreduce.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "elasticmapreduce.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "emr-containers": {
+ "Value": "emr-containers",
+ "longName": {
+ "Value": "Amazon EMR Containers"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "emr-containers.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "emr-containers.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "emr-containers.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "emr-containers.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "emr-containers.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "emr-containers.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "emr-containers.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "emr-containers.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "emr-containers.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "emr-containers.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "emr-containers.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "emr-containers.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "emr-containers.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "emr-containers.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "emr-containers.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "emr-containers.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "es": {
+ "Value": "es",
+ "longName": {
+ "Value": "Amazon Elasticsearch Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/elasticsearch-service/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "es.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "es.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "es.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "es.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "es.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "es.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "es.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "es.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "es.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "es.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "es.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "es.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "es.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "es.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "es.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "es.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "es.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "es.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "es.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "es.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "es.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "es.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "es.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "es.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "es.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "es.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "eventbridge": {
+ "Value": "eventbridge",
+ "longName": {
+ "Value": "Amazon EventBridge"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/eventbridge/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "events": {
+ "Value": "events",
+ "longName": {
+ "Value": "Amazon CloudWatch Events"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "events.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "events.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "events.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "events.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "events.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "events.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "events.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "events.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "events.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "events.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "events.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "events.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "events.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "events.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "events.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "events.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "events.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "events.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "events.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "events.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "events.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "events.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "events.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "events.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "events.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "events.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "evidently": {
+ "Value": "evidently",
+ "longName": {
+ "Value": "Amazon CloudWatch Evidently"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "evidently.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "evidently.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "evidently.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "evidently.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "evidently.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "evidently.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "evidently.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "evidently.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "evidently.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fargate": {
+ "Value": "fargate",
+ "longName": {
+ "Value": "AWS Fargate"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fargate/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "finspace": {
+ "Value": "finspace",
+ "longName": {
+ "Value": "Amazon FinSpace"
+ },
+ "regions": {
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "finspace.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "finspace.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "finspace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "finspace.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "finspace.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "finspace-data": {
+ "Value": "finspace-data",
+ "longName": {
+ "Value": "Amazon FinSpace Beta API"
+ },
+ "regions": {
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "finspace-api.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "finspace-api.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "finspace-api.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "finspace-api.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "finspace-api.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "firehose": {
+ "Value": "firehose",
+ "longName": {
+ "Value": "Amazon Kinesis Data Firehose"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kinesis/firehose/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "firehose.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "firehose.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "firehose.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "firehose.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "firehose.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "firehose.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "firehose.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "firehose.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "firehose.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "firehose.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "firehose.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "firehose.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "firehose.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "firehose.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "firehose.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "firehose.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "firehose.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "firehose.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "firehose.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "firehose.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "firehose.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "firehose.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "firehose.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fis": {
+ "Value": "fis",
+ "longName": {
+ "Value": "AWS Fault Injection Simulator"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fis/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fis.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fis.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fis.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fis.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fis.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fis.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fis.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fis.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fis.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fis.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fis.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fis.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fis.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fis.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fis.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fis.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fis.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fis.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "fis.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fis.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fms": {
+ "Value": "fms",
+ "longName": {
+ "Value": "AWS Firewall Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/firewall-manager/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "fms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "fms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "fms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "fms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "fms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "fms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "forecast": {
+ "Value": "forecast",
+ "longName": {
+ "Value": "Amazon Forecast"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/forecast/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "forecast.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "forecast.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "forecast.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "forecast.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "forecast.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "forecast.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "forecast.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "forecast.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "forecast.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "forecast.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "forecastquery": {
+ "Value": "forecastquery",
+ "longName": {
+ "Value": "Amazon Forecast Query"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "forecastquery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "forecastquery.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "forecastquery.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "forecastquery.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "forecastquery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "forecastquery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "forecastquery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "forecastquery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "forecastquery.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "forecastquery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "frauddetector": {
+ "Value": "frauddetector",
+ "longName": {
+ "Value": "Amazon Fraud Detector"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fraud-detector/"
+ },
+ "regions": {
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "frauddetector.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "frauddetector.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "frauddetector.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "frauddetector.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "frauddetector.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "frauddetector.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "freertosota": {
+ "Value": "freertosota",
+ "longName": {
+ "Value": "FreeRTOS"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/freertos/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fsx": {
+ "Value": "fsx",
+ "longName": {
+ "Value": "Amazon FSx"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fsx-lustre": {
+ "Value": "fsx-lustre",
+ "longName": {
+ "Value": "Amazon FSx for Lustre"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fsx/lustre/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fsx-ontap": {
+ "Value": "fsx-ontap",
+ "longName": {
+ "Value": "Amazon FSx for NetApp ONTAP"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fsx/netapp-ontap"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fsx-openzfs": {
+ "Value": "fsx-openzfs",
+ "longName": {
+ "Value": "Amazon FSx for OpenZFS"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fsx/openzfs"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "fsx-windows": {
+ "Value": "fsx-windows",
+ "longName": {
+ "Value": "Amazon FSx for Windows File Server"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/fsx/windows/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "fsx.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "fsx.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "fsx.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "fsx.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "fsx.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "fsx.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "fsx.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "fsx.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "fsx.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "fsx.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "fsx.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "fsx.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "fsx.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "fsx.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "fsx.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "fsx.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "fsx.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "fsx.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "fsx.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "fsx.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "fsx.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "gamelift": {
+ "Value": "gamelift",
+ "longName": {
+ "Value": "Amazon GameLift"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/gamelift/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "gamelift.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "gamelift.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "gamelift.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "gamelift.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "gamelift.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "gamelift.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "gamelift.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "gamelift.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "gamelift.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "gamelift.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "gamelift.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "gamelift.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "gamelift.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "gamelift.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "gamelift.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "gamelift.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "glacier": {
+ "Value": "glacier",
+ "longName": {
+ "Value": "Amazon Glacier"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "glacier.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "glacier.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "glacier.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "glacier.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "glacier.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "glacier.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "glacier.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "glacier.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "glacier.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "glacier.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "glacier.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "glacier.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "glacier.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "glacier.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "glacier.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "glacier.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "glacier.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "glacier.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "glacier.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "glacier.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "glacier.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "glacier.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "globalaccelerator": {
+ "Value": "globalaccelerator",
+ "longName": {
+ "Value": "AWS Global Accelerator"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/global-accelerator"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "globalaccelerator.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "glue": {
+ "Value": "glue",
+ "longName": {
+ "Value": "AWS Glue"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/glue/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "glue.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "glue.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "glue.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "glue.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "glue.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "glue.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "glue.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "glue.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "glue.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "glue.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "glue.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "glue.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "glue.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "glue.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "glue.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "glue.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "glue.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "glue.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "glue.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "glue.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "glue.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "glue.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "glue.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "glue.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "glue.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "grafana": {
+ "Value": "grafana",
+ "longName": {
+ "Value": "Amazon Managed Grafana"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/grafana/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "grafana.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "grafana.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "grafana.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "grafana.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "grafana.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "grafana.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "grafana.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "grafana.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "grafana.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "grafana.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "greengrass": {
+ "Value": "greengrass",
+ "longName": {
+ "Value": "AWS IoT Greengrass"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/greengrass/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "greengrass.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "greengrass.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "greengrass.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "greengrass.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "greengrass.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "greengrass.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "greengrass.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "greengrass.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "greengrass.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "greengrass.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "greengrass.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "greengrass.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "greengrass.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "greengrass.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "greengrass.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "groundstation": {
+ "Value": "groundstation",
+ "longName": {
+ "Value": "AWS Ground Station"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ground-station/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "groundstation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "groundstation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "groundstation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "groundstation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "groundstation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "groundstation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "groundstation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "groundstation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "groundstation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "groundstation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "guardduty": {
+ "Value": "guardduty",
+ "longName": {
+ "Value": "Amazon GuardDuty"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/guardduty/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "guardduty.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "guardduty.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "guardduty.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "guardduty.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "guardduty.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "guardduty.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "guardduty.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "guardduty.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "guardduty.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "guardduty.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "guardduty.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "guardduty.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "guardduty.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "guardduty.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "guardduty.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "guardduty.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "guardduty.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "guardduty.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "guardduty.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "guardduty.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "guardduty.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "guardduty.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "health": {
+ "Value": "health",
+ "longName": {
+ "Value": "AWS Health APIs And Notifications"
+ },
+ "regions": {
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "health.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "health.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "health.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "health.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "health.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "honeycode": {
+ "Value": "honeycode",
+ "longName": {
+ "Value": "Amazon Honeycode"
+ },
+ "marketingHomeURL": {
+ "Value": "https://www.honeycode.aws/"
+ },
+ "regions": {
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "honeycode.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iam": {
+ "Value": "iam",
+ "longName": {
+ "Value": "AWS Identity and Access Management (IAM)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iam"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iam.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "iam.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "iam.us-gov.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iam.us-gov.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iam.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "identitystore": {
+ "Value": "identitystore",
+ "longName": {
+ "Value": "AWSIdentityStore"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "identitystore.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "identitystore.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "identitystore.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "identitystore.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "identitystore.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "identitystore.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "identitystore.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "identitystore.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "identitystore.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "identitystore.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "identitystore.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "identitystore.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "identitystore.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "identitystore.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "identitystore.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "imagebuilder": {
+ "Value": "imagebuilder",
+ "longName": {
+ "Value": "EC2 Image Builder"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "imagebuilder.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "imagebuilder.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "imagebuilder.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "imagebuilder.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "imagebuilder.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "imagebuilder.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "imagebuilder.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "imagebuilder.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "imagebuilder.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "imagebuilder.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "imagebuilder.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "imagebuilder.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "imagebuilder.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "imagebuilder.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "imagebuilder.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "imagebuilder.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "imagebuilder.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "imagebuilder.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "imagebuilder.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "imagebuilder.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "importexport": {
+ "Value": "importexport",
+ "longName": {
+ "Value": "AWS Import/Export"
+ },
+ "regions": {
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "importexport.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "inspector": {
+ "Value": "inspector",
+ "longName": {
+ "Value": "Amazon Inspector"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/inspector/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "inspector.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "inspector.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "inspector.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "inspector.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "inspector.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "inspector.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "inspector.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "inspector.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "inspector.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "inspector.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "inspector.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "inspector.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "inspector.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "inspector.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "inspector2": {
+ "Value": "inspector2",
+ "longName": {
+ "Value": "Amazon Inspector"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "inspector2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "inspector2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "inspector2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "inspector2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "inspector2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "inspector2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "inspector2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "inspector2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "inspector2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "inspector2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "inspector2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "inspector2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "inspector2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "inspector2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "inspector2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "inspector2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "inspector2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "inspector2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "inspector2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iot": {
+ "Value": "iot",
+ "longName": {
+ "Value": "AWS IoT Core"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iot-data": {
+ "Value": "iot-data",
+ "longName": {
+ "Value": "AWS IoT (data plane)"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "data-ats.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "data-ats.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "data.ats.iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "data-ats.iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "data-ats.iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "data-ats.iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "data-ats.iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "data-ats.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "data-ats.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "data-ats.iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "data-ats.iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "data-ats.iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "data-ats.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iot-jobs-data": {
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "data.jobs.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "data.jobs.iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "data.jobs.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iot1click-devices": {
+ "Value": "iot1click-devices",
+ "longName": {
+ "Value": "AWS IoT 1-Click Devices Service"
+ },
+ "regions": {
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "devices.iot1click.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iot1click-projects": {
+ "Value": "iot1click-projects",
+ "longName": {
+ "Value": "AWS IoT 1-Click"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-1-click/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "projects.iot1click.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "projects.iot1click.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "projects.iot1click.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "projects.iot1click.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "projects.iot1click.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotanalytics": {
+ "Value": "iotanalytics",
+ "longName": {
+ "Value": "AWS IoT Analytics"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-analytics/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iotanalytics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iotanalytics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iotanalytics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iotanalytics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iotanalytics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iotanalytics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iotanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iotanalytics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iotanalytics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotdeviceadvisor": {
+ "Value": "iotdeviceadvisor",
+ "longName": {
+ "Value": "AWS IoT Device Advisor"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.iotdeviceadvisor.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotdevicedefender": {
+ "Value": "iotdevicedefender",
+ "longName": {
+ "Value": "AWS IoT Device Defender"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-device-defender/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotdevicemanagement": {
+ "Value": "iotdevicemanagement",
+ "longName": {
+ "Value": "AWS IoT Device Management"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-device-management/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "iot.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iot.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "iot.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "iot.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "iot.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "iot.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "iot.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iot.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "iot.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotevents": {
+ "Value": "iotevents",
+ "longName": {
+ "Value": " AWS IoT Events"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-events/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iotevents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iotevents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iotevents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iotevents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iotevents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iotevents.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iotevents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iotevents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "iotevents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iotevents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "iotevents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iotevents.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iotevents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotevents-data": {
+ "Value": "iotevents-data",
+ "longName": {
+ "Value": "AWS IoT Events"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-events/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "data.iotevents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "data.iotevents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "data.iotevents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "data.iotevents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "data.iotevents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "data.iotevents.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "data.iotevents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "data.iotevents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "data.iotevents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "data.iotevents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "data.iotevents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "data.iotevents.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "data.iotevents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotfleethub": {
+ "Value": "iotfleethub",
+ "longName": {
+ "Value": "AWS IoT Fleet Hub"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "api.fleethub.iot.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.fleethub.iot.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotsitewise": {
+ "Value": "iotsitewise",
+ "longName": {
+ "Value": "AWS IoT SiteWise"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-sitewise/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iotsitewise.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iotsitewise.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "iotsitewise.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "iotsitewise.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iotsitewise.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "iotsitewise.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "iotsitewise.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iotsitewise.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iotsitewise.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "iotsitewise.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iotsitewise.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotthingsgraph": {
+ "Value": "iotthingsgraph",
+ "longName": {
+ "Value": "AWS IoT Things Graph"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/iot-things-graph/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "iotthingsgraph.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "iotthingsgraph.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "iotthingsgraph.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "iotthingsgraph.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "iotwireless": {
+ "Value": "iotwireless",
+ "longName": {
+ "Value": "IoTWirelessConnectivity"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.iotwireless.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "api.iotwireless.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.iotwireless.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.iotwireless.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.iotwireless.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ivs": {
+ "Value": "ivs",
+ "longName": {
+ "Value": "Amazon IVS"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ivs/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ivs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ivs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ivs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ivs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ivs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ivs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ivs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kafka": {
+ "Value": "kafka",
+ "longName": {
+ "Value": "Amazon Managed Streaming for Apache Kafka"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/msk/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "kafka.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kafka.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kafka.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kafka.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kafka.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kafka.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kafka.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "kafka.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "kafka.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kafka.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "kafka.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "kafka.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kafka.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kafka.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kafka.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "kafka.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kafka.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kafka.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kafka.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "kafka.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "kafka.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "kafka.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kafka.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kafkaconnect": {
+ "Value": "kafkaconnect",
+ "longName": {
+ "Value": "Managed Streaming for Kafka Connect Engine"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kafkaconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kafkaconnect.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kafkaconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kafkaconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kafkaconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kafkaconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "kafkaconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kafkaconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kendra": {
+ "Value": "kendra",
+ "longName": {
+ "Value": "Amazon Kendra"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kendra/"
+ },
+ "regions": {
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kendra.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kendra.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kendra.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kendra.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kendra.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kendra.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "kendra.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kendra.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kinesis": {
+ "Value": "kinesis",
+ "longName": {
+ "Value": "Amazon Kinesis Data Streams"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kinesis/streams/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "kinesis.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "kinesis.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "kinesis.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kinesis.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "kinesis.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kinesis.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "kinesis.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "kinesis.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kinesis.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "kinesis.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "kinesis.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kinesis.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kinesis.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kinesis.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "kinesis.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kinesis.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kinesis.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kinesis.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "kinesis.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "kinesis.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "kinesis.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kinesis.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kinesisanalytics": {
+ "Value": "kinesisanalytics",
+ "longName": {
+ "Value": "Amazon Kinesis Data Analytics"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kinesis/analytics/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kinesisanalytics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kinesisanalytics.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kinesisanalytics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kinesisvideo": {
+ "Value": "kinesisvideo",
+ "longName": {
+ "Value": "Amazon Kinesis Video Streams"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kinesis/video-streams/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kinesisvideo.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kinesisvideo.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kinesisvideo.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kinesisvideo.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kinesisvideo.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kinesisvideo.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kinesisvideo.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "kms": {
+ "Value": "kms",
+ "longName": {
+ "Value": "AWS Key Management Service"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/kms/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "kms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "kms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "kms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "kms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "kms.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "kms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "kms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "kms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "kms.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "kms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "kms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "kms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "kms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "kms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "kms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "kms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "kms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "kms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "kms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "kms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "kms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "kms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "kms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "kms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "kms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "kms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lakeformation": {
+ "Value": "lakeformation",
+ "longName": {
+ "Value": "AWS Lake Formation"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lake-formation/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "lakeformation.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "lakeformation.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "lakeformation.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "lakeformation.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "lakeformation.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "lakeformation.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "lakeformation.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "lakeformation.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "lakeformation.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "lakeformation.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "lakeformation.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "lakeformation.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "lakeformation.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "lakeformation.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "lakeformation.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lakeformation.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "lakeformation.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "lakeformation.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "lakeformation.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "lakeformation.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lambda": {
+ "Value": "lambda",
+ "longName": {
+ "Value": "AWS Lambda"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lambda/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "lambda.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "lambda.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "lambda.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "lambda.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "lambda.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "lambda.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "lambda.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "lambda.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "lambda.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "lambda.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "lambda.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lambda.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "lambda.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "lambda.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "lambda.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "lambda.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lambda.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "lambda.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "lambda.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "lambda.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "lambda.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "lambda.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lex-models": {
+ "Value": "lex-models",
+ "longName": {
+ "Value": "Amazon Lex Model Building Service"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "models.lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "models.lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "models.lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "models.lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "models.lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "models.lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "models.lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "models.lex.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "models.lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lex-runtime": {
+ "Value": "lex-runtime",
+ "longName": {
+ "Value": "Amazon Lex"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lex/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "runtime-v2-lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "runtime-v2-lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "runtime-v2-lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lexv2-models": {
+ "Value": "lexv2-models",
+ "longName": {
+ "Value": "Amazon Lex Model Building V2"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "models-v2-lex.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "models-v2-lex.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "models-v2-lex.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "models-v2-lex.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "models-v2-lex.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "models-v2-lex.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "license-manager": {
+ "Value": "license-manager",
+ "longName": {
+ "Value": "AWS License Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/license-manager/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "license-manager.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "license-manager.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "license-manager.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "license-manager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "license-manager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "license-manager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "license-manager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "license-manager.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "license-manager.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "license-manager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "license-manager.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "license-manager.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "license-manager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "license-manager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "license-manager.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "license-manager.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "license-manager.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "license-manager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "license-manager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "license-manager.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "license-manager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "license-manager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "license-manager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lightsail": {
+ "Value": "lightsail",
+ "longName": {
+ "Value": "Amazon Lightsail"
+ },
+ "marketingHomeURL": {
+ "Value": "https://amazonlightsail.com/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "lightsail.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "lightsail.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "lightsail.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "lightsail.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "lightsail.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "lightsail.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "lightsail.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "lightsail.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lightsail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "lightsail.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "lightsail.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lightsail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "lightsail.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "lightsail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "logs": {
+ "Value": "logs",
+ "longName": {
+ "Value": "Amazon CloudWatch Logs"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "logs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "logs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "logs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "logs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "logs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "logs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "logs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "logs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "logs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "logs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "logs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "logs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "logs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "logs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "logs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "logs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "logs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "logs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "logs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "logs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "logs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "logs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "logs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "logs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "logs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "logs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lookoutequipment": {
+ "Value": "lookoutequipment",
+ "longName": {
+ "Value": "Amazon Lookout for Equipment"
+ },
+ "regions": {
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "lookoutequipment.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lookoutequipment.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lookoutequipment.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lookoutmetrics": {
+ "Value": "lookoutmetrics",
+ "longName": {
+ "Value": "Amazon Lookout for Metrics"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lookout-for-metrics/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "lookoutmetrics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "lookoutmetrics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lookoutvision": {
+ "Value": "lookoutvision",
+ "longName": {
+ "Value": "Amazon Lookout for Vision"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lookout-for-vision/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "lookoutvision.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "lookoutvision.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "lookoutvision.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "lookoutvision.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "lookoutvision.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "lookoutvision.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "lookoutvision.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "lumberyard": {
+ "Value": "lumberyard",
+ "longName": {
+ "Value": "Amazon Lumberyard"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/lumberyard/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "machinelearning": {
+ "Value": "machinelearning",
+ "longName": {
+ "Value": "Amazon Machine Learning"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "machinelearning.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "machinelearning.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "macie": {
+ "Value": "macie",
+ "longName": {
+ "Value": "Amazon Macie"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/macie/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "macie2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "macie2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "macie2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "macie2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "macie2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "macie2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "macie2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "macie2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "macie2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "macie2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "macie2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "macie2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "macie2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "macie2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "macie2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "macie2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "macie2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "macie2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "macie2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "managedblockchain": {
+ "Value": "managedblockchain",
+ "longName": {
+ "Value": "Amazon Managed Blockchain"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/managed-blockchain/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "managedblockchain.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "managedblockchain.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "managedblockchain.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "managedblockchain.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "managedblockchain.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "managedblockchain.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "managedservices": {
+ "Value": "managedservices",
+ "longName": {
+ "Value": "AWS Managed Services"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/managed-services/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "amscm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "marketplace": {
+ "Value": "marketplace",
+ "longName": {
+ "Value": "AWS Marketplace"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mp/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "marketplace.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "marketplace.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "marketplace-entitlement": {
+ "Value": "marketplace-entitlement",
+ "longName": {
+ "Value": "AWS Marketplace Entitlement Service"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "entitlement.marketplace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "marketplacecommerceanalytics": {
+ "Value": "marketplacecommerceanalytics",
+ "longName": {
+ "Value": "AWS Marketplace Commerce Analytics"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "marketplacecommerceanalytics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mcs": {
+ "Value": "mcs",
+ "longName": {
+ "Value": "Amazon Keyspaces (for Apache Cassandra)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/keyspaces/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "cassandra.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "cassandra.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "cassandra.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "cassandra.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "cassandra.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "cassandra.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "cassandra.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cassandra.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cassandra.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "cassandra.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "cassandra.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "cassandra.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "cassandra.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "cassandra.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "cassandra.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "cassandra.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "cassandra.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "cassandra.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "cassandra.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "cassandra.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "TLS"
+ }
+ }
+ }
+ },
+ "mediaconnect": {
+ "Value": "mediaconnect",
+ "longName": {
+ "Value": "AWS Elemental MediaConnect"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mediaconnect"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "mediaconnect.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mediaconnect.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mediaconnect.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mediaconnect.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mediaconnect.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mediaconnect.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mediaconnect.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mediaconnect.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mediaconnect.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mediaconnect.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mediaconnect.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mediaconnect.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mediaconnect.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mediaconnect.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mediaconvert": {
+ "Value": "mediaconvert",
+ "longName": {
+ "Value": "AWS Elemental MediaConvert"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mediaconvert/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mediaconvert.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mediaconvert.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mediaconvert.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mediaconvert.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mediaconvert.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "mediaconvert.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mediaconvert.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mediaconvert.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mediaconvert.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mediaconvert.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mediaconvert.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mediaconvert.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "mediaconvert.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mediaconvert.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mediaconvert.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "medialive": {
+ "Value": "medialive",
+ "longName": {
+ "Value": "AWS Elemental MediaLive"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/medialive/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "medialive.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "medialive.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "medialive.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "medialive.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "medialive.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "medialive.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "medialive.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "medialive.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "medialive.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "medialive.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "medialive.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "medialive.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "medialive.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "medialive.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mediapackage": {
+ "Value": "mediapackage",
+ "longName": {
+ "Value": "AWS Elemental MediaPackage"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mediapackage/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mediapackage.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mediapackage.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mediapackage.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mediapackage.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mediapackage.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mediapackage.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mediapackage.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mediapackage.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mediapackage.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mediapackage.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mediapackage.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mediapackage.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mediapackage.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mediapackage-vod": {
+ "Value": "mediapackage-vod",
+ "longName": {
+ "Value": "AWS Elemental MediaPackage VOD"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mediapackage-vod.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mediapackage-vod.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mediapackage-vod.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mediastore": {
+ "Value": "mediastore",
+ "longName": {
+ "Value": "AWS Elemental MediaStore"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mediastore/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mediastore.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mediastore.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mediastore.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mediastore.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mediastore.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mediastore.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mediastore.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mediastore.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mediastore.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mediastore-data": {
+ "Value": "mediastore-data",
+ "longName": {
+ "Value": "AWS Elemental MediaStore Data Plane"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "mediatailor": {
+ "Value": "mediatailor",
+ "longName": {
+ "Value": "AWS Elemental MediaTailor"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/mediatailor/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "api.mediatailor.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "api.mediatailor.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.mediatailor.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.mediatailor.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.mediatailor.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "memorydb": {
+ "Value": "memorydb",
+ "longName": {
+ "Value": "Amazon MemoryDB for Redis"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "memory-db.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "memory-db.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "memory-db.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "memory-db.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "memory-db.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "memory-db.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "memory-db.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "memory-db.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "memory-db.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "memory-db.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "memory-db.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "memory-db.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "memory-db.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "memory-db.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "meteringmarketplace": {
+ "Value": "meteringmarketplace",
+ "longName": {
+ "Value": "AWS Marketplace Metering Service"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "metering.marketplace.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "metering.marketplace.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "metering.marketplace.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "metering.marketplace.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "metering.marketplace.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "metering.marketplace.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "metering.marketplace.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "metering.marketplace.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "metering.marketplace.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "metering.marketplace.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "metering.marketplace.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "metering.marketplace.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mgh": {
+ "Value": "mgh",
+ "longName": {
+ "Value": "AWS Migration Hub"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/migration-hub/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mgh.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mgh.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mgh.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mgh.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mgh.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mgh.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mgh.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mgn": {
+ "Value": "mgn",
+ "longName": {
+ "Value": "AWS Application Migration Service (MGN)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/application-migration-service/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "mgn.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "mgn.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "mgn.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mgn.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mgn.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mgn.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "mgn.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mgn.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mgn.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "mgn.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mgn.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mgn.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mgn.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "mgn.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mgn.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mgn.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mgn.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mgn.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mgn.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "migrationhubstrategy": {
+ "Value": "migrationhubstrategy",
+ "longName": {
+ "Value": "Migration Hub Strategy Recommendations"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "mobile": {
+ "Value": "mobile",
+ "longName": {
+ "Value": "AWS Mobile Service"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mobile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mobile.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mq": {
+ "Value": "mq",
+ "longName": {
+ "Value": "Amazon MQ"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/amazon-mq/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "mq.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "mq.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "mq.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "mq.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "mq.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "mq.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "mq.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "mq.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "mq.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "mq.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "mq.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "mq.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "mq.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "mq.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "mq.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "mq.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "mq.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "mq.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "mq.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "mq.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mq.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "mq.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "mq.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "mq.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "mq.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "mq.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mturk": {
+ "Value": "mturk",
+ "longName": {
+ "Value": "Amazon Mechanical Turk"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "mturk-requester.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "mwaa": {
+ "Value": "mwaa",
+ "longName": {
+ "Value": "Amazon Managed Workflows for Apache Airflow"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/managed-workflows-for-apache-airflow/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "neptune": {
+ "Value": "neptune",
+ "longName": {
+ "Value": "Amazon Neptune"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/neptune/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "network-firewall": {
+ "Value": "network-firewall",
+ "longName": {
+ "Value": "AWS Network Firewall"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/network-firewall/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "network-firewall.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "network-firewall.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "network-firewall.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "network-firewall.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "network-firewall.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "network-firewall.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "network-firewall.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "network-firewall.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "network-firewall.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "network-firewall.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "network-firewall.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "network-firewall.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "network-firewall.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "network-firewall.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "network-firewall.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "network-firewall-fips.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "network-firewall-fips.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "network-firewall.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "network-firewall.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "networkmanager": {
+ "Value": "networkmanager",
+ "longName": {
+ "Value": "NetworkManager"
+ },
+ "regions": {
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "networkmanager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "networkmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "nimble": {
+ "Value": "nimble",
+ "longName": {
+ "Value": "Amazon Nimble Studio"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/nimble-studio/"
+ },
+ "regions": {
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "nimble.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "nimble.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "nimble.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "nimble.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "nimble.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "opsworks": {
+ "Value": "opsworks",
+ "longName": {
+ "Value": "AWS OpsWorks Stacks"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/opsworks/stacks/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "opsworks.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "opsworks.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "opsworks.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "opsworks.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "opsworks.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "opsworks.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "opsworks.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "opsworks.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "opsworks.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "opsworks.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "opsworks.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "opsworks.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "opsworks.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "opsworks.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "opsworks.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "opsworkschefautomate": {
+ "Value": "opsworkschefautomate",
+ "longName": {
+ "Value": "AWS OpsWorks for Chef Automate"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/opsworks/chefautomate/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "opsworkscm": {
+ "Value": "opsworkscm",
+ "longName": {
+ "Value": "AWS OpsWorks for Chef Automate"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "opsworkspuppetenterprise": {
+ "Value": "opsworkspuppetenterprise",
+ "longName": {
+ "Value": "AWS OpsWorks for Puppet Enterprise"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/opsworks/puppetenterprise/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "opsworks-cm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "opsworks-cm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "organizations": {
+ "Value": "organizations",
+ "longName": {
+ "Value": "AWS Organizations"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/organizations"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "organizations.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "organizations.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "organizations.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "organizations.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "organizations.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "outposts": {
+ "Value": "outposts",
+ "longName": {
+ "Value": "AWS Outposts"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/outposts/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "outposts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "outposts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "outposts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "outposts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "outposts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "outposts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "outposts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "outposts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "outposts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "outposts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "outposts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "outposts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "outposts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "outposts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "outposts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "outposts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "outposts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "outposts.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "outposts.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "outposts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "outposts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "personalize": {
+ "Value": "personalize",
+ "longName": {
+ "Value": "Amazon Personalize"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/personalize/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "personalize.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "personalize.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "personalize.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "personalize.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "personalize.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "personalize.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "personalize.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "personalize.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "personalize.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "personalize.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "personalize.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "personalize.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "phd": {
+ "Value": "phd",
+ "longName": {
+ "Value": "AWS Personal Health Dashboard"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/premiumsupport/phd/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "phd.amazonaws.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "phd.amazonaws.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "phd.amazonaws-us-gov.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "phd.amazonaws-us-gov.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "phd.aws.amazon.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "pi": {
+ "Value": "pi",
+ "longName": {
+ "Value": "performanceinsights"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "pi.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "pi.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "pi.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "pi.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "pi.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "pi.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "pi.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "pi.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "pi.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "pi.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "pi.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "pi.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "pi.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "pi.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "pi.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "pi.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "pi.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "pi.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "pi.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "pi.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "pi.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "pi.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "pi.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "pinpoint": {
+ "Value": "pinpoint",
+ "longName": {
+ "Value": "Amazon Pinpoint"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/pinpoint/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "pinpoint.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "pinpoint.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "pinpoint.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "pinpoint.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "pinpoint.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "pinpoint.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "pinpoint-email": {
+ "Value": "pinpoint-email",
+ "longName": {
+ "Value": "Amazon Pinpoint Email Service"
+ },
+ "regions": {
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "email.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "email.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "email.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "email.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "email.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "email.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "pinpoint-sms-voice": {
+ "Value": "pinpoint-sms-voice",
+ "longName": {
+ "Value": "Amazon Pinpoint SMS Voice"
+ },
+ "regions": {
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "polly": {
+ "Value": "polly",
+ "longName": {
+ "Value": "Amazon Polly"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/polly/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "polly.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "polly.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "polly.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "polly.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "polly.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "polly.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "polly.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "polly.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "polly.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "polly.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "polly.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "polly.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "polly.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "polly.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "polly.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "polly.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "polly.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "polly.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "polly.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "polly.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "polly.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "pricing": {
+ "Value": "pricing",
+ "longName": {
+ "Value": "AWS Price List Service"
+ },
+ "regions": {
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "api.pricing.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.pricing.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "privatelink": {
+ "Value": "privatelink",
+ "longName": {
+ "Value": "AWS PrivateLink"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/privatelink/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "proton": {
+ "Value": "proton",
+ "longName": {
+ "Value": "AWS Proton"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/proton/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "proton.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "proton.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "proton.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "proton.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "proton.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "qldb": {
+ "Value": "qldb",
+ "longName": {
+ "Value": "Amazon Quantum Ledger Database (QLDB)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/qldb/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "qldb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "qldb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "qldb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "qldb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "qldb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "qldb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "qldb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "qldb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "qldb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "qldb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "qldb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "qldb-session": {
+ "Value": "qldb-session",
+ "longName": {
+ "Value": "Amazon QLDB Session"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "session.qldb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "session.qldb.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "session.qldb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "session.qldb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "session.qldb.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "session.qldb.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "session.qldb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "session.qldb.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "session.qldb.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "session.qldb.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "session.qldb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "quicksight": {
+ "Value": "quicksight",
+ "longName": {
+ "Value": "Amazon QuickSight"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/quicksight/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "quicksight.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "quicksight.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "quicksight.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "quicksight.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "quicksight.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "quicksight.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "quicksight.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "quicksight.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "quicksight.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "quicksight.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "quicksight.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "quicksight.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "quicksight.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "quicksight.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ram": {
+ "Value": "ram",
+ "longName": {
+ "Value": "AWS Resource Access Manager (RAM)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ram/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ram.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ram.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ram.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ram.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ram.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ram.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ram.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ram.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ram.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ram.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ram.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ram.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ram.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ram.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ram.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ram.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ram.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ram.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ram.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ram.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ram.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ram.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ram.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ram.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ram.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rbin": {
+ "Value": "rbin",
+ "longName": {
+ "Value": "AWS Recycle Bin"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "rbin.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "rbin.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rbin.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rbin.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "rbin.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rbin.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rbin.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rbin.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rbin.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rbin.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "rbin.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "rbin.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rbin.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rbin.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rbin.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "rbin.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "rbin.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rbin.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rbin.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rbin.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rbin.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rds": {
+ "Value": "rds",
+ "longName": {
+ "Value": "Amazon Relational Database Service (RDS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/rds/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "rds.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "rds.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rds.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rds.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "rds.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rds.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rds.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rds.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "rds.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rds.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "rds.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rds.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "rds.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "rds.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rds.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rds.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rds.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "rds.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "rds.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rds.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rds.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "rds.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "rds.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rds.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rds.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rds-data": {
+ "Value": "rds-data",
+ "longName": {
+ "Value": "RDS Data"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rds-data.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rds-data.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rds-data.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rds-data.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rds-data.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rds-data.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rds-data.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rds-data.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rds-data.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "rds-data.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rds-data.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rds-data.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rds-data.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rds-data.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rdsvmware": {
+ "Value": "rdsvmware",
+ "longName": {
+ "Value": "Amazon RDS on VMware"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/rds/vmware/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1"
+ }
+ }
+ },
+ "redshift": {
+ "Value": "redshift",
+ "longName": {
+ "Value": "Amazon Redshift"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/redshift/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "redshift.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "redshift.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "redshift.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "redshift.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "redshift.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "redshift.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "redshift.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "redshift.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "redshift.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "redshift.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "redshift.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "redshift.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "redshift.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "redshift.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "redshift.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "redshift.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "redshift.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "redshift.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "redshift.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "redshift.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "redshift.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "redshift.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "redshift-data": {
+ "Value": "redshift-data",
+ "longName": {
+ "Value": "Redshift Data API Service"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "redshift-data.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "redshift-data.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "redshift-data.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "redshift-data.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "redshift-data.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "redshift-data.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "redshift-data.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "redshift-data.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "redshift-data.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "redshift-data.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "redshift-data.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "redshift-data.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "redshift-data.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "redshift-data.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "redshift-data.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "redshift-data.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "redshift-data.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "redshift-data.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "redshift-data.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "redshift-data.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "redshift-data.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rekognition": {
+ "Value": "rekognition",
+ "longName": {
+ "Value": "Amazon Rekognition"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/rekognition/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rekognition.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "rekognition.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "rekognition.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rekognition.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rekognition.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "rekognition.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rekognition.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rekognition.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rekognition.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rekognition.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rekognition.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "rekognition.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "rekognition.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rekognition.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "resiliencehub": {
+ "Value": "resiliencehub",
+ "longName": {
+ "Value": "AWS Resilience Hub"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/resilience-hub/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "resiliencehub.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "resiliencehub.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "resiliencehub.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "resiliencehub.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "resiliencehub.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "resiliencehub.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "resiliencehub.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "resource-groups": {
+ "Value": "resource-groups",
+ "longName": {
+ "Value": "AWS Resource Groups"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "resource-groups.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "resource-groups.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "resource-groups.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "resource-groups.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "resource-groups.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "resource-groups.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "resource-groups.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "resource-groups.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "resource-groups.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "resource-groups.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "resource-groups.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "resource-groups.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "resource-groups.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "resource-groups.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "resource-groups.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "resource-groups.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "resource-groups.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "resource-groups.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "resource-groups.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "resource-groups.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "resourcegroupstaggingapi": {
+ "Value": "resourcegroupstaggingapi",
+ "longName": {
+ "Value": "AWS Resource Groups Tagging API"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "tagging.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "tagging.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "tagging.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "tagging.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "tagging.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "tagging.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "tagging.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "tagging.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "tagging.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "tagging.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "tagging.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "tagging.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "tagging.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "tagging.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "tagging.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "tagging.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "tagging.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "tagging.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "tagging.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "tagging.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "tagging.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "tagging.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "robomaker": {
+ "Value": "robomaker",
+ "longName": {
+ "Value": "AWS RoboMaker"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/robomaker/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "robomaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "robomaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "robomaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "robomaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "robomaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "robomaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "robomaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rosa": {
+ "Value": "rosa",
+ "longName": {
+ "Value": "Red Hat OpenShift Service on AWS (ROSA)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/rosa/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "route53": {
+ "Value": "route53",
+ "longName": {
+ "Value": "Amazon Route 53"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/route53/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "route53.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "route53-recovery-control-config": {
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "route53domains": {
+ "Value": "route53domains",
+ "longName": {
+ "Value": "Amazon Route 53 Domains"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "route53domains.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "route53resolver": {
+ "Value": "route53resolver",
+ "longName": {
+ "Value": "Amazon Route 53 Resolver"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "route53resolver.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "route53resolver.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "route53resolver.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "route53resolver.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "route53resolver.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "route53resolver.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "route53resolver.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "route53resolver.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "route53resolver.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "route53resolver.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "route53resolver.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "route53resolver.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "route53resolver.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "route53resolver.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "route53resolver.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "route53resolver.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "route53resolver.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "route53resolver.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "route53resolver.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "route53resolver.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "route53resolver.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "rum": {
+ "Value": "rum",
+ "longName": {
+ "Value": "RUMControlPlaneLambda"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "rum.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "rum.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "rum.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "rum.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "rum.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "rum.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "rum.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "rum.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "rum.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "rum.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "s3": {
+ "Value": "s3",
+ "longName": {
+ "Value": "Amazon Simple Storage Service (S3)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/s3/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "s3.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "s3.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "s3.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "s3.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "s3.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "s3.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "s3.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "s3.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "s3.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "s3.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "s3.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "s3.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "s3.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "s3.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "s3.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "s3.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "s3.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "s3.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "s3.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "s3.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "s3.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "s3.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "s3.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "s3.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "s3.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "s3.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "s3control": {
+ "Value": "s3control",
+ "longName": {
+ "Value": "AWS S3 Control"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "s3outposts": {
+ "Value": "s3outposts",
+ "longName": {
+ "Value": "AWS S3 for Outposts"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "s3-outposts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "s3-outposts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "s3-outposts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "s3-outposts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "s3-outposts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "s3-outposts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "s3-outposts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "s3-outposts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "s3-outposts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "s3-outposts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "s3-outposts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "s3-outposts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "s3-outposts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "s3-outposts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "s3-outposts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "s3-outposts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "s3-outposts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sagemaker": {
+ "Value": "sagemaker",
+ "longName": {
+ "Value": "Amazon SageMaker"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/sagemaker/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "api.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "api.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "api.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "api.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "api.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "api.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "api.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "api.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "api.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "api.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "api.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "api.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "api.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sagemaker-edge": {
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "sagemaker-featurestore-runtime": {
+ "Value": "sagemaker-featurestore-runtime",
+ "longName": {
+ "Value": "Amazon SageMaker Feature Store Runtime"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "featurestore-runtime.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sagemaker-runtime": {
+ "Value": "sagemaker-runtime",
+ "longName": {
+ "Value": "Amazon SageMaker"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "runtime.sagemaker.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "runtime.sagemaker.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "savingsplans": {
+ "Value": "savingsplans",
+ "longName": {
+ "Value": "AWS Savings Plans"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "savingsplans.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "schemas": {
+ "Value": "schemas",
+ "longName": {
+ "Value": "AWS EventBridge Schemas"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "schemas.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "schemas.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "schemas.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "schemas.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "schemas.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "schemas.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "schemas.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "schemas.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "schemas.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "schemas.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "schemas.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "schemas.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "schemas.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "schemas.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "schemas.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "schemas.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "schemas.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sdb": {
+ "Value": "sdb",
+ "longName": {
+ "Value": "Amazon SimpleDB"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sdb.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sdb.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sdb.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sdb.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sdb.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sdb.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sdb.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sdb.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "secretsmanager": {
+ "Value": "secretsmanager",
+ "longName": {
+ "Value": "AWS Secrets Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/secrets-manager/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "secretsmanager.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "secretsmanager.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "secretsmanager.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "secretsmanager.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "secretsmanager.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "secretsmanager.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "secretsmanager.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "secretsmanager.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "secretsmanager.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "secretsmanager.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "secretsmanager.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "secretsmanager.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "secretsmanager.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "secretsmanager.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "secretsmanager.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "secretsmanager.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "secretsmanager.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "secretsmanager.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "secretsmanager.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "secretsmanager.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "secretsmanager.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "securityhub": {
+ "Value": "securityhub",
+ "longName": {
+ "Value": "AWS Security Hub"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/security-hub/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "securityhub.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "securityhub.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "securityhub.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "securityhub.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "securityhub.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "securityhub.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "securityhub.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "securityhub.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "securityhub.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "securityhub.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "securityhub.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "securityhub.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "securityhub.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "securityhub.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "securityhub.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "securityhub.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "securityhub.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "securityhub.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "securityhub.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "securityhub.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "securityhub.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "securityhub.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "securityhub.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "serverlessrepo": {
+ "Value": "serverlessrepo",
+ "longName": {
+ "Value": "AWS Serverless Application Repository"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/serverless/serverlessrepo/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "serverlessrepo.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "serverlessrepo.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "serverlessrepo.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "serverlessrepo.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "serverlessrepo.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "serverlessrepo.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "serverlessrepo.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "serverlessrepo.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "serverlessrepo.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "serverlessrepo.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "serverlessrepo.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "serverlessrepo.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "serverlessrepo.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "service-quotas": {
+ "Value": "service-quotas",
+ "longName": {
+ "Value": "Service Quotas"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "servicequotas.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "servicequotas.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "servicequotas.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "servicequotas.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "servicequotas.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "servicequotas.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "servicequotas.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "servicequotas.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "servicequotas.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "servicequotas.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "servicequotas.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "servicequotas.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "servicequotas.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "servicequotas.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "servicequotas.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "servicequotas.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "servicequotas.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "servicequotas.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "servicequotas.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "servicecatalog": {
+ "Value": "servicecatalog",
+ "longName": {
+ "Value": "AWS Service Catalog"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/servicecatalog/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "servicecatalog.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "servicecatalog.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "servicecatalog.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "servicecatalog.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "servicecatalog.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "servicecatalog.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "servicecatalog.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "servicecatalog.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "servicecatalog.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "servicecatalog.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "servicecatalog.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "servicecatalog.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "servicecatalog.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "servicecatalog.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "servicecatalog.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "servicecatalog.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "servicecatalog.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "servicecatalog.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "servicecatalog.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "servicecatalog.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "servicecatalog.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "servicecatalog-appregistry": {
+ "Value": "servicecatalog-appregistry",
+ "longName": {
+ "Value": "AWS Service Catalog App Registry"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "servicecatalog-appregistry.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "servicediscovery": {
+ "Value": "servicediscovery",
+ "longName": {
+ "Value": "AWS Cloud Map"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/cloud-map/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "servicediscovery.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "servicediscovery.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "servicediscovery.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "servicediscovery.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "servicediscovery.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "servicediscovery.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "servicediscovery.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "servicediscovery.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "servicediscovery.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "servicediscovery.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "servicediscovery.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "servicediscovery.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "servicediscovery.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "servicediscovery.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "servicediscovery.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "servicediscovery.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "servicediscovery.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "servicediscovery.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "servicediscovery.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "servicediscovery.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "servicediscovery.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "servicediscovery.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ses": {
+ "Value": "ses",
+ "longName": {
+ "Value": "Amazon Simple Email Service (SES)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/ses/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "email.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "email.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "email.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "email.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "email.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "email.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "email.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "email.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "email.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "email.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "email.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "email.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "email.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "email.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "email.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "email.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "email.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "email.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "email.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "email.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "email.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "shield": {
+ "Value": "shield",
+ "longName": {
+ "Value": "AWS Shield"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/shield/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "shield.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "signer": {
+ "Value": "signer",
+ "longName": {
+ "Value": "AWS Signer"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "signer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "signer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "signer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "signer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "signer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "signer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "signer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "signer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "signer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "signer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "signer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "signer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "signer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "signer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "signer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "signer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "signer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "signer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "signer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "signer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "signer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "signer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "signer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "signer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sms": {
+ "Value": "sms",
+ "longName": {
+ "Value": "AWS Server Migration Service (SMS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/server-migration-service/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "sms.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "sms.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sms.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sms.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sms.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sms.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sms.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sms.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "sms.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "sms.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sms.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sms.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "sms.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sms.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sms.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sms.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "sms.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sms.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sms.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sms.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "sms.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "sms.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sms.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sms.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sms-voice": {
+ "Value": "sms-voice",
+ "longName": {
+ "Value": "Amazon Pinpoint SMS and Voice Service"
+ },
+ "regions": {
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sms-voice.pinpoint.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "snow-device-management": {
+ "Value": "snow-device-management",
+ "longName": {
+ "Value": "SnowDeviceManagement"
+ },
+ "regions": {
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "snow-device-management.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "snow-device-management.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "snow-device-management.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "snow-device-management.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "snowball": {
+ "Value": "snowball",
+ "longName": {
+ "Value": "AWS Snowball"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/snowball/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "snowball.af-south-1.amazonaws.com"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "snowball.ap-east-1.amazonaws.com"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-1.amazonaws.com"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-2.amazonaws.com"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "snowball.ap-northeast-3.amazonaws.com"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "snowball.ap-south-1.amazonaws.com"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "snowball.ap-southeast-1.amazonaws.com"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "snowball.ap-southeast-2.amazonaws.com"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "snowball.ca-central-1.amazonaws.com"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "snowball.cn-north-1.amazonaws.com.cn"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "snowball.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "snowball.eu-central-1.amazonaws.com"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "snowball.eu-north-1.amazonaws.com"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "snowball.eu-south-1.amazonaws.com"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "snowball.eu-west-1.amazonaws.com"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "snowball.eu-west-2.amazonaws.com"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "snowball.eu-west-3.amazonaws.com"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "snowball.sa-east-1.amazonaws.com"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "snowball.us-east-1.amazonaws.com"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "snowball.us-east-2.amazonaws.com"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "snowball.us-gov-east-1.amazonaws.com"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "snowball.us-gov-west-1.amazonaws.com"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "snowball.us-west-1.amazonaws.com"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "snowball.us-west-2.amazonaws.com"
+ }
+ }
+ }
+ },
+ "snowcone": {
+ "Value": "snowcone",
+ "longName": {
+ "Value": "AWS Snowcone"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/snowcone/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "snowmobile": {
+ "Value": "snowmobile",
+ "longName": {
+ "Value": "AWS Snowmobile"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/snowmobile/"
+ },
+ "regions": {
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "sns": {
+ "Value": "sns",
+ "longName": {
+ "Value": "Amazon Simple Notification Service (SNS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/sns/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "sns.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "sns.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sns.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sns.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "sns.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sns.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sns.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sns.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "sns.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sns.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "sns.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "sns.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sns.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sns.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "sns.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sns.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sns.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sns.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "sns.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sns.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sns.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sns.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "sns.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "sns.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sns.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sns.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "sqs": {
+ "Value": "sqs",
+ "longName": {
+ "Value": "Amazon Simple Queue Service (SQS)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/sqs/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "sqs.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "sqs.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "sqs.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sqs.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "sqs.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sqs.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "sqs.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "sqs.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sqs.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sqs.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "sqs.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sqs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sqs.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sqs.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "sqs.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sqs.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sqs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sqs.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "sqs.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "sqs.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sqs.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sqs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS, HTTP"
+ }
+ }
+ }
+ },
+ "ssm": {
+ "Value": "ssm",
+ "longName": {
+ "Value": "AWS Systems Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/systems-manager/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ssm.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ssm.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ssm.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ssm.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ssm.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ssm.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ssm.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ssm.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ssm.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ssm.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ssm.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ssm.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ssm.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ssm.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ssm.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ssm.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ssm.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ssm.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ssm.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ssm.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ssm.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ssm.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ssm-contacts": {
+ "Value": "ssm-contacts",
+ "longName": {
+ "Value": "AWS Systems Manager Incident Manager Contacts"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ssm-contacts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ssm-contacts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ssm-contacts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ssm-contacts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ssm-contacts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ssm-contacts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ssm-contacts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ssm-contacts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "ssm-incidents": {
+ "Value": "ssm-incidents",
+ "longName": {
+ "Value": "SSM Incidents"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ssm-incidents.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ssm-incidents.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ssm-incidents.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ssm-incidents.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ssm-incidents.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ssm-incidents.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ssm-incidents.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ssm-incidents.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sso": {
+ "Value": "sso",
+ "longName": {
+ "Value": "AWS Single Sign-On"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/single-sign-on/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sso.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sso.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sso.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sso.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sso.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sso.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sso.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sso.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sso.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sso.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sso.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sso.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sso.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sso.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "sso.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "sso.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sso.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sso-oidc": {
+ "Value": "sso-oidc",
+ "longName": {
+ "Value": "AWS Single Sign-On (SSO) OpenID Connect Service"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "oidc.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "oidc.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "oidc.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "oidc.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "oidc.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "oidc.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "oidc.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "oidc.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "oidc.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "oidc.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "oidc.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "oidc.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "oidc.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "oidc.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "oidc.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "oidc.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "stepfunctions": {
+ "Value": "stepfunctions",
+ "longName": {
+ "Value": "AWS Step Functions"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/step-functions/details/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "states.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "states.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "states.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "states.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "states.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "states.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "states.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "states.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "states.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "states.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "states.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "states.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "states.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "states.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "states.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "states.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "states.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "states.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "states.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "states.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "states.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "states.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "states.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "states.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "states.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "states.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "storagegateway": {
+ "Value": "storagegateway",
+ "longName": {
+ "Value": "AWS Storage Gateway"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/storagegateway/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "storagegateway.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "storagegateway.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "storagegateway.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "storagegateway.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "storagegateway.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "storagegateway.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "storagegateway.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "storagegateway.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "storagegateway.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "storagegateway.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "storagegateway.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "storagegateway.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "storagegateway.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "storagegateway.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "storagegateway.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "storagegateway.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "storagegateway.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "storagegateway.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "storagegateway.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "storagegateway.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "storagegateway.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sts": {
+ "Value": "sts",
+ "longName": {
+ "Value": "AWS Security Token Service"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "sts.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "sts.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sts.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sts.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "sts.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sts.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sts.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sts.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "sts.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sts.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "sts.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "sts.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sts.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sts.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "sts.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sts.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sts.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sts.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "sts.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sts.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sts.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sts.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "sts.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "sts.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sts.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sts.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "sumerian": {
+ "Value": "sumerian",
+ "longName": {
+ "Value": "Amazon Sumerian"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/sumerian/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "sumerian.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "sumerian.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "sumerian.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "sumerian.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "sumerian.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "sumerian.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "sumerian.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "sumerian.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "sumerian.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "sumerian.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "sumerian.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "sumerian.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "sumerian.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "sumerian.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "sumerian.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "sumerian.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "support": {
+ "Value": "support",
+ "longName": {
+ "Value": "AWS Support"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/premiumsupport/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "support.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "support.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "support.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "support.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "support.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "swf": {
+ "Value": "swf",
+ "longName": {
+ "Value": "Amazon Simple Workflow Service (SWF)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/swf/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "swf.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "swf.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "swf.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "swf.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "swf.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "swf.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "swf.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "swf.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "swf.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "swf.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "swf.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "swf.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "swf.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "swf.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "swf.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "swf.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "swf.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "swf.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "swf.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "swf.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "swf.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "swf.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "swf.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "swf.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "swf.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "swf.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "synthetics": {
+ "Value": "synthetics",
+ "longName": {
+ "Value": "Amazon CloudWatch Synthetics"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "synthetics.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "synthetics.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "synthetics.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "synthetics.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "synthetics.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "synthetics.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "synthetics.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "synthetics.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "synthetics.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "synthetics.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "synthetics.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "synthetics.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "synthetics.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "synthetics.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "synthetics.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "synthetics.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "synthetics.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "synthetics.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "synthetics.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "synthetics.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "synthetics.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "synthetics.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "synthetics.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "textract": {
+ "Value": "textract",
+ "longName": {
+ "Value": "Amazon Textract"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/textract"
+ },
+ "regions": {
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "textract.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "textract.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "textract.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "textract.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "textract.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "textract.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "textract.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "textract.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "textract.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "textract.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "textract.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "textract.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "textract.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "textract.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "textract.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "timestream": {
+ "Value": "timestream",
+ "longName": {
+ "Value": "Amazon Timestream"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/timestream"
+ },
+ "regions": {
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "transcribe": {
+ "Value": "transcribe",
+ "longName": {
+ "Value": "Amazon Transcribe"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/transcribe/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "transcribe.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "transcribe.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "transcribe.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "transcribe.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "transcribe.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "transcribe.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "transcribe.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "transcribe.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "cn.transcribe.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "cn.transcribe.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "transcribe.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "transcribe.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "transcribe.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "transcribe.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "transcribe.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "transcribe.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "transcribe.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "transcribe.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "transcribe.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "transcribe.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "transcribe.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "transcribe.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "transcribe.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "transcribemedical": {
+ "Value": "transcribemedical",
+ "longName": {
+ "Value": "Amazon Transcribe Medical"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/transcribe/medical/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "transfer": {
+ "Value": "transfer",
+ "longName": {
+ "Value": "AWS Transfer Family"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/aws-transfer-family/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "transfer.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "transfer.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "transfer.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "transfer.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "transfer.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "transfer.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "transfer.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "transfer.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "transfer.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "transfer.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "transfer.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "transfer.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "transfer.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "transfer.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "transfer.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "transfer.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "transfer.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "transfer.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "transfer.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "transfer.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "transfer.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "transfer.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "transfer.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "transitgateway": {
+ "Value": "transitgateway",
+ "longName": {
+ "Value": "AWS Transit Gateway"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/transit-gateway/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "ec2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "ec2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "translate": {
+ "Value": "translate",
+ "longName": {
+ "Value": "Amazon Translate"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/translate/"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "translate.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "translate.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "translate.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "translate.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "translate.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "translate.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "translate.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "translate.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "translate.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "translate.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "translate.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "translate.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "translate.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "translate.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "translate.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "translate.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "translate.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "trustedadvisor": {
+ "Value": "trustedadvisor",
+ "longName": {
+ "Value": "AWS Trusted Advisor"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/premiumsupport/trustedadvisor/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "vmwarecloudonaws": {
+ "Value": "vmwarecloudonaws",
+ "longName": {
+ "Value": "VMware Cloud on AWS"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/vmware/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "voice-id": {
+ "Value": "voice-id",
+ "longName": {
+ "Value": "Amazon Voice ID"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "voiceid.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "voiceid.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "voiceid.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "voiceid.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "voiceid.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "voiceid.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "voiceid.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "vpc": {
+ "Value": "vpc",
+ "longName": {
+ "Value": "Amazon Virtual Private Cloud (VPC)"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/vpc/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1"
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1"
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1"
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2"
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3"
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1"
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3"
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1"
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1"
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1"
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1"
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1"
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2"
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3"
+ },
+ "me-south-1": {
+ "Value": "me-south-1"
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-east-2": {
+ "Value": "us-east-2"
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1"
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1"
+ },
+ "us-west-1": {
+ "Value": "us-west-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "vpn": {
+ "Value": "vpn",
+ "longName": {
+ "Value": "AWS VPN"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/vpn/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "ec2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "ec2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "ec2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-3": {
+ "Value": "ap-southeast-3",
+ "endpoint": {
+ "Value": "ec2.ap-southeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "ec2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "ec2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "ec2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "ec2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "ec2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "ec2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "ec2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "ec2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "ec2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "ec2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "ec2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "ec2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "ec2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "ec2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "waf": {
+ "Value": "waf",
+ "longName": {
+ "Value": "AWS WAF"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/waf/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "wafv2.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "wafv2.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "wafv2.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "wafv2.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "wafv2.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "wafv2.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "wafv2.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "wafv2.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "wafv2.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "wafv2.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "wafv2.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "wafv2.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "wafv2.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "wafv2.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "wafv2.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "wafv2.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "wafv2.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "wafv2.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "wafv2.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "wafv2.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "wafv2.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "wafv2.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "wafv2.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "waf-regional": {
+ "Value": "waf-regional",
+ "longName": {
+ "Value": "AWS WAF Regional"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "waf-regional.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "waf-regional.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "waf-regional.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "waf-regional.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "waf-regional.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "waf-regional.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "waf-regional.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "waf-regional.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "waf-regional.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "waf-regional.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "waf-regional.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "waf-regional.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "waf-regional.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "waf-regional.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "waf-regional.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "waf-regional.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "waf-regional.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "waf-regional.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "waf-regional.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "waf-regional.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "waf-regional.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "wam": {
+ "Value": "wam",
+ "longName": {
+ "Value": "Amazon WorkSpaces Application Manager"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/workspaces/applicationmanager/"
+ },
+ "regions": {
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1"
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2"
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1"
+ },
+ "us-east-1": {
+ "Value": "us-east-1"
+ },
+ "us-west-2": {
+ "Value": "us-west-2"
+ }
+ }
+ },
+ "wellarchitectedtool": {
+ "Value": "wellarchitectedtool",
+ "longName": {
+ "Value": "AWS Well-Architected Tool"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/well-architected-tool"
+ },
+ "regions": {
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "wellarchitected.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "wellarchitected.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "wellarchitected.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "wellarchitected.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "wellarchitected.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "wellarchitected.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "wellarchitected.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "wellarchitected.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "wellarchitected.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "wellarchitected.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "wellarchitected.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "wellarchitected.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "wellarchitected.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "wellarchitected.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "wellarchitected.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "wellarchitected.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "wisdom": {
+ "Value": "wisdom",
+ "longName": {
+ "Value": "Amazon Connect Wisdom Service"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "wisdom.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "wisdom.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "wisdom.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "wisdom.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "wisdom.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "wisdom.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "workdocs": {
+ "Value": "workdocs",
+ "longName": {
+ "Value": "Amazon WorkDocs"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/workdocs/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "workdocs.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "workdocs.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "workdocs.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "workdocs.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "workdocs.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "workdocs.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "worklink": {
+ "Value": "worklink",
+ "longName": {
+ "Value": "Amazon WorkLink"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/worklink/"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "worklink.eu-west-1.amazonaws.com"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "worklink.us-east-1.amazonaws.com"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "worklink.us-east-2.amazonaws.com"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "worklink.us-west-2.amazonaws.com"
+ }
+ }
+ }
+ },
+ "workmail": {
+ "Value": "workmail",
+ "longName": {
+ "Value": "Amazon WorkMail"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/workmail/"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "workmail.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "workmail.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "workmail.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "workmailmessageflow": {
+ "Value": "workmailmessageflow",
+ "longName": {
+ "Value": "Amazon WorkMail Message Flow"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "workmailmessageflow.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "workmailmessageflow.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "workmailmessageflow.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "workspaces": {
+ "Value": "workspaces",
+ "longName": {
+ "Value": "Amazon WorkSpaces"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/workspaces/"
+ },
+ "regions": {
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "workspaces.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "workspaces.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "workspaces.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "workspaces.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "workspaces.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "workspaces.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "workspaces.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "workspaces.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "workspaces.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "workspaces.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "workspaces.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "workspaces.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "workspaces.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "workspaces.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "workspaces-web": {
+ "Value": "workspaces-web",
+ "longName": {
+ "Value": "Amazon WorkSpaces Web"
+ },
+ "regions": {
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "workspaces-web.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "workspaces-web.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "workspaces-web.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ },
+ "xray": {
+ "Value": "xray",
+ "longName": {
+ "Value": "AWS X-Ray"
+ },
+ "marketingHomeURL": {
+ "Value": "https://aws.amazon.com/xray/"
+ },
+ "regions": {
+ "af-south-1": {
+ "Value": "af-south-1",
+ "endpoint": {
+ "Value": "xray.af-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-east-1": {
+ "Value": "ap-east-1",
+ "endpoint": {
+ "Value": "xray.ap-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-1": {
+ "Value": "ap-northeast-1",
+ "endpoint": {
+ "Value": "xray.ap-northeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-2": {
+ "Value": "ap-northeast-2",
+ "endpoint": {
+ "Value": "xray.ap-northeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-northeast-3": {
+ "Value": "ap-northeast-3",
+ "endpoint": {
+ "Value": "xray.ap-northeast-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-south-1": {
+ "Value": "ap-south-1",
+ "endpoint": {
+ "Value": "xray.ap-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-1": {
+ "Value": "ap-southeast-1",
+ "endpoint": {
+ "Value": "xray.ap-southeast-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ap-southeast-2": {
+ "Value": "ap-southeast-2",
+ "endpoint": {
+ "Value": "xray.ap-southeast-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "ca-central-1": {
+ "Value": "ca-central-1",
+ "endpoint": {
+ "Value": "xray.ca-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-north-1": {
+ "Value": "cn-north-1",
+ "endpoint": {
+ "Value": "xray.cn-north-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "cn-northwest-1": {
+ "Value": "cn-northwest-1",
+ "endpoint": {
+ "Value": "xray.cn-northwest-1.amazonaws.com.cn"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-central-1": {
+ "Value": "eu-central-1",
+ "endpoint": {
+ "Value": "xray.eu-central-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-north-1": {
+ "Value": "eu-north-1",
+ "endpoint": {
+ "Value": "xray.eu-north-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-south-1": {
+ "Value": "eu-south-1",
+ "endpoint": {
+ "Value": "xray.eu-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-1": {
+ "Value": "eu-west-1",
+ "endpoint": {
+ "Value": "xray.eu-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-2": {
+ "Value": "eu-west-2",
+ "endpoint": {
+ "Value": "xray.eu-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "eu-west-3": {
+ "Value": "eu-west-3",
+ "endpoint": {
+ "Value": "xray.eu-west-3.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "me-south-1": {
+ "Value": "me-south-1",
+ "endpoint": {
+ "Value": "xray.me-south-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "sa-east-1": {
+ "Value": "sa-east-1",
+ "endpoint": {
+ "Value": "xray.sa-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-1": {
+ "Value": "us-east-1",
+ "endpoint": {
+ "Value": "xray.us-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-east-2": {
+ "Value": "us-east-2",
+ "endpoint": {
+ "Value": "xray.us-east-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-east-1": {
+ "Value": "us-gov-east-1",
+ "endpoint": {
+ "Value": "xray.us-gov-east-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-gov-west-1": {
+ "Value": "us-gov-west-1",
+ "endpoint": {
+ "Value": "xray.us-gov-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-1": {
+ "Value": "us-west-1",
+ "endpoint": {
+ "Value": "xray.us-west-1.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ },
+ "us-west-2": {
+ "Value": "us-west-2",
+ "endpoint": {
+ "Value": "xray.us-west-2.amazonaws.com"
+ },
+ "protocols": {
+ "Value": "HTTPS"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/contrib/python/moto/py3/moto/ssm/responses.py b/contrib/python/moto/py3/moto/ssm/responses.py
new file mode 100644
index 0000000000..6b7cf70257
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/responses.py
@@ -0,0 +1,424 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .exceptions import ValidationException
+from .models import ssm_backends
+
+
+class SimpleSystemManagerResponse(BaseResponse):
+ @property
+ def ssm_backend(self):
+ return ssm_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def create_document(self):
+ content = self._get_param("Content")
+ requires = self._get_param("Requires")
+ attachments = self._get_param("Attachments")
+ name = self._get_param("Name")
+ version_name = self._get_param("VersionName")
+ document_type = self._get_param("DocumentType")
+ document_format = self._get_param("DocumentFormat", "JSON")
+ target_type = self._get_param("TargetType")
+ tags = self._get_param("Tags")
+
+ result = self.ssm_backend.create_document(
+ content=content,
+ requires=requires,
+ attachments=attachments,
+ name=name,
+ version_name=version_name,
+ document_type=document_type,
+ document_format=document_format,
+ target_type=target_type,
+ tags=tags,
+ )
+
+ return json.dumps({"DocumentDescription": result})
+
+ def delete_document(self):
+ name = self._get_param("Name")
+ document_version = self._get_param("DocumentVersion")
+ version_name = self._get_param("VersionName")
+ force = self._get_param("Force", False)
+ self.ssm_backend.delete_document(
+ name=name,
+ document_version=document_version,
+ version_name=version_name,
+ force=force,
+ )
+
+ return json.dumps({})
+
+ def get_document(self):
+ name = self._get_param("Name")
+ version_name = self._get_param("VersionName")
+ document_version = self._get_param("DocumentVersion")
+ document_format = self._get_param("DocumentFormat", "JSON")
+
+ document = self.ssm_backend.get_document(
+ name=name,
+ document_version=document_version,
+ document_format=document_format,
+ version_name=version_name,
+ )
+
+ return json.dumps(document)
+
+ def describe_document(self):
+ name = self._get_param("Name")
+ document_version = self._get_param("DocumentVersion")
+ version_name = self._get_param("VersionName")
+
+ result = self.ssm_backend.describe_document(
+ name=name, document_version=document_version, version_name=version_name
+ )
+
+ return json.dumps({"Document": result})
+
+ def update_document(self):
+ content = self._get_param("Content")
+ attachments = self._get_param("Attachments")
+ name = self._get_param("Name")
+ version_name = self._get_param("VersionName")
+ document_version = self._get_param("DocumentVersion")
+ document_format = self._get_param("DocumentFormat", "JSON")
+ target_type = self._get_param("TargetType")
+
+ result = self.ssm_backend.update_document(
+ content=content,
+ attachments=attachments,
+ name=name,
+ version_name=version_name,
+ document_version=document_version,
+ document_format=document_format,
+ target_type=target_type,
+ )
+
+ return json.dumps({"DocumentDescription": result})
+
+ def update_document_default_version(self):
+ name = self._get_param("Name")
+ document_version = self._get_param("DocumentVersion")
+
+ result = self.ssm_backend.update_document_default_version(
+ name=name, document_version=document_version
+ )
+ return json.dumps({"Description": result})
+
+ def list_documents(self):
+ document_filter_list = self._get_param("DocumentFilterList")
+ filters = self._get_param("Filters")
+ max_results = self._get_param("MaxResults", 10)
+ next_token = self._get_param("NextToken", "0")
+
+ documents, token = self.ssm_backend.list_documents(
+ document_filter_list=document_filter_list,
+ filters=filters,
+ max_results=max_results,
+ next_token=next_token,
+ )
+
+ return json.dumps({"DocumentIdentifiers": documents, "NextToken": token})
+
+ def describe_document_permission(self):
+ name = self._get_param("Name")
+
+ result = self.ssm_backend.describe_document_permission(name=name)
+ return json.dumps(result)
+
+ def modify_document_permission(self):
+ account_ids_to_add = self._get_param("AccountIdsToAdd")
+ account_ids_to_remove = self._get_param("AccountIdsToRemove")
+ name = self._get_param("Name")
+ permission_type = self._get_param("PermissionType")
+ shared_document_version = self._get_param("SharedDocumentVersion")
+
+ self.ssm_backend.modify_document_permission(
+ name=name,
+ account_ids_to_add=account_ids_to_add,
+ account_ids_to_remove=account_ids_to_remove,
+ shared_document_version=shared_document_version,
+ permission_type=permission_type,
+ )
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def delete_parameter(self):
+ name = self._get_param("Name")
+ result = self.ssm_backend.delete_parameter(name)
+ if result is None:
+ error = {
+ "__type": "ParameterNotFound",
+ "message": "Parameter {0} not found.".format(name),
+ }
+ return json.dumps(error), dict(status=400)
+ return json.dumps({})
+
+ def delete_parameters(self):
+ names = self._get_param("Names")
+ result = self.ssm_backend.delete_parameters(names)
+
+ response = {"DeletedParameters": [], "InvalidParameters": []}
+
+ for name in names:
+ if name in result:
+ response["DeletedParameters"].append(name)
+ else:
+ response["InvalidParameters"].append(name)
+ return json.dumps(response)
+
+ def get_parameter(self):
+ name = self._get_param("Name")
+ with_decryption = self._get_param("WithDecryption")
+
+ if (
+ name.startswith("/aws/reference/secretsmanager/")
+ and with_decryption is not True
+ ):
+ raise ValidationException(
+ "WithDecryption flag must be True for retrieving a Secret Manager secret."
+ )
+
+ result = self.ssm_backend.get_parameter(name)
+
+ if result is None:
+ error = {
+ "__type": "ParameterNotFound",
+ "message": "Parameter {0} not found.".format(name),
+ }
+ return json.dumps(error), dict(status=400)
+
+ response = {"Parameter": result.response_object(with_decryption, self.region)}
+ return json.dumps(response)
+
+ def get_parameters(self):
+ names = self._get_param("Names")
+ with_decryption = self._get_param("WithDecryption")
+
+ result = self.ssm_backend.get_parameters(names)
+
+ response = {"Parameters": [], "InvalidParameters": []}
+
+ for name, parameter in result.items():
+ param_data = parameter.response_object(with_decryption, self.region)
+ response["Parameters"].append(param_data)
+
+ valid_param_names = [name for name, parameter in result.items()]
+ for name in names:
+ if name not in valid_param_names:
+ response["InvalidParameters"].append(name)
+ return json.dumps(response)
+
+ def get_parameters_by_path(self):
+ path = self._get_param("Path")
+ with_decryption = self._get_param("WithDecryption")
+ recursive = self._get_param("Recursive", False)
+ filters = self._get_param("ParameterFilters")
+ token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 10)
+
+ result, next_token = self.ssm_backend.get_parameters_by_path(
+ path,
+ recursive,
+ filters,
+ next_token=token,
+ max_results=max_results,
+ )
+
+ response = {"Parameters": [], "NextToken": next_token}
+
+ for parameter in result:
+ param_data = parameter.response_object(with_decryption, self.region)
+ response["Parameters"].append(param_data)
+
+ return json.dumps(response)
+
+ def describe_parameters(self):
+ page_size = 10
+ filters = self._get_param("Filters")
+ parameter_filters = self._get_param("ParameterFilters")
+ token = self._get_param("NextToken")
+ if hasattr(token, "strip"):
+ token = token.strip()
+ if not token:
+ token = "0"
+ token = int(token)
+
+ result = self.ssm_backend.describe_parameters(filters, parameter_filters)
+
+ response = {"Parameters": []}
+
+ end = token + page_size
+ for parameter in result[token:]:
+ response["Parameters"].append(parameter.describe_response_object(False))
+
+ token += 1
+ if len(response["Parameters"]) == page_size:
+ response["NextToken"] = str(end)
+ break
+
+ return json.dumps(response)
+
+ def put_parameter(self):
+ name = self._get_param("Name")
+ description = self._get_param("Description")
+ value = self._get_param("Value")
+ type_ = self._get_param("Type")
+ allowed_pattern = self._get_param("AllowedPattern")
+ keyid = self._get_param("KeyId")
+ overwrite = self._get_param("Overwrite", False)
+ tags = self._get_param("Tags", [])
+ data_type = self._get_param("DataType", "text")
+
+ result = self.ssm_backend.put_parameter(
+ name,
+ description,
+ value,
+ type_,
+ allowed_pattern,
+ keyid,
+ overwrite,
+ tags,
+ data_type,
+ )
+
+ if result is None:
+ error = {
+ "__type": "ParameterAlreadyExists",
+ "message": "Parameter {0} already exists.".format(name),
+ }
+ return json.dumps(error), dict(status=400)
+
+ response = {"Version": result}
+ return json.dumps(response)
+
+ def get_parameter_history(self):
+ name = self._get_param("Name")
+ with_decryption = self._get_param("WithDecryption")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults", 50)
+
+ result, new_next_token = self.ssm_backend.get_parameter_history(
+ name, next_token, max_results
+ )
+
+ if result is None:
+ error = {
+ "__type": "ParameterNotFound",
+ "message": "Parameter {0} not found.".format(name),
+ }
+ return json.dumps(error), dict(status=400)
+
+ response = {"Parameters": []}
+ for parameter_version in result:
+ param_data = parameter_version.describe_response_object(
+ decrypt=with_decryption, include_labels=True
+ )
+ response["Parameters"].append(param_data)
+
+ if new_next_token is not None:
+ response["NextToken"] = new_next_token
+
+ return json.dumps(response)
+
+ def label_parameter_version(self):
+ name = self._get_param("Name")
+ version = self._get_param("ParameterVersion")
+ labels = self._get_param("Labels")
+
+ invalid_labels, version = self.ssm_backend.label_parameter_version(
+ name, version, labels
+ )
+
+ response = {"InvalidLabels": invalid_labels, "ParameterVersion": version}
+ return json.dumps(response)
+
+ def add_tags_to_resource(self):
+ resource_id = self._get_param("ResourceId")
+ resource_type = self._get_param("ResourceType")
+ tags = {t["Key"]: t["Value"] for t in self._get_param("Tags")}
+ self.ssm_backend.add_tags_to_resource(
+ resource_type=resource_type, resource_id=resource_id, tags=tags
+ )
+ return json.dumps({})
+
+ def remove_tags_from_resource(self):
+ resource_id = self._get_param("ResourceId")
+ resource_type = self._get_param("ResourceType")
+ keys = self._get_param("TagKeys")
+ self.ssm_backend.remove_tags_from_resource(
+ resource_type=resource_type, resource_id=resource_id, keys=keys
+ )
+ return json.dumps({})
+
+ def list_tags_for_resource(self):
+ resource_id = self._get_param("ResourceId")
+ resource_type = self._get_param("ResourceType")
+ tags = self.ssm_backend.list_tags_for_resource(
+ resource_type=resource_type, resource_id=resource_id
+ )
+ tag_list = [{"Key": k, "Value": v} for (k, v) in tags.items()]
+ response = {"TagList": tag_list}
+ return json.dumps(response)
+
+ def send_command(self):
+ return json.dumps(self.ssm_backend.send_command(**self.request_params))
+
+ def list_commands(self):
+ return json.dumps(self.ssm_backend.list_commands(**self.request_params))
+
+ def get_command_invocation(self):
+ return json.dumps(
+ self.ssm_backend.get_command_invocation(**self.request_params)
+ )
+
+ def create_maintenance_window(self):
+ name = self._get_param("Name")
+ desc = self._get_param("Description", None)
+ enabled = self._get_bool_param("Enabled", True)
+ duration = self._get_int_param("Duration")
+ cutoff = self._get_int_param("Cutoff")
+ schedule = self._get_param("Schedule")
+ schedule_timezone = self._get_param("ScheduleTimezone")
+ schedule_offset = self._get_int_param("ScheduleOffset")
+ start_date = self._get_param("StartDate")
+ end_date = self._get_param("EndDate")
+ window_id = self.ssm_backend.create_maintenance_window(
+ name=name,
+ description=desc,
+ enabled=enabled,
+ duration=duration,
+ cutoff=cutoff,
+ schedule=schedule,
+ schedule_timezone=schedule_timezone,
+ schedule_offset=schedule_offset,
+ start_date=start_date,
+ end_date=end_date,
+ )
+ return json.dumps({"WindowId": window_id})
+
+ def get_maintenance_window(self):
+ window_id = self._get_param("WindowId")
+ window = self.ssm_backend.get_maintenance_window(window_id)
+ return json.dumps(window.to_json())
+
+ def describe_maintenance_windows(self):
+ filters = self._get_param("Filters", None)
+ windows = [
+ window.to_json()
+ for window in self.ssm_backend.describe_maintenance_windows(filters)
+ ]
+ return json.dumps({"WindowIdentities": windows})
+
+ def delete_maintenance_window(self):
+ window_id = self._get_param("WindowId")
+ self.ssm_backend.delete_maintenance_window(window_id)
+ return "{}"
diff --git a/contrib/python/moto/py3/moto/ssm/urls.py b/contrib/python/moto/py3/moto/ssm/urls.py
new file mode 100644
index 0000000000..58065ae7ae
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/urls.py
@@ -0,0 +1,8 @@
+from .responses import SimpleSystemManagerResponse
+
+url_bases = [
+ r"https?://ssm\.(.+)\.amazonaws\.com",
+ r"https?://ssm\.(.+)\.amazonaws\.com\.cn",
+]
+
+url_paths = {"{0}/$": SimpleSystemManagerResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/ssm/utils.py b/contrib/python/moto/py3/moto/ssm/utils.py
new file mode 100644
index 0000000000..6641fef8d8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssm/utils.py
@@ -0,0 +1,45 @@
+from moto.core import get_account_id
+
+
+def parameter_arn(region, parameter_name):
+ if parameter_name[0] == "/":
+ parameter_name = parameter_name[1:]
+ return "arn:aws:ssm:{0}:{1}:parameter/{2}".format(
+ region, get_account_id(), parameter_name
+ )
+
+
+def convert_to_tree(parameters):
+ """
+ Convert input into a smaller, less redundant data set in tree form
+ Input: [{"Name": "/a/b/c", "Value": "af-south-1", ...}, ..]
+ Output: {"a": {"b": {"c": {"Value": af-south-1}, ..}, ..}, ..}
+ """
+ tree_dict = {}
+ for p in parameters:
+ current_level = tree_dict
+ for path in p["Name"].split("/"):
+ if path == "":
+ continue
+ if path not in current_level:
+ current_level[path] = {}
+ current_level = current_level[path]
+ current_level["Value"] = p["Value"]
+ return tree_dict
+
+
+def convert_to_params(tree):
+ """
+ Inverse of 'convert_to_tree'
+ """
+
+ def m(tree, params, current_path=""):
+ for key, value in tree.items():
+ if key == "Value":
+ params.append({"Name": current_path, "Value": value})
+ else:
+ m(value, params, current_path + "/" + key)
+
+ params = []
+ m(tree, params)
+ return params
diff --git a/contrib/python/moto/py3/moto/ssoadmin/__init__.py b/contrib/python/moto/py3/moto/ssoadmin/__init__.py
new file mode 100644
index 0000000000..a6c0023915
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssoadmin/__init__.py
@@ -0,0 +1,5 @@
+"""ssoadmin module initialization; sets value for base decorator."""
+from .models import ssoadmin_backends
+from ..core.models import base_decorator
+
+mock_ssoadmin = base_decorator(ssoadmin_backends)
diff --git a/contrib/python/moto/py3/moto/ssoadmin/exceptions.py b/contrib/python/moto/py3/moto/ssoadmin/exceptions.py
new file mode 100644
index 0000000000..a133e1d5e4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssoadmin/exceptions.py
@@ -0,0 +1,7 @@
+"""Exceptions raised by the ssoadmin service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFound(JsonRESTError):
+ def __init__(self):
+ super().__init__("ResourceNotFound", "Account not found")
diff --git a/contrib/python/moto/py3/moto/ssoadmin/models.py b/contrib/python/moto/py3/moto/ssoadmin/models.py
new file mode 100644
index 0000000000..68b4854f06
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssoadmin/models.py
@@ -0,0 +1,136 @@
+from .exceptions import ResourceNotFound
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict, unix_time
+from uuid import uuid4
+
+
+class AccountAssignment(BaseModel):
+ def __init__(
+ self,
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ ):
+ self.request_id = str(uuid4())
+ self.instance_arn = instance_arn
+ self.target_id = target_id
+ self.target_type = target_type
+ self.permission_set_arn = permission_set_arn
+ self.principal_type = principal_type
+ self.principal_id = principal_id
+ self.created_date = unix_time()
+
+ def to_json(self, include_creation_date=False):
+ summary = {
+ "TargetId": self.target_id,
+ "TargetType": self.target_type,
+ "PermissionSetArn": self.permission_set_arn,
+ "PrincipalType": self.principal_type,
+ "PrincipalId": self.principal_id,
+ }
+ if include_creation_date:
+ summary["CreatedDate"] = self.created_date
+ return summary
+
+
+class SSOAdminBackend(BaseBackend):
+ """Implementation of SSOAdmin APIs."""
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.account_assignments = list()
+
+ def create_account_assignment(
+ self,
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ ):
+ assignment = AccountAssignment(
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ )
+ self.account_assignments.append(assignment)
+ return assignment.to_json()
+
+ def delete_account_assignment(
+ self,
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ ):
+ account = self._find_account(
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ )
+ self.account_assignments.remove(account)
+ return account.to_json(include_creation_date=True)
+
+ def _find_account(
+ self,
+ instance_arn,
+ target_id,
+ target_type,
+ permission_set_arn,
+ principal_type,
+ principal_id,
+ ):
+ for account in self.account_assignments:
+ instance_arn_match = account.instance_arn == instance_arn
+ target_id_match = account.target_id == target_id
+ target_type_match = account.target_type == target_type
+ permission_set_match = account.permission_set_arn == permission_set_arn
+ principal_type_match = account.principal_type == principal_type
+ principal_id_match = account.principal_id == principal_id
+ if (
+ instance_arn_match
+ and target_id_match
+ and target_type_match
+ and permission_set_match
+ and principal_type_match
+ and principal_id_match
+ ):
+ return account
+ raise ResourceNotFound
+
+ def list_account_assignments(self, instance_arn, account_id, permission_set_arn):
+ """
+ Pagination has not yet been implemented
+ """
+ account_assignments = []
+ for assignment in self.account_assignments:
+ if (
+ assignment.instance_arn == instance_arn
+ and assignment.target_id == account_id
+ and assignment.permission_set_arn == permission_set_arn
+ ):
+ account_assignments.append(
+ {
+ "AccountId": account_id,
+ "PermissionSetArn": assignment.permission_set_arn,
+ "PrincipalType": assignment.principal_type,
+ "PrincipalId": assignment.principal_id,
+ }
+ )
+ return account_assignments
+
+
+ssoadmin_backends = BackendDict(SSOAdminBackend, "sso")
diff --git a/contrib/python/moto/py3/moto/ssoadmin/responses.py b/contrib/python/moto/py3/moto/ssoadmin/responses.py
new file mode 100644
index 0000000000..43b8091abd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssoadmin/responses.py
@@ -0,0 +1,67 @@
+import json
+
+from moto.core.responses import BaseResponse
+from uuid import uuid4
+
+from .models import ssoadmin_backends
+
+
+class SSOAdminResponse(BaseResponse):
+ """Handler for SSOAdmin requests and responses."""
+
+ @property
+ def ssoadmin_backend(self):
+ """Return backend instance specific for this region."""
+ return ssoadmin_backends[self.region]
+
+ def create_account_assignment(self):
+ params = json.loads(self.body)
+ instance_arn = params.get("InstanceArn")
+ target_id = params.get("TargetId")
+ target_type = params.get("TargetType")
+ permission_set_arn = params.get("PermissionSetArn")
+ principal_type = params.get("PrincipalType")
+ principal_id = params.get("PrincipalId")
+ summary = self.ssoadmin_backend.create_account_assignment(
+ instance_arn=instance_arn,
+ target_id=target_id,
+ target_type=target_type,
+ permission_set_arn=permission_set_arn,
+ principal_type=principal_type,
+ principal_id=principal_id,
+ )
+ summary["Status"] = "SUCCEEDED"
+ summary["RequestId"] = str(uuid4())
+ return json.dumps({"AccountAssignmentCreationStatus": summary})
+
+ def delete_account_assignment(self):
+ params = json.loads(self.body)
+ instance_arn = params.get("InstanceArn")
+ target_id = params.get("TargetId")
+ target_type = params.get("TargetType")
+ permission_set_arn = params.get("PermissionSetArn")
+ principal_type = params.get("PrincipalType")
+ principal_id = params.get("PrincipalId")
+ summary = self.ssoadmin_backend.delete_account_assignment(
+ instance_arn=instance_arn,
+ target_id=target_id,
+ target_type=target_type,
+ permission_set_arn=permission_set_arn,
+ principal_type=principal_type,
+ principal_id=principal_id,
+ )
+ summary["Status"] = "SUCCEEDED"
+ summary["RequestId"] = str(uuid4())
+ return json.dumps({"AccountAssignmentDeletionStatus": summary})
+
+ def list_account_assignments(self):
+ params = json.loads(self.body)
+ instance_arn = params.get("InstanceArn")
+ account_id = params.get("AccountId")
+ permission_set_arn = params.get("PermissionSetArn")
+ assignments = self.ssoadmin_backend.list_account_assignments(
+ instance_arn=instance_arn,
+ account_id=account_id,
+ permission_set_arn=permission_set_arn,
+ )
+ return json.dumps({"AccountAssignments": assignments})
diff --git a/contrib/python/moto/py3/moto/ssoadmin/urls.py b/contrib/python/moto/py3/moto/ssoadmin/urls.py
new file mode 100644
index 0000000000..531968fd61
--- /dev/null
+++ b/contrib/python/moto/py3/moto/ssoadmin/urls.py
@@ -0,0 +1,11 @@
+"""ssoadmin base URL and path."""
+from .responses import SSOAdminResponse
+
+url_bases = [
+ r"https?://sso\.(.+)\.amazonaws\.com",
+]
+
+
+url_paths = {
+ "{0}/$": SSOAdminResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/stepfunctions/__init__.py b/contrib/python/moto/py3/moto/stepfunctions/__init__.py
new file mode 100644
index 0000000000..cd4bf405a3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/__init__.py
@@ -0,0 +1,4 @@
+from .models import stepfunction_backends
+from ..core.models import base_decorator
+
+mock_stepfunctions = base_decorator(stepfunction_backends)
diff --git a/contrib/python/moto/py3/moto/stepfunctions/exceptions.py b/contrib/python/moto/py3/moto/stepfunctions/exceptions.py
new file mode 100644
index 0000000000..d0ef5a14f9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/exceptions.py
@@ -0,0 +1,47 @@
+from moto.core.exceptions import AWSError
+
+
+class ExecutionAlreadyExists(AWSError):
+ TYPE = "ExecutionAlreadyExists"
+ STATUS = 400
+
+
+class ExecutionDoesNotExist(AWSError):
+ TYPE = "ExecutionDoesNotExist"
+ STATUS = 400
+
+
+class InvalidArn(AWSError):
+ TYPE = "InvalidArn"
+ STATUS = 400
+
+
+class InvalidName(AWSError):
+ TYPE = "InvalidName"
+ STATUS = 400
+
+
+class InvalidExecutionInput(AWSError):
+ TYPE = "InvalidExecutionInput"
+ STATUS = 400
+
+
+class StateMachineDoesNotExist(AWSError):
+ TYPE = "StateMachineDoesNotExist"
+ STATUS = 400
+
+
+class InvalidToken(AWSError):
+ TYPE = "InvalidToken"
+ STATUS = 400
+
+ def __init__(self, message="Invalid token"):
+ super().__init__("Invalid Token: {}".format(message))
+
+
+class ResourceNotFound(AWSError):
+ TYPE = "ResourceNotFound"
+ STATUS = 400
+
+ def __init__(self, arn):
+ super().__init__("Resource not found: '{}'".format(arn))
diff --git a/contrib/python/moto/py3/moto/stepfunctions/models.py b/contrib/python/moto/py3/moto/stepfunctions/models.py
new file mode 100644
index 0000000000..e4180d892c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/models.py
@@ -0,0 +1,620 @@
+import json
+import re
+from datetime import datetime
+from dateutil.tz import tzlocal
+
+from moto.core import get_account_id, BaseBackend, CloudFormationModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from uuid import uuid4
+from .exceptions import (
+ ExecutionAlreadyExists,
+ ExecutionDoesNotExist,
+ InvalidArn,
+ InvalidExecutionInput,
+ InvalidName,
+ ResourceNotFound,
+ StateMachineDoesNotExist,
+)
+from .utils import api_to_cfn_tags, cfn_to_api_tags, PAGINATION_MODEL
+from moto import settings
+from moto.utilities.paginator import paginate
+
+
+class StateMachine(CloudFormationModel):
+ def __init__(self, arn, name, definition, roleArn, tags=None):
+ self.creation_date = iso_8601_datetime_with_milliseconds(datetime.now())
+ self.update_date = self.creation_date
+ self.arn = arn
+ self.name = name
+ self.definition = definition
+ self.roleArn = roleArn
+ self.executions = []
+ self.tags = []
+ if tags:
+ self.add_tags(tags)
+
+ def start_execution(self, region_name, account_id, execution_name, execution_input):
+ self._ensure_execution_name_doesnt_exist(execution_name)
+ self._validate_execution_input(execution_input)
+ execution = Execution(
+ region_name=region_name,
+ account_id=account_id,
+ state_machine_name=self.name,
+ execution_name=execution_name,
+ state_machine_arn=self.arn,
+ execution_input=execution_input,
+ )
+ self.executions.append(execution)
+ return execution
+
+ def stop_execution(self, execution_arn):
+ execution = next(
+ (x for x in self.executions if x.execution_arn == execution_arn), None
+ )
+ if not execution:
+ raise ExecutionDoesNotExist(
+ "Execution Does Not Exist: '" + execution_arn + "'"
+ )
+ execution.stop()
+ return execution
+
+ def _ensure_execution_name_doesnt_exist(self, name):
+ for execution in self.executions:
+ if execution.name == name:
+ raise ExecutionAlreadyExists(
+ "Execution Already Exists: '" + execution.execution_arn + "'"
+ )
+
+ def _validate_execution_input(self, execution_input):
+ try:
+ json.loads(execution_input)
+ except Exception as ex:
+ raise InvalidExecutionInput(
+ "Invalid State Machine Execution Input: '" + str(ex) + "'"
+ )
+
+ def update(self, **kwargs):
+ for key, value in kwargs.items():
+ if value is not None:
+ setattr(self, key, value)
+ self.update_date = iso_8601_datetime_with_milliseconds(datetime.now())
+
+ def add_tags(self, tags):
+ merged_tags = []
+ for tag in self.tags:
+ replacement_index = next(
+ (index for (index, d) in enumerate(tags) if d["key"] == tag["key"]),
+ None,
+ )
+ if replacement_index is not None:
+ replacement = tags.pop(replacement_index)
+ merged_tags.append(replacement)
+ else:
+ merged_tags.append(tag)
+ for tag in tags:
+ merged_tags.append(tag)
+ self.tags = merged_tags
+ return self.tags
+
+ def remove_tags(self, tag_keys):
+ self.tags = [tag_set for tag_set in self.tags if tag_set["key"] not in tag_keys]
+ return self.tags
+
+ @property
+ def physical_resource_id(self):
+ return self.arn
+
+ def get_cfn_properties(self, prop_overrides):
+ property_names = [
+ "DefinitionString",
+ "RoleArn",
+ "StateMachineName",
+ ]
+ properties = {}
+ for prop in property_names:
+ properties[prop] = prop_overrides.get(prop, self.get_cfn_attribute(prop))
+ # Special handling for Tags
+ overridden_keys = [tag["Key"] for tag in prop_overrides.get("Tags", [])]
+ original_tags_to_include = [
+ tag
+ for tag in self.get_cfn_attribute("Tags")
+ if tag["Key"] not in overridden_keys
+ ]
+ properties["Tags"] = original_tags_to_include + prop_overrides.get("Tags", [])
+ return properties
+
+ @classmethod
+ def has_cfn_attr(cls, attr):
+ return attr in [
+ "Name",
+ "DefinitionString",
+ "RoleArn",
+ "StateMachineName",
+ "Tags",
+ ]
+
+ def get_cfn_attribute(self, attribute_name):
+ from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
+
+ if attribute_name == "Name":
+ return self.name
+ elif attribute_name == "DefinitionString":
+ return self.definition
+ elif attribute_name == "RoleArn":
+ return self.roleArn
+ elif attribute_name == "StateMachineName":
+ return self.name
+ elif attribute_name == "Tags":
+ return api_to_cfn_tags(self.tags)
+
+ raise UnformattedGetAttTemplateException()
+
+ @staticmethod
+ def cloudformation_name_type():
+ return "StateMachine"
+
+ @staticmethod
+ def cloudformation_type():
+ return "AWS::StepFunctions::StateMachine"
+
+ @classmethod
+ def create_from_cloudformation_json(
+ cls, resource_name, cloudformation_json, region_name, **kwargs
+ ):
+ properties = cloudformation_json["Properties"]
+ name = properties.get("StateMachineName", resource_name)
+ definition = properties.get("DefinitionString", "")
+ role_arn = properties.get("RoleArn", "")
+ tags = cfn_to_api_tags(properties.get("Tags", []))
+ sf_backend = stepfunction_backends[region_name]
+ return sf_backend.create_state_machine(name, definition, role_arn, tags=tags)
+
+ @classmethod
+ def delete_from_cloudformation_json(cls, resource_name, _, region_name):
+ sf_backend = stepfunction_backends[region_name]
+ sf_backend.delete_state_machine(resource_name)
+
+ @classmethod
+ def update_from_cloudformation_json(
+ cls, original_resource, new_resource_name, cloudformation_json, region_name
+ ):
+ properties = cloudformation_json.get("Properties", {})
+ name = properties.get("StateMachineName", original_resource.name)
+
+ if name != original_resource.name:
+ # Replacement
+ new_properties = original_resource.get_cfn_properties(properties)
+ cloudformation_json["Properties"] = new_properties
+ new_resource = cls.create_from_cloudformation_json(
+ name, cloudformation_json, region_name
+ )
+ cls.delete_from_cloudformation_json(
+ original_resource.arn, cloudformation_json, region_name
+ )
+ return new_resource
+
+ else:
+ # No Interruption
+ definition = properties.get("DefinitionString")
+ role_arn = properties.get("RoleArn")
+ tags = cfn_to_api_tags(properties.get("Tags", []))
+ sf_backend = stepfunction_backends[region_name]
+ state_machine = sf_backend.update_state_machine(
+ original_resource.arn, definition=definition, role_arn=role_arn
+ )
+ state_machine.add_tags(tags)
+ return state_machine
+
+
+class Execution:
+ def __init__(
+ self,
+ region_name,
+ account_id,
+ state_machine_name,
+ execution_name,
+ state_machine_arn,
+ execution_input,
+ ):
+ execution_arn = "arn:aws:states:{}:{}:execution:{}:{}"
+ execution_arn = execution_arn.format(
+ region_name, account_id, state_machine_name, execution_name
+ )
+ self.execution_arn = execution_arn
+ self.name = execution_name
+ self.start_date = iso_8601_datetime_with_milliseconds(datetime.now())
+ self.state_machine_arn = state_machine_arn
+ self.execution_input = execution_input
+ self.status = "RUNNING"
+ self.stop_date = None
+
+ def get_execution_history(self, roleArn):
+ sf_execution_history_type = settings.get_sf_execution_history_type()
+ if sf_execution_history_type == "SUCCESS":
+ return [
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 0, tzinfo=tzlocal())
+ ),
+ "type": "ExecutionStarted",
+ "id": 1,
+ "previousEventId": 0,
+ "executionStartedEventDetails": {
+ "input": "{}",
+ "inputDetails": {"truncated": False},
+ "roleArn": roleArn,
+ },
+ },
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 10, tzinfo=tzlocal())
+ ),
+ "type": "PassStateEntered",
+ "id": 2,
+ "previousEventId": 0,
+ "stateEnteredEventDetails": {
+ "name": "A State",
+ "input": "{}",
+ "inputDetails": {"truncated": False},
+ },
+ },
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 10, tzinfo=tzlocal())
+ ),
+ "type": "PassStateExited",
+ "id": 3,
+ "previousEventId": 2,
+ "stateExitedEventDetails": {
+ "name": "A State",
+ "output": "An output",
+ "outputDetails": {"truncated": False},
+ },
+ },
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 20, tzinfo=tzlocal())
+ ),
+ "type": "ExecutionSucceeded",
+ "id": 4,
+ "previousEventId": 3,
+ "executionSucceededEventDetails": {
+ "output": "An output",
+ "outputDetails": {"truncated": False},
+ },
+ },
+ ]
+ elif sf_execution_history_type == "FAILURE":
+ return [
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 0, tzinfo=tzlocal())
+ ),
+ "type": "ExecutionStarted",
+ "id": 1,
+ "previousEventId": 0,
+ "executionStartedEventDetails": {
+ "input": "{}",
+ "inputDetails": {"truncated": False},
+ "roleArn": roleArn,
+ },
+ },
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 10, tzinfo=tzlocal())
+ ),
+ "type": "FailStateEntered",
+ "id": 2,
+ "previousEventId": 0,
+ "stateEnteredEventDetails": {
+ "name": "A State",
+ "input": "{}",
+ "inputDetails": {"truncated": False},
+ },
+ },
+ {
+ "timestamp": iso_8601_datetime_with_milliseconds(
+ datetime(2020, 1, 1, 0, 0, 10, tzinfo=tzlocal())
+ ),
+ "type": "ExecutionFailed",
+ "id": 3,
+ "previousEventId": 2,
+ "executionFailedEventDetails": {
+ "error": "AnError",
+ "cause": "An error occurred!",
+ },
+ },
+ ]
+
+ def stop(self):
+ self.status = "ABORTED"
+ self.stop_date = iso_8601_datetime_with_milliseconds(datetime.now())
+
+
+class StepFunctionBackend(BaseBackend):
+
+ # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions.html#SFN.Client.create_state_machine
+ # A name must not contain:
+ # whitespace
+ # brackets < > { } [ ]
+ # wildcard characters ? *
+ # special characters " # % \ ^ | ~ ` $ & , ; : /
+ invalid_chars_for_name = [
+ " ",
+ "{",
+ "}",
+ "[",
+ "]",
+ "<",
+ ">",
+ "?",
+ "*",
+ '"',
+ "#",
+ "%",
+ "\\",
+ "^",
+ "|",
+ "~",
+ "`",
+ "$",
+ "&",
+ ",",
+ ";",
+ ":",
+ "/",
+ ]
+ # control characters (U+0000-001F , U+007F-009F )
+ invalid_unicodes_for_name = [
+ "\u0000",
+ "\u0001",
+ "\u0002",
+ "\u0003",
+ "\u0004",
+ "\u0005",
+ "\u0006",
+ "\u0007",
+ "\u0008",
+ "\u0009",
+ "\u000A",
+ "\u000B",
+ "\u000C",
+ "\u000D",
+ "\u000E",
+ "\u000F",
+ "\u0010",
+ "\u0011",
+ "\u0012",
+ "\u0013",
+ "\u0014",
+ "\u0015",
+ "\u0016",
+ "\u0017",
+ "\u0018",
+ "\u0019",
+ "\u001A",
+ "\u001B",
+ "\u001C",
+ "\u001D",
+ "\u001E",
+ "\u001F",
+ "\u007F",
+ "\u0080",
+ "\u0081",
+ "\u0082",
+ "\u0083",
+ "\u0084",
+ "\u0085",
+ "\u0086",
+ "\u0087",
+ "\u0088",
+ "\u0089",
+ "\u008A",
+ "\u008B",
+ "\u008C",
+ "\u008D",
+ "\u008E",
+ "\u008F",
+ "\u0090",
+ "\u0091",
+ "\u0092",
+ "\u0093",
+ "\u0094",
+ "\u0095",
+ "\u0096",
+ "\u0097",
+ "\u0098",
+ "\u0099",
+ "\u009A",
+ "\u009B",
+ "\u009C",
+ "\u009D",
+ "\u009E",
+ "\u009F",
+ ]
+ accepted_role_arn_format = re.compile(
+ "arn:aws:iam::(?P<account_id>[0-9]{12}):role/.+"
+ )
+ accepted_mchn_arn_format = re.compile(
+ "arn:aws:states:[-0-9a-zA-Z]+:(?P<account_id>[0-9]{12}):stateMachine:.+"
+ )
+ accepted_exec_arn_format = re.compile(
+ "arn:aws:states:[-0-9a-zA-Z]+:(?P<account_id>[0-9]{12}):execution:.+"
+ )
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.state_machines = []
+ self.executions = []
+ self._account_id = None
+
+ def create_state_machine(self, name, definition, roleArn, tags=None):
+ self._validate_name(name)
+ self._validate_role_arn(roleArn)
+ arn = (
+ "arn:aws:states:"
+ + self.region_name
+ + ":"
+ + str(self._get_account_id())
+ + ":stateMachine:"
+ + name
+ )
+ try:
+ return self.describe_state_machine(arn)
+ except StateMachineDoesNotExist:
+ state_machine = StateMachine(arn, name, definition, roleArn, tags)
+ self.state_machines.append(state_machine)
+ return state_machine
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_state_machines(self):
+ state_machines = sorted(self.state_machines, key=lambda x: x.creation_date)
+ return state_machines
+
+ def describe_state_machine(self, arn):
+ self._validate_machine_arn(arn)
+ sm = next((x for x in self.state_machines if x.arn == arn), None)
+ if not sm:
+ raise StateMachineDoesNotExist(
+ "State Machine Does Not Exist: '" + arn + "'"
+ )
+ return sm
+
+ def delete_state_machine(self, arn):
+ self._validate_machine_arn(arn)
+ sm = next((x for x in self.state_machines if x.arn == arn), None)
+ if sm:
+ self.state_machines.remove(sm)
+
+ def update_state_machine(self, arn, definition=None, role_arn=None):
+ sm = self.describe_state_machine(arn)
+ updates = {
+ "definition": definition,
+ "roleArn": role_arn,
+ }
+ sm.update(**updates)
+ return sm
+
+ def start_execution(self, state_machine_arn, name=None, execution_input=None):
+ state_machine = self.describe_state_machine(state_machine_arn)
+ execution = state_machine.start_execution(
+ region_name=self.region_name,
+ account_id=self._get_account_id(),
+ execution_name=name or str(uuid4()),
+ execution_input=execution_input,
+ )
+ return execution
+
+ def stop_execution(self, execution_arn):
+ self._validate_execution_arn(execution_arn)
+ state_machine = self._get_state_machine_for_execution(execution_arn)
+ return state_machine.stop_execution(execution_arn)
+
+ @paginate(pagination_model=PAGINATION_MODEL)
+ def list_executions(self, state_machine_arn, status_filter=None):
+ executions = self.describe_state_machine(state_machine_arn).executions
+
+ if status_filter:
+ executions = list(filter(lambda e: e.status == status_filter, executions))
+
+ executions = sorted(executions, key=lambda x: x.start_date, reverse=True)
+ return executions
+
+ def describe_execution(self, execution_arn):
+ self._validate_execution_arn(execution_arn)
+ state_machine = self._get_state_machine_for_execution(execution_arn)
+ exctn = next(
+ (x for x in state_machine.executions if x.execution_arn == execution_arn),
+ None,
+ )
+ if not exctn:
+ raise ExecutionDoesNotExist(
+ "Execution Does Not Exist: '" + execution_arn + "'"
+ )
+ return exctn
+
+ def get_execution_history(self, execution_arn):
+ self._validate_execution_arn(execution_arn)
+ state_machine = self._get_state_machine_for_execution(execution_arn)
+ execution = next(
+ (x for x in state_machine.executions if x.execution_arn == execution_arn),
+ None,
+ )
+ if not execution:
+ raise ExecutionDoesNotExist(
+ "Execution Does Not Exist: '" + execution_arn + "'"
+ )
+ return execution.get_execution_history(state_machine.roleArn)
+
+ def list_tags_for_resource(self, arn):
+ try:
+ state_machine = self.describe_state_machine(arn)
+ return state_machine.tags or []
+ except StateMachineDoesNotExist:
+ return []
+
+ def tag_resource(self, resource_arn, tags):
+ try:
+ state_machine = self.describe_state_machine(resource_arn)
+ state_machine.add_tags(tags)
+ except StateMachineDoesNotExist:
+ raise ResourceNotFound(resource_arn)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ try:
+ state_machine = self.describe_state_machine(resource_arn)
+ state_machine.remove_tags(tag_keys)
+ except StateMachineDoesNotExist:
+ raise ResourceNotFound(resource_arn)
+
+ def _validate_name(self, name):
+ if any(invalid_char in name for invalid_char in self.invalid_chars_for_name):
+ raise InvalidName("Invalid Name: '" + name + "'")
+
+ if any(name.find(char) >= 0 for char in self.invalid_unicodes_for_name):
+ raise InvalidName("Invalid Name: '" + name + "'")
+
+ def _validate_role_arn(self, role_arn):
+ self._validate_arn(
+ arn=role_arn,
+ regex=self.accepted_role_arn_format,
+ invalid_msg="Invalid Role Arn: '" + role_arn + "'",
+ )
+
+ def _validate_machine_arn(self, machine_arn):
+ self._validate_arn(
+ arn=machine_arn,
+ regex=self.accepted_mchn_arn_format,
+ invalid_msg="Invalid State Machine Arn: '" + machine_arn + "'",
+ )
+
+ def _validate_execution_arn(self, execution_arn):
+ self._validate_arn(
+ arn=execution_arn,
+ regex=self.accepted_exec_arn_format,
+ invalid_msg="Execution Does Not Exist: '" + execution_arn + "'",
+ )
+
+ def _validate_arn(self, arn, regex, invalid_msg):
+ match = regex.match(arn)
+ if not arn or not match:
+ raise InvalidArn(invalid_msg)
+
+ def _get_state_machine_for_execution(self, execution_arn):
+ state_machine_name = execution_arn.split(":")[6]
+ state_machine_arn = next(
+ (x.arn for x in self.state_machines if x.name == state_machine_name), None
+ )
+ if not state_machine_arn:
+ # Assume that if the state machine arn is not present, then neither will the
+ # execution
+ raise ExecutionDoesNotExist(
+ "Execution Does Not Exist: '" + execution_arn + "'"
+ )
+ return self.describe_state_machine(state_machine_arn)
+
+ def _get_account_id(self):
+ return get_account_id()
+
+
+stepfunction_backends = BackendDict(StepFunctionBackend, "stepfunctions")
diff --git a/contrib/python/moto/py3/moto/stepfunctions/responses.py b/contrib/python/moto/py3/moto/stepfunctions/responses.py
new file mode 100644
index 0000000000..e7bc2c571a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/responses.py
@@ -0,0 +1,185 @@
+import json
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import stepfunction_backends
+
+
+class StepFunctionResponse(BaseResponse):
+ @property
+ def stepfunction_backend(self):
+ return stepfunction_backends[self.region]
+
+ @amzn_request_id
+ def create_state_machine(self):
+ name = self._get_param("name")
+ definition = self._get_param("definition")
+ roleArn = self._get_param("roleArn")
+ tags = self._get_param("tags")
+ state_machine = self.stepfunction_backend.create_state_machine(
+ name=name, definition=definition, roleArn=roleArn, tags=tags
+ )
+ response = {
+ "creationDate": state_machine.creation_date,
+ "stateMachineArn": state_machine.arn,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_state_machines(self):
+ max_results = self._get_int_param("maxResults")
+ next_token = self._get_param("nextToken")
+ results, next_token = self.stepfunction_backend.list_state_machines(
+ max_results=max_results, next_token=next_token
+ )
+ state_machines = [
+ {
+ "creationDate": sm.creation_date,
+ "name": sm.name,
+ "stateMachineArn": sm.arn,
+ }
+ for sm in results
+ ]
+ response = {"stateMachines": state_machines}
+ if next_token:
+ response["nextToken"] = next_token
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_state_machine(self):
+ arn = self._get_param("stateMachineArn")
+ return self._describe_state_machine(arn)
+
+ @amzn_request_id
+ def _describe_state_machine(self, state_machine_arn):
+ state_machine = self.stepfunction_backend.describe_state_machine(
+ state_machine_arn
+ )
+ response = {
+ "creationDate": state_machine.creation_date,
+ "stateMachineArn": state_machine.arn,
+ "definition": state_machine.definition,
+ "name": state_machine.name,
+ "roleArn": state_machine.roleArn,
+ "status": "ACTIVE",
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def delete_state_machine(self):
+ arn = self._get_param("stateMachineArn")
+ self.stepfunction_backend.delete_state_machine(arn)
+ return 200, {}, json.dumps("{}")
+
+ @amzn_request_id
+ def update_state_machine(self):
+ arn = self._get_param("stateMachineArn")
+ definition = self._get_param("definition")
+ role_arn = self._get_param("roleArn")
+ state_machine = self.stepfunction_backend.update_state_machine(
+ arn=arn, definition=definition, role_arn=role_arn
+ )
+ response = {
+ "updateDate": state_machine.update_date,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_tags_for_resource(self):
+ arn = self._get_param("resourceArn")
+ tags = self.stepfunction_backend.list_tags_for_resource(arn)
+ response = {"tags": tags}
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def tag_resource(self):
+ arn = self._get_param("resourceArn")
+ tags = self._get_param("tags", [])
+ self.stepfunction_backend.tag_resource(arn, tags)
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def untag_resource(self):
+ arn = self._get_param("resourceArn")
+ tag_keys = self._get_param("tagKeys", [])
+ self.stepfunction_backend.untag_resource(arn, tag_keys)
+ return 200, {}, json.dumps({})
+
+ @amzn_request_id
+ def start_execution(self):
+ arn = self._get_param("stateMachineArn")
+ name = self._get_param("name")
+ execution_input = self._get_param("input", if_none="{}")
+ execution = self.stepfunction_backend.start_execution(
+ arn, name, execution_input
+ )
+ response = {
+ "executionArn": execution.execution_arn,
+ "startDate": execution.start_date,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def list_executions(self):
+ max_results = self._get_int_param("maxResults")
+ next_token = self._get_param("nextToken")
+ arn = self._get_param("stateMachineArn")
+ status_filter = self._get_param("statusFilter")
+ state_machine = self.stepfunction_backend.describe_state_machine(arn)
+ results, next_token = self.stepfunction_backend.list_executions(
+ arn,
+ status_filter=status_filter,
+ max_results=max_results,
+ next_token=next_token,
+ )
+ executions = [
+ {
+ "executionArn": execution.execution_arn,
+ "name": execution.name,
+ "startDate": execution.start_date,
+ "stateMachineArn": state_machine.arn,
+ "status": execution.status,
+ }
+ for execution in results
+ ]
+ response = {"executions": executions}
+ if next_token:
+ response["nextToken"] = next_token
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_execution(self):
+ arn = self._get_param("executionArn")
+ execution = self.stepfunction_backend.describe_execution(arn)
+ response = {
+ "executionArn": arn,
+ "input": execution.execution_input,
+ "name": execution.name,
+ "startDate": execution.start_date,
+ "stateMachineArn": execution.state_machine_arn,
+ "status": execution.status,
+ "stopDate": execution.stop_date,
+ }
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def describe_state_machine_for_execution(self):
+ arn = self._get_param("executionArn")
+ execution = self.stepfunction_backend.describe_execution(arn)
+ return self._describe_state_machine(execution.state_machine_arn)
+
+ @amzn_request_id
+ def stop_execution(self):
+ arn = self._get_param("executionArn")
+ execution = self.stepfunction_backend.stop_execution(arn)
+ response = {"stopDate": execution.stop_date}
+ return 200, {}, json.dumps(response)
+
+ @amzn_request_id
+ def get_execution_history(self):
+ execution_arn = self._get_param("executionArn")
+ execution_history = self.stepfunction_backend.get_execution_history(
+ execution_arn
+ )
+ response = {"events": execution_history}
+ return 200, {}, json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/stepfunctions/urls.py b/contrib/python/moto/py3/moto/stepfunctions/urls.py
new file mode 100644
index 0000000000..cd516b89eb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/urls.py
@@ -0,0 +1,5 @@
+from .responses import StepFunctionResponse
+
+url_bases = [r"https?://states\.(.+)\.amazonaws.com"]
+
+url_paths = {"{0}/$": StepFunctionResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/stepfunctions/utils.py b/contrib/python/moto/py3/moto/stepfunctions/utils.py
new file mode 100644
index 0000000000..20881771f3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/stepfunctions/utils.py
@@ -0,0 +1,24 @@
+PAGINATION_MODEL = {
+ "list_executions": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": ["start_date", "execution_arn"],
+ },
+ "list_state_machines": {
+ "input_token": "next_token",
+ "limit_key": "max_results",
+ "limit_default": 100,
+ "unique_attribute": ["creation_date", "arn"],
+ },
+}
+
+
+def cfn_to_api_tags(cfn_tags_entry):
+ api_tags = [{k.lower(): v for k, v in d.items()} for d in cfn_tags_entry]
+ return api_tags
+
+
+def api_to_cfn_tags(api_tags):
+ cfn_tags_entry = [{k.capitalize(): v for k, v in d.items()} for d in api_tags]
+ return cfn_tags_entry
diff --git a/contrib/python/moto/py3/moto/sts/__init__.py b/contrib/python/moto/py3/moto/sts/__init__.py
new file mode 100644
index 0000000000..301cecc411
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/__init__.py
@@ -0,0 +1,4 @@
+from .models import sts_backends
+from ..core.models import base_decorator
+
+mock_sts = base_decorator(sts_backends)
diff --git a/contrib/python/moto/py3/moto/sts/exceptions.py b/contrib/python/moto/py3/moto/sts/exceptions.py
new file mode 100644
index 0000000000..021945f9f3
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/exceptions.py
@@ -0,0 +1,10 @@
+from moto.core.exceptions import RESTError
+
+
+class STSClientError(RESTError):
+ code = 400
+
+
+class STSValidationError(STSClientError):
+ def __init__(self, *args, **kwargs):
+ super().__init__("ValidationError", *args, **kwargs)
diff --git a/contrib/python/moto/py3/moto/sts/models.py b/contrib/python/moto/py3/moto/sts/models.py
new file mode 100644
index 0000000000..677bc0ffee
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/models.py
@@ -0,0 +1,144 @@
+from base64 import b64decode
+import datetime
+import xmltodict
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+from moto.core import get_account_id
+from moto.sts.utils import (
+ random_access_key_id,
+ random_secret_access_key,
+ random_session_token,
+ random_assumed_role_id,
+ DEFAULT_STS_SESSION_DURATION,
+)
+
+
+class Token(BaseModel):
+ def __init__(self, duration, name=None):
+ now = datetime.datetime.utcnow()
+ self.expiration = now + datetime.timedelta(seconds=duration)
+ self.name = name
+ self.policy = None
+
+ @property
+ def expiration_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.expiration)
+
+
+class AssumedRole(BaseModel):
+ def __init__(self, role_session_name, role_arn, policy, duration, external_id):
+ self.session_name = role_session_name
+ self.role_arn = role_arn
+ self.policy = policy
+ now = datetime.datetime.utcnow()
+ self.expiration = now + datetime.timedelta(seconds=duration)
+ self.external_id = external_id
+ self.access_key_id = "ASIA" + random_access_key_id()
+ self.secret_access_key = random_secret_access_key()
+ self.session_token = random_session_token()
+ self.assumed_role_id = "AROA" + random_assumed_role_id()
+
+ @property
+ def expiration_ISO8601(self):
+ return iso_8601_datetime_with_milliseconds(self.expiration)
+
+ @property
+ def user_id(self):
+ return self.assumed_role_id + ":" + self.session_name
+
+ @property
+ def arn(self):
+ return (
+ "arn:aws:sts::{account_id}:assumed-role/{role_name}/{session_name}".format(
+ account_id=get_account_id(),
+ role_name=self.role_arn.split("/")[-1],
+ session_name=self.session_name,
+ )
+ )
+
+
+class STSBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.assumed_roles = []
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "sts"
+ )
+
+ def get_session_token(self, duration):
+ token = Token(duration=duration)
+ return token
+
+ def get_federation_token(self, name, duration):
+ token = Token(duration=duration, name=name)
+ return token
+
+ def assume_role(self, **kwargs):
+ role = AssumedRole(**kwargs)
+ self.assumed_roles.append(role)
+ return role
+
+ def get_assumed_role_from_access_key(self, access_key_id):
+ for assumed_role in self.assumed_roles:
+ if assumed_role.access_key_id == access_key_id:
+ return assumed_role
+ return None
+
+ def assume_role_with_web_identity(self, **kwargs):
+ return self.assume_role(**kwargs)
+
+ def assume_role_with_saml(self, **kwargs):
+ del kwargs["principal_arn"]
+ saml_assertion_encoded = kwargs.pop("saml_assertion")
+ saml_assertion_decoded = b64decode(saml_assertion_encoded)
+
+ namespaces = {
+ "urn:oasis:names:tc:SAML:2.0:protocol": "samlp",
+ "urn:oasis:names:tc:SAML:2.0:assertion": "saml",
+ }
+ saml_assertion = xmltodict.parse(
+ saml_assertion_decoded.decode("utf-8"),
+ force_cdata=True,
+ process_namespaces=True,
+ namespaces=namespaces,
+ namespace_separator="|",
+ )
+
+ saml_assertion_attributes = saml_assertion["samlp|Response"]["saml|Assertion"][
+ "saml|AttributeStatement"
+ ]["saml|Attribute"]
+ for attribute in saml_assertion_attributes:
+ if (
+ attribute["@Name"]
+ == "https://aws.amazon.com/SAML/Attributes/RoleSessionName"
+ ):
+ kwargs["role_session_name"] = attribute["saml|AttributeValue"]["#text"]
+ if (
+ attribute["@Name"]
+ == "https://aws.amazon.com/SAML/Attributes/SessionDuration"
+ ):
+ kwargs["duration"] = int(attribute["saml|AttributeValue"]["#text"])
+
+ if "duration" not in kwargs:
+ kwargs["duration"] = DEFAULT_STS_SESSION_DURATION
+
+ kwargs["external_id"] = None
+ kwargs["policy"] = None
+ role = AssumedRole(**kwargs)
+ self.assumed_roles.append(role)
+ return role
+
+ def get_caller_identity(self):
+ # Logic resides in responses.py
+ # Fake method here to make implementation coverage script aware that this method is implemented
+ pass
+
+
+sts_backends = BackendDict(
+ STSBackend, "sts", use_boto3_regions=False, additional_regions=["global"]
+)
+sts_backend = sts_backends["global"]
diff --git a/contrib/python/moto/py3/moto/sts/responses.py b/contrib/python/moto/py3/moto/sts/responses.py
new file mode 100644
index 0000000000..291b224506
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/responses.py
@@ -0,0 +1,213 @@
+from moto.core.responses import BaseResponse
+from moto.core import get_account_id
+from moto.iam import iam_backend
+from .exceptions import STSValidationError
+from .models import sts_backend
+
+MAX_FEDERATION_TOKEN_POLICY_LENGTH = 2048
+
+
+class TokenResponse(BaseResponse):
+ def get_session_token(self):
+ duration = int(self.querystring.get("DurationSeconds", [43200])[0])
+ token = sts_backend.get_session_token(duration=duration)
+ template = self.response_template(GET_SESSION_TOKEN_RESPONSE)
+ return template.render(token=token)
+
+ def get_federation_token(self):
+ duration = int(self.querystring.get("DurationSeconds", [43200])[0])
+ policy = self.querystring.get("Policy", [None])[0]
+
+ if policy is not None and len(policy) > MAX_FEDERATION_TOKEN_POLICY_LENGTH:
+ raise STSValidationError(
+ "1 validation error detected: Value "
+ '\'{"Version": "2012-10-17", "Statement": [...]}\' '
+ "at 'policy' failed to satisfy constraint: Member must have length less than or "
+ " equal to %s" % MAX_FEDERATION_TOKEN_POLICY_LENGTH
+ )
+
+ name = self.querystring.get("Name")[0]
+ token = sts_backend.get_federation_token(duration=duration, name=name)
+ template = self.response_template(GET_FEDERATION_TOKEN_RESPONSE)
+ return template.render(token=token, account_id=get_account_id())
+
+ def assume_role(self):
+ role_session_name = self.querystring.get("RoleSessionName")[0]
+ role_arn = self.querystring.get("RoleArn")[0]
+
+ policy = self.querystring.get("Policy", [None])[0]
+ duration = int(self.querystring.get("DurationSeconds", [3600])[0])
+ external_id = self.querystring.get("ExternalId", [None])[0]
+
+ role = sts_backend.assume_role(
+ role_session_name=role_session_name,
+ role_arn=role_arn,
+ policy=policy,
+ duration=duration,
+ external_id=external_id,
+ )
+ template = self.response_template(ASSUME_ROLE_RESPONSE)
+ return template.render(role=role)
+
+ def assume_role_with_web_identity(self):
+ role_session_name = self.querystring.get("RoleSessionName")[0]
+ role_arn = self.querystring.get("RoleArn")[0]
+
+ policy = self.querystring.get("Policy", [None])[0]
+ duration = int(self.querystring.get("DurationSeconds", [3600])[0])
+ external_id = self.querystring.get("ExternalId", [None])[0]
+
+ role = sts_backend.assume_role_with_web_identity(
+ role_session_name=role_session_name,
+ role_arn=role_arn,
+ policy=policy,
+ duration=duration,
+ external_id=external_id,
+ )
+ template = self.response_template(ASSUME_ROLE_WITH_WEB_IDENTITY_RESPONSE)
+ return template.render(role=role)
+
+ def assume_role_with_saml(self):
+ role_arn = self.querystring.get("RoleArn")[0]
+ principal_arn = self.querystring.get("PrincipalArn")[0]
+ saml_assertion = self.querystring.get("SAMLAssertion")[0]
+
+ role = sts_backend.assume_role_with_saml(
+ role_arn=role_arn,
+ principal_arn=principal_arn,
+ saml_assertion=saml_assertion,
+ )
+ template = self.response_template(ASSUME_ROLE_WITH_SAML_RESPONSE)
+ return template.render(role=role)
+
+ def get_caller_identity(self):
+ template = self.response_template(GET_CALLER_IDENTITY_RESPONSE)
+
+ # Default values in case the request does not use valid credentials generated by moto
+ user_id = "AKIAIOSFODNN7EXAMPLE"
+ arn = "arn:aws:sts::{account_id}:user/moto".format(account_id=get_account_id())
+
+ access_key_id = self.get_current_user()
+ assumed_role = sts_backend.get_assumed_role_from_access_key(access_key_id)
+ if assumed_role:
+ user_id = assumed_role.user_id
+ arn = assumed_role.arn
+
+ user = iam_backend.get_user_from_access_key_id(access_key_id)
+ if user:
+ user_id = user.id
+ arn = user.arn
+
+ return template.render(account_id=get_account_id(), user_id=user_id, arn=arn)
+
+
+GET_SESSION_TOKEN_RESPONSE = """<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <GetSessionTokenResult>
+ <Credentials>
+ <SessionToken>AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE</SessionToken>
+ <SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
+ <Expiration>{{ token.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
+ </Credentials>
+ </GetSessionTokenResult>
+ <ResponseMetadata>
+ <RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId>
+ </ResponseMetadata>
+</GetSessionTokenResponse>"""
+
+
+GET_FEDERATION_TOKEN_RESPONSE = """<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <GetFederationTokenResult>
+ <Credentials>
+ <SessionToken>AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==</SessionToken>
+ <SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
+ <Expiration>{{ token.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
+ </Credentials>
+ <FederatedUser>
+ <Arn>arn:aws:sts::{{ account_id }}:federated-user/{{ token.name }}</Arn>
+ <FederatedUserId>{{ account_id }}:{{ token.name }}</FederatedUserId>
+ </FederatedUser>
+ <PackedPolicySize>6</PackedPolicySize>
+ </GetFederationTokenResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</GetFederationTokenResponse>"""
+
+
+ASSUME_ROLE_RESPONSE = """<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <AssumeRoleResult>
+ <Credentials>
+ <SessionToken>{{ role.session_token }}</SessionToken>
+ <SecretAccessKey>{{ role.secret_access_key }}</SecretAccessKey>
+ <Expiration>{{ role.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>{{ role.access_key_id }}</AccessKeyId>
+ </Credentials>
+ <AssumedRoleUser>
+ <Arn>{{ role.arn }}</Arn>
+ <AssumedRoleId>{{ role.user_id }}</AssumedRoleId>
+ </AssumedRoleUser>
+ <PackedPolicySize>6</PackedPolicySize>
+ </AssumeRoleResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</AssumeRoleResponse>"""
+
+
+ASSUME_ROLE_WITH_WEB_IDENTITY_RESPONSE = """<AssumeRoleWithWebIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <AssumeRoleWithWebIdentityResult>
+ <Credentials>
+ <SessionToken>{{ role.session_token }}</SessionToken>
+ <SecretAccessKey>{{ role.secret_access_key }}</SecretAccessKey>
+ <Expiration>{{ role.expiration_ISO8601 }}</Expiration>
+ <AccessKeyId>{{ role.access_key_id }}</AccessKeyId>
+ </Credentials>
+ <AssumedRoleUser>
+ <Arn>{{ role.arn }}</Arn>
+ <AssumedRoleId>ARO123EXAMPLE123:{{ role.session_name }}</AssumedRoleId>
+ </AssumedRoleUser>
+ <PackedPolicySize>6</PackedPolicySize>
+ </AssumeRoleWithWebIdentityResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</AssumeRoleWithWebIdentityResponse>"""
+
+
+ASSUME_ROLE_WITH_SAML_RESPONSE = """<AssumeRoleWithSAMLResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <AssumeRoleWithSAMLResult>
+ <Audience>https://signin.aws.amazon.com/saml</Audience>
+ <AssumedRoleUser>
+ <AssumedRoleId>{{ role.user_id }}</AssumedRoleId>
+ <Arn>{{ role.arn }}</Arn>
+ </AssumedRoleUser>
+ <Credentials>
+ <AccessKeyId>{{ role.access_key_id }}</AccessKeyId>
+ <SecretAccessKey>{{ role.secret_access_key }}</SecretAccessKey>
+ <SessionToken>{{ role.session_token }}</SessionToken>
+ <Expiration>{{ role.expiration_ISO8601 }}</Expiration>
+ </Credentials>
+ <Subject>{{ role.user_id }}</Subject>
+ <NameQualifier>B64EncodedStringOfHashOfIssuerAccountIdAndUserId=</NameQualifier>
+ <SubjectType>persistent</SubjectType>
+ <Issuer>http://localhost:3000/</Issuer>
+ </AssumeRoleWithSAMLResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</AssumeRoleWithSAMLResponse>"""
+
+
+GET_CALLER_IDENTITY_RESPONSE = """<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
+ <GetCallerIdentityResult>
+ <Arn>{{ arn }}</Arn>
+ <UserId>{{ user_id }}</UserId>
+ <Account>{{ account_id }}</Account>
+ </GetCallerIdentityResult>
+ <ResponseMetadata>
+ <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
+ </ResponseMetadata>
+</GetCallerIdentityResponse>
+"""
diff --git a/contrib/python/moto/py3/moto/sts/urls.py b/contrib/python/moto/py3/moto/sts/urls.py
new file mode 100644
index 0000000000..f7c8b11788
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/urls.py
@@ -0,0 +1,5 @@
+from .responses import TokenResponse
+
+url_bases = [r"https?://sts\.(.*\.)?amazonaws\.com"]
+
+url_paths = {"{0}/$": TokenResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/sts/utils.py b/contrib/python/moto/py3/moto/sts/utils.py
new file mode 100644
index 0000000000..668c5d0e19
--- /dev/null
+++ b/contrib/python/moto/py3/moto/sts/utils.py
@@ -0,0 +1,37 @@
+import base64
+import os
+import random
+import string
+
+ACCOUNT_SPECIFIC_ACCESS_KEY_PREFIX = "8NWMTLYQ"
+ACCOUNT_SPECIFIC_ASSUMED_ROLE_ID_PREFIX = "3X42LBCD"
+SESSION_TOKEN_PREFIX = "FQoGZXIvYXdzEBYaD"
+DEFAULT_STS_SESSION_DURATION = 3600
+
+
+def random_access_key_id():
+ return ACCOUNT_SPECIFIC_ACCESS_KEY_PREFIX + _random_uppercase_or_digit_sequence(8)
+
+
+def random_secret_access_key():
+ return base64.b64encode(os.urandom(30)).decode()
+
+
+def random_session_token():
+ return (
+ SESSION_TOKEN_PREFIX
+ + base64.b64encode(os.urandom(266))[len(SESSION_TOKEN_PREFIX) :].decode()
+ )
+
+
+def random_assumed_role_id():
+ return (
+ ACCOUNT_SPECIFIC_ASSUMED_ROLE_ID_PREFIX + _random_uppercase_or_digit_sequence(9)
+ )
+
+
+def _random_uppercase_or_digit_sequence(length):
+ return "".join(
+ str(random.choice(string.ascii_uppercase + string.digits))
+ for _ in range(length)
+ )
diff --git a/contrib/python/moto/py3/moto/support/__init__.py b/contrib/python/moto/py3/moto/support/__init__.py
new file mode 100644
index 0000000000..560832ad6c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/__init__.py
@@ -0,0 +1,4 @@
+from .models import support_backends
+from ..core.models import base_decorator
+
+mock_support = base_decorator(support_backends)
diff --git a/contrib/python/moto/py3/moto/support/exceptions.py b/contrib/python/moto/py3/moto/support/exceptions.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/exceptions.py
diff --git a/contrib/python/moto/py3/moto/support/models.py b/contrib/python/moto/py3/moto/support/models.py
new file mode 100644
index 0000000000..b65ef00698
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/models.py
@@ -0,0 +1,235 @@
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+from moto.moto_api import state_manager
+from moto.moto_api._internal.managed_state_model import ManagedState
+from moto.utilities.utils import load_resource
+import datetime
+import random
+
+
+checks_json = "resources/describe_trusted_advisor_checks.json"
+ADVISOR_CHECKS = load_resource(__name__, checks_json)
+
+
+class SupportCase(ManagedState):
+ def __init__(self, **kwargs):
+ # Configure ManagedState
+ super().__init__(
+ "support::case",
+ transitions=[
+ ("opened", "pending-customer-action"),
+ ("pending-customer-action", "reopened"),
+ ("reopened", "resolved"),
+ ("resolved", "unassigned"),
+ ("unassigned", "work-in-progress"),
+ ("work-in-progress", "opened"),
+ ],
+ )
+ self.case_id = kwargs.get("case_id")
+ self.display_id = "foo_display_id"
+ self.subject = kwargs.get("subject")
+ self.service_code = kwargs.get("service_code")
+ self.category_code = kwargs.get("category_code")
+ self.severity_code = kwargs.get("severity_code")
+ self.submitted_by = "moto@moto.com"
+ self.time_created = self.get_datetime()
+ self.attachment_set_id = kwargs.get("attachment_set_id")
+ self.communication_body = kwargs.get("communication_body")
+ self.language = kwargs.get("language")
+ self.cc_email_addresses = kwargs.get("cc_email_addresses")
+ self.communications = {
+ "recentCommunications": {
+ "communications": [
+ {
+ "caseId": self.case_id,
+ "body": self.communication_body,
+ "submittedBy": self.submitted_by,
+ "timeCreated": self.get_datetime(),
+ "attachmentSet": [
+ {
+ "attachmentId": self.attachment_set_id,
+ "fileName": "support_file.txt",
+ },
+ ],
+ }
+ ],
+ "nextToken": "foo_next_token",
+ }
+ }
+
+ def get_datetime(self):
+ return str(datetime.datetime.now().isoformat())
+
+
+class SupportBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.check_status = {}
+ self.cases = {}
+
+ state_manager.register_default_transition(
+ model_name="support::case", transition={"progression": "manual", "times": 1}
+ )
+
+ def describe_trusted_advisor_checks(self):
+ """
+ The Language-parameter is not yet implemented
+ """
+ # The checks are a static response
+ checks = ADVISOR_CHECKS["checks"]
+ return checks
+
+ def refresh_trusted_advisor_check(self, check_id):
+ self.advance_check_status(check_id)
+ status = {
+ "status": {
+ "checkId": check_id,
+ "status": self.check_status[check_id],
+ "millisUntilNextRefreshable": 123,
+ }
+ }
+ return status
+
+ def advance_check_status(self, check_id):
+ """
+ Fake an advancement through statuses on refreshing TA checks
+ """
+ if check_id not in self.check_status:
+ self.check_status[check_id] = "none"
+
+ elif self.check_status[check_id] == "none":
+ self.check_status[check_id] = "enqueued"
+
+ elif self.check_status[check_id] == "enqueued":
+ self.check_status[check_id] = "processing"
+
+ elif self.check_status[check_id] == "processing":
+ self.check_status[check_id] = "success"
+
+ elif self.check_status[check_id] == "success":
+ self.check_status[check_id] = "abandoned"
+
+ elif self.check_status[check_id] == "abandoned":
+ self.check_status[check_id] = "none"
+
+ def advance_case_status(self, case_id):
+ """
+ Fake an advancement through case statuses
+ """
+
+ self.cases[case_id].advance()
+
+ def advance_case_severity_codes(self, case_id):
+ """
+ Fake an advancement through case status severities
+ """
+ if self.cases[case_id].severity_code == "low":
+ self.cases[case_id].severity_code = "normal"
+
+ elif self.cases[case_id].severity_code == "normal":
+ self.cases[case_id].severity_code = "high"
+
+ elif self.cases[case_id].severity_code == "high":
+ self.cases[case_id].severity_code = "urgent"
+
+ elif self.cases[case_id].severity_code == "urgent":
+ self.cases[case_id].severity_code = "critical"
+
+ elif self.cases[case_id].severity_code == "critical":
+ self.cases[case_id].severity_code = "low"
+
+ def resolve_case(self, case_id):
+ self.advance_case_status(case_id)
+
+ resolved_case = {
+ "initialCaseStatus": self.cases[case_id].status,
+ "finalCaseStatus": "resolved",
+ }
+
+ return resolved_case
+
+ # persist case details to self.cases
+ def create_case(
+ self,
+ subject,
+ service_code,
+ severity_code,
+ category_code,
+ communication_body,
+ cc_email_addresses,
+ language,
+ attachment_set_id,
+ ):
+ """
+ The IssueType-parameter is not yet implemented
+ """
+ # Random case ID
+ random_case_id = "".join(
+ random.choice("0123456789ABCDEFGHIJKLMabcdefghijklm") for i in range(16)
+ )
+ case_id = "case-12345678910-2020-%s" % random_case_id
+ case = SupportCase(
+ case_id=case_id,
+ subject=subject,
+ service_code=service_code,
+ severity_code=severity_code,
+ category_code=category_code,
+ communication_body=communication_body,
+ cc_email_addresses=cc_email_addresses,
+ language=language,
+ attachment_set_id=attachment_set_id,
+ )
+ self.cases[case_id] = case
+
+ return {"caseId": case_id}
+
+ def describe_cases(
+ self,
+ case_id_list,
+ include_resolved_cases,
+ next_token,
+ include_communications,
+ ):
+ """
+ The following parameters have not yet been implemented:
+ DisplayID, AfterTime, BeforeTime, MaxResults, Language
+ """
+ cases = []
+ requested_case_ids = case_id_list or self.cases.keys()
+
+ for case in requested_case_ids:
+ self.advance_case_status(case)
+ self.advance_case_severity_codes(case)
+ formatted_case = {
+ "caseId": self.cases[case].case_id,
+ "displayId": self.cases[case].display_id,
+ "subject": self.cases[case].subject,
+ "status": self.cases[case].status,
+ "serviceCode": self.cases[case].service_code,
+ "categoryCode": self.cases[case].category_code,
+ "severityCode": self.cases[case].severity_code,
+ "submittedBy": self.cases[case].submitted_by,
+ "timeCreated": self.cases[case].time_created,
+ "ccEmailAddresses": self.cases[case].cc_email_addresses,
+ "language": self.cases[case].language,
+ }
+
+ if include_communications:
+ formatted_case.update(self.cases[case].communications)
+
+ if (
+ include_resolved_cases is False
+ and formatted_case["status"] == "resolved"
+ ):
+ continue
+
+ cases.append(formatted_case)
+ case_values = {"cases": cases}
+ case_values.update({"nextToken": next_token})
+
+ return case_values
+
+
+support_backends = BackendDict(
+ SupportBackend, "support", use_boto3_regions=False, additional_regions=["us-east-1"]
+)
diff --git a/contrib/python/moto/py3/moto/support/resources/describe_trusted_advisor_checks.json b/contrib/python/moto/py3/moto/support/resources/describe_trusted_advisor_checks.json
new file mode 100644
index 0000000000..26958c0aae
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/resources/describe_trusted_advisor_checks.json
@@ -0,0 +1,1491 @@
+{
+ "checks": [
+ {
+ "id": "Qch7DwouX1",
+ "name": "Low Utilization Amazon EC2 Instances",
+ "description": "Checks the Amazon Elastic Compute Cloud (Amazon EC2) instances that were running at any time during the last 14 days and alerts you if the daily CPU utilization was 10% or less and network I/O was 5 MB or less on 4 or more days. Running instances generate hourly usage charges. Although some scenarios can result in low utilization by design, you can often lower your costs by managing the number and size of your instances.\n<br><br>\nEstimated monthly savings are calculated by using the current usage rate for On-Demand Instances and the estimated number of days the instance might be underutilized. Actual savings will vary if you are using Reserved Instances or Spot Instances, or if the instance is not running for a full day. To get daily utilization data, download the report for this check. \n<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An instance had 10% or less daily average CPU utilization and 5 MB or less network I/O on at least 4 of the previous 14 days.<br>\n<br>\n<b>Recommended Action</b><br>\nConsider stopping or terminating instances that have low utilization, or scale the number of instances by using Auto Scaling. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html\" target=\"_blank\">Stop and Start Your Instance</a>, <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html\" target=\"_blank\">Terminate Your Instance</a>, and <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">What is Auto Scaling?</a><br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-monitoring.html\" target=\"_blank\">Monitoring Amazon EC2</a><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html\" target=\"_blank\">Instance Metadata and User Data</a><br>\n<a href=\"http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html\" target=\"_blank\">Amazon CloudWatch Developer Guide</a><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">Auto Scaling Developer Guide</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Region/AZ",
+ "Instance ID",
+ "Instance Name",
+ "Instance Type",
+ "Estimated Monthly Savings",
+ "Day 1",
+ "Day 2",
+ "Day 3",
+ "Day 4",
+ "Day 5",
+ "Day 6",
+ "Day 7",
+ "Day 8",
+ "Day 9",
+ "Day 10",
+ "Day 11",
+ "Day 12",
+ "Day 13",
+ "Day 14",
+ "14-Day Average CPU Utilization",
+ "14-Day Average Network I/O",
+ "Number of Days Low Utilization"
+ ]
+ },
+ {
+ "id": "hjLMh88uM8",
+ "name": "Idle Load Balancers",
+ "description": "Checks your Elastic Load Balancing configuration for load balancers that are not actively used. Any load balancer that is configured accrues charges. If a load balancer has no associated back-end instances or if network traffic is severely limited, the load balancer is not being used effectively.<br />\n<br />\n<b>Alert Criteria</b><br />\nYellow: A load balancer has no active back-end instances.<br />\nYellow: A load balancer has no healthy back-end instances.<br />\nYellow: A load balancer has had less than 100 requests per day for the last 7 days.<br />\n<br />\n<b>Recommended Action</b><br />\nIf your load balancer has no active back-end instances, consider registering instances or deleting your load balancer. See <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_DeReg_Reg_Instances.html#RegisteringInstances\" target=\"_blank\">Registering Your Amazon EC2 Instances with Your Load Balancer</a> or <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_EndLoadBalancing02.html\" target=\"_blank\">Delete Your Load Balancer</a>.<br />\nIf your load balancer has no healthy back-end instances, see <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-healthcheck.html\" target=\"_blank\">Troubleshooting Elastic Load Balancing: Health Check Configuration</a>.<br />\nIf your load balancer has had a low request count, consider deleting your load balancer. See <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_EndLoadBalancing02.html\" target=\"_blank\">Delete Your Load Balancer</a>.<br />\n<br />\n<b>Additional Resources</b><br />\n<a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/UserScenarios.html\" target=\"_blank\">Managing Load Balancers</a><br />\n<a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-troubleshooting.html\" target=\"_blank\">Troubleshoot Elastic Load Balancing</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "Reason",
+ "Estimated Monthly Savings"
+ ]
+ },
+ {
+ "id": "DAvU99Dc4C",
+ "name": "Underutilized Amazon EBS Volumes",
+ "description": "Checks Amazon Elastic Block Store (Amazon EBS) volume configurations and warns when volumes appear to be underused. Charges begin when a volume is created. If a volume remains unattached or has very low write activity (excluding boot volumes) for a period of time, the volume is probably not being used.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A volume is unattached or had less than 1 IOPS per day for the past 7 days.<br>\n<br>\n<b>Recommended Action</b><br>\nConsider creating a snapshot and deleting the volume to reduce costs. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html\" target=\"_blank\">Creating an Amazon EBS Snapshot</a> and <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-deleting-volume.html\" target=\"_blank\">Deleting an Amazon EBS Volume</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html\" target=\"_blank\">Amazon Elastic Block Store (Amazon EBS)</a><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-volume-status.html\" target=\"_blank\">Monitoring the Status of Your Volumes</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Region",
+ "Volume ID",
+ "Volume Name",
+ "Volume Type",
+ "Volume Size",
+ "Monthly Storage Cost",
+ "Snapshot ID",
+ "Snapshot Name",
+ "Snapshot Age"
+ ]
+ },
+ {
+ "id": "Z4AUBRNSmz",
+ "name": "Unassociated Elastic IP Addresses",
+ "description": "Checks for Elastic IP addresses (EIPs) that are not associated with a running Amazon Elastic Compute Cloud (Amazon EC2) instance. EIPs are static IP addresses designed for dynamic cloud computing. Unlike traditional static IP addresses, EIPs can mask the failure of an instance or Availability Zone by remapping a public IP address to another instance in your account. A nominal charge is imposed for an EIP that is not associated with a running instance.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An allocated Elastic IP address (EIP) is not associated with a running Amazon EC2 instance.<br>\n<br>\n<b>Recommended Action</b><br>\nAssociate the EIP with a running active instance, or release the unassociated EIP. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-associating-different\" target=\"_blank\">Associating an Elastic IP Address with a Different Running Instance</a> and <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-releasing\" target=\"_blank\">Releasing an Elastic IP Address</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html\" target=\"_blank\">Elastic IP Addresses</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Region",
+ "IP Address"
+ ]
+ },
+ {
+ "id": "HCP4007jGY",
+ "name": "Security Groups - Specific Ports Unrestricted",
+ "description": "Checks security groups for rules that allow unrestricted access (0.0.0.0/0) to specific ports. Unrestricted access increases opportunities for malicious activity (hacking, denial-of-service attacks, loss of data). The ports with highest risk are flagged red, and those with less risk are flagged yellow. Ports flagged green are typically used by applications that require unrestricted access, such as HTTP and SMTP.\n<br>\nIf you have intentionally configured your security groups in this manner, we recommend using additional security measures to secure your infrastructure (such as IP tables).\n<br>\n<br>Note: Security groups created by AWS Directory Services are flagged as red or yellow, but do not pose a security risk and can be safely ignored or suppressed. Refer to <a href=\"https://aws.amazon.com/premiumsupport/faqs/#AWS_Trusted_Advisor\" target=\"_blank\">Trusted Advisor FAQ</a> for more details.\n<br>\n<br>\n<b>Alert Criteria</b>\n<br>\nGreen: Access to port 80, 25, 443, or 465 is unrestricted.<br>\nRed: Access to port 20, 21, 1433, 1434, 3306, 3389, 4333, 5432, or 5500 is unrestricted.<br>\nYellow: Access to any other port is unrestricted.\n<br>\n<br>\n<b>Recommended Action</b>\n<br>\nRestrict access to only those IP addresses that require it. To restrict access to a specific IP address, set the suffix to /32 (for example, 192.0.2.10/32). Be sure to delete overly permissive rules after creating rules that are more restrictive.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html\" target=\"_blank\">Amazon EC2 Security Groups</a><br>\n<a href=\"http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers\" target=\"_blank\">List of TCP and UDP port numbers</a> (Wikipedia)<br>\n<a href=\"http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\" target=\"_blank\">Classless Inter-Domain Routing</a> (Wikipedia)",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "Security Group Name",
+ "Security Group ID",
+ "Protocol",
+ "Status",
+ "Ports"
+ ]
+ },
+ {
+ "id": "1iG5NDGVre",
+ "name": "Security Groups - Unrestricted Access",
+ "description": "Checks security groups for rules that allow unrestricted access to a resource. Unrestricted access increases opportunities for malicious activity (hacking, denial-of-service attacks, loss of data).\n<br>\n<br>Note: Security groups created by AWS Directory Services are flagged as red, but do not pose a security risk and can be safely ignored or suppressed. Refer to <a href=\"https://aws.amazon.com/premiumsupport/faqs/#AWS_Trusted_Advisor\" target=\"_blank\">Trusted Advisor FAQ</a> for more details.\n<br>\n<br>\n<b>Alert Criteria</b>\n<br>\nRed: A security group rule has a source IP address with a /0 suffix for ports other than 25, 80, or 443.\n<br>\n<br>\n<b>Recommended Action</b>\n<br>\nRestrict access to only those IP addresses that require it. To restrict access to a specific IP address, set the suffix to /32 (for example, 192.0.2.10/32). Be sure to delete overly permissive rules after creating rules that are more restrictive.\n<br>\n<br>\n<b>Additional Resources</b>\n<br><a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html\" target=\"_blank\">Amazon EC2 Security Groups</a><br>\n<a href=\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\" target=\"_blank\">Classless Inter-Domain Routing</a> (Wikipedia)",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "Security Group Name",
+ "Security Group ID",
+ "Protocol",
+ "Port",
+ "Status",
+ "IP Range"
+ ]
+ },
+ {
+ "id": "zXCkfM1nI3",
+ "name": "IAM Use",
+ "description": "Checks for your use of AWS Identity and Access Management (IAM). You can use IAM to create users, groups, and roles in AWS, and you can use permissions to control access to AWS resources. \n<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: No IAM users have been created for this account.\n<br>\n<br>\n<b>Recommended Action</b><br>\nCreate one or more IAM users and groups in your account. You can then create additional users whose permissions are limited to perform specific tasks in your AWS environment. For more information, see <a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMGettingStarted.html\" target=\"_blank\">Getting Started</a>. \n<br><br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html\" target=\"_blank\">What Is IAM?</a>",
+ "category": "security",
+ "metadata": []
+ },
+ {
+ "id": "Pfx0RwqBli",
+ "name": "Amazon S3 Bucket Permissions",
+ "description": "Checks buckets in Amazon Simple Storage Service (Amazon S3) that have open access permissions or allow access to any authenticated AWS user. Bucket permissions that grant List access can result in higher than expected charges if objects in the bucket are listed by unintended users at a high frequency. Bucket permissions that grant Upload/Delete access create potential security vulnerabilities by allowing users that to add, modify, or remove items in a bucket.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: The bucket ACL allows List access for \"Everyone\" or \"Any Authenticated AWS User\".<br>\nYellow: A bucket policy allows any kind of open access.<br>\nYellow: Bucket policy has statements that grant public access. The “Block public and cross-account access to buckets that have public policies” setting is turned on and has restricted access to only authorized users of that account until public statements are removed.<br>\nYellow: Trusted Advisor does not have permission to check the policy, or the policy could not be evaluated for other reasons.<br>\nRed: The bucket ACL allows Upload/Delete access for \"Everyone\" or \"Any Authenticated AWS User\".<br>\n<br>\n<b>Recommended Action</b><br>\nIf a bucket allows open access, determine if open access is truly needed. If not, update the bucket permissions to restrict access to the owner or specific users. Use Amazon S3 Block Public Access to control the settings that allow public access to your data. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-permissions.html\" target=\"_blank\">Setting Bucket and Object Access Permissions</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html\" target=\"_blank\">Managing Access Permissions to Your Amazon S3 Resources</a>",
+ "category": "security",
+ "metadata": [
+ "Region Name",
+ "Region API Parameter",
+ "Bucket Name",
+ "ACL Allows List",
+ "ACL Allows Upload/Delete",
+ "Status",
+ "Policy Allows Access",
+ "Ignored Bucket Name"
+ ]
+ },
+ {
+ "id": "7DAFEmoDos",
+ "name": "MFA on Root Account",
+ "description": "Checks the root account and warns if multi-factor authentication (MFA) is not enabled. For increased security, we recommend that you protect your account by using MFA, which requires a user to enter a unique authentication code from their MFA hardware or virtual device when interacting with the AWS console and associated websites.\n<br>\n<br>\n<b>Alert Criteria</b><br>\nRed: MFA is not enabled on the root account.\n<br>\n<br>\n<b>Recommended Action</b><br>\nLog in to your root account and activate an MFA device. See <a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/MFADeviceStatus.html\" target=\"_blank\">Checking MFA Status</a> and <a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/MFADeviceSetup.html\" target=\"_blank\">Setting Up an MFA Device</a>.\n<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingMFA.html\" target=\"_blank\">Using Multi-Factor Authentication (MFA) Devices with AWS</a>",
+ "category": "security",
+ "metadata": []
+ },
+ {
+ "id": "Yw2K9puPzl",
+ "name": "IAM Password Policy",
+ "description": "Checks the password policy for your account and warns when a password policy is not enabled, or if password content requirements have not been enabled. Password content requirements increase the overall security of your AWS environment by enforcing the creation of strong user passwords. When you create or change a password policy, the change is enforced immediately for new users but does not require existing users to change their passwords. \n<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A password policy is enabled, but at least one content requirement is not enabled. \n<br>\nRed: No password policy is enabled. \n<br>\n<br>\n<b>Recommended Action</b><br>\nIf some content requirements are not enabled, consider enabling them. If no password policy is enabled, create and configure one. See <a href=\"http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingPasswordPolicies.html\" target=\"_blank\">Setting an Account Password Policy for IAM Users</a>. \n<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/IAM/latest/UserGuide/Credentials-ManagingPasswords.html\" target=\"_blank\">Managing Passwords</a>",
+ "category": "security",
+ "metadata": [
+ "Password Policy",
+ "Uppercase",
+ "Lowercase",
+ "Number",
+ "Non-alphanumeric",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "nNauJisYIT",
+ "name": "Amazon RDS Security Group Access Risk",
+ "description": "Checks security group configurations for Amazon Relational Database Service (Amazon RDS) and warns when a security group rule might grant overly permissive access to your database. Recommended configuration for any security group rule is to allow access from specific Amazon Elastic Compute Cloud (Amazon EC2) security groups or from a specific IP address. Data for Amazon Relational Database Service (Amazon RDS) instances created in the Asia Pacific (Seoul) region (sa-east-1) is not available. We are working to fix this issue as soon as possible.\n<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A DB security group rule references an Amazon EC2 security group that grants global access on one of these ports: 20, 21, 22, 1433, 1434, 3306, 3389, 4333, 5432, 5500.\n<br>\nYellow: A DB security group rule grants access to more than a single IP address (the CIDR rule suffix is not /0 or /32).\n<br>\nRed: A DB security group rule grants global access (the CIDR rule suffix is /0).\n<br>\n<br>\n<b>Recommended Action</b><br>\nReview your security group rules and restrict access to authorized IP addresses or IP ranges. To edit a security group, use the <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AuthorizeDBSecurityGroupIngress.html\" target=\"_blank\">AuthorizeDBSecurityGroupIngress</a> API or the AWS Management Console. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithSecurityGroups.html\" target=\"_blank\">Working with DB Security Groups</a>.\n<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html\" target=\"_blank\">Amazon RDS Security Groups</a><br>\n<a href=\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\" target=\"_blank\">Classless Inter-Domain Routing</a><br>\n<a href=\"https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers\" target=\"_blank\">List of TCP and UDP port numbers</a>",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "RDS Security Group Name",
+ "Ingress Rule",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "H7IgTzjTYb",
+ "name": "Amazon EBS Snapshots",
+ "description": "Checks the age of the snapshots for your Amazon Elastic Block Store (Amazon EBS) volumes (available or in-use). Even though Amazon EBS volumes are replicated, failures can occur. Snapshots are persisted to Amazon Simple Storage Service (Amazon S3) for durable storage and point-in-time recovery.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: The most recent volume snapshot is between 7 and 30 days old.<br>\nRed: The most recent volume snapshot is more than 30 days old.<br>\nRed: The volume does not have a snapshot.<br>\n<br>\n<b>Recommended Action</b><br>\nCreate weekly or monthly snapshots of your volumes. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html\" target=\"_blank\">Creating an Amazon EBS Snapshot</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html\" target=\"_blank\">Amazon Elastic Block Store (Amazon EBS)</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Volume ID",
+ "Volume Name",
+ "Snapshot ID",
+ "Snapshot Name",
+ "Snapshot Age",
+ "Volume Attachment",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "wuy7G1zxql",
+ "name": "Amazon EC2 Availability Zone Balance",
+ "description": "Checks the distribution of Amazon Elastic Compute Cloud (Amazon EC2) instances across Availability Zones in a region. Availability Zones are distinct locations that are designed to be insulated from failures in other Availability Zones and to provide inexpensive, low-latency network connectivity to other Availability Zones in the same region. By launching instances in multiple Availability Zones in the same region, you can help protect your applications from a single point of failure.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: The region has instances in multiple zones, but the distribution is uneven (the difference between the highest and lowest instance counts in utilized Availability Zones is greater than 20%).<br>\nRed: The region has instances only in a single Availability Zone.<br>\n<br>\n<b>Recommended Action</b><br>\nBalance your Amazon EC2 instances evenly across multiple Availability Zones. You can do this by launching instances manually or by using Auto Scaling to do it automatically. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html\" target=\"_blank\">Launch Your Instance</a> and <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/US_SetUpASLBApp.html\" target=\"_blank\">Load Balance Your Auto Scaling Group</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/GettingStartedGuide/Welcome.html\" target=\"_blank\">Auto Scaling Getting Started Guide</a><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">Auto Scaling Developer Guide</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Instances in Zone a",
+ "Instances in Zone b",
+ "Instances in Zone c",
+ "Instances in Zone d",
+ "Instances in Zone e",
+ "Instances in Zone f",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "iqdCTZKCUp",
+ "name": "Load Balancer Optimization",
+ "description": "Checks your load balancer configuration. To help increase the level of fault tolerance in Amazon Elastic Compute Cloud (EC2) when using Elastic Load Balancing, we recommend running an equal number of instances across multiple Availability Zones in a region. A load balancer that is configured accrues charges, so this is a cost-optimization check as well.<br/>\n<br/>\n<b>Alert Criteria</b><br/>\nYellow: A load balancer is enabled for a single Availability Zone.<br/>\nYellow: A load balancer is enabled for an Availability Zone that has no active instances.<br/>\nYellow: The Amazon EC2 instances that are registered with a load balancer are unevenly distributed across Availability Zones. (The difference between the highest and lowest instance counts in utilized Availability Zones is more than 1, and the difference is more than 20% of the highest count.)<br/>\n<br/>\n<b>Recommended Action</b><br/>\nEnsure that your load balancer points to active and healthy instances in at least two Availability Zones. For more information, see <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-az.html#US_AddLBAvailabilityZone\" target=\"_blank\">Add Availability Zone</a>.<br/>\nIf your load balancer is configured for an Availability Zone with no healthy instances, or if there is an imbalance of instances across the Availability Zones, determine if all the Availability Zones are necessary. Omit any unnecessary Availability Zones and ensure there is a balanced distribution of instances across the remaining Availability Zones. For more information, see <a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-az.html#US_ShrinkLBApp04\" target=\"_blank\">Remove Availability Zone</a>.<br/>\n<br/>\n<b>Additional Resources</b><br/>\n<a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#AZ-Region\" target=\"_blank\">Availability Zones and Regions</a><br/>\n<a href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/UserScenarios.html\" target=\"_blank\">Managing Load Balancers</a><br/>\n<a href=\"http://aws.amazon.com/articles/1636185810492479\" target=\"_blank\">Best Practices in Evaluating Elastic Load Balancing</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "# of Zones",
+ "Instances in Zone a",
+ "Instances in Zone b",
+ "Instances in Zone c",
+ "Instances in Zone d",
+ "Instances in Zone e",
+ "Instances in Zone f",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "S45wrEXrLz",
+ "name": "VPN Tunnel Redundancy",
+ "description": "Checks the number of tunnels that are active for each of your VPNs. A VPN should have two tunnels configured at all times to provide redundancy in case of outage or planned maintenance of the devices at the AWS endpoint. For some hardware, only one tunnel is active at a time (see the <a href=\"http://docs.aws.amazon.com/AmazonVPC/latest/NetworkAdminGuide/Welcome.html\" target=\"_blank\">Amazon Virtual Private Cloud Network Administrator Guide</a>). If a VPN has no active tunnels, charges for the VPN might still apply.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A VPN has one active tunnel (this is normal for some hardware).<br>\nYellow: A VPN has no active tunnels.<br>\n<br>\n<b>Recommended Action</b><br>\nBe sure that two tunnels are configured for your VPN connection, and that both are active if your hardware supports it. If you no longer need a VPN connection, you can delete it to avoid charges. For more information, see <a href=\"http://docs.aws.amazon.com/AmazonVPC/latest/NetworkAdminGuide/Introduction.html\" target=\"_blank\">Your Customer Gateway</a> or <a href=\"http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_VPN.html#delete-vpn\" target=\"_blank\">Deleting a VPN connection</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AmazonVPC/latest/NetworkAdminGuide/Welcome.html\" target=\"_blank\">Amazon Virtual Private Cloud Network Administrator Guide</a><br>\n<a href=\"http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_VPN.html\" target=\"_blank\">Adding a Hardware Virtual Private Gateway to Your VPC</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "VPN ID",
+ "VPC",
+ "Virtual Private Gateway",
+ "Customer Gateway",
+ "Active Tunnels",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "ZRxQlPsb6c",
+ "name": "High Utilization Amazon EC2 Instances",
+ "description": "Checks the Amazon Elastic Compute Cloud (Amazon EC2) instances that were running at any time during the last 14 days and alerts you if the daily CPU utilization was more than 90% on 4 or more days. Consistent high utilization can indicate optimized, steady performance, but it can also indicate that an application does not have enough resources. To get daily CPU utilization data, download the report for this check.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An instance had more than 90% daily average CPU utilization on at least 4 of the previous 14 days.\n<br><br>\n<b>Recommended Action</b><br>\nConsider adding more instances. For information about scaling the number of instances based on demand, see <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">What is Auto Scaling?</a>\n<br><br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-monitoring.html\" target=\"_blank\">Monitoring Amazon EC2</a><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html\" target=\"_blank\">Instance Metadata and User Data</a><br>\n<a href=\"http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html\" target=\"_blank\">Amazon CloudWatch Developer Guide</a><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">Auto Scaling Developer Guide</a>",
+ "category": "performance",
+ "metadata": [
+ "Region/AZ",
+ "Instance ID",
+ "Instance Name",
+ "Instance Type",
+ "Day 1",
+ "Day 2",
+ "Day 3",
+ "Day 4",
+ "Day 5",
+ "Day 6",
+ "Day 7",
+ "Day 8",
+ "Day 9",
+ "Day 10",
+ "Day 11",
+ "Day 12",
+ "Day 13",
+ "Day 14",
+ "14-Day Average CPU Utilization",
+ "Number of Days over 90% CPU Utilization"
+ ]
+ },
+ {
+ "id": "8CNsSllI5v",
+ "name": "Auto Scaling Group Resources",
+ "description": "Checks the availability of resources associated with launch configurations and your Auto Scaling groups. Auto Scaling groups that point to unavailable resources cannot launch new Amazon Elastic Compute Cloud (Amazon EC2) instances. When properly configured, Auto Scaling causes the number of Amazon EC2 instances to increase seamlessly during demand spikes and decrease automatically during demand lulls. Auto Scaling groups and launch configurations that point to unavailable resources do not operate as intended.<br>\n<br>\n<b>Alert Criteria</b><br>\nRed: An Auto Scaling group is associated with a deleted load balancer.<br>\nRed: A launch configuration is associated with a deleted Amazon Machine Image (AMI).<br>\n<br>\n<b>Recommended Action</b><br>\nIf the load balancer has been deleted, either create a new load balancer and then create a new Auto Scaling group with the new load balancer, or create a new Auto Scaling group without the load balancer. For information about creating a new Auto Scaling group with a new load balancer, see <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-register-lbs-with-asg.html\" target=\"_blank\">Set Up an Auto-Scaled and Load-Balanced Application</a>. For information about creating a new Auto Scaling group without a load balancer, see \"Create Auto Scaling Group\" in <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/USBasicSetup-Console.html\" target=\"_blank\">Getting Started With Auto Scaling Using the Console</a>.<br>\nIf the AMI has been deleted, create a new launch configuration using a valid AMI and associate it with an Auto Scaling group. See \"Create Launch Configuration\" in <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/USBasicSetup-Console.html\" target=\"_blank\">Getting Started With Auto Scaling Using the Console</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ts-as-ami.html\" target=\"_blank\">Troubleshooting Auto Scaling: Amazon EC2 AMIs</a><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ts-as-loadbalancer.html\" target=\"_blank\">Troubleshooting Auto Scaling: Load Balancer Configuration</a><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">Auto Scaling Developer Guide</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Auto Scaling Group Name",
+ "Launch Configuration Name",
+ "Launch Type",
+ "Launch Name",
+ "Resource Type",
+ "Resource Name",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "opQPADkZvH",
+ "name": "Amazon RDS Backups",
+ "description": "Checks for automated backups of Amazon RDS DB instances. By default, backups are enabled with a retention period of 1 day. Backups reduce the risk of unexpected data loss and allow for point-in-time recovery. Data for Amazon Relational Database Service (Amazon RDS) instances created in the Asia Pacific (Seoul) region (sa-east-1) is not available. We are working to fix this issue as soon as possible.<br>\n<br>\n<b>Alert Criteria</b><br>\nRed: A DB instance has the backup retention period set to 0 days.<br>\n<br>\n<b>Recommended Action</b><br>\nSet the retention period for the automated DB instance backup to 1 to 35 days as appropriate to the requirements of your application. See <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html\" target=\"_blank\">Working With Automated Backups</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.html\" target=\"_blank\">Getting Started with Amazon RDS</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region/AZ",
+ "DB Instance",
+ "VPC ID",
+ "Backup Retention Period",
+ "Status"
+ ]
+ },
+ {
+ "id": "f2iK5R6Dep",
+ "name": "Amazon RDS Multi-AZ",
+ "description": "Checks for DB instances that are deployed in a single Availability Zone. Multi-AZ deployments enhance database availability by synchronously replicating to a standby instance in a different Availability Zone. During planned database maintenance or the failure of a DB instance or Availability Zone, Amazon RDS automatically fails over to the standby so that database operations can resume quickly without administrative intervention. Because Multi-AZ deployments for the SQL Server engine use a different mechanism for synchronization, this check does not examine SQL Server instances. <br>Data for Amazon Relational Database Service (Amazon RDS) instances created in the Asia Pacific (Seoul) region (sa-east-1) is not available. We are working to fix this issue as soon as possible.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A DB instance is deployed in a single Availability Zone.<br>\n<br>\n<b>Recommended Action</b><br>\nIf your application requires high availability, modify your DB instance to enable Multi-AZ deployment. See <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html\" target=\"_blank\">High Availability (Multi-AZ)</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html\" target=\"_blank\">Regions and Availability Zones</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region/AZ",
+ "DB Instance",
+ "VPC ID",
+ "Multi-AZ",
+ "Status"
+ ]
+ },
+ {
+ "id": "CLOG40CDO8",
+ "name": "Auto Scaling Group Health Check",
+ "description": "Examines the health check configuration for Auto Scaling groups. If Elastic Load Balancing is being used for an Auto Scaling group, the recommended configuration is to enable an Elastic Load Balancing health check. If an Elastic Load Balancing health check is not used, Auto Scaling can only act upon the health of the Amazon Elastic Compute Cloud (Amazon EC2) instance and not on the application that is running on the instance.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An Auto Scaling group has an associated load balancer, but the Elastic Load Balancing health check is not enabled.<br>\nYellow: An Auto Scaling group does not have an associated load balancer, but the Elastic Load Balancing health check is enabled.<br>\n<br>\n<b>Recommended Action</b><br>\nIf the Auto Scaling group has an associated load balancer, but the Elastic Load Balancing health check is not enabled, see <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-add-elb-healthcheck.html\" target=\"_blank\">Add an Elastic Load Balancing Health Check to your Auto Scaling Group</a>.<br>\nIf the Elastic Load Balancing health check is enabled, but no load balancer is associated with the Auto Scaling group, see <a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-register-lbs-with-asg.html\" target=\"_blank\">Set Up an Auto-Scaled and Load-Balanced Application</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html\" target=\"_blank\">Auto Scaling Developer Guide</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Auto Scaling Group Name",
+ "Load Balancer Associated",
+ "Health Check",
+ "Status"
+ ]
+ },
+ {
+ "id": "BueAdJ7NrP",
+ "name": "Amazon S3 Bucket Logging",
+ "description": "Checks the logging configuration of Amazon Simple Storage Service (Amazon S3) buckets. When server access logging is enabled, detailed access logs are delivered hourly to a bucket that you choose. An access log record contains details about each request, such as the request type, the resources specified in the request, and the time and date the request was processed. By default, bucket logging is not enabled; you should enable logging if you want to perform security audits or learn more about users and usage patterns.<br /><br/>\nWhen logging is initially enabled, the configuration is automatically validated; however, future modifications can result in logging failures. This check examines explicit Amazon S3 bucket permissions, but it does not examine associated bucket policies that might override the bucket permissions.<br/>\n<br />\n<b>Alert Criteria</b><br />\nYellow: The bucket does not have server access logging enabled.<br/>\nYellow: The target bucket permissions do not include the root account, so Trusted Advisor cannot check it.<br/>\nRed: The target bucket does not exist.<br />\nRed: The target bucket and the source bucket have different owners.<br />\nRed: The log deliverer does not have write permissions for the target bucket.<br />\n<br />\n<b>Recommended Action</b><br />\nEnable bucket logging for most buckets. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/enable-logging-console.html\" target=\"_blank\">Enabling Logging Using the Console</a> and <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/enable-logging-programming.html\" target=\"_blank\">Enabling Logging Programmatically</a>. <br/>\nIf the target bucket permissions do not include the root account and you want Trusted Advisor to check the logging status, add the root account as a grantee. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingBucketPermissions.html\" target=\"_blank\">Editing Bucket Permissions</a>.<br/>\nIf the target bucket does not exist, select an existing bucket as a target or create a new one and select it. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/ManagingBucketLogging.html\" target=\"_blank\">Managing Bucket Logging</a>.<br/>\nIf the target and source have different owners, change the target bucket to one that has the same owner as the source bucket. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/ManagingBucketLogging.html\" target=\"_blank\">Managing Bucket Logging</a>.<br/>\nIf the log deliverer does not have write permissions for the target (Write not enabled), grant Upload/Delete permissions to the Log Delivery group. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingBucketPermissions.html\" target=\"_blank\">Editing Bucket Permissions</a>.\n<br />\n<br />\n<b>Additional Resources</b><br />\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/BucketOperations.html\" target=\"_blank\">Working with Buckets</a><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerLogs.html\" target=\"_blank\">Server Access Logging</a><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/LogFormat.html\" target=\"_blank\">Server Access Log Format</a><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/deleting-log-files-lifecycle.html\" target=\"_blank\">Deleting Log Files</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Bucket Name",
+ "Target Name",
+ "Target Exists",
+ "Same Owner",
+ "Write Enabled",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "PPkZrjsH2q",
+ "name": "Amazon EBS Provisioned IOPS (SSD) Volume Attachment Configuration",
+ "description": "Checks for Provisioned IOPS (SSD) volumes that are attached to an Amazon EBS-optimizable Amazon Elastic Compute Cloud (Amazon EC2) instance that is not EBS-optimized. Provisioned IOPS (SSD) volumes in the Amazon Elastic Block Store (Amazon EBS) are designed to deliver the expected performance only when they are attached to an EBS-optimized instance.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An Amazon EC2 instance that can be EBS-optimized has an attached Provisioned IOPS (SSD) volume but the instance is not EBS-optimized.<br>\n<br>\n<b>Recommended Action</b><br>\nCreate a new instance that is EBS-optimized, detach the volume, and reattach the volume to your new instance. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html\" target=\"_blank\">Amazon EBS-Optimized Instances</a> and <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html\" target=\"_blank\">Attaching an Amazon EBS Volume to an Instance</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html\" target=\"_blank\">Amazon EBS Volume Types</a><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSPerformance.html\" target=\"_blank\">Amazon EBS Volume Performance</a>",
+ "category": "performance",
+ "metadata": [
+ "Region/AZ",
+ "Volume ID",
+ "Volume Name",
+ "Volume Attachment",
+ "Instance ID",
+ "Instance Type",
+ "EBS Optimized",
+ "Status"
+ ]
+ },
+ {
+ "id": "tfg86AVHAZ",
+ "name": "Large Number of Rules in an EC2 Security Group",
+ "description": "Checks each Amazon Elastic Compute Cloud (EC2) security group for an excessive number of rules. If a security group has a large number of rules, performance can be degraded.\n<br>\nFor more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html\" target=\"_blank\">Amazon EC2 Security Groups</a>.\n<br>\n<br>\n<b>Alert Criteria</b>\n<br>\nYellow: An Amazon EC2-VPC security group has more than 50 rules.\n<br>\nYellow: An Amazon EC2-Classic security group has more than 100 rules.\n<br>\n<br>\n<b>Recommended Action</b>\n<br>\nReduce the number of rules in a security group by deleting unnecessary or overlapping rules. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#deleting-security-group-rule\" target=\"_blank\">Deleting Rules from a Security Group</a>.\n<br>\n<br>\n<b>Additional Resources</b>\n<br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#concepts-security\" target=\"_blank\">Amazon EC2 Security Groups</a>",
+ "category": "performance",
+ "metadata": [
+ "Region",
+ "Security Group Name",
+ "Group ID",
+ "Description",
+ "Instance Count",
+ "VPC ID",
+ "Total Inbound Rules",
+ "Total Outbound Rules"
+ ]
+ },
+ {
+ "id": "j3DFqYTe29",
+ "name": "Large Number of EC2 Security Group Rules Applied to an Instance",
+ "description": "Checks for Amazon Elastic Compute Cloud (EC2) instances that have a large number of security group rules. Performance can be degraded if an instance has a large number of rules.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: An Amazon EC2-VPC instance has more than 50 security group rules.<br>\nYellow: An Amazon EC2-Classic instance has more than 100 security group rules.<br>\n<br>\n<b>Recommended Action</b><br>\nReduce the number of rules associated with an instance by deleting unnecessary or overlapping rules. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#deleting-security-group-rule\" target=\"_blank\">Deleting Rules from a Security Group</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#concepts-security\" target=\"_blank\">Amazon EC2 Security Groups</a>",
+ "category": "performance",
+ "metadata": [
+ "Region",
+ "Instance ID",
+ "Instance Name",
+ "VPC ID",
+ "Total Inbound Rules",
+ "Total Outbound Rules"
+ ]
+ },
+ {
+ "id": "Ti39halfu8",
+ "name": "Amazon RDS Idle DB Instances",
+ "description": "Checks the configuration of your Amazon Relational Database Service (Amazon RDS) for any DB instances that appear to be idle. If a DB instance has not had a connection for a prolonged period of time, you can delete the instance to reduce costs. If persistent storage is needed for data on the instance, you can use lower-cost options such as taking and retaining a DB snapshot. Manually created DB snapshots are retained until you delete them. Data for Amazon RDS instances created in the Asia Pacific (Seoul) region (sa-east-1) is not available. We are working to fix this issue as soon as possible.<br> \n<br> \n<b>Alert Criteria</b><br> \nYellow: An active DB instance has not had a connection in the last 7 days.<br> \n<br> \n<b>Recommended Action</b><br> \nConsider taking a snapshot of the idle DB instance and then either stopping it or deleting it. Stopping the DB instance removes some of the costs for it, but does not remove storage costs. A stopped instance keeps all automated backups based upon the configured retention period. Stopping a DB instance usually incurs additional costs when compared to deleting the instance and then retaining only the final snapshot. See <href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_StopInstance.html\" an Amazon RDS DB Instance Temporarily</a> and <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html\" target=\"_blank\">Deleting a DB Instance with a Final Snapshot</a>.<br> \n<br> \n<b>Additional Resources</b><br> \n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.BackupRestore.html\" target=\"_blank\">Back Up and Restore</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Region",
+ "DB Instance Name",
+ "Multi-AZ",
+ "Instance Type",
+ "Storage Provisioned (GB)",
+ "Days Since Last Connection",
+ "Estimated Monthly Savings (On Demand)"
+ ]
+ },
+ {
+ "id": "B913Ef6fb4",
+ "name": "Amazon Route 53 Alias Resource Record Sets",
+ "description": "Checks for resource record sets that can be changed to alias resource record sets to improve performance and save money. An alias resource record set routes DNS queries to an AWS resource (for example, an Elastic Load Balancing load balancer or an Amazon S3 bucket) or to another Route 53 resource record set. When you use alias resource record sets, Route 53 routes your DNS queries to AWS resources free of charge.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A resource record set is a CNAME to an Amazon S3 website.<br>\nYellow: A resource record set is a CNAME to an Amazon CloudFront distribution.<br>\nYellow: A resource record set is a CNAME to an Elastic Load Balancing load balancer.<br>\n<br>\n<b>Recommended Action</b><br>\nReplace the listed CNAME resource record sets with alias resource record sets; see <a href=\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html\" target=\"_blank\">Choosing Between Alias and Non-Alias Resource Record Sets</a>. You also need to change the record type from CNAME to A or AAAA, depending on the AWS resource; see <a href=\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values.html\" target=\"_blank\">Values that You Specify When You Create or Edit Amazon Route 53 Resource Record Sets</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-aws-resources.html\" target=\"_blank\">Routing Queries to AWS Resources</a>",
+ "category": "performance",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Resource Record Set Type",
+ "Resource Record Set Identifier",
+ "Alias Target",
+ "Status"
+ ]
+ },
+ {
+ "id": "cF171Db240",
+ "name": "Amazon Route 53 Name Server Delegations",
+ "description": "Checks for Amazon Route 53 hosted zones for which your domain registrar or DNS is not using the correct Route 53 name servers. When you create a hosted zone, Route 53 assigns a delegation set of four name servers. The names of these servers are ns-###.awsdns-##.com, .net, .org, and .co.uk, where ### and ## typically represent different numbers. Before Route 53 can route DNS queries for your domain, you must update your registrar's name server configuration to remove the name servers that the registrar assigned and add all four name servers in the Route 53 delegation set. For maximum availability, you must add all four Route 53 name servers.<br/>\n<br/>\n<b>Alert Criteria</b><br/>\nYellow: A hosted zone for which the registrar for your domain does not use all four of the Route 53 name servers in the delegation set.<br/>\n<br/>\n<b>Recommended Action</b><br/>\nAdd or update name server records with your registrar or with the current DNS service for your domain to include all four of the name servers in your Route 53 delegation set. To find these values, see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/GetInfoAboutHostedZone.html\" target=\"_blank\">Getting the Name Servers for a Hosted Zone</a>. For information about adding or updating name server records, see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/creating-migrating.html\" target=\"_blank\">Creating and Migrating Domains and Subdomains to Amazon Route&nbsp;53</a>.<br/>\n<br/>\n<b>Additional Resources</b><br/>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html\" target=\"_blank\">Working with Hosted Zones</a> <br/>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Number of Name Server Delegations Used"
+ ]
+ },
+ {
+ "id": "C056F80cR3",
+ "name": "Amazon Route 53 High TTL Resource Record Sets",
+ "description": "Checks for resource record sets that can benefit from having a lower time-to-live (TTL) value. TTL is the number of seconds that a resource record set is cached by DNS resolvers. When you specify a long TTL, DNS resolvers take longer to request updated DNS records, which can cause unnecessary delay in rerouting traffic (for example, when DNS Failover detects and responds to a failure of one of your endpoints).<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: A resource record set whose routing policy is Failover has a TTL greater than 60 seconds.<br>\nYellow: A resource record set with an associated health check has a TTL greater than 60 seconds.<br>\n<br>\n<b>Recommended Action</b><br>\nEnter a TTL value of 60 seconds for the listed resource record sets. For more information, see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/rrsets-working-with.html\" target=\"_blank\">Working with Resource Record Sets</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\" target=\"_blank\">Amazon Route&nbsp;53 Health Checks and DNS Failover</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Resource Record Set Type",
+ "Resource Record Set ID",
+ "TTL",
+ "Status"
+ ]
+ },
+ {
+ "id": "k3J2hns32g",
+ "name": "Overutilized Amazon EBS Magnetic Volumes",
+ "description": "Checks for Amazon Elastic Block Store (EBS) Magnetic volumes that are potentially overutilized and might benefit from a more efficient configuration. A Magnetic volume is designed for applications with moderate or bursty I/O requirements, and the IOPS rate is not guaranteed. It delivers approximately 100 IOPS on average, with a best-effort ability to burst to hundreds of IOPS. For consistently higher IOPS, you can use a Provisioned IOPS (SSD) volume. For bursty IOPS, you can use a General Purpose (SSD) volume. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html\" target=\"_blank\">Amazon EBS Volume Types</a>.<br />\n<br />\nFor a list of instance types that support EBS-optimized behavior, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html\" target=\"_blank\">Amazon EBS-Optimized Instances</a>.\n<br /><br />\nTo get daily utilization metrics, download the report for this check. The detailed report shows a column for each of the last 14 days. If there is no active EBS volume, the cell is empty. If there is insufficient data to make a reliable measurement, the cell contains \"N/A\". If there is sufficient data, the cell contains the daily median and the percentage of the variance in relation to the median (for example, \"256 / 20%\").<br /><br />\n<b>Alert Criteria</b><br />\nYellow: An Amazon EBS Magnetic volume is attached to an instance that can be EBS-optimized or is part of a cluster compute network with a daily median of more than 95 IOPS, and varies by less than 10% of the median value for at least 7 of the past 14 days.<br />\n<br />\n<b>Recommended Action</b><br />\nFor consistently higher IOPS, you can use a Provisioned IOPS (SSD) volume. For bursty IOPS, you can use a General Purpose (SSD) volume. For more information, see <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html\" target=\"_blank\">Amazon EBS Volume Types</a>.<br />\n<br />\n<b>Additional Resources</b><br />\n<a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html\" target=\"_blank\">Amazon Elastic Block Store (Amazon EBS)</a>",
+ "category": "performance",
+ "metadata": [
+ "Region",
+ "Volume ID",
+ "Volume Name",
+ "Day 1",
+ "Day 2",
+ "Day 3",
+ "Day 4",
+ "Day 5",
+ "Day 6",
+ "Day 7",
+ "Day 8",
+ "Day 9",
+ "Day 10",
+ "Day 11",
+ "Day 12",
+ "Day 13",
+ "Day 14",
+ "Number of Days Over",
+ "Max Daily Median",
+ "Status"
+ ]
+ },
+ {
+ "id": "796d6f3D83",
+ "name": "CloudFront Content Delivery Optimization",
+ "description": "Checks for cases where data transfer from Amazon Simple Storage Service (Amazon S3) buckets could be accelerated by using Amazon CloudFront, the AWS global content delivery service. When you configure CloudFront to deliver your content, requests for your content are automatically routed to the nearest edge location where content is cached, so it can be delivered to your users with the best possible performance. A high ratio of data transferred out to the data stored in the bucket indicates that you could benefit from using Amazon CloudFront to deliver the data. \n<br />\nTo estimate the retrieval activity of users, only data transferred by using a GET request is counted for this check. In addition, the transfer activity from the last 24 hours is not included. \n<br />\n<br />\n<b>Alert Criteria</b><br />\nYellow: The amount of data transferred out of the bucket to your users by GET requests in the 30 days preceding the check is at least 25 times greater than the average amount of data stored in the bucket.<br/>\nRed: The amount of data transferred out of the bucket to your users by GET requests in the 30 days preceding the check is at least 10 TB and at least 25 times greater than the average amount of data stored in the bucket.\n<br />\n<br />\n<b>Recommended Action</b><br />\nConsider using CloudFront for better performance; see <a href=\"http://aws.amazon.com/cloudfront/details\" target=\"_blank\">Amazon CloudFront Product Details</a>. \n<br/>\nIf the data transferred is 10 TB per month or more, see <a href=\"http://aws.amazon.com/cloudfront/pricing\" target=\"_blank\">Amazon CloudFront Pricing</a> to explore possible cost savings.\n<br />\n<br />\n<b>Additional Resources</b><br />\n<a href=\"http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html\" target=\"_blank\">Amazon CloudFront Developer Guide</a><br/>\n<a href=\"http://aws.amazon.com/solutions/case-studies/pbs/\" target=_blank\">AWS Case Study: PBS</a>",
+ "category": "performance",
+ "metadata": [
+ "Region",
+ "Bucket Name",
+ "S3 Storage (GB)",
+ "Data Transfer Out (GB)",
+ "Ratio of Transfer to Storage",
+ "Status"
+ ]
+ },
+ {
+ "id": "51fC20e7I2",
+ "name": "Amazon Route 53 Latency Resource Record Sets",
+ "description": "Checks for Amazon Route 53 latency record sets that are configured inefficiently. To allow Amazon Route 53 to route queries to the region with the lowest network latency, you should create latency resource record sets for a particular domain name (such as example.com) in different regions. If you create only one latency resource record set for a domain name, all queries are routed to one region, and you pay extra for latency-based routing without getting the benefits.\n<br>\n<br>\n<b>Alert Criteria</b>\n<br>\nYellow: Only one latency resource record set is configured for a particular domain name.\n<br>\n<br>\n<b>Recommended Action</b>\n<br>\nIf you have resources in multiple regions, be sure to define a latency resource record set for each region; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-latency\" target=\"_blank\">Latency-Based Routing</a>.<br>\nIf you have resources in only one region, consider creating resources in more than one region and define latency resource record sets for each; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-latency\" target=\"_blank\">Latency-Based Routing</a>.<br>\nIf you don't want to use multiple regions, you should use a simple resource record set; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/rrsets-working-with.html\" target=\"_blank\">Working with Resource Record Sets</a>.\n<br>\n<br>\n<b>Additional Resources</b>\n<br>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html\" target=\"_blank\">Amazon Route 53 Developer Guide</a><br>\n<a href=\"http://aws.amazon.com/route53/pricing/\" target=\"_blank\">Amazon Route 53 Pricing</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Resource Record Set Type"
+ ]
+ },
+ {
+ "id": "c9D319e7sG",
+ "name": "Amazon Route 53 MX Resource Record Sets and Sender Policy Framework",
+ "description": "For each MX resource record set, checks for a TXT resource record set that contains a corresponding SPF value. The SPF (Sender Policy Framework) value specifies the servers that are authorized to send email for your domain. This helps reduce spam by detecting and stopping email address spoofing. (Resource record sets that use the experimental SPF type are no longer recommended.)\n<br/>\n<br/>\n<b>Alert Criteria</b>\n<br/>\nYellow: An MX resource record set does not have a TXT resource record set that contains a corresponding SPF value.\n<br/><br/>\n<b>Recommended Action</b>\n<br/>\nFor each MX resource record set, create a TXT resource record set that contains an SPF value; see <a href=\"http://www.open-spf.org/SPF_Record_Syntax\" target=\"_blank\">Sender Policy Framework: SPF Record Syntax</a> and <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/RRSchanges_console.html\" target=\"_blank\">Creating Resource Record Sets By Using the Amazon Route 53 Console</a>.\n<br/><br/>\n<b>Additional Information</b>\n<br/>\n<a href=\"http://en.wikipedia.org/wiki/Sender_Policy_Framework\" target=\"_blank\">Sender Policy Framework</a> (Wikipedia)<br/>\n<a href=\"http://en.wikipedia.org/wiki/MX_record\" target=\"_blank\">MX record</a> (Wikipedia)",
+ "category": "security",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Status"
+ ]
+ },
+ {
+ "id": "b73EEdD790",
+ "name": "Amazon Route 53 Failover Resource Record Sets",
+ "description": "Checks for Amazon Route 53 failover resource record sets that are misconfigured. When Amazon Route 53 health checks determine that the primary resource is unhealthy, Amazon Route 53 responds to queries with a secondary, backup resource record set. You must create correctly configured primary and secondary resource record sets for failover to work.\n<br/>\n<br/>\n<b>Alert Criteria</b><br/>\nYellow: A primary failover resource record set does not have a corresponding secondary resource record set.<br/>\nYellow: A secondary failover resource record set does not have a corresponding primary resource record set.<br/>\nYellow: Primary and secondary resource record sets that have the same name are associated with the same health check.\n<br/><br/>\n<b>Recommended Action</b><br/>\nIf a failover resource set is missing, create the corresponding resource record set; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/creating-failover-rrsets.html\" target=\"_blank\">Creating Failover Resource Record Sets</a>.<br/>\nIf your resource record sets are associated with the same health check, create separate health checks for each one; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-creating-deleting.html\" target=\"_blank\">Creating, Updating, and Deleting Health Checks</a>.\n<br/>\n<br/>\n<b>Additional Information</b><br/>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\" target=\"_blank\">Amazon Route 53 Health Checks and DNS Failover</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Resource Record Set Type",
+ "Reason"
+ ]
+ },
+ {
+ "id": "Cb877eB72b",
+ "name": "Amazon Route 53 Deleted Health Checks",
+ "description": "Checks for resource record sets that are associated with health checks that have been deleted. Amazon Route 53 does not prevent you from deleting a health check that is associated with one or more resource record sets. If you delete a health check without updating the associated resource record sets, the routing of DNS queries for your DNS failover configuration will not work as intended.\n<br/>\n<br/>\n<b>Alert Criteria</b><br/>\nYellow: A resource record set is associated with a health check that has been deleted.\n<br/><br/>\n<b>Recommended Action</b><br/>\nCreate a new health check and associate it with the resource record set; see <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-creating-deleting.html\" target=\"_blank\">Creating, Updating, and Deleting Health Checks</a> and <a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-adding-to-rrsets.html\" target=\"_blank\">Adding Health Checks to Resource Record Sets</a>.\n<br/>\n<br/>\n<b>Additional Information</b><br/>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\" target=\"_blank\">Amazon Route 53 Health Checks and DNS Failover</a><br/>\n<a href=\"http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-simple-configs.html\" target=\"_blank\">How Health Checks Work in Simple Amazon Route 53 Configurations</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Hosted Zone Name",
+ "Hosted Zone ID",
+ "Resource Record Set Name",
+ "Resource Record Set Type",
+ "Resource Record Set Identifier"
+ ]
+ },
+ {
+ "id": "vjafUGJ9H0",
+ "name": "AWS CloudTrail Logging",
+ "description": "Checks for your use of AWS CloudTrail. CloudTrail provides increased visibility into activity in your AWS account by recording information about AWS API calls made on the account. You can use these logs to determine, for example, what actions a particular user has taken during a specified time period or which users have taken actions on a particular resource during a specified time period. Because CloudTrail delivers log files to an Amazon Simple Storage Service (Amazon S3) bucket, CloudTrail must have write permissions for the bucket. If a trail applies to all regions (the default when creating a new trail), the trail appears multiple times in the Trusted Advisor report.<br /><br />\n<b>Alert Criteria</b><br/>\nYellow: CloudTrail reports log delivery errors for a trail.<br/>\nRed: A trail has not been created for a region, or logging is turned off for a trail.\n<br/><br/>\n<b>Recommended Action</b><br/>\nTo create a trail and start logging from the console, go to the <a href=\"https://console.aws.amazon.com/cloudtrail/home\" target=\"_blank\">AWS CloudTrail console</a>. <br/>\nTo start logging, see <a href=\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/create_trail_using_cli.html#stopstartclil\" target=\"_blank\">Stopping and Starting Logging for a Trail</a>. <br/>\nIf you receive log delivery errors, check to make sure that the bucket exists and that the necessary policy is attached to the bucket; see <a href=\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/create_trail_bucket_policy.html\" target=\"_blank\">Amazon S3 Bucket Policy</a>.\n<br/><br/>\n<b>Additional Resources</b><br />\n<a href=\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/whatisawscloudtrail.html\" target=\"_blank\">AWS CloudTrail User Guide</a><br/>\n<a href=\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_supported_regions.html\" target=\"_blank\">Supported Regions</a><br/>\n<a href=\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_supported_services.html\" target=\"_blank\">Supported Services</a>",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "Trail Name",
+ "Logging Status",
+ "Bucket Name",
+ "Last Delivery Error",
+ "Status"
+ ]
+ },
+ {
+ "id": "a2sEc6ILx",
+ "name": "ELB Listener Security",
+ "description": "Checks for load balancers with listeners that do not use recommended security configurations for encrypted communication. AWS recommends using a secure protocol (HTTPS or SSL), up-to-date security policies, and ciphers and protocols that are secure.<br/>\nWhen you use a secure protocol for a front-end connection (client to load balancer), the requests are encrypted between your clients and the load balancer, which is more secure.<br/>\nElastic Load Balancing provides predefined security policies with ciphers and protocols that adhere to AWS security best practices. New versions of predefined policies are released as new configurations become available. <br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: A load balancer has no listener that uses a secure protocol (HTTPS or SSL). <br/>\nYellow: A load balancer listener uses an outdated predefined SSL security policy. <br/>\nYellow: A load balancer listener uses a cipher or protocol that is not recommended. <br/>\nRed: A load balancer listener uses an insecure cipher or protocol.<br/><br/>\n<b>Recommended Action</b>\n<ul><li>If the traffic to your load balancer must be secure, use either the HTTPS or the SSL protocol for the front-end connection.</li>\n<li>Upgrade your load balancer to the latest version of the predefined SSL security policy.</li> \n<li>Use only the recommended ciphers and protocols.</li> </ul>\nFor more information, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-listener-config.html\">Listener Configurations for Elastic Load Balancing</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-elb-listenerconfig-quickref.html\">Listener Configurations Quick Reference</a><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-config-update.html\">Update SSL Negotiation Configuration of Your Load Balancer</a><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-ssl-security-policy.html\">SSL Negotiation Configurations for Elastic Load Balancing</a><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-security-policy-table.html\">SSL Security Policy Table</a><br/>\n",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "Load Balancer Port",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "xSqX82fQu",
+ "name": "ELB Security Groups",
+ "description": "Checks for load balancers configured with a missing security group or a security group that allows access to ports that are not configured for the load balancer. If a security group associated with a load balancer is deleted, the load balancer does not work as expected. If a security group allows access to ports that are not configured for the load balancer, the risk of loss of data or malicious attacks increases. <br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: The inbound rules of an Amazon VPC security group associated with a load balancer allow access to ports that are not defined in the load balancer's listener configuration. <br/>\nRed: A security group associated with a load balancer does not exist. <br/><br/>\n<b>Recommended Action</b><br/>\nConfigure the security group rules to restrict access to only those ports and protocols that are defined in the load balancer listener configuration, plus the ICMP protocol to support Path MTU Discovery. See <a target=\"_blank\" href=\"https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html\">Listeners for Your Classic Load Balancer</a> and <a target=\"_blank\" href=\"https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-security-groups\">Security Groups for Load Balancers in a VPC</a>.<br/>\nIf a security group is missing, apply a new security group to the load balancer. Create security group rules that restrict access to only those ports and protocols that are defined in the load balancer listener configuration. See <a target=\"_blank\" href=\"https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-security-groups\">Security Groups for Load Balancers in a VPC</a>. <br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html\">Elastic Load Balancing User Guide</a> <br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-configure-load-balancer.html\">Configure Your Classic Load Balancer</a>",
+ "category": "security",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "Status",
+ "Security Group IDs",
+ "Reason"
+ ]
+ },
+ {
+ "id": "xdeXZKIUy",
+ "name": "ELB Cross-Zone Load Balancing",
+ "description": "With Cross-zone load balancing turned off, there is a risk of service unavailability due to uneven distribution of traffic or backend overloading. This problem can occur when clients incorrectly cache DNS information, or when there are an unequal number of instances in each Availability Zone (for example, if you have taken down some instances for maintenance).\n<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: Cross-zone load balancing is not enabled for a load balancer.<br/><br/>\n<b>Recommended Action</b><br/>\nConfirm that the Amazon EC2 instances registered with the load balancer are launched in multiple Availability Zones, and then enable cross-zone load balancing for the load balancer. For more information, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#AZ-Region\">Availability Zones and Regions</a> and <a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-crosszone-lb.html\">Enable or Disable Cross-Zone Load Balancing for Your Load Balancer</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#request-routing\">Request Routing</a><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html\">Elastic Load Balancing Concepts</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "7qGXsKIUw",
+ "name": "ELB Connection Draining",
+ "description": "Checks for load balancers that do not have connection draining enabled. When connection draining is not enabled and you remove (deregister) an Amazon EC2 instance from a load balancer, the load balancer stops routing traffic to that instance and closes the connection. When connection draining is enabled, the load balancer stops sending new requests to the deregistered instance but keeps the connection open to serve active requests.<br/><br/>\n<b>Alert Criteria</b><br/> \nYellow: Connection draining is not enabled for a load balancer.<br/><br/> \n<b>Recommended Action</b><br/>\nEnable connection draining for the load balancer. For more information, see <a target=\"_blank\" href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain\">Connection Draining</a> and <a target=\"_blank\" href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-conn-drain.html\">Enable or Disable Connection Draining for Your Load Balancer</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html\">Elastic Load Balancing Concepts</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Load Balancer Name",
+ "Status",
+ "Reason"
+ ]
+ },
+ {
+ "id": "N415c450f2",
+ "name": "CloudFront Header Forwarding and Cache Hit Ratio",
+ "description": "Checks the HTTP request headers that CloudFront currently receives from the client and forwards to your origin server. Some headers, such as Date or User-Agent, significantly reduce the cache hit ratio (the proportion of requests that are served from a CloudFront edge cache). This increases the load on your origin and reduces performance because CloudFront must forward more requests to your origin.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: One or more request headers that CloudFront forwards to your origin might significantly reduce your cache hit ratio.<br>\n<br>\n<b>Recommended Action</b><br>\nConsider whether the request headers provide enough benefit to justify the negative effect on the cache hit ratio. If your origin returns the same object regardless of the value of a given header, we recommend that you don't configure CloudFront to forward that header to the origin. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html\" target=\"_blank\">Configuring CloudFront to Cache Objects Based on Request Headers</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-hit-ratio.html#cache-hit-ratio-request-headers\" target=\"_blank\">Increasing the Proportion of Requests that Are Served from CloudFront Edge Caches</a><br>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-statistics.html\" target=\"_blank\">CloudFront Cache Statistics Reports</a><br>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior\" target=\"_blank\">HTTP Request Headers and CloudFront Behavior</a>",
+ "category": "performance",
+ "metadata": [
+ "Status",
+ "Distribution ID",
+ "Distribution Domain Name",
+ "Cache Behavior Path Pattern",
+ "Headers"
+ ]
+ },
+ {
+ "id": "N425c450f2",
+ "name": "CloudFront Custom SSL Certificates in the IAM Certificate Store",
+ "description": "Checks the SSL certificates for CloudFront alternate domain names in the IAM certificate store and alerts you if the certificate is expired, will soon expire, uses outdated encryption, or is not configured correctly for the distribution. When a custom certificate for an alternate domain name expires, browsers that display your CloudFront content might show a warning message about the security of your website. Certificates that are encrypted by using the SHA-1 hashing algorithm are being deprecated by web browsers such as Chrome and Firefox. If a certificate doesn't contain any domain names that match either Origin Domain Name or the domain name in the Host header of viewer requests, CloudFront returns an HTTP status code 502 (bad gateway) to the user. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS\" target=\"_blank\">Using Alternate Domain Names and HTTPS</a>.<br>\n<br>\n<b>Alert Criteria</b><br>\nRed: A custom SSL certificate is expired.<br>\nYellow: A custom SSL certificate expires in the next seven days.<br>\nYellow: A custom SSL certificate was encrypted by using the SHA-1 hashing algorithm.<br>\nYellow: One or more of the alternate domain names in the distribution don't appear either in the Common Name field or the Subject Alternative Names field of the custom SSL certificate.<br>\n<br>\n<b>Recommended Action</b><br>\nRenew an expired certificate or a certificate that is about to expire.<br>\nReplace a certificate that was encrypted by using the SHA-1 hashing algorithm with a certificate that is encrypted by using the SHA-256 hashing algorithm.<br>\nReplace the certificate with a certificate that contains the applicable values in the Common Name or Subject Alternative Domain Names fields.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html\" target=\"_blank\">Using an HTTPS Connection to Access Your Objects</a>",
+ "category": "security",
+ "metadata": [
+ "Status",
+ "Distribution ID",
+ "Distribution Domain Name",
+ "Certificate Name",
+ "Reason"
+ ]
+ },
+ {
+ "id": "N430c450f2",
+ "name": "CloudFront SSL Certificate on the Origin Server",
+ "description": "Checks your origin server for SSL certificates that are expired, about to expire, missing, or that use outdated encryption. If a certificate is expired, CloudFront responds to requests for your content with HTTP status code 502, Bad Gateway. Certificates that were encrypted by using the SHA-1 hashing algorithm are being deprecated by web browsers such as Chrome and Firefox. Depending on the number of SSL certificates that you have associated with your CloudFront distributions, this check might add a few cents per month to your bill with your web hosting provider, for example, AWS if you're using EC2 or ELB as the origin for your CloudFront distribution. This check does not validate your origin certificate chain or certificate authorities; you can check these in your CloudFront configuration. <br>\n<br>\n<b>Alert Criteria</b><br>\nRed: An SSL certificate on your origin has expired or is missing.<br>\nYellow: An SSL certificate on your origin expires in the next seven days.<br>\nYellow: An SSL certificate on your origin was encrypted by using the SHA-1 hashing algorithm.<br>\nYellow: An SSL certificate on your origin can't be located. The connection might have failed due to timeout, unmatched CNAME and hostname, or other HTTPS connection problems.<br>\n<br>\n<b>Recommended Action</b><br>\nRenew the certificate on your origin if it has expired or is about to expire.<br>\nAdd a certificate if one does not exist.<br>\nReplace a certificate that was encrypted by using the SHA-1 hashing algorithm with a certificate that is encrypted by using the SHA-256 hashing algorithm.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS\" target=\"_blank\">Using Alternate Domain Names and HTTPS</a>",
+ "category": "security",
+ "metadata": [
+ "Status",
+ "Distribution ID",
+ "Distribution Domain Name",
+ "Origin",
+ "Reason"
+ ]
+ },
+ {
+ "id": "Bh2xRR2FGH",
+ "name": "Amazon EC2 to EBS Throughput Optimization",
+ "description": "Checks for Amazon EBS volumes whose performance might be affected by the maximum throughput capability of the Amazon EC2 instance they are attached to. \r\nTo optimize performance, you should ensure that the maximum throughput of an EC2 instance is greater than the aggregate maximum throughput of the attached EBS volumes. \r\nThis check computes the total EBS volume throughput for each five-minute period in the preceding day (UTC) for each EBS-optimized instance and alerts you if usage in more than half of those periods was greater than 95% of the maximum throughput of the EC2 instance.<br/><br/> \r\n<b>Alert Criteria</b><br/> Yellow: In the preceding day (UTC), the aggregate throughput (megabytes/sec) of the EBS volumes attached to the EC2 instance exceeded 95% of the published throughput between the instance and the EBS volumes more than 50% of time.<br/><br/> \r\n<b>Recommended Action</b><br/> Compare the maximum throughput of your EBS volumes \r\n(see <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html\" target=\"_blank\">Amazon EBS Volume Types</a>) \r\nwith the maximum throughput of the EC2 instance they are attached to \r\n(see <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html#ebs-optimization-support\" target=\"_blank\">Instance Types That Support EBS Optimization</a>). \r\nConsider attaching your volumes to an instance that supports higher throughput to EBS for optimal performance.<br/><br/> \r\n<b>Additional Resources</b><br/><a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html\" target=\"_blank\">Amazon EBS Volume Types</a><br/> \r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html\" target=\"_blank\">Amazon EBS-Optimized Instances</a><br/> \r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-volume-status.html\" target=\"_blank\">Monitoring the Status of Your Volumes</a><br/> \r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html\" target=\"_blank\">Attaching an Amazon EBS Volume to an Instance</a><br/> \r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-detaching-volume.html\" target=\"_blank\">Detaching an Amazon EBS Volume from an Instance</a><br/> \r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-deleting-volume.html\" target=\"_blank\">Deleting an Amazon EBS Volume</a> ",
+ "category": "performance",
+ "metadata": [
+ "Region",
+ "Instance ID",
+ "Instance Type",
+ "Status",
+ "Time Near Maximum"
+ ]
+ },
+ {
+ "id": "N420c450f2",
+ "name": "CloudFront Alternate Domain Names",
+ "description": "Checks Amazon CloudFront distributions for alternate domain names (CNAMES) that have incorrectly configured DNS settings. If a CloudFront distribution includes alternate domain names, the DNS configuration for the domains must route DNS queries to that distribution.<br/>\n<br/>\n<b>Alert Criteria</b><br/>\nRed: A CloudFront distribution includes alternate domain names, but the DNS configuration is not correctly set up with a CNAME record or an Amazon Route 53 alias resource record.<br/>\nYellow: A CloudFront distribution includes alternate domain names, but Trusted Advisor could not evaluate the DNS configuration because there were too many redirects.<br/>\nYellow: A CloudFront distribution includes alternate domain names, but Trusted Advisor could not evaluate the DNS configuration for some other reason, most likely because of a timeout.\n<br/><br/>\n<b>Recommended Action</b><br/>\nUpdate the DNS configuration to route DNS queries to the CloudFront distribution; see <a href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html\" target=\"_blank\">Using Alternate Domain Names (CNAMEs)</a>. If you're using Amazon Route 53 as your DNS service, see <a href=\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html\" target=\"_blank\">Routing Traffic to an Amazon CloudFront Web Distribution by Using Your Domain Name</a>. If the check timed out, try refreshing the check.<br/>\n<br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html\">Amazon CloudFront Developer Guide</a>",
+ "category": "performance",
+ "metadata": [
+ "Status",
+ "Distribution ID",
+ "Distribution Domain Name",
+ "Alternate Domain Name",
+ "Reason"
+ ]
+ },
+ {
+ "id": "DqdJqYeRm5",
+ "name": "IAM Access Key Rotation",
+ "description": "Checks for active IAM access keys that have not been rotated in the last 90 days. When you rotate your access keys regularly, you reduce the chance that a compromised key could be used without your knowledge to access resources. For the purposes of this check, the last rotation date and time is when the access key was created or most recently activated. The access key number and date come from the <b>access_key_1_last_rotated</b> and <b>access_key_2_last_rotated</b> information in the most recent IAM credential report. Because the regeneration frequency of a credential report is restricted, refreshing this check might not reflect recent changes (for details, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html\">Getting Credential Reports for Your AWS Account</a>).<br/>\nIn order to create and rotate access keys, a user must have the appropriate permissions. For more information, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_delegate-permissions_examples.html#creds-policies-credentials\">Allow Users to Manage Their Own Passwords, Access Keys, and SSH Keys</a>.<br/><br/>\n<b>Alert Criteria</b><br/>\nGreen: The access key is active and has been rotated in the last 90 days.<br/>\nYellow: The access key is active and has been rotated in the last 2 years, but more than 90 days ago.<br/>\nRed: The access key is active and has not been rotated in the last 2 years.<br/><br/>\n<b>Recommended Action</b><br/>\nRotate access keys on a regular basis. See <a target=\"_blank\" href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey\">Rotating Access Keys</a> and <a target=\"_blank\" href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\">Managing Access Keys for IAM Users</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html\">IAM Best Practices</a><br/>\n<a target=\"_blank\" href=\"https://blogs.aws.amazon.com/security/post/Tx15CIT22V4J8RP/How-to-rotate-access-keys-for-IAM-users\">How to rotate access keys for IAM users</a> (AWS blog)",
+ "category": "security",
+ "metadata": [
+ "Status",
+ "IAM User",
+ "Access Key",
+ "Key Last Rotated",
+ "Reason"
+ ]
+ },
+ {
+ "id": "12Fnkpl8Y5",
+ "name": "Exposed Access Keys",
+ "description": "Checks popular code repositories for access keys that have been exposed to the public and for irregular Amazon Elastic Compute Cloud (Amazon EC2) usage that could be the result of a compromised access key. An access key consists of an access key ID and the corresponding secret access key. Exposed access keys pose a security risk to your account and other users, could lead to excessive charges from unauthorized activity or abuse, and violate the <a target=\"_blank\" href=\"https://aws.amazon.com/agreement/\">AWS Customer Agreement</a>. If your access key is exposed, take immediate action to secure your account. To protect your account from excessive charges, AWS temporarily limits your ability to create certain AWS resources when exposed access keys are identified. This does not make your account secure; it only partially limits the unauthorized usage for which you could be charged. Note: This check does not guarantee the identification of exposed access keys or compromised EC2 instances. You are ultimately responsible for the safety and security of your access keys and AWS resources. <br/><br/>\nIf a deadline is shown for an access key, AWS may suspend your AWS account if the unauthorized usage is not stopped by that date. If you believe an alert is in error, <a href=\"https://console.aws.amazon.com/support/home?#/case/create?issueType=customer-service&serviceCode=customer-account&categoryCode=security\" target=\"_blank\">contact AWS Support</a>.<br/><br/>\nThe information displayed in Trusted Advisor may not reflect the most recent state of your account. No exposed access keys are marked as resolved until all exposed access keys on the account have been resolved. This data synchronization can take up to one week.<br/><br/>\n<b>Alert Criteria</b><br/>\nRed: Potentially compromised - AWS has identified an access key ID and corresponding secret access key that have been exposed on the Internet and may have been compromised (used).<br/>\nRed: Exposed - AWS has identified an access key ID and corresponding secret access key that have been exposed on the Internet.<br/>\nRed: Suspected - Irregular Amazon EC2 usage indicates that an access key may have been compromised, but it has not been identified as exposed on the Internet.<br/><br/>\n<b>Recommended Action</b><br/>\nDelete the affected access key as soon as possible. If the key is associated with an IAM user, see <a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/ManagingCredentials.html\" target=\"_blank\">Managing Access Keys for IAM Users</a>.<br/><br/>\nCheck your account for unauthorized usage. Log in to the <a href=\"https://console.aws.amazon.com/\" target=\"_blank\">AWS Management Console</a> and check each service console for suspicious resources. Pay special attention to running Amazon EC2 instances, Spot Instance requests, access keys, and IAM users. You can also check overall usage on the <a href=\"https://console.aws.amazon.com/billing/home#/\" target=\"_blank\">Billing & Cost Management Dashboard</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html\" target=\"_blank\">Best Practices for Managing AWS Access Keys</a><br/>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws-security-audit-guide.html\" target=\"_blank\">AWS Security Audit Guidelines</a>",
+ "category": "security",
+ "metadata": [
+ "Access Key ID",
+ "User Name (IAM or Root)",
+ "Fraud Type",
+ "Case ID",
+ "Time Updated",
+ "Location",
+ "Deadline",
+ "Usage (USD per Day)"
+ ]
+ },
+ {
+ "id": "G31sQ1E9U",
+ "name": "Underutilized Amazon Redshift Clusters",
+ "description": "Checks your Amazon Redshift configuration for clusters that appear to be underutilized. If an Amazon Redshift cluster has not had a connection for a prolonged period of time or is using a low amount of CPU, you can use lower-cost options such as downsizing the cluster or shutting down the cluster and taking a final snapshot. Final snapshots are retained even after you delete your cluster.<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: A running cluster has not had a connection in the last 7 days.<br/>\nYellow: A running cluster had less than 5% cluster-wide average CPU utilization for 99% of the last 7 days.<br/><br/>\n<b>Recommended Action</b><br/>\nConsider shutting down the cluster and taking a final snapshot, or downsizing the cluster. See <a href=\"https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-mgmt-shutdown-delete-cluster\" target=\"_blank\">Shutting Down and Deleting Clusters</a> and <a href=\"https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#cluster-resize-intro\" target=\"_blank\">Resizing a Cluster</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html\" target=\"_blank\">Amazon CloudWatch Developer Guide</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Status",
+ "Region",
+ "Cluster",
+ "Instance Type",
+ "Reason",
+ "Estimated Monthly Savings"
+ ]
+ },
+ {
+ "id": "1e93e4c0b5",
+ "name": "Amazon EC2 Reserved Instance Lease Expiration",
+ "description": "Checks for Amazon EC2 Reserved Instances that are scheduled to expire within the next 30 days or have expired in the preceding 30 days. Reserved Instances do not renew automatically; you can continue using an EC2 instance covered by the reservation without interruption, but you will be charged On-Demand rates. New Reserved Instances can have the same parameters as the expired ones, or you can purchase Reserved Instances with different parameters.<br/>\r\nThe estimated monthly savings we show is the difference between the On-Demand and Reserved Instance rates for the same instance type.<br/><br/>\r\n<b>Alert Criteria</b><br/>\r\nYellow: The Reserved Instance lease expires in less than 30 days.<br/>\r\nYellow: The Reserved Instance lease expired in the preceding 30 days.<br/><br/>\r\n<b>Recommended Action</b><br/>\r\nConsider purchasing a new Reserved Instance to replace the one that is nearing the end of its term. For more information, see <a href=\"https://aws.amazon.com/ec2/purchasing-options/reserved-instances/buyer/\" target=\"_blank\">How to Purchase Reserved Instances</a> and <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-concepts-buying.html\" target=\"_blank\">Buying Reserved Instances</a>.<br/><br/> \r\n<b>Additional Resources</b><br/>\r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html\" target=\"_blank\">Reserved Instances</a><br/>\r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\" target=\"_blank\">Instance Types</a>",
+ "category": "cost_optimizing",
+ "metadata": [
+ "Status",
+ "Zone",
+ "Instance Type",
+ "Platform",
+ "Instance Count",
+ "Current Monthly Cost",
+ "Estimated Monthly Savings",
+ "Expiration Date",
+ "Reserved Instance ID",
+ "Reason"
+ ]
+ },
+ {
+ "id": "R365s2Qddf",
+ "name": "Amazon S3 Bucket Versioning",
+ "description": "Checks for Amazon Simple Storage Service buckets that do not have versioning enabled, or have versioning suspended. When versioning is enabled, you can easily recover from both unintended user actions and application failures. Versioning allows you to preserve, retrieve, and restore any version of any object stored in a bucket. You can use lifecycle rules to manage all versions of your objects as well as their associated costs by automatically archiving objects to the Glacier storage class or removing them after a specified time period. You can also choose to require multi-factor authentication (MFA) for any object deletions or configuration changes to your buckets. <br/><br/>\nVersioning cannot be disabled after it has been enabled, but it can be suspended, which prevents new versions of objects from being created. Using versioning can increase your costs for Amazon S3, because you pay for storage of multiple versions of an object.<br/><br/>\n<b>Alert Criteria</b><br/>\nGreen: Versioning is enabled for the bucket.<br/>\nYellow: Versioning is not enabled for the bucket.<br/>\nYellow: Versioning is suspended for the bucket.<br/><br/>\n<b>Recommended Action</b><br/>\nEnable bucket versioning on most buckets to prevent accidental deletion or overwriting. See <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html\" target=\"_blank\">Using Versioning</a> and <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/manage-versioning-examples.html\" target=\"_blank\">Enabling Versioning Programmatically</a>. <br/><br/>\nIf bucket versioning is suspended, consider reenabling versioning. For information on working with objects in a versioning-suspended bucket, see <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/VersionSuspendedBehavior.html\" target=\"_blank\">Managing Objects in a Versioning-Suspended Bucket</a>.<br/><br/>\nWhen versioning is enabled or suspended, you can define lifecycle configuration rules to mark certain object versions as expired or to permanently remove unneeded object versions. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\" target=\"_blank\">Object Lifecycle Management</a>. <br/><br/>\nMFA Delete requires additional authentication when the versioning status of the bucket is changed or when versions of an object are deleted. It requires the user to enter credentials and a code from an approved authentication device. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete\" target=\"_blank\">MFA Delete</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonS3/latest/UG/BucketOperations.html\" target=\"_blank\">Working with Buckets</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Region",
+ "Bucket Name",
+ "Versioning",
+ "MFA Delete Enabled",
+ "Status"
+ ]
+ },
+ {
+ "id": "0t121N1Ty3",
+ "name": "AWS Direct Connect Connection Redundancy",
+ "description": "Checks for regions that have only one AWS Direct Connect connection. Connectivity to your AWS resources should have two Direct Connect connections configured at all times to provide redundancy in case a device is unavailable.<br/>\n<b>Note:</b> Results for this check are automatically refreshed several times daily, and refresh requests are not allowed. It might take a few hours for changes to appear.<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: The region has only one Direct Connect connection.<br/><br/>\n<b>Recommended Action</b><br/>\nConfigure an additional Direct Connect connection in this region to protect against device unavailability. For more information, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getting_started.html\">Configure Redundant Connections with AWS Direct Connect</a>. To protect against site unavailability and add location redundancy, configure the additional Direct Connect connection to a different Direct Connect location.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getting_started.html\">Getting Started with AWS Direct Connect</a><br/>\n<a target=\"_blank\" href=\"https://aws.amazon.com/directconnect/faqs/\">AWS Direct Connect FAQs</a> ",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Status",
+ "Region",
+ "Timestamp",
+ "Location",
+ "Connection ID"
+ ]
+ },
+ {
+ "id": "8M012Ph3U5",
+ "name": "AWS Direct Connect Location Redundancy",
+ "description": "Checks for regions with one or more AWS Direct Connect connections and only one AWS Direct Connect location. Connectivity to your AWS resources should have Direct Connect connections configured to different Direct Connect locations to provide redundancy in case a location is unavailable.<br/>\n<b>Note:</b> Results for this check are automatically refreshed several times daily, and refresh requests are not allowed. It might take a few hours for changes to appear.<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: The Direct Connect connections in the region are not configured to different locations.<br/><br/>\n<b>Recommended Action</b><br/>\nConfigure a Direct Connect connection that uses a different Direct Connect location to protect against location unavailability. For more information, see <a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getting_started.html\">Getting Started with AWS Direct Connect</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getting_started.html\">Getting Started with AWS Direct Connect</a><br/>\n<a target=\"_blank\" href=\"https://aws.amazon.com/directconnect/faqs/\">AWS Direct Connect FAQs</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Status",
+ "Region",
+ "Timestamp",
+ "Location",
+ "Connection Details"
+ ]
+ },
+ {
+ "id": "4g3Nt5M1Th",
+ "name": "AWS Direct Connect Virtual Interface Redundancy",
+ "description": "Checks for virtual private gateways with Direct Connect virtual interfaces (VIFs) that are not configured on at least two Direct Connect connections. Connectivity to your virtual private gateway should have multiple virtual interfaces configured across multiple Direct Connect connections and locations to provide redundancy in case a device or location is unavailable. <br/>\n<b>Note:</b> Results for this check are automatically refreshed several times daily, and refresh requests are not allowed. It might take a few hours for changes to appear.<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: A virtual private gateway has less than two virtual interfaces, or the interfaces are not configured to multiple Direct Connect connections. <br/><br/>\n<b>Recommended Action</b><br/>\nConfigure at least two virtual interfaces that are configured to two Direct Connect connections to protect against device or location unavailability. See <a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getstarted.html#createvirtualinterface\">Create a Virtual Interface.</a><br/><br/>\n<b>Additional Resources</b><br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/getting_started.html\">Getting Started with AWS Direct Connect</a><br/>\n<a target=\"_blank\" href=\"https://aws.amazon.com/directconnect/faqs/\">AWS Direct Connect FAQs</a> \n<br/>\n<a target=\"_blank\" href=\"https://docs.aws.amazon.com/directconnect/latest/UserGuide/WorkingWithVirtualInterfaces.html\">Working With AWS Direct Connect Virtual Interfaces</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Status",
+ "Region",
+ "Timestamp",
+ "Gateway ID",
+ "Location for VIF",
+ "Connection ID for VIF"
+ ]
+ },
+ {
+ "id": "xuy7H1avtl",
+ "name": "Amazon Aurora DB Instance Accessibility",
+ "description": "Checks for cases where an Amazon Aurora DB cluster has both private and public instances. When your primary instance fails, a replica can be promoted to a primary instance. If that replica is private, users who have only public access would no longer be able to connect to the database after failover. It's best practice for all the DB instances in a cluster to have the same accessibility.<br/><br/>\n<b>Alert Criteria</b><br/>\nYellow: The instances in an Aurora DB cluster have different accessibility (a mix of public and private).<br/><br/>\n<b>Recommended Action</b><br/>\nModify the <b>Publicly Accessible</b> setting of the instances in the DB cluster so that they are all either public or private. For details, see the instructions for MySQL instances at <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ModifyInstance.MySQL.html\" target=\"_blank\">Modifying a DB Instance Running the MySQL Database Engine</a>.<br/><br/>\n<b>Additional Resources</b><br/>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Managing.html#Aurora.Managing.FaultTolerance\" target=\"_blank\">Fault Tolerance for an Aurora DB Cluster</a>",
+ "category": "fault_tolerance",
+ "metadata": [
+ "Status",
+ "Region",
+ "Cluster",
+ "Public DB Instances",
+ "Private DB Instances",
+ "Reason"
+ ]
+ },
+ {
+ "id": "ePs02jT06w",
+ "name": "Amazon EBS Public Snapshots",
+ "description": "Checks the permission settings for your Amazon Elastic Block Store (Amazon EBS) volume snapshots and alerts you if any snapshots are marked as public. When you make a snapshot public, you give all AWS accounts and users access to all the data on the snapshot. If you want to share a snapshot with particular users or accounts, mark the snapshot as private, and then specify the user or accounts you want to share the snapshot data with. <b>Note</b>: Results for this check are automatically refreshed several times daily, and refresh requests are not allowed. It might take a few hours for changes to appear.<br/><br/>\r\n<b>Alert Criteria</b><br/>\r\nRed: The EBS volume snapshot is marked as public.<br/><br/>\r\n<b>Recommended Action</b><br/>\r\nUnless you are certain you want to share all the data in the snapshot with all AWS accounts and users, modify the permissions: mark the snapshot as private, and then specify the accounts that you want to give permissions to. For more information, see <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-modifying-snapshot-permissions.html\" target=\"_blank\">Sharing an Amazon EBS Snapshot</a>. Note: For temporary technical reasons, items in this check cannot be excluded from view in the Trusted Advisor console.<br/><br/> \r\n<b>Additional Resources</b><br/>\r\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html\" target=\"_blank\">Amazon EBS Snapshots</a>",
+ "category": "security",
+ "metadata": [
+ "Status",
+ "Region",
+ "Volume ID",
+ "Snapshot ID",
+ "Description"
+ ]
+ },
+ {
+ "id": "rSs93HQwa1",
+ "name": "Amazon RDS Public Snapshots",
+ "description": "Checks the permission settings for your Amazon Relational Database Service (Amazon RDS) DB snapshots and alerts you if any snapshots are marked as public. When you make a snapshot public, you give all AWS accounts and users access to all the data on the snapshot. If you want to share a snapshot with particular users or accounts, mark the snapshot as private, and then specify the user or accounts you want to share the snapshot data with. <b>Note</b>: Results for this check are automatically refreshed several times daily, and refresh requests are not allowed. It might take a few hours for changes to appear.<br/><br/>\r\n<b>Alert Criteria</b><br/>\r\nRed: The RDS snapshot is marked as public.<br/><br/>\r\n<b>Recommended Action</b><br/>\r\nUnless you are certain you want to share all the data in the snapshot with all AWS accounts and users, modify the permissions: mark the snapshot as private, and then specify the accounts that you want to give permissions to. For more information, see <a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ShareSnapshot.html\" target=\"_blank\">Sharing a DB Snapshot or DB Cluster Snapshot</a>. Note: For temporary technical reasons, items in this check cannot be excluded from view in the Trusted Advisor console.<br/><br/> \r\n<b>Additional Resources</b><br/>\r\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.BackupRestore.html\" target=\"_blank\">Backing Up and Restoring Amazon RDS DB Instances</a>",
+ "category": "security",
+ "metadata": [
+ "Status",
+ "Region",
+ "DB Instance or Cluster ID",
+ "Snapshot ID"
+ ]
+ },
+ {
+ "id": "0Xc6LMYG8P",
+ "name": "EC2 On-Demand Instances",
+ "description": "Checks for usage that is more than 80% of the EC2 On-Demand Instances Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html\" target=\"_blank\">EC2 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "hJ7NN0l7J9",
+ "name": "SES Daily Sending Quota",
+ "description": "Checks for usage that is more than 80% of the SES Daily Sending Quota Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/ses/latest/DeveloperGuide/limits.html\" target=\"_blank\">SES Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "tV7YY0l7J9",
+ "name": "EBS Provisioned IOPS (SSD) Volume Aggregate IOPS",
+ "description": "Checks for usage that is more than 80% of the EBS Provisioned IOPS (SSD) Volume Aggregate IOPS Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "gI7MM0l7J9",
+ "name": "EBS Provisioned IOPS SSD (io1) Volume Storage",
+ "description": "Checks for usage that is more than 80% of the EBS Provisioned IOPS SSD (io1) Volume Storage Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "eI7KK0l7J9",
+ "name": "EBS Active Snapshots",
+ "description": "Checks for usage that is more than 80% of the EBS Active Snapshots Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dH7RR0l6J9",
+ "name": "EBS General Purpose SSD (gp2) Volume Storage",
+ "description": "Checks for usage that is more than 80% of the EBS General Purpose SSD (gp2) Volume Storage Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "cG7HH0l7J9",
+ "name": "EBS Magnetic (standard) Volume Storage",
+ "description": "Checks for usage that is more than 80% of the EBS Magnetic (standard) Volume Storage Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "aW9HH0l8J6",
+ "name": "EC2-Classic Elastic IP Addresses",
+ "description": "Checks for usage that is more than 80% of the EC2-Classic Elastic IP Addresses Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html\" target=\"_blank\">EC2 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "iH7PP0l7J9",
+ "name": "EC2 Reserved Instance Leases",
+ "description": "Checks for usage that is more than 80% of the EC2 Reserved Instance Leases Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html\" target=\"_blank\">EC2 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "bW7HH0l7J9",
+ "name": "Kinesis Shards per Region",
+ "description": "Checks for usage that is more than 80% of the Kinesis Shards per Region Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html\" target=\"_blank\">Kinesis Streams Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "gW7HH0l7J9",
+ "name": "CloudFormation Stacks",
+ "description": "Checks for usage that is more than 80% of the CloudFormation Stacks Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html\" target=\"_blank\">CloudFormation Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "aW7HH0l7J9",
+ "name": "Auto Scaling Launch Configurations",
+ "description": "Checks for usage that is more than 80% of the Auto Scaling Launch Configurations Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/autoscaling/latest/userguide/as-account-limits.html\" target=\"_blank\">Auto Scaling Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "fW7HH0l7J9",
+ "name": "Auto Scaling Groups",
+ "description": "Checks for usage that is more than 80% of the Auto Scaling Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/autoscaling/latest/userguide/as-account-limits.html\" target=\"_blank\">Auto Scaling Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "jL7PP0l7J9",
+ "name": "VPC",
+ "description": "Checks for usage that is more than 80% of the VPC Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br> \n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html#vpc-limits-vpcs-subnets\" target=\"_blank\">VPC Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "kM7QQ0l7J9",
+ "name": "VPC Internet Gateways",
+ "description": "Checks for usage that is more than 80% of the VPC Internet Gateways Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html#vpc-limits-gateways\" target=\"_blank\">VPC Gateway Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "lN7RR0l7J9",
+ "name": "EC2-VPC Elastic IP Address",
+ "description": "Checks for usage that is more than 80% of the EC2-VPC Elastic IP Address Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html#vpc-limits-eips\" target=\"_blank\">VPC Elastic IP Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "nO7SS0l7J9",
+ "name": "IAM Instance Profiles",
+ "description": "Checks for usage that is more than 80% of the IAM Instance Profiles Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "oQ7TT0l7J9",
+ "name": "IAM Roles",
+ "description": "Checks for usage that is more than 80% of the IAM Roles Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "pR7UU0l7J9",
+ "name": "IAM Policies",
+ "description": "Checks for usage that is more than 80% of the IAM Policies Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "qS7VV0l7J9",
+ "name": "IAM Users",
+ "description": "Checks for usage that is more than 80% of the IAM Users Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "rT7WW0l7J9",
+ "name": "IAM Server Certificates",
+ "description": "Checks for usage that is more than 80% of the IAM Server Certificates Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "sU7XX0l7J9",
+ "name": "IAM Group",
+ "description": "Checks for usage that is more than 80% of the IAM Group Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html\" target=\"_blank\">IAM Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "iK7OO0l7J9",
+ "name": "ELB Classic Load Balancers",
+ "description": "Checks for usage that is more than 80% of the ELB Classic Load Balancers. Application Load Balancers and Network Load Balancers have a separate limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br/>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_elastic_load_balancer\" target=\"_blank\">AWS Service Limits - Elastic Load Balancing default service limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "7fuccf1Mx7",
+ "name": "RDS Cluster Roles",
+ "description": "Checks for usage that is more than 80% of the RDS Cluster Roles Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "jtlIMO3qZM",
+ "name": "RDS Cluster Parameter Groups",
+ "description": "Checks for usage that is more than 80% of the RDS Cluster Parameter Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "gjqMBn6pjz",
+ "name": "RDS Clusters",
+ "description": "Checks for usage that is more than 80% of the RDS Clusters Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "UUDvOa5r34",
+ "name": "RDS Reserved Instances",
+ "description": "Checks for usage that is more than 80% of the RDS Reserved Instances Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "jEhCtdJKOY",
+ "name": "RDS Subnets per Subnet Group",
+ "description": "Checks for usage that is more than 80% of the RDS Subnets per Subnet Group Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dYWBaXaaMM",
+ "name": "RDS Subnet Groups",
+ "description": "Checks for usage that is more than 80% of the RDS Subnet Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "3Njm0DJQO9",
+ "name": "RDS Option Groups",
+ "description": "Checks for usage that is more than 80% of the RDS Option Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "keAhfbH5yb",
+ "name": "RDS Event Subscriptions",
+ "description": "Checks for usage that is more than 80% of the RDS Event Subscriptions Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dV84wpqRUs",
+ "name": "RDS DB Manual Snapshots",
+ "description": "Checks for usage that is more than 80% of the RDS DB Manual Snapshots Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "P1jhKWEmLa",
+ "name": "RDS Total Storage Quota",
+ "description": "Checks for usage that is more than 80% of the RDS Total Storage Quota Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "jEECYg2YVU",
+ "name": "RDS DB Parameter Groups",
+ "description": "Checks for usage that is more than 80% of the RDS DB Parameter Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "pYW8UkYz2w",
+ "name": "RDS Read Replicas per Master",
+ "description": "Checks for usage that is more than 80% of the RDS Read Replicas per Master Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "gfZAn3W7wl",
+ "name": "RDS DB Security Groups",
+ "description": "Checks for usage that is more than 80% of the RDS DB Security Groups Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "XG0aXHpIEt",
+ "name": "RDS DB Instances",
+ "description": "Checks for usage that is more than 80% of the RDS DB Instances Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dBkuNCvqn5",
+ "name": "RDS Max Auths per Security Group",
+ "description": "Checks for usage that is more than 80% of the RDS Max Auths per Security Group Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html\" target=\"_blank\">RDS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "wH7DD0l3J9",
+ "name": "EBS Throughput Optimized HDD (st1) Volume Storage",
+ "description": "Checks for usage that is more than 80% of the EBS Throughput Optimized HDD (st1) Volume Storage Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "gH5CC0e3J9",
+ "name": "EBS Cold HDD (sc1) Volume Storage",
+ "description": "Checks for usage that is more than 80% of the EBS Cold HDD (sc1) Volume Storage Limit. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs\" target=\"_blank\">EBS Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "6gtQddfEw6",
+ "name": "DynamoDB Read Capacity",
+ "description": "Checks for usage that is more than 80% of the DynamoDB Provisioned Throughput Limit for Reads per Account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_dynamodb\" target=\"_blank\">DynamoDB Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "c5ftjdfkMr",
+ "name": "DynamoDB Write Capacity",
+ "description": "Checks for usage that is more than 80% of the DynamoDB Provisioned Throughput Limit for Writes per Account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_dynamodb\" target=\"_blank\">DynamoDB Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "ru4xfcdfMr",
+ "name": "Route 53 Max Health Checks",
+ "description": "Checks for usage that is more than 80% of the Route 53 Health Checks Limit per account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\" target=\"_blank\">Route 53 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dx3xfcdfMr",
+ "name": "Route 53 Hosted Zones",
+ "description": "Checks for usage that is more than 80% of the Route 53 Hosted Zones Limit per account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\" target=\"_blank\">Route 53 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "ty3xfcdfMr",
+ "name": "Route 53 Reusable Delegation Sets",
+ "description": "Checks for usage that is more than 80% of the Route 53 Reusable Delegation Sets Limit per account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\" target=\"_blank\">Route 53 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dx3xfbjfMr",
+ "name": "Route 53 Traffic Policies",
+ "description": "Checks for usage that is more than 80% of the Route 53 Traffic Policies Limit per account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\" target=\"_blank\">Route 53 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "dx8afcdfMr",
+ "name": "Route 53 Traffic Policy Instances",
+ "description": "Checks for usage that is more than 80% of the Route 53 Traffic Policy Instances Limit per account. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\" target=\"_blank\">Route 53 Limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "EM8b3yLRTr",
+ "name": "ELB Application Load Balancers",
+ "description": "Checks for usage that is more than 80% of the ELB Application Load Balancers Limit. Classic Load Balancers and Network Load Balancers have separate limits. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br/>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_elastic_load_balancer\" target=\"_blank\">AWS Service Limits - Elastic Load Balancing default service limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ },
+ {
+ "id": "8wIqYSt25K",
+ "name": "ELB Network Load Balancers",
+ "description": "Checks for usage that is more than 80% of the ELB Network Load Balancers Limit. Classic Load Balancers and Application Load Balancers have separate limits. Values are based on a snapshot, so your current usage might differ. Limit and usage data can take up to 24 hours to reflect any changes. In cases where limits have been recently increased, you may temporarily see utilization that exceeds the limit.<br/>\n<br>\n<b>Alert Criteria</b><br>\nYellow: 80% of limit reached.<br>\nRed: 100% of limit reached.<br>\nBlue: Trusted Advisor was unable to retrieve utilization or limits in one or more regions.<br>\n<br>\n<b>Recommended Action</b><br>\nIf you anticipate exceeding a service limit, open a case in Support Center to <a href=\"https://aws.amazon.com/support/createCase?type=service_limit_increase\" target=\"_blank\">request a limit increase</a>.<br>\n<br>\n<b>Additional Resources</b><br>\n<a href=\"https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_elastic_load_balancer\" target=\"_blank\">AWS Service Limits - Elastic Load Balancing default service limits</a>",
+ "category": "service_limits",
+ "metadata": [
+ "Region",
+ "Service",
+ "Limit Name",
+ "Limit Amount",
+ "Current Usage",
+ "Status"
+ ]
+ }
+ ]
+}
diff --git a/contrib/python/moto/py3/moto/support/responses.py b/contrib/python/moto/py3/moto/support/responses.py
new file mode 100644
index 0000000000..3246b91649
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/responses.py
@@ -0,0 +1,64 @@
+from moto.core.responses import BaseResponse
+from .models import support_backends
+import json
+
+
+class SupportResponse(BaseResponse):
+ SERVICE_NAME = "support"
+
+ @property
+ def support_backend(self):
+ return support_backends[self.region]
+
+ def describe_trusted_advisor_checks(self):
+ checks = self.support_backend.describe_trusted_advisor_checks()
+
+ return json.dumps({"checks": checks})
+
+ def refresh_trusted_advisor_check(self):
+ check_id = self._get_param("checkId")
+ status = self.support_backend.refresh_trusted_advisor_check(check_id=check_id)
+
+ return json.dumps(status)
+
+ def resolve_case(self):
+ case_id = self._get_param("caseId")
+ resolve_case_response = self.support_backend.resolve_case(case_id=case_id)
+ return json.dumps(resolve_case_response)
+
+ def create_case(self):
+ subject = self._get_param("subject")
+ service_code = self._get_param("serviceCode")
+ severity_code = self._get_param("severityCode")
+ category_code = self._get_param("categoryCode")
+ communication_body = self._get_param("communicationBody")
+ cc_email_addresses = self._get_param("ccEmailAddresses")
+ language = self._get_param("language")
+ attachment_set_id = self._get_param("attachmentSetId")
+ create_case_response = self.support_backend.create_case(
+ subject=subject,
+ service_code=service_code,
+ severity_code=severity_code,
+ category_code=category_code,
+ communication_body=communication_body,
+ cc_email_addresses=cc_email_addresses,
+ language=language,
+ attachment_set_id=attachment_set_id,
+ )
+
+ return json.dumps(create_case_response)
+
+ def describe_cases(self):
+ case_id_list = self._get_param("caseIdList")
+ include_resolved_cases = self._get_param("includeResolvedCases", False)
+ next_token = self._get_param("nextToken")
+ include_communications = self._get_param("includeCommunications", True)
+
+ describe_cases_response = self.support_backend.describe_cases(
+ case_id_list=case_id_list,
+ include_resolved_cases=include_resolved_cases,
+ next_token=next_token,
+ include_communications=include_communications,
+ )
+
+ return json.dumps(describe_cases_response)
diff --git a/contrib/python/moto/py3/moto/support/urls.py b/contrib/python/moto/py3/moto/support/urls.py
new file mode 100644
index 0000000000..7b232c97ff
--- /dev/null
+++ b/contrib/python/moto/py3/moto/support/urls.py
@@ -0,0 +1,8 @@
+from .responses import SupportResponse
+
+url_bases = [r"https?://support\.(.+)\.amazonaws\.com"]
+
+
+url_paths = {
+ "{0}/$": SupportResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/swf/__init__.py b/contrib/python/moto/py3/moto/swf/__init__.py
new file mode 100644
index 0000000000..b6b843ed82
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/__init__.py
@@ -0,0 +1,4 @@
+from .models import swf_backends
+from ..core.models import base_decorator
+
+mock_swf = base_decorator(swf_backends)
diff --git a/contrib/python/moto/py3/moto/swf/constants.py b/contrib/python/moto/py3/moto/swf/constants.py
new file mode 100644
index 0000000000..80e384d3ce
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/constants.py
@@ -0,0 +1,83 @@
+# List decision fields and if they're required or not
+#
+# See http://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html
+# and subsequent docs for each decision type.
+DECISIONS_FIELDS = {
+ "cancelTimerDecisionAttributes": {"timerId": {"type": "string", "required": True}},
+ "cancelWorkflowExecutionDecisionAttributes": {
+ "details": {"type": "string", "required": False}
+ },
+ "completeWorkflowExecutionDecisionAttributes": {
+ "result": {"type": "string", "required": False}
+ },
+ "continueAsNewWorkflowExecutionDecisionAttributes": {
+ "childPolicy": {"type": "string", "required": False},
+ "executionStartToCloseTimeout": {"type": "string", "required": False},
+ "input": {"type": "string", "required": False},
+ "lambdaRole": {"type": "string", "required": False},
+ "tagList": {"type": "string", "array": True, "required": False},
+ "taskList": {"type": "TaskList", "required": False},
+ "taskPriority": {"type": "string", "required": False},
+ "taskStartToCloseTimeout": {"type": "string", "required": False},
+ "workflowTypeVersion": {"type": "string", "required": False},
+ },
+ "failWorkflowExecutionDecisionAttributes": {
+ "details": {"type": "string", "required": False},
+ "reason": {"type": "string", "required": False},
+ },
+ "recordMarkerDecisionAttributes": {
+ "details": {"type": "string", "required": False},
+ "markerName": {"type": "string", "required": True},
+ },
+ "requestCancelActivityTaskDecisionAttributes": {
+ "activityId": {"type": "string", "required": True}
+ },
+ "requestCancelExternalWorkflowExecutionDecisionAttributes": {
+ "control": {"type": "string", "required": False},
+ "runId": {"type": "string", "required": False},
+ "workflowId": {"type": "string", "required": True},
+ },
+ "scheduleActivityTaskDecisionAttributes": {
+ "activityId": {"type": "string", "required": True},
+ "activityType": {"type": "ActivityType", "required": True},
+ "control": {"type": "string", "required": False},
+ "heartbeatTimeout": {"type": "string", "required": False},
+ "input": {"type": "string", "required": False},
+ "scheduleToCloseTimeout": {"type": "string", "required": False},
+ "scheduleToStartTimeout": {"type": "string", "required": False},
+ "startToCloseTimeout": {"type": "string", "required": False},
+ "taskList": {"type": "TaskList", "required": False},
+ "taskPriority": {"type": "string", "required": False},
+ },
+ "scheduleLambdaFunctionDecisionAttributes": {
+ "id": {"type": "string", "required": True},
+ "input": {"type": "string", "required": False},
+ "name": {"type": "string", "required": True},
+ "startToCloseTimeout": {"type": "string", "required": False},
+ },
+ "signalExternalWorkflowExecutionDecisionAttributes": {
+ "control": {"type": "string", "required": False},
+ "input": {"type": "string", "required": False},
+ "runId": {"type": "string", "required": False},
+ "signalName": {"type": "string", "required": True},
+ "workflowId": {"type": "string", "required": True},
+ },
+ "startChildWorkflowExecutionDecisionAttributes": {
+ "childPolicy": {"type": "string", "required": False},
+ "control": {"type": "string", "required": False},
+ "executionStartToCloseTimeout": {"type": "string", "required": False},
+ "input": {"type": "string", "required": False},
+ "lambdaRole": {"type": "string", "required": False},
+ "tagList": {"type": "string", "array": True, "required": False},
+ "taskList": {"type": "TaskList", "required": False},
+ "taskPriority": {"type": "string", "required": False},
+ "taskStartToCloseTimeout": {"type": "string", "required": False},
+ "workflowId": {"type": "string", "required": True},
+ "workflowType": {"type": "WorkflowType", "required": True},
+ },
+ "startTimerDecisionAttributes": {
+ "control": {"type": "string", "required": False},
+ "startToFireTimeout": {"type": "string", "required": True},
+ "timerId": {"type": "string", "required": True},
+ },
+}
diff --git a/contrib/python/moto/py3/moto/swf/exceptions.py b/contrib/python/moto/py3/moto/swf/exceptions.py
new file mode 100644
index 0000000000..3d919f8014
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/exceptions.py
@@ -0,0 +1,118 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class SWFClientError(JsonRESTError):
+ code = 400
+
+
+class SWFUnknownResourceFault(SWFClientError):
+ def __init__(self, resource_type, resource_name=None):
+ if resource_name:
+ message = "Unknown {0}: {1}".format(resource_type, resource_name)
+ else:
+ message = "Unknown {0}".format(resource_type)
+ super().__init__("com.amazonaws.swf.base.model#UnknownResourceFault", message)
+
+
+class SWFDomainAlreadyExistsFault(SWFClientError):
+ def __init__(self, domain_name):
+ super().__init__(
+ "com.amazonaws.swf.base.model#DomainAlreadyExistsFault", domain_name
+ )
+
+
+class SWFDomainDeprecatedFault(SWFClientError):
+ def __init__(self, domain_name):
+ super().__init__(
+ "com.amazonaws.swf.base.model#DomainDeprecatedFault", domain_name
+ )
+
+
+class SWFSerializationException(SWFClientError):
+ def __init__(self, value):
+ message = "class java.lang.Foo can not be converted to an String "
+ message += " (not a real SWF exception ; happened on: {0})".format(value)
+ __type = "com.amazonaws.swf.base.model#SerializationException"
+ super().__init__(__type, message)
+
+
+class SWFTypeAlreadyExistsFault(SWFClientError):
+ def __init__(self, _type):
+ super().__init__(
+ "com.amazonaws.swf.base.model#TypeAlreadyExistsFault",
+ "{0}=[name={1}, version={2}]".format(
+ _type.__class__.__name__, _type.name, _type.version
+ ),
+ )
+
+
+class SWFTypeDeprecatedFault(SWFClientError):
+ def __init__(self, _type):
+ super().__init__(
+ "com.amazonaws.swf.base.model#TypeDeprecatedFault",
+ "{0}=[name={1}, version={2}]".format(
+ _type.__class__.__name__, _type.name, _type.version
+ ),
+ )
+
+
+class SWFWorkflowExecutionAlreadyStartedFault(SWFClientError):
+ def __init__(self):
+ super().__init__(
+ "com.amazonaws.swf.base.model#WorkflowExecutionAlreadyStartedFault",
+ "Already Started",
+ )
+
+
+class SWFDefaultUndefinedFault(SWFClientError):
+ def __init__(self, key):
+ # TODO: move that into moto.core.utils maybe?
+ words = key.split("_")
+ key_camel_case = words.pop(0)
+ for word in words:
+ key_camel_case += word.capitalize()
+ super().__init__(
+ "com.amazonaws.swf.base.model#DefaultUndefinedFault", key_camel_case
+ )
+
+
+class SWFValidationException(SWFClientError):
+ def __init__(self, message):
+ super().__init__("com.amazon.coral.validate#ValidationException", message)
+
+
+class SWFDecisionValidationException(SWFClientError):
+ def __init__(self, problems):
+ # messages
+ messages = []
+ for pb in problems:
+ if pb["type"] == "null_value":
+ messages.append(
+ "Value null at '%(where)s' failed to satisfy constraint: "
+ "Member must not be null" % pb
+ )
+ elif pb["type"] == "bad_decision_type":
+ messages.append(
+ "Value '%(value)s' at '%(where)s' failed to satisfy constraint: "
+ "Member must satisfy enum value set: "
+ "[%(possible_values)s]" % pb
+ )
+ else:
+ raise ValueError(
+ "Unhandled decision constraint type: {0}".format(pb["type"])
+ )
+ # prefix
+ count = len(problems)
+ if count < 2:
+ prefix = "{0} validation error detected: "
+ else:
+ prefix = "{0} validation errors detected: "
+ super().__init__(
+ "com.amazon.coral.validate#ValidationException",
+ prefix.format(count) + "; ".join(messages),
+ )
+
+
+class SWFWorkflowExecutionClosedError(Exception):
+ def __str__(self):
+ return repr("Cannot change this object because the WorkflowExecution is closed")
diff --git a/contrib/python/moto/py3/moto/swf/models/__init__.py b/contrib/python/moto/py3/moto/swf/models/__init__.py
new file mode 100644
index 0000000000..2d7a98e509
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/__init__.py
@@ -0,0 +1,433 @@
+from moto.core import BaseBackend
+from moto.core.utils import BackendDict
+
+from ..exceptions import (
+ SWFUnknownResourceFault,
+ SWFDomainAlreadyExistsFault,
+ SWFDomainDeprecatedFault,
+ SWFTypeAlreadyExistsFault,
+ SWFTypeDeprecatedFault,
+ SWFValidationException,
+)
+from .activity_task import ActivityTask # noqa
+from .activity_type import ActivityType # noqa
+from .decision_task import DecisionTask # noqa
+from .domain import Domain # noqa
+from .generic_type import GenericType # noqa
+from .history_event import HistoryEvent # noqa
+from .timeout import Timeout # noqa
+from .timer import Timer # noqa
+from .workflow_type import WorkflowType # noqa
+from .workflow_execution import WorkflowExecution # noqa
+from time import sleep
+
+KNOWN_SWF_TYPES = {"activity": ActivityType, "workflow": WorkflowType}
+
+
+class SWFBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.domains = []
+
+ def _get_domain(self, name, ignore_empty=False):
+ matching = [domain for domain in self.domains if domain.name == name]
+ if not matching and not ignore_empty:
+ raise SWFUnknownResourceFault("domain", name)
+ if matching:
+ return matching[0]
+ return None
+
+ def _process_timeouts(self):
+ for domain in self.domains:
+ for wfe in domain.workflow_executions:
+ wfe._process_timeouts()
+
+ def list_domains(self, status, reverse_order=None):
+ domains = [domain for domain in self.domains if domain.status == status]
+ domains = sorted(domains, key=lambda domain: domain.name)
+ if reverse_order:
+ domains = reversed(domains)
+ return domains
+
+ def list_open_workflow_executions(
+ self, domain_name, maximum_page_size, tag_filter, reverse_order
+ ):
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ if domain.status == "DEPRECATED":
+ raise SWFDomainDeprecatedFault(domain_name)
+ open_wfes = [
+ wfe for wfe in domain.workflow_executions if wfe.execution_status == "OPEN"
+ ]
+
+ if tag_filter:
+ for open_wfe in open_wfes:
+ if tag_filter["tag"] not in open_wfe.tag_list:
+ open_wfes.remove(open_wfe)
+ if reverse_order:
+ open_wfes = reversed(open_wfes)
+ return open_wfes[0:maximum_page_size]
+
+ def list_closed_workflow_executions(
+ self,
+ domain_name,
+ tag_filter,
+ close_status_filter,
+ maximum_page_size,
+ reverse_order,
+ ):
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ if domain.status == "DEPRECATED":
+ raise SWFDomainDeprecatedFault(domain_name)
+ closed_wfes = [
+ wfe
+ for wfe in domain.workflow_executions
+ if wfe.execution_status == "CLOSED"
+ ]
+ if tag_filter:
+ for closed_wfe in closed_wfes:
+ if tag_filter["tag"] not in closed_wfe.tag_list:
+ closed_wfes.remove(closed_wfe)
+ if close_status_filter:
+ for closed_wfe in closed_wfes:
+ if close_status_filter != closed_wfe.close_status:
+ closed_wfes.remove(closed_wfe)
+ if reverse_order:
+ closed_wfes = reversed(closed_wfes)
+ return closed_wfes[0:maximum_page_size]
+
+ def register_domain(
+ self, name, workflow_execution_retention_period_in_days, description=None
+ ):
+ if self._get_domain(name, ignore_empty=True):
+ raise SWFDomainAlreadyExistsFault(name)
+ domain = Domain(
+ name,
+ workflow_execution_retention_period_in_days,
+ self.region_name,
+ description,
+ )
+ self.domains.append(domain)
+
+ def deprecate_domain(self, name):
+ domain = self._get_domain(name)
+ if domain.status == "DEPRECATED":
+ raise SWFDomainDeprecatedFault(name)
+ domain.status = "DEPRECATED"
+
+ def undeprecate_domain(self, name):
+ domain = self._get_domain(name)
+ if domain.status == "REGISTERED":
+ raise SWFDomainAlreadyExistsFault(name)
+ domain.status = "REGISTERED"
+
+ def describe_domain(self, name):
+ return self._get_domain(name)
+
+ def list_types(self, kind, domain_name, status, reverse_order=None):
+ domain = self._get_domain(domain_name)
+ _types = domain.find_types(kind, status)
+ _types = sorted(_types, key=lambda domain: domain.name)
+ if reverse_order:
+ _types = reversed(_types)
+ return _types
+
+ def register_type(self, kind, domain_name, name, version, **kwargs):
+ domain = self._get_domain(domain_name)
+ _type = domain.get_type(kind, name, version, ignore_empty=True)
+ if _type:
+ raise SWFTypeAlreadyExistsFault(_type)
+ _class = KNOWN_SWF_TYPES[kind]
+ _type = _class(name, version, **kwargs)
+ domain.add_type(_type)
+
+ def deprecate_type(self, kind, domain_name, name, version):
+ domain = self._get_domain(domain_name)
+ _type = domain.get_type(kind, name, version)
+ if _type.status == "DEPRECATED":
+ raise SWFTypeDeprecatedFault(_type)
+ _type.status = "DEPRECATED"
+
+ def undeprecate_type(self, kind, domain_name, name, version):
+ domain = self._get_domain(domain_name)
+ _type = domain.get_type(kind, name, version)
+ if _type.status == "REGISTERED":
+ raise SWFTypeAlreadyExistsFault(_type)
+ _type.status = "REGISTERED"
+
+ def describe_type(self, kind, domain_name, name, version):
+ domain = self._get_domain(domain_name)
+ return domain.get_type(kind, name, version)
+
+ def start_workflow_execution(
+ self,
+ domain_name,
+ workflow_id,
+ workflow_name,
+ workflow_version,
+ tag_list=None,
+ workflow_input=None,
+ **kwargs
+ ):
+ domain = self._get_domain(domain_name)
+ wf_type = domain.get_type("workflow", workflow_name, workflow_version)
+ if wf_type.status == "DEPRECATED":
+ raise SWFTypeDeprecatedFault(wf_type)
+ wfe = WorkflowExecution(
+ domain,
+ wf_type,
+ workflow_id,
+ tag_list=tag_list,
+ workflow_input=workflow_input,
+ **kwargs
+ )
+ domain.add_workflow_execution(wfe)
+ wfe.start()
+
+ return wfe
+
+ def describe_workflow_execution(self, domain_name, run_id, workflow_id):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ return domain.get_workflow_execution(workflow_id, run_id=run_id)
+
+ def poll_for_decision_task(self, domain_name, task_list, identity=None):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ # Real SWF cases:
+ # - case 1: there's a decision task to return, return it
+ # - case 2: there's no decision task to return, so wait for timeout
+ # and if a new decision is schedule, start and return it
+ # - case 3: timeout reached, no decision, return an empty decision
+ # (e.g. a decision with an empty "taskToken")
+ #
+ # For the sake of simplicity, we forget case 2 for now, so either
+ # there's a DecisionTask to return, either we return a blank one.
+ #
+ # SWF client libraries should cope with that easily as long as tests
+ # aren't distributed.
+ #
+ # TODO: handle long polling (case 2) for decision tasks
+ candidates = []
+ for _task_list, tasks in domain.decision_task_lists.items():
+ if _task_list == task_list:
+ candidates += [t for t in tasks if t.state == "SCHEDULED"]
+ if any(candidates):
+ # TODO: handle task priorities (but not supported by boto for now)
+ task = min(candidates, key=lambda d: d.scheduled_at)
+ wfe = task.workflow_execution
+ wfe.start_decision_task(task.task_token, identity=identity)
+ return task
+ else:
+ # Sleeping here will prevent clients that rely on the timeout from
+ # entering in a busy waiting loop.
+ sleep(1)
+ return None
+
+ def count_pending_decision_tasks(self, domain_name, task_list):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ count = 0
+ for wfe in domain.workflow_executions:
+ if wfe.task_list == task_list:
+ count += wfe.open_counts["openDecisionTasks"]
+ return count
+
+ def respond_decision_task_completed(
+ self, task_token, decisions=None, execution_context=None
+ ):
+ # process timeouts on all objects
+ self._process_timeouts()
+ # let's find decision task
+ decision_task = None
+ for domain in self.domains:
+ for wfe in domain.workflow_executions:
+ for dt in wfe.decision_tasks:
+ if dt.task_token == task_token:
+ decision_task = dt
+ # no decision task found
+ if not decision_task:
+ # In the real world, SWF distinguishes an obviously invalid token and a
+ # token that has no corresponding decision task. For the latter it seems
+ # to wait until a task with that token comes up (which looks like a smart
+ # choice in an eventually-consistent system). The call doesn't seem to
+ # timeout shortly, it takes 3 or 4 minutes to result in:
+ # BotoServerError: 500 Internal Server Error
+ # {"__type":"com.amazon.coral.service#InternalFailure"}
+ # This behavior is not documented clearly in SWF docs and we'll ignore it
+ # in moto, as there is no obvious reason to rely on it in tests.
+ raise SWFValidationException("Invalid token")
+ # decision task found, but WorflowExecution is CLOSED
+ wfe = decision_task.workflow_execution
+ if not wfe.open:
+ raise SWFUnknownResourceFault(
+ "execution",
+ "WorkflowExecution=[workflowId={0}, runId={1}]".format(
+ wfe.workflow_id, wfe.run_id
+ ),
+ )
+ # decision task found, but already completed
+ if decision_task.state != "STARTED":
+ if decision_task.state == "COMPLETED":
+ raise SWFUnknownResourceFault(
+ "decision task, scheduledEventId = {0}".format(
+ decision_task.scheduled_event_id
+ )
+ )
+ else:
+ raise ValueError(
+ "This shouldn't happen: you have to PollForDecisionTask to get a token, "
+ "which changes DecisionTask status to 'STARTED' ; then it can only change "
+ "to 'COMPLETED'. If you didn't hack moto/swf internals, this is probably "
+ "a bug in moto, please report it, thanks!"
+ )
+ # everything's good
+ if decision_task:
+ wfe = decision_task.workflow_execution
+ wfe.complete_decision_task(
+ decision_task.task_token,
+ decisions=decisions,
+ execution_context=execution_context,
+ )
+
+ def poll_for_activity_task(self, domain_name, task_list, identity=None):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ # Real SWF cases:
+ # - case 1: there's an activity task to return, return it
+ # - case 2: there's no activity task to return, so wait for timeout
+ # and if a new activity is scheduled, return it
+ # - case 3: timeout reached, no activity task, return an empty response
+ # (e.g. a response with an empty "taskToken")
+ #
+ # For the sake of simplicity, we forget case 2 for now, so either
+ # there's an ActivityTask to return, either we return a blank one.
+ #
+ # SWF client libraries should cope with that easily as long as tests
+ # aren't distributed.
+ #
+ # TODO: handle long polling (case 2) for activity tasks
+ candidates = []
+ for _task_list, tasks in domain.activity_task_lists.items():
+ if _task_list == task_list:
+ candidates += [t for t in tasks if t.state == "SCHEDULED"]
+ if any(candidates):
+ # TODO: handle task priorities (but not supported by boto for now)
+ task = min(candidates, key=lambda d: d.scheduled_at)
+ wfe = task.workflow_execution
+ wfe.start_activity_task(task.task_token, identity=identity)
+ return task
+ else:
+ # Sleeping here will prevent clients that rely on the timeout from
+ # entering in a busy waiting loop.
+ sleep(1)
+ return None
+
+ def count_pending_activity_tasks(self, domain_name, task_list):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ count = 0
+ for _task_list, tasks in domain.activity_task_lists.items():
+ if _task_list == task_list:
+ pending = [t for t in tasks if t.state in ["SCHEDULED", "STARTED"]]
+ count += len(pending)
+ return count
+
+ def _find_activity_task_from_token(self, task_token):
+ activity_task = None
+ for domain in self.domains:
+ for wfe in domain.workflow_executions:
+ for task in wfe.activity_tasks:
+ if task.task_token == task_token:
+ activity_task = task
+ # no task found
+ if not activity_task:
+ # Same as for decision tasks, we raise an invalid token BOTH for clearly
+ # wrong SWF tokens and OK tokens but not used correctly. This should not
+ # be a problem in moto.
+ raise SWFValidationException("Invalid token")
+ # activity task found, but WorflowExecution is CLOSED
+ wfe = activity_task.workflow_execution
+ if not wfe.open:
+ raise SWFUnknownResourceFault(
+ "execution",
+ "WorkflowExecution=[workflowId={0}, runId={1}]".format(
+ wfe.workflow_id, wfe.run_id
+ ),
+ )
+ # activity task found, but already completed
+ if activity_task.state != "STARTED":
+ if activity_task.state == "COMPLETED":
+ raise SWFUnknownResourceFault(
+ "activity, scheduledEventId = {0}".format(
+ activity_task.scheduled_event_id
+ )
+ )
+ else:
+ raise ValueError(
+ "This shouldn't happen: you have to PollForActivityTask to get a token, "
+ "which changes ActivityTask status to 'STARTED' ; then it can only change "
+ "to 'COMPLETED'. If you didn't hack moto/swf internals, this is probably "
+ "a bug in moto, please report it, thanks!"
+ )
+ # everything's good
+ return activity_task
+
+ def respond_activity_task_completed(self, task_token, result=None):
+ # process timeouts on all objects
+ self._process_timeouts()
+ activity_task = self._find_activity_task_from_token(task_token)
+ wfe = activity_task.workflow_execution
+ wfe.complete_activity_task(activity_task.task_token, result=result)
+
+ def respond_activity_task_failed(self, task_token, reason=None, details=None):
+ # process timeouts on all objects
+ self._process_timeouts()
+ activity_task = self._find_activity_task_from_token(task_token)
+ wfe = activity_task.workflow_execution
+ wfe.fail_activity_task(activity_task.task_token, reason=reason, details=details)
+
+ def terminate_workflow_execution(
+ self,
+ domain_name,
+ workflow_id,
+ child_policy=None,
+ details=None,
+ reason=None,
+ run_id=None,
+ ):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ wfe = domain.get_workflow_execution(
+ workflow_id, run_id=run_id, raise_if_closed=True
+ )
+ wfe.terminate(child_policy=child_policy, details=details, reason=reason)
+
+ def record_activity_task_heartbeat(self, task_token, details=None):
+ # process timeouts on all objects
+ self._process_timeouts()
+ activity_task = self._find_activity_task_from_token(task_token)
+ activity_task.reset_heartbeat_clock()
+ if details:
+ activity_task.details = details
+
+ def signal_workflow_execution(
+ self, domain_name, signal_name, workflow_id, workflow_input=None, run_id=None
+ ):
+ # process timeouts on all objects
+ self._process_timeouts()
+ domain = self._get_domain(domain_name)
+ wfe = domain.get_workflow_execution(
+ workflow_id, run_id=run_id, raise_if_closed=True
+ )
+ wfe.signal(signal_name, workflow_input)
+
+
+swf_backends = BackendDict(SWFBackend, "swf")
diff --git a/contrib/python/moto/py3/moto/swf/models/activity_task.py b/contrib/python/moto/py3/moto/swf/models/activity_task.py
new file mode 100644
index 0000000000..8d3ce0c4b9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/activity_task.py
@@ -0,0 +1,94 @@
+from datetime import datetime
+import uuid
+
+from moto.core import BaseModel
+from moto.core.utils import unix_time
+from ..exceptions import SWFWorkflowExecutionClosedError
+
+from .timeout import Timeout
+
+
+class ActivityTask(BaseModel):
+ def __init__(
+ self,
+ activity_id,
+ activity_type,
+ scheduled_event_id,
+ workflow_execution,
+ timeouts,
+ workflow_input=None,
+ ):
+ self.activity_id = activity_id
+ self.activity_type = activity_type
+ self.details = None
+ self.input = workflow_input
+ self.last_heartbeat_timestamp = unix_time()
+ self.scheduled_event_id = scheduled_event_id
+ self.started_event_id = None
+ self.state = "SCHEDULED"
+ self.task_token = str(uuid.uuid4())
+ self.timeouts = timeouts
+ self.timeout_type = None
+ self.workflow_execution = workflow_execution
+ # this is *not* necessarily coherent with workflow execution history,
+ # but that shouldn't be a problem for tests
+ self.scheduled_at = datetime.utcnow()
+
+ def _check_workflow_execution_open(self):
+ if not self.workflow_execution.open:
+ raise SWFWorkflowExecutionClosedError()
+
+ @property
+ def open(self):
+ return self.state in ["SCHEDULED", "STARTED"]
+
+ def to_full_dict(self):
+ hsh = {
+ "activityId": self.activity_id,
+ "activityType": self.activity_type.to_short_dict(),
+ "taskToken": self.task_token,
+ "startedEventId": self.started_event_id,
+ "workflowExecution": self.workflow_execution.to_short_dict(),
+ }
+ if self.input:
+ hsh["input"] = self.input
+ return hsh
+
+ def start(self, started_event_id):
+ self.state = "STARTED"
+ self.started_event_id = started_event_id
+
+ def complete(self):
+ self._check_workflow_execution_open()
+ self.state = "COMPLETED"
+
+ def fail(self):
+ self._check_workflow_execution_open()
+ self.state = "FAILED"
+
+ def reset_heartbeat_clock(self):
+ self.last_heartbeat_timestamp = unix_time()
+
+ def first_timeout(self):
+ if not self.open or not self.workflow_execution.open:
+ return None
+
+ if self.timeouts["heartbeatTimeout"] == "NONE":
+ return None
+
+ heartbeat_timeout_at = self.last_heartbeat_timestamp + int(
+ self.timeouts["heartbeatTimeout"]
+ )
+ _timeout = Timeout(self, heartbeat_timeout_at, "HEARTBEAT")
+ if _timeout.reached:
+ return _timeout
+
+ def process_timeouts(self):
+ _timeout = self.first_timeout()
+ if _timeout:
+ self.timeout(_timeout)
+
+ def timeout(self, _timeout):
+ self._check_workflow_execution_open()
+ self.state = "TIMED_OUT"
+ self.timeout_type = _timeout.kind
diff --git a/contrib/python/moto/py3/moto/swf/models/activity_type.py b/contrib/python/moto/py3/moto/swf/models/activity_type.py
new file mode 100644
index 0000000000..95a83ca7a1
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/activity_type.py
@@ -0,0 +1,16 @@
+from .generic_type import GenericType
+
+
+class ActivityType(GenericType):
+ @property
+ def _configuration_keys(self):
+ return [
+ "defaultTaskHeartbeatTimeout",
+ "defaultTaskScheduleToCloseTimeout",
+ "defaultTaskScheduleToStartTimeout",
+ "defaultTaskStartToCloseTimeout",
+ ]
+
+ @property
+ def kind(self):
+ return "activity"
diff --git a/contrib/python/moto/py3/moto/swf/models/decision_task.py b/contrib/python/moto/py3/moto/swf/models/decision_task.py
new file mode 100644
index 0000000000..980d5c12f5
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/decision_task.py
@@ -0,0 +1,78 @@
+from datetime import datetime
+import uuid
+
+from moto.core import BaseModel
+from moto.core.utils import unix_time
+from ..exceptions import SWFWorkflowExecutionClosedError
+
+from .timeout import Timeout
+
+
+class DecisionTask(BaseModel):
+ def __init__(self, workflow_execution, scheduled_event_id):
+ self.workflow_execution = workflow_execution
+ self.workflow_type = workflow_execution.workflow_type
+ self.task_token = str(uuid.uuid4())
+ self.scheduled_event_id = scheduled_event_id
+ self.previous_started_event_id = None
+ self.started_event_id = None
+ self.started_timestamp = None
+ self.start_to_close_timeout = (
+ self.workflow_execution.task_start_to_close_timeout
+ )
+ self.state = "SCHEDULED"
+ # this is *not* necessarily coherent with workflow execution history,
+ # but that shouldn't be a problem for tests
+ self.scheduled_at = datetime.utcnow()
+ self.timeout_type = None
+
+ @property
+ def started(self):
+ return self.state == "STARTED"
+
+ def _check_workflow_execution_open(self):
+ if not self.workflow_execution.open:
+ raise SWFWorkflowExecutionClosedError()
+
+ def to_full_dict(self, reverse_order=False):
+ events = self.workflow_execution.events(reverse_order=reverse_order)
+ hsh = {
+ "events": [evt.to_dict() for evt in events],
+ "taskToken": self.task_token,
+ "workflowExecution": self.workflow_execution.to_short_dict(),
+ "workflowType": self.workflow_type.to_short_dict(),
+ }
+ if self.previous_started_event_id is not None:
+ hsh["previousStartedEventId"] = self.previous_started_event_id
+ if self.started_event_id:
+ hsh["startedEventId"] = self.started_event_id
+ return hsh
+
+ def start(self, started_event_id, previous_started_event_id=None):
+ self.state = "STARTED"
+ self.started_timestamp = unix_time()
+ self.started_event_id = started_event_id
+ self.previous_started_event_id = previous_started_event_id
+
+ def complete(self):
+ self._check_workflow_execution_open()
+ self.state = "COMPLETED"
+
+ def first_timeout(self):
+ if not self.started or not self.workflow_execution.open:
+ return None
+ # TODO: handle the "NONE" case
+ start_to_close_at = self.started_timestamp + int(self.start_to_close_timeout)
+ _timeout = Timeout(self, start_to_close_at, "START_TO_CLOSE")
+ if _timeout.reached:
+ return _timeout
+
+ def process_timeouts(self):
+ _timeout = self.first_timeout()
+ if _timeout:
+ self.timeout(_timeout)
+
+ def timeout(self, _timeout):
+ self._check_workflow_execution_open()
+ self.state = "TIMED_OUT"
+ self.timeout_type = _timeout.kind
diff --git a/contrib/python/moto/py3/moto/swf/models/domain.py b/contrib/python/moto/py3/moto/swf/models/domain.py
new file mode 100644
index 0000000000..5230b5de72
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/domain.py
@@ -0,0 +1,131 @@
+from collections import defaultdict
+
+from moto.core import get_account_id, BaseModel
+from ..exceptions import (
+ SWFUnknownResourceFault,
+ SWFWorkflowExecutionAlreadyStartedFault,
+)
+
+
+class Domain(BaseModel):
+ def __init__(self, name, retention, region_name, description=None):
+ self.name = name
+ self.retention = retention
+ self.region_name = region_name
+ self.description = description
+ self.status = "REGISTERED"
+ self.types = {"activity": defaultdict(dict), "workflow": defaultdict(dict)}
+ # Workflow executions have an id, which unicity is guaranteed
+ # at domain level (not super clear in the docs, but I checked
+ # that against SWF API) ; hence the storage method as a dict
+ # of "workflow_id (client determined)" => WorkflowExecution()
+ # here.
+ self.workflow_executions = []
+ self.activity_task_lists = {}
+ self.decision_task_lists = {}
+
+ def __repr__(self):
+ return "Domain(name: %(name)s, status: %(status)s)" % self.__dict__
+
+ def to_short_dict(self):
+ hsh = {"name": self.name, "status": self.status}
+ if self.description:
+ hsh["description"] = self.description
+ hsh["arn"] = "arn:aws:swf:{0}:{1}:/domain/{2}".format(
+ self.region_name, get_account_id(), self.name
+ )
+ return hsh
+
+ def to_full_dict(self):
+ return {
+ "domainInfo": self.to_short_dict(),
+ "configuration": {"workflowExecutionRetentionPeriodInDays": self.retention},
+ }
+
+ def get_type(self, kind, name, version, ignore_empty=False):
+ try:
+ return self.types[kind][name][version]
+ except KeyError:
+ if not ignore_empty:
+ raise SWFUnknownResourceFault(
+ "type",
+ "{0}Type=[name={1}, version={2}]".format(
+ kind.capitalize(), name, version
+ ),
+ )
+
+ def add_type(self, _type):
+ self.types[_type.kind][_type.name][_type.version] = _type
+
+ def find_types(self, kind, status):
+ _all = []
+ for family in self.types[kind].values():
+ for _type in family.values():
+ if _type.status == status:
+ _all.append(_type)
+ return _all
+
+ def add_workflow_execution(self, workflow_execution):
+ _id = workflow_execution.workflow_id
+ if self.get_workflow_execution(_id, raise_if_none=False):
+ raise SWFWorkflowExecutionAlreadyStartedFault()
+ self.workflow_executions.append(workflow_execution)
+
+ def get_workflow_execution(
+ self, workflow_id, run_id=None, raise_if_none=True, raise_if_closed=False
+ ):
+ # query
+ if run_id:
+ _all = [
+ w
+ for w in self.workflow_executions
+ if w.workflow_id == workflow_id and w.run_id == run_id
+ ]
+ else:
+ _all = [
+ w
+ for w in self.workflow_executions
+ if w.workflow_id == workflow_id and w.open
+ ]
+ # reduce
+ wfe = _all[0] if _all else None
+ # raise if closed / none
+ if raise_if_closed and wfe and wfe.execution_status == "CLOSED":
+ wfe = None
+ if not wfe and raise_if_none:
+ if run_id:
+ args = [
+ "execution",
+ "WorkflowExecution=[workflowId={0}, runId={1}]".format(
+ workflow_id, run_id
+ ),
+ ]
+ else:
+ args = ["execution, workflowId = {0}".format(workflow_id)]
+ raise SWFUnknownResourceFault(*args)
+ # at last return workflow execution
+ return wfe
+
+ def add_to_activity_task_list(self, task_list, obj):
+ if task_list not in self.activity_task_lists:
+ self.activity_task_lists[task_list] = []
+ self.activity_task_lists[task_list].append(obj)
+
+ @property
+ def activity_tasks(self):
+ _all = []
+ for tasks in self.activity_task_lists.values():
+ _all += tasks
+ return _all
+
+ def add_to_decision_task_list(self, task_list, obj):
+ if task_list not in self.decision_task_lists:
+ self.decision_task_lists[task_list] = []
+ self.decision_task_lists[task_list].append(obj)
+
+ @property
+ def decision_tasks(self):
+ _all = []
+ for tasks in self.decision_task_lists.values():
+ _all += tasks
+ return _all
diff --git a/contrib/python/moto/py3/moto/swf/models/generic_type.py b/contrib/python/moto/py3/moto/swf/models/generic_type.py
new file mode 100644
index 0000000000..7f832ac0ac
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/generic_type.py
@@ -0,0 +1,61 @@
+from moto.core import BaseModel
+from moto.core.utils import camelcase_to_underscores
+
+
+class GenericType(BaseModel):
+ def __init__(self, name, version, **kwargs):
+ self.name = name
+ self.version = version
+ self.status = "REGISTERED"
+ if "description" in kwargs:
+ self.description = kwargs.pop("description")
+ for key, value in kwargs.items():
+ self.__setattr__(key, value)
+ # default values set to none
+ for key in self._configuration_keys:
+ attr = camelcase_to_underscores(key)
+ if not hasattr(self, attr):
+ self.__setattr__(attr, None)
+ if not hasattr(self, "task_list"):
+ self.task_list = None
+
+ def __repr__(self):
+ cls = self.__class__.__name__
+ attrs = (
+ "name: %(name)s, version: %(version)s, status: %(status)s" % self.__dict__
+ )
+ return "{0}({1})".format(cls, attrs)
+
+ @property
+ def kind(self):
+ raise NotImplementedError()
+
+ @property
+ def _configuration_keys(self):
+ raise NotImplementedError()
+
+ def to_short_dict(self):
+ return {"name": self.name, "version": self.version}
+
+ def to_medium_dict(self):
+ hsh = {
+ "{0}Type".format(self.kind): self.to_short_dict(),
+ "creationDate": 1420066800,
+ "status": self.status,
+ }
+ if self.status == "DEPRECATED":
+ hsh["deprecationDate"] = 1422745200
+ if hasattr(self, "description"):
+ hsh["description"] = self.description
+ return hsh
+
+ def to_full_dict(self):
+ hsh = {"typeInfo": self.to_medium_dict(), "configuration": {}}
+ if self.task_list:
+ hsh["configuration"]["defaultTaskList"] = {"name": self.task_list}
+ for key in self._configuration_keys:
+ attr = camelcase_to_underscores(key)
+ if not getattr(self, attr):
+ continue
+ hsh["configuration"][key] = getattr(self, attr)
+ return hsh
diff --git a/contrib/python/moto/py3/moto/swf/models/history_event.py b/contrib/python/moto/py3/moto/swf/models/history_event.py
new file mode 100644
index 0000000000..9b67709c87
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/history_event.py
@@ -0,0 +1,75 @@
+from moto.core import BaseModel
+from moto.core.utils import underscores_to_camelcase, unix_time
+
+from ..utils import decapitalize
+
+
+# We keep track of which history event types we support
+# so that we'll be able to catch specific formatting
+# for new events if needed.
+SUPPORTED_HISTORY_EVENT_TYPES = (
+ "WorkflowExecutionStarted",
+ "DecisionTaskScheduled",
+ "DecisionTaskStarted",
+ "DecisionTaskCompleted",
+ "WorkflowExecutionCompleted",
+ "WorkflowExecutionFailed",
+ "ActivityTaskScheduled",
+ "ScheduleActivityTaskFailed",
+ "ActivityTaskStarted",
+ "ActivityTaskCompleted",
+ "ActivityTaskFailed",
+ "WorkflowExecutionTerminated",
+ "ActivityTaskTimedOut",
+ "DecisionTaskTimedOut",
+ "WorkflowExecutionTimedOut",
+ "WorkflowExecutionSignaled",
+ "MarkerRecorded",
+ "TimerStarted",
+ "TimerCancelled",
+ "TimerFired",
+ "CancelTimerFailed",
+ "StartTimerFailed",
+ "WorkflowExecutionCanceled",
+ "CancelWorkflowExecutionFailed",
+)
+
+
+class HistoryEvent(BaseModel):
+ def __init__(self, event_id, event_type, event_timestamp=None, **kwargs):
+ if event_type not in SUPPORTED_HISTORY_EVENT_TYPES:
+ raise NotImplementedError(
+ "HistoryEvent does not implement attributes for type '{0}'".format(
+ event_type
+ )
+ )
+ self.event_id = event_id
+ self.event_type = event_type
+ if event_timestamp:
+ self.event_timestamp = event_timestamp
+ else:
+ self.event_timestamp = unix_time()
+ # pre-populate a dict: {"camelCaseKey": value}
+ self.event_attributes = {}
+ for key, value in kwargs.items():
+ if value:
+ camel_key = underscores_to_camelcase(key)
+ if key == "task_list":
+ value = {"name": value}
+ elif key == "workflow_type":
+ value = {"name": value.name, "version": value.version}
+ elif key == "activity_type":
+ value = value.to_short_dict()
+ self.event_attributes[camel_key] = value
+
+ def to_dict(self):
+ return {
+ "eventId": self.event_id,
+ "eventType": self.event_type,
+ "eventTimestamp": self.event_timestamp,
+ self._attributes_key(): self.event_attributes,
+ }
+
+ def _attributes_key(self):
+ key = "{0}EventAttributes".format(self.event_type)
+ return decapitalize(key)
diff --git a/contrib/python/moto/py3/moto/swf/models/timeout.py b/contrib/python/moto/py3/moto/swf/models/timeout.py
new file mode 100644
index 0000000000..bc576bb641
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/timeout.py
@@ -0,0 +1,13 @@
+from moto.core import BaseModel
+from moto.core.utils import unix_time
+
+
+class Timeout(BaseModel):
+ def __init__(self, obj, timestamp, kind):
+ self.obj = obj
+ self.timestamp = timestamp
+ self.kind = kind
+
+ @property
+ def reached(self):
+ return unix_time() >= self.timestamp
diff --git a/contrib/python/moto/py3/moto/swf/models/timer.py b/contrib/python/moto/py3/moto/swf/models/timer.py
new file mode 100644
index 0000000000..05a8fea377
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/timer.py
@@ -0,0 +1,16 @@
+from moto.core import BaseModel
+
+
+class Timer(BaseModel):
+ def __init__(self, background_timer, started_event_id):
+ self.background_timer = background_timer
+ self.started_event_id = started_event_id
+
+ def start(self):
+ return self.background_timer.start()
+
+ def is_alive(self):
+ return self.background_timer.is_alive()
+
+ def cancel(self):
+ return self.background_timer.cancel()
diff --git a/contrib/python/moto/py3/moto/swf/models/workflow_execution.py b/contrib/python/moto/py3/moto/swf/models/workflow_execution.py
new file mode 100644
index 0000000000..4cbeee7e64
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/workflow_execution.py
@@ -0,0 +1,754 @@
+import uuid
+from threading import Timer as ThreadingTimer, Lock
+
+from moto.core import BaseModel
+from moto.core.utils import camelcase_to_underscores, unix_time
+
+from ..constants import DECISIONS_FIELDS
+from ..exceptions import (
+ SWFDefaultUndefinedFault,
+ SWFValidationException,
+ SWFDecisionValidationException,
+)
+from ..utils import decapitalize
+from .activity_task import ActivityTask
+from .activity_type import ActivityType
+from .decision_task import DecisionTask
+from .history_event import HistoryEvent
+from .timeout import Timeout
+from .timer import Timer
+
+
+# TODO: extract decision related logic into a Decision class
+class WorkflowExecution(BaseModel):
+
+ # NB: the list is ordered exactly as in SWF validation exceptions so we can
+ # mimic error messages closely ; don't reorder it without checking SWF.
+ KNOWN_DECISION_TYPES = [
+ "CompleteWorkflowExecution",
+ "StartTimer",
+ "RequestCancelExternalWorkflowExecution",
+ "SignalExternalWorkflowExecution",
+ "CancelTimer",
+ "RecordMarker",
+ "ScheduleActivityTask",
+ "ContinueAsNewWorkflowExecution",
+ "ScheduleLambdaFunction",
+ "FailWorkflowExecution",
+ "RequestCancelActivityTask",
+ "StartChildWorkflowExecution",
+ "CancelWorkflowExecution",
+ ]
+
+ def __init__(self, domain, workflow_type, workflow_id, **kwargs):
+ self.domain = domain
+ self.workflow_id = workflow_id
+ self.run_id = uuid.uuid4().hex
+ # WorkflowExecutionInfo
+ self.cancel_requested = False
+ # TODO: check valid values among:
+ # COMPLETED | FAILED | CANCELED | TERMINATED | CONTINUED_AS_NEW | TIMED_OUT
+ # TODO: implement them all
+ self.close_cause = None
+ self.close_status = None
+ self.close_timestamp = None
+ self.execution_status = "OPEN"
+ self.latest_activity_task_timestamp = None
+ self.latest_execution_context = None
+ self.parent = None
+ self.start_timestamp = None
+ self.tag_list = kwargs.get("tag_list", None) or []
+ self.timeout_type = None
+ self.workflow_type = workflow_type
+ # args processing
+ # NB: the order follows boto/SWF order of exceptions appearance (if no
+ # param is set, # SWF will raise DefaultUndefinedFault errors in the
+ # same order as the few lines that follow)
+ self._set_from_kwargs_or_workflow_type(
+ kwargs, "execution_start_to_close_timeout"
+ )
+ self._set_from_kwargs_or_workflow_type(kwargs, "task_list", "task_list")
+ self._set_from_kwargs_or_workflow_type(kwargs, "task_start_to_close_timeout")
+ self._set_from_kwargs_or_workflow_type(kwargs, "child_policy")
+ self.input = kwargs.get("workflow_input")
+ # counters
+ self.open_counts = {
+ "openTimers": 0,
+ "openDecisionTasks": 0,
+ "openActivityTasks": 0,
+ "openChildWorkflowExecutions": 0,
+ "openLambdaFunctions": 0,
+ }
+ # events
+ self._events = []
+ # child workflows
+ self.child_workflow_executions = []
+ self._previous_started_event_id = None
+ # timers/thread utils
+ self.threading_lock = Lock()
+ self._timers = {}
+
+ def __repr__(self):
+ return "WorkflowExecution(run_id: {0})".format(self.run_id)
+
+ def _set_from_kwargs_or_workflow_type(
+ self, kwargs, local_key, workflow_type_key=None
+ ):
+ if workflow_type_key is None:
+ workflow_type_key = "default_" + local_key
+ value = kwargs.get(local_key)
+ if not value and hasattr(self.workflow_type, workflow_type_key):
+ value = getattr(self.workflow_type, workflow_type_key)
+ if not value:
+ raise SWFDefaultUndefinedFault(local_key)
+ setattr(self, local_key, value)
+
+ @property
+ def _configuration_keys(self):
+ return [
+ "executionStartToCloseTimeout",
+ "childPolicy",
+ "taskPriority",
+ "taskStartToCloseTimeout",
+ ]
+
+ def to_short_dict(self):
+ return {"workflowId": self.workflow_id, "runId": self.run_id}
+
+ def to_medium_dict(self):
+ hsh = {
+ "execution": self.to_short_dict(),
+ "workflowType": self.workflow_type.to_short_dict(),
+ "startTimestamp": 1420066800.123,
+ "executionStatus": self.execution_status,
+ "cancelRequested": self.cancel_requested,
+ }
+ if hasattr(self, "tag_list") and self.tag_list:
+ hsh["tagList"] = self.tag_list
+ return hsh
+
+ def to_full_dict(self):
+ hsh = {
+ "executionInfo": self.to_medium_dict(),
+ "executionConfiguration": {"taskList": {"name": self.task_list}},
+ }
+ # info
+ if self.execution_status == "CLOSED":
+ hsh["executionInfo"]["closeStatus"] = self.close_status
+ hsh["executionInfo"]["closeTimestamp"] = self.close_timestamp
+ # configuration
+ for key in self._configuration_keys:
+ attr = camelcase_to_underscores(key)
+ if not hasattr(self, attr):
+ continue
+ if not getattr(self, attr):
+ continue
+ hsh["executionConfiguration"][key] = getattr(self, attr)
+ # counters
+ hsh["openCounts"] = self.open_counts
+ # latest things
+ if self.latest_execution_context:
+ hsh["latestExecutionContext"] = self.latest_execution_context
+ if self.latest_activity_task_timestamp:
+ hsh["latestActivityTaskTimestamp"] = self.latest_activity_task_timestamp
+ return hsh
+
+ def to_list_dict(self):
+ hsh = {
+ "execution": {"workflowId": self.workflow_id, "runId": self.run_id},
+ "workflowType": self.workflow_type.to_short_dict(),
+ "startTimestamp": self.start_timestamp,
+ "executionStatus": self.execution_status,
+ "cancelRequested": self.cancel_requested,
+ }
+ if self.tag_list:
+ hsh["tagList"] = self.tag_list
+ if self.parent:
+ hsh["parent"] = self.parent
+ if self.close_status:
+ hsh["closeStatus"] = self.close_status
+ if self.close_timestamp:
+ hsh["closeTimestamp"] = self.close_timestamp
+ return hsh
+
+ def _process_timeouts(self):
+ """
+ SWF timeouts can happen on different objects (workflow executions,
+ activity tasks, decision tasks) and should be processed in order.
+
+ A specific timeout can change the workflow execution state and have an
+ impact on other timeouts: for instance, if the workflow execution
+ timeouts, subsequent timeouts on activity or decision tasks are
+ irrelevant ; if an activity task timeouts, other timeouts on this task
+ are irrelevant, and a new decision is fired, which could well timeout
+ before the end of the workflow.
+
+ So the idea here is to find the earliest timeout that would have been
+ triggered, process it, then make the workflow state progress and repeat
+ the whole process.
+ """
+ timeout_candidates = []
+
+ # workflow execution timeout
+ timeout_candidates.append(self.first_timeout())
+
+ # decision tasks timeouts
+ for task in self.decision_tasks:
+ timeout_candidates.append(task.first_timeout())
+
+ # activity tasks timeouts
+ for task in self.activity_tasks:
+ timeout_candidates.append(task.first_timeout())
+
+ # remove blank values (foo.first_timeout() is a Timeout or None)
+ timeout_candidates = list(filter(None, timeout_candidates))
+
+ # now find the first timeout to process
+ first_timeout = None
+ if timeout_candidates:
+ first_timeout = min(timeout_candidates, key=lambda t: t.timestamp)
+
+ if first_timeout:
+ should_schedule_decision_next = False
+ if isinstance(first_timeout.obj, WorkflowExecution):
+ self.timeout(first_timeout)
+ elif isinstance(first_timeout.obj, DecisionTask):
+ self.timeout_decision_task(first_timeout)
+ should_schedule_decision_next = True
+ elif isinstance(first_timeout.obj, ActivityTask):
+ self.timeout_activity_task(first_timeout)
+ should_schedule_decision_next = True
+ else:
+ raise NotImplementedError("Unhandled timeout object")
+
+ # schedule decision task if needed
+ if should_schedule_decision_next:
+ self.schedule_decision_task()
+
+ # the workflow execution progressed, let's see if another
+ # timeout should be processed
+ self._process_timeouts()
+
+ def events(self, reverse_order=False):
+ if reverse_order:
+ return reversed(self._events)
+ else:
+ return self._events
+
+ def next_event_id(self):
+ event_ids = [evt.event_id for evt in self._events]
+ return max(event_ids or [0]) + 1
+
+ def _add_event(self, *args, **kwargs):
+ # lock here because the fire_timer function is called
+ # async, and want to ensure uniqueness in event ids
+ with self.threading_lock:
+ evt = HistoryEvent(self.next_event_id(), *args, **kwargs)
+ self._events.append(evt)
+ return evt
+
+ def start(self):
+ self.start_timestamp = unix_time()
+ self._add_event(
+ "WorkflowExecutionStarted",
+ child_policy=self.child_policy,
+ execution_start_to_close_timeout=self.execution_start_to_close_timeout,
+ # TODO: fix this hardcoded value
+ parent_initiated_event_id=0,
+ task_list=self.task_list,
+ task_start_to_close_timeout=self.task_start_to_close_timeout,
+ workflow_type=self.workflow_type,
+ input=self.input,
+ )
+ self.schedule_decision_task()
+
+ def _schedule_decision_task(self):
+ evt = self._add_event(
+ "DecisionTaskScheduled",
+ start_to_close_timeout=self.task_start_to_close_timeout,
+ task_list=self.task_list,
+ )
+ self.domain.add_to_decision_task_list(
+ self.task_list, DecisionTask(self, evt.event_id)
+ )
+ self.open_counts["openDecisionTasks"] += 1
+
+ def schedule_decision_task(self):
+ self._schedule_decision_task()
+
+ # Shortcut for tests: helps having auto-starting decision tasks when needed
+ def schedule_and_start_decision_task(self, identity=None):
+ self._schedule_decision_task()
+ decision_task = self.decision_tasks[-1]
+ self.start_decision_task(decision_task.task_token, identity=identity)
+
+ @property
+ def decision_tasks(self):
+ return [t for t in self.domain.decision_tasks if t.workflow_execution == self]
+
+ @property
+ def activity_tasks(self):
+ return [t for t in self.domain.activity_tasks if t.workflow_execution == self]
+
+ def _find_decision_task(self, task_token):
+ for dt in self.decision_tasks:
+ if dt.task_token == task_token:
+ return dt
+ raise ValueError("No decision task with token: {0}".format(task_token))
+
+ def start_decision_task(self, task_token, identity=None):
+ dt = self._find_decision_task(task_token)
+ evt = self._add_event(
+ "DecisionTaskStarted",
+ scheduled_event_id=dt.scheduled_event_id,
+ identity=identity,
+ )
+ dt.start(evt.event_id, self._previous_started_event_id)
+ self._previous_started_event_id = evt.event_id
+
+ def complete_decision_task(
+ self, task_token, decisions=None, execution_context=None
+ ):
+ # 'decisions' can be None per boto.swf defaults, so replace it with something iterable
+ if not decisions:
+ decisions = []
+ # In case of a malformed or invalid decision task, SWF will raise an error and
+ # it won't perform any of the decisions in the decision set.
+ self.validate_decisions(decisions)
+ dt = self._find_decision_task(task_token)
+ evt = self._add_event(
+ "DecisionTaskCompleted",
+ scheduled_event_id=dt.scheduled_event_id,
+ started_event_id=dt.started_event_id,
+ execution_context=execution_context,
+ )
+ dt.complete()
+ self.should_schedule_decision_next = False
+ self.handle_decisions(evt.event_id, decisions)
+ if self.should_schedule_decision_next:
+ self.schedule_decision_task()
+ self.latest_execution_context = execution_context
+
+ def _check_decision_attributes(self, kind, value, decision_id):
+ problems = []
+ constraints = DECISIONS_FIELDS.get(kind, {})
+ for key, constraint in constraints.items():
+ if constraint["required"] and not value.get(key):
+ problems.append(
+ {
+ "type": "null_value",
+ "where": "decisions.{0}.member.{1}.{2}".format(
+ decision_id, kind, key
+ ),
+ }
+ )
+ return problems
+
+ def validate_decisions(self, decisions):
+ """
+ Performs some basic validations on decisions. The real SWF service
+ seems to break early and *not* process any decision if there's a
+ validation problem, such as a malformed decision for instance. I didn't
+ find an explicit documentation for that though, so criticisms welcome.
+ """
+ problems = []
+
+ # check close decision is last
+ # (the real SWF service also works that way if you provide 2 close decision tasks)
+ for dcs in decisions[:-1]:
+ close_decision_types = [
+ "CompleteWorkflowExecution",
+ "FailWorkflowExecution",
+ "CancelWorkflowExecution",
+ ]
+ if dcs["decisionType"] in close_decision_types:
+ raise SWFValidationException("Close must be last decision in list")
+
+ decision_number = 0
+ for dcs in decisions:
+ decision_number += 1
+ # check decision types mandatory attributes
+ # NB: the real SWF service seems to check attributes even for attributes list
+ # that are not in line with the decisionType, so we do the same
+ attrs_to_check = [d for d in dcs.keys() if d.endswith("DecisionAttributes")]
+ if dcs["decisionType"] in self.KNOWN_DECISION_TYPES:
+ decision_type = dcs["decisionType"]
+ decision_attr = "{0}DecisionAttributes".format(
+ decapitalize(decision_type)
+ )
+ attrs_to_check.append(decision_attr)
+ for attr in attrs_to_check:
+ problems += self._check_decision_attributes(
+ attr, dcs.get(attr, {}), decision_number
+ )
+ # check decision type is correct
+ if dcs["decisionType"] not in self.KNOWN_DECISION_TYPES:
+ problems.append(
+ {
+ "type": "bad_decision_type",
+ "value": dcs["decisionType"],
+ "where": "decisions.{0}.member.decisionType".format(
+ decision_number
+ ),
+ "possible_values": ", ".join(self.KNOWN_DECISION_TYPES),
+ }
+ )
+
+ # raise if any problem
+ if any(problems):
+ raise SWFDecisionValidationException(problems)
+
+ def handle_decisions(self, event_id, decisions):
+ """
+ Handles a Decision according to SWF docs.
+ See: http://docs.aws.amazon.com/amazonswf/latest/apireference/API_Decision.html
+ """
+ # handle each decision separately, in order
+ for decision in decisions:
+ decision_type = decision["decisionType"]
+ attributes_key = "{0}DecisionAttributes".format(decapitalize(decision_type))
+ attributes = decision.get(attributes_key, {})
+ if decision_type == "CompleteWorkflowExecution":
+ self.complete(event_id, attributes.get("result"))
+ elif decision_type == "FailWorkflowExecution":
+ self.fail(event_id, attributes.get("details"), attributes.get("reason"))
+ elif decision_type == "ScheduleActivityTask":
+ self.schedule_activity_task(event_id, attributes)
+ elif decision_type == "RecordMarker":
+ self.record_marker(event_id, attributes)
+ elif decision_type == "StartTimer":
+ self.start_timer(event_id, attributes)
+ elif decision_type == "CancelTimer":
+ self.cancel_timer(event_id, attributes["timerId"])
+ elif decision_type == "CancelWorkflowExecution":
+ self.cancel(event_id, attributes.get("details"))
+ else:
+ # TODO: implement Decision type: ContinueAsNewWorkflowExecution
+ # TODO: implement Decision type: RequestCancelActivityTask
+ # TODO: implement Decision type: RequestCancelExternalWorkflowExecution
+ # TODO: implement Decision type: ScheduleLambdaFunction
+ # TODO: implement Decision type: SignalExternalWorkflowExecution
+ # TODO: implement Decision type: StartChildWorkflowExecution
+ raise NotImplementedError(
+ "Cannot handle decision: {0}".format(decision_type)
+ )
+
+ # finally decrement counter if and only if everything went well
+ self.open_counts["openDecisionTasks"] -= 1
+
+ def complete(self, event_id, result=None):
+ self.execution_status = "CLOSED"
+ self.close_status = "COMPLETED"
+ self.close_timestamp = unix_time()
+ self._add_event(
+ "WorkflowExecutionCompleted",
+ decision_task_completed_event_id=event_id,
+ result=result,
+ )
+
+ def fail(self, event_id, details=None, reason=None):
+ # TODO: implement length constraints on details/reason
+ self.execution_status = "CLOSED"
+ self.close_status = "FAILED"
+ self.close_timestamp = unix_time()
+ self._add_event(
+ "WorkflowExecutionFailed",
+ decision_task_completed_event_id=event_id,
+ details=details,
+ reason=reason,
+ )
+
+ def cancel(self, event_id, details=None):
+ # TODO: implement length constraints on details
+ self.cancel_requested = True
+ # Can only cancel if there are no other pending desicion tasks
+ if self.open_counts["openDecisionTasks"] != 1:
+ # TODO OPERATION_NOT_PERMITTED is a valid failure state
+ self._add_event(
+ "CancelWorkflowExecutionFailed",
+ decision_task_completed_event_id=event_id,
+ cause="UNHANDLED_DECISION",
+ )
+ return
+ self.execution_status = "CLOSED"
+ self.close_status = "CANCELED"
+ self.close_timestamp = unix_time()
+ self._add_event(
+ "WorkflowExecutionCanceled",
+ decision_task_completed_event_id=event_id,
+ details=details,
+ )
+
+ def schedule_activity_task(self, event_id, attributes):
+ # Helper function to avoid repeating ourselves in the next sections
+ def fail_schedule_activity_task(_type, _cause):
+ # TODO: implement other possible failure mode: OPEN_ACTIVITIES_LIMIT_EXCEEDED
+ # NB: some failure modes are not implemented and probably won't be implemented in
+ # the future, such as ACTIVITY_CREATION_RATE_EXCEEDED or
+ # OPERATION_NOT_PERMITTED
+ self._add_event(
+ "ScheduleActivityTaskFailed",
+ activity_id=attributes["activityId"],
+ activity_type=_type,
+ cause=_cause,
+ decision_task_completed_event_id=event_id,
+ )
+ self.should_schedule_decision_next = True
+
+ activity_type = self.domain.get_type(
+ "activity",
+ attributes["activityType"]["name"],
+ attributes["activityType"]["version"],
+ ignore_empty=True,
+ )
+ if not activity_type:
+ fake_type = ActivityType(
+ attributes["activityType"]["name"],
+ attributes["activityType"]["version"],
+ )
+ fail_schedule_activity_task(fake_type, "ACTIVITY_TYPE_DOES_NOT_EXIST")
+ return
+ if activity_type.status == "DEPRECATED":
+ fail_schedule_activity_task(activity_type, "ACTIVITY_TYPE_DEPRECATED")
+ return
+ if any(
+ at
+ for at in self.activity_tasks
+ if at.activity_id == attributes["activityId"]
+ ):
+ fail_schedule_activity_task(activity_type, "ACTIVITY_ID_ALREADY_IN_USE")
+ return
+
+ # find task list or default task list, else fail
+ task_list = attributes.get("taskList", {}).get("name")
+ if not task_list and activity_type.task_list:
+ task_list = activity_type.task_list
+ if not task_list:
+ fail_schedule_activity_task(activity_type, "DEFAULT_TASK_LIST_UNDEFINED")
+ return
+
+ # find timeouts or default timeout, else fail
+ timeouts = {}
+ for _type in [
+ "scheduleToStartTimeout",
+ "scheduleToCloseTimeout",
+ "startToCloseTimeout",
+ "heartbeatTimeout",
+ ]:
+ default_key = "default_task_" + camelcase_to_underscores(_type)
+ default_value = getattr(activity_type, default_key)
+ timeouts[_type] = attributes.get(_type, default_value)
+ if not timeouts[_type]:
+ error_key = default_key.replace("default_task_", "default_")
+ fail_schedule_activity_task(
+ activity_type, "{0}_UNDEFINED".format(error_key.upper())
+ )
+ return
+
+ # Only add event and increment counters now that nothing went wrong
+ evt = self._add_event(
+ "ActivityTaskScheduled",
+ activity_id=attributes["activityId"],
+ activity_type=activity_type,
+ control=attributes.get("control"),
+ decision_task_completed_event_id=event_id,
+ heartbeat_timeout=attributes.get("heartbeatTimeout"),
+ input=attributes.get("input"),
+ schedule_to_close_timeout=attributes.get("scheduleToCloseTimeout"),
+ schedule_to_start_timeout=attributes.get("scheduleToStartTimeout"),
+ start_to_close_timeout=attributes.get("startToCloseTimeout"),
+ task_list=task_list,
+ task_priority=attributes.get("taskPriority"),
+ )
+ task = ActivityTask(
+ activity_id=attributes["activityId"],
+ activity_type=activity_type,
+ workflow_input=attributes.get("input"),
+ scheduled_event_id=evt.event_id,
+ workflow_execution=self,
+ timeouts=timeouts,
+ )
+ self.domain.add_to_activity_task_list(task_list, task)
+ self.open_counts["openActivityTasks"] += 1
+ self.latest_activity_task_timestamp = unix_time()
+
+ def _find_activity_task(self, task_token):
+ for task in self.activity_tasks:
+ if task.task_token == task_token:
+ return task
+ raise ValueError("No activity task with token: {0}".format(task_token))
+
+ def start_activity_task(self, task_token, identity=None):
+ task = self._find_activity_task(task_token)
+ evt = self._add_event(
+ "ActivityTaskStarted",
+ scheduled_event_id=task.scheduled_event_id,
+ identity=identity,
+ )
+ task.start(evt.event_id)
+
+ def complete_activity_task(self, task_token, result=None):
+ task = self._find_activity_task(task_token)
+ self._add_event(
+ "ActivityTaskCompleted",
+ scheduled_event_id=task.scheduled_event_id,
+ started_event_id=task.started_event_id,
+ result=result,
+ )
+ task.complete()
+ self.open_counts["openActivityTasks"] -= 1
+ # TODO: ensure we don't schedule multiple decisions at the same time!
+ self.schedule_decision_task()
+
+ def fail_activity_task(self, task_token, reason=None, details=None):
+ task = self._find_activity_task(task_token)
+ self._add_event(
+ "ActivityTaskFailed",
+ scheduled_event_id=task.scheduled_event_id,
+ started_event_id=task.started_event_id,
+ reason=reason,
+ details=details,
+ )
+ task.fail()
+ self.open_counts["openActivityTasks"] -= 1
+ # TODO: ensure we don't schedule multiple decisions at the same time!
+ self.schedule_decision_task()
+
+ def terminate(self, child_policy=None, details=None, reason=None):
+ # TODO: handle child policy for child workflows here
+ # TODO: handle cause="CHILD_POLICY_APPLIED"
+ # Until this, we set cause manually to "OPERATOR_INITIATED"
+ cause = "OPERATOR_INITIATED"
+ if not child_policy:
+ child_policy = self.child_policy
+ self._add_event(
+ "WorkflowExecutionTerminated",
+ cause=cause,
+ child_policy=child_policy,
+ details=details,
+ reason=reason,
+ )
+ self.execution_status = "CLOSED"
+ self.close_status = "TERMINATED"
+ self.close_cause = "OPERATOR_INITIATED"
+
+ def signal(self, signal_name, workflow_input):
+ self._add_event(
+ "WorkflowExecutionSignaled", signal_name=signal_name, input=workflow_input
+ )
+ self.schedule_decision_task()
+
+ def first_timeout(self):
+ if not self.open or not self.start_timestamp:
+ return None
+ start_to_close_at = self.start_timestamp + int(
+ self.execution_start_to_close_timeout
+ )
+ _timeout = Timeout(self, start_to_close_at, "START_TO_CLOSE")
+ if _timeout.reached:
+ return _timeout
+
+ def timeout(self, timeout):
+ # TODO: process child policy on child workflows here or in the
+ # triggering function
+ self.execution_status = "CLOSED"
+ self.close_status = "TIMED_OUT"
+ self.timeout_type = timeout.kind
+ self._add_event(
+ "WorkflowExecutionTimedOut",
+ child_policy=self.child_policy,
+ event_timestamp=timeout.timestamp,
+ timeout_type=self.timeout_type,
+ )
+
+ def timeout_decision_task(self, _timeout):
+ task = _timeout.obj
+ task.timeout(_timeout)
+ self._add_event(
+ "DecisionTaskTimedOut",
+ event_timestamp=_timeout.timestamp,
+ scheduled_event_id=task.scheduled_event_id,
+ started_event_id=task.started_event_id,
+ timeout_type=task.timeout_type,
+ )
+
+ def timeout_activity_task(self, _timeout):
+ task = _timeout.obj
+ task.timeout(_timeout)
+ self._add_event(
+ "ActivityTaskTimedOut",
+ details=task.details,
+ event_timestamp=_timeout.timestamp,
+ scheduled_event_id=task.scheduled_event_id,
+ started_event_id=task.started_event_id,
+ timeout_type=task.timeout_type,
+ )
+
+ def record_marker(self, event_id, attributes):
+ self._add_event(
+ "MarkerRecorded",
+ decision_task_completed_event_id=event_id,
+ details=attributes.get("details"),
+ marker_name=attributes["markerName"],
+ )
+
+ def start_timer(self, event_id, attributes):
+ timer_id = attributes["timerId"]
+ existing_timer = self._timers.get(timer_id)
+ if existing_timer and existing_timer.is_alive():
+ # TODO 4 fail states are possible
+ # TIMER_ID_ALREADY_IN_USE | OPEN_TIMERS_LIMIT_EXCEEDED | TIMER_CREATION_RATE_EXCEEDED | OPERATION_NOT_PERMITTED
+ self._add_event(
+ "StartTimerFailed",
+ cause="TIMER_ID_ALREADY_IN_USE",
+ decision_task_completed_event_id=event_id,
+ timer_id=timer_id,
+ )
+ return
+
+ time_to_wait = attributes["startToFireTimeout"]
+ started_event_id = self._add_event(
+ "TimerStarted",
+ control=attributes.get("control"),
+ decision_task_completed_event_id=event_id,
+ start_to_fire_timeout=time_to_wait,
+ timer_id=timer_id,
+ ).event_id
+ background_timer = ThreadingTimer(
+ float(time_to_wait), self._fire_timer, args=(started_event_id, timer_id)
+ )
+ workflow_timer = Timer(background_timer, started_event_id)
+ self._timers[timer_id] = workflow_timer
+ workflow_timer.start()
+
+ def _fire_timer(self, started_event_id, timer_id):
+ self._add_event(
+ "TimerFired", started_event_id=started_event_id, timer_id=timer_id
+ )
+ self._timers.pop(timer_id)
+ self._schedule_decision_task()
+
+ def cancel_timer(self, event_id, timer_id):
+ requested_timer = self._timers.get(timer_id)
+ if not requested_timer or not requested_timer.is_alive():
+ # TODO there are 2 failure states
+ # TIMER_ID_UNKNOWN | OPERATION_NOT_PERMITTED
+ self._add_event(
+ "CancelTimerFailed",
+ cause="TIMER_ID_UNKNOWN",
+ decision_task_completed_event_id=event_id,
+ )
+ return
+
+ requested_timer.cancel()
+ self._timers.pop(timer_id)
+ self._add_event(
+ "TimerCancelled",
+ decision_task_completed_event_id=event_id,
+ started_event_id=requested_timer.started_event_id,
+ timer_id=timer_id,
+ )
+
+ @property
+ def open(self):
+ return self.execution_status == "OPEN"
diff --git a/contrib/python/moto/py3/moto/swf/models/workflow_type.py b/contrib/python/moto/py3/moto/swf/models/workflow_type.py
new file mode 100644
index 0000000000..137f0e2214
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/models/workflow_type.py
@@ -0,0 +1,17 @@
+from .generic_type import GenericType
+
+
+class WorkflowType(GenericType):
+ @property
+ def _configuration_keys(self):
+ return [
+ "defaultChildPolicy",
+ "defaultExecutionStartToCloseTimeout",
+ "defaultTaskStartToCloseTimeout",
+ "defaultTaskPriority",
+ "defaultLambdaRole",
+ ]
+
+ @property
+ def kind(self):
+ return "workflow"
diff --git a/contrib/python/moto/py3/moto/swf/responses.py b/contrib/python/moto/py3/moto/swf/responses.py
new file mode 100644
index 0000000000..9de26facd8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/responses.py
@@ -0,0 +1,553 @@
+import json
+
+from moto.core.responses import BaseResponse
+
+from .exceptions import SWFSerializationException, SWFValidationException
+from .models import swf_backends
+
+
+class SWFResponse(BaseResponse):
+ @property
+ def swf_backend(self):
+ return swf_backends[self.region]
+
+ # SWF parameters are passed through a JSON body, so let's ease retrieval
+ @property
+ def _params(self):
+ return json.loads(self.body)
+
+ def _check_int(self, parameter):
+ if not isinstance(parameter, int):
+ raise SWFSerializationException(parameter)
+
+ def _check_float_or_int(self, parameter):
+ if not isinstance(parameter, float):
+ if not isinstance(parameter, int):
+ raise SWFSerializationException(parameter)
+
+ def _check_none_or_string(self, parameter):
+ if parameter is not None:
+ self._check_string(parameter)
+
+ def _check_string(self, parameter):
+ if not isinstance(parameter, str):
+ raise SWFSerializationException(parameter)
+
+ def _check_none_or_list_of_strings(self, parameter):
+ if parameter is not None:
+ self._check_list_of_strings(parameter)
+
+ def _check_list_of_strings(self, parameter):
+ if not isinstance(parameter, list):
+ raise SWFSerializationException(parameter)
+ for i in parameter:
+ if not isinstance(i, str):
+ raise SWFSerializationException(parameter)
+
+ def _check_exclusivity(self, **kwargs):
+ if list(kwargs.values()).count(None) >= len(kwargs) - 1:
+ return
+ keys = kwargs.keys()
+ if len(keys) == 2:
+ message = "Cannot specify both a {0} and a {1}".format(keys[0], keys[1])
+ else:
+ message = (
+ "Cannot specify more than one exclusive filters in the"
+ " same query: {0}".format(keys)
+ )
+ raise SWFValidationException(message)
+
+ def _list_types(self, kind):
+ domain_name = self._params["domain"]
+ status = self._params["registrationStatus"]
+ reverse_order = self._params.get("reverseOrder", None)
+ self._check_string(domain_name)
+ self._check_string(status)
+ types = self.swf_backend.list_types(
+ kind, domain_name, status, reverse_order=reverse_order
+ )
+ return json.dumps({"typeInfos": [_type.to_medium_dict() for _type in types]})
+
+ def _describe_type(self, kind):
+ domain = self._params["domain"]
+ _type_args = self._params["{0}Type".format(kind)]
+ name = _type_args["name"]
+ version = _type_args["version"]
+ self._check_string(domain)
+ self._check_string(name)
+ self._check_string(version)
+ _type = self.swf_backend.describe_type(kind, domain, name, version)
+
+ return json.dumps(_type.to_full_dict())
+
+ def _deprecate_type(self, kind):
+ domain = self._params["domain"]
+ _type_args = self._params["{0}Type".format(kind)]
+ name = _type_args["name"]
+ version = _type_args["version"]
+ self._check_string(domain)
+ self._check_string(name)
+ self._check_string(version)
+ self.swf_backend.deprecate_type(kind, domain, name, version)
+ return ""
+
+ def _undeprecate_type(self, kind):
+ domain = self._params["domain"]
+ _type_args = self._params["{0}Type".format(kind)]
+ name = _type_args["name"]
+ version = _type_args["version"]
+ self._check_string(domain)
+ self._check_string(name)
+ self._check_string(version)
+ self.swf_backend.undeprecate_type(kind, domain, name, version)
+ return ""
+
+ # TODO: implement pagination
+ def list_domains(self):
+ status = self._params["registrationStatus"]
+ self._check_string(status)
+ reverse_order = self._params.get("reverseOrder", None)
+ domains = self.swf_backend.list_domains(status, reverse_order=reverse_order)
+ return json.dumps(
+ {"domainInfos": [domain.to_short_dict() for domain in domains]}
+ )
+
+ def list_closed_workflow_executions(self):
+ domain = self._params["domain"]
+ start_time_filter = self._params.get("startTimeFilter", None)
+ close_time_filter = self._params.get("closeTimeFilter", None)
+ execution_filter = self._params.get("executionFilter", None)
+ workflow_id = execution_filter["workflowId"] if execution_filter else None
+ maximum_page_size = self._params.get("maximumPageSize", 1000)
+ reverse_order = self._params.get("reverseOrder", None)
+ tag_filter = self._params.get("tagFilter", None)
+ type_filter = self._params.get("typeFilter", None)
+ close_status_filter = self._params.get("closeStatusFilter", None)
+
+ self._check_string(domain)
+ self._check_none_or_string(workflow_id)
+ self._check_exclusivity(
+ executionFilter=execution_filter,
+ typeFilter=type_filter,
+ tagFilter=tag_filter,
+ closeStatusFilter=close_status_filter,
+ )
+ self._check_exclusivity(
+ startTimeFilter=start_time_filter, closeTimeFilter=close_time_filter
+ )
+ if start_time_filter is None and close_time_filter is None:
+ raise SWFValidationException("Must specify time filter")
+ if start_time_filter:
+ self._check_float_or_int(start_time_filter["oldestDate"])
+ if "latestDate" in start_time_filter:
+ self._check_float_or_int(start_time_filter["latestDate"])
+ if close_time_filter:
+ self._check_float_or_int(close_time_filter["oldestDate"])
+ if "latestDate" in close_time_filter:
+ self._check_float_or_int(close_time_filter["latestDate"])
+ if tag_filter:
+ self._check_string(tag_filter["tag"])
+ if type_filter:
+ self._check_string(type_filter["name"])
+ self._check_string(type_filter["version"])
+ if close_status_filter:
+ self._check_string(close_status_filter["status"])
+ self._check_int(maximum_page_size)
+
+ workflow_executions = self.swf_backend.list_closed_workflow_executions(
+ domain_name=domain,
+ tag_filter=tag_filter,
+ close_status_filter=close_status_filter,
+ maximum_page_size=maximum_page_size,
+ reverse_order=reverse_order,
+ )
+
+ return json.dumps(
+ {"executionInfos": [wfe.to_list_dict() for wfe in workflow_executions]}
+ )
+
+ def list_open_workflow_executions(self):
+ domain = self._params["domain"]
+ start_time_filter = self._params["startTimeFilter"]
+ execution_filter = self._params.get("executionFilter", None)
+ workflow_id = execution_filter["workflowId"] if execution_filter else None
+ maximum_page_size = self._params.get("maximumPageSize", 1000)
+ reverse_order = self._params.get("reverseOrder", None)
+ tag_filter = self._params.get("tagFilter", None)
+ type_filter = self._params.get("typeFilter", None)
+
+ self._check_string(domain)
+ self._check_none_or_string(workflow_id)
+ self._check_exclusivity(
+ executionFilter=execution_filter,
+ typeFilter=type_filter,
+ tagFilter=tag_filter,
+ )
+ self._check_float_or_int(start_time_filter["oldestDate"])
+ if "latestDate" in start_time_filter:
+ self._check_float_or_int(start_time_filter["latestDate"])
+ if tag_filter:
+ self._check_string(tag_filter["tag"])
+ if type_filter:
+ self._check_string(type_filter["name"])
+ self._check_string(type_filter["version"])
+ self._check_int(maximum_page_size)
+
+ workflow_executions = self.swf_backend.list_open_workflow_executions(
+ domain_name=domain,
+ maximum_page_size=maximum_page_size,
+ tag_filter=tag_filter,
+ reverse_order=reverse_order,
+ )
+
+ return json.dumps(
+ {"executionInfos": [wfe.to_list_dict() for wfe in workflow_executions]}
+ )
+
+ def register_domain(self):
+ name = self._params["name"]
+ retention = self._params["workflowExecutionRetentionPeriodInDays"]
+ description = self._params.get("description")
+ self._check_string(retention)
+ self._check_string(name)
+ self._check_none_or_string(description)
+ self.swf_backend.register_domain(name, retention, description=description)
+ return ""
+
+ def deprecate_domain(self):
+ name = self._params["name"]
+ self._check_string(name)
+ self.swf_backend.deprecate_domain(name)
+ return ""
+
+ def undeprecate_domain(self):
+ name = self._params["name"]
+ self._check_string(name)
+ self.swf_backend.undeprecate_domain(name)
+ return ""
+
+ def describe_domain(self):
+ name = self._params["name"]
+ self._check_string(name)
+ domain = self.swf_backend.describe_domain(name)
+ return json.dumps(domain.to_full_dict())
+
+ # TODO: implement pagination
+ def list_activity_types(self):
+ return self._list_types("activity")
+
+ def register_activity_type(self):
+ domain = self._params["domain"]
+ name = self._params["name"]
+ version = self._params["version"]
+ default_task_list = self._params.get("defaultTaskList")
+ if default_task_list:
+ task_list = default_task_list.get("name")
+ else:
+ task_list = None
+ default_task_heartbeat_timeout = self._params.get("defaultTaskHeartbeatTimeout")
+ default_task_schedule_to_close_timeout = self._params.get(
+ "defaultTaskScheduleToCloseTimeout"
+ )
+ default_task_schedule_to_start_timeout = self._params.get(
+ "defaultTaskScheduleToStartTimeout"
+ )
+ default_task_start_to_close_timeout = self._params.get(
+ "defaultTaskStartToCloseTimeout"
+ )
+ description = self._params.get("description")
+
+ self._check_string(domain)
+ self._check_string(name)
+ self._check_string(version)
+ self._check_none_or_string(task_list)
+ self._check_none_or_string(default_task_heartbeat_timeout)
+ self._check_none_or_string(default_task_schedule_to_close_timeout)
+ self._check_none_or_string(default_task_schedule_to_start_timeout)
+ self._check_none_or_string(default_task_start_to_close_timeout)
+ self._check_none_or_string(description)
+
+ # TODO: add defaultTaskPriority when boto gets to support it
+ self.swf_backend.register_type(
+ "activity",
+ domain,
+ name,
+ version,
+ task_list=task_list,
+ default_task_heartbeat_timeout=default_task_heartbeat_timeout,
+ default_task_schedule_to_close_timeout=default_task_schedule_to_close_timeout,
+ default_task_schedule_to_start_timeout=default_task_schedule_to_start_timeout,
+ default_task_start_to_close_timeout=default_task_start_to_close_timeout,
+ description=description,
+ )
+ return ""
+
+ def deprecate_activity_type(self):
+ return self._deprecate_type("activity")
+
+ def undeprecate_activity_type(self):
+ return self._undeprecate_type("activity")
+
+ def describe_activity_type(self):
+ return self._describe_type("activity")
+
+ def list_workflow_types(self):
+ return self._list_types("workflow")
+
+ def register_workflow_type(self):
+ domain = self._params["domain"]
+ name = self._params["name"]
+ version = self._params["version"]
+ default_task_list = self._params.get("defaultTaskList")
+ if default_task_list:
+ task_list = default_task_list.get("name")
+ else:
+ task_list = None
+ default_child_policy = self._params.get("defaultChildPolicy")
+ default_task_start_to_close_timeout = self._params.get(
+ "defaultTaskStartToCloseTimeout"
+ )
+ default_execution_start_to_close_timeout = self._params.get(
+ "defaultExecutionStartToCloseTimeout"
+ )
+ default_task_priority = self._params.get("defaultTaskPriority")
+ default_lambda_role = self._params.get("defaultLambdaRole")
+ description = self._params.get("description")
+
+ self._check_string(domain)
+ self._check_string(name)
+ self._check_string(version)
+ self._check_none_or_string(task_list)
+ self._check_none_or_string(default_child_policy)
+ self._check_none_or_string(default_task_start_to_close_timeout)
+ self._check_none_or_string(default_execution_start_to_close_timeout)
+ self._check_none_or_string(default_task_priority)
+ self._check_none_or_string(default_lambda_role)
+ self._check_none_or_string(description)
+
+ self.swf_backend.register_type(
+ "workflow",
+ domain,
+ name,
+ version,
+ task_list=task_list,
+ default_child_policy=default_child_policy,
+ default_task_start_to_close_timeout=default_task_start_to_close_timeout,
+ default_execution_start_to_close_timeout=default_execution_start_to_close_timeout,
+ default_task_priority=default_task_priority,
+ default_lambda_role=default_lambda_role,
+ description=description,
+ )
+ return ""
+
+ def deprecate_workflow_type(self):
+ return self._deprecate_type("workflow")
+
+ def undeprecate_workflow_type(self):
+ return self._undeprecate_type("workflow")
+
+ def describe_workflow_type(self):
+ return self._describe_type("workflow")
+
+ def start_workflow_execution(self):
+ domain = self._params["domain"]
+ workflow_id = self._params["workflowId"]
+ _workflow_type = self._params["workflowType"]
+ workflow_name = _workflow_type["name"]
+ workflow_version = _workflow_type["version"]
+ _task_list = self._params.get("taskList")
+ if _task_list:
+ task_list = _task_list.get("name")
+ else:
+ task_list = None
+ child_policy = self._params.get("childPolicy")
+ execution_start_to_close_timeout = self._params.get(
+ "executionStartToCloseTimeout"
+ )
+ input_ = self._params.get("input")
+ tag_list = self._params.get("tagList")
+ task_start_to_close_timeout = self._params.get("taskStartToCloseTimeout")
+
+ self._check_string(domain)
+ self._check_string(workflow_id)
+ self._check_string(workflow_name)
+ self._check_string(workflow_version)
+ self._check_none_or_string(task_list)
+ self._check_none_or_string(child_policy)
+ self._check_none_or_string(execution_start_to_close_timeout)
+ self._check_none_or_string(input_)
+ self._check_none_or_list_of_strings(tag_list)
+ self._check_none_or_string(task_start_to_close_timeout)
+
+ wfe = self.swf_backend.start_workflow_execution(
+ domain,
+ workflow_id,
+ workflow_name,
+ workflow_version,
+ task_list=task_list,
+ child_policy=child_policy,
+ execution_start_to_close_timeout=execution_start_to_close_timeout,
+ workflow_input=input_,
+ tag_list=tag_list,
+ task_start_to_close_timeout=task_start_to_close_timeout,
+ )
+
+ return json.dumps({"runId": wfe.run_id})
+
+ def describe_workflow_execution(self):
+ domain_name = self._params["domain"]
+ _workflow_execution = self._params["execution"]
+ run_id = _workflow_execution["runId"]
+ workflow_id = _workflow_execution["workflowId"]
+
+ self._check_string(domain_name)
+ self._check_string(run_id)
+ self._check_string(workflow_id)
+
+ wfe = self.swf_backend.describe_workflow_execution(
+ domain_name, run_id, workflow_id
+ )
+ return json.dumps(wfe.to_full_dict())
+
+ def get_workflow_execution_history(self):
+ domain_name = self._params["domain"]
+ _workflow_execution = self._params["execution"]
+ run_id = _workflow_execution["runId"]
+ workflow_id = _workflow_execution["workflowId"]
+ reverse_order = self._params.get("reverseOrder", None)
+ wfe = self.swf_backend.describe_workflow_execution(
+ domain_name, run_id, workflow_id
+ )
+ events = wfe.events(reverse_order=reverse_order)
+ return json.dumps({"events": [evt.to_dict() for evt in events]})
+
+ def poll_for_decision_task(self):
+ domain_name = self._params["domain"]
+ task_list = self._params["taskList"]["name"]
+ identity = self._params.get("identity")
+ reverse_order = self._params.get("reverseOrder", None)
+
+ self._check_string(domain_name)
+ self._check_string(task_list)
+
+ decision = self.swf_backend.poll_for_decision_task(
+ domain_name, task_list, identity=identity
+ )
+ if decision:
+ return json.dumps(decision.to_full_dict(reverse_order=reverse_order))
+ else:
+ return json.dumps({"previousStartedEventId": 0, "startedEventId": 0})
+
+ def count_pending_decision_tasks(self):
+ domain_name = self._params["domain"]
+ task_list = self._params["taskList"]["name"]
+ self._check_string(domain_name)
+ self._check_string(task_list)
+ count = self.swf_backend.count_pending_decision_tasks(domain_name, task_list)
+ return json.dumps({"count": count, "truncated": False})
+
+ def respond_decision_task_completed(self):
+ task_token = self._params["taskToken"]
+ execution_context = self._params.get("executionContext")
+ decisions = self._params.get("decisions")
+ self._check_string(task_token)
+ self._check_none_or_string(execution_context)
+ self.swf_backend.respond_decision_task_completed(
+ task_token, decisions=decisions, execution_context=execution_context
+ )
+ return ""
+
+ def poll_for_activity_task(self):
+ domain_name = self._params["domain"]
+ task_list = self._params["taskList"]["name"]
+ identity = self._params.get("identity")
+ self._check_string(domain_name)
+ self._check_string(task_list)
+ self._check_none_or_string(identity)
+ activity_task = self.swf_backend.poll_for_activity_task(
+ domain_name, task_list, identity=identity
+ )
+ if activity_task:
+ return json.dumps(activity_task.to_full_dict())
+ else:
+ return json.dumps({"startedEventId": 0})
+
+ def count_pending_activity_tasks(self):
+ domain_name = self._params["domain"]
+ task_list = self._params["taskList"]["name"]
+ self._check_string(domain_name)
+ self._check_string(task_list)
+ count = self.swf_backend.count_pending_activity_tasks(domain_name, task_list)
+ return json.dumps({"count": count, "truncated": False})
+
+ def respond_activity_task_completed(self):
+ task_token = self._params["taskToken"]
+ result = self._params.get("result")
+ self._check_string(task_token)
+ self._check_none_or_string(result)
+ self.swf_backend.respond_activity_task_completed(task_token, result=result)
+ return ""
+
+ def respond_activity_task_failed(self):
+ task_token = self._params["taskToken"]
+ reason = self._params.get("reason")
+ details = self._params.get("details")
+ self._check_string(task_token)
+ # TODO: implement length limits on reason and details (common pb with
+ # client libs)
+ self._check_none_or_string(reason)
+ self._check_none_or_string(details)
+ self.swf_backend.respond_activity_task_failed(
+ task_token, reason=reason, details=details
+ )
+ return ""
+
+ def terminate_workflow_execution(self):
+ domain_name = self._params["domain"]
+ workflow_id = self._params["workflowId"]
+ child_policy = self._params.get("childPolicy")
+ details = self._params.get("details")
+ reason = self._params.get("reason")
+ run_id = self._params.get("runId")
+ self._check_string(domain_name)
+ self._check_string(workflow_id)
+ self._check_none_or_string(child_policy)
+ self._check_none_or_string(details)
+ self._check_none_or_string(reason)
+ self._check_none_or_string(run_id)
+ self.swf_backend.terminate_workflow_execution(
+ domain_name,
+ workflow_id,
+ child_policy=child_policy,
+ details=details,
+ reason=reason,
+ run_id=run_id,
+ )
+ return ""
+
+ def record_activity_task_heartbeat(self):
+ task_token = self._params["taskToken"]
+ details = self._params.get("details")
+ self._check_string(task_token)
+ self._check_none_or_string(details)
+ self.swf_backend.record_activity_task_heartbeat(task_token, details=details)
+ # TODO: make it dynamic when we implement activity tasks cancellation
+ return json.dumps({"cancelRequested": False})
+
+ def signal_workflow_execution(self):
+ domain_name = self._params["domain"]
+ signal_name = self._params["signalName"]
+ workflow_id = self._params["workflowId"]
+ _input = self._params["input"]
+ run_id = self._params["runId"]
+
+ self._check_string(domain_name)
+ self._check_string(signal_name)
+ self._check_string(workflow_id)
+ self._check_none_or_string(_input)
+ self._check_none_or_string(run_id)
+
+ self.swf_backend.signal_workflow_execution(
+ domain_name, signal_name, workflow_id, _input, run_id
+ )
+ return ""
diff --git a/contrib/python/moto/py3/moto/swf/urls.py b/contrib/python/moto/py3/moto/swf/urls.py
new file mode 100644
index 0000000000..951faebe47
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/urls.py
@@ -0,0 +1,5 @@
+from .responses import SWFResponse
+
+url_bases = [r"https?://swf\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": SWFResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/swf/utils.py b/contrib/python/moto/py3/moto/swf/utils.py
new file mode 100644
index 0000000000..1b85f4ca9f
--- /dev/null
+++ b/contrib/python/moto/py3/moto/swf/utils.py
@@ -0,0 +1,2 @@
+def decapitalize(key):
+ return key[0].lower() + key[1:]
diff --git a/contrib/python/moto/py3/moto/textract/__init__.py b/contrib/python/moto/py3/moto/textract/__init__.py
new file mode 100644
index 0000000000..4bce9832b8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/textract/__init__.py
@@ -0,0 +1,5 @@
+"""textract module initialization; sets value for base decorator."""
+from .models import textract_backends
+from ..core.models import base_decorator
+
+mock_textract = base_decorator(textract_backends)
diff --git a/contrib/python/moto/py3/moto/textract/exceptions.py b/contrib/python/moto/py3/moto/textract/exceptions.py
new file mode 100644
index 0000000000..9c0e512fc8
--- /dev/null
+++ b/contrib/python/moto/py3/moto/textract/exceptions.py
@@ -0,0 +1,29 @@
+"""Exceptions raised by the textract service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class InvalidJobIdException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(__class__.__name__, "An invalid job identifier was passed.")
+
+
+class InvalidS3ObjectException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ __class__.__name__,
+ "Amazon Textract is unable to access the S3 object that's specified in the request.",
+ )
+
+
+class InvalidParameterException(JsonRESTError):
+ code = 400
+
+ def __init__(self):
+ super().__init__(
+ __class__.__name__,
+ "An input parameter violated a constraint. For example, in synchronous operations, an InvalidParameterException exception occurs when neither of the S3Object or Bytes values are supplied in the Document request parameter. Validate your parameter before calling the API operation again.",
+ )
diff --git a/contrib/python/moto/py3/moto/textract/models.py b/contrib/python/moto/py3/moto/textract/models.py
new file mode 100644
index 0000000000..de5055738c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/textract/models.py
@@ -0,0 +1,66 @@
+"""TextractBackend class with methods for supported APIs."""
+
+import uuid
+from random import randint
+from collections import defaultdict
+
+from moto.core import BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+
+from .exceptions import InvalidParameterException, InvalidJobIdException
+
+
+class TextractJobStatus:
+ in_progress = "IN_PROGRESS"
+ succeeded = "SUCCEEDED"
+ failed = "FAILED"
+ partial_success = "PARTIAL_SUCCESS"
+
+
+class TextractJob(BaseModel):
+ def __init__(self, job):
+ self.job = job
+
+ def to_dict(self):
+ return self.job
+
+
+class TextractBackend(BaseBackend):
+ """Implementation of Textract APIs."""
+
+ JOB_STATUS = TextractJobStatus.succeeded
+ PAGES = {"Pages": randint(5, 500)}
+ BLOCKS = []
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.async_text_detection_jobs = defaultdict()
+
+ def get_document_text_detection(self, job_id):
+ """
+ Pagination has not yet been implemented
+ """
+ job = self.async_text_detection_jobs.get(job_id)
+ if not job:
+ raise InvalidJobIdException()
+ return job
+
+ def start_document_text_detection(self, document_location):
+ """
+ The following parameters have not yet been implemented: ClientRequestToken, JobTag, NotificationChannel, OutputConfig, KmsKeyID
+ """
+ if not document_location:
+ raise InvalidParameterException()
+ job_id = str(uuid.uuid4())
+ self.async_text_detection_jobs[job_id] = TextractJob(
+ {
+ "Blocks": TextractBackend.BLOCKS,
+ "DetectDocumentTextModelVersion": "1.0",
+ "DocumentMetadata": {"Pages": TextractBackend.PAGES},
+ "JobStatus": TextractBackend.JOB_STATUS,
+ }
+ )
+ return job_id
+
+
+textract_backends = BackendDict(TextractBackend, "textract")
diff --git a/contrib/python/moto/py3/moto/textract/responses.py b/contrib/python/moto/py3/moto/textract/responses.py
new file mode 100644
index 0000000000..332cb24c5a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/textract/responses.py
@@ -0,0 +1,28 @@
+"""Handles incoming textract requests, invokes methods, returns responses."""
+import json
+
+from moto.core.responses import BaseResponse
+from .models import textract_backends
+
+
+class TextractResponse(BaseResponse):
+ """Handler for Textract requests and responses."""
+
+ @property
+ def textract_backend(self):
+ """Return backend instance specific for this region."""
+ return textract_backends[self.region]
+
+ def get_document_text_detection(self):
+ params = json.loads(self.body)
+ job_id = params.get("JobId")
+ job = self.textract_backend.get_document_text_detection(job_id=job_id).to_dict()
+ return json.dumps(job)
+
+ def start_document_text_detection(self):
+ params = json.loads(self.body)
+ document_location = params.get("DocumentLocation")
+ job_id = self.textract_backend.start_document_text_detection(
+ document_location=document_location
+ )
+ return json.dumps(dict(JobId=job_id))
diff --git a/contrib/python/moto/py3/moto/textract/urls.py b/contrib/python/moto/py3/moto/textract/urls.py
new file mode 100644
index 0000000000..d5b9cf74fd
--- /dev/null
+++ b/contrib/python/moto/py3/moto/textract/urls.py
@@ -0,0 +1,10 @@
+"""textract base URL and path."""
+from .responses import TextractResponse
+
+url_bases = [
+ r"https?://textract\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {
+ "{0}/$": TextractResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/timestreamwrite/__init__.py b/contrib/python/moto/py3/moto/timestreamwrite/__init__.py
new file mode 100644
index 0000000000..f8b12f3bfb
--- /dev/null
+++ b/contrib/python/moto/py3/moto/timestreamwrite/__init__.py
@@ -0,0 +1,4 @@
+from .models import timestreamwrite_backends
+from ..core.models import base_decorator
+
+mock_timestreamwrite = base_decorator(timestreamwrite_backends)
diff --git a/contrib/python/moto/py3/moto/timestreamwrite/exceptions.py b/contrib/python/moto/py3/moto/timestreamwrite/exceptions.py
new file mode 100644
index 0000000000..f1598bd653
--- /dev/null
+++ b/contrib/python/moto/py3/moto/timestreamwrite/exceptions.py
@@ -0,0 +1,9 @@
+"""Exceptions raised by the timestreamwrite service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFound(JsonRESTError):
+ error_type = "com.amazonaws.timestream.v20181101#ResourceNotFoundException"
+
+ def __init__(self, msg):
+ super().__init__(ResourceNotFound.error_type, msg)
diff --git a/contrib/python/moto/py3/moto/timestreamwrite/models.py b/contrib/python/moto/py3/moto/timestreamwrite/models.py
new file mode 100644
index 0000000000..f2fe02985a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/timestreamwrite/models.py
@@ -0,0 +1,222 @@
+from moto.core import get_account_id, BaseBackend, BaseModel
+from moto.core.utils import BackendDict
+from moto.utilities.tagging_service import TaggingService
+from .exceptions import ResourceNotFound
+
+
+class TimestreamTable(BaseModel):
+ def __init__(
+ self,
+ region_name,
+ table_name,
+ db_name,
+ retention_properties,
+ magnetic_store_write_properties,
+ ):
+ self.region_name = region_name
+ self.name = table_name
+ self.db_name = db_name
+ self.retention_properties = retention_properties or {
+ "MemoryStoreRetentionPeriodInHours": 123,
+ "MagneticStoreRetentionPeriodInDays": 123,
+ }
+ self.magnetic_store_write_properties = magnetic_store_write_properties or {}
+ self.records = []
+
+ def update(self, retention_properties, magnetic_store_write_properties):
+ self.retention_properties = retention_properties
+ if magnetic_store_write_properties is not None:
+ self.magnetic_store_write_properties = magnetic_store_write_properties
+
+ def write_records(self, records):
+ self.records.extend(records)
+
+ @property
+ def arn(self):
+ return f"arn:aws:timestream:{self.region_name}:{get_account_id()}:database/{self.db_name}/table/{self.name}"
+
+ def description(self):
+ return {
+ "Arn": self.arn,
+ "TableName": self.name,
+ "DatabaseName": self.db_name,
+ "TableStatus": "ACTIVE",
+ "RetentionProperties": self.retention_properties,
+ "MagneticStoreWriteProperties": self.magnetic_store_write_properties,
+ }
+
+
+class TimestreamDatabase(BaseModel):
+ def __init__(self, region_name, database_name, kms_key_id):
+ self.region_name = region_name
+ self.name = database_name
+ self.kms_key_id = (
+ kms_key_id
+ or f"arn:aws:kms:{region_name}:{get_account_id()}:key/default_key"
+ )
+ self.tables = dict()
+
+ def update(self, kms_key_id):
+ self.kms_key_id = kms_key_id
+
+ def create_table(
+ self, table_name, retention_properties, magnetic_store_write_properties
+ ):
+ table = TimestreamTable(
+ region_name=self.region_name,
+ table_name=table_name,
+ db_name=self.name,
+ retention_properties=retention_properties,
+ magnetic_store_write_properties=magnetic_store_write_properties,
+ )
+ self.tables[table_name] = table
+ return table
+
+ def update_table(
+ self, table_name, retention_properties, magnetic_store_write_properties
+ ):
+ table = self.tables[table_name]
+ table.update(
+ retention_properties=retention_properties,
+ magnetic_store_write_properties=magnetic_store_write_properties,
+ )
+ return table
+
+ def delete_table(self, table_name):
+ self.tables.pop(table_name, None)
+
+ def describe_table(self, table_name):
+ if table_name not in self.tables:
+ raise ResourceNotFound(f"The table {table_name} does not exist.")
+ return self.tables[table_name]
+
+ def list_tables(self):
+ return self.tables.values()
+
+ @property
+ def arn(self):
+ return f"arn:aws:timestream:{self.region_name}:{get_account_id()}:database/{self.name}"
+
+ def description(self):
+ return {
+ "Arn": self.arn,
+ "DatabaseName": self.name,
+ "TableCount": len(self.tables.keys()),
+ "KmsKeyId": self.kms_key_id,
+ }
+
+
+class TimestreamWriteBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.databases = dict()
+ self.tagging_service = TaggingService()
+
+ def create_database(self, database_name, kms_key_id, tags):
+ database = TimestreamDatabase(self.region_name, database_name, kms_key_id)
+ self.databases[database_name] = database
+ self.tagging_service.tag_resource(database.arn, tags)
+ return database
+
+ def delete_database(self, database_name):
+ del self.databases[database_name]
+
+ def describe_database(self, database_name):
+ if database_name not in self.databases:
+ raise ResourceNotFound(f"The database {database_name} does not exist.")
+ return self.databases[database_name]
+
+ def list_databases(self):
+ return self.databases.values()
+
+ def update_database(self, database_name, kms_key_id):
+ database = self.databases[database_name]
+ database.update(kms_key_id=kms_key_id)
+ return database
+
+ def create_table(
+ self,
+ database_name,
+ table_name,
+ retention_properties,
+ tags,
+ magnetic_store_write_properties,
+ ):
+ database = self.describe_database(database_name)
+ table = database.create_table(
+ table_name, retention_properties, magnetic_store_write_properties
+ )
+ self.tagging_service.tag_resource(table.arn, tags)
+ return table
+
+ def delete_table(self, database_name, table_name):
+ database = self.describe_database(database_name)
+ database.delete_table(table_name)
+
+ def describe_table(self, database_name, table_name):
+ database = self.describe_database(database_name)
+ table = database.describe_table(table_name)
+ return table
+
+ def list_tables(self, database_name):
+ database = self.describe_database(database_name)
+ tables = database.list_tables()
+ return tables
+
+ def update_table(
+ self,
+ database_name,
+ table_name,
+ retention_properties,
+ magnetic_store_write_properties,
+ ):
+ database = self.describe_database(database_name)
+ table = database.update_table(
+ table_name, retention_properties, magnetic_store_write_properties
+ )
+ return table
+
+ def write_records(self, database_name, table_name, records):
+ database = self.describe_database(database_name)
+ table = database.describe_table(table_name)
+ table.write_records(records)
+
+ def describe_endpoints(self):
+ # https://docs.aws.amazon.com/timestream/latest/developerguide/Using-API.endpoint-discovery.how-it-works.html
+ # Usually, the address look like this:
+ # ingest-cell1.timestream.us-east-1.amazonaws.com
+ # Where 'cell1' can be any number, 'cell2', 'cell3', etc - whichever endpoint happens to be available for that particular account
+ # We don't implement a cellular architecture in Moto though, so let's keep it simple
+ return {
+ "Endpoints": [
+ {
+ "Address": f"ingest.timestream.{self.region_name}.amazonaws.com",
+ "CachePeriodInMinutes": 1440,
+ }
+ ]
+ }
+
+ def list_tags_for_resource(self, resource_arn):
+ return self.tagging_service.list_tags_for_resource(resource_arn)
+
+ def tag_resource(self, resource_arn, tags):
+ self.tagging_service.tag_resource(resource_arn, tags)
+
+ def untag_resource(self, resource_arn, tag_keys):
+ self.tagging_service.untag_resource_using_names(resource_arn, tag_keys)
+
+
+# Boto does not return any regions at the time of writing (20/10/2021)
+# Hardcoding the known regions for now
+# Thanks, Jeff
+timestreamwrite_backends = BackendDict(
+ TimestreamWriteBackend,
+ "timestream-write",
+ additional_regions=[
+ "us-east-1",
+ "us-east-2",
+ "us-west-2",
+ "eu-central-1",
+ "eu-west-1",
+ ],
+)
diff --git a/contrib/python/moto/py3/moto/timestreamwrite/responses.py b/contrib/python/moto/py3/moto/timestreamwrite/responses.py
new file mode 100644
index 0000000000..2322020298
--- /dev/null
+++ b/contrib/python/moto/py3/moto/timestreamwrite/responses.py
@@ -0,0 +1,131 @@
+import json
+
+from moto.core.responses import BaseResponse
+from .models import timestreamwrite_backends
+
+
+class TimestreamWriteResponse(BaseResponse):
+ def __init__(self):
+ super().__init__()
+
+ @property
+ def timestreamwrite_backend(self):
+ """Return backend instance specific for this region."""
+ return timestreamwrite_backends[self.region]
+
+ def create_database(self):
+ database_name = self._get_param("DatabaseName")
+ kms_key_id = self._get_param("KmsKeyId")
+ tags = self._get_param("Tags")
+ database = self.timestreamwrite_backend.create_database(
+ database_name=database_name, kms_key_id=kms_key_id, tags=tags
+ )
+ return json.dumps(dict(Database=database.description()))
+
+ def delete_database(self):
+ database_name = self._get_param("DatabaseName")
+ self.timestreamwrite_backend.delete_database(database_name=database_name)
+ return "{}"
+
+ def describe_database(self):
+ database_name = self._get_param("DatabaseName")
+ database = self.timestreamwrite_backend.describe_database(
+ database_name=database_name
+ )
+ return json.dumps(dict(Database=database.description()))
+
+ def update_database(self):
+ database_name = self._get_param("DatabaseName")
+ kms_key_id = self._get_param("KmsKeyId")
+ database = self.timestreamwrite_backend.update_database(
+ database_name, kms_key_id
+ )
+ return json.dumps(dict(Database=database.description()))
+
+ def list_databases(self):
+ all_dbs = self.timestreamwrite_backend.list_databases()
+ return json.dumps(dict(Databases=[db.description() for db in all_dbs]))
+
+ def create_table(self):
+ database_name = self._get_param("DatabaseName")
+ table_name = self._get_param("TableName")
+ retention_properties = self._get_param("RetentionProperties")
+ tags = self._get_param("Tags")
+ magnetic_store_write_properties = self._get_param(
+ "MagneticStoreWriteProperties"
+ )
+ table = self.timestreamwrite_backend.create_table(
+ database_name,
+ table_name,
+ retention_properties,
+ tags,
+ magnetic_store_write_properties,
+ )
+ return json.dumps(dict(Table=table.description()))
+
+ def delete_table(self):
+ database_name = self._get_param("DatabaseName")
+ table_name = self._get_param("TableName")
+ self.timestreamwrite_backend.delete_table(database_name, table_name)
+ return "{}"
+
+ def describe_table(self):
+ database_name = self._get_param("DatabaseName")
+ table_name = self._get_param("TableName")
+ table = self.timestreamwrite_backend.describe_table(database_name, table_name)
+ return json.dumps(dict(Table=table.description()))
+
+ def list_tables(self):
+ database_name = self._get_param("DatabaseName")
+ tables = self.timestreamwrite_backend.list_tables(database_name)
+ return json.dumps(dict(Tables=[t.description() for t in tables]))
+
+ def update_table(self):
+ database_name = self._get_param("DatabaseName")
+ table_name = self._get_param("TableName")
+ retention_properties = self._get_param("RetentionProperties")
+ magnetic_store_write_properties = self._get_param(
+ "MagneticStoreWriteProperties"
+ )
+ table = self.timestreamwrite_backend.update_table(
+ database_name,
+ table_name,
+ retention_properties,
+ magnetic_store_write_properties,
+ )
+ return json.dumps(dict(Table=table.description()))
+
+ def write_records(self):
+ database_name = self._get_param("DatabaseName")
+ table_name = self._get_param("TableName")
+ records = self._get_param("Records")
+ self.timestreamwrite_backend.write_records(database_name, table_name, records)
+ resp = {
+ "RecordsIngested": {
+ "Total": len(records),
+ "MemoryStore": len(records),
+ "MagneticStore": 0,
+ }
+ }
+ return json.dumps(resp)
+
+ def describe_endpoints(self):
+ resp = self.timestreamwrite_backend.describe_endpoints()
+ return json.dumps(resp)
+
+ def list_tags_for_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+ tags = self.timestreamwrite_backend.list_tags_for_resource(resource_arn)
+ return json.dumps(tags)
+
+ def tag_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+ tags = self._get_param("Tags")
+ self.timestreamwrite_backend.tag_resource(resource_arn, tags)
+ return "{}"
+
+ def untag_resource(self):
+ resource_arn = self._get_param("ResourceARN")
+ tag_keys = self._get_param("TagKeys")
+ self.timestreamwrite_backend.untag_resource(resource_arn, tag_keys)
+ return "{}"
diff --git a/contrib/python/moto/py3/moto/timestreamwrite/urls.py b/contrib/python/moto/py3/moto/timestreamwrite/urls.py
new file mode 100644
index 0000000000..b965cd5b8a
--- /dev/null
+++ b/contrib/python/moto/py3/moto/timestreamwrite/urls.py
@@ -0,0 +1,12 @@
+from .responses import TimestreamWriteResponse
+
+url_bases = [
+ r"https?://ingest\.timestream\.(.+)\.amazonaws\.com",
+ r"https?://ingest\.timestream\.(.+)\.amazonaws\.com/",
+]
+
+response = TimestreamWriteResponse()
+
+# Boto3 sends a request to 'https://ingest.timestream.amazonaws.com'
+# Which means we need two url_paths - one without slash (for boto3), and one with (for other SDK's/API's)
+url_paths = {"{0}$": response.dispatch, "{0}/$": response.dispatch}
diff --git a/contrib/python/moto/py3/moto/transcribe/__init__.py b/contrib/python/moto/py3/moto/transcribe/__init__.py
new file mode 100644
index 0000000000..0cde03003b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/transcribe/__init__.py
@@ -0,0 +1,5 @@
+from .models import transcribe_backends
+from ..core.models import base_decorator
+
+transcribe_backend = transcribe_backends["us-east-1"]
+mock_transcribe = base_decorator(transcribe_backends)
diff --git a/contrib/python/moto/py3/moto/transcribe/exceptions.py b/contrib/python/moto/py3/moto/transcribe/exceptions.py
new file mode 100644
index 0000000000..948f5665b4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/transcribe/exceptions.py
@@ -0,0 +1,11 @@
+from moto.core.exceptions import JsonRESTError
+
+
+class ConflictException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("ConflictException", message, **kwargs)
+
+
+class BadRequestException(JsonRESTError):
+ def __init__(self, message, **kwargs):
+ super().__init__("BadRequestException", message, **kwargs)
diff --git a/contrib/python/moto/py3/moto/transcribe/models.py b/contrib/python/moto/py3/moto/transcribe/models.py
new file mode 100644
index 0000000000..b58cefdad7
--- /dev/null
+++ b/contrib/python/moto/py3/moto/transcribe/models.py
@@ -0,0 +1,810 @@
+import uuid
+from datetime import datetime, timedelta
+from moto.core import BaseBackend, BaseModel, get_account_id
+from moto.core.utils import BackendDict
+from moto.moto_api import state_manager
+from moto.moto_api._internal.managed_state_model import ManagedState
+from .exceptions import ConflictException, BadRequestException
+
+
+class BaseObject(BaseModel):
+ def camelCase(self, key):
+ words = []
+ for word in key.split("_"):
+ words.append(word.title())
+ return "".join(words)
+
+ def gen_response_object(self):
+ response_object = dict()
+ for key, value in self.__dict__.items():
+ if "_" in key:
+ response_object[self.camelCase(key)] = value
+ else:
+ response_object[key[0].upper() + key[1:]] = value
+ return response_object
+
+ @property
+ def response_object(self):
+ return self.gen_response_object()
+
+
+class FakeTranscriptionJob(BaseObject, ManagedState):
+ def __init__(
+ self,
+ region_name,
+ transcription_job_name,
+ language_code,
+ media_sample_rate_hertz,
+ media_format,
+ media,
+ output_bucket_name,
+ output_key,
+ output_encryption_kms_key_id,
+ settings,
+ model_settings,
+ job_execution_settings,
+ content_redaction,
+ identify_language,
+ language_options,
+ ):
+ ManagedState.__init__(
+ self,
+ "transcribe::transcriptionjob",
+ transitions=[
+ (None, "QUEUED"),
+ ("QUEUED", "IN_PROGRESS"),
+ ("IN_PROGRESS", "COMPLETED"),
+ ],
+ )
+ self._region_name = region_name
+ self.transcription_job_name = transcription_job_name
+ self.language_code = language_code
+ self.media_sample_rate_hertz = media_sample_rate_hertz
+ self.media_format = media_format
+ self.media = media
+ self.transcript = None
+ self.start_time = self.completion_time = None
+ self.creation_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.failure_reason = None
+ self.settings = settings or {
+ "ChannelIdentification": False,
+ "ShowAlternatives": False,
+ "ShowSpeakerLabels": False,
+ }
+ self.model_settings = model_settings or {"LanguageModelName": None}
+ self.job_execution_settings = job_execution_settings or {
+ "AllowDeferredExecution": False,
+ "DataAccessRoleArn": None,
+ }
+ self.content_redaction = content_redaction or {
+ "RedactionType": None,
+ "RedactionOutput": None,
+ }
+ self.identify_language = identify_language
+ self.language_options = language_options
+ self.identified_language_score = (None,)
+ self._output_bucket_name = output_bucket_name
+ self.output_key = output_key
+ self._output_encryption_kms_key_id = output_encryption_kms_key_id
+ self.output_location_type = (
+ "CUSTOMER_BUCKET" if self._output_bucket_name else "SERVICE_BUCKET"
+ )
+
+ def response_object(self, response_type):
+ response_field_dict = {
+ "CREATE": [
+ "TranscriptionJobName",
+ "TranscriptionJobStatus",
+ "LanguageCode",
+ "MediaFormat",
+ "Media",
+ "Settings",
+ "StartTime",
+ "CreationTime",
+ "IdentifyLanguage",
+ "LanguageOptions",
+ "JobExecutionSettings",
+ ],
+ "GET": [
+ "TranscriptionJobName",
+ "TranscriptionJobStatus",
+ "LanguageCode",
+ "MediaSampleRateHertz",
+ "MediaFormat",
+ "Media",
+ "Settings",
+ "Transcript",
+ "StartTime",
+ "CreationTime",
+ "CompletionTime",
+ "IdentifyLanguage",
+ "LanguageOptions",
+ "IdentifiedLanguageScore",
+ ],
+ "LIST": [
+ "TranscriptionJobName",
+ "CreationTime",
+ "StartTime",
+ "CompletionTime",
+ "LanguageCode",
+ "TranscriptionJobStatus",
+ "FailureReason",
+ "IdentifyLanguage",
+ "IdentifiedLanguageScore",
+ "OutputLocationType",
+ ],
+ }
+ response_fields = response_field_dict[response_type]
+ response_object = self.gen_response_object()
+ response_object["TranscriptionJobStatus"] = self.status
+ if response_type != "LIST":
+ return {
+ "TranscriptionJob": {
+ k: v
+ for k, v in response_object.items()
+ if k in response_fields and v is not None and v != [None]
+ }
+ }
+ else:
+ return {
+ k: v
+ for k, v in response_object.items()
+ if k in response_fields and v is not None and v != [None]
+ }
+
+ def advance(self):
+ old_status = self.status
+ super().advance()
+ new_status = self.status
+
+ if old_status == new_status:
+ return
+
+ if new_status == "IN_PROGRESS":
+ self.start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ if not self.media_sample_rate_hertz:
+ self.media_sample_rate_hertz = 44100
+ if not self.media_format:
+ file_ext = self.media["MediaFileUri"].split(".")[-1].lower()
+ self.media_format = (
+ file_ext if file_ext in ["mp3", "mp4", "wav", "flac"] else "mp3"
+ )
+ if self.identify_language:
+ self.identified_language_score = 0.999645948
+ # Simply identify first language passed in lanugage_options
+ # If non is set default to "en-US"
+ if self.language_options is not None and len(self.language_options) > 0:
+ self.language_code = self.language_options[0]
+ else:
+ self.language_code = "en-US"
+ elif new_status == "COMPLETED":
+ self.completion_time = (datetime.now() + timedelta(seconds=10)).strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+ if self._output_bucket_name:
+ transcript_file_uri = "https://s3.{0}.amazonaws.com/{1}/".format(
+ self._region_name, self._output_bucket_name
+ )
+ transcript_file_uri = (
+ transcript_file_uri
+ + "{0}/{1}.json".format(
+ self.output_key, self.transcription_job_name
+ )
+ if self.output_key is not None
+ else transcript_file_uri
+ + "{transcription_job_name}.json".format(
+ transcription_job_name=self.transcription_job_name
+ )
+ )
+ self.output_location_type = "CUSTOMER_BUCKET"
+ else:
+ transcript_file_uri = "https://s3.{0}.amazonaws.com/aws-transcribe-{0}-prod/{1}/{2}/{3}/asrOutput.json".format( # noqa: E501
+ self._region_name,
+ get_account_id(),
+ self.transcription_job_name,
+ uuid.uuid4(),
+ )
+ self.output_location_type = "SERVICE_BUCKET"
+ self.transcript = {"TranscriptFileUri": transcript_file_uri}
+
+
+class FakeVocabulary(BaseObject, ManagedState):
+ def __init__(
+ self, region_name, vocabulary_name, language_code, phrases, vocabulary_file_uri
+ ):
+ # Configured ManagedState
+ super().__init__(
+ "transcribe::vocabulary",
+ transitions=[(None, "PENDING"), ("PENDING", "READY")],
+ )
+ # Configure internal properties
+ self._region_name = region_name
+ self.vocabulary_name = vocabulary_name
+ self.language_code = language_code
+ self.phrases = phrases
+ self.vocabulary_file_uri = vocabulary_file_uri
+ self.last_modified_time = None
+ self.failure_reason = None
+ self.download_uri = "https://s3.{0}.amazonaws.com/aws-transcribe-dictionary-model-{0}-prod/{1}/{2}/{3}/input.txt".format( # noqa: E501
+ region_name, get_account_id(), vocabulary_name, uuid
+ )
+
+ def response_object(self, response_type):
+ response_field_dict = {
+ "CREATE": [
+ "VocabularyName",
+ "LanguageCode",
+ "VocabularyState",
+ "LastModifiedTime",
+ "FailureReason",
+ ],
+ "GET": [
+ "VocabularyName",
+ "LanguageCode",
+ "VocabularyState",
+ "LastModifiedTime",
+ "FailureReason",
+ "DownloadUri",
+ ],
+ "LIST": [
+ "VocabularyName",
+ "LanguageCode",
+ "LastModifiedTime",
+ "VocabularyState",
+ ],
+ }
+ response_fields = response_field_dict[response_type]
+ response_object = self.gen_response_object()
+ response_object["VocabularyState"] = self.status
+ return {
+ k: v
+ for k, v in response_object.items()
+ if k in response_fields and v is not None and v != [None]
+ }
+
+ def advance(self):
+ old_status = self.status
+ super().advance()
+ new_status = self.status
+
+ if old_status != new_status:
+ self.last_modified_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+
+class FakeMedicalTranscriptionJob(BaseObject, ManagedState):
+ def __init__(
+ self,
+ region_name,
+ medical_transcription_job_name,
+ language_code,
+ media_sample_rate_hertz,
+ media_format,
+ media,
+ output_bucket_name,
+ output_encryption_kms_key_id,
+ settings,
+ specialty,
+ job_type,
+ ):
+ ManagedState.__init__(
+ self,
+ "transcribe::medicaltranscriptionjob",
+ transitions=[
+ (None, "QUEUED"),
+ ("QUEUED", "IN_PROGRESS"),
+ ("IN_PROGRESS", "COMPLETED"),
+ ],
+ )
+ self._region_name = region_name
+ self.medical_transcription_job_name = medical_transcription_job_name
+ self.language_code = language_code
+ self.media_sample_rate_hertz = media_sample_rate_hertz
+ self.media_format = media_format
+ self.media = media
+ self.transcript = None
+ self.start_time = self.completion_time = None
+ self.creation_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.failure_reason = None
+ self.settings = settings or {
+ "ChannelIdentification": False,
+ "ShowAlternatives": False,
+ }
+ self.specialty = specialty
+ self.type = job_type
+ self._output_bucket_name = output_bucket_name
+ self._output_encryption_kms_key_id = output_encryption_kms_key_id
+ self.output_location_type = "CUSTOMER_BUCKET"
+
+ def response_object(self, response_type):
+ response_field_dict = {
+ "CREATE": [
+ "MedicalTranscriptionJobName",
+ "TranscriptionJobStatus",
+ "LanguageCode",
+ "MediaFormat",
+ "Media",
+ "StartTime",
+ "CreationTime",
+ "Specialty",
+ "Type",
+ ],
+ "GET": [
+ "MedicalTranscriptionJobName",
+ "TranscriptionJobStatus",
+ "LanguageCode",
+ "MediaSampleRateHertz",
+ "MediaFormat",
+ "Media",
+ "Transcript",
+ "StartTime",
+ "CreationTime",
+ "CompletionTime",
+ "Settings",
+ "Specialty",
+ "Type",
+ ],
+ "LIST": [
+ "MedicalTranscriptionJobName",
+ "CreationTime",
+ "StartTime",
+ "CompletionTime",
+ "LanguageCode",
+ "TranscriptionJobStatus",
+ "FailureReason",
+ "OutputLocationType",
+ "Specialty",
+ "Type",
+ ],
+ }
+ response_fields = response_field_dict[response_type]
+ response_object = self.gen_response_object()
+ response_object["TranscriptionJobStatus"] = self.status
+ if response_type != "LIST":
+ return {
+ "MedicalTranscriptionJob": {
+ k: v
+ for k, v in response_object.items()
+ if k in response_fields and v is not None and v != [None]
+ }
+ }
+ else:
+ return {
+ k: v
+ for k, v in response_object.items()
+ if k in response_fields and v is not None and v != [None]
+ }
+
+ def advance(self):
+ old_status = self.status
+ super().advance()
+ new_status = self.status
+
+ if old_status == new_status:
+ return
+
+ if new_status == "IN_PROGRESS":
+ self.start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ if not self.media_sample_rate_hertz:
+ self.media_sample_rate_hertz = 44100
+ if not self.media_format:
+ file_ext = self.media["MediaFileUri"].split(".")[-1].lower()
+ self.media_format = (
+ file_ext if file_ext in ["mp3", "mp4", "wav", "flac"] else "mp3"
+ )
+ elif new_status == "COMPLETED":
+ self.completion_time = (datetime.now() + timedelta(seconds=10)).strftime(
+ "%Y-%m-%d %H:%M:%S"
+ )
+ self.transcript = {
+ "TranscriptFileUri": "https://s3.{}.amazonaws.com/{}/medical/{}.json".format(
+ self._region_name,
+ self._output_bucket_name,
+ self.medical_transcription_job_name,
+ )
+ }
+
+
+class FakeMedicalVocabulary(FakeVocabulary):
+ def __init__(
+ self, region_name, vocabulary_name, language_code, vocabulary_file_uri
+ ):
+ super().__init__(
+ region_name,
+ vocabulary_name,
+ language_code=language_code,
+ phrases=None,
+ vocabulary_file_uri=vocabulary_file_uri,
+ )
+ self.model_name = "transcribe::medicalvocabulary"
+ self._region_name = region_name
+ self.vocabulary_name = vocabulary_name
+ self.language_code = language_code
+ self.vocabulary_file_uri = vocabulary_file_uri
+ self.last_modified_time = None
+ self.failure_reason = None
+ self.download_uri = "https://s3.us-east-1.amazonaws.com/aws-transcribe-dictionary-model-{}-prod/{}/medical/{}/{}/input.txt".format( # noqa: E501
+ region_name, get_account_id(), self.vocabulary_name, uuid.uuid4()
+ )
+
+
+class TranscribeBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.medical_transcriptions = {}
+ self.transcriptions = {}
+ self.medical_vocabularies = {}
+ self.vocabularies = {}
+
+ state_manager.register_default_transition(
+ "transcribe::vocabulary", transition={"progression": "manual", "times": 1}
+ )
+ state_manager.register_default_transition(
+ "transcribe::medicalvocabulary",
+ transition={"progression": "manual", "times": 1},
+ )
+ state_manager.register_default_transition(
+ "transcribe::transcriptionjob",
+ transition={"progression": "manual", "times": 1},
+ )
+ state_manager.register_default_transition(
+ "transcribe::medicaltranscriptionjob",
+ transition={"progression": "manual", "times": 1},
+ )
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint services."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "transcribe"
+ ) + BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "transcribestreaming"
+ )
+
+ def start_transcription_job(self, **kwargs):
+
+ name = kwargs.get("transcription_job_name")
+ if name in self.transcriptions:
+ raise ConflictException(
+ message="The requested job name already exists. Use a different job name."
+ )
+
+ settings = kwargs.get("settings")
+ vocabulary_name = settings.get("VocabularyName") if settings else None
+ if vocabulary_name and vocabulary_name not in self.vocabularies:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. "
+ "Check the vocabulary name and try your request again."
+ )
+
+ transcription_job_object = FakeTranscriptionJob(
+ region_name=self.region_name,
+ transcription_job_name=name,
+ language_code=kwargs.get("language_code"),
+ media_sample_rate_hertz=kwargs.get("media_sample_rate_hertz"),
+ media_format=kwargs.get("media_format"),
+ media=kwargs.get("media"),
+ output_bucket_name=kwargs.get("output_bucket_name"),
+ output_key=kwargs.get("output_key"),
+ output_encryption_kms_key_id=kwargs.get("output_encryption_kms_key_id"),
+ settings=settings,
+ model_settings=kwargs.get("model_settings"),
+ job_execution_settings=kwargs.get("job_execution_settings"),
+ content_redaction=kwargs.get("content_redaction"),
+ identify_language=kwargs.get("identify_language"),
+ language_options=kwargs.get("language_options"),
+ )
+ self.transcriptions[name] = transcription_job_object
+
+ return transcription_job_object.response_object("CREATE")
+
+ def start_medical_transcription_job(self, **kwargs):
+
+ name = kwargs.get("medical_transcription_job_name")
+
+ if name in self.medical_transcriptions:
+ raise ConflictException(
+ message="The requested job name already exists. Use a different job name."
+ )
+
+ settings = kwargs.get("settings")
+ vocabulary_name = settings.get("VocabularyName") if settings else None
+ if vocabulary_name and vocabulary_name not in self.medical_vocabularies:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. "
+ "Check the vocabulary name and try your request again."
+ )
+
+ transcription_job_object = FakeMedicalTranscriptionJob(
+ region_name=self.region_name,
+ medical_transcription_job_name=name,
+ language_code=kwargs.get("language_code"),
+ media_sample_rate_hertz=kwargs.get("media_sample_rate_hertz"),
+ media_format=kwargs.get("media_format"),
+ media=kwargs.get("media"),
+ output_bucket_name=kwargs.get("output_bucket_name"),
+ output_encryption_kms_key_id=kwargs.get("output_encryption_kms_key_id"),
+ settings=settings,
+ specialty=kwargs.get("specialty"),
+ job_type=kwargs.get("type"),
+ )
+
+ self.medical_transcriptions[name] = transcription_job_object
+
+ return transcription_job_object.response_object("CREATE")
+
+ def get_transcription_job(self, transcription_job_name):
+ try:
+ job = self.transcriptions[transcription_job_name]
+ job.advance() # Fakes advancement through statuses.
+ return job.response_object("GET")
+ except KeyError:
+ raise BadRequestException(
+ message="The requested job couldn't be found. "
+ "Check the job name and try your request again."
+ )
+
+ def get_medical_transcription_job(self, medical_transcription_job_name):
+ try:
+ job = self.medical_transcriptions[medical_transcription_job_name]
+ job.advance() # Fakes advancement through statuses.
+ return job.response_object("GET")
+ except KeyError:
+ raise BadRequestException(
+ message="The requested job couldn't be found. "
+ "Check the job name and try your request again."
+ )
+
+ def delete_transcription_job(self, transcription_job_name):
+ try:
+ del self.transcriptions[transcription_job_name]
+ except KeyError:
+ raise BadRequestException(
+ message="The requested job couldn't be found. "
+ "Check the job name and try your request again."
+ )
+
+ def delete_medical_transcription_job(self, medical_transcription_job_name):
+ try:
+ del self.medical_transcriptions[medical_transcription_job_name]
+ except KeyError:
+ raise BadRequestException(
+ message="The requested job couldn't be found. "
+ "Check the job name and try your request again."
+ )
+
+ def list_transcription_jobs(
+ self, state_equals, job_name_contains, next_token, max_results
+ ):
+ jobs = list(self.transcriptions.values())
+
+ if state_equals:
+ jobs = [job for job in jobs if job.status == state_equals]
+
+ if job_name_contains:
+ jobs = [
+ job for job in jobs if job_name_contains in job.transcription_job_name
+ ]
+
+ start_offset = int(next_token) if next_token else 0
+ end_offset = start_offset + (
+ max_results if max_results else 100
+ ) # Arbitrarily selected...
+ jobs_paginated = jobs[start_offset:end_offset]
+
+ response = {
+ "TranscriptionJobSummaries": [
+ job.response_object("LIST") for job in jobs_paginated
+ ]
+ }
+ if end_offset < len(jobs):
+ response["NextToken"] = str(end_offset)
+ if state_equals:
+ response["Status"] = state_equals
+ return response
+
+ def list_medical_transcription_jobs(
+ self, status, job_name_contains, next_token, max_results
+ ):
+ jobs = list(self.medical_transcriptions.values())
+
+ if status:
+ jobs = [job for job in jobs if job.status == status]
+
+ if job_name_contains:
+ jobs = [
+ job
+ for job in jobs
+ if job_name_contains in job.medical_transcription_job_name
+ ]
+
+ start_offset = int(next_token) if next_token else 0
+ end_offset = start_offset + (
+ max_results if max_results else 100
+ ) # Arbitrarily selected...
+ jobs_paginated = jobs[start_offset:end_offset]
+
+ response = {
+ "MedicalTranscriptionJobSummaries": [
+ job.response_object("LIST") for job in jobs_paginated
+ ]
+ }
+ if end_offset < len(jobs):
+ response["NextToken"] = str(end_offset)
+ if status:
+ response["Status"] = status
+ return response
+
+ def create_vocabulary(self, **kwargs):
+
+ vocabulary_name = kwargs.get("vocabulary_name")
+ language_code = kwargs.get("language_code")
+ phrases = kwargs.get("phrases")
+ vocabulary_file_uri = kwargs.get("vocabulary_file_uri")
+ if (
+ phrases is not None
+ and vocabulary_file_uri is not None
+ or phrases is None
+ and vocabulary_file_uri is None
+ ):
+ raise BadRequestException(
+ message="Either Phrases or VocabularyFileUri field should be provided."
+ )
+ if phrases is not None and len(phrases) < 1:
+ raise BadRequestException(
+ message="1 validation error detected: Value '[]' at 'phrases' failed to "
+ "satisfy constraint: Member must have length greater than or "
+ "equal to 1"
+ )
+ if vocabulary_name in self.vocabularies:
+ raise ConflictException(
+ message="The requested vocabulary name already exists. "
+ "Use a different vocabulary name."
+ )
+
+ vocabulary_object = FakeVocabulary(
+ region_name=self.region_name,
+ vocabulary_name=vocabulary_name,
+ language_code=language_code,
+ phrases=phrases,
+ vocabulary_file_uri=vocabulary_file_uri,
+ )
+
+ self.vocabularies[vocabulary_name] = vocabulary_object
+
+ return vocabulary_object.response_object("CREATE")
+
+ def create_medical_vocabulary(self, **kwargs):
+
+ vocabulary_name = kwargs.get("vocabulary_name")
+ language_code = kwargs.get("language_code")
+ vocabulary_file_uri = kwargs.get("vocabulary_file_uri")
+
+ if vocabulary_name in self.medical_vocabularies:
+ raise ConflictException(
+ message="The requested vocabulary name already exists. "
+ "Use a different vocabulary name."
+ )
+
+ medical_vocabulary_object = FakeMedicalVocabulary(
+ region_name=self.region_name,
+ vocabulary_name=vocabulary_name,
+ language_code=language_code,
+ vocabulary_file_uri=vocabulary_file_uri,
+ )
+
+ self.medical_vocabularies[vocabulary_name] = medical_vocabulary_object
+
+ return medical_vocabulary_object.response_object("CREATE")
+
+ def get_vocabulary(self, vocabulary_name):
+ try:
+ job = self.vocabularies[vocabulary_name]
+ job.advance() # Fakes advancement through statuses.
+ return job.response_object("GET")
+ except KeyError:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. "
+ "Check the vocabulary name and try your request again."
+ )
+
+ def get_medical_vocabulary(self, vocabulary_name):
+ try:
+ job = self.medical_vocabularies[vocabulary_name]
+ job.advance() # Fakes advancement through statuses.
+ return job.response_object("GET")
+ except KeyError:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. "
+ "Check the vocabulary name and try your request again."
+ )
+
+ def delete_vocabulary(self, vocabulary_name):
+ try:
+ del self.vocabularies[vocabulary_name]
+ except KeyError:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. Check the vocabulary name and try your request again."
+ )
+
+ def delete_medical_vocabulary(self, vocabulary_name):
+ try:
+ del self.medical_vocabularies[vocabulary_name]
+ except KeyError:
+ raise BadRequestException(
+ message="The requested vocabulary couldn't be found. Check the vocabulary name and try your request again."
+ )
+
+ def list_vocabularies(self, state_equals, name_contains, next_token, max_results):
+ vocabularies = list(self.vocabularies.values())
+
+ if state_equals:
+ vocabularies = [
+ vocabulary
+ for vocabulary in vocabularies
+ if vocabulary.status == state_equals
+ ]
+
+ if name_contains:
+ vocabularies = [
+ vocabulary
+ for vocabulary in vocabularies
+ if name_contains in vocabulary.vocabulary_name
+ ]
+
+ start_offset = int(next_token) if next_token else 0
+ end_offset = start_offset + (
+ max_results if max_results else 100
+ ) # Arbitrarily selected...
+ vocabularies_paginated = vocabularies[start_offset:end_offset]
+
+ response = {
+ "Vocabularies": [
+ vocabulary.response_object("LIST")
+ for vocabulary in vocabularies_paginated
+ ]
+ }
+ if end_offset < len(vocabularies):
+ response["NextToken"] = str(end_offset)
+ if state_equals:
+ response["Status"] = state_equals
+ return response
+
+ def list_medical_vocabularies(
+ self, state_equals, name_contains, next_token, max_results
+ ):
+ vocabularies = list(self.medical_vocabularies.values())
+
+ if state_equals:
+ vocabularies = [
+ vocabulary
+ for vocabulary in vocabularies
+ if vocabulary.status == state_equals
+ ]
+
+ if name_contains:
+ vocabularies = [
+ vocabulary
+ for vocabulary in vocabularies
+ if name_contains in vocabulary.vocabulary_name
+ ]
+
+ start_offset = int(next_token) if next_token else 0
+ end_offset = start_offset + (
+ max_results if max_results else 100
+ ) # Arbitrarily selected...
+ vocabularies_paginated = vocabularies[start_offset:end_offset]
+
+ response = {
+ "Vocabularies": [
+ vocabulary.response_object("LIST")
+ for vocabulary in vocabularies_paginated
+ ]
+ }
+ if end_offset < len(vocabularies):
+ response["NextToken"] = str(end_offset)
+ if state_equals:
+ response["Status"] = state_equals
+ return response
+
+
+transcribe_backends = BackendDict(TranscribeBackend, "transcribe")
diff --git a/contrib/python/moto/py3/moto/transcribe/responses.py b/contrib/python/moto/py3/moto/transcribe/responses.py
new file mode 100644
index 0000000000..af26f41a76
--- /dev/null
+++ b/contrib/python/moto/py3/moto/transcribe/responses.py
@@ -0,0 +1,206 @@
+import json
+
+from moto.core.responses import BaseResponse
+from moto.core.utils import amzn_request_id
+from .models import transcribe_backends
+
+
+class TranscribeResponse(BaseResponse):
+ @property
+ def transcribe_backend(self):
+ return transcribe_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ @amzn_request_id
+ def start_transcription_job(self):
+ name = self._get_param("TranscriptionJobName")
+ response = self.transcribe_backend.start_transcription_job(
+ transcription_job_name=name,
+ language_code=self._get_param("LanguageCode"),
+ media_sample_rate_hertz=self._get_param("MediaSampleRateHertz"),
+ media_format=self._get_param("MediaFormat"),
+ media=self._get_param("Media"),
+ output_bucket_name=self._get_param("OutputBucketName"),
+ output_key=self._get_param("OutputKey"),
+ output_encryption_kms_key_id=self._get_param("OutputEncryptionKMSKeyId"),
+ settings=self._get_param("Settings"),
+ model_settings=self._get_param("ModelSettings"),
+ job_execution_settings=self._get_param("JobExecutionSettings"),
+ content_redaction=self._get_param("ContentRedaction"),
+ identify_language=self._get_param("IdentifyLanguage"),
+ language_options=self._get_param("LanguageOptions"),
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def start_medical_transcription_job(self):
+ name = self._get_param("MedicalTranscriptionJobName")
+ response = self.transcribe_backend.start_medical_transcription_job(
+ medical_transcription_job_name=name,
+ language_code=self._get_param("LanguageCode"),
+ media_sample_rate_hertz=self._get_param("MediaSampleRateHertz"),
+ media_format=self._get_param("MediaFormat"),
+ media=self._get_param("Media"),
+ output_bucket_name=self._get_param("OutputBucketName"),
+ output_encryption_kms_key_id=self._get_param("OutputEncryptionKMSKeyId"),
+ settings=self._get_param("Settings"),
+ specialty=self._get_param("Specialty"),
+ type=self._get_param("Type"),
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def list_transcription_jobs(self):
+ state_equals = self._get_param("Status")
+ job_name_contains = self._get_param("JobNameContains")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults")
+
+ response = self.transcribe_backend.list_transcription_jobs(
+ state_equals=state_equals,
+ job_name_contains=job_name_contains,
+ next_token=next_token,
+ max_results=max_results,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def list_medical_transcription_jobs(self):
+ status = self._get_param("Status")
+ job_name_contains = self._get_param("JobNameContains")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults")
+
+ response = self.transcribe_backend.list_medical_transcription_jobs(
+ status=status,
+ job_name_contains=job_name_contains,
+ next_token=next_token,
+ max_results=max_results,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def get_transcription_job(self):
+ transcription_job_name = self._get_param("TranscriptionJobName")
+ response = self.transcribe_backend.get_transcription_job(
+ transcription_job_name=transcription_job_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def get_medical_transcription_job(self):
+ medical_transcription_job_name = self._get_param("MedicalTranscriptionJobName")
+ response = self.transcribe_backend.get_medical_transcription_job(
+ medical_transcription_job_name=medical_transcription_job_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_transcription_job(self):
+ transcription_job_name = self._get_param("TranscriptionJobName")
+ response = self.transcribe_backend.delete_transcription_job(
+ transcription_job_name=transcription_job_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_medical_transcription_job(self):
+ medical_transcription_job_name = self._get_param("MedicalTranscriptionJobName")
+ response = self.transcribe_backend.delete_medical_transcription_job(
+ medical_transcription_job_name=medical_transcription_job_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def create_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ language_code = self._get_param("LanguageCode")
+ phrases = self._get_param("Phrases")
+ vocabulary_file_uri = self._get_param("VocabularyFileUri")
+ response = self.transcribe_backend.create_vocabulary(
+ vocabulary_name=vocabulary_name,
+ language_code=language_code,
+ phrases=phrases,
+ vocabulary_file_uri=vocabulary_file_uri,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def create_medical_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ language_code = self._get_param("LanguageCode")
+ vocabulary_file_uri = self._get_param("VocabularyFileUri")
+ response = self.transcribe_backend.create_medical_vocabulary(
+ vocabulary_name=vocabulary_name,
+ language_code=language_code,
+ vocabulary_file_uri=vocabulary_file_uri,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def get_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ response = self.transcribe_backend.get_vocabulary(
+ vocabulary_name=vocabulary_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def get_medical_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ response = self.transcribe_backend.get_medical_vocabulary(
+ vocabulary_name=vocabulary_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def list_vocabularies(self):
+ state_equals = self._get_param("StateEquals")
+ name_contains = self._get_param("NameContains")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults")
+
+ response = self.transcribe_backend.list_vocabularies(
+ state_equals=state_equals,
+ name_contains=name_contains,
+ next_token=next_token,
+ max_results=max_results,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def list_medical_vocabularies(self):
+ state_equals = self._get_param("StateEquals")
+ name_contains = self._get_param("NameContains")
+ next_token = self._get_param("NextToken")
+ max_results = self._get_param("MaxResults")
+
+ response = self.transcribe_backend.list_medical_vocabularies(
+ state_equals=state_equals,
+ name_contains=name_contains,
+ next_token=next_token,
+ max_results=max_results,
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ response = self.transcribe_backend.delete_vocabulary(
+ vocabulary_name=vocabulary_name
+ )
+ return json.dumps(response)
+
+ @amzn_request_id
+ def delete_medical_vocabulary(self):
+ vocabulary_name = self._get_param("VocabularyName")
+ response = self.transcribe_backend.delete_medical_vocabulary(
+ vocabulary_name=vocabulary_name
+ )
+ return json.dumps(response)
diff --git a/contrib/python/moto/py3/moto/transcribe/urls.py b/contrib/python/moto/py3/moto/transcribe/urls.py
new file mode 100644
index 0000000000..2ba8069b53
--- /dev/null
+++ b/contrib/python/moto/py3/moto/transcribe/urls.py
@@ -0,0 +1,5 @@
+from .responses import TranscribeResponse
+
+url_bases = [r"https?://transcribe\.(.+)\.amazonaws\.com"]
+
+url_paths = {"{0}/$": TranscribeResponse.dispatch}
diff --git a/contrib/python/moto/py3/moto/utilities/__init__.py b/contrib/python/moto/py3/moto/utilities/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/__init__.py
diff --git a/contrib/python/moto/py3/moto/utilities/distutils_version.py b/contrib/python/moto/py3/moto/utilities/distutils_version.py
new file mode 100644
index 0000000000..7ad826151e
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/distutils_version.py
@@ -0,0 +1,233 @@
+#
+# distutils/version.py
+#
+# Implements multiple version numbering conventions for the
+# Python Module Distribution Utilities.
+#
+# $Id$
+#
+
+# Copied here on 04/Dec/2021, as distutils will be deprecated in Py3.10
+# This class is now part of the 'packaging' tool, but taking on an entire dependency for a single class seems silly
+
+"""Provides classes to represent module version numbers (one class for
+each style of version numbering). There are currently two such classes
+implemented: StrictVersion and LooseVersion.
+
+Every version number class implements the following interface:
+ * the 'parse' method takes a string and parses it to some internal
+ representation; if the string is an invalid version number,
+ 'parse' raises a ValueError exception
+ * the class constructor takes an optional string argument which,
+ if supplied, is passed to 'parse'
+ * __str__ reconstructs the string that was passed to 'parse' (or
+ an equivalent string -- ie. one that will generate an equivalent
+ version number instance)
+ * __repr__ generates Python code to recreate the version number instance
+ * _cmp compares the current instance with either another instance
+ of the same class or a string (which will be parsed to an instance
+ of the same class, thus must follow the same rules)
+"""
+
+import re
+
+
+class Version:
+ """Abstract base class for version numbering classes. Just provides
+ constructor (__init__) and reproducer (__repr__), because those
+ seem to be the same for all version numbering classes; and route
+ rich comparisons to _cmp.
+ """
+
+ def __init__(self, vstring=None):
+ if vstring:
+ self.parse(vstring)
+
+ def __repr__(self):
+ return "%s ('%s')" % (self.__class__.__name__, str(self))
+
+ def __eq__(self, other):
+ c = self._cmp(other)
+ if c is NotImplemented:
+ return c
+ return c == 0
+
+ def __lt__(self, other):
+ c = self._cmp(other)
+ if c is NotImplemented:
+ return c
+ return c < 0
+
+ def __le__(self, other):
+ c = self._cmp(other)
+ if c is NotImplemented:
+ return c
+ return c <= 0
+
+ def __gt__(self, other):
+ c = self._cmp(other)
+ if c is NotImplemented:
+ return c
+ return c > 0
+
+ def __ge__(self, other):
+ c = self._cmp(other)
+ if c is NotImplemented:
+ return c
+ return c >= 0
+
+
+# Interface for version-number classes -- must be implemented
+# by the following classes (the concrete ones -- Version should
+# be treated as an abstract class).
+# __init__ (string) - create and take same action as 'parse'
+# (string parameter is optional)
+# parse (string) - convert a string representation to whatever
+# internal representation is appropriate for
+# this style of version numbering
+# __str__ (self) - convert back to a string; should be very similar
+# (if not identical to) the string supplied to parse
+# __repr__ (self) - generate Python code to recreate
+# the instance
+# _cmp (self, other) - compare two version numbers ('other' may
+# be an unparsed version string, or another
+# instance of your version class)
+
+
+# The rules according to Greg Stein:
+# 1) a version number has 1 or more numbers separated by a period or by
+# sequences of letters. If only periods, then these are compared
+# left-to-right to determine an ordering.
+# 2) sequences of letters are part of the tuple for comparison and are
+# compared lexicographically
+# 3) recognize the numeric components may have leading zeroes
+#
+# The LooseVersion class below implements these rules: a version number
+# string is split up into a tuple of integer and string components, and
+# comparison is a simple tuple comparison. This means that version
+# numbers behave in a predictable and obvious way, but a way that might
+# not necessarily be how people *want* version numbers to behave. There
+# wouldn't be a problem if people could stick to purely numeric version
+# numbers: just split on period and compare the numbers as tuples.
+# However, people insist on putting letters into their version numbers;
+# the most common purpose seems to be:
+# - indicating a "pre-release" version
+# ('alpha', 'beta', 'a', 'b', 'pre', 'p')
+# - indicating a post-release patch ('p', 'pl', 'patch')
+# but of course this can't cover all version number schemes, and there's
+# no way to know what a programmer means without asking him.
+#
+# The problem is what to do with letters (and other non-numeric
+# characters) in a version number. The current implementation does the
+# obvious and predictable thing: keep them as strings and compare
+# lexically within a tuple comparison. This has the desired effect if
+# an appended letter sequence implies something "post-release":
+# eg. "0.99" < "0.99pl14" < "1.0", and "5.001" < "5.001m" < "5.002".
+#
+# However, if letters in a version number imply a pre-release version,
+# the "obvious" thing isn't correct. Eg. you would expect that
+# "1.5.1" < "1.5.2a2" < "1.5.2", but under the tuple/lexical comparison
+# implemented here, this just isn't so.
+#
+# Two possible solutions come to mind. The first is to tie the
+# comparison algorithm to a particular set of semantic rules, as has
+# been done in the StrictVersion class above. This works great as long
+# as everyone can go along with bondage and discipline. Hopefully a
+# (large) subset of Python module programmers will agree that the
+# particular flavour of bondage and discipline provided by StrictVersion
+# provides enough benefit to be worth using, and will submit their
+# version numbering scheme to its domination. The free-thinking
+# anarchists in the lot will never give in, though, and something needs
+# to be done to accommodate them.
+#
+# Perhaps a "moderately strict" version class could be implemented that
+# lets almost anything slide (syntactically), and makes some heuristic
+# assumptions about non-digits in version number strings. This could
+# sink into special-case-hell, though; if I was as talented and
+# idiosyncratic as Larry Wall, I'd go ahead and implement a class that
+# somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is
+# just as happy dealing with things like "2g6" and "1.13++". I don't
+# think I'm smart enough to do it right though.
+#
+# In any case, I've coded the test suite for this module (see
+# ../test/test_version.py) specifically to fail on things like comparing
+# "1.2a2" and "1.2". That's not because the *code* is doing anything
+# wrong, it's because the simple, obvious design doesn't match my
+# complicated, hairy expectations for real-world version numbers. It
+# would be a snap to fix the test suite to say, "Yep, LooseVersion does
+# the Right Thing" (ie. the code matches the conception). But I'd rather
+# have a conception that matches common notions about version numbers.
+
+
+class LooseVersion(Version):
+
+ """Version numbering for anarchists and software realists.
+ Implements the standard interface for version number classes as
+ described above. A version number consists of a series of numbers,
+ separated by either periods or strings of letters. When comparing
+ version numbers, the numeric components will be compared
+ numerically, and the alphabetic components lexically. The following
+ are all valid version numbers, in no particular order:
+
+ 1.5.1
+ 1.5.2b2
+ 161
+ 3.10a
+ 8.02
+ 3.4j
+ 1996.07.12
+ 3.2.pl0
+ 3.1.1.6
+ 2g6
+ 11g
+ 0.960923
+ 2.2beta29
+ 1.13++
+ 5.5.kw
+ 2.0b1pl0
+
+ In fact, there is no such thing as an invalid version number under
+ this scheme; the rules for comparison are simple and predictable,
+ but may not always give the results you want (for some definition
+ of "want").
+ """
+
+ component_re = re.compile(r"(\d+ | [a-z]+ | \.)", re.VERBOSE)
+
+ def __init__(self, vstring=None):
+ if vstring:
+ self.parse(vstring)
+
+ def parse(self, vstring):
+ # I've given up on thinking I can reconstruct the version string
+ # from the parsed tuple -- so I just store the string here for
+ # use by __str__
+ self.vstring = vstring
+ components = [x for x in self.component_re.split(vstring) if x and x != "."]
+ for i, obj in enumerate(components):
+ try:
+ components[i] = int(obj)
+ except ValueError:
+ pass
+
+ self.version = components
+
+ def __str__(self):
+ return self.vstring
+
+ def __repr__(self):
+ return "LooseVersion ('%s')" % str(self)
+
+ def _cmp(self, other):
+ if isinstance(other, str):
+ other = LooseVersion(other)
+
+ if self.version == other.version:
+ return 0
+ if self.version < other.version:
+ return -1
+ if self.version > other.version:
+ return 1
+
+
+# end class LooseVersion
diff --git a/contrib/python/moto/py3/moto/utilities/docker_utilities.py b/contrib/python/moto/py3/moto/utilities/docker_utilities.py
new file mode 100644
index 0000000000..e049d89027
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/docker_utilities.py
@@ -0,0 +1,60 @@
+import functools
+import requests.adapters
+
+from moto import settings
+
+
+_orig_adapter_send = requests.adapters.HTTPAdapter.send
+
+
+class DockerModel:
+ def __init__(self):
+ self.__docker_client = None
+
+ @property
+ def docker_client(self):
+ if self.__docker_client is None:
+ # We should only initiate the Docker Client at runtime.
+ # The docker.from_env() call will fall if Docker is not running
+ import docker
+
+ self.__docker_client = docker.from_env()
+
+ # Unfortunately mocking replaces this method w/o fallback enabled, so we
+ # need to replace it if we detect it's been mocked
+ if requests.adapters.HTTPAdapter.send != _orig_adapter_send:
+ _orig_get_adapter = self.docker_client.api.get_adapter
+
+ def replace_adapter_send(*args, **kwargs):
+ adapter = _orig_get_adapter(*args, **kwargs)
+
+ if isinstance(adapter, requests.adapters.HTTPAdapter):
+ adapter.send = functools.partial(_orig_adapter_send, adapter)
+ return adapter
+
+ self.docker_client.api.get_adapter = replace_adapter_send
+ return self.__docker_client
+
+
+def parse_image_ref(image_name):
+ # podman does not support short container image name out of box - try to make a full name
+ # See ParseDockerRef() in https://github.com/distribution/distribution/blob/main/reference/normalize.go
+ parts = image_name.split("/")
+ if len(parts) == 1 or (
+ "." not in parts[0] and ":" not in parts[0] and parts[0] != "localhost"
+ ):
+ domain = settings.DEFAULT_CONTAINER_REGISTRY
+ remainder = parts
+ else:
+ domain = parts[0]
+ remainder = parts[1:]
+ # Special handling for docker.io
+ # https://github.com/containers/image/blob/master/docs/containers-registries.conf.5.md#normalization-of-dockerio-references
+ if domain == "docker.io" and len(remainder) == 1:
+ remainder = ["library"] + remainder
+ if ":" in remainder[-1]:
+ remainder[-1], image_tag = remainder[-1].split(":", 1)
+ else:
+ image_tag = "latest"
+ image_repository = "/".join([domain] + remainder)
+ return image_repository, image_tag
diff --git a/contrib/python/moto/py3/moto/utilities/paginator.py b/contrib/python/moto/py3/moto/utilities/paginator.py
new file mode 100644
index 0000000000..bbcb2dbe70
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/paginator.py
@@ -0,0 +1,182 @@
+import inspect
+
+from copy import deepcopy
+from functools import wraps
+
+from botocore.paginate import TokenDecoder, TokenEncoder
+
+from moto.core.exceptions import InvalidToken
+
+
+def paginate(pagination_model, original_function=None):
+ def pagination_decorator(func):
+ @wraps(func)
+ def pagination_wrapper(*args, **kwargs):
+
+ method = func.__name__
+ model = pagination_model
+ pagination_config = model.get(method)
+ if not pagination_config:
+ raise ValueError(
+ "No pagination config for backend method: {}".format(method)
+ )
+ # Get the pagination arguments, to be used by the paginator
+ next_token_name = pagination_config.get("input_token", "next_token")
+ limit_name = pagination_config.get("limit_key")
+ input_token = kwargs.get(next_token_name)
+ limit = kwargs.get(limit_name, None)
+ # Remove pagination arguments from our input kwargs
+ # We need this to verify that our input kwargs are the same across invocations
+ # list_all(service="x") next_token = "a"
+ # list_all(service="x", next_token="a") ==> Works fine
+ # list_all(service="y", next_token="a") ==> Should throw an error, as the input_kwargs are different
+ input_kwargs = deepcopy(kwargs)
+ input_kwargs.pop(next_token_name, None)
+ input_kwargs.pop(limit_name, None)
+ fail_on_invalid_token = pagination_config.get("fail_on_invalid_token", True)
+ paginator = Paginator(
+ max_results=limit,
+ max_results_default=pagination_config.get("limit_default"),
+ starting_token=input_token,
+ unique_attribute=pagination_config.get("unique_attribute"),
+ param_values_to_check=input_kwargs,
+ fail_on_invalid_token=fail_on_invalid_token,
+ )
+
+ # Determine which parameters to pass
+ (arg_names, _, has_kwargs, _, _, _, _) = inspect.getfullargspec(func)
+ # If the target-func expects `**kwargs`, we can pass everything
+ if not has_kwargs:
+ # If the target-function does not expect the next_token/limit, do not pass it
+ if next_token_name not in arg_names:
+ kwargs.pop(next_token_name, None)
+ if limit_name not in arg_names:
+ kwargs.pop(limit_name, None)
+
+ results = func(*args, **kwargs)
+ return paginator.paginate(results)
+
+ return pagination_wrapper
+
+ if original_function:
+ return pagination_decorator(original_function)
+
+ return pagination_decorator
+
+
+class Paginator(object):
+ def __init__(
+ self,
+ max_results=None,
+ max_results_default=None,
+ starting_token=None,
+ unique_attribute=None,
+ param_values_to_check=None,
+ fail_on_invalid_token=True,
+ ):
+ self._max_results = max_results if max_results else max_results_default
+ self._starting_token = starting_token
+ self._unique_attributes = unique_attribute
+ if not isinstance(unique_attribute, list):
+ self._unique_attributes = [unique_attribute]
+ self._param_values_to_check = param_values_to_check
+ self._fail_on_invalid_token = fail_on_invalid_token
+ self._token_encoder = TokenEncoder()
+ self._token_decoder = TokenDecoder()
+ self._param_checksum = self._calculate_parameter_checksum()
+ self._parsed_token = self._parse_starting_token()
+
+ def _parse_starting_token(self):
+ if self._starting_token is None:
+ return None
+ # The starting token is a dict passed as a base64 encoded string.
+ next_token = self._starting_token
+ try:
+ next_token = self._token_decoder.decode(next_token)
+ except (ValueError, TypeError, UnicodeDecodeError):
+ self._raise_exception_if_required(next_token)
+ return None
+ if next_token.get("parameterChecksum") != self._param_checksum:
+ raise InvalidToken(
+ "Input inconsistent with page token: {}".format(str(next_token))
+ )
+ return next_token
+
+ def _raise_exception_if_required(self, token):
+ if self._fail_on_invalid_token:
+ if isinstance(self._fail_on_invalid_token, type):
+ # we need to raise a custom exception
+ func_info = inspect.getfullargspec(self._fail_on_invalid_token)
+ arg_names, _, _, _, _, _, _ = func_info
+ # arg_names == [self] or [self, token_argument_that_can_have_any_name]
+ requires_token_arg = len(arg_names) > 1
+ if requires_token_arg:
+ raise self._fail_on_invalid_token(token)
+ else:
+ raise self._fail_on_invalid_token()
+ raise InvalidToken("Invalid token")
+
+ def _calculate_parameter_checksum(self):
+ def freeze(o):
+ if not o:
+ return None
+ if isinstance(o, dict):
+ return frozenset({k: freeze(v) for k, v in o.items()}.items())
+
+ if isinstance(o, (list, tuple, set)):
+ return tuple([freeze(v) for v in o])
+
+ return o
+
+ return hash(freeze(self._param_values_to_check))
+
+ def _check_predicate(self, item):
+ if self._parsed_token is None:
+ return False
+ unique_attributes = self._parsed_token["uniqueAttributes"]
+ predicate_values = unique_attributes.split("|")
+ for (index, attr) in enumerate(self._unique_attributes):
+ curr_val = item[attr] if type(item) == dict else getattr(item, attr, None)
+ if not str(curr_val) == predicate_values[index]:
+ return False
+ return True
+
+ def _build_next_token(self, next_item):
+ token_dict = {}
+ if self._param_checksum:
+ token_dict["parameterChecksum"] = self._param_checksum
+ range_keys = []
+ for attr in self._unique_attributes:
+ if type(next_item) == dict:
+ range_keys.append(str(next_item[attr]))
+ else:
+ range_keys.append(str(getattr(next_item, attr)))
+ token_dict["uniqueAttributes"] = "|".join(range_keys)
+ return self._token_encoder.encode(token_dict)
+
+ def paginate(self, results):
+ index_start = 0
+ if self._starting_token:
+ try:
+ index_start = next(
+ index
+ for (index, result) in enumerate(results)
+ if self._check_predicate(result)
+ )
+ except StopIteration:
+ if self._fail_on_invalid_token:
+ raise InvalidToken("Resource not found!")
+ else:
+ return [], None
+
+ index_end = index_start + self._max_results
+ if index_end > len(results):
+ index_end = len(results)
+
+ results_page = results[index_start:index_end]
+
+ next_token = None
+ if results_page and index_end < len(results):
+ last_resource_on_this_page = results[index_end]
+ next_token = self._build_next_token(last_resource_on_this_page)
+ return results_page, next_token
diff --git a/contrib/python/moto/py3/moto/utilities/tagging_service.py b/contrib/python/moto/py3/moto/utilities/tagging_service.py
new file mode 100644
index 0000000000..a2710f41f9
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/tagging_service.py
@@ -0,0 +1,175 @@
+"""Tag functionality contained in class TaggingService."""
+import re
+
+
+class TaggingService:
+ """Functionality related to tags, i.e., adding, deleting, testing."""
+
+ def __init__(self, tag_name="Tags", key_name="Key", value_name="Value"):
+ self.tag_name = tag_name
+ self.key_name = key_name
+ self.value_name = value_name
+ self.tags = {}
+
+ def get_tag_dict_for_resource(self, arn):
+ """Return dict of key/value pairs vs. list of key/values dicts."""
+ result = {}
+ if self.has_tags(arn):
+ for key, val in self.tags[arn].items():
+ result[key] = val
+ return result
+
+ def list_tags_for_resource(self, arn):
+ """Return list of tags inside dict with key of "tag_name".
+
+ Useful for describe functions; this return value can be added to
+ dictionary returned from a describe function.
+ """
+ result = []
+ if self.has_tags(arn):
+ for key, val in self.tags[arn].items():
+ result.append({self.key_name: key, self.value_name: val})
+ return {self.tag_name: result}
+
+ def delete_all_tags_for_resource(self, arn):
+ """Delete all tags associated with given ARN."""
+ if self.has_tags(arn):
+ del self.tags[arn]
+
+ def has_tags(self, arn):
+ """Return True if the ARN has any associated tags, False otherwise."""
+ return arn in self.tags
+
+ def tag_resource(self, arn, tags):
+ """Store associated list of dicts with ARN.
+
+ Note: the storage is internal to this class instance.
+ """
+ if not tags:
+ return
+ if arn not in self.tags:
+ self.tags[arn] = {}
+ for tag in tags:
+ if self.value_name in tag:
+ self.tags[arn][tag[self.key_name]] = tag[self.value_name]
+ else:
+ self.tags[arn][tag[self.key_name]] = None
+
+ def copy_tags(self, from_arn, to_arn):
+ """Copy stored list of tags associated with one ARN to another ARN.
+
+ Note: the storage is internal to this class instance.
+ """
+ if self.has_tags(from_arn):
+ self.tag_resource(
+ to_arn, self.list_tags_for_resource(from_arn)[self.tag_name]
+ )
+
+ def untag_resource_using_names(self, arn, tag_names):
+ """Remove tags associated with ARN using key names in 'tag_names'."""
+ for name in tag_names:
+ if name in self.tags.get(arn, {}):
+ del self.tags[arn][name]
+
+ def untag_resource_using_tags(self, arn, tags):
+ """Remove tags associated with ARN using key/value pairs in 'tags'."""
+ current_tags = self.tags.get(arn, {})
+ for tag in tags:
+ if self.key_name in tag:
+ if tag[self.key_name] in current_tags:
+ if self.value_name in tag:
+ if current_tags[tag[self.key_name]] != tag[self.value_name]:
+ continue
+ # If both key and value are provided, match both before deletion
+ del current_tags[tag[self.key_name]]
+
+ def extract_tag_names(self, tags):
+ """Return list of key names in list of 'tags' key/value dicts."""
+ results = []
+ if len(tags) == 0:
+ return results
+ for tag in tags:
+ if self.key_name in tag:
+ results.append(tag[self.key_name])
+ return results
+
+ def flatten_tag_list(self, tags):
+ """Return dict of key/value pairs with 'tag_name', 'value_name'."""
+ result = {}
+ for tag in tags:
+ if self.value_name in tag:
+ result[tag[self.key_name]] = tag[self.value_name]
+ else:
+ result[tag[self.key_name]] = None
+ return result
+
+ def validate_tags(self, tags, limit=0):
+ """Returns error message if tags in 'tags' list of dicts are invalid.
+
+ The validation does not include a check for duplicate keys.
+ Duplicate keys are not always an error and the error message isn't
+ consistent across services, so this should be a separate check.
+
+ If limit is provided, then the number of tags will be checked.
+ """
+ errors = []
+ key_regex = re.compile(r"^(?!aws:)([\w\s\d_.:/=+\-@]*)$")
+ value_regex = re.compile(r"^([\w\s\d_.:/=+\-@]*)$")
+
+ # AWS only outputs one error for all keys and one for all values.
+ for idx, tag in enumerate(tags, 1):
+ for tag_key, tag_value in tag.items():
+ if tag_key == self.key_name:
+ # Validation for len(tag_key) >= 1 is done by botocore.
+ if len(tag_value) > 128:
+ errors.append(
+ f"Value '{tag_value}' at 'tags.{idx}.member.key' "
+ f"failed to satisfy constraint: Member must have "
+ f"length less than or equal to 128"
+ )
+ if not re.match(key_regex, tag_value):
+ errors.append(
+ f"Value '{tag_value}' at 'tags.{idx}.member.key' "
+ f"failed to satisfy constraint: Member must "
+ f"satisfy regular expression pattern: "
+ r"^(?!aws:)[{a-zA-Z0-9 }_.://=+-@%]*$"
+ )
+ elif tag_key == self.value_name:
+ # Validation for len(tag_value) >= 0 is nonsensical.
+ if len(tag_value) > 256:
+ errors.append(
+ f"Value '{tag_value}' at 'tags.{idx}.member.value' "
+ f"failed to satisfy constraint: Member must have "
+ f"length less than or equal to 256"
+ # Member must have length greater than or equal to 0, "
+ )
+ if not re.match(value_regex, tag_value):
+ errors.append(
+ f"Value '{tag_value}' at 'tags.{idx}.member.value' "
+ f"failed to satisfy constraint: Member must satisfy "
+ f"regular expression pattern: "
+ r"^[{a-zA-Z0-9 }_.://=+-@%]*$"
+ )
+
+ if limit and len(tags) > limit:
+ errors.append(
+ f"Value '{tags}' at 'tags' failed to satisfy constraint: "
+ f"Member must have length less than or equal to {limit}"
+ )
+
+ errors_len = len(errors)
+ return (
+ (
+ f"{errors_len} validation error{'s' if len(errors) > 1 else ''} "
+ f"detected: {'; '.join(errors)}"
+ )
+ if errors
+ else ""
+ )
+
+ @staticmethod
+ def convert_dict_to_tags_input(tags):
+ """Given a dictionary, return generic boto params for tags"""
+ if not tags:
+ return []
+ return [{"Key": k, "Value": v} for (k, v) in tags.items()]
diff --git a/contrib/python/moto/py3/moto/utilities/utils.py b/contrib/python/moto/py3/moto/utilities/utils.py
new file mode 100644
index 0000000000..636e71e1e4
--- /dev/null
+++ b/contrib/python/moto/py3/moto/utilities/utils.py
@@ -0,0 +1,100 @@
+import json
+import hashlib
+import random
+import string
+import pkgutil
+
+
+from collections.abc import MutableMapping
+
+
+def str2bool(v):
+ if v in ("yes", True, "true", "True", "TRUE", "t", "1"):
+ return True
+ elif v in ("no", False, "false", "False", "FALSE", "f", "0"):
+ return False
+
+
+def random_string(length=None):
+ n = length or 20
+ random_str = "".join(
+ [random.choice(string.ascii_letters + string.digits) for i in range(n)]
+ )
+ return random_str
+
+
+def load_resource(package, resource, as_json=True):
+ """
+ Open a file, and return the contents as JSON.
+ Usage:
+ load_resource(__name__, "resources/file.json")
+ """
+ resource = pkgutil.get_data(package, resource)
+ return json.loads(resource) if as_json else resource.decode("utf-8")
+
+
+def merge_multiple_dicts(*args):
+ result = {}
+ for d in args:
+ result.update(d)
+ return result
+
+
+def filter_resources(resources, filters, attr_pairs):
+ """
+ Used to filter resources. Usually in get and describe apis.
+ """
+ result = resources.copy()
+ for resource in resources:
+ for attrs in attr_pairs:
+ values = filters.get(attrs[0]) or None
+ if values:
+ instance = getattr(resource, attrs[1])
+ if (len(attrs) <= 2 and instance not in values) or (
+ len(attrs) == 3 and instance.get(attrs[2]) not in values
+ ):
+ result.remove(resource)
+ break
+ return result
+
+
+def md5_hash(data=None):
+ """
+ MD5-hashing for non-security usecases.
+ Required for Moto to work in FIPS-enabled systems
+ """
+ args = (data,) if data else ()
+ try:
+ return hashlib.md5(*args, usedforsecurity=False)
+ except TypeError:
+ # The usedforsecurity-parameter is only available as of Python 3.9
+ return hashlib.md5(*args)
+
+
+class LowercaseDict(MutableMapping):
+ """A dictionary that lowercases all keys"""
+
+ def __init__(self, *args, **kwargs):
+ self.store = dict()
+ self.update(dict(*args, **kwargs)) # use the free update to set keys
+
+ def __getitem__(self, key):
+ return self.store[self._keytransform(key)]
+
+ def __setitem__(self, key, value):
+ self.store[self._keytransform(key)] = value
+
+ def __delitem__(self, key):
+ del self.store[self._keytransform(key)]
+
+ def __iter__(self):
+ return iter(self.store)
+
+ def __len__(self):
+ return len(self.store)
+
+ def __repr__(self):
+ return str(self.store)
+
+ def _keytransform(self, key):
+ return key.lower()
diff --git a/contrib/python/moto/py3/moto/wafv2/__init__.py b/contrib/python/moto/py3/moto/wafv2/__init__.py
new file mode 100644
index 0000000000..5c984e3cca
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/__init__.py
@@ -0,0 +1,5 @@
+from .models import wafv2_backends
+from ..core.models import base_decorator
+
+wafv2_backend = wafv2_backends["us-east-1"]
+mock_wafv2 = base_decorator(wafv2_backends)
diff --git a/contrib/python/moto/py3/moto/wafv2/exceptions.py b/contrib/python/moto/py3/moto/wafv2/exceptions.py
new file mode 100644
index 0000000000..7aeab074df
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/exceptions.py
@@ -0,0 +1,13 @@
+from moto.core.exceptions import RESTError
+
+
+class WAFv2ClientError(RESTError):
+ code = 400
+
+
+class WAFV2DuplicateItemException(WAFv2ClientError):
+ def __init__(self):
+ super().__init__(
+ "WafV2DuplicateItem",
+ "AWS WAF could not perform the operation because some resource in your request is a duplicate of an existing one.",
+ )
diff --git a/contrib/python/moto/py3/moto/wafv2/models.py b/contrib/python/moto/py3/moto/wafv2/models.py
new file mode 100644
index 0000000000..cfe891bd84
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/models.py
@@ -0,0 +1,112 @@
+from uuid import uuid4
+from moto.core import BaseBackend, BaseModel
+from moto.wafv2 import utils
+
+from .utils import make_arn_for_wacl, pascal_to_underscores_dict
+from .exceptions import WAFV2DuplicateItemException
+from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
+import datetime
+from collections import OrderedDict
+
+
+US_EAST_1_REGION = "us-east-1"
+GLOBAL_REGION = "global"
+
+
+class VisibilityConfig(BaseModel):
+ """
+ https://docs.aws.amazon.com/waf/latest/APIReference/API_VisibilityConfig.html
+ """
+
+ def __init__(
+ self, metric_name, sampled_requests_enabled, cloud_watch_metrics_enabled
+ ):
+ self.cloud_watch_metrics_enabled = cloud_watch_metrics_enabled
+ self.metric_name = metric_name
+ self.sampled_requests_enabled = sampled_requests_enabled
+
+
+class DefaultAction(BaseModel):
+ """
+ https://docs.aws.amazon.com/waf/latest/APIReference/API_DefaultAction.html
+ """
+
+ def __init__(self, allow=None, block=None):
+ self.allow = allow or {}
+ self.block = block or {}
+
+
+# TODO: Add remaining properties
+class FakeWebACL(BaseModel):
+ """
+ https://docs.aws.amazon.com/waf/latest/APIReference/API_WebACL.html
+ """
+
+ def __init__(self, name, arn, wacl_id, visibility_config, default_action):
+ self.name = name if name else utils.create_test_name("Mock-WebACL-name")
+ self.created_time = iso_8601_datetime_with_milliseconds(datetime.datetime.now())
+ self.id = wacl_id
+ self.arn = arn
+ self.description = "Mock WebACL named {0}".format(self.name)
+ self.capacity = 3
+ self.visibility_config = VisibilityConfig(
+ **pascal_to_underscores_dict(visibility_config)
+ )
+ self.default_action = DefaultAction(
+ **pascal_to_underscores_dict(default_action)
+ )
+
+ def to_dict(self):
+ # Format for summary https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateWebACL.html (response syntax section)
+ return {
+ "ARN": self.arn,
+ "Description": self.description,
+ "Id": self.id,
+ "LockToken": "Not Implemented",
+ "Name": self.name,
+ }
+
+
+class WAFV2Backend(BaseBackend):
+ """
+ https://docs.aws.amazon.com/waf/latest/APIReference/API_Operations_AWS_WAFV2.html
+ """
+
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self.wacls = OrderedDict() # self.wacls[ARN] = FakeWacl
+ # TODO: self.load_balancers = OrderedDict()
+
+ def create_web_acl(self, name, visibility_config, default_action, scope):
+ wacl_id = str(uuid4())
+ arn = make_arn_for_wacl(
+ name=name, region_name=self.region_name, wacl_id=wacl_id, scope=scope
+ )
+ if arn in self.wacls or self._is_duplicate_name(name):
+ raise WAFV2DuplicateItemException()
+ new_wacl = FakeWebACL(name, arn, wacl_id, visibility_config, default_action)
+ self.wacls[arn] = new_wacl
+ return new_wacl
+
+ def list_web_acls(self):
+ return [wacl.to_dict() for wacl in self.wacls.values()]
+
+ def _is_duplicate_name(self, name):
+ allWaclNames = set(wacl.name for wacl in self.wacls.values())
+ return name in allWaclNames
+
+ # TODO: This is how you link wacl to ALB
+ # @property
+ # def elbv2_backend(self):
+ # """
+ # EC2 backend
+
+ # :return: EC2 Backend
+ # :rtype: moto.ec2.models.EC2Backend
+ # """
+ # return ec2_backends[self.region_name]
+
+
+wafv2_backends = BackendDict(
+ WAFV2Backend, "waf-regional", additional_regions=["global"]
+)
diff --git a/contrib/python/moto/py3/moto/wafv2/responses.py b/contrib/python/moto/py3/moto/wafv2/responses.py
new file mode 100644
index 0000000000..9792ff6b98
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/responses.py
@@ -0,0 +1,48 @@
+import json
+from moto.core.utils import amzn_request_id
+
+from moto.core.responses import BaseResponse
+from .models import GLOBAL_REGION, wafv2_backends
+
+
+class WAFV2Response(BaseResponse):
+ @property
+ def wafv2_backend(self):
+ return wafv2_backends[self.region] # default region is "us-east-1"
+
+ @amzn_request_id
+ def create_web_acl(self):
+ """https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateWebACL.html (response syntax section)"""
+
+ scope = self._get_param("Scope")
+ if scope == "CLOUDFRONT":
+ self.region = GLOBAL_REGION
+ name = self._get_param("Name")
+ body = json.loads(self.body)
+ web_acl = self.wafv2_backend.create_web_acl(
+ name, body["VisibilityConfig"], body["DefaultAction"], scope
+ )
+ response = {
+ "Summary": web_acl.to_dict(),
+ }
+ response_headers = {"Content-Type": "application/json"}
+ return 200, response_headers, json.dumps(response)
+
+ @amzn_request_id
+ def list_web_ac_ls(self):
+ """https://docs.aws.amazon.com/waf/latest/APIReference/API_ListWebACLs.html (response syntax section)"""
+
+ scope = self._get_param("Scope")
+ if scope == "CLOUDFRONT":
+ self.region = GLOBAL_REGION
+ all_web_acls = self.wafv2_backend.list_web_acls()
+ response = {"NextMarker": "Not Implemented", "WebACLs": all_web_acls}
+ response_headers = {"Content-Type": "application/json"}
+ return 200, response_headers, json.dumps(response)
+
+
+# notes about region and scope
+# --scope = CLOUDFRONT is ALWAYS us-east-1 (but we use "global" instead to differentiate between REGIONAL us-east-1)
+# --scope = REGIONAL defaults to us-east-1, but could be anything if specified with --region=<anyRegion>
+# region is grabbed from the auth header, NOT from the body - even with --region flag
+# The CLOUDFRONT wacls in aws console are located in us-east-1 but the us-east-1 REGIONAL wacls are not included
diff --git a/contrib/python/moto/py3/moto/wafv2/urls.py b/contrib/python/moto/py3/moto/wafv2/urls.py
new file mode 100644
index 0000000000..86725f2b24
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/urls.py
@@ -0,0 +1,9 @@
+from .responses import WAFV2Response
+
+url_bases = [
+ r"https?://wafv2\.(.+)\.amazonaws.com",
+]
+
+url_paths = {
+ "{0}/": WAFV2Response.dispatch,
+}
diff --git a/contrib/python/moto/py3/moto/wafv2/utils.py b/contrib/python/moto/py3/moto/wafv2/utils.py
new file mode 100644
index 0000000000..f5e437d2cc
--- /dev/null
+++ b/contrib/python/moto/py3/moto/wafv2/utils.py
@@ -0,0 +1,21 @@
+from moto.core import get_account_id
+from moto.core.utils import pascal_to_camelcase, camelcase_to_underscores
+
+
+def make_arn_for_wacl(name, region_name, wacl_id, scope):
+ """https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html - explains --scope (cloudfront vs regional)"""
+
+ if scope == "REGIONAL":
+ scope = "regional"
+ elif scope == "CLOUDFRONT":
+ scope = "global"
+ return "arn:aws:wafv2:{}:{}:{}/webacl/{}/{}".format(
+ region_name, get_account_id(), scope, name, wacl_id
+ )
+
+
+def pascal_to_underscores_dict(original_dict):
+ outdict = {}
+ for k, v in original_dict.items():
+ outdict[camelcase_to_underscores(pascal_to_camelcase(k))] = v
+ return outdict
diff --git a/contrib/python/moto/py3/moto/xray/__init__.py b/contrib/python/moto/py3/moto/xray/__init__.py
new file mode 100644
index 0000000000..e47d7642b6
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/__init__.py
@@ -0,0 +1,7 @@
+from .models import xray_backends
+from ..core.models import base_decorator
+from .mock_client import MockXrayClient, XRaySegment # noqa
+
+xray_backend = xray_backends["us-east-1"]
+mock_xray = base_decorator(xray_backends)
+mock_xray_client = MockXrayClient()
diff --git a/contrib/python/moto/py3/moto/xray/exceptions.py b/contrib/python/moto/py3/moto/xray/exceptions.py
new file mode 100644
index 0000000000..2449cb45da
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/exceptions.py
@@ -0,0 +1,19 @@
+class BadSegmentException(Exception):
+ def __init__(self, seg_id=None, code=None, message=None):
+ self.id = seg_id
+ self.code = code
+ self.message = message
+
+ def __repr__(self):
+ return "<BadSegment {0}>".format("-".join([self.id, self.code, self.message]))
+
+ def to_dict(self):
+ result = {}
+ if self.id is not None:
+ result["Id"] = self.id
+ if self.code is not None:
+ result["ErrorCode"] = self.code
+ if self.message is not None:
+ result["Message"] = self.message
+
+ return result
diff --git a/contrib/python/moto/py3/moto/xray/mock_client.py b/contrib/python/moto/py3/moto/xray/mock_client.py
new file mode 100644
index 0000000000..b64d6e1658
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/mock_client.py
@@ -0,0 +1,102 @@
+import os
+from moto.xray import xray_backends
+import aws_xray_sdk.core
+from aws_xray_sdk.core.context import Context as AWSContext
+from aws_xray_sdk.core.emitters.udp_emitter import UDPEmitter
+
+
+class MockEmitter(UDPEmitter):
+ """
+ Replaces the code that sends UDP to local X-Ray daemon
+ """
+
+ def __init__(self, daemon_address="127.0.0.1:2000"):
+ address = os.getenv(
+ "AWS_XRAY_DAEMON_ADDRESS_YEAH_NOT_TODAY_MATE", daemon_address
+ )
+ self._ip, self._port = self._parse_address(address)
+
+ def _xray_backend(self, region):
+ return xray_backends[region]
+
+ def send_entity(self, entity):
+ # Hack to get region
+ # region = entity.subsegments[0].aws['region']
+ # xray = self._xray_backend(region)
+
+ # TODO store X-Ray data, pretty sure X-Ray needs refactor for this
+ pass
+
+ def _send_data(self, data):
+ raise RuntimeError("Should not be running this")
+
+
+class MockXrayClient:
+ """
+ Mocks the X-Ray sdk by pwning its evil singleton with our methods
+
+ The X-Ray SDK has normally been imported and `patched()` called long before we start mocking.
+ This means the Context() will be very unhappy if an env var isnt present, so we set that, save
+ the old context, then supply our new context.
+ We also patch the Emitter by subclassing the UDPEmitter class replacing its methods and pushing
+ that itno the recorder instance.
+ """
+
+ def __call__(self, f=None):
+ if not f:
+ return self
+
+ def wrapped_f(*args, **kwargs):
+ self.start()
+ try:
+ f(*args, **kwargs)
+ finally:
+ self.stop()
+
+ return wrapped_f
+
+ def start(self):
+ print("Starting X-Ray Patch")
+ self.old_xray_context_var = os.environ.get("AWS_XRAY_CONTEXT_MISSING")
+ os.environ["AWS_XRAY_CONTEXT_MISSING"] = "LOG_ERROR"
+ self.old_xray_context = aws_xray_sdk.core.xray_recorder._context
+ self.old_xray_emitter = aws_xray_sdk.core.xray_recorder._emitter
+ aws_xray_sdk.core.xray_recorder._context = AWSContext()
+ aws_xray_sdk.core.xray_recorder._emitter = MockEmitter()
+
+ def stop(self):
+ if self.old_xray_context_var is None:
+ del os.environ["AWS_XRAY_CONTEXT_MISSING"]
+ else:
+ os.environ["AWS_XRAY_CONTEXT_MISSING"] = self.old_xray_context_var
+
+ aws_xray_sdk.core.xray_recorder._emitter = self.old_xray_emitter
+ aws_xray_sdk.core.xray_recorder._context = self.old_xray_context
+
+ def __enter__(self):
+ self.start()
+ return self
+
+ def __exit__(self, *args):
+ self.stop()
+
+
+class XRaySegment(object):
+ """
+ XRay is request oriented, when a request comes in, normally middleware like django (or automatically in lambda) will mark
+ the start of a segment, this stay open during the lifetime of the request. During that time subsegments may be generated
+ by calling other SDK aware services or using some boto functions. Once the request is finished, middleware will also stop
+ the segment, thus causing it to be emitted via UDP.
+
+ During testing we're going to have to control the start and end of a segment via context managers.
+ """
+
+ def __enter__(self):
+ aws_xray_sdk.core.xray_recorder.begin_segment(
+ name="moto_mock", traceid=None, parent_id=None, sampling=1
+ )
+
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ aws_xray_sdk.core.xray_recorder.end_segment()
diff --git a/contrib/python/moto/py3/moto/xray/models.py b/contrib/python/moto/py3/moto/xray/models.py
new file mode 100644
index 0000000000..adcba64e16
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/models.py
@@ -0,0 +1,294 @@
+import bisect
+import datetime
+from collections import defaultdict
+import json
+from moto.core import BaseBackend, BaseModel
+from moto.core.exceptions import AWSError
+from moto.core.utils import BackendDict
+from .exceptions import BadSegmentException
+
+
+class TelemetryRecords(BaseModel):
+ def __init__(self, instance_id, hostname, resource_arn, records):
+ self.instance_id = instance_id
+ self.hostname = hostname
+ self.resource_arn = resource_arn
+ self.records = records
+
+ @classmethod
+ def from_json(cls, json):
+ instance_id = json.get("EC2InstanceId", None)
+ hostname = json.get("Hostname")
+ resource_arn = json.get("ResourceARN")
+ telemetry_records = json["TelemetryRecords"]
+
+ return cls(instance_id, hostname, resource_arn, telemetry_records)
+
+
+# https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html
+class TraceSegment(BaseModel):
+ def __init__(
+ self,
+ name,
+ segment_id,
+ trace_id,
+ start_time,
+ raw,
+ end_time=None,
+ in_progress=False,
+ service=None,
+ user=None,
+ origin=None,
+ parent_id=None,
+ http=None,
+ aws=None,
+ metadata=None,
+ annotations=None,
+ subsegments=None,
+ **kwargs
+ ):
+ self.name = name
+ self.id = segment_id
+ self.trace_id = trace_id
+ self._trace_version = None
+ self._original_request_start_time = None
+ self._trace_identifier = None
+ self.start_time = start_time
+ self._start_date = None
+ self.end_time = end_time
+ self._end_date = None
+ self.in_progress = in_progress
+ self.service = service
+ self.user = user
+ self.origin = origin
+ self.parent_id = parent_id
+ self.http = http
+ self.aws = aws
+ self.metadata = metadata
+ self.annotations = annotations
+ self.subsegments = subsegments
+ self.misc = kwargs
+
+ # Raw json string
+ self.raw = raw
+
+ def __lt__(self, other):
+ return self.start_date < other.start_date
+
+ @property
+ def trace_version(self):
+ if self._trace_version is None:
+ self._trace_version = int(self.trace_id.split("-", 1)[0])
+ return self._trace_version
+
+ @property
+ def request_start_date(self):
+ if self._original_request_start_time is None:
+ start_time = int(self.trace_id.split("-")[1], 16)
+ self._original_request_start_time = datetime.datetime.fromtimestamp(
+ start_time
+ )
+ return self._original_request_start_time
+
+ @property
+ def start_date(self):
+ if self._start_date is None:
+ self._start_date = datetime.datetime.fromtimestamp(self.start_time)
+ return self._start_date
+
+ @property
+ def end_date(self):
+ if self._end_date is None:
+ self._end_date = datetime.datetime.fromtimestamp(self.end_time)
+ return self._end_date
+
+ @classmethod
+ def from_dict(cls, data, raw):
+ # Check manditory args
+ if "id" not in data:
+ raise BadSegmentException(code="MissingParam", message="Missing segment ID")
+ seg_id = data["id"]
+ data["segment_id"] = seg_id # Just adding this key for future convenience
+
+ for arg in ("name", "trace_id", "start_time"):
+ if arg not in data:
+ raise BadSegmentException(
+ seg_id=seg_id, code="MissingParam", message="Missing segment ID"
+ )
+
+ if "end_time" not in data and "in_progress" not in data:
+ raise BadSegmentException(
+ seg_id=seg_id,
+ code="MissingParam",
+ message="Missing end_time or in_progress",
+ )
+ if "end_time" not in data and data["in_progress"] == "false":
+ raise BadSegmentException(
+ seg_id=seg_id, code="MissingParam", message="Missing end_time"
+ )
+
+ return cls(raw=raw, **data)
+
+
+class SegmentCollection(object):
+ def __init__(self):
+ self._traces = defaultdict(self._new_trace_item)
+
+ @staticmethod
+ def _new_trace_item():
+ return {
+ "start_date": datetime.datetime(1970, 1, 1),
+ "end_date": datetime.datetime(1970, 1, 1),
+ "finished": False,
+ "trace_id": None,
+ "segments": [],
+ }
+
+ def put_segment(self, segment):
+ # insert into a sorted list
+ bisect.insort_left(self._traces[segment.trace_id]["segments"], segment)
+
+ # Get the last segment (takes into account incorrect ordering)
+ # and if its the last one, mark trace as complete
+ if self._traces[segment.trace_id]["segments"][-1].end_time is not None:
+ self._traces[segment.trace_id]["finished"] = True
+
+ start_time = self._traces[segment.trace_id]["segments"][0].start_date
+ end_time = self._traces[segment.trace_id]["segments"][-1].end_date
+ self._traces[segment.trace_id]["start_date"] = start_time
+ self._traces[segment.trace_id]["end_date"] = end_time
+ self._traces[segment.trace_id]["trace_id"] = segment.trace_id
+ # Todo consolidate trace segments into a trace.
+ # not enough working knowledge of xray to do this
+
+ def summary(self, start_time, end_time, filter_expression=None):
+ # This beast https://docs.aws.amazon.com/xray/latest/api/API_GetTraceSummaries.html#API_GetTraceSummaries_ResponseSyntax
+ if filter_expression is not None:
+ raise AWSError(
+ "Not implemented yet - moto", code="InternalFailure", status=500
+ )
+
+ summaries = []
+
+ for tid, trace in self._traces.items():
+ if (
+ trace["finished"]
+ and start_time < trace["start_date"]
+ and trace["end_date"] < end_time
+ ):
+ duration = int(
+ (trace["end_date"] - trace["start_date"]).total_seconds()
+ )
+ # this stuff is mostly guesses, refer to TODO above
+ has_error = any(["error" in seg.misc for seg in trace["segments"]])
+ has_fault = any(["fault" in seg.misc for seg in trace["segments"]])
+ has_throttle = any(
+ ["throttle" in seg.misc for seg in trace["segments"]]
+ )
+
+ # Apparently all of these options are optional
+ summary_part = {
+ "Annotations": {}, # Not implemented yet
+ "Duration": duration,
+ "HasError": has_error,
+ "HasFault": has_fault,
+ "HasThrottle": has_throttle,
+ "Http": {}, # Not implemented yet
+ "Id": tid,
+ "IsParital": False, # needs lots more work to work on partials
+ "ResponseTime": 1, # definitely 1ms resposnetime
+ "ServiceIds": [], # Not implemented yet
+ "Users": {}, # Not implemented yet
+ }
+ summaries.append(summary_part)
+
+ result = {
+ "ApproximateTime": int(
+ (
+ datetime.datetime.now() - datetime.datetime(1970, 1, 1)
+ ).total_seconds()
+ ),
+ "TracesProcessedCount": len(summaries),
+ "TraceSummaries": summaries,
+ }
+
+ return result
+
+ def get_trace_ids(self, trace_ids):
+ traces = []
+ unprocessed = []
+
+ # Its a default dict
+ existing_trace_ids = list(self._traces.keys())
+ for trace_id in trace_ids:
+ if trace_id in existing_trace_ids:
+ traces.append(self._traces[trace_id])
+ else:
+ unprocessed.append(trace_id)
+
+ return traces, unprocessed
+
+
+class XRayBackend(BaseBackend):
+ def __init__(self, region_name, account_id):
+ super().__init__(region_name, account_id)
+ self._telemetry_records = []
+ self._segment_collection = SegmentCollection()
+
+ @staticmethod
+ def default_vpc_endpoint_service(service_region, zones):
+ """Default VPC endpoint service."""
+ return BaseBackend.default_vpc_endpoint_service_factory(
+ service_region, zones, "xray"
+ )
+
+ def add_telemetry_records(self, json):
+ self._telemetry_records.append(TelemetryRecords.from_json(json))
+
+ def process_segment(self, doc):
+ try:
+ data = json.loads(doc)
+ except ValueError:
+ raise BadSegmentException(code="JSONFormatError", message="Bad JSON data")
+
+ try:
+ # Get Segment Object
+ segment = TraceSegment.from_dict(data, raw=doc)
+ except ValueError:
+ raise BadSegmentException(code="JSONFormatError", message="Bad JSON data")
+
+ try:
+ # Store Segment Object
+ self._segment_collection.put_segment(segment)
+ except Exception as err:
+ raise BadSegmentException(
+ seg_id=segment.id, code="InternalFailure", message=str(err)
+ )
+
+ def get_trace_summary(self, start_time, end_time, filter_expression):
+ return self._segment_collection.summary(start_time, end_time, filter_expression)
+
+ def get_trace_ids(self, trace_ids):
+ traces, unprocessed_ids = self._segment_collection.get_trace_ids(trace_ids)
+
+ result = {"Traces": [], "UnprocessedTraceIds": unprocessed_ids}
+
+ for trace in traces:
+ segments = []
+ for segment in trace["segments"]:
+ segments.append({"Id": segment.id, "Document": segment.raw})
+
+ result["Traces"].append(
+ {
+ "Duration": int(
+ (trace["end_date"] - trace["start_date"]).total_seconds()
+ ),
+ "Id": trace["trace_id"],
+ "Segments": segments,
+ }
+ )
+
+ return result
+
+
+xray_backends = BackendDict(XRayBackend, "xray")
diff --git a/contrib/python/moto/py3/moto/xray/responses.py b/contrib/python/moto/py3/moto/xray/responses.py
new file mode 100644
index 0000000000..c173c4471b
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/responses.py
@@ -0,0 +1,176 @@
+import json
+import datetime
+
+from moto.core.responses import BaseResponse
+from moto.core.exceptions import AWSError
+from urllib.parse import urlsplit
+
+from .models import xray_backends
+from .exceptions import BadSegmentException
+
+
+class XRayResponse(BaseResponse):
+ def _error(self, code, message):
+ return json.dumps({"__type": code, "message": message}), dict(status=400)
+
+ @property
+ def xray_backend(self):
+ return xray_backends[self.region]
+
+ @property
+ def request_params(self):
+ try:
+ return json.loads(self.body)
+ except ValueError:
+ return {}
+
+ def _get_param(self, param_name, if_none=None):
+ return self.request_params.get(param_name, if_none)
+
+ def _get_action(self):
+ # Amazon is just calling urls like /TelemetryRecords etc...
+ # This uses the value after / as the camalcase action, which then
+ # gets converted in call_action to find the following methods
+ return urlsplit(self.uri).path.lstrip("/")
+
+ # PutTelemetryRecords
+ def telemetry_records(self):
+ self.xray_backend.add_telemetry_records(self.request_params)
+
+ return ""
+
+ # PutTraceSegments
+ def trace_segments(self):
+ docs = self._get_param("TraceSegmentDocuments")
+
+ if docs is None:
+ msg = "Parameter TraceSegmentDocuments is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ # Raises an exception that contains info about a bad segment,
+ # the object also has a to_dict() method
+ bad_segments = []
+ for doc in docs:
+ try:
+ self.xray_backend.process_segment(doc)
+ except BadSegmentException as bad_seg:
+ bad_segments.append(bad_seg)
+ except Exception as err:
+ return (
+ json.dumps({"__type": "InternalFailure", "message": str(err)}),
+ dict(status=500),
+ )
+
+ result = {"UnprocessedTraceSegments": [x.to_dict() for x in bad_segments]}
+ return json.dumps(result)
+
+ # GetTraceSummaries
+ def trace_summaries(self):
+ start_time = self._get_param("StartTime")
+ end_time = self._get_param("EndTime")
+ if start_time is None:
+ msg = "Parameter StartTime is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+ if end_time is None:
+ msg = "Parameter EndTime is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ filter_expression = self._get_param("FilterExpression")
+
+ try:
+ start_time = datetime.datetime.fromtimestamp(int(start_time))
+ end_time = datetime.datetime.fromtimestamp(int(end_time))
+ except ValueError:
+ msg = "start_time and end_time are not integers"
+ return (
+ json.dumps({"__type": "InvalidParameterValue", "message": msg}),
+ dict(status=400),
+ )
+ except Exception as err:
+ return (
+ json.dumps({"__type": "InternalFailure", "message": str(err)}),
+ dict(status=500),
+ )
+
+ try:
+ result = self.xray_backend.get_trace_summary(
+ start_time, end_time, filter_expression
+ )
+ except AWSError as err:
+ raise err
+ except Exception as err:
+ return (
+ json.dumps({"__type": "InternalFailure", "message": str(err)}),
+ dict(status=500),
+ )
+
+ return json.dumps(result)
+
+ # BatchGetTraces
+ def traces(self):
+ trace_ids = self._get_param("TraceIds")
+
+ if trace_ids is None:
+ msg = "Parameter TraceIds is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ try:
+ result = self.xray_backend.get_trace_ids(trace_ids)
+ except AWSError as err:
+ raise err
+ except Exception as err:
+ return (
+ json.dumps({"__type": "InternalFailure", "message": str(err)}),
+ dict(status=500),
+ )
+
+ return json.dumps(result)
+
+ # GetServiceGraph - just a dummy response for now
+ def service_graph(self):
+ start_time = self._get_param("StartTime")
+ end_time = self._get_param("EndTime")
+ # next_token = self._get_param('NextToken') # not implemented yet
+
+ if start_time is None:
+ msg = "Parameter StartTime is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+ if end_time is None:
+ msg = "Parameter EndTime is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ result = {"StartTime": start_time, "EndTime": end_time, "Services": []}
+ return json.dumps(result)
+
+ # GetTraceGraph - just a dummy response for now
+ def trace_graph(self):
+ trace_ids = self._get_param("TraceIds")
+ # next_token = self._get_param('NextToken') # not implemented yet
+
+ if trace_ids is None:
+ msg = "Parameter TraceIds is missing"
+ return (
+ json.dumps({"__type": "MissingParameter", "message": msg}),
+ dict(status=400),
+ )
+
+ result = {"Services": []}
+ return json.dumps(result)
diff --git a/contrib/python/moto/py3/moto/xray/urls.py b/contrib/python/moto/py3/moto/xray/urls.py
new file mode 100644
index 0000000000..4d366b840c
--- /dev/null
+++ b/contrib/python/moto/py3/moto/xray/urls.py
@@ -0,0 +1,12 @@
+from .responses import XRayResponse
+
+url_bases = [r"https?://xray\.(.+)\.amazonaws.com"]
+
+url_paths = {
+ "{0}/TelemetryRecords$": XRayResponse.dispatch,
+ "{0}/TraceSegments$": XRayResponse.dispatch,
+ "{0}/Traces$": XRayResponse.dispatch,
+ "{0}/ServiceGraph$": XRayResponse.dispatch,
+ "{0}/TraceGraph$": XRayResponse.dispatch,
+ "{0}/TraceSummaries$": XRayResponse.dispatch,
+}
diff --git a/contrib/python/moto/py3/ya.make b/contrib/python/moto/py3/ya.make
new file mode 100644
index 0000000000..1dfb424270
--- /dev/null
+++ b/contrib/python/moto/py3/ya.make
@@ -0,0 +1,846 @@
+# Generated by devtools/yamaker (pypi).
+
+PY3_LIBRARY()
+
+VERSION(3.1.12)
+
+LICENSE(Apache-2.0)
+
+PEERDIR(
+ contrib/python/Jinja2
+ contrib/python/MarkupSafe
+ contrib/python/PyYAML
+ contrib/python/Werkzeug
+ contrib/python/boto3
+ contrib/python/botocore
+ contrib/python/cryptography
+ contrib/python/python-dateutil
+ contrib/python/pytz
+ contrib/python/requests
+ contrib/python/responses
+ contrib/python/xmltodict
+)
+
+NO_LINT()
+
+NO_CHECK_IMPORTS(
+ moto.apigateway.*
+ moto.awslambda.*
+ moto.backends
+ moto.batch.*
+ moto.cloudformation.*
+ moto.cognitoidp.*
+ moto.dynamodb2.*
+ moto.ecs.*
+ moto.emr.*
+ moto.glue.*
+ moto.iot.*
+ moto.iotdata.*
+ moto.moto_server.*
+ moto.rds.*
+ moto.rds2.*
+ moto.resourcegroupstaggingapi.*
+ moto.server
+ moto.sns.*
+ moto.ssm.*
+ moto.utilities.docker_utilities
+ moto.xray.*
+)
+
+PY_SRCS(
+ TOP_LEVEL
+ moto/__init__.py
+ moto/acm/__init__.py
+ moto/acm/models.py
+ moto/acm/responses.py
+ moto/acm/urls.py
+ moto/acm/utils.py
+ moto/apigateway/__init__.py
+ moto/apigateway/exceptions.py
+ moto/apigateway/integration_parsers/__init__.py
+ moto/apigateway/integration_parsers/aws_parser.py
+ moto/apigateway/integration_parsers/http_parser.py
+ moto/apigateway/integration_parsers/unknown_parser.py
+ moto/apigateway/models.py
+ moto/apigateway/responses.py
+ moto/apigateway/urls.py
+ moto/apigateway/utils.py
+ moto/apigatewayv2/__init__.py
+ moto/apigatewayv2/exceptions.py
+ moto/apigatewayv2/models.py
+ moto/apigatewayv2/responses.py
+ moto/apigatewayv2/urls.py
+ moto/applicationautoscaling/__init__.py
+ moto/applicationautoscaling/exceptions.py
+ moto/applicationautoscaling/models.py
+ moto/applicationautoscaling/responses.py
+ moto/applicationautoscaling/urls.py
+ moto/applicationautoscaling/utils.py
+ moto/appsync/__init__.py
+ moto/appsync/exceptions.py
+ moto/appsync/models.py
+ moto/appsync/responses.py
+ moto/appsync/urls.py
+ moto/athena/__init__.py
+ moto/athena/exceptions.py
+ moto/athena/models.py
+ moto/athena/responses.py
+ moto/athena/urls.py
+ moto/athena/utils.py
+ moto/autoscaling/__init__.py
+ moto/autoscaling/exceptions.py
+ moto/autoscaling/models.py
+ moto/autoscaling/responses.py
+ moto/autoscaling/urls.py
+ moto/awslambda/__init__.py
+ moto/awslambda/exceptions.py
+ moto/awslambda/models.py
+ moto/awslambda/policy.py
+ moto/awslambda/responses.py
+ moto/awslambda/urls.py
+ moto/awslambda/utils.py
+ moto/backend_index.py
+ moto/backends.py
+ moto/batch/__init__.py
+ moto/batch/exceptions.py
+ moto/batch/models.py
+ moto/batch/responses.py
+ moto/batch/urls.py
+ moto/batch/utils.py
+ moto/batch_simple/__init__.py
+ moto/batch_simple/models.py
+ moto/batch_simple/responses.py
+ moto/batch_simple/urls.py
+ moto/budgets/__init__.py
+ moto/budgets/exceptions.py
+ moto/budgets/models.py
+ moto/budgets/responses.py
+ moto/budgets/urls.py
+ moto/cloudformation/__init__.py
+ moto/cloudformation/custom_model.py
+ moto/cloudformation/exceptions.py
+ moto/cloudformation/models.py
+ moto/cloudformation/parsing.py
+ moto/cloudformation/responses.py
+ moto/cloudformation/urls.py
+ moto/cloudformation/utils.py
+ moto/cloudfront/__init__.py
+ moto/cloudfront/exceptions.py
+ moto/cloudfront/models.py
+ moto/cloudfront/responses.py
+ moto/cloudfront/urls.py
+ moto/cloudtrail/__init__.py
+ moto/cloudtrail/exceptions.py
+ moto/cloudtrail/models.py
+ moto/cloudtrail/responses.py
+ moto/cloudtrail/urls.py
+ moto/cloudwatch/__init__.py
+ moto/cloudwatch/exceptions.py
+ moto/cloudwatch/models.py
+ moto/cloudwatch/responses.py
+ moto/cloudwatch/urls.py
+ moto/cloudwatch/utils.py
+ moto/codecommit/__init__.py
+ moto/codecommit/exceptions.py
+ moto/codecommit/models.py
+ moto/codecommit/responses.py
+ moto/codecommit/urls.py
+ moto/codepipeline/__init__.py
+ moto/codepipeline/exceptions.py
+ moto/codepipeline/models.py
+ moto/codepipeline/responses.py
+ moto/codepipeline/urls.py
+ moto/cognitoidentity/__init__.py
+ moto/cognitoidentity/exceptions.py
+ moto/cognitoidentity/models.py
+ moto/cognitoidentity/responses.py
+ moto/cognitoidentity/urls.py
+ moto/cognitoidentity/utils.py
+ moto/cognitoidp/__init__.py
+ moto/cognitoidp/exceptions.py
+ moto/cognitoidp/models.py
+ moto/cognitoidp/responses.py
+ moto/cognitoidp/urls.py
+ moto/cognitoidp/utils.py
+ moto/config/__init__.py
+ moto/config/exceptions.py
+ moto/config/models.py
+ moto/config/responses.py
+ moto/config/urls.py
+ moto/core/__init__.py
+ moto/core/base_backend.py
+ moto/core/botocore_stubber.py
+ moto/core/common_models.py
+ moto/core/custom_responses_mock.py
+ moto/core/exceptions.py
+ moto/core/models.py
+ moto/core/responses.py
+ moto/core/responses_custom_registry.py
+ moto/core/utils.py
+ moto/databrew/__init__.py
+ moto/databrew/exceptions.py
+ moto/databrew/models.py
+ moto/databrew/responses.py
+ moto/databrew/urls.py
+ moto/datapipeline/__init__.py
+ moto/datapipeline/models.py
+ moto/datapipeline/responses.py
+ moto/datapipeline/urls.py
+ moto/datapipeline/utils.py
+ moto/datasync/__init__.py
+ moto/datasync/exceptions.py
+ moto/datasync/models.py
+ moto/datasync/responses.py
+ moto/datasync/urls.py
+ moto/dax/__init__.py
+ moto/dax/exceptions.py
+ moto/dax/models.py
+ moto/dax/responses.py
+ moto/dax/urls.py
+ moto/dax/utils.py
+ moto/dms/__init__.py
+ moto/dms/exceptions.py
+ moto/dms/models.py
+ moto/dms/responses.py
+ moto/dms/urls.py
+ moto/dms/utils.py
+ moto/ds/__init__.py
+ moto/ds/exceptions.py
+ moto/ds/models.py
+ moto/ds/responses.py
+ moto/ds/urls.py
+ moto/ds/utils.py
+ moto/ds/validations.py
+ moto/dynamodb/__init__.py
+ moto/dynamodb/comparisons.py
+ moto/dynamodb/exceptions.py
+ moto/dynamodb/limits.py
+ moto/dynamodb/models/__init__.py
+ moto/dynamodb/models/dynamo_type.py
+ moto/dynamodb/models/utilities.py
+ moto/dynamodb/parsing/__init__.py
+ moto/dynamodb/parsing/ast_nodes.py
+ moto/dynamodb/parsing/executors.py
+ moto/dynamodb/parsing/expressions.py
+ moto/dynamodb/parsing/reserved_keywords.py
+ moto/dynamodb/parsing/tokens.py
+ moto/dynamodb/parsing/validators.py
+ moto/dynamodb/responses.py
+ moto/dynamodb/urls.py
+ moto/dynamodb_v20111205/__init__.py
+ moto/dynamodb_v20111205/comparisons.py
+ moto/dynamodb_v20111205/models.py
+ moto/dynamodb_v20111205/responses.py
+ moto/dynamodb_v20111205/urls.py
+ moto/dynamodbstreams/__init__.py
+ moto/dynamodbstreams/models.py
+ moto/dynamodbstreams/responses.py
+ moto/dynamodbstreams/urls.py
+ moto/ebs/__init__.py
+ moto/ebs/models.py
+ moto/ebs/responses.py
+ moto/ebs/urls.py
+ moto/ec2/__init__.py
+ moto/ec2/exceptions.py
+ moto/ec2/models/__init__.py
+ moto/ec2/models/amis.py
+ moto/ec2/models/availability_zones_and_regions.py
+ moto/ec2/models/carrier_gateways.py
+ moto/ec2/models/core.py
+ moto/ec2/models/customer_gateways.py
+ moto/ec2/models/dhcp_options.py
+ moto/ec2/models/elastic_block_store.py
+ moto/ec2/models/elastic_ip_addresses.py
+ moto/ec2/models/elastic_network_interfaces.py
+ moto/ec2/models/flow_logs.py
+ moto/ec2/models/iam_instance_profile.py
+ moto/ec2/models/instance_types.py
+ moto/ec2/models/instances.py
+ moto/ec2/models/internet_gateways.py
+ moto/ec2/models/key_pairs.py
+ moto/ec2/models/launch_templates.py
+ moto/ec2/models/managed_prefixes.py
+ moto/ec2/models/nat_gateways.py
+ moto/ec2/models/network_acls.py
+ moto/ec2/models/route_tables.py
+ moto/ec2/models/security_groups.py
+ moto/ec2/models/spot_requests.py
+ moto/ec2/models/subnets.py
+ moto/ec2/models/tags.py
+ moto/ec2/models/transit_gateway.py
+ moto/ec2/models/transit_gateway_attachments.py
+ moto/ec2/models/transit_gateway_route_tables.py
+ moto/ec2/models/vpc_peering_connections.py
+ moto/ec2/models/vpc_service_configuration.py
+ moto/ec2/models/vpcs.py
+ moto/ec2/models/vpn_connections.py
+ moto/ec2/models/vpn_gateway.py
+ moto/ec2/regions.py
+ moto/ec2/responses/__init__.py
+ moto/ec2/responses/_base_response.py
+ moto/ec2/responses/account_attributes.py
+ moto/ec2/responses/amazon_dev_pay.py
+ moto/ec2/responses/amis.py
+ moto/ec2/responses/availability_zones_and_regions.py
+ moto/ec2/responses/carrier_gateways.py
+ moto/ec2/responses/customer_gateways.py
+ moto/ec2/responses/dhcp_options.py
+ moto/ec2/responses/egress_only_internet_gateways.py
+ moto/ec2/responses/elastic_block_store.py
+ moto/ec2/responses/elastic_ip_addresses.py
+ moto/ec2/responses/elastic_network_interfaces.py
+ moto/ec2/responses/flow_logs.py
+ moto/ec2/responses/general.py
+ moto/ec2/responses/iam_instance_profiles.py
+ moto/ec2/responses/instances.py
+ moto/ec2/responses/internet_gateways.py
+ moto/ec2/responses/ip_addresses.py
+ moto/ec2/responses/key_pairs.py
+ moto/ec2/responses/launch_templates.py
+ moto/ec2/responses/monitoring.py
+ moto/ec2/responses/nat_gateways.py
+ moto/ec2/responses/network_acls.py
+ moto/ec2/responses/placement_groups.py
+ moto/ec2/responses/reserved_instances.py
+ moto/ec2/responses/route_tables.py
+ moto/ec2/responses/security_groups.py
+ moto/ec2/responses/settings.py
+ moto/ec2/responses/spot_fleets.py
+ moto/ec2/responses/spot_instances.py
+ moto/ec2/responses/subnets.py
+ moto/ec2/responses/tags.py
+ moto/ec2/responses/transit_gateway_attachments.py
+ moto/ec2/responses/transit_gateway_route_tables.py
+ moto/ec2/responses/transit_gateways.py
+ moto/ec2/responses/virtual_private_gateways.py
+ moto/ec2/responses/vm_export.py
+ moto/ec2/responses/vm_import.py
+ moto/ec2/responses/vpc_peering_connections.py
+ moto/ec2/responses/vpc_service_configuration.py
+ moto/ec2/responses/vpcs.py
+ moto/ec2/responses/vpn_connections.py
+ moto/ec2/responses/windows.py
+ moto/ec2/urls.py
+ moto/ec2/utils.py
+ moto/ec2instanceconnect/__init__.py
+ moto/ec2instanceconnect/models.py
+ moto/ec2instanceconnect/responses.py
+ moto/ec2instanceconnect/urls.py
+ moto/ecr/__init__.py
+ moto/ecr/exceptions.py
+ moto/ecr/models.py
+ moto/ecr/policy_validation.py
+ moto/ecr/responses.py
+ moto/ecr/urls.py
+ moto/ecs/__init__.py
+ moto/ecs/exceptions.py
+ moto/ecs/models.py
+ moto/ecs/responses.py
+ moto/ecs/urls.py
+ moto/efs/__init__.py
+ moto/efs/exceptions.py
+ moto/efs/models.py
+ moto/efs/responses.py
+ moto/efs/urls.py
+ moto/eks/__init__.py
+ moto/eks/exceptions.py
+ moto/eks/models.py
+ moto/eks/responses.py
+ moto/eks/urls.py
+ moto/eks/utils.py
+ moto/elasticache/__init__.py
+ moto/elasticache/exceptions.py
+ moto/elasticache/models.py
+ moto/elasticache/responses.py
+ moto/elasticache/urls.py
+ moto/elasticbeanstalk/__init__.py
+ moto/elasticbeanstalk/exceptions.py
+ moto/elasticbeanstalk/models.py
+ moto/elasticbeanstalk/responses.py
+ moto/elasticbeanstalk/urls.py
+ moto/elasticbeanstalk/utils.py
+ moto/elastictranscoder/__init__.py
+ moto/elastictranscoder/models.py
+ moto/elastictranscoder/responses.py
+ moto/elastictranscoder/urls.py
+ moto/elb/__init__.py
+ moto/elb/exceptions.py
+ moto/elb/models.py
+ moto/elb/policies.py
+ moto/elb/responses.py
+ moto/elb/urls.py
+ moto/elbv2/__init__.py
+ moto/elbv2/exceptions.py
+ moto/elbv2/models.py
+ moto/elbv2/responses.py
+ moto/elbv2/urls.py
+ moto/elbv2/utils.py
+ moto/emr/__init__.py
+ moto/emr/exceptions.py
+ moto/emr/models.py
+ moto/emr/responses.py
+ moto/emr/urls.py
+ moto/emr/utils.py
+ moto/emrcontainers/__init__.py
+ moto/emrcontainers/exceptions.py
+ moto/emrcontainers/models.py
+ moto/emrcontainers/responses.py
+ moto/emrcontainers/urls.py
+ moto/emrcontainers/utils.py
+ moto/es/__init__.py
+ moto/es/exceptions.py
+ moto/es/models.py
+ moto/es/responses.py
+ moto/es/urls.py
+ moto/events/__init__.py
+ moto/events/exceptions.py
+ moto/events/models.py
+ moto/events/notifications.py
+ moto/events/responses.py
+ moto/events/urls.py
+ moto/events/utils.py
+ moto/firehose/__init__.py
+ moto/firehose/exceptions.py
+ moto/firehose/models.py
+ moto/firehose/responses.py
+ moto/firehose/urls.py
+ moto/forecast/__init__.py
+ moto/forecast/exceptions.py
+ moto/forecast/models.py
+ moto/forecast/responses.py
+ moto/forecast/urls.py
+ moto/glacier/__init__.py
+ moto/glacier/models.py
+ moto/glacier/responses.py
+ moto/glacier/urls.py
+ moto/glacier/utils.py
+ moto/glue/__init__.py
+ moto/glue/exceptions.py
+ moto/glue/models.py
+ moto/glue/responses.py
+ moto/glue/urls.py
+ moto/glue/utils.py
+ moto/greengrass/__init__.py
+ moto/greengrass/models.py
+ moto/greengrass/responses.py
+ moto/greengrass/urls.py
+ moto/guardduty/__init__.py
+ moto/guardduty/exceptions.py
+ moto/guardduty/models.py
+ moto/guardduty/responses.py
+ moto/guardduty/urls.py
+ moto/iam/__init__.py
+ moto/iam/access_control.py
+ moto/iam/aws_managed_policies.py
+ moto/iam/config.py
+ moto/iam/exceptions.py
+ moto/iam/models.py
+ moto/iam/policy_validation.py
+ moto/iam/responses.py
+ moto/iam/urls.py
+ moto/iam/utils.py
+ moto/instance_metadata/__init__.py
+ moto/instance_metadata/models.py
+ moto/instance_metadata/responses.py
+ moto/instance_metadata/urls.py
+ moto/iot/__init__.py
+ moto/iot/exceptions.py
+ moto/iot/models.py
+ moto/iot/responses.py
+ moto/iot/urls.py
+ moto/iot/utils.py
+ moto/iotdata/__init__.py
+ moto/iotdata/exceptions.py
+ moto/iotdata/models.py
+ moto/iotdata/responses.py
+ moto/iotdata/urls.py
+ moto/kinesis/__init__.py
+ moto/kinesis/exceptions.py
+ moto/kinesis/models.py
+ moto/kinesis/responses.py
+ moto/kinesis/urls.py
+ moto/kinesis/utils.py
+ moto/kinesisvideo/__init__.py
+ moto/kinesisvideo/exceptions.py
+ moto/kinesisvideo/models.py
+ moto/kinesisvideo/responses.py
+ moto/kinesisvideo/urls.py
+ moto/kinesisvideoarchivedmedia/__init__.py
+ moto/kinesisvideoarchivedmedia/exceptions.py
+ moto/kinesisvideoarchivedmedia/models.py
+ moto/kinesisvideoarchivedmedia/responses.py
+ moto/kinesisvideoarchivedmedia/urls.py
+ moto/kms/__init__.py
+ moto/kms/exceptions.py
+ moto/kms/models.py
+ moto/kms/responses.py
+ moto/kms/urls.py
+ moto/kms/utils.py
+ moto/logs/__init__.py
+ moto/logs/exceptions.py
+ moto/logs/metric_filters.py
+ moto/logs/models.py
+ moto/logs/responses.py
+ moto/logs/urls.py
+ moto/logs/utils.py
+ moto/managedblockchain/__init__.py
+ moto/managedblockchain/exceptions.py
+ moto/managedblockchain/models.py
+ moto/managedblockchain/responses.py
+ moto/managedblockchain/urls.py
+ moto/managedblockchain/utils.py
+ moto/mediaconnect/__init__.py
+ moto/mediaconnect/exceptions.py
+ moto/mediaconnect/models.py
+ moto/mediaconnect/responses.py
+ moto/mediaconnect/urls.py
+ moto/medialive/__init__.py
+ moto/medialive/exceptions.py
+ moto/medialive/models.py
+ moto/medialive/responses.py
+ moto/medialive/urls.py
+ moto/mediapackage/__init__.py
+ moto/mediapackage/exceptions.py
+ moto/mediapackage/models.py
+ moto/mediapackage/responses.py
+ moto/mediapackage/urls.py
+ moto/mediastore/__init__.py
+ moto/mediastore/exceptions.py
+ moto/mediastore/models.py
+ moto/mediastore/responses.py
+ moto/mediastore/urls.py
+ moto/mediastoredata/__init__.py
+ moto/mediastoredata/exceptions.py
+ moto/mediastoredata/models.py
+ moto/mediastoredata/responses.py
+ moto/mediastoredata/urls.py
+ moto/moto_api/__init__.py
+ moto/moto_api/_internal/__init__.py
+ moto/moto_api/_internal/managed_state_model.py
+ moto/moto_api/_internal/models.py
+ moto/moto_api/_internal/responses.py
+ moto/moto_api/_internal/state_manager.py
+ moto/moto_api/_internal/urls.py
+ moto/moto_server/threaded_moto_server.py
+ moto/moto_server/utilities.py
+ moto/moto_server/werkzeug_app.py
+ moto/mq/__init__.py
+ moto/mq/configuration.py
+ moto/mq/exceptions.py
+ moto/mq/models.py
+ moto/mq/responses.py
+ moto/mq/urls.py
+ moto/opsworks/__init__.py
+ moto/opsworks/exceptions.py
+ moto/opsworks/models.py
+ moto/opsworks/responses.py
+ moto/opsworks/urls.py
+ moto/organizations/__init__.py
+ moto/organizations/exceptions.py
+ moto/organizations/models.py
+ moto/organizations/responses.py
+ moto/organizations/urls.py
+ moto/organizations/utils.py
+ moto/packages/__init__.py
+ moto/packages/boto/__init__.py
+ moto/packages/boto/ec2/__init__.py
+ moto/packages/boto/ec2/blockdevicemapping.py
+ moto/packages/boto/ec2/ec2object.py
+ moto/packages/boto/ec2/image.py
+ moto/packages/boto/ec2/instance.py
+ moto/packages/boto/ec2/instancetype.py
+ moto/packages/boto/ec2/launchspecification.py
+ moto/packages/boto/ec2/spotinstancerequest.py
+ moto/packages/boto/ec2/tag.py
+ moto/packages/cfnresponse/__init__.py
+ moto/packages/cfnresponse/cfnresponse.py
+ moto/pinpoint/__init__.py
+ moto/pinpoint/exceptions.py
+ moto/pinpoint/models.py
+ moto/pinpoint/responses.py
+ moto/pinpoint/urls.py
+ moto/polly/__init__.py
+ moto/polly/models.py
+ moto/polly/resources.py
+ moto/polly/responses.py
+ moto/polly/urls.py
+ moto/polly/utils.py
+ moto/quicksight/__init__.py
+ moto/quicksight/exceptions.py
+ moto/quicksight/models.py
+ moto/quicksight/responses.py
+ moto/quicksight/urls.py
+ moto/ram/__init__.py
+ moto/ram/exceptions.py
+ moto/ram/models.py
+ moto/ram/responses.py
+ moto/ram/urls.py
+ moto/rds/__init__.py
+ moto/rds/exceptions.py
+ moto/rds/models.py
+ moto/rds/responses.py
+ moto/rds/urls.py
+ moto/rds/utils.py
+ moto/redshift/__init__.py
+ moto/redshift/exceptions.py
+ moto/redshift/models.py
+ moto/redshift/responses.py
+ moto/redshift/urls.py
+ moto/redshift/utils.py
+ moto/redshiftdata/__init__.py
+ moto/redshiftdata/exceptions.py
+ moto/redshiftdata/models.py
+ moto/redshiftdata/responses.py
+ moto/redshiftdata/urls.py
+ moto/rekognition/__init__.py
+ moto/rekognition/exceptions.py
+ moto/rekognition/models.py
+ moto/rekognition/responses.py
+ moto/rekognition/urls.py
+ moto/resourcegroups/__init__.py
+ moto/resourcegroups/exceptions.py
+ moto/resourcegroups/models.py
+ moto/resourcegroups/responses.py
+ moto/resourcegroups/urls.py
+ moto/resourcegroupstaggingapi/__init__.py
+ moto/resourcegroupstaggingapi/models.py
+ moto/resourcegroupstaggingapi/responses.py
+ moto/resourcegroupstaggingapi/urls.py
+ moto/route53/__init__.py
+ moto/route53/exceptions.py
+ moto/route53/models.py
+ moto/route53/responses.py
+ moto/route53/urls.py
+ moto/route53/utils.py
+ moto/route53resolver/__init__.py
+ moto/route53resolver/exceptions.py
+ moto/route53resolver/models.py
+ moto/route53resolver/responses.py
+ moto/route53resolver/urls.py
+ moto/route53resolver/utils.py
+ moto/route53resolver/validations.py
+ moto/s3/__init__.py
+ moto/s3/cloud_formation.py
+ moto/s3/config.py
+ moto/s3/exceptions.py
+ moto/s3/models.py
+ moto/s3/notifications.py
+ moto/s3/responses.py
+ moto/s3/urls.py
+ moto/s3/utils.py
+ moto/s3bucket_path/__init__.py
+ moto/s3bucket_path/utils.py
+ moto/s3control/__init__.py
+ moto/s3control/config.py
+ moto/s3control/exceptions.py
+ moto/s3control/models.py
+ moto/s3control/responses.py
+ moto/s3control/urls.py
+ moto/sagemaker/__init__.py
+ moto/sagemaker/exceptions.py
+ moto/sagemaker/models.py
+ moto/sagemaker/responses.py
+ moto/sagemaker/urls.py
+ moto/sagemaker/validators.py
+ moto/sdb/__init__.py
+ moto/sdb/exceptions.py
+ moto/sdb/models.py
+ moto/sdb/responses.py
+ moto/sdb/urls.py
+ moto/secretsmanager/__init__.py
+ moto/secretsmanager/exceptions.py
+ moto/secretsmanager/list_secrets/__init__.py
+ moto/secretsmanager/list_secrets/filters.py
+ moto/secretsmanager/models.py
+ moto/secretsmanager/responses.py
+ moto/secretsmanager/urls.py
+ moto/secretsmanager/utils.py
+ moto/server.py
+ moto/servicediscovery/__init__.py
+ moto/servicediscovery/exceptions.py
+ moto/servicediscovery/models.py
+ moto/servicediscovery/responses.py
+ moto/servicediscovery/urls.py
+ moto/ses/__init__.py
+ moto/ses/exceptions.py
+ moto/ses/feedback.py
+ moto/ses/models.py
+ moto/ses/responses.py
+ moto/ses/urls.py
+ moto/ses/utils.py
+ moto/settings.py
+ moto/sns/__init__.py
+ moto/sns/exceptions.py
+ moto/sns/models.py
+ moto/sns/responses.py
+ moto/sns/urls.py
+ moto/sns/utils.py
+ moto/sqs/__init__.py
+ moto/sqs/exceptions.py
+ moto/sqs/models.py
+ moto/sqs/responses.py
+ moto/sqs/urls.py
+ moto/sqs/utils.py
+ moto/ssm/__init__.py
+ moto/ssm/exceptions.py
+ moto/ssm/models.py
+ moto/ssm/responses.py
+ moto/ssm/urls.py
+ moto/ssm/utils.py
+ moto/ssoadmin/__init__.py
+ moto/ssoadmin/exceptions.py
+ moto/ssoadmin/models.py
+ moto/ssoadmin/responses.py
+ moto/ssoadmin/urls.py
+ moto/stepfunctions/__init__.py
+ moto/stepfunctions/exceptions.py
+ moto/stepfunctions/models.py
+ moto/stepfunctions/responses.py
+ moto/stepfunctions/urls.py
+ moto/stepfunctions/utils.py
+ moto/sts/__init__.py
+ moto/sts/exceptions.py
+ moto/sts/models.py
+ moto/sts/responses.py
+ moto/sts/urls.py
+ moto/sts/utils.py
+ moto/support/__init__.py
+ moto/support/exceptions.py
+ moto/support/models.py
+ moto/support/responses.py
+ moto/support/urls.py
+ moto/swf/__init__.py
+ moto/swf/constants.py
+ moto/swf/exceptions.py
+ moto/swf/models/__init__.py
+ moto/swf/models/activity_task.py
+ moto/swf/models/activity_type.py
+ moto/swf/models/decision_task.py
+ moto/swf/models/domain.py
+ moto/swf/models/generic_type.py
+ moto/swf/models/history_event.py
+ moto/swf/models/timeout.py
+ moto/swf/models/timer.py
+ moto/swf/models/workflow_execution.py
+ moto/swf/models/workflow_type.py
+ moto/swf/responses.py
+ moto/swf/urls.py
+ moto/swf/utils.py
+ moto/textract/__init__.py
+ moto/textract/exceptions.py
+ moto/textract/models.py
+ moto/textract/responses.py
+ moto/textract/urls.py
+ moto/timestreamwrite/__init__.py
+ moto/timestreamwrite/exceptions.py
+ moto/timestreamwrite/models.py
+ moto/timestreamwrite/responses.py
+ moto/timestreamwrite/urls.py
+ moto/transcribe/__init__.py
+ moto/transcribe/exceptions.py
+ moto/transcribe/models.py
+ moto/transcribe/responses.py
+ moto/transcribe/urls.py
+ moto/utilities/__init__.py
+ moto/utilities/distutils_version.py
+ moto/utilities/docker_utilities.py
+ moto/utilities/paginator.py
+ moto/utilities/tagging_service.py
+ moto/utilities/utils.py
+ moto/wafv2/__init__.py
+ moto/wafv2/exceptions.py
+ moto/wafv2/models.py
+ moto/wafv2/responses.py
+ moto/wafv2/urls.py
+ moto/wafv2/utils.py
+ moto/xray/__init__.py
+ moto/xray/exceptions.py
+ moto/xray/mock_client.py
+ moto/xray/models.py
+ moto/xray/responses.py
+ moto/xray/urls.py
+)
+
+RESOURCE_FILES(
+ PREFIX contrib/python/moto/py3/
+ .dist-info/METADATA
+ .dist-info/entry_points.txt
+ .dist-info/top_level.txt
+ moto/cognitoidp/resources/jwks-private.json
+ moto/cognitoidp/resources/jwks-public.json
+ moto/config/resources/aws_managed_rules.json
+ moto/dynamodb/parsing/reserved_keywords.txt
+ moto/ec2/resources/amis.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-3.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/me-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-3.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-3.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/me-south-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
+ moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
+ moto/ec2/resources/instance_type_offerings/region/af-south-1.json
+ moto/ec2/resources/instance_type_offerings/region/ap-east-1.json
+ moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
+ moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
+ moto/ec2/resources/instance_type_offerings/region/ap-northeast-3.json
+ moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
+ moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
+ moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
+ moto/ec2/resources/instance_type_offerings/region/ap-southeast-3.json
+ moto/ec2/resources/instance_type_offerings/region/ca-central-1.json
+ moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
+ moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
+ moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
+ moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
+ moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
+ moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
+ moto/ec2/resources/instance_type_offerings/region/me-south-1.json
+ moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
+ moto/ec2/resources/instance_type_offerings/region/us-east-1.json
+ moto/ec2/resources/instance_type_offerings/region/us-east-2.json
+ moto/ec2/resources/instance_type_offerings/region/us-west-1.json
+ moto/ec2/resources/instance_type_offerings/region/us-west-2.json
+ moto/ec2/resources/instance_types.json
+ moto/moto_server/templates/dashboard.html
+ moto/ssm/resources/regions.json
+ moto/ssm/resources/services.json
+ moto/support/resources/describe_trusted_advisor_checks.json
+)
+
+END()
diff --git a/contrib/python/moto/ya.make b/contrib/python/moto/ya.make
new file mode 100644
index 0000000000..f093931e91
--- /dev/null
+++ b/contrib/python/moto/ya.make
@@ -0,0 +1,19 @@
+PY23_LIBRARY()
+
+LICENSE(Service-Py23-Proxy)
+
+IF (PYTHON2)
+ PEERDIR(contrib/python/moto/py2)
+ELSE()
+ PEERDIR(contrib/python/moto/py3)
+ENDIF()
+
+NO_LINT()
+
+END()
+
+RECURSE(
+ bin
+ py2
+ py3
+)